From b8e9f620b6da41b4bcdd31f565096b58f1779675 Mon Sep 17 00:00:00 2001 From: Luca Giamminonni Date: Fri, 18 Feb 2022 16:40:45 +0100 Subject: [PATCH 001/409] [CST-5249] Migration of OPENAIRE correction service --- ...ations-openaire-events-page.component.html | 1 + ...ons-openaire-events-page.component.spec.ts | 26 + ...ications-openaire-events-page.component.ts | 9 + ...fications-openaire-events-page.resolver.ts | 32 + ...s-openaire-topics-page-resolver.service.ts | 32 + ...ations-openaire-topics-page.component.html | 1 + ...ons-openaire-topics-page.component.spec.ts | 26 + ...ications-openaire-topics-page.component.ts | 9 + .../admin-notifications-routing-paths.ts | 8 + .../admin-notifications-routing.module.ts | 60 + .../admin-notifications.module.ts | 29 + src/app/admin/admin-routing-paths.ts | 5 + src/app/admin/admin-routing.module.ts | 7 +- .../admin-sidebar/admin-sidebar.component.ts | 39 +- src/app/core/core.module.ts | 4 + src/app/core/data/data.service.ts | 49 +- ...openaire-broker-event-rest.service.spec.ts | 246 +++ .../openaire-broker-event-rest.service.ts | 185 ++ ...naire-broker-event-object.resource-type.ts | 9 + .../models/openaire-broker-event.model.ts | 157 ++ ...naire-broker-topic-object.resource-type.ts | 9 + .../models/openaire-broker-topic.model.ts | 58 + ...openaire-broker-topic-rest.service.spec.ts | 127 ++ .../openaire-broker-topic-rest.service.ts | 133 ++ .../openaire-broker-events.component.html | 207 ++ .../openaire-broker-events.component.spec.ts | 332 +++ .../openaire-broker-events.component.ts | 464 +++++ .../openaire-broker-events.scomponent.scss | 21 + .../project-entry-import-modal.component.html | 70 + .../project-entry-import-modal.component.scss | 3 + ...oject-entry-import-modal.component.spec.ts | 210 ++ .../project-entry-import-modal.component.ts | 274 +++ .../topics/openaire-broker-topics.actions.ts | 99 + .../openaire-broker-topics.component.html | 57 + .../openaire-broker-topics.component.scss | 0 .../openaire-broker-topics.component.spec.ts | 152 ++ .../openaire-broker-topics.component.ts | 142 ++ .../topics/openaire-broker-topics.effects.ts | 87 + .../openaire-broker-topics.reducer.spec.ts | 68 + .../topics/openaire-broker-topics.reducer.ts | 72 + .../openaire-broker-topics.service.spec.ts | 67 + .../topics/openaire-broker-topics.service.ts | 55 + .../openaire/openaire-state.service.spec.ts | 275 +++ src/app/openaire/openaire-state.service.ts | 116 ++ src/app/openaire/openaire.effects.ts | 5 + src/app/openaire/openaire.module.ts | 74 + src/app/openaire/openaire.reducer.ts | 16 + src/app/openaire/selectors.ts | 79 + src/app/shared/mocks/openaire.mock.ts | 1796 +++++++++++++++++ .../pagination/pagination.component.html | 6 +- .../shared/pagination/pagination.component.ts | 5 + src/app/shared/selector.util.ts | 27 + src/assets/i18n/en.json5 | 137 ++ 53 files changed, 6165 insertions(+), 12 deletions(-) create mode 100644 src/app/admin/admin-notifications/admin-notifications-openaire-events-page/admin-notifications-openaire-events-page.component.html create mode 100644 src/app/admin/admin-notifications/admin-notifications-openaire-events-page/admin-notifications-openaire-events-page.component.spec.ts create mode 100644 src/app/admin/admin-notifications/admin-notifications-openaire-events-page/admin-notifications-openaire-events-page.component.ts create mode 100644 src/app/admin/admin-notifications/admin-notifications-openaire-events-page/admin-notifications-openaire-events-page.resolver.ts create mode 100644 src/app/admin/admin-notifications/admin-notifications-openaire-topics-page/admin-notifications-openaire-topics-page-resolver.service.ts create mode 100644 src/app/admin/admin-notifications/admin-notifications-openaire-topics-page/admin-notifications-openaire-topics-page.component.html create mode 100644 src/app/admin/admin-notifications/admin-notifications-openaire-topics-page/admin-notifications-openaire-topics-page.component.spec.ts create mode 100644 src/app/admin/admin-notifications/admin-notifications-openaire-topics-page/admin-notifications-openaire-topics-page.component.ts create mode 100644 src/app/admin/admin-notifications/admin-notifications-routing-paths.ts create mode 100644 src/app/admin/admin-notifications/admin-notifications-routing.module.ts create mode 100644 src/app/admin/admin-notifications/admin-notifications.module.ts create mode 100644 src/app/core/openaire/broker/events/openaire-broker-event-rest.service.spec.ts create mode 100644 src/app/core/openaire/broker/events/openaire-broker-event-rest.service.ts create mode 100644 src/app/core/openaire/broker/models/openaire-broker-event-object.resource-type.ts create mode 100644 src/app/core/openaire/broker/models/openaire-broker-event.model.ts create mode 100644 src/app/core/openaire/broker/models/openaire-broker-topic-object.resource-type.ts create mode 100644 src/app/core/openaire/broker/models/openaire-broker-topic.model.ts create mode 100644 src/app/core/openaire/broker/topics/openaire-broker-topic-rest.service.spec.ts create mode 100644 src/app/core/openaire/broker/topics/openaire-broker-topic-rest.service.ts create mode 100644 src/app/openaire/broker/events/openaire-broker-events.component.html create mode 100644 src/app/openaire/broker/events/openaire-broker-events.component.spec.ts create mode 100644 src/app/openaire/broker/events/openaire-broker-events.component.ts create mode 100644 src/app/openaire/broker/events/openaire-broker-events.scomponent.scss create mode 100644 src/app/openaire/broker/project-entry-import-modal/project-entry-import-modal.component.html create mode 100644 src/app/openaire/broker/project-entry-import-modal/project-entry-import-modal.component.scss create mode 100644 src/app/openaire/broker/project-entry-import-modal/project-entry-import-modal.component.spec.ts create mode 100644 src/app/openaire/broker/project-entry-import-modal/project-entry-import-modal.component.ts create mode 100644 src/app/openaire/broker/topics/openaire-broker-topics.actions.ts create mode 100644 src/app/openaire/broker/topics/openaire-broker-topics.component.html create mode 100644 src/app/openaire/broker/topics/openaire-broker-topics.component.scss create mode 100644 src/app/openaire/broker/topics/openaire-broker-topics.component.spec.ts create mode 100644 src/app/openaire/broker/topics/openaire-broker-topics.component.ts create mode 100644 src/app/openaire/broker/topics/openaire-broker-topics.effects.ts create mode 100644 src/app/openaire/broker/topics/openaire-broker-topics.reducer.spec.ts create mode 100644 src/app/openaire/broker/topics/openaire-broker-topics.reducer.ts create mode 100644 src/app/openaire/broker/topics/openaire-broker-topics.service.spec.ts create mode 100644 src/app/openaire/broker/topics/openaire-broker-topics.service.ts create mode 100644 src/app/openaire/openaire-state.service.spec.ts create mode 100644 src/app/openaire/openaire-state.service.ts create mode 100644 src/app/openaire/openaire.effects.ts create mode 100644 src/app/openaire/openaire.module.ts create mode 100644 src/app/openaire/openaire.reducer.ts create mode 100644 src/app/openaire/selectors.ts create mode 100644 src/app/shared/mocks/openaire.mock.ts create mode 100644 src/app/shared/selector.util.ts diff --git a/src/app/admin/admin-notifications/admin-notifications-openaire-events-page/admin-notifications-openaire-events-page.component.html b/src/app/admin/admin-notifications/admin-notifications-openaire-events-page/admin-notifications-openaire-events-page.component.html new file mode 100644 index 0000000000..5c8f8820a0 --- /dev/null +++ b/src/app/admin/admin-notifications/admin-notifications-openaire-events-page/admin-notifications-openaire-events-page.component.html @@ -0,0 +1 @@ + diff --git a/src/app/admin/admin-notifications/admin-notifications-openaire-events-page/admin-notifications-openaire-events-page.component.spec.ts b/src/app/admin/admin-notifications/admin-notifications-openaire-events-page/admin-notifications-openaire-events-page.component.spec.ts new file mode 100644 index 0000000000..ab7a08a695 --- /dev/null +++ b/src/app/admin/admin-notifications/admin-notifications-openaire-events-page/admin-notifications-openaire-events-page.component.spec.ts @@ -0,0 +1,26 @@ +import { NO_ERRORS_SCHEMA } from '@angular/core'; +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; +import { AdminNotificationsOpenaireEventsPageComponent } from './admin-notifications-openaire-events-page.component'; + +describe('AdminNotificationsOpenaireEventsPageComponent', () => { + let component: AdminNotificationsOpenaireEventsPageComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ AdminNotificationsOpenaireEventsPageComponent ], + schemas: [NO_ERRORS_SCHEMA] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(AdminNotificationsOpenaireEventsPageComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create AdminNotificationsOpenaireEventsPageComponent', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/admin/admin-notifications/admin-notifications-openaire-events-page/admin-notifications-openaire-events-page.component.ts b/src/app/admin/admin-notifications/admin-notifications-openaire-events-page/admin-notifications-openaire-events-page.component.ts new file mode 100644 index 0000000000..df7b21dbda --- /dev/null +++ b/src/app/admin/admin-notifications/admin-notifications-openaire-events-page/admin-notifications-openaire-events-page.component.ts @@ -0,0 +1,9 @@ +import { Component } from '@angular/core'; + +@Component({ + selector: 'ds-notification-openaire-events-page', + templateUrl: './admin-notifications-openaire-events-page.component.html' +}) +export class AdminNotificationsOpenaireEventsPageComponent { + +} diff --git a/src/app/admin/admin-notifications/admin-notifications-openaire-events-page/admin-notifications-openaire-events-page.resolver.ts b/src/app/admin/admin-notifications/admin-notifications-openaire-events-page/admin-notifications-openaire-events-page.resolver.ts new file mode 100644 index 0000000000..b215013e11 --- /dev/null +++ b/src/app/admin/admin-notifications/admin-notifications-openaire-events-page/admin-notifications-openaire-events-page.resolver.ts @@ -0,0 +1,32 @@ +import { Injectable } from '@angular/core'; +import { Resolve, ActivatedRouteSnapshot, RouterStateSnapshot } from '@angular/router'; + +/** + * Interface for the route parameters. + */ +export interface AdminNotificationsOpenaireEventsPageParams { + pageId?: string; + pageSize?: number; + currentPage?: number; +} + +/** + * This class represents a resolver that retrieve the route data before the route is activated. + */ +@Injectable() +export class AdminNotificationsOpenaireEventsPageResolver implements Resolve { + + /** + * Method for resolving the parameters in the current route. + * @param {ActivatedRouteSnapshot} route The current ActivatedRouteSnapshot + * @param {RouterStateSnapshot} state The current RouterStateSnapshot + * @returns AdminNotificationsOpenaireEventsPageParams Emits the route parameters + */ + resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): AdminNotificationsOpenaireEventsPageParams { + return { + pageId: route.queryParams.pageId, + pageSize: parseInt(route.queryParams.pageSize, 10), + currentPage: parseInt(route.queryParams.page, 10) + }; + } +} diff --git a/src/app/admin/admin-notifications/admin-notifications-openaire-topics-page/admin-notifications-openaire-topics-page-resolver.service.ts b/src/app/admin/admin-notifications/admin-notifications-openaire-topics-page/admin-notifications-openaire-topics-page-resolver.service.ts new file mode 100644 index 0000000000..f8e02cabbf --- /dev/null +++ b/src/app/admin/admin-notifications/admin-notifications-openaire-topics-page/admin-notifications-openaire-topics-page-resolver.service.ts @@ -0,0 +1,32 @@ +import { Injectable } from '@angular/core'; +import { ActivatedRouteSnapshot, Resolve, RouterStateSnapshot } from '@angular/router'; + +/** + * Interface for the route parameters. + */ +export interface AdminNotificationsOpenaireTopicsPageParams { + pageId?: string; + pageSize?: number; + currentPage?: number; +} + +/** + * This class represents a resolver that retrieve the route data before the route is activated. + */ +@Injectable() +export class AdminNotificationsOpenaireTopicsPageResolver implements Resolve { + + /** + * Method for resolving the parameters in the current route. + * @param {ActivatedRouteSnapshot} route The current ActivatedRouteSnapshot + * @param {RouterStateSnapshot} state The current RouterStateSnapshot + * @returns AdminNotificationsOpenaireTopicsPageParams Emits the route parameters + */ + resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): AdminNotificationsOpenaireTopicsPageParams { + return { + pageId: route.queryParams.pageId, + pageSize: parseInt(route.queryParams.pageSize, 10), + currentPage: parseInt(route.queryParams.page, 10) + }; + } +} diff --git a/src/app/admin/admin-notifications/admin-notifications-openaire-topics-page/admin-notifications-openaire-topics-page.component.html b/src/app/admin/admin-notifications/admin-notifications-openaire-topics-page/admin-notifications-openaire-topics-page.component.html new file mode 100644 index 0000000000..b1616cfe78 --- /dev/null +++ b/src/app/admin/admin-notifications/admin-notifications-openaire-topics-page/admin-notifications-openaire-topics-page.component.html @@ -0,0 +1 @@ + diff --git a/src/app/admin/admin-notifications/admin-notifications-openaire-topics-page/admin-notifications-openaire-topics-page.component.spec.ts b/src/app/admin/admin-notifications/admin-notifications-openaire-topics-page/admin-notifications-openaire-topics-page.component.spec.ts new file mode 100644 index 0000000000..712c7ba2c3 --- /dev/null +++ b/src/app/admin/admin-notifications/admin-notifications-openaire-topics-page/admin-notifications-openaire-topics-page.component.spec.ts @@ -0,0 +1,26 @@ +import { NO_ERRORS_SCHEMA } from '@angular/core'; +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; +import { AdminNotificationsOpenaireTopicsPageComponent } from './admin-notifications-openaire-topics-page.component'; + +describe('AdminNotificationsOpenaireTopicsPageComponent', () => { + let component: AdminNotificationsOpenaireTopicsPageComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ AdminNotificationsOpenaireTopicsPageComponent ], + schemas: [NO_ERRORS_SCHEMA] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(AdminNotificationsOpenaireTopicsPageComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create AdminNotificationsOpenaireTopicsPageComponent', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/admin/admin-notifications/admin-notifications-openaire-topics-page/admin-notifications-openaire-topics-page.component.ts b/src/app/admin/admin-notifications/admin-notifications-openaire-topics-page/admin-notifications-openaire-topics-page.component.ts new file mode 100644 index 0000000000..5bf1832c59 --- /dev/null +++ b/src/app/admin/admin-notifications/admin-notifications-openaire-topics-page/admin-notifications-openaire-topics-page.component.ts @@ -0,0 +1,9 @@ +import { Component } from '@angular/core'; + +@Component({ + selector: 'ds-notification-openairebroker-page', + templateUrl: './admin-notifications-openaire-topics-page.component.html' +}) +export class AdminNotificationsOpenaireTopicsPageComponent { + +} diff --git a/src/app/admin/admin-notifications/admin-notifications-routing-paths.ts b/src/app/admin/admin-notifications/admin-notifications-routing-paths.ts new file mode 100644 index 0000000000..ea7242adcb --- /dev/null +++ b/src/app/admin/admin-notifications/admin-notifications-routing-paths.ts @@ -0,0 +1,8 @@ +import { URLCombiner } from '../../core/url-combiner/url-combiner'; +import { getNotificationsModuleRoute } from '../admin-routing-paths'; + +export const NOTIFICATIONS_EDIT_PATH = 'openaire-broker'; + +export function getNotificationsOpenairebrokerRoute(id: string) { + return new URLCombiner(getNotificationsModuleRoute(), NOTIFICATIONS_EDIT_PATH, id).toString(); +} diff --git a/src/app/admin/admin-notifications/admin-notifications-routing.module.ts b/src/app/admin/admin-notifications/admin-notifications-routing.module.ts new file mode 100644 index 0000000000..2dfa938c4f --- /dev/null +++ b/src/app/admin/admin-notifications/admin-notifications-routing.module.ts @@ -0,0 +1,60 @@ +import { NgModule } from '@angular/core'; +import { RouterModule } from '@angular/router'; + +import { AuthenticatedGuard } from '../../core/auth/authenticated.guard'; +import { I18nBreadcrumbResolver } from '../../core/breadcrumbs/i18n-breadcrumb.resolver'; +import { I18nBreadcrumbsService } from '../../core/breadcrumbs/i18n-breadcrumbs.service'; +import { NOTIFICATIONS_EDIT_PATH } from './admin-notifications-routing-paths'; +import { AdminNotificationsOpenaireTopicsPageComponent } from './admin-notifications-openaire-topics-page/admin-notifications-openaire-topics-page.component'; +import { AdminNotificationsOpenaireEventsPageComponent } from './admin-notifications-openaire-events-page/admin-notifications-openaire-events-page.component'; +import { AdminNotificationsOpenaireTopicsPageResolver } from './admin-notifications-openaire-topics-page/admin-notifications-openaire-topics-page-resolver.service'; +import { AdminNotificationsOpenaireEventsPageResolver } from './admin-notifications-openaire-events-page/admin-notifications-openaire-events-page.resolver'; + +@NgModule({ + imports: [ + RouterModule.forChild([ + { + canActivate: [ AuthenticatedGuard ], + path: `${NOTIFICATIONS_EDIT_PATH}`, + component: AdminNotificationsOpenaireTopicsPageComponent, + pathMatch: 'full', + resolve: { + breadcrumb: I18nBreadcrumbResolver, + openaireBrokerTopicsParams: AdminNotificationsOpenaireTopicsPageResolver + }, + data: { + title: 'admin.notifications.openairebroker.page.title', + breadcrumbKey: 'admin.notifications.openairebroker', + showBreadcrumbsFluid: false + } + }, + { + canActivate: [ AuthenticatedGuard ], + path: `${NOTIFICATIONS_EDIT_PATH}/:id`, + component: AdminNotificationsOpenaireEventsPageComponent, + pathMatch: 'full', + resolve: { + breadcrumb: I18nBreadcrumbResolver, + openaireBrokerEventsParams: AdminNotificationsOpenaireEventsPageResolver + }, + data: { + title: 'admin.notifications.openaireevent.page.title', + breadcrumbKey: 'admin.notifications.openaireevent', + showBreadcrumbsFluid: false + } + } + ]) + ], + providers: [ + I18nBreadcrumbResolver, + I18nBreadcrumbsService, + AdminNotificationsOpenaireTopicsPageResolver, + AdminNotificationsOpenaireEventsPageResolver + ] +}) +/** + * Routing module for the Notifications section of the admin sidebar + */ +export class AdminNotificationsRoutingModule { + +} diff --git a/src/app/admin/admin-notifications/admin-notifications.module.ts b/src/app/admin/admin-notifications/admin-notifications.module.ts new file mode 100644 index 0000000000..9894dac233 --- /dev/null +++ b/src/app/admin/admin-notifications/admin-notifications.module.ts @@ -0,0 +1,29 @@ +import { CommonModule } from '@angular/common'; +import { NgModule } from '@angular/core'; +import { CoreModule } from '../../core/core.module'; +import { SharedModule } from '../../shared/shared.module'; +import { AdminNotificationsRoutingModule } from './admin-notifications-routing.module'; +import { AdminNotificationsOpenaireTopicsPageComponent } from './admin-notifications-openaire-topics-page/admin-notifications-openaire-topics-page.component'; +import { AdminNotificationsOpenaireEventsPageComponent } from './admin-notifications-openaire-events-page/admin-notifications-openaire-events-page.component'; +import { OpenaireModule } from '../../openaire/openaire.module'; + +@NgModule({ + imports: [ + CommonModule, + SharedModule, + CoreModule.forRoot(), + AdminNotificationsRoutingModule, + OpenaireModule + ], + declarations: [ + AdminNotificationsOpenaireTopicsPageComponent, + AdminNotificationsOpenaireEventsPageComponent + ], + entryComponents: [] +}) +/** + * This module handles all components related to the notifications pages + */ +export class AdminNotificationsModule { + +} diff --git a/src/app/admin/admin-routing-paths.ts b/src/app/admin/admin-routing-paths.ts index 3168ea93c9..30f801cecb 100644 --- a/src/app/admin/admin-routing-paths.ts +++ b/src/app/admin/admin-routing-paths.ts @@ -2,7 +2,12 @@ import { URLCombiner } from '../core/url-combiner/url-combiner'; import { getAdminModuleRoute } from '../app-routing-paths'; export const REGISTRIES_MODULE_PATH = 'registries'; +export const NOTIFICATIONS_MODULE_PATH = 'notifications'; export function getRegistriesModuleRoute() { return new URLCombiner(getAdminModuleRoute(), REGISTRIES_MODULE_PATH).toString(); } + +export function getNotificationsModuleRoute() { + return new URLCombiner(getAdminModuleRoute(), NOTIFICATIONS_MODULE_PATH).toString(); +} diff --git a/src/app/admin/admin-routing.module.ts b/src/app/admin/admin-routing.module.ts index ee5cb8737b..782a7faa38 100644 --- a/src/app/admin/admin-routing.module.ts +++ b/src/app/admin/admin-routing.module.ts @@ -6,11 +6,16 @@ import { I18nBreadcrumbResolver } from '../core/breadcrumbs/i18n-breadcrumb.reso import { AdminWorkflowPageComponent } from './admin-workflow-page/admin-workflow-page.component'; import { I18nBreadcrumbsService } from '../core/breadcrumbs/i18n-breadcrumbs.service'; import { AdminCurationTasksComponent } from './admin-curation-tasks/admin-curation-tasks.component'; -import { REGISTRIES_MODULE_PATH } from './admin-routing-paths'; +import { REGISTRIES_MODULE_PATH, NOTIFICATIONS_MODULE_PATH } from './admin-routing-paths'; @NgModule({ imports: [ RouterModule.forChild([ + { + path: NOTIFICATIONS_MODULE_PATH, + loadChildren: () => import('./admin-notifications/admin-notifications.module') + .then((m) => m.AdminNotificationsModule), + }, { path: REGISTRIES_MODULE_PATH, loadChildren: () => import('./admin-registries/admin-registries.module') diff --git a/src/app/admin/admin-sidebar/admin-sidebar.component.ts b/src/app/admin/admin-sidebar/admin-sidebar.component.ts index c81b2e6e93..a2a7eb30b5 100644 --- a/src/app/admin/admin-sidebar/admin-sidebar.component.ts +++ b/src/app/admin/admin-sidebar/admin-sidebar.component.ts @@ -276,7 +276,7 @@ export class AdminSidebarComponent extends MenuComponent implements OnInit { // link: '' // } as LinkMenuItemModel, // icon: 'chart-bar', - // index: 8 + // index: 9 // }, /* Control Panel */ @@ -291,7 +291,7 @@ export class AdminSidebarComponent extends MenuComponent implements OnInit { // link: '' // } as LinkMenuItemModel, // icon: 'cogs', - // index: 9 + // index: 10 // }, /* Processes */ @@ -305,7 +305,7 @@ export class AdminSidebarComponent extends MenuComponent implements OnInit { link: '/processes' } as LinkMenuItemModel, icon: 'terminal', - index: 10 + index: 11 }, ]; menuList.forEach((menuSection) => this.menuService.addSection(this.menuID, Object.assign(menuSection, { @@ -464,6 +464,29 @@ export class AdminSidebarComponent extends MenuComponent implements OnInit { createSiteAdministratorMenuSections() { this.authorizationService.isAuthorized(FeatureID.AdministratorOf).subscribe((authorized) => { const menuList = [ + /* Notifications */ + { + id: 'notifications', + active: false, + visible: authorized, + model: { + type: MenuItemType.TEXT, + text: 'menu.section.notifications' + } as TextMenuItemModel, + icon: 'bell', + index: 4 + }, + { + id: 'notifications_openair_broker', + parentID: 'notifications', + active: false, + visible: authorized, + model: { + type: MenuItemType.LINK, + text: 'menu.section.notifications_openaire_broker', + link: '/admin/notifications/openaire-broker' + } as LinkMenuItemModel, + }, /* Admin Search */ { id: 'admin_search', @@ -475,7 +498,7 @@ export class AdminSidebarComponent extends MenuComponent implements OnInit { link: '/admin/search' } as LinkMenuItemModel, icon: 'search', - index: 5 + index: 6 }, /* Registries */ { @@ -487,7 +510,7 @@ export class AdminSidebarComponent extends MenuComponent implements OnInit { text: 'menu.section.registries' } as TextMenuItemModel, icon: 'list', - index: 6 + index: 7 }, { id: 'registries_metadata', @@ -523,7 +546,7 @@ export class AdminSidebarComponent extends MenuComponent implements OnInit { link: 'admin/curation-tasks' } as LinkMenuItemModel, icon: 'filter', - index: 7 + index: 8 }, /* Workflow */ @@ -537,7 +560,7 @@ export class AdminSidebarComponent extends MenuComponent implements OnInit { link: '/admin/workflow' } as LinkMenuItemModel, icon: 'user-check', - index: 11 + index: 12 }, ]; @@ -600,7 +623,7 @@ export class AdminSidebarComponent extends MenuComponent implements OnInit { text: 'menu.section.access_control' } as TextMenuItemModel, icon: 'key', - index: 4 + index: 5 }, ]; diff --git a/src/app/core/core.module.ts b/src/app/core/core.module.ts index 8d8a614a89..928d34c48e 100644 --- a/src/app/core/core.module.ts +++ b/src/app/core/core.module.ts @@ -162,6 +162,8 @@ import { SearchConfig } from './shared/search/search-filters/search-config.model import { SequenceService } from './shared/sequence.service'; import { GroupDataService } from './eperson/group-data.service'; import { SubmissionAccessesModel } from './config/models/config-submission-accesses.model'; +import { OpenaireBrokerTopicObject } from './openaire/broker/models/openaire-broker-topic.model'; +import { OpenaireBrokerEventObject } from './openaire/broker/models/openaire-broker-event.model'; /** * When not in production, endpoint responses can be mocked for testing purposes @@ -343,6 +345,8 @@ export const models = ShortLivedToken, Registration, UsageReport, + OpenaireBrokerTopicObject, + OpenaireBrokerEventObject, Root, SearchConfig, SubmissionAccessesModel diff --git a/src/app/core/data/data.service.ts b/src/app/core/data/data.service.ts index 6bad02e776..0b4f3af4b4 100644 --- a/src/app/core/data/data.service.ts +++ b/src/app/core/data/data.service.ts @@ -38,7 +38,7 @@ import { FindListOptions, PatchRequest, PutRequest, - DeleteRequest + DeleteRequest, DeleteByIDRequest, PostRequest } from './request.models'; import { RequestService } from './request.service'; import { RestRequestMethod } from './rest-request-method'; @@ -579,6 +579,53 @@ export abstract class DataService implements UpdateDa return result$; } + /** + * Perform a post on an endpoint related item with ID. Ex.: endpoint//related?item= + * @param itemId The item id + * @param relatedItemId The related item Id + * @param body The optional POST body + * @return the RestResponse as an Observable + */ + public postOnRelated(itemId: string, relatedItemId: string, body?: any) { + const requestId = this.requestService.generateRequestId(); + const hrefObs = this.getIDHrefObs(itemId); + + hrefObs.pipe( + take(1) + ).subscribe((href: string) => { + const request = new PostRequest(requestId, href + '/related?item=' + relatedItemId, body); + if (hasValue(this.responseMsToLive)) { + request.responseMsToLive = this.responseMsToLive; + } + this.requestService.send(request); + }); + + return this.rdbService.buildFromRequestUUID(requestId); + } + + /** + * Perform a delete on an endpoint related item. Ex.: endpoint//related + * @param itemId The item id + * @return the RestResponse as an Observable + */ + public deleteOnRelated(itemId: string): Observable> { + const requestId = this.requestService.generateRequestId(); + const hrefObs = this.getIDHrefObs(itemId); + + hrefObs.pipe( + find((href: string) => hasValue(href)), + map((href: string) => { + const request = new DeleteByIDRequest(requestId, href + '/related', itemId); + if (hasValue(this.responseMsToLive)) { + request.responseMsToLive = this.responseMsToLive; + } + this.requestService.send(request); + }) + ).subscribe(); + + return this.rdbService.buildFromRequestUUID(requestId); + } + /** * Delete an existing DSpace Object on the server * @param objectId The id of the object to be removed diff --git a/src/app/core/openaire/broker/events/openaire-broker-event-rest.service.spec.ts b/src/app/core/openaire/broker/events/openaire-broker-event-rest.service.spec.ts new file mode 100644 index 0000000000..2d0d236330 --- /dev/null +++ b/src/app/core/openaire/broker/events/openaire-broker-event-rest.service.spec.ts @@ -0,0 +1,246 @@ +import { HttpClient } from '@angular/common/http'; + +import { TestScheduler } from 'rxjs/testing'; +import { of as observableOf } from 'rxjs'; +import { cold, getTestScheduler } from 'jasmine-marbles'; + +import { RequestService } from '../../../data/request.service'; +import { buildPaginatedList } from '../../../data/paginated-list.model'; +import { RequestEntry } from '../../../data/request.reducer'; +import { FindListOptions } from '../../../data/request.models'; +import { RemoteDataBuildService } from '../../../cache/builders/remote-data-build.service'; +import { ObjectCacheService } from '../../../cache/object-cache.service'; +import { RestResponse } from '../../../cache/response.models'; +import { PageInfo } from '../../../shared/page-info.model'; +import { HALEndpointService } from '../../../shared/hal-endpoint.service'; +import { NotificationsService } from '../../../../shared/notifications/notifications.service'; +import { createSuccessfulRemoteDataObject } from '../../../../shared/remote-data.utils'; +import { OpenaireBrokerEventRestService } from './openaire-broker-event-rest.service'; +import { + openaireBrokerEventObjectMissingPid, + openaireBrokerEventObjectMissingPid2, + openaireBrokerEventObjectMissingProjectFound +} from '../../../../shared/mocks/openaire.mock'; +import { ReplaceOperation } from 'fast-json-patch'; + +describe('OpenaireBrokerEventRestService', () => { + let scheduler: TestScheduler; + let service: OpenaireBrokerEventRestService; + let serviceASAny: any; + let responseCacheEntry: RequestEntry; + let responseCacheEntryB: RequestEntry; + let responseCacheEntryC: RequestEntry; + let requestService: RequestService; + let rdbService: RemoteDataBuildService; + let objectCache: ObjectCacheService; + let halService: HALEndpointService; + let notificationsService: NotificationsService; + let http: HttpClient; + let comparator: any; + + const endpointURL = 'https://rest.api/rest/api/integration/nbtopics'; + const requestUUID = '8b3c913a-5a4b-438b-9181-be1a5b4a1c8a'; + const topic = 'ENRICH!MORE!PID'; + + const pageInfo = new PageInfo(); + const array = [ openaireBrokerEventObjectMissingPid, openaireBrokerEventObjectMissingPid2 ]; + const paginatedList = buildPaginatedList(pageInfo, array); + const brokerEventObjectRD = createSuccessfulRemoteDataObject(openaireBrokerEventObjectMissingPid); + const brokerEventObjectMissingProjectRD = createSuccessfulRemoteDataObject(openaireBrokerEventObjectMissingProjectFound); + const paginatedListRD = createSuccessfulRemoteDataObject(paginatedList); + + const status = 'ACCEPTED'; + const operation: ReplaceOperation[] = [ + { + path: '/status', + op: 'replace', + value: status + } + ]; + + beforeEach(() => { + scheduler = getTestScheduler(); + + responseCacheEntry = new RequestEntry(); + responseCacheEntry.request = { href: 'https://rest.api/' } as any; + responseCacheEntry.response = new RestResponse(true, 200, 'Success'); + requestService = jasmine.createSpyObj('requestService', { + generateRequestId: requestUUID, + send: true, + removeByHrefSubstring: {}, + getByHref: jasmine.createSpy('getByHref'), + getByUUID: jasmine.createSpy('getByUUID') + }); + + responseCacheEntryB = new RequestEntry(); + responseCacheEntryB.request = { href: 'https://rest.api/' } as any; + responseCacheEntryB.response = new RestResponse(true, 201, 'Created'); + + responseCacheEntryC = new RequestEntry(); + responseCacheEntryC.request = { href: 'https://rest.api/' } as any; + responseCacheEntryC.response = new RestResponse(true, 204, 'No Content'); + + rdbService = jasmine.createSpyObj('rdbService', { + buildSingle: cold('(a)', { + a: brokerEventObjectRD + }), + buildList: cold('(a)', { + a: paginatedListRD + }), + buildFromRequestUUID: jasmine.createSpy('buildFromRequestUUID') + }); + + objectCache = {} as ObjectCacheService; + halService = jasmine.createSpyObj('halService', { + getEndpoint: cold('a|', { a: endpointURL }) + }); + + notificationsService = {} as NotificationsService; + http = {} as HttpClient; + comparator = {} as any; + + service = new OpenaireBrokerEventRestService( + requestService, + rdbService, + objectCache, + halService, + notificationsService, + http, + comparator + ); + + serviceASAny = service; + + spyOn(serviceASAny.dataService, 'searchBy').and.callThrough(); + spyOn(serviceASAny.dataService, 'findById').and.callThrough(); + spyOn(serviceASAny.dataService, 'patch').and.callThrough(); + spyOn(serviceASAny.dataService, 'postOnRelated').and.callThrough(); + spyOn(serviceASAny.dataService, 'deleteOnRelated').and.callThrough(); + }); + + describe('getEventsByTopic', () => { + beforeEach(() => { + serviceASAny.requestService.getByHref.and.returnValue(observableOf(responseCacheEntry)); + serviceASAny.requestService.getByUUID.and.returnValue(observableOf(responseCacheEntry)); + serviceASAny.rdbService.buildFromRequestUUID.and.returnValue(observableOf(brokerEventObjectRD)); + }); + + it('should proxy the call to dataservice.searchBy', () => { + const options: FindListOptions = { + searchParams: [ + { + fieldName: 'topic', + fieldValue: topic + } + ] + }; + service.getEventsByTopic(topic); + expect(serviceASAny.dataService.searchBy).toHaveBeenCalledWith('findByTopic', options, true, true); + }); + + it('should return a RemoteData> for the object with the given Topic', () => { + const result = service.getEventsByTopic(topic); + const expected = cold('(a)', { + a: paginatedListRD + }); + expect(result).toBeObservable(expected); + }); + }); + + describe('getEvent', () => { + beforeEach(() => { + serviceASAny.requestService.getByHref.and.returnValue(observableOf(responseCacheEntry)); + serviceASAny.requestService.getByUUID.and.returnValue(observableOf(responseCacheEntry)); + serviceASAny.rdbService.buildFromRequestUUID.and.returnValue(observableOf(brokerEventObjectRD)); + }); + + it('should proxy the call to dataservice.findById', () => { + service.getEvent(openaireBrokerEventObjectMissingPid.id).subscribe( + (res) => { + expect(serviceASAny.dataService.findById).toHaveBeenCalledWith(openaireBrokerEventObjectMissingPid.id, true, true); + } + ); + }); + + it('should return a RemoteData for the object with the given URL', () => { + const result = service.getEvent(openaireBrokerEventObjectMissingPid.id); + const expected = cold('(a)', { + a: brokerEventObjectRD + }); + expect(result).toBeObservable(expected); + }); + }); + + describe('patchEvent', () => { + beforeEach(() => { + serviceASAny.requestService.getByHref.and.returnValue(observableOf(responseCacheEntry)); + serviceASAny.requestService.getByUUID.and.returnValue(observableOf(responseCacheEntry)); + serviceASAny.rdbService.buildFromRequestUUID.and.returnValue(observableOf(brokerEventObjectRD)); + }); + + it('should proxy the call to dataservice.patch', () => { + service.patchEvent(status, openaireBrokerEventObjectMissingPid).subscribe( + (res) => { + expect(serviceASAny.dataService.patch).toHaveBeenCalledWith(openaireBrokerEventObjectMissingPid, operation); + } + ); + }); + + it('should return a RemoteData with HTTP 200', () => { + const result = service.patchEvent(status, openaireBrokerEventObjectMissingPid); + const expected = cold('(a|)', { + a: createSuccessfulRemoteDataObject(openaireBrokerEventObjectMissingPid) + }); + expect(result).toBeObservable(expected); + }); + }); + + describe('boundProject', () => { + beforeEach(() => { + serviceASAny.requestService.getByHref.and.returnValue(observableOf(responseCacheEntryB)); + serviceASAny.requestService.getByUUID.and.returnValue(observableOf(responseCacheEntryB)); + serviceASAny.rdbService.buildFromRequestUUID.and.returnValue(observableOf(brokerEventObjectMissingProjectRD)); + }); + + it('should proxy the call to dataservice.postOnRelated', () => { + service.boundProject(openaireBrokerEventObjectMissingProjectFound.id, requestUUID).subscribe( + (res) => { + expect(serviceASAny.dataService.postOnRelated).toHaveBeenCalledWith(openaireBrokerEventObjectMissingProjectFound.id, requestUUID); + } + ); + }); + + it('should return a RestResponse with HTTP 201', () => { + const result = service.boundProject(openaireBrokerEventObjectMissingProjectFound.id, requestUUID); + const expected = cold('(a|)', { + a: createSuccessfulRemoteDataObject(openaireBrokerEventObjectMissingProjectFound) + }); + expect(result).toBeObservable(expected); + }); + }); + + describe('removeProject', () => { + beforeEach(() => { + serviceASAny.requestService.getByHref.and.returnValue(observableOf(responseCacheEntryC)); + serviceASAny.requestService.getByUUID.and.returnValue(observableOf(responseCacheEntryC)); + serviceASAny.rdbService.buildFromRequestUUID.and.returnValue(observableOf(createSuccessfulRemoteDataObject({}))); + }); + + it('should proxy the call to dataservice.deleteOnRelated', () => { + service.removeProject(openaireBrokerEventObjectMissingProjectFound.id).subscribe( + (res) => { + expect(serviceASAny.dataService.deleteOnRelated).toHaveBeenCalledWith(openaireBrokerEventObjectMissingProjectFound.id); + } + ); + }); + + it('should return a RestResponse with HTTP 204', () => { + const result = service.removeProject(openaireBrokerEventObjectMissingProjectFound.id); + const expected = cold('(a|)', { + a: createSuccessfulRemoteDataObject({}) + }); + expect(result).toBeObservable(expected); + }); + }); + +}); diff --git a/src/app/core/openaire/broker/events/openaire-broker-event-rest.service.ts b/src/app/core/openaire/broker/events/openaire-broker-event-rest.service.ts new file mode 100644 index 0000000000..6e944c8038 --- /dev/null +++ b/src/app/core/openaire/broker/events/openaire-broker-event-rest.service.ts @@ -0,0 +1,185 @@ +import { Injectable } from '@angular/core'; +import { HttpClient } from '@angular/common/http'; +import { Store } from '@ngrx/store'; + +import { Observable } from 'rxjs'; + +import { CoreState } from '../../../core.reducers'; +import { HALEndpointService } from '../../../shared/hal-endpoint.service'; +import { NotificationsService } from '../../../../shared/notifications/notifications.service'; +import { RemoteDataBuildService } from '../../../cache/builders/remote-data-build.service'; +import { RestResponse } from '../../../cache/response.models'; +import { ObjectCacheService } from '../../../cache/object-cache.service'; +import { dataService } from '../../../cache/builders/build-decorators'; +import { RequestService } from '../../../data/request.service'; +import { FindListOptions } from '../../../data/request.models'; +import { DataService } from '../../../data/data.service'; +import { ChangeAnalyzer } from '../../../data/change-analyzer'; +import { DefaultChangeAnalyzer } from '../../../data/default-change-analyzer.service'; +import { RemoteData } from '../../../data/remote-data'; +import { OpenaireBrokerEventObject } from '../models/openaire-broker-event.model'; +import { OPENAIRE_BROKER_EVENT_OBJECT } from '../models/openaire-broker-event-object.resource-type'; +import { FollowLinkConfig } from '../../../../shared/utils/follow-link-config.model'; +import { PaginatedList } from '../../../data/paginated-list.model'; +import { ReplaceOperation } from 'fast-json-patch'; +import { NoContent } from '../../../shared/NoContent.model'; + +/* tslint:disable:max-classes-per-file */ + +/** + * A private DataService implementation to delegate specific methods to. + */ +class DataServiceImpl extends DataService { + /** + * The REST endpoint. + */ + protected linkPath = 'nbevents'; + + /** + * Initialize service variables + * @param {RequestService} requestService + * @param {RemoteDataBuildService} rdbService + * @param {Store} store + * @param {ObjectCacheService} objectCache + * @param {HALEndpointService} halService + * @param {NotificationsService} notificationsService + * @param {HttpClient} http + * @param {ChangeAnalyzer} comparator + */ + constructor( + protected requestService: RequestService, + protected rdbService: RemoteDataBuildService, + protected store: Store, + protected objectCache: ObjectCacheService, + protected halService: HALEndpointService, + protected notificationsService: NotificationsService, + protected http: HttpClient, + protected comparator: ChangeAnalyzer) { + super(); + } +} + +/** + * The service handling all OpenAIRE Broker topic REST requests. + */ +@Injectable() +@dataService(OPENAIRE_BROKER_EVENT_OBJECT) +export class OpenaireBrokerEventRestService { + /** + * A private DataService implementation to delegate specific methods to. + */ + private dataService: DataServiceImpl; + + /** + * Initialize service variables + * @param {RequestService} requestService + * @param {RemoteDataBuildService} rdbService + * @param {ObjectCacheService} objectCache + * @param {HALEndpointService} halService + * @param {NotificationsService} notificationsService + * @param {HttpClient} http + * @param {DefaultChangeAnalyzer} comparator + */ + constructor( + protected requestService: RequestService, + protected rdbService: RemoteDataBuildService, + protected objectCache: ObjectCacheService, + protected halService: HALEndpointService, + protected notificationsService: NotificationsService, + protected http: HttpClient, + protected comparator: DefaultChangeAnalyzer) { + this.dataService = new DataServiceImpl(requestService, rdbService, null, objectCache, halService, notificationsService, http, comparator); + } + + /** + * Return the list of OpenAIRE Broker events by topic. + * + * @param topic + * The OpenAIRE Broker topic + * @param options + * Find list options object. + * @param linksToFollow + * List of {@link FollowLinkConfig} that indicate which {@link HALLink}s should be automatically resolved. + * @return Observable>> + * The list of OpenAIRE Broker events. + */ + public getEventsByTopic(topic: string, options: FindListOptions = {}, ...linksToFollow: FollowLinkConfig[]): Observable>> { + options.searchParams = [ + { + fieldName: 'topic', + fieldValue: topic + } + ]; + return this.dataService.searchBy('findByTopic', options, true, true, ...linksToFollow); + } + + /** + * Clear findByTopic requests from cache + */ + public clearFindByTopicRequests() { + this.requestService.removeByHrefSubstring('findByTopic'); + } + + /** + * Return a single OpenAIRE Broker event. + * + * @param id + * The OpenAIRE Broker event id + * @param linksToFollow + * List of {@link FollowLinkConfig} that indicate which {@link HALLink}s should be automatically resolved + * @return Observable> + * The OpenAIRE Broker event. + */ + public getEvent(id: string, ...linksToFollow: FollowLinkConfig[]): Observable> { + return this.dataService.findById(id, true, true, ...linksToFollow); + } + + /** + * Save the new status of an OpenAIRE Broker event. + * + * @param status + * The new status + * @param dso OpenaireBrokerEventObject + * The event item + * @param reason + * The optional reason (not used for now; for future implementation) + * @return Observable + * The REST response. + */ + public patchEvent(status, dso, reason?: string): Observable> { + const operation: ReplaceOperation[] = [ + { + path: '/status', + op: 'replace', + value: status + } + ]; + return this.dataService.patch(dso, operation); + } + + /** + * Bound a project to an OpenAIRE Broker event publication. + * + * @param itemId + * The Id of the OpenAIRE Broker event + * @param projectId + * The project Id to bound + * @return Observable + * The REST response. + */ + public boundProject(itemId: string, projectId: string): Observable> { + return this.dataService.postOnRelated(itemId, projectId); + } + + /** + * Remove a project from an OpenAIRE Broker event publication. + * + * @param itemId + * The Id of the OpenAIRE Broker event + * @return Observable + * The REST response. + */ + public removeProject(itemId: string): Observable> { + return this.dataService.deleteOnRelated(itemId); + } +} diff --git a/src/app/core/openaire/broker/models/openaire-broker-event-object.resource-type.ts b/src/app/core/openaire/broker/models/openaire-broker-event-object.resource-type.ts new file mode 100644 index 0000000000..c0be0071eb --- /dev/null +++ b/src/app/core/openaire/broker/models/openaire-broker-event-object.resource-type.ts @@ -0,0 +1,9 @@ +import { ResourceType } from '../../../shared/resource-type'; + +/** + * The resource type for the OpenAIRE Broker event + * + * Needs to be in a separate file to prevent circular + * dependencies in webpack. + */ +export const OPENAIRE_BROKER_EVENT_OBJECT = new ResourceType('nbevent'); diff --git a/src/app/core/openaire/broker/models/openaire-broker-event.model.ts b/src/app/core/openaire/broker/models/openaire-broker-event.model.ts new file mode 100644 index 0000000000..40c65412f5 --- /dev/null +++ b/src/app/core/openaire/broker/models/openaire-broker-event.model.ts @@ -0,0 +1,157 @@ +import { Observable } from 'rxjs'; +import { autoserialize, autoserializeAs, deserialize } from 'cerialize'; +import { CacheableObject } from '../../../cache/object-cache.reducer'; +import { OPENAIRE_BROKER_EVENT_OBJECT } from './openaire-broker-event-object.resource-type'; +import { excludeFromEquals } from '../../../utilities/equals.decorators'; +import { ResourceType } from '../../../shared/resource-type'; +import { HALLink } from '../../../shared/hal-link.model'; +import { Item } from '../../../shared/item.model'; +import { ITEM } from '../../../shared/item.resource-type'; +import { link, typedObject } from '../../../cache/builders/build-decorators'; +import { RemoteData } from '../../../data/remote-data'; + +/** + * The interface representing the OpenAIRE Broker event message + */ +export interface OpenaireBrokerEventMessageObject { + /** + * The type of 'value' + */ + type: string; + + /** + * The value suggested by OpenAIRE + */ + value: string; + + /** + * The abstract suggested by OpenAIRE + */ + abstract: string; + + /** + * The project acronym suggested by OpenAIRE + */ + acronym: string; + + /** + * The project code suggested by OpenAIRE + */ + code: string; + + /** + * The project funder suggested by OpenAIRE + */ + funder: string; + + /** + * The project program suggested by OpenAIRE + */ + fundingProgram?: string; + + /** + * The project jurisdiction suggested by OpenAIRE + */ + jurisdiction: string; + + /** + * The project title suggested by OpenAIRE + */ + title: string; + + /** + * The OpenAIRE ID. + */ + openaireId: string; + +} + +/** + * The interface representing the OpenAIRE Broker event model + */ +@typedObject +export class OpenaireBrokerEventObject implements CacheableObject { + /** + * A string representing the kind of object, e.g. community, item, … + */ + static type = OPENAIRE_BROKER_EVENT_OBJECT; + + /** + * The OpenAIRE Broker event uuid inside DSpace + */ + @autoserialize + id: string; + + /** + * The universally unique identifier of this OpenAIRE Broker event + */ + @autoserializeAs(String, 'id') + uuid: string; + + /** + * The OpenAIRE Broker event original id (ex.: the source archive OAI-PMH identifier) + */ + @autoserialize + originalId: string; + + /** + * The title of the article to which the suggestion refers + */ + @autoserialize + title: string; + + /** + * Reliability of the suggestion (of the data inside 'message') + */ + @autoserialize + trust: number; + + /** + * The timestamp OpenAIRE Broker event was saved in DSpace + */ + @autoserialize + eventDate: string; + + /** + * The OpenAIRE Broker event status (ACCEPTED, REJECTED, DISCARDED, PENDING) + */ + @autoserialize + status: string; + + /** + * The suggestion data. Data may vary depending on the topic + */ + @autoserialize + message: OpenaireBrokerEventMessageObject; + + /** + * The type of this ConfigObject + */ + @excludeFromEquals + @autoserialize + type: ResourceType; + + /** + * The links to all related resources returned by the rest api. + */ + @deserialize + _links: { + self: HALLink, + target: HALLink, + related: HALLink + }; + + /** + * The related publication DSpace item + * Will be undefined unless the {@item HALLink} has been resolved. + */ + @link(ITEM) + target?: Observable>; + + /** + * The related project for this Event + * Will be undefined unless the {@related HALLink} has been resolved. + */ + @link(ITEM) + related?: Observable>; +} diff --git a/src/app/core/openaire/broker/models/openaire-broker-topic-object.resource-type.ts b/src/app/core/openaire/broker/models/openaire-broker-topic-object.resource-type.ts new file mode 100644 index 0000000000..58ceb4e671 --- /dev/null +++ b/src/app/core/openaire/broker/models/openaire-broker-topic-object.resource-type.ts @@ -0,0 +1,9 @@ +import { ResourceType } from '../../../shared/resource-type'; + +/** + * The resource type for the OpenAIRE Broker topic + * + * Needs to be in a separate file to prevent circular + * dependencies in webpack. + */ +export const OPENAIRE_BROKER_TOPIC_OBJECT = new ResourceType('nbtopic'); diff --git a/src/app/core/openaire/broker/models/openaire-broker-topic.model.ts b/src/app/core/openaire/broker/models/openaire-broker-topic.model.ts new file mode 100644 index 0000000000..3f286e5fea --- /dev/null +++ b/src/app/core/openaire/broker/models/openaire-broker-topic.model.ts @@ -0,0 +1,58 @@ +import { autoserialize, deserialize } from 'cerialize'; + +import { CacheableObject } from '../../../cache/object-cache.reducer'; +import { OPENAIRE_BROKER_TOPIC_OBJECT } from './openaire-broker-topic-object.resource-type'; +import { excludeFromEquals } from '../../../utilities/equals.decorators'; +import { ResourceType } from '../../../shared/resource-type'; +import { HALLink } from '../../../shared/hal-link.model'; +import { typedObject } from '../../../cache/builders/build-decorators'; + +/** + * The interface representing the OpenAIRE Broker topic model + */ +@typedObject +export class OpenaireBrokerTopicObject implements CacheableObject { + /** + * A string representing the kind of object, e.g. community, item, … + */ + static type = OPENAIRE_BROKER_TOPIC_OBJECT; + + /** + * The OpenAIRE Broker topic id + */ + @autoserialize + id: string; + + /** + * The OpenAIRE Broker topic name to display + */ + @autoserialize + name: string; + + /** + * The date of the last udate from OpenAIRE + */ + @autoserialize + lastEvent: string; + + /** + * The total number of suggestions provided by OpenAIRE for this topic + */ + @autoserialize + totalEvents: number; + + /** + * The type of this ConfigObject + */ + @excludeFromEquals + @autoserialize + type: ResourceType; + + /** + * The links to all related resources returned by the rest api. + */ + @deserialize + _links: { + self: HALLink, + }; +} diff --git a/src/app/core/openaire/broker/topics/openaire-broker-topic-rest.service.spec.ts b/src/app/core/openaire/broker/topics/openaire-broker-topic-rest.service.spec.ts new file mode 100644 index 0000000000..87aa0b42f0 --- /dev/null +++ b/src/app/core/openaire/broker/topics/openaire-broker-topic-rest.service.spec.ts @@ -0,0 +1,127 @@ +import { HttpClient } from '@angular/common/http'; + +import { TestScheduler } from 'rxjs/testing'; +import { of as observableOf } from 'rxjs'; +import { cold, getTestScheduler } from 'jasmine-marbles'; + +import { RequestService } from '../../../data/request.service'; +import { buildPaginatedList } from '../../../data/paginated-list.model'; +import { RequestEntry } from '../../../data/request.reducer'; +import { RemoteDataBuildService } from '../../../cache/builders/remote-data-build.service'; +import { ObjectCacheService } from '../../../cache/object-cache.service'; +import { RestResponse } from '../../../cache/response.models'; +import { PageInfo } from '../../../shared/page-info.model'; +import { HALEndpointService } from '../../../shared/hal-endpoint.service'; +import { NotificationsService } from '../../../../shared/notifications/notifications.service'; +import { createSuccessfulRemoteDataObject } from '../../../../shared/remote-data.utils'; +import { OpenaireBrokerTopicRestService } from './openaire-broker-topic-rest.service'; +import { + openaireBrokerTopicObjectMoreAbstract, + openaireBrokerTopicObjectMorePid +} from '../../../../shared/mocks/openaire.mock'; + +describe('OpenaireBrokerTopicRestService', () => { + let scheduler: TestScheduler; + let service: OpenaireBrokerTopicRestService; + let responseCacheEntry: RequestEntry; + let requestService: RequestService; + let rdbService: RemoteDataBuildService; + let objectCache: ObjectCacheService; + let halService: HALEndpointService; + let notificationsService: NotificationsService; + let http: HttpClient; + let comparator: any; + + const endpointURL = 'https://rest.api/rest/api/integration/nbtopics'; + const requestUUID = '8b3c913a-5a4b-438b-9181-be1a5b4a1c8a'; + + const pageInfo = new PageInfo(); + const array = [ openaireBrokerTopicObjectMorePid, openaireBrokerTopicObjectMoreAbstract ]; + const paginatedList = buildPaginatedList(pageInfo, array); + const brokerTopicObjectRD = createSuccessfulRemoteDataObject(openaireBrokerTopicObjectMorePid); + const paginatedListRD = createSuccessfulRemoteDataObject(paginatedList); + + beforeEach(() => { + scheduler = getTestScheduler(); + + responseCacheEntry = new RequestEntry(); + responseCacheEntry.response = new RestResponse(true, 200, 'Success'); + requestService = jasmine.createSpyObj('requestService', { + generateRequestId: requestUUID, + send: true, + removeByHrefSubstring: {}, + getByHref: observableOf(responseCacheEntry), + getByUUID: observableOf(responseCacheEntry), + }); + + rdbService = jasmine.createSpyObj('rdbService', { + buildSingle: cold('(a)', { + a: brokerTopicObjectRD + }), + buildList: cold('(a)', { + a: paginatedListRD + }), + }); + + objectCache = {} as ObjectCacheService; + halService = jasmine.createSpyObj('halService', { + getEndpoint: cold('a|', { a: endpointURL }) + }); + + notificationsService = {} as NotificationsService; + http = {} as HttpClient; + comparator = {} as any; + + service = new OpenaireBrokerTopicRestService( + requestService, + rdbService, + objectCache, + halService, + notificationsService, + http, + comparator + ); + + spyOn((service as any).dataService, 'findAllByHref').and.callThrough(); + spyOn((service as any).dataService, 'findByHref').and.callThrough(); + }); + + describe('getTopics', () => { + it('should proxy the call to dataservice.findAllByHref', (done) => { + service.getTopics().subscribe( + (res) => { + expect((service as any).dataService.findAllByHref).toHaveBeenCalledWith(endpointURL, {}, true, true); + } + ); + done(); + }); + + it('should return a RemoteData> for the object with the given URL', () => { + const result = service.getTopics(); + const expected = cold('(a)', { + a: paginatedListRD + }); + expect(result).toBeObservable(expected); + }); + }); + + describe('getTopic', () => { + it('should proxy the call to dataservice.findByHref', (done) => { + service.getTopic(openaireBrokerTopicObjectMorePid.id).subscribe( + (res) => { + expect((service as any).dataService.findByHref).toHaveBeenCalledWith(endpointURL + '/' + openaireBrokerTopicObjectMorePid.id, true, true); + } + ); + done(); + }); + + it('should return a RemoteData for the object with the given URL', () => { + const result = service.getTopic(openaireBrokerTopicObjectMorePid.id); + const expected = cold('(a)', { + a: brokerTopicObjectRD + }); + expect(result).toBeObservable(expected); + }); + }); + +}); diff --git a/src/app/core/openaire/broker/topics/openaire-broker-topic-rest.service.ts b/src/app/core/openaire/broker/topics/openaire-broker-topic-rest.service.ts new file mode 100644 index 0000000000..3fe3917485 --- /dev/null +++ b/src/app/core/openaire/broker/topics/openaire-broker-topic-rest.service.ts @@ -0,0 +1,133 @@ +import { Injectable } from '@angular/core'; +import { HttpClient } from '@angular/common/http'; +import { Store } from '@ngrx/store'; + +import { Observable } from 'rxjs'; +import { mergeMap, take } from 'rxjs/operators'; + +import { CoreState } from '../../../core.reducers'; +import { HALEndpointService } from '../../../shared/hal-endpoint.service'; +import { NotificationsService } from '../../../../shared/notifications/notifications.service'; +import { RemoteDataBuildService } from '../../../cache/builders/remote-data-build.service'; +import { ObjectCacheService } from '../../../cache/object-cache.service'; +import { dataService } from '../../../cache/builders/build-decorators'; +import { RequestService } from '../../../data/request.service'; +import { FindListOptions } from '../../../data/request.models'; +import { DataService } from '../../../data/data.service'; +import { ChangeAnalyzer } from '../../../data/change-analyzer'; +import { DefaultChangeAnalyzer } from '../../../data/default-change-analyzer.service'; +import { RemoteData } from '../../../data/remote-data'; +import { OpenaireBrokerTopicObject } from '../models/openaire-broker-topic.model'; +import { OPENAIRE_BROKER_TOPIC_OBJECT } from '../models/openaire-broker-topic-object.resource-type'; +import { FollowLinkConfig } from '../../../../shared/utils/follow-link-config.model'; +import { PaginatedList } from '../../../data/paginated-list.model'; + +/* tslint:disable:max-classes-per-file */ + +/** + * A private DataService implementation to delegate specific methods to. + */ +class DataServiceImpl extends DataService { + /** + * The REST endpoint. + */ + protected linkPath = 'nbtopics'; + + /** + * Initialize service variables + * @param {RequestService} requestService + * @param {RemoteDataBuildService} rdbService + * @param {Store} store + * @param {ObjectCacheService} objectCache + * @param {HALEndpointService} halService + * @param {NotificationsService} notificationsService + * @param {HttpClient} http + * @param {ChangeAnalyzer} comparator + */ + constructor( + protected requestService: RequestService, + protected rdbService: RemoteDataBuildService, + protected store: Store, + protected objectCache: ObjectCacheService, + protected halService: HALEndpointService, + protected notificationsService: NotificationsService, + protected http: HttpClient, + protected comparator: ChangeAnalyzer) { + super(); + } +} + +/** + * The service handling all OpenAIRE Broker topic REST requests. + */ +@Injectable() +@dataService(OPENAIRE_BROKER_TOPIC_OBJECT) +export class OpenaireBrokerTopicRestService { + /** + * A private DataService implementation to delegate specific methods to. + */ + private dataService: DataServiceImpl; + + /** + * Initialize service variables + * @param {RequestService} requestService + * @param {RemoteDataBuildService} rdbService + * @param {ObjectCacheService} objectCache + * @param {HALEndpointService} halService + * @param {NotificationsService} notificationsService + * @param {HttpClient} http + * @param {DefaultChangeAnalyzer} comparator + */ + constructor( + protected requestService: RequestService, + protected rdbService: RemoteDataBuildService, + protected objectCache: ObjectCacheService, + protected halService: HALEndpointService, + protected notificationsService: NotificationsService, + protected http: HttpClient, + protected comparator: DefaultChangeAnalyzer) { + this.dataService = new DataServiceImpl(requestService, rdbService, null, objectCache, halService, notificationsService, http, comparator); + } + + /** + * Return the list of OpenAIRE Broker topics. + * + * @param options + * Find list options object. + * @param linksToFollow + * List of {@link FollowLinkConfig} that indicate which {@link HALLink}s should be automatically resolved. + * @return Observable>> + * The list of OpenAIRE Broker topics. + */ + public getTopics(options: FindListOptions = {}, ...linksToFollow: FollowLinkConfig[]): Observable>> { + return this.dataService.getBrowseEndpoint(options, 'nbtopics').pipe( + take(1), + mergeMap((href: string) => this.dataService.findAllByHref(href, options, true, true, ...linksToFollow)), + ); + } + + /** + * Clear FindAll topics requests from cache + */ + public clearFindAllTopicsRequests() { + this.requestService.setStaleByHrefSubstring('nbtopics'); + } + + /** + * Return a single OpenAIRE Broker topic. + * + * @param id + * The OpenAIRE Broker topic id + * @param linksToFollow + * List of {@link FollowLinkConfig} that indicate which {@link HALLink}s should be automatically resolved. + * @return Observable> + * The OpenAIRE Broker topic. + */ + public getTopic(id: string, ...linksToFollow: FollowLinkConfig[]): Observable> { + const options = {}; + return this.dataService.getBrowseEndpoint(options, 'nbtopics').pipe( + take(1), + mergeMap((href: string) => this.dataService.findByHref(href + '/' + id, true, true, ...linksToFollow)) + ); + } +} diff --git a/src/app/openaire/broker/events/openaire-broker-events.component.html b/src/app/openaire/broker/events/openaire-broker-events.component.html new file mode 100644 index 0000000000..05d7722291 --- /dev/null +++ b/src/app/openaire/broker/events/openaire-broker-events.component.html @@ -0,0 +1,207 @@ +
+
+
+

{{'openaire.events.title'| translate}}

+

{{'openaire.broker.events.description'| translate}}

+

+ + + {{'openaire.broker.events.back' | translate}} + +

+
+
+
+
+

+ {{'openaire.broker.events.topic' | translate}} {{this.showTopic}} +

+ + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + +
{{'openaire.broker.event.table.trust' | translate}}{{'openaire.broker.event.table.publication' | translate}}{{'openaire.broker.event.table.details' | translate}}{{'openaire.broker.event.table.project-details' | translate}}{{'openaire.broker.event.table.actions' | translate}}
{{eventElement?.event?.trust}} + {{eventElement.title}} + {{eventElement.title}} + +

{{'openaire.broker.event.table.pidtype' | translate}} {{eventElement.event.message.type}}

+

{{'openaire.broker.event.table.pidvalue' | translate}}
+ + {{eventElement.event.message.value}} + + {{eventElement.event.message.value}} +

+
+

{{'openaire.broker.event.table.subjectValue' | translate}}
{{eventElement.event.message.value}}

+
+

+ {{'openaire.broker.event.table.abstract' | translate}}
+ {{eventElement.event.message.abstract}} +

+ +
+

+ {{'openaire.broker.event.table.suggestedProject' | translate}} +

+

+ {{'openaire.broker.event.table.project' | translate}}
+ {{eventElement.event.message.title}} +

+

+ {{'openaire.broker.event.table.acronym' | translate}} {{eventElement.event.message.acronym}}
+ {{'openaire.broker.event.table.code' | translate}} {{eventElement.event.message.code}}
+ {{'openaire.broker.event.table.funder' | translate}} {{eventElement.event.message.funder}}
+ {{'openaire.broker.event.table.fundingProgram' | translate}} {{eventElement.event.message.fundingProgram}}
+ {{'openaire.broker.event.table.jurisdiction' | translate}} {{eventElement.event.message.jurisdiction}} +

+
+
+ {{(eventElement.hasProject ? 'openaire.broker.event.project.found' : 'openaire.broker.event.project.notFound') | translate}} + {{eventElement.handle}} +
+ + +
+
+
+
+ + + + +
+
+
+
+
+
+
+ +
+ + + + + + + + + + + + + + + diff --git a/src/app/openaire/broker/events/openaire-broker-events.component.spec.ts b/src/app/openaire/broker/events/openaire-broker-events.component.spec.ts new file mode 100644 index 0000000000..267f6a8242 --- /dev/null +++ b/src/app/openaire/broker/events/openaire-broker-events.component.spec.ts @@ -0,0 +1,332 @@ +import { Component, NO_ERRORS_SCHEMA } from '@angular/core'; +import { ActivatedRoute } from '@angular/router'; +import { CommonModule } from '@angular/common'; +import { ComponentFixture, inject, TestBed, waitForAsync } from '@angular/core/testing'; +import { TranslateModule, TranslateService } from '@ngx-translate/core'; +import { NgbModal } from '@ng-bootstrap/ng-bootstrap'; +import { of as observableOf } from 'rxjs'; +import { OpenaireBrokerEventRestService } from '../../../core/openaire/broker/events/openaire-broker-event-rest.service'; +import { OpenaireBrokerEventsComponent } from './openaire-broker-events.component'; +import { + getMockOpenaireBrokerEventRestService, + ItemMockPid10, + ItemMockPid8, + ItemMockPid9, + openaireBrokerEventObjectMissingProjectFound, + openaireBrokerEventObjectMissingProjectNotFound, + OpenaireMockDspaceObject +} from '../../../shared/mocks/openaire.mock'; +import { NotificationsServiceStub } from '../../../shared/testing/notifications-service.stub'; +import { NotificationsService } from '../../../shared/notifications/notifications.service'; +import { getMockTranslateService } from '../../../shared/mocks/translate.service.mock'; +import { createTestComponent } from '../../../shared/testing/utils.test'; +import { ActivatedRouteStub } from '../../../shared/testing/active-router.stub'; +import { PaginationComponentOptions } from '../../../shared/pagination/pagination-component-options.model'; +import { OpenaireBrokerEventObject } from '../../../core/openaire/broker/models/openaire-broker-event.model'; +import { OpenaireBrokerEventData } from '../project-entry-import-modal/project-entry-import-modal.component'; +import { TestScheduler } from 'rxjs/testing'; +import { getTestScheduler } from 'jasmine-marbles'; +import { followLink } from '../../../shared/utils/follow-link-config.model'; +import { PageInfo } from '../../../core/shared/page-info.model'; +import { buildPaginatedList } from '../../../core/data/paginated-list.model'; +import { + createNoContentRemoteDataObject$, + createSuccessfulRemoteDataObject, + createSuccessfulRemoteDataObject$ +} from '../../../shared/remote-data.utils'; +import { FindListOptions } from '../../../core/data/request.models'; +import { SortDirection, SortOptions } from '../../../core/cache/models/sort-options.model'; +import { PaginationService } from '../../../core/pagination/pagination.service'; +import { PaginationServiceStub } from '../../../shared/testing/pagination-service.stub'; + +describe('OpenaireBrokerEventsComponent test suite', () => { + let fixture: ComponentFixture; + let comp: OpenaireBrokerEventsComponent; + let compAsAny: any; + let scheduler: TestScheduler; + + const modalStub = { + open: () => ( {result: new Promise((res, rej) => 'do')} ), + close: () => null, + dismiss: () => null + }; + const openaireBrokerEventRestServiceStub: any = getMockOpenaireBrokerEventRestService(); + const activatedRouteParams = { + openaireBrokerEventsParams: { + currentPage: 0, + pageSize: 10 + } + }; + const activatedRouteParamsMap = { + id: 'ENRICH!MISSING!PROJECT' + }; + + const events: OpenaireBrokerEventObject[] = [ + openaireBrokerEventObjectMissingProjectFound, + openaireBrokerEventObjectMissingProjectNotFound + ]; + const paginationService = new PaginationServiceStub(); + + function getOpenAireBrokerEventData1(): OpenaireBrokerEventData { + return { + event: openaireBrokerEventObjectMissingProjectFound, + id: openaireBrokerEventObjectMissingProjectFound.id, + title: openaireBrokerEventObjectMissingProjectFound.title, + hasProject: true, + projectTitle: openaireBrokerEventObjectMissingProjectFound.message.title, + projectId: ItemMockPid10.id, + handle: ItemMockPid10.handle, + reason: null, + isRunning: false, + target: ItemMockPid8 + }; + } + + function getOpenAireBrokerEventData2(): OpenaireBrokerEventData { + return { + event: openaireBrokerEventObjectMissingProjectNotFound, + id: openaireBrokerEventObjectMissingProjectNotFound.id, + title: openaireBrokerEventObjectMissingProjectNotFound.title, + hasProject: false, + projectTitle: null, + projectId: null, + handle: null, + reason: null, + isRunning: false, + target: ItemMockPid9 + }; + } + + beforeEach(waitForAsync(() => { + TestBed.configureTestingModule({ + imports: [ + CommonModule, + TranslateModule.forRoot(), + ], + declarations: [ + OpenaireBrokerEventsComponent, + TestComponent, + ], + providers: [ + { provide: ActivatedRoute, useValue: new ActivatedRouteStub(activatedRouteParamsMap, activatedRouteParams) }, + { provide: OpenaireBrokerEventRestService, useValue: openaireBrokerEventRestServiceStub }, + { provide: NgbModal, useValue: modalStub }, + { provide: NotificationsService, useValue: new NotificationsServiceStub() }, + { provide: TranslateService, useValue: getMockTranslateService() }, + { provide: PaginationService, useValue: paginationService }, + OpenaireBrokerEventsComponent + ], + schemas: [NO_ERRORS_SCHEMA] + }).compileComponents().then(); + scheduler = getTestScheduler(); + })); + + // First test to check the correct component creation + describe('', () => { + let testComp: TestComponent; + let testFixture: ComponentFixture; + + // synchronous beforeEach + beforeEach(() => { + const html = ` + `; + testFixture = createTestComponent(html, TestComponent) as ComponentFixture; + testComp = testFixture.componentInstance; + }); + + afterEach(() => { + testFixture.destroy(); + }); + + it('should create OpenaireBrokerEventsComponent', inject([OpenaireBrokerEventsComponent], (app: OpenaireBrokerEventsComponent) => { + expect(app).toBeDefined(); + })); + }); + + describe('Main tests', () => { + beforeEach(() => { + fixture = TestBed.createComponent(OpenaireBrokerEventsComponent); + comp = fixture.componentInstance; + compAsAny = comp; + }); + + afterEach(() => { + fixture.destroy(); + comp = null; + compAsAny = null; + }); + + describe('setEventUpdated', () => { + it('should update events', () => { + const expected = [ + getOpenAireBrokerEventData1(), + getOpenAireBrokerEventData2() + ]; + scheduler.schedule(() => { + compAsAny.setEventUpdated(events); + }); + scheduler.flush(); + + expect(comp.eventsUpdated$.value).toEqual(expected); + }); + }); + + describe('modalChoice', () => { + beforeEach(() => { + spyOn(comp, 'executeAction'); + spyOn(comp, 'openModal'); + }); + + it('should call executeAction if a project is present', () => { + const action = 'ACCEPTED'; + comp.modalChoice(action, getOpenAireBrokerEventData1(), modalStub); + expect(comp.executeAction).toHaveBeenCalledWith(action, getOpenAireBrokerEventData1()); + }); + + it('should call openModal if a project is not present', () => { + const action = 'ACCEPTED'; + comp.modalChoice(action, getOpenAireBrokerEventData2(), modalStub); + expect(comp.openModal).toHaveBeenCalledWith(action, getOpenAireBrokerEventData2(), modalStub); + }); + }); + + describe('openModal', () => { + it('should call modalService.open', () => { + const action = 'ACCEPTED'; + comp.selectedReason = null; + spyOn(compAsAny.modalService, 'open').and.returnValue({ result: new Promise((res, rej) => 'do' ) }); + spyOn(comp, 'executeAction'); + + comp.openModal(action, getOpenAireBrokerEventData1(), modalStub); + expect(compAsAny.modalService.open).toHaveBeenCalled(); + }); + }); + + describe('openModalLookup', () => { + it('should call modalService.open', () => { + spyOn(comp, 'boundProject'); + spyOn(compAsAny.modalService, 'open').and.returnValue( + { + componentInstance: { + externalSourceEntry: null, + label: null, + importedObject: observableOf({ + indexableObject: OpenaireMockDspaceObject + }) + } + } + ); + scheduler.schedule(() => { + comp.openModalLookup(getOpenAireBrokerEventData1()); + }); + scheduler.flush(); + + expect(compAsAny.modalService.open).toHaveBeenCalled(); + expect(compAsAny.boundProject).toHaveBeenCalled(); + }); + }); + + describe('executeAction', () => { + it('should call getOpenaireBrokerEvents on 200 response from REST', () => { + const action = 'ACCEPTED'; + spyOn(compAsAny, 'getOpenaireBrokerEvents'); + openaireBrokerEventRestServiceStub.patchEvent.and.returnValue(createSuccessfulRemoteDataObject$({})); + + scheduler.schedule(() => { + comp.executeAction(action, getOpenAireBrokerEventData1()); + }); + scheduler.flush(); + + expect(compAsAny.getOpenaireBrokerEvents).toHaveBeenCalled(); + }); + }); + + describe('boundProject', () => { + it('should populate the project data inside "eventData"', () => { + const eventData = getOpenAireBrokerEventData2(); + const projectId = 'UUID-23943-34u43-38344'; + const projectName = 'Test Project'; + const projectHandle = '1000/1000'; + openaireBrokerEventRestServiceStub.boundProject.and.returnValue(createSuccessfulRemoteDataObject$({})); + + scheduler.schedule(() => { + comp.boundProject(eventData, projectId, projectName, projectHandle); + }); + scheduler.flush(); + + expect(eventData.hasProject).toEqual(true); + expect(eventData.projectId).toEqual(projectId); + expect(eventData.projectTitle).toEqual(projectName); + expect(eventData.handle).toEqual(projectHandle); + }); + }); + + describe('removeProject', () => { + it('should remove the project data inside "eventData"', () => { + const eventData = getOpenAireBrokerEventData1(); + openaireBrokerEventRestServiceStub.removeProject.and.returnValue(createNoContentRemoteDataObject$()); + + scheduler.schedule(() => { + comp.removeProject(eventData); + }); + scheduler.flush(); + + expect(eventData.hasProject).toEqual(false); + expect(eventData.projectId).toBeNull(); + expect(eventData.projectTitle).toBeNull(); + expect(eventData.handle).toBeNull(); + }); + }); + + describe('getOpenaireBrokerEvents', () => { + it('should call the "openaireBrokerEventRestService.getEventsByTopic" to take data and "setEventUpdated" to populate eventData', () => { + comp.paginationConfig = new PaginationComponentOptions(); + comp.paginationConfig.currentPage = 1; + comp.paginationConfig.pageSize = 20; + comp.paginationSortConfig = new SortOptions('trust', SortDirection.DESC); + comp.topic = activatedRouteParamsMap.id; + const options: FindListOptions = Object.assign(new FindListOptions(), { + currentPage: comp.paginationConfig.currentPage, + elementsPerPage: comp.paginationConfig.pageSize + }); + + const pageInfo = new PageInfo({ + elementsPerPage: comp.paginationConfig.pageSize, + totalElements: 0, + totalPages: 1, + currentPage: comp.paginationConfig.currentPage + }); + const array = [ + openaireBrokerEventObjectMissingProjectFound, + openaireBrokerEventObjectMissingProjectNotFound, + ]; + const paginatedList = buildPaginatedList(pageInfo, array); + const paginatedListRD = createSuccessfulRemoteDataObject(paginatedList); + openaireBrokerEventRestServiceStub.getEventsByTopic.and.returnValue(observableOf(paginatedListRD)); + spyOn(compAsAny, 'setEventUpdated'); + + scheduler.schedule(() => { + compAsAny.getOpenaireBrokerEvents(); + }); + scheduler.flush(); + + expect(compAsAny.openaireBrokerEventRestService.getEventsByTopic).toHaveBeenCalledWith( + activatedRouteParamsMap.id, + options, + followLink('target'),followLink('related') + ); + expect(compAsAny.setEventUpdated).toHaveBeenCalled(); + }); + }); + + }); +}); + +// declare a test component +@Component({ + selector: 'ds-test-cmp', + template: `` +}) +class TestComponent { + +} diff --git a/src/app/openaire/broker/events/openaire-broker-events.component.ts b/src/app/openaire/broker/events/openaire-broker-events.component.ts new file mode 100644 index 0000000000..14ad175e80 --- /dev/null +++ b/src/app/openaire/broker/events/openaire-broker-events.component.ts @@ -0,0 +1,464 @@ +import { Component, OnInit } from '@angular/core'; +import { ActivatedRoute } from '@angular/router'; + +import { NgbModal } from '@ng-bootstrap/ng-bootstrap'; +import { TranslateService } from '@ngx-translate/core'; +import { BehaviorSubject, from, Observable, of as observableOf, Subscription } from 'rxjs'; +import { distinctUntilChanged, map, mergeMap, scan, switchMap, take } from 'rxjs/operators'; + +import { SortDirection, SortOptions } from '../../../core/cache/models/sort-options.model'; +import { PaginatedList } from '../../../core/data/paginated-list.model'; +import { RemoteData } from '../../../core/data/remote-data'; +import { FindListOptions } from '../../../core/data/request.models'; +import { + OpenaireBrokerEventMessageObject, + OpenaireBrokerEventObject +} from '../../../core/openaire/broker/models/openaire-broker-event.model'; +import { OpenaireBrokerEventRestService } from '../../../core/openaire/broker/events/openaire-broker-event-rest.service'; +import { PaginationComponentOptions } from '../../../shared/pagination/pagination-component-options.model'; +import { Metadata } from '../../../core/shared/metadata.utils'; +import { followLink } from '../../../shared/utils/follow-link-config.model'; +import { hasValue } from '../../../shared/empty.util'; +import { ItemSearchResult } from '../../../shared/object-collection/shared/item-search-result.model'; +import { NotificationsService } from '../../../shared/notifications/notifications.service'; +import { + OpenaireBrokerEventData, + ProjectEntryImportModalComponent +} from '../project-entry-import-modal/project-entry-import-modal.component'; +import { getFirstCompletedRemoteData } from '../../../core/shared/operators'; +import { PaginationService } from '../../../core/pagination/pagination.service'; +import { combineLatest } from 'rxjs/internal/observable/combineLatest'; +import { Item } from '../../../core/shared/item.model'; + +/** + * Component to display the OpenAIRE Broker event list. + */ +@Component({ + selector: 'ds-openaire-broker-events', + templateUrl: './openaire-broker-events.component.html', + styleUrls: ['./openaire-broker-events.scomponent.scss'], +}) +export class OpenaireBrokerEventsComponent implements OnInit { + /** + * The pagination system configuration for HTML listing. + * @type {PaginationComponentOptions} + */ + public paginationConfig: PaginationComponentOptions = Object.assign(new PaginationComponentOptions(), { + id: 'bep', + currentPage: 1, + pageSize: 10, + pageSizeOptions: [5, 10, 20, 40, 60] + }); + /** + * The OpenAIRE Broker event list sort options. + * @type {SortOptions} + */ + public paginationSortConfig: SortOptions = new SortOptions('trust', SortDirection.DESC); + /** + * Array to save the presence of a project inside an OpenAIRE Broker event. + * @type {OpenaireBrokerEventData[]>} + */ + public eventsUpdated$: BehaviorSubject = new BehaviorSubject([]); + /** + * The total number of OpenAIRE Broker events. + * @type {Observable} + */ + public totalElements$: Observable; + /** + * The topic of the OpenAIRE Broker events; suitable for displaying. + * @type {string} + */ + public showTopic: string; + /** + * The topic of the OpenAIRE Broker events; suitable for HTTP calls. + * @type {string} + */ + public topic: string; + /** + * The rejected/ignore reason. + * @type {string} + */ + public selectedReason: string; + /** + * Contains the information about the loading status of the page. + * @type {Observable} + */ + public isEventPageLoading: BehaviorSubject = new BehaviorSubject(false); + /** + * Contains the information about the loading status of the events inside the pagination component. + * @type {Observable} + */ + public isEventLoading: BehaviorSubject = new BehaviorSubject(false); + /** + * The modal reference. + * @type {any} + */ + public modalRef: any; + /** + * Used to store the status of the 'Show more' button of the abstracts. + * @type {boolean} + */ + public showMore = false; + /** + * The FindListOptions object + */ + protected defaultConfig: FindListOptions = Object.assign(new FindListOptions(), {sort: this.paginationSortConfig}); + /** + * Array to track all the component subscriptions. Useful to unsubscribe them with 'onDestroy'. + * @type {Array} + */ + protected subs: Subscription[] = []; + + /** + * Initialize the component variables. + * @param {ActivatedRoute} activatedRoute + * @param {NgbModal} modalService + * @param {NotificationsService} notificationsService + * @param {OpenaireBrokerEventRestService} openaireBrokerEventRestService + * @param {PaginationService} paginationService + * @param {TranslateService} translateService + */ + constructor( + private activatedRoute: ActivatedRoute, + private modalService: NgbModal, + private notificationsService: NotificationsService, + private openaireBrokerEventRestService: OpenaireBrokerEventRestService, + private paginationService: PaginationService, + private translateService: TranslateService + ) { + } + + /** + * Component initialization. + */ + ngOnInit(): void { + this.isEventPageLoading.next(true); + + this.activatedRoute.paramMap.pipe( + map((params) => params.get('id')), + take(1) + ).subscribe((id: string) => { + const regEx = /!/g; + this.showTopic = id.replace(regEx, '/'); + this.topic = id; + this.isEventPageLoading.next(false); + this.getOpenaireBrokerEvents(); + }); + } + + /** + * Check if table have a detail column + */ + public hasDetailColumn(): boolean { + return (this.showTopic.indexOf('/PROJECT') !== -1 || + this.showTopic.indexOf('/PID') !== -1 || + this.showTopic.indexOf('/SUBJECT') !== -1 || + this.showTopic.indexOf('/ABSTRACT') !== -1 + ); + } + + /** + * Open a modal or run the executeAction directly based on the presence of the project. + * + * @param {string} action + * the action (can be: ACCEPTED, REJECTED, DISCARDED, PENDING) + * @param {OpenaireBrokerEventData} eventData + * the OpenAIRE Broker event data + * @param {any} content + * Reference to the modal + */ + public modalChoice(action: string, eventData: OpenaireBrokerEventData, content: any): void { + if (eventData.hasProject) { + this.executeAction(action, eventData); + } else { + this.openModal(action, eventData, content); + } + } + + /** + * Open the selected modal and performs the action if needed. + * + * @param {string} action + * the action (can be: ACCEPTED, REJECTED, DISCARDED, PENDING) + * @param {OpenaireBrokerEventData} eventData + * the OpenAIRE Broker event data + * @param {any} content + * Reference to the modal + */ + public openModal(action: string, eventData: OpenaireBrokerEventData, content: any): void { + this.modalService.open(content, { ariaLabelledBy: 'modal-basic-title' }).result.then( + (result) => { + if (result === 'do') { + eventData.reason = this.selectedReason; + this.executeAction(action, eventData); + } + this.selectedReason = null; + }, + (_reason) => { + this.selectedReason = null; + } + ); + } + + /** + * Open a modal where the user can select the project. + * + * @param {OpenaireBrokerEventData} eventData + * the OpenAIRE Broker event item data + */ + public openModalLookup(eventData: OpenaireBrokerEventData): void { + this.modalRef = this.modalService.open(ProjectEntryImportModalComponent, { + size: 'lg' + }); + const modalComp = this.modalRef.componentInstance; + modalComp.externalSourceEntry = eventData; + modalComp.label = 'project'; + this.subs.push( + modalComp.importedObject.pipe(take(1)) + .subscribe((object: ItemSearchResult) => { + const projectTitle = Metadata.first(object.indexableObject.metadata, 'dc.title'); + this.boundProject( + eventData, + object.indexableObject.id, + projectTitle.value, + object.indexableObject.handle + ); + }) + ); + } + + /** + * Performs the choosen action calling the REST service. + * + * @param {string} action + * the action (can be: ACCEPTED, REJECTED, DISCARDED, PENDING) + * @param {OpenaireBrokerEventData} eventData + * the OpenAIRE Broker event data + */ + public executeAction(action: string, eventData: OpenaireBrokerEventData): void { + eventData.isRunning = true; + this.subs.push( + this.openaireBrokerEventRestService.patchEvent(action, eventData.event, eventData.reason).pipe(getFirstCompletedRemoteData()) + .subscribe((rd: RemoteData) => { + if (rd.isSuccess && rd.statusCode === 200) { + this.notificationsService.success( + this.translateService.instant('openaire.broker.event.action.saved') + ); + this.getOpenaireBrokerEvents(); + } else { + this.notificationsService.error( + this.translateService.instant('openaire.broker.event.action.error') + ); + } + eventData.isRunning = false; + }) + ); + } + + /** + * Bound a project to the publication described in the OpenAIRE Broker event calling the REST service. + * + * @param {OpenaireBrokerEventData} eventData + * the OpenAIRE Broker event item data + * @param {string} projectId + * the project Id to bound + * @param {string} projectTitle + * the project title + * @param {string} projectHandle + * the project handle + */ + public boundProject(eventData: OpenaireBrokerEventData, projectId: string, projectTitle: string, projectHandle: string): void { + eventData.isRunning = true; + this.subs.push( + this.openaireBrokerEventRestService.boundProject(eventData.id, projectId).pipe(getFirstCompletedRemoteData()) + .subscribe((rd: RemoteData) => { + if (rd.isSuccess) { + this.notificationsService.success( + this.translateService.instant('openaire.broker.event.project.bounded') + ); + eventData.hasProject = true; + eventData.projectTitle = projectTitle; + eventData.handle = projectHandle; + eventData.projectId = projectId; + } else { + this.notificationsService.error( + this.translateService.instant('openaire.broker.event.project.error') + ); + } + eventData.isRunning = false; + }) + ); + } + + /** + * Remove the bounded project from the publication described in the OpenAIRE Broker event calling the REST service. + * + * @param {OpenaireBrokerEventData} eventData + * the OpenAIRE Broker event data + */ + public removeProject(eventData: OpenaireBrokerEventData): void { + eventData.isRunning = true; + this.subs.push( + this.openaireBrokerEventRestService.removeProject(eventData.id).pipe(getFirstCompletedRemoteData()) + .subscribe((rd: RemoteData) => { + if (rd.isSuccess) { + this.notificationsService.success( + this.translateService.instant('openaire.broker.event.project.removed') + ); + eventData.hasProject = false; + eventData.projectTitle = null; + eventData.handle = null; + eventData.projectId = null; + } else { + this.notificationsService.error( + this.translateService.instant('openaire.broker.event.project.error') + ); + } + eventData.isRunning = false; + }) + ); + } + + /** + * Check if the event has a valid href. + * @param event + */ + public hasPIDHref(event: OpenaireBrokerEventMessageObject): boolean { + return this.getPIDHref(event) !== null; + } + + /** + * Get the event pid href. + * @param event + */ + public getPIDHref(event: OpenaireBrokerEventMessageObject): string { + return this.computePIDHref(event); + } + + + /** + * Dispatch the OpenAIRE Broker events retrival. + */ + public getOpenaireBrokerEvents(): void { + this.paginationService.getFindListOptions(this.paginationConfig.id, this.defaultConfig).pipe( + distinctUntilChanged(), + switchMap((options: FindListOptions) => this.openaireBrokerEventRestService.getEventsByTopic( + this.topic, + options, + followLink('target'), followLink('related') + )), + getFirstCompletedRemoteData(), + ).subscribe((rd: RemoteData>) => { + if (rd.hasSucceeded) { + this.isEventLoading.next(false); + this.totalElements$ = observableOf(rd.payload.totalElements); + this.setEventUpdated(rd.payload.page); + } else { + throw new Error('Can\'t retrieve OpenAIRE Broker events from the Broker events REST service'); + } + this.openaireBrokerEventRestService.clearFindByTopicRequests(); + }); + } + + /** + * Unsubscribe from all subscriptions. + */ + ngOnDestroy(): void { + this.subs + .filter((sub) => hasValue(sub)) + .forEach((sub) => sub.unsubscribe()); + } + + /** + * Set the project status for the OpenAIRE Broker events. + * + * @param {OpenaireBrokerEventObject[]} events + * the OpenAIRE Broker event item + */ + protected setEventUpdated(events: OpenaireBrokerEventObject[]): void { + this.subs.push( + from(events).pipe( + mergeMap((event: OpenaireBrokerEventObject) => { + const related$ = event.related.pipe( + getFirstCompletedRemoteData(), + ); + const target$ = event.target.pipe( + getFirstCompletedRemoteData() + ); + return combineLatest([related$, target$]).pipe( + map(([relatedItemRD, targetItemRD]: [RemoteData, RemoteData]) => { + const data: OpenaireBrokerEventData = { + event: event, + id: event.id, + title: event.title, + hasProject: false, + projectTitle: null, + projectId: null, + handle: null, + reason: null, + isRunning: false, + target: (targetItemRD?.hasSucceeded) ? targetItemRD.payload : null, + }; + if (relatedItemRD?.hasSucceeded && relatedItemRD?.payload?.id) { + data.hasProject = true; + data.projectTitle = event.message.title; + data.projectId = relatedItemRD?.payload?.id; + data.handle = relatedItemRD?.payload?.handle; + } + return data; + }) + ); + }), + scan((acc: any, value: any) => [...acc, value], []), + take(events.length) + ).subscribe( + (eventsReduced) => { + this.eventsUpdated$.next(eventsReduced); + } + ) + ); + } + + protected computePIDHref(event: OpenaireBrokerEventMessageObject) { + const type = event.type.toLowerCase(); + const pid = event.value; + let prefix = null; + switch (type) { + case 'arxiv': { + prefix = 'https://arxiv.org/abs/'; + break; + } + case 'handle': { + prefix = 'https://hdl.handle.net/'; + break; + } + case 'urn': { + prefix = ''; + break; + } + case 'doi': { + prefix = 'https://doi.org/'; + break; + } + case 'pmc': { + prefix = 'https://www.ncbi.nlm.nih.gov/pmc/articles/'; + break; + } + case 'pmid': { + prefix = 'https://pubmed.ncbi.nlm.nih.gov/'; + break; + } + case 'ncid': { + prefix = 'https://ci.nii.ac.jp/ncid/'; + break; + } + default: { + break; + } + } + if (prefix === null) { + return null; + } + return prefix + pid; + } +} diff --git a/src/app/openaire/broker/events/openaire-broker-events.scomponent.scss b/src/app/openaire/broker/events/openaire-broker-events.scomponent.scss new file mode 100644 index 0000000000..b38da70f37 --- /dev/null +++ b/src/app/openaire/broker/events/openaire-broker-events.scomponent.scss @@ -0,0 +1,21 @@ +.button-rows { + min-width: 200px; +} + +.button-width { + width: 100%; +} + +.abstract-container { + height: 76px; + overflow: hidden; +} + +.text-ellipsis { + text-overflow: ellipsis; +} + +.show { + overflow: visible; + height: auto; +} diff --git a/src/app/openaire/broker/project-entry-import-modal/project-entry-import-modal.component.html b/src/app/openaire/broker/project-entry-import-modal/project-entry-import-modal.component.html new file mode 100644 index 0000000000..1090fd22fc --- /dev/null +++ b/src/app/openaire/broker/project-entry-import-modal/project-entry-import-modal.component.html @@ -0,0 +1,70 @@ + + + diff --git a/src/app/openaire/broker/project-entry-import-modal/project-entry-import-modal.component.scss b/src/app/openaire/broker/project-entry-import-modal/project-entry-import-modal.component.scss new file mode 100644 index 0000000000..7db9839e38 --- /dev/null +++ b/src/app/openaire/broker/project-entry-import-modal/project-entry-import-modal.component.scss @@ -0,0 +1,3 @@ +.modal-footer { + justify-content: space-between; +} diff --git a/src/app/openaire/broker/project-entry-import-modal/project-entry-import-modal.component.spec.ts b/src/app/openaire/broker/project-entry-import-modal/project-entry-import-modal.component.spec.ts new file mode 100644 index 0000000000..e19d0a7c86 --- /dev/null +++ b/src/app/openaire/broker/project-entry-import-modal/project-entry-import-modal.component.spec.ts @@ -0,0 +1,210 @@ +import { CommonModule } from '@angular/common'; +import { Component, NO_ERRORS_SCHEMA } from '@angular/core'; +import { async, ComponentFixture, inject, TestBed } from '@angular/core/testing'; +import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap'; +import { TranslateModule } from '@ngx-translate/core'; +import { of as observableOf } from 'rxjs'; +import { SearchService } from '../../../core/shared/search/search.service'; +import { Item } from '../../../core/shared/item.model'; +import { createTestComponent } from '../../../shared/testing/utils.test'; +import { ImportType, ProjectEntryImportModalComponent } from './project-entry-import-modal.component'; +import { SelectableListService } from '../../../shared/object-list/selectable-list/selectable-list.service'; +import { getMockSearchService } from '../../../shared/mocks/search-service.mock'; +import { PaginatedSearchOptions } from '../../../shared/search/models/paginated-search-options.model'; +import { PaginationComponentOptions } from '../../../shared/pagination/pagination-component-options.model'; +import { createSuccessfulRemoteDataObject } from '../../../shared/remote-data.utils'; +import { buildPaginatedList } from '../../../core/data/paginated-list.model'; +import { PageInfo } from '../../../core/shared/page-info.model'; +import { + ItemMockPid10, + openaireBrokerEventObjectMissingProjectFound, + OpenaireMockDspaceObject +} from '../../../shared/mocks/openaire.mock'; + +const eventData = { + event: openaireBrokerEventObjectMissingProjectFound, + id: openaireBrokerEventObjectMissingProjectFound.id, + title: openaireBrokerEventObjectMissingProjectFound.title, + hasProject: true, + projectTitle: openaireBrokerEventObjectMissingProjectFound.message.title, + projectId: ItemMockPid10.id, + handle: ItemMockPid10.handle, + reason: null, + isRunning: false +}; + +const searchString = 'Test project to search'; +const pagination = Object.assign( + new PaginationComponentOptions(), { + id: 'openaire-project-bound', + pageSize: 3 + } +); +const searchOptions = Object.assign(new PaginatedSearchOptions( + { + configuration: 'funding', + query: searchString, + pagination: pagination + } +)); +const pageInfo = new PageInfo({ + elementsPerPage: 3, + totalElements: 1, + totalPages: 1, + currentPage: 1 +}); +const array = [ + OpenaireMockDspaceObject, +]; +const paginatedList = buildPaginatedList(pageInfo, array); +const paginatedListRD = createSuccessfulRemoteDataObject(paginatedList); + +describe('ProjectEntryImportModalComponent test suite', () => { + let fixture: ComponentFixture; + let comp: ProjectEntryImportModalComponent; + let compAsAny: any; + + const modalStub = jasmine.createSpyObj('modal', ['close', 'dismiss']); + const uuid = '123e4567-e89b-12d3-a456-426614174003'; + const searchServiceStub: any = getMockSearchService(); + + + beforeEach(async (() => { + TestBed.configureTestingModule({ + imports: [ + CommonModule, + TranslateModule.forRoot(), + ], + declarations: [ + ProjectEntryImportModalComponent, + TestComponent, + ], + providers: [ + { provide: NgbActiveModal, useValue: modalStub }, + { provide: SearchService, useValue: searchServiceStub }, + { provide: SelectableListService, useValue: jasmine.createSpyObj('selectableListService', ['deselect', 'select', 'deselectAll']) }, + ProjectEntryImportModalComponent + ], + schemas: [NO_ERRORS_SCHEMA] + }).compileComponents().then(); + })); + + // First test to check the correct component creation + describe('', () => { + let testComp: TestComponent; + let testFixture: ComponentFixture; + + // synchronous beforeEach + beforeEach(() => { + searchServiceStub.search.and.returnValue(observableOf(paginatedListRD)); + const html = ` + `; + testFixture = createTestComponent(html, TestComponent) as ComponentFixture; + testComp = testFixture.componentInstance; + }); + + afterEach(() => { + testFixture.destroy(); + }); + + it('should create ProjectEntryImportModalComponent', inject([ProjectEntryImportModalComponent], (app: ProjectEntryImportModalComponent) => { + expect(app).toBeDefined(); + })); + }); + + describe('Main tests', () => { + beforeEach(() => { + fixture = TestBed.createComponent(ProjectEntryImportModalComponent); + comp = fixture.componentInstance; + compAsAny = comp; + + }); + + describe('close', () => { + it('should close the modal', () => { + comp.close(); + expect(modalStub.close).toHaveBeenCalled(); + }); + }); + + describe('search', () => { + it('should call SearchService.search', () => { + + (searchServiceStub as any).search.and.returnValue(observableOf(paginatedListRD)); + comp.pagination = pagination; + + comp.search(searchString); + expect(comp.searchService.search).toHaveBeenCalledWith(searchOptions); + }); + }); + + describe('bound', () => { + it('should call close, deselectAllLists and importedObject.emit', () => { + spyOn(comp, 'deselectAllLists'); + spyOn(comp, 'close'); + spyOn(comp.importedObject, 'emit'); + comp.selectedEntity = OpenaireMockDspaceObject; + comp.bound(); + + expect(comp.importedObject.emit).toHaveBeenCalled(); + expect(comp.deselectAllLists).toHaveBeenCalled(); + expect(comp.close).toHaveBeenCalled(); + }); + }); + + describe('selectEntity', () => { + const entity = Object.assign(new Item(), { uuid: uuid }); + beforeEach(() => { + comp.selectEntity(entity); + }); + + it('should set selected entity', () => { + expect(comp.selectedEntity).toBe(entity); + }); + + it('should set the import type to local entity', () => { + expect(comp.selectedImportType).toEqual(ImportType.LocalEntity); + }); + }); + + describe('deselectEntity', () => { + const entity = Object.assign(new Item(), { uuid: uuid }); + beforeEach(() => { + comp.selectedImportType = ImportType.LocalEntity; + comp.selectedEntity = entity; + comp.deselectEntity(); + }); + + it('should remove the selected entity', () => { + expect(comp.selectedEntity).toBeUndefined(); + }); + + it('should set the import type to none', () => { + expect(comp.selectedImportType).toEqual(ImportType.None); + }); + }); + + describe('deselectAllLists', () => { + it('should call SelectableListService.deselectAll', () => { + comp.deselectAllLists(); + expect(compAsAny.selectService.deselectAll).toHaveBeenCalledWith(comp.entityListId); + expect(compAsAny.selectService.deselectAll).toHaveBeenCalledWith(comp.authorityListId); + }); + }); + + afterEach(() => { + fixture.destroy(); + comp = null; + compAsAny = null; + }); + }); +}); + +// declare a test component +@Component({ + selector: 'ds-test-cmp', + template: `` +}) +class TestComponent { + eventData = eventData; +} diff --git a/src/app/openaire/broker/project-entry-import-modal/project-entry-import-modal.component.ts b/src/app/openaire/broker/project-entry-import-modal/project-entry-import-modal.component.ts new file mode 100644 index 0000000000..5d8cb20c6d --- /dev/null +++ b/src/app/openaire/broker/project-entry-import-modal/project-entry-import-modal.component.ts @@ -0,0 +1,274 @@ +import { Component, EventEmitter, Input, OnInit } from '@angular/core'; +import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap'; +import { Observable, of as observableOf, Subscription } from 'rxjs'; +import { RemoteData } from '../../../core/data/remote-data'; +import { PaginatedList } from '../../../core/data/paginated-list.model'; +import { SearchResult } from '../../../shared/search/models/search-result.model'; +import { PaginatedSearchOptions } from '../../../shared/search/models/paginated-search-options.model'; +import { CollectionElementLinkType } from '../../../shared/object-collection/collection-element-link.type'; +import { Context } from '../../../core/shared/context.model'; +import { SelectableListService } from '../../../shared/object-list/selectable-list/selectable-list.service'; +import { ListableObject } from '../../../shared/object-collection/shared/listable-object.model'; +import { PaginationComponentOptions } from '../../../shared/pagination/pagination-component-options.model'; +import { SearchService } from '../../../core/shared/search/search.service'; +import { DSpaceObject } from '../../../core/shared/dspace-object.model'; +import { OpenaireBrokerEventObject } from '../../../core/openaire/broker/models/openaire-broker-event.model'; +import { hasValue, isNotEmpty } from '../../../shared/empty.util'; +import { Item } from '../../../core/shared/item.model'; + +/** + * The possible types of import for the external entry + */ +export enum ImportType { + None = 'None', + LocalEntity = 'LocalEntity', + LocalAuthority = 'LocalAuthority', + NewEntity = 'NewEntity', + NewAuthority = 'NewAuthority' +} + +/** + * The data type passed from the parent page + */ +export interface OpenaireBrokerEventData { + /** + * The OpenAIRE Broker event + */ + event: OpenaireBrokerEventObject; + /** + * The OpenAIRE Broker event Id (uuid) + */ + id: string; + /** + * The publication title + */ + title: string; + /** + * Contains the boolean that indicates if a project is present + */ + hasProject: boolean; + /** + * The project title, if present + */ + projectTitle: string; + /** + * The project id (uuid), if present + */ + projectId: string; + /** + * The project handle, if present + */ + handle: string; + /** + * The reject/discard reason + */ + reason: string; + /** + * Contains the boolean that indicates if there is a running operation (REST call) + */ + isRunning: boolean; + /** + * The related publication DSpace item + */ + target?: Item; +} + +@Component({ + selector: 'ds-project-entry-import-modal', + styleUrls: ['./project-entry-import-modal.component.scss'], + templateUrl: './project-entry-import-modal.component.html' +}) +/** + * Component to display a modal window for linking a project to an OpenAIRE Broker event + * Shows information about the selected project and a selectable list. + */ +export class ProjectEntryImportModalComponent implements OnInit { + /** + * The external source entry + */ + @Input() externalSourceEntry: OpenaireBrokerEventData; + /** + * The number of results per page + */ + pageSize = 3; + /** + * The prefix for every i18n key within this modal + */ + labelPrefix = 'openaire.broker.event.modal.'; + /** + * The search configuration to retrieve project + */ + configuration = 'funding'; + /** + * The label to use for all messages (added to the end of relevant i18n keys) + */ + label: string; + /** + * The project title from the parent object + */ + projectTitle: string; + /** + * The search results + */ + localEntitiesRD$: Observable>>>; + /** + * Information about the data loading status + */ + isLoading$ = observableOf(true); + /** + * Search options to use for fetching projects + */ + searchOptions: PaginatedSearchOptions; + /** + * The context we're currently in (submission) + */ + context = Context.EntitySearchModalWithNameVariants; + /** + * List ID for selecting local entities + */ + entityListId = 'openaire-project-bound'; + /** + * List ID for selecting local authorities + */ + authorityListId = 'openaire-project-bound-authority'; + /** + * ImportType enum + */ + importType = ImportType; + /** + * The type of link to render in listable elements + */ + linkTypes = CollectionElementLinkType; + /** + * The type of import the user currently has selected + */ + selectedImportType = ImportType.None; + /** + * The selected local entity + */ + selectedEntity: ListableObject; + /** + * An project has been selected, send it to the parent component + */ + importedObject: EventEmitter = new EventEmitter(); + /** + * Pagination options + */ + pagination: PaginationComponentOptions; + /** + * Array to track all the component subscriptions. Useful to unsubscribe them with 'onDestroy'. + * @type {Array} + */ + protected subs: Subscription[] = []; + + /** + * Initialize the component variables. + * @param {NgbActiveModal} modal + * @param {SearchService} searchService + * @param {SelectableListService} selectService + */ + constructor(public modal: NgbActiveModal, + public searchService: SearchService, + private selectService: SelectableListService) { } + + /** + * Component intitialization. + */ + public ngOnInit(): void { + this.pagination = Object.assign(new PaginationComponentOptions(), { id: 'openaire-project-bound', pageSize: this.pageSize }); + this.projectTitle = (this.externalSourceEntry.projectTitle !== null) ? this.externalSourceEntry.projectTitle : this.externalSourceEntry.event.message.title; + this.searchOptions = Object.assign(new PaginatedSearchOptions( + { + configuration: this.configuration, + query: this.projectTitle, + pagination: this.pagination + } + )); + this.localEntitiesRD$ = this.searchService.search(this.searchOptions); + this.subs.push( + this.localEntitiesRD$.subscribe( + () => this.isLoading$ = observableOf(false) + ) + ); + } + + /** + * Close the modal. + */ + public close(): void { + this.deselectAllLists(); + this.modal.close(); + } + + /** + * Perform a project search by title. + */ + public search(searchTitle): void { + if (isNotEmpty(searchTitle)) { + const filterRegEx = /[:]/g; + this.isLoading$ = observableOf(true); + this.searchOptions = Object.assign(new PaginatedSearchOptions( + { + configuration: this.configuration, + query: (searchTitle) ? searchTitle.replace(filterRegEx, '') : searchTitle, + pagination: this.pagination + } + )); + this.localEntitiesRD$ = this.searchService.search(this.searchOptions); + this.subs.push( + this.localEntitiesRD$.subscribe( + () => this.isLoading$ = observableOf(false) + ) + ); + } + } + + /** + * Perform the bound of the project. + */ + public bound(): void { + if (this.selectedEntity !== undefined) { + this.importedObject.emit(this.selectedEntity); + } + this.selectedImportType = ImportType.None; + this.deselectAllLists(); + this.close(); + } + + /** + * Deselected a local entity + */ + public deselectEntity(): void { + this.selectedEntity = undefined; + if (this.selectedImportType === ImportType.LocalEntity) { + this.selectedImportType = ImportType.None; + } + } + + /** + * Selected a local entity + * @param entity + */ + public selectEntity(entity): void { + this.selectedEntity = entity; + this.selectedImportType = ImportType.LocalEntity; + } + + /** + * Deselect every element from both entity and authority lists + */ + public deselectAllLists(): void { + this.selectService.deselectAll(this.entityListId); + this.selectService.deselectAll(this.authorityListId); + } + + /** + * Unsubscribe from all subscriptions. + */ + ngOnDestroy(): void { + this.deselectAllLists(); + this.subs + .filter((sub) => hasValue(sub)) + .forEach((sub) => sub.unsubscribe()); + } +} diff --git a/src/app/openaire/broker/topics/openaire-broker-topics.actions.ts b/src/app/openaire/broker/topics/openaire-broker-topics.actions.ts new file mode 100644 index 0000000000..fd98c6acb8 --- /dev/null +++ b/src/app/openaire/broker/topics/openaire-broker-topics.actions.ts @@ -0,0 +1,99 @@ +import { Action } from '@ngrx/store'; +import { type } from '../../../shared/ngrx/type'; +import { OpenaireBrokerTopicObject } from '../../../core/openaire/broker/models/openaire-broker-topic.model'; + +/** + * For each action type in an action group, make a simple + * enum object for all of this group's action types. + * + * The 'type' utility function coerces strings into string + * literal types and runs a simple check to guarantee all + * action types in the application are unique. + */ +export const OpenaireBrokerTopicActionTypes = { + ADD_TOPICS: type('dspace/integration/openaire/broker/topic/ADD_TOPICS'), + RETRIEVE_ALL_TOPICS: type('dspace/integration/openaire/broker/topic/RETRIEVE_ALL_TOPICS'), + RETRIEVE_ALL_TOPICS_ERROR: type('dspace/integration/openaire/broker/topic/RETRIEVE_ALL_TOPICS_ERROR'), +}; + +/* tslint:disable:max-classes-per-file */ + +/** + * An ngrx action to retrieve all the OpenAIRE Broker topics. + */ +export class RetrieveAllTopicsAction implements Action { + type = OpenaireBrokerTopicActionTypes.RETRIEVE_ALL_TOPICS; + payload: { + elementsPerPage: number; + currentPage: number; + }; + + /** + * Create a new RetrieveAllTopicsAction. + * + * @param elementsPerPage + * the number of topics per page + * @param currentPage + * The page number to retrieve + */ + constructor(elementsPerPage: number, currentPage: number) { + this.payload = { + elementsPerPage, + currentPage + }; + } +} + +/** + * An ngrx action for retrieving 'all OpenAIRE Broker topics' error. + */ +export class RetrieveAllTopicsErrorAction implements Action { + type = OpenaireBrokerTopicActionTypes.RETRIEVE_ALL_TOPICS_ERROR; +} + +/** + * An ngrx action to load the OpenAIRE Broker topic objects. + * Called by the ??? effect. + */ +export class AddTopicsAction implements Action { + type = OpenaireBrokerTopicActionTypes.ADD_TOPICS; + payload: { + topics: OpenaireBrokerTopicObject[]; + totalPages: number; + currentPage: number; + totalElements: number; + }; + + /** + * Create a new AddTopicsAction. + * + * @param topics + * the list of topics + * @param totalPages + * the total available pages of topics + * @param currentPage + * the current page + * @param totalElements + * the total available OpenAIRE Broker topics + */ + constructor(topics: OpenaireBrokerTopicObject[], totalPages: number, currentPage: number, totalElements: number) { + this.payload = { + topics, + totalPages, + currentPage, + totalElements + }; + } + +} + +/* tslint:enable:max-classes-per-file */ + +/** + * Export a type alias of all actions in this action group + * so that reducers can easily compose action types. + */ +export type OpenaireBrokerTopicsActions + = AddTopicsAction + |RetrieveAllTopicsAction + |RetrieveAllTopicsErrorAction; diff --git a/src/app/openaire/broker/topics/openaire-broker-topics.component.html b/src/app/openaire/broker/topics/openaire-broker-topics.component.html new file mode 100644 index 0000000000..d8321bc932 --- /dev/null +++ b/src/app/openaire/broker/topics/openaire-broker-topics.component.html @@ -0,0 +1,57 @@ +
+
+
+

{{'openaire.broker.title'| translate}}

+

{{'openaire.broker.topics.description'| translate}}

+
+
+
+
+

{{'openaire.broker.topics'| translate}}

+ + + + + + + +
+ + + + + + + + + + + + + + + +
{{'openaire.broker.table.topic' | translate}}{{'openaire.broker.table.last-event' | translate}}{{'openaire.broker.table.actions' | translate}}
{{topicElement.name}}{{topicElement.lastEvent}} +
+ +
+
+
+
+
+
+
+
diff --git a/src/app/openaire/broker/topics/openaire-broker-topics.component.scss b/src/app/openaire/broker/topics/openaire-broker-topics.component.scss new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/app/openaire/broker/topics/openaire-broker-topics.component.spec.ts b/src/app/openaire/broker/topics/openaire-broker-topics.component.spec.ts new file mode 100644 index 0000000000..00ea772ff9 --- /dev/null +++ b/src/app/openaire/broker/topics/openaire-broker-topics.component.spec.ts @@ -0,0 +1,152 @@ +import { CommonModule } from '@angular/common'; +import { Component, NO_ERRORS_SCHEMA } from '@angular/core'; +import { ActivatedRoute } from '@angular/router'; +import { TranslateModule } from '@ngx-translate/core'; +import { of as observableOf } from 'rxjs'; +import { ComponentFixture, inject, TestBed, waitForAsync } from '@angular/core/testing'; +import { createTestComponent } from '../../../shared/testing/utils.test'; +import { + getMockOpenaireStateService, + openaireBrokerTopicObjectMoreAbstract, + openaireBrokerTopicObjectMorePid +} from '../../../shared/mocks/openaire.mock'; +import { OpenaireBrokerTopicsComponent } from './openaire-broker-topics.component'; +import { OpenaireStateService } from '../../openaire-state.service'; +import { cold } from 'jasmine-marbles'; +import { PaginationServiceStub } from '../../../shared/testing/pagination-service.stub'; +import { PaginationService } from '../../../core/pagination/pagination.service'; + +describe('OpenaireBrokerTopicsComponent test suite', () => { + let fixture: ComponentFixture; + let comp: OpenaireBrokerTopicsComponent; + let compAsAny: any; + const mockOpenaireStateService = getMockOpenaireStateService(); + const activatedRouteParams = { + openaireBrokerTopicsParams: { + currentPage: 0, + pageSize: 5 + } + }; + const paginationService = new PaginationServiceStub(); + + beforeEach(waitForAsync(() => { + TestBed.configureTestingModule({ + imports: [ + CommonModule, + TranslateModule.forRoot(), + ], + declarations: [ + OpenaireBrokerTopicsComponent, + TestComponent, + ], + providers: [ + { provide: OpenaireStateService, useValue: mockOpenaireStateService }, + { provide: ActivatedRoute, useValue: { data: observableOf(activatedRouteParams), params: observableOf({}) } }, + { provide: PaginationService, useValue: paginationService }, + OpenaireBrokerTopicsComponent + ], + schemas: [NO_ERRORS_SCHEMA] + }).compileComponents().then(() => { + mockOpenaireStateService.getOpenaireBrokerTopics.and.returnValue(observableOf([ + openaireBrokerTopicObjectMorePid, + openaireBrokerTopicObjectMoreAbstract + ])); + mockOpenaireStateService.getOpenaireBrokerTopicsTotalPages.and.returnValue(observableOf(1)); + mockOpenaireStateService.getOpenaireBrokerTopicsCurrentPage.and.returnValue(observableOf(0)); + mockOpenaireStateService.getOpenaireBrokerTopicsTotals.and.returnValue(observableOf(2)); + mockOpenaireStateService.isOpenaireBrokerTopicsLoaded.and.returnValue(observableOf(true)); + mockOpenaireStateService.isOpenaireBrokerTopicsLoading.and.returnValue(observableOf(false)); + mockOpenaireStateService.isOpenaireBrokerTopicsProcessing.and.returnValue(observableOf(false)); + }); + })); + + // First test to check the correct component creation + describe('', () => { + let testComp: TestComponent; + let testFixture: ComponentFixture; + + // synchronous beforeEach + beforeEach(() => { + const html = ` + `; + testFixture = createTestComponent(html, TestComponent) as ComponentFixture; + testComp = testFixture.componentInstance; + }); + + afterEach(() => { + testFixture.destroy(); + }); + + it('should create OpenaireBrokerTopicsComponent', inject([OpenaireBrokerTopicsComponent], (app: OpenaireBrokerTopicsComponent) => { + expect(app).toBeDefined(); + })); + }); + + describe('Main tests running with two topics', () => { + beforeEach(() => { + fixture = TestBed.createComponent(OpenaireBrokerTopicsComponent); + comp = fixture.componentInstance; + compAsAny = comp; + + }); + + afterEach(() => { + fixture.destroy(); + comp = null; + compAsAny = null; + }); + + it(('Should init component properly'), () => { + comp.ngOnInit(); + fixture.detectChanges(); + + expect(comp.topics$).toBeObservable(cold('(a|)', { + a: [ + openaireBrokerTopicObjectMorePid, + openaireBrokerTopicObjectMoreAbstract + ] + })); + expect(comp.totalElements$).toBeObservable(cold('(a|)', { + a: 2 + })); + }); + + it(('Should set data properly after the view init'), () => { + spyOn(compAsAny, 'getOpenaireBrokerTopics'); + + comp.ngAfterViewInit(); + fixture.detectChanges(); + + expect(compAsAny.getOpenaireBrokerTopics).toHaveBeenCalled(); + }); + + it(('isTopicsLoading should return FALSE'), () => { + expect(comp.isTopicsLoading()).toBeObservable(cold('(a|)', { + a: false + })); + }); + + it(('isTopicsProcessing should return FALSE'), () => { + expect(comp.isTopicsProcessing()).toBeObservable(cold('(a|)', { + a: false + })); + }); + + it(('getOpenaireBrokerTopics should call the service to dispatch a STATE change'), () => { + comp.ngOnInit(); + fixture.detectChanges(); + + compAsAny.openaireStateService.dispatchRetrieveOpenaireBrokerTopics(comp.paginationConfig.pageSize, comp.paginationConfig.currentPage).and.callThrough(); + expect(compAsAny.openaireStateService.dispatchRetrieveOpenaireBrokerTopics).toHaveBeenCalledWith(comp.paginationConfig.pageSize, comp.paginationConfig.currentPage); + }); + }); +}); + +// declare a test component +@Component({ + selector: 'ds-test-cmp', + template: `` +}) +class TestComponent { + +} diff --git a/src/app/openaire/broker/topics/openaire-broker-topics.component.ts b/src/app/openaire/broker/topics/openaire-broker-topics.component.ts new file mode 100644 index 0000000000..408e21d946 --- /dev/null +++ b/src/app/openaire/broker/topics/openaire-broker-topics.component.ts @@ -0,0 +1,142 @@ +import { Component, OnInit } from '@angular/core'; + +import { Observable, Subscription } from 'rxjs'; +import { distinctUntilChanged, take } from 'rxjs/operators'; + +import { SortOptions } from '../../../core/cache/models/sort-options.model'; +import { OpenaireBrokerTopicObject } from '../../../core/openaire/broker/models/openaire-broker-topic.model'; +import { hasValue } from '../../../shared/empty.util'; +import { PaginationComponentOptions } from '../../../shared/pagination/pagination-component-options.model'; +import { OpenaireStateService } from '../../openaire-state.service'; +import { AdminNotificationsOpenaireTopicsPageParams } from '../../../admin/admin-notifications/admin-notifications-openaire-topics-page/admin-notifications-openaire-topics-page-resolver.service'; +import { PaginationService } from '../../../core/pagination/pagination.service'; + +/** + * Component to display the OpenAIRE Broker topic list. + */ +@Component({ + selector: 'ds-openaire-broker-topic', + templateUrl: './openaire-broker-topics.component.html', + styleUrls: ['./openaire-broker-topics.component.scss'], +}) +export class OpenaireBrokerTopicsComponent implements OnInit { + /** + * The pagination system configuration for HTML listing. + * @type {PaginationComponentOptions} + */ + public paginationConfig: PaginationComponentOptions = Object.assign(new PaginationComponentOptions(), { + id: 'btp', + pageSize: 10, + pageSizeOptions: [5, 10, 20, 40, 60] + }); + /** + * The OpenAIRE Broker topic list sort options. + * @type {SortOptions} + */ + public paginationSortConfig: SortOptions; + /** + * The OpenAIRE Broker topic list. + */ + public topics$: Observable; + /** + * The total number of OpenAIRE Broker topics. + */ + public totalElements$: Observable; + /** + * Array to track all the component subscriptions. Useful to unsubscribe them with 'onDestroy'. + * @type {Array} + */ + protected subs: Subscription[] = []; + + /** + * Initialize the component variables. + * @param {PaginationService} paginationService + * @param {OpenaireStateService} openaireStateService + */ + constructor( + private paginationService: PaginationService, + private openaireStateService: OpenaireStateService, + ) { } + + /** + * Component initialization. + */ + ngOnInit(): void { + this.topics$ = this.openaireStateService.getOpenaireBrokerTopics(); + this.totalElements$ = this.openaireStateService.getOpenaireBrokerTopicsTotals(); + } + + /** + * First OpenAIRE Broker topics loading after view initialization. + */ + ngAfterViewInit(): void { + this.subs.push( + this.openaireStateService.isOpenaireBrokerTopicsLoaded().pipe( + take(1) + ).subscribe(() => { + this.getOpenaireBrokerTopics(); + }) + ); + } + + /** + * Returns the information about the loading status of the OpenAIRE Broker topics (if it's running or not). + * + * @return Observable + * 'true' if the topics are loading, 'false' otherwise. + */ + public isTopicsLoading(): Observable { + return this.openaireStateService.isOpenaireBrokerTopicsLoading(); + } + + /** + * Returns the information about the processing status of the OpenAIRE Broker topics (if it's running or not). + * + * @return Observable + * 'true' if there are operations running on the topics (ex.: a REST call), 'false' otherwise. + */ + public isTopicsProcessing(): Observable { + return this.openaireStateService.isOpenaireBrokerTopicsProcessing(); + } + + /** + * Dispatch the OpenAIRE Broker topics retrival. + */ + public getOpenaireBrokerTopics(): void { + this.paginationService.getCurrentPagination(this.paginationConfig.id, this.paginationConfig).pipe( + distinctUntilChanged(), + ).subscribe((options: PaginationComponentOptions) => { + this.openaireStateService.dispatchRetrieveOpenaireBrokerTopics( + options.pageSize, + options.currentPage + ); + }); + } + + /** + * Update pagination Config from route params + * + * @param eventsRouteParams + */ + protected updatePaginationFromRouteParams(eventsRouteParams: AdminNotificationsOpenaireTopicsPageParams) { + if (eventsRouteParams.currentPage) { + this.paginationConfig.currentPage = eventsRouteParams.currentPage; + } + if (eventsRouteParams.pageSize) { + if (this.paginationConfig.pageSizeOptions.includes(eventsRouteParams.pageSize)) { + this.paginationConfig.pageSize = eventsRouteParams.pageSize; + } else { + this.paginationConfig.pageSize = this.paginationConfig.pageSizeOptions[0]; + } + } + } + + /** + * Unsubscribe from all subscriptions. + */ + ngOnDestroy(): void { + this.subs + .filter((sub) => hasValue(sub)) + .forEach((sub) => sub.unsubscribe()); + } +} diff --git a/src/app/openaire/broker/topics/openaire-broker-topics.effects.ts b/src/app/openaire/broker/topics/openaire-broker-topics.effects.ts new file mode 100644 index 0000000000..b590b122f5 --- /dev/null +++ b/src/app/openaire/broker/topics/openaire-broker-topics.effects.ts @@ -0,0 +1,87 @@ +import { Injectable } from '@angular/core'; +import { Store } from '@ngrx/store'; +import { Actions, Effect, ofType } from '@ngrx/effects'; +import { TranslateService } from '@ngx-translate/core'; +import { catchError, map, switchMap, tap, withLatestFrom } from 'rxjs/operators'; +import { of as observableOf } from 'rxjs'; +import { + AddTopicsAction, + OpenaireBrokerTopicActionTypes, + RetrieveAllTopicsAction, + RetrieveAllTopicsErrorAction, +} from './openaire-broker-topics.actions'; + +import { OpenaireBrokerTopicObject } from '../../../core/openaire/broker/models/openaire-broker-topic.model'; +import { PaginatedList } from '../../../core/data/paginated-list.model'; +import { OpenaireBrokerTopicsService } from './openaire-broker-topics.service'; +import { NotificationsService } from '../../../shared/notifications/notifications.service'; +import { OpenaireBrokerTopicRestService } from '../../../core/openaire/broker/topics/openaire-broker-topic-rest.service'; + +/** + * Provides effect methods for the OpenAIRE Broker topics actions. + */ +@Injectable() +export class OpenaireBrokerTopicsEffects { + + /** + * Retrieve all OpenAIRE Broker topics managing pagination and errors. + */ + @Effect() retrieveAllTopics$ = this.actions$.pipe( + ofType(OpenaireBrokerTopicActionTypes.RETRIEVE_ALL_TOPICS), + withLatestFrom(this.store$), + switchMap(([action, currentState]: [RetrieveAllTopicsAction, any]) => { + return this.openaireBrokerTopicService.getTopics( + action.payload.elementsPerPage, + action.payload.currentPage + ).pipe( + map((topics: PaginatedList) => + new AddTopicsAction(topics.page, topics.totalPages, topics.currentPage, topics.totalElements) + ), + catchError((error: Error) => { + if (error) { + console.error(error.message); + } + return observableOf(new RetrieveAllTopicsErrorAction()); + }) + ); + }) + ); + + /** + * Show a notification on error. + */ + @Effect({ dispatch: false }) retrieveAllTopicsErrorAction$ = this.actions$.pipe( + ofType(OpenaireBrokerTopicActionTypes.RETRIEVE_ALL_TOPICS_ERROR), + tap(() => { + this.notificationsService.error(null, this.translate.get('openaire.broker.topic.error.service.retrieve')); + }) + ); + + /** + * Clear find all topics requests from cache. + */ + @Effect({ dispatch: false }) addTopicsAction$ = this.actions$.pipe( + ofType(OpenaireBrokerTopicActionTypes.ADD_TOPICS), + tap(() => { + this.openaireBrokerTopicDataService.clearFindAllTopicsRequests(); + }) + ); + + /** + * Initialize the effect class variables. + * @param {Actions} actions$ + * @param {Store} store$ + * @param {TranslateService} translate + * @param {NotificationsService} notificationsService + * @param {OpenaireBrokerTopicsService} openaireBrokerTopicService + * @param {OpenaireBrokerTopicRestService} openaireBrokerTopicDataService + */ + constructor( + private actions$: Actions, + private store$: Store, + private translate: TranslateService, + private notificationsService: NotificationsService, + private openaireBrokerTopicService: OpenaireBrokerTopicsService, + private openaireBrokerTopicDataService: OpenaireBrokerTopicRestService + ) { } +} diff --git a/src/app/openaire/broker/topics/openaire-broker-topics.reducer.spec.ts b/src/app/openaire/broker/topics/openaire-broker-topics.reducer.spec.ts new file mode 100644 index 0000000000..b4ee60558b --- /dev/null +++ b/src/app/openaire/broker/topics/openaire-broker-topics.reducer.spec.ts @@ -0,0 +1,68 @@ +import { + AddTopicsAction, + RetrieveAllTopicsAction, + RetrieveAllTopicsErrorAction +} from './openaire-broker-topics.actions'; +import { openaireBrokerTopicsReducer, OpenaireBrokerTopicState } from './openaire-broker-topics.reducer'; +import { + openaireBrokerTopicObjectMoreAbstract, + openaireBrokerTopicObjectMorePid +} from '../../../shared/mocks/openaire.mock'; + +describe('openaireBrokerTopicsReducer test suite', () => { + let openaireBrokerTopicInitialState: OpenaireBrokerTopicState; + const elementPerPage = 3; + const currentPage = 0; + + beforeEach(() => { + openaireBrokerTopicInitialState = { + topics: [], + processing: false, + loaded: false, + totalPages: 0, + currentPage: 0, + totalElements: 0 + }; + }); + + it('Action RETRIEVE_ALL_TOPICS should set the State property "processing" to TRUE', () => { + const expectedState = openaireBrokerTopicInitialState; + expectedState.processing = true; + + const action = new RetrieveAllTopicsAction(elementPerPage, currentPage); + const newState = openaireBrokerTopicsReducer(openaireBrokerTopicInitialState, action); + + expect(newState).toEqual(expectedState); + }); + + it('Action RETRIEVE_ALL_TOPICS_ERROR should change the State to initial State but processing, loaded, and currentPage', () => { + const expectedState = openaireBrokerTopicInitialState; + expectedState.processing = false; + expectedState.loaded = true; + expectedState.currentPage = 0; + + const action = new RetrieveAllTopicsErrorAction(); + const newState = openaireBrokerTopicsReducer(openaireBrokerTopicInitialState, action); + + expect(newState).toEqual(expectedState); + }); + + it('Action ADD_TOPICS should populate the State with OpenAIRE Broker topics', () => { + const expectedState = { + topics: [ openaireBrokerTopicObjectMorePid, openaireBrokerTopicObjectMoreAbstract ], + processing: false, + loaded: true, + totalPages: 1, + currentPage: 0, + totalElements: 2 + }; + + const action = new AddTopicsAction( + [ openaireBrokerTopicObjectMorePid, openaireBrokerTopicObjectMoreAbstract ], + 1, 0, 2 + ); + const newState = openaireBrokerTopicsReducer(openaireBrokerTopicInitialState, action); + + expect(newState).toEqual(expectedState); + }); +}); diff --git a/src/app/openaire/broker/topics/openaire-broker-topics.reducer.ts b/src/app/openaire/broker/topics/openaire-broker-topics.reducer.ts new file mode 100644 index 0000000000..6ae596117f --- /dev/null +++ b/src/app/openaire/broker/topics/openaire-broker-topics.reducer.ts @@ -0,0 +1,72 @@ +import { OpenaireBrokerTopicObject } from '../../../core/openaire/broker/models/openaire-broker-topic.model'; +import { OpenaireBrokerTopicActionTypes, OpenaireBrokerTopicsActions } from './openaire-broker-topics.actions'; + +/** + * The interface representing the OpenAIRE Broker topic state. + */ +export interface OpenaireBrokerTopicState { + topics: OpenaireBrokerTopicObject[]; + processing: boolean; + loaded: boolean; + totalPages: number; + currentPage: number; + totalElements: number; +} + +/** + * Used for the OpenAIRE Broker topic state initialization. + */ +const openaireBrokerTopicInitialState: OpenaireBrokerTopicState = { + topics: [], + processing: false, + loaded: false, + totalPages: 0, + currentPage: 0, + totalElements: 0 +}; + +/** + * The OpenAIRE Broker Topic Reducer + * + * @param state + * the current state initialized with openaireBrokerTopicInitialState + * @param action + * the action to perform on the state + * @return OpenaireBrokerTopicState + * the new state + */ +export function openaireBrokerTopicsReducer(state = openaireBrokerTopicInitialState, action: OpenaireBrokerTopicsActions): OpenaireBrokerTopicState { + switch (action.type) { + case OpenaireBrokerTopicActionTypes.RETRIEVE_ALL_TOPICS: { + return Object.assign({}, state, { + topics: [], + processing: true + }); + } + + case OpenaireBrokerTopicActionTypes.ADD_TOPICS: { + return Object.assign({}, state, { + topics: action.payload.topics, + processing: false, + loaded: true, + totalPages: action.payload.totalPages, + currentPage: state.currentPage, + totalElements: action.payload.totalElements + }); + } + + case OpenaireBrokerTopicActionTypes.RETRIEVE_ALL_TOPICS_ERROR: { + return Object.assign({}, state, { + processing: false, + loaded: true, + totalPages: 0, + currentPage: 0, + totalElements: 0 + }); + } + + default: { + return state; + } + } +} diff --git a/src/app/openaire/broker/topics/openaire-broker-topics.service.spec.ts b/src/app/openaire/broker/topics/openaire-broker-topics.service.spec.ts new file mode 100644 index 0000000000..3daed2c3bf --- /dev/null +++ b/src/app/openaire/broker/topics/openaire-broker-topics.service.spec.ts @@ -0,0 +1,67 @@ +import { TestBed } from '@angular/core/testing'; +import { of as observableOf } from 'rxjs'; +import { OpenaireBrokerTopicsService } from './openaire-broker-topics.service'; +import { SortDirection, SortOptions } from '../../../core/cache/models/sort-options.model'; +import { OpenaireBrokerTopicRestService } from '../../../core/openaire/broker/topics/openaire-broker-topic-rest.service'; +import { PageInfo } from '../../../core/shared/page-info.model'; +import { FindListOptions } from '../../../core/data/request.models'; +import { + getMockOpenaireBrokerTopicRestService, + openaireBrokerTopicObjectMoreAbstract, + openaireBrokerTopicObjectMorePid +} from '../../../shared/mocks/openaire.mock'; +import { createSuccessfulRemoteDataObject } from '../../../shared/remote-data.utils'; +import { cold } from 'jasmine-marbles'; +import { buildPaginatedList } from '../../../core/data/paginated-list.model'; + +describe('OpenaireBrokerTopicsService', () => { + let service: OpenaireBrokerTopicsService; + let restService: OpenaireBrokerTopicRestService; + let serviceAsAny: any; + let restServiceAsAny: any; + + const pageInfo = new PageInfo(); + const array = [ openaireBrokerTopicObjectMorePid, openaireBrokerTopicObjectMoreAbstract ]; + const paginatedList = buildPaginatedList(pageInfo, array); + const paginatedListRD = createSuccessfulRemoteDataObject(paginatedList); + const elementsPerPage = 3; + const currentPage = 0; + + beforeEach(async () => { + TestBed.configureTestingModule({ + providers: [ + { provide: OpenaireBrokerTopicRestService, useClass: getMockOpenaireBrokerTopicRestService }, + { provide: OpenaireBrokerTopicsService, useValue: service } + ] + }).compileComponents(); + }); + + beforeEach(() => { + restService = TestBed.get(OpenaireBrokerTopicRestService); + restServiceAsAny = restService; + restServiceAsAny.getTopics.and.returnValue(observableOf(paginatedListRD)); + service = new OpenaireBrokerTopicsService(restService); + serviceAsAny = service; + }); + + describe('getTopics', () => { + it('Should proxy the call to openaireBrokerTopicRestService.getTopics', () => { + const sortOptions = new SortOptions('name', SortDirection.ASC); + const findListOptions: FindListOptions = { + elementsPerPage: elementsPerPage, + currentPage: currentPage, + sort: sortOptions + }; + const result = service.getTopics(elementsPerPage, currentPage); + expect((service as any).openaireBrokerTopicRestService.getTopics).toHaveBeenCalledWith(findListOptions); + }); + + it('Should return a paginated list of OpenAIRE Broker topics', () => { + const expected = cold('(a|)', { + a: paginatedList + }); + const result = service.getTopics(elementsPerPage, currentPage); + expect(result).toBeObservable(expected); + }); + }); +}); diff --git a/src/app/openaire/broker/topics/openaire-broker-topics.service.ts b/src/app/openaire/broker/topics/openaire-broker-topics.service.ts new file mode 100644 index 0000000000..17f189922f --- /dev/null +++ b/src/app/openaire/broker/topics/openaire-broker-topics.service.ts @@ -0,0 +1,55 @@ +import { Injectable } from '@angular/core'; +import { Observable } from 'rxjs'; +import { find, map } from 'rxjs/operators'; +import { OpenaireBrokerTopicRestService } from '../../../core/openaire/broker/topics/openaire-broker-topic-rest.service'; +import { SortDirection, SortOptions } from '../../../core/cache/models/sort-options.model'; +import { FindListOptions } from '../../../core/data/request.models'; +import { RemoteData } from '../../../core/data/remote-data'; +import { PaginatedList } from '../../../core/data/paginated-list.model'; +import { OpenaireBrokerTopicObject } from '../../../core/openaire/broker/models/openaire-broker-topic.model'; + +/** + * The service handling all OpenAIRE Broker topic requests to the REST service. + */ +@Injectable() +export class OpenaireBrokerTopicsService { + + /** + * Initialize the service variables. + * @param {OpenaireBrokerTopicRestService} openaireBrokerTopicRestService + */ + constructor( + private openaireBrokerTopicRestService: OpenaireBrokerTopicRestService + ) { } + + /** + * Return the list of OpenAIRE Broker topics managing pagination and errors. + * + * @param elementsPerPage + * The number of the topics per page + * @param currentPage + * The page number to retrieve + * @return Observable> + * The list of OpenAIRE Broker topics. + */ + public getTopics(elementsPerPage, currentPage): Observable> { + const sortOptions = new SortOptions('name', SortDirection.ASC); + + const findListOptions: FindListOptions = { + elementsPerPage: elementsPerPage, + currentPage: currentPage, + sort: sortOptions + }; + + return this.openaireBrokerTopicRestService.getTopics(findListOptions).pipe( + find((rd: RemoteData>) => !rd.isResponsePending), + map((rd: RemoteData>) => { + if (rd.hasSucceeded) { + return rd.payload; + } else { + throw new Error('Can\'t retrieve OpenAIRE Broker topics from the Broker topics REST service'); + } + }) + ); + } +} diff --git a/src/app/openaire/openaire-state.service.spec.ts b/src/app/openaire/openaire-state.service.spec.ts new file mode 100644 index 0000000000..874d4b4e1a --- /dev/null +++ b/src/app/openaire/openaire-state.service.spec.ts @@ -0,0 +1,275 @@ +import { TestBed } from '@angular/core/testing'; +import { Store, StoreModule } from '@ngrx/store'; +import { provideMockStore } from '@ngrx/store/testing'; +import { cold } from 'jasmine-marbles'; +import { openaireReducers } from './openaire.reducer'; +import { OpenaireStateService } from './openaire-state.service'; +import { + openaireBrokerTopicObjectMissingPid, + openaireBrokerTopicObjectMoreAbstract, + openaireBrokerTopicObjectMorePid +} from '../shared/mocks/openaire.mock'; +import { RetrieveAllTopicsAction } from './broker/topics/openaire-broker-topics.actions'; + +describe('OpenaireStateService', () => { + let service: OpenaireStateService; + let serviceAsAny: any; + let store: any; + let initialState: any; + + function init(mode: string) { + if (mode === 'empty') { + initialState = { + openaire: { + brokerTopic: { + topics: [], + processing: false, + loaded: false, + totalPages: 0, + currentPage: 0, + totalElements: 0, + totalLoadedPages: 0 + } + } + }; + } else { + initialState = { + openaire: { + brokerTopic: { + topics: [ + openaireBrokerTopicObjectMorePid, + openaireBrokerTopicObjectMoreAbstract, + openaireBrokerTopicObjectMissingPid + ], + processing: false, + loaded: true, + totalPages: 1, + currentPage: 1, + totalElements: 3, + totalLoadedPages: 1 + } + } + }; + } + } + + describe('Testing methods with empty topic objects', () => { + beforeEach(async () => { + init('empty'); + TestBed.configureTestingModule({ + imports: [ + StoreModule.forRoot({ openaire: openaireReducers } as any), + ], + providers: [ + provideMockStore({ initialState }), + { provide: OpenaireStateService, useValue: service } + ] + }).compileComponents(); + }); + + beforeEach(() => { + store = TestBed.get(Store); + service = new OpenaireStateService(store); + serviceAsAny = service; + spyOn(store, 'dispatch'); + }); + + describe('getOpenaireBrokerTopics', () => { + it('Should return an empty array', () => { + const result = service.getOpenaireBrokerTopics(); + const expected = cold('(a)', { + a: [] + }); + expect(result).toBeObservable(expected); + }); + }); + + describe('getOpenaireBrokerTopicsTotalPages', () => { + it('Should return zero (0)', () => { + const result = service.getOpenaireBrokerTopicsTotalPages(); + const expected = cold('(a)', { + a: 0 + }); + expect(result).toBeObservable(expected); + }); + }); + + describe('getOpenaireBrokerTopicsCurrentPage', () => { + it('Should return minus one (0)', () => { + const result = service.getOpenaireBrokerTopicsCurrentPage(); + const expected = cold('(a)', { + a: 0 + }); + expect(result).toBeObservable(expected); + }); + }); + + describe('getOpenaireBrokerTopicsTotals', () => { + it('Should return zero (0)', () => { + const result = service.getOpenaireBrokerTopicsTotals(); + const expected = cold('(a)', { + a: 0 + }); + expect(result).toBeObservable(expected); + }); + }); + + describe('isOpenaireBrokerTopicsLoading', () => { + it('Should return TRUE', () => { + const result = service.isOpenaireBrokerTopicsLoading(); + const expected = cold('(a)', { + a: true + }); + expect(result).toBeObservable(expected); + }); + }); + + describe('isOpenaireBrokerTopicsLoaded', () => { + it('Should return FALSE', () => { + const result = service.isOpenaireBrokerTopicsLoaded(); + const expected = cold('(a)', { + a: false + }); + expect(result).toBeObservable(expected); + }); + }); + + describe('isOpenaireBrokerTopicsProcessing', () => { + it('Should return FALSE', () => { + const result = service.isOpenaireBrokerTopicsProcessing(); + const expected = cold('(a)', { + a: false + }); + expect(result).toBeObservable(expected); + }); + }); + }); + + describe('Testing methods with topic objects', () => { + beforeEach(async () => { + init('full'); + TestBed.configureTestingModule({ + imports: [ + StoreModule.forRoot({ openaire: openaireReducers } as any), + ], + providers: [ + provideMockStore({ initialState }), + { provide: OpenaireStateService, useValue: service } + ] + }).compileComponents(); + }); + + beforeEach(() => { + store = TestBed.get(Store); + service = new OpenaireStateService(store); + serviceAsAny = service; + spyOn(store, 'dispatch'); + }); + + describe('getOpenaireBrokerTopics', () => { + it('Should return an array of topics', () => { + const result = service.getOpenaireBrokerTopics(); + const expected = cold('(a)', { + a: [ + openaireBrokerTopicObjectMorePid, + openaireBrokerTopicObjectMoreAbstract, + openaireBrokerTopicObjectMissingPid + ] + }); + expect(result).toBeObservable(expected); + }); + }); + + describe('getOpenaireBrokerTopicsTotalPages', () => { + it('Should return one (1)', () => { + const result = service.getOpenaireBrokerTopicsTotalPages(); + const expected = cold('(a)', { + a: 1 + }); + expect(result).toBeObservable(expected); + }); + }); + + describe('getOpenaireBrokerTopicsCurrentPage', () => { + it('Should return minus zero (1)', () => { + const result = service.getOpenaireBrokerTopicsCurrentPage(); + const expected = cold('(a)', { + a: 1 + }); + expect(result).toBeObservable(expected); + }); + }); + + describe('getOpenaireBrokerTopicsTotals', () => { + it('Should return three (3)', () => { + const result = service.getOpenaireBrokerTopicsTotals(); + const expected = cold('(a)', { + a: 3 + }); + expect(result).toBeObservable(expected); + }); + }); + + describe('isOpenaireBrokerTopicsLoading', () => { + it('Should return FALSE', () => { + const result = service.isOpenaireBrokerTopicsLoading(); + const expected = cold('(a)', { + a: false + }); + expect(result).toBeObservable(expected); + }); + }); + + describe('isOpenaireBrokerTopicsLoaded', () => { + it('Should return TRUE', () => { + const result = service.isOpenaireBrokerTopicsLoaded(); + const expected = cold('(a)', { + a: true + }); + expect(result).toBeObservable(expected); + }); + }); + + describe('isOpenaireBrokerTopicsProcessing', () => { + it('Should return FALSE', () => { + const result = service.isOpenaireBrokerTopicsProcessing(); + const expected = cold('(a)', { + a: false + }); + expect(result).toBeObservable(expected); + }); + }); + }); + + describe('Testing the topic dispatch methods', () => { + beforeEach(async () => { + init('full'); + TestBed.configureTestingModule({ + imports: [ + StoreModule.forRoot({ openaire: openaireReducers } as any), + ], + providers: [ + provideMockStore({ initialState }), + { provide: OpenaireStateService, useValue: service } + ] + }).compileComponents(); + }); + + beforeEach(() => { + store = TestBed.get(Store); + service = new OpenaireStateService(store); + serviceAsAny = service; + spyOn(store, 'dispatch'); + }); + + describe('dispatchRetrieveOpenaireBrokerTopics', () => { + it('Should call store.dispatch', () => { + const elementsPerPage = 3; + const currentPage = 1; + const action = new RetrieveAllTopicsAction(elementsPerPage, currentPage); + service.dispatchRetrieveOpenaireBrokerTopics(elementsPerPage, currentPage); + expect(serviceAsAny.store.dispatch).toHaveBeenCalledWith(action); + }); + }); + }); +}); diff --git a/src/app/openaire/openaire-state.service.ts b/src/app/openaire/openaire-state.service.ts new file mode 100644 index 0000000000..10dd739ae5 --- /dev/null +++ b/src/app/openaire/openaire-state.service.ts @@ -0,0 +1,116 @@ +import { Injectable } from '@angular/core'; +import { select, Store } from '@ngrx/store'; +import { Observable } from 'rxjs'; +import { map } from 'rxjs/operators'; +import { + getOpenaireBrokerTopicsCurrentPageSelector, + getOpenaireBrokerTopicsTotalPagesSelector, + getOpenaireBrokerTopicsTotalsSelector, + isOpenaireBrokerTopicsLoadedSelector, + openaireBrokerTopicsObjectSelector, + sOpenaireBrokerTopicsProcessingSelector +} from './selectors'; +import { OpenaireBrokerTopicObject } from '../core/openaire/broker/models/openaire-broker-topic.model'; +import { OpenaireState } from './openaire.reducer'; +import { RetrieveAllTopicsAction } from './broker/topics/openaire-broker-topics.actions'; + +/** + * The service handling the OpenAIRE State. + */ +@Injectable() +export class OpenaireStateService { + + /** + * Initialize the service variables. + * @param {Store} store + */ + constructor(private store: Store) { } + + // OpenAIRE Broker topics + // -------------------------------------------------------------------------- + + /** + * Returns the list of OpenAIRE Broker topics from the state. + * + * @return Observable + * The list of OpenAIRE Broker topics. + */ + public getOpenaireBrokerTopics(): Observable { + return this.store.pipe(select(openaireBrokerTopicsObjectSelector())); + } + + /** + * Returns the information about the loading status of the OpenAIRE Broker topics (if it's running or not). + * + * @return Observable + * 'true' if the topics are loading, 'false' otherwise. + */ + public isOpenaireBrokerTopicsLoading(): Observable { + return this.store.pipe( + select(isOpenaireBrokerTopicsLoadedSelector), + map((loaded: boolean) => !loaded) + ); + } + + /** + * Returns the information about the loading status of the OpenAIRE Broker topics (whether or not they were loaded). + * + * @return Observable + * 'true' if the topics are loaded, 'false' otherwise. + */ + public isOpenaireBrokerTopicsLoaded(): Observable { + return this.store.pipe(select(isOpenaireBrokerTopicsLoadedSelector)); + } + + /** + * Returns the information about the processing status of the OpenAIRE Broker topics (if it's running or not). + * + * @return Observable + * 'true' if there are operations running on the topics (ex.: a REST call), 'false' otherwise. + */ + public isOpenaireBrokerTopicsProcessing(): Observable { + return this.store.pipe(select(sOpenaireBrokerTopicsProcessingSelector)); + } + + /** + * Returns, from the state, the total available pages of the OpenAIRE Broker topics. + * + * @return Observable + * The number of the OpenAIRE Broker topics pages. + */ + public getOpenaireBrokerTopicsTotalPages(): Observable { + return this.store.pipe(select(getOpenaireBrokerTopicsTotalPagesSelector)); + } + + /** + * Returns the current page of the OpenAIRE Broker topics, from the state. + * + * @return Observable + * The number of the current OpenAIRE Broker topics page. + */ + public getOpenaireBrokerTopicsCurrentPage(): Observable { + return this.store.pipe(select(getOpenaireBrokerTopicsCurrentPageSelector)); + } + + /** + * Returns the total number of the OpenAIRE Broker topics. + * + * @return Observable + * The number of the OpenAIRE Broker topics. + */ + public getOpenaireBrokerTopicsTotals(): Observable { + return this.store.pipe(select(getOpenaireBrokerTopicsTotalsSelector)); + } + + /** + * Dispatch a request to change the OpenAIRE Broker topics state, retrieving the topics from the server. + * + * @param elementsPerPage + * The number of the topics per page. + * @param currentPage + * The number of the current page. + */ + public dispatchRetrieveOpenaireBrokerTopics(elementsPerPage: number, currentPage: number): void { + this.store.dispatch(new RetrieveAllTopicsAction(elementsPerPage, currentPage)); + } +} diff --git a/src/app/openaire/openaire.effects.ts b/src/app/openaire/openaire.effects.ts new file mode 100644 index 0000000000..9861c1a921 --- /dev/null +++ b/src/app/openaire/openaire.effects.ts @@ -0,0 +1,5 @@ +import { OpenaireBrokerTopicsEffects } from './broker/topics/openaire-broker-topics.effects'; + +export const openaireEffects = [ + OpenaireBrokerTopicsEffects +]; diff --git a/src/app/openaire/openaire.module.ts b/src/app/openaire/openaire.module.ts new file mode 100644 index 0000000000..ac5d4e7287 --- /dev/null +++ b/src/app/openaire/openaire.module.ts @@ -0,0 +1,74 @@ +import { NgModule } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { Action, StoreConfig, StoreModule } from '@ngrx/store'; +import { EffectsModule } from '@ngrx/effects'; + +import { CoreModule } from '../core/core.module'; +import { SharedModule } from '../shared/shared.module'; +import { storeModuleConfig } from '../app.reducer'; +import { OpenaireBrokerTopicsComponent } from './broker/topics/openaire-broker-topics.component'; +import { OpenaireBrokerEventsComponent } from './broker/events/openaire-broker-events.component'; +import { OpenaireStateService } from './openaire-state.service'; +import { openaireReducers, OpenaireState } from './openaire.reducer'; +import { openaireEffects } from './openaire.effects'; +import { OpenaireBrokerTopicsService } from './broker/topics/openaire-broker-topics.service'; +import { OpenaireBrokerTopicRestService } from '../core/openaire/broker/topics/openaire-broker-topic-rest.service'; +import { OpenaireBrokerEventRestService } from '../core/openaire/broker/events/openaire-broker-event-rest.service'; +import { ProjectEntryImportModalComponent } from './broker/project-entry-import-modal/project-entry-import-modal.component'; +import { TranslateModule } from '@ngx-translate/core'; +import { SearchModule } from '../shared/search/search.module'; + +const MODULES = [ + CommonModule, + SharedModule, + CoreModule.forRoot(), + StoreModule.forFeature('openaire', openaireReducers, storeModuleConfig as StoreConfig), + EffectsModule.forFeature(openaireEffects), + TranslateModule +]; + +const COMPONENTS = [ + OpenaireBrokerTopicsComponent, + OpenaireBrokerEventsComponent +]; + +const DIRECTIVES = [ ]; + +const ENTRY_COMPONENTS = [ + ProjectEntryImportModalComponent +]; + +const PROVIDERS = [ + OpenaireStateService, + OpenaireBrokerTopicsService, + OpenaireBrokerTopicRestService, + OpenaireBrokerEventRestService +]; + +@NgModule({ + imports: [ + ...MODULES, + SearchModule + ], + declarations: [ + ...COMPONENTS, + ...DIRECTIVES, + ...ENTRY_COMPONENTS + ], + providers: [ + ...PROVIDERS + ], + entryComponents: [ + ...ENTRY_COMPONENTS + ], + exports: [ + ...COMPONENTS, + ...DIRECTIVES + ] +}) + +/** + * This module handles all components that are necessary for the OpenAIRE components + */ +export class OpenaireModule { +} diff --git a/src/app/openaire/openaire.reducer.ts b/src/app/openaire/openaire.reducer.ts new file mode 100644 index 0000000000..9ead098329 --- /dev/null +++ b/src/app/openaire/openaire.reducer.ts @@ -0,0 +1,16 @@ +import { ActionReducerMap, createFeatureSelector } from '@ngrx/store'; + +import { openaireBrokerTopicsReducer, OpenaireBrokerTopicState, } from './broker/topics/openaire-broker-topics.reducer'; + +/** + * The OpenAIRE State + */ +export interface OpenaireState { + 'brokerTopic': OpenaireBrokerTopicState; +} + +export const openaireReducers: ActionReducerMap = { + brokerTopic: openaireBrokerTopicsReducer, +}; + +export const openaireSelector = createFeatureSelector('openaire'); diff --git a/src/app/openaire/selectors.ts b/src/app/openaire/selectors.ts new file mode 100644 index 0000000000..fc3508eef4 --- /dev/null +++ b/src/app/openaire/selectors.ts @@ -0,0 +1,79 @@ +import { createSelector, MemoizedSelector } from '@ngrx/store'; +import { subStateSelector } from '../shared/selector.util'; +import { openaireSelector, OpenaireState } from './openaire.reducer'; +import { OpenaireBrokerTopicObject } from '../core/openaire/broker/models/openaire-broker-topic.model'; +import { OpenaireBrokerTopicState } from './broker/topics/openaire-broker-topics.reducer'; + +/** + * Returns the OpenAIRE state. + * @function _getOpenaireState + * @param {AppState} state Top level state. + * @return {OpenaireState} + */ +const _getOpenaireState = (state: any) => state.openaire; + +// OpenAIRE Broker topics +// ---------------------------------------------------------------------------- + +/** + * Returns the OpenAIRE Broker topics State. + * @function openaireBrokerTopicsStateSelector + * @return {OpenaireBrokerTopicState} + */ +export function openaireBrokerTopicsStateSelector(): MemoizedSelector { + return subStateSelector(openaireSelector, 'brokerTopic'); +} + +/** + * Returns the OpenAIRE Broker topics list. + * @function openaireBrokerTopicsObjectSelector + * @return {OpenaireBrokerTopicObject[]} + */ +export function openaireBrokerTopicsObjectSelector(): MemoizedSelector { + return subStateSelector(openaireBrokerTopicsStateSelector(), 'topics'); +} + +/** + * Returns true if the OpenAIRE Broker topics are loaded. + * @function isOpenaireBrokerTopicsLoadedSelector + * @return {boolean} + */ +export const isOpenaireBrokerTopicsLoadedSelector = createSelector(_getOpenaireState, + (state: OpenaireState) => state.brokerTopic.loaded +); + +/** + * Returns true if the deduplication sets are processing. + * @function isDeduplicationSetsProcessingSelector + * @return {boolean} + */ +export const sOpenaireBrokerTopicsProcessingSelector = createSelector(_getOpenaireState, + (state: OpenaireState) => state.brokerTopic.processing +); + +/** + * Returns the total available pages of OpenAIRE Broker topics. + * @function getOpenaireBrokerTopicsTotalPagesSelector + * @return {number} + */ +export const getOpenaireBrokerTopicsTotalPagesSelector = createSelector(_getOpenaireState, + (state: OpenaireState) => state.brokerTopic.totalPages +); + +/** + * Returns the current page of OpenAIRE Broker topics. + * @function getOpenaireBrokerTopicsCurrentPageSelector + * @return {number} + */ +export const getOpenaireBrokerTopicsCurrentPageSelector = createSelector(_getOpenaireState, + (state: OpenaireState) => state.brokerTopic.currentPage +); + +/** + * Returns the total number of OpenAIRE Broker topics. + * @function getOpenaireBrokerTopicsTotalsSelector + * @return {number} + */ +export const getOpenaireBrokerTopicsTotalsSelector = createSelector(_getOpenaireState, + (state: OpenaireState) => state.brokerTopic.totalElements +); diff --git a/src/app/shared/mocks/openaire.mock.ts b/src/app/shared/mocks/openaire.mock.ts new file mode 100644 index 0000000000..908aae1f67 --- /dev/null +++ b/src/app/shared/mocks/openaire.mock.ts @@ -0,0 +1,1796 @@ +import { of as observableOf } from 'rxjs'; +import { ResourceType } from '../../core/shared/resource-type'; +import { OpenaireBrokerTopicObject } from '../../core/openaire/broker/models/openaire-broker-topic.model'; +import { OpenaireBrokerEventObject } from '../../core/openaire/broker/models/openaire-broker-event.model'; +import { OpenaireBrokerTopicRestService } from '../../core/openaire/broker/topics/openaire-broker-topic-rest.service'; +import { OpenaireBrokerEventRestService } from '../../core/openaire/broker/events/openaire-broker-event-rest.service'; +import { DSpaceObject } from '../../core/shared/dspace-object.model'; +import { OpenaireStateService } from '../../openaire/openaire-state.service'; +import { Item } from '../../core/shared/item.model'; +import { + createNoContentRemoteDataObject$, + createSuccessfulRemoteDataObject, + createSuccessfulRemoteDataObject$ +} from '../remote-data.utils'; +import { SearchResult } from '../search/models/search-result.model'; + +// REST Mock --------------------------------------------------------------------- +// ------------------------------------------------------------------------------- + +// Items +// ------------------------------------------------------------------------------- + +const ItemMockPid1: Item = Object.assign( + new Item(), + { + handle: '10077/21486', + lastModified: '2017-04-24T19:44:08.178+0000', + isArchived: true, + isDiscoverable: true, + isWithdrawn: false, + _links:{ + self: { + href: 'https://rest.api/rest/api/core/items/0ec7ff22-f211-40ab-a69e-c819b0b1f357' + } + }, + id: 'ITEM4567-e89b-12d3-a456-426614174001', + uuid: 'ITEM4567-e89b-12d3-a456-426614174001', + type: 'item', + metadata: { + 'dc.creator': [ + { + language: 'en_US', + value: 'Doe, Jane' + } + ], + 'dc.date.accessioned': [ + { + language: null, + value: '1650-06-26T19:58:25Z' + } + ], + 'dc.date.available': [ + { + language: null, + value: '1650-06-26T19:58:25Z' + } + ], + 'dc.date.issued': [ + { + language: null, + value: '1650-06-26' + } + ], + 'dc.identifier.issn': [ + { + language: 'en_US', + value: '123456789' + } + ], + 'dc.identifier.uri': [ + { + language: null, + value: 'http://dspace7.4science.it/xmlui/handle/10673/6' + } + ], + 'dc.description.abstract': [ + { + language: 'en_US', + value: 'This is really just a sample abstract. If it was a real abstract it would contain useful information about this test document. Sorry though, nothing useful in this paragraph. You probably shouldn\'t have even bothered to read it!' + } + ], + 'dc.description.provenance': [ + { + language: 'en', + value: 'Made available in DSpace on 2012-06-26T19:58:25Z (GMT). No. of bitstreams: 2\r\ntest_ppt.ppt: 12707328 bytes, checksum: a353fc7d29b3c558c986f7463a41efd3 (MD5)\r\ntest_ppt.pptx: 12468572 bytes, checksum: 599305edb4ebee329667f2c35b14d1d6 (MD5)' + }, + { + language: 'en', + value: 'Restored into DSpace on 2013-06-13T09:17:34Z (GMT).' + }, + { + language: 'en', + value: 'Restored into DSpace on 2013-06-13T11:04:16Z (GMT).' + }, + { + language: 'en', + value: 'Restored into DSpace on 2017-04-24T19:44:08Z (GMT).' + } + ], + 'dc.language': [ + { + language: 'en_US', + value: 'en' + } + ], + 'dc.rights': [ + { + language: 'en_US', + value: '© Jane Doe' + } + ], + 'dc.subject': [ + { + language: 'en_US', + value: 'keyword1' + }, + { + language: 'en_US', + value: 'keyword2' + }, + { + language: 'en_US', + value: 'keyword3' + } + ], + 'dc.title': [ + { + language: 'en_US', + value: 'Index nominum et rerum' + } + ], + 'dc.type': [ + { + language: 'en_US', + value: 'text' + } + ] + } + } +); + +const ItemMockPid2: Item = Object.assign( + new Item(), + { + handle: '10077/21486', + lastModified: '2017-04-24T19:44:08.178+0000', + isArchived: true, + isDiscoverable: true, + isWithdrawn: false, + _links:{ + self: { + href: 'https://rest.api/rest/api/core/items/0ec7ff22-f211-40ab-a69e-c819b0b1f357' + } + }, + id: 'ITEM4567-e89b-12d3-a456-426614174004', + uuid: 'ITEM4567-e89b-12d3-a456-426614174004', + type: 'item', + metadata: { + 'dc.creator': [ + { + language: 'en_US', + value: 'Doe, Jane' + } + ], + 'dc.date.accessioned': [ + { + language: null, + value: '1650-06-26T19:58:25Z' + } + ], + 'dc.date.available': [ + { + language: null, + value: '1650-06-26T19:58:25Z' + } + ], + 'dc.date.issued': [ + { + language: null, + value: '1650-06-26' + } + ], + 'dc.identifier.issn': [ + { + language: 'en_US', + value: '123456789' + } + ], + 'dc.identifier.uri': [ + { + language: null, + value: 'http://dspace7.4science.it/xmlui/handle/10673/6' + } + ], + 'dc.description.abstract': [ + { + language: 'en_US', + value: 'This is really just a sample abstract. If it was a real abstract it would contain useful information about this test document. Sorry though, nothing useful in this paragraph. You probably shouldn\'t have even bothered to read it!' + } + ], + 'dc.description.provenance': [ + { + language: 'en', + value: 'Made available in DSpace on 2012-06-26T19:58:25Z (GMT). No. of bitstreams: 2\r\ntest_ppt.ppt: 12707328 bytes, checksum: a353fc7d29b3c558c986f7463a41efd3 (MD5)\r\ntest_ppt.pptx: 12468572 bytes, checksum: 599305edb4ebee329667f2c35b14d1d6 (MD5)' + }, + { + language: 'en', + value: 'Restored into DSpace on 2013-06-13T09:17:34Z (GMT).' + }, + { + language: 'en', + value: 'Restored into DSpace on 2013-06-13T11:04:16Z (GMT).' + }, + { + language: 'en', + value: 'Restored into DSpace on 2017-04-24T19:44:08Z (GMT).' + } + ], + 'dc.language': [ + { + language: 'en_US', + value: 'en' + } + ], + 'dc.rights': [ + { + language: 'en_US', + value: '© Jane Doe' + } + ], + 'dc.subject': [ + { + language: 'en_US', + value: 'keyword1' + }, + { + language: 'en_US', + value: 'keyword2' + }, + { + language: 'en_US', + value: 'keyword3' + } + ], + 'dc.title': [ + { + language: 'en_US', + value: 'UNA NUOVA RILETTURA DELL\u0027 ARISTOTELE DI FRANZ BRENTANO ALLA LUCE DI ALCUNI INEDITI' + } + ], + 'dc.type': [ + { + language: 'en_US', + value: 'text' + } + ] + } + } +); + +const ItemMockPid3: Item = Object.assign( + new Item(), + { + handle: '10077/21486', + lastModified: '2017-04-24T19:44:08.178+0000', + isArchived: true, + isDiscoverable: true, + isWithdrawn: false, + _links:{ + self: { + href: 'https://rest.api/rest/api/core/items/0ec7ff22-f211-40ab-a69e-c819b0b1f357' + } + }, + id: 'ITEM4567-e89b-12d3-a456-426614174005', + uuid: 'ITEM4567-e89b-12d3-a456-426614174005', + type: 'item', + metadata: { + 'dc.creator': [ + { + language: 'en_US', + value: 'Doe, Jane' + } + ], + 'dc.date.accessioned': [ + { + language: null, + value: '1650-06-26T19:58:25Z' + } + ], + 'dc.date.available': [ + { + language: null, + value: '1650-06-26T19:58:25Z' + } + ], + 'dc.date.issued': [ + { + language: null, + value: '1650-06-26' + } + ], + 'dc.identifier.issn': [ + { + language: 'en_US', + value: '123456789' + } + ], + 'dc.identifier.uri': [ + { + language: null, + value: 'http://dspace7.4science.it/xmlui/handle/10673/6' + } + ], + 'dc.description.abstract': [ + { + language: 'en_US', + value: 'This is really just a sample abstract. If it was a real abstract it would contain useful information about this test document. Sorry though, nothing useful in this paragraph. You probably shouldn\'t have even bothered to read it!' + } + ], + 'dc.description.provenance': [ + { + language: 'en', + value: 'Made available in DSpace on 2012-06-26T19:58:25Z (GMT). No. of bitstreams: 2\r\ntest_ppt.ppt: 12707328 bytes, checksum: a353fc7d29b3c558c986f7463a41efd3 (MD5)\r\ntest_ppt.pptx: 12468572 bytes, checksum: 599305edb4ebee329667f2c35b14d1d6 (MD5)' + }, + { + language: 'en', + value: 'Restored into DSpace on 2013-06-13T09:17:34Z (GMT).' + }, + { + language: 'en', + value: 'Restored into DSpace on 2013-06-13T11:04:16Z (GMT).' + }, + { + language: 'en', + value: 'Restored into DSpace on 2017-04-24T19:44:08Z (GMT).' + } + ], + 'dc.language': [ + { + language: 'en_US', + value: 'en' + } + ], + 'dc.rights': [ + { + language: 'en_US', + value: '© Jane Doe' + } + ], + 'dc.subject': [ + { + language: 'en_US', + value: 'keyword1' + }, + { + language: 'en_US', + value: 'keyword2' + }, + { + language: 'en_US', + value: 'keyword3' + } + ], + 'dc.title': [ + { + language: 'en_US', + value: 'Sustainable development' + } + ], + 'dc.type': [ + { + language: 'en_US', + value: 'text' + } + ] + } + } +); + +const ItemMockPid4: Item = Object.assign( + new Item(), + { + handle: '10077/21486', + lastModified: '2017-04-24T19:44:08.178+0000', + isArchived: true, + isDiscoverable: true, + isWithdrawn: false, + _links:{ + self: { + href: 'https://rest.api/rest/api/core/items/0ec7ff22-f211-40ab-a69e-c819b0b1f357' + } + }, + id: 'ITEM4567-e89b-12d3-a456-426614174006', + uuid: 'ITEM4567-e89b-12d3-a456-426614174006', + type: 'item', + metadata: { + 'dc.creator': [ + { + language: 'en_US', + value: 'Doe, Jane' + } + ], + 'dc.date.accessioned': [ + { + language: null, + value: '1650-06-26T19:58:25Z' + } + ], + 'dc.date.available': [ + { + language: null, + value: '1650-06-26T19:58:25Z' + } + ], + 'dc.date.issued': [ + { + language: null, + value: '1650-06-26' + } + ], + 'dc.identifier.issn': [ + { + language: 'en_US', + value: '123456789' + } + ], + 'dc.identifier.uri': [ + { + language: null, + value: 'http://dspace7.4science.it/xmlui/handle/10673/6' + } + ], + 'dc.description.abstract': [ + { + language: 'en_US', + value: 'This is really just a sample abstract. If it was a real abstract it would contain useful information about this test document. Sorry though, nothing useful in this paragraph. You probably shouldn\'t have even bothered to read it!' + } + ], + 'dc.description.provenance': [ + { + language: 'en', + value: 'Made available in DSpace on 2012-06-26T19:58:25Z (GMT). No. of bitstreams: 2\r\ntest_ppt.ppt: 12707328 bytes, checksum: a353fc7d29b3c558c986f7463a41efd3 (MD5)\r\ntest_ppt.pptx: 12468572 bytes, checksum: 599305edb4ebee329667f2c35b14d1d6 (MD5)' + }, + { + language: 'en', + value: 'Restored into DSpace on 2013-06-13T09:17:34Z (GMT).' + }, + { + language: 'en', + value: 'Restored into DSpace on 2013-06-13T11:04:16Z (GMT).' + }, + { + language: 'en', + value: 'Restored into DSpace on 2017-04-24T19:44:08Z (GMT).' + } + ], + 'dc.language': [ + { + language: 'en_US', + value: 'en' + } + ], + 'dc.rights': [ + { + language: 'en_US', + value: '© Jane Doe' + } + ], + 'dc.subject': [ + { + language: 'en_US', + value: 'keyword1' + }, + { + language: 'en_US', + value: 'keyword2' + }, + { + language: 'en_US', + value: 'keyword3' + } + ], + 'dc.title': [ + { + language: 'en_US', + value: 'Reply to Critics' + } + ], + 'dc.type': [ + { + language: 'en_US', + value: 'text' + } + ] + } + } +); + +const ItemMockPid5: Item = Object.assign( + new Item(), + { + handle: '10077/21486', + lastModified: '2017-04-24T19:44:08.178+0000', + isArchived: true, + isDiscoverable: true, + isWithdrawn: false, + _links:{ + self: { + href: 'https://rest.api/rest/api/core/items/0ec7ff22-f211-40ab-a69e-c819b0b1f357' + } + }, + id: 'ITEM4567-e89b-12d3-a456-426614174007', + uuid: 'ITEM4567-e89b-12d3-a456-426614174007', + type: 'item', + metadata: { + 'dc.creator': [ + { + language: 'en_US', + value: 'Doe, Jane' + } + ], + 'dc.date.accessioned': [ + { + language: null, + value: '1650-06-26T19:58:25Z' + } + ], + 'dc.date.available': [ + { + language: null, + value: '1650-06-26T19:58:25Z' + } + ], + 'dc.date.issued': [ + { + language: null, + value: '1650-06-26' + } + ], + 'dc.identifier.issn': [ + { + language: 'en_US', + value: '123456789' + } + ], + 'dc.identifier.uri': [ + { + language: null, + value: 'http://dspace7.4science.it/xmlui/handle/10673/6' + } + ], + 'dc.description.abstract': [ + { + language: 'en_US', + value: 'This is really just a sample abstract. If it was a real abstract it would contain useful information about this test document. Sorry though, nothing useful in this paragraph. You probably shouldn\'t have even bothered to read it!' + } + ], + 'dc.description.provenance': [ + { + language: 'en', + value: 'Made available in DSpace on 2012-06-26T19:58:25Z (GMT). No. of bitstreams: 2\r\ntest_ppt.ppt: 12707328 bytes, checksum: a353fc7d29b3c558c986f7463a41efd3 (MD5)\r\ntest_ppt.pptx: 12468572 bytes, checksum: 599305edb4ebee329667f2c35b14d1d6 (MD5)' + }, + { + language: 'en', + value: 'Restored into DSpace on 2013-06-13T09:17:34Z (GMT).' + }, + { + language: 'en', + value: 'Restored into DSpace on 2013-06-13T11:04:16Z (GMT).' + }, + { + language: 'en', + value: 'Restored into DSpace on 2017-04-24T19:44:08Z (GMT).' + } + ], + 'dc.language': [ + { + language: 'en_US', + value: 'en' + } + ], + 'dc.rights': [ + { + language: 'en_US', + value: '© Jane Doe' + } + ], + 'dc.subject': [ + { + language: 'en_US', + value: 'keyword1' + }, + { + language: 'en_US', + value: 'keyword2' + }, + { + language: 'en_US', + value: 'keyword3' + } + ], + 'dc.title': [ + { + language: 'en_US', + value: 'PROGETTAZIONE, SINTESI E VALUTAZIONE DELL\u0027ATTIVITA\u0027 ANTIMICOBATTERICA ED ANTIFUNGINA DI NUOVI DERIVATI ETEROCICLICI' + } + ], + 'dc.type': [ + { + language: 'en_US', + value: 'text' + } + ] + } + } +); + +const ItemMockPid6: Item = Object.assign( + new Item(), + { + handle: '10077/21486', + lastModified: '2017-04-24T19:44:08.178+0000', + isArchived: true, + isDiscoverable: true, + isWithdrawn: false, + _links:{ + self: { + href: 'https://rest.api/rest/api/core/items/0ec7ff22-f211-40ab-a69e-c819b0b1f357' + } + }, + id: 'ITEM4567-e89b-12d3-a456-426614174008', + uuid: 'ITEM4567-e89b-12d3-a456-426614174008', + type: 'item', + metadata: { + 'dc.creator': [ + { + language: 'en_US', + value: 'Doe, Jane' + } + ], + 'dc.date.accessioned': [ + { + language: null, + value: '1650-06-26T19:58:25Z' + } + ], + 'dc.date.available': [ + { + language: null, + value: '1650-06-26T19:58:25Z' + } + ], + 'dc.date.issued': [ + { + language: null, + value: '1650-06-26' + } + ], + 'dc.identifier.issn': [ + { + language: 'en_US', + value: '123456789' + } + ], + 'dc.identifier.uri': [ + { + language: null, + value: 'http://dspace7.4science.it/xmlui/handle/10673/6' + } + ], + 'dc.description.abstract': [ + { + language: 'en_US', + value: 'This is really just a sample abstract. If it was a real abstract it would contain useful information about this test document. Sorry though, nothing useful in this paragraph. You probably shouldn\'t have even bothered to read it!' + } + ], + 'dc.description.provenance': [ + { + language: 'en', + value: 'Made available in DSpace on 2012-06-26T19:58:25Z (GMT). No. of bitstreams: 2\r\ntest_ppt.ppt: 12707328 bytes, checksum: a353fc7d29b3c558c986f7463a41efd3 (MD5)\r\ntest_ppt.pptx: 12468572 bytes, checksum: 599305edb4ebee329667f2c35b14d1d6 (MD5)' + }, + { + language: 'en', + value: 'Restored into DSpace on 2013-06-13T09:17:34Z (GMT).' + }, + { + language: 'en', + value: 'Restored into DSpace on 2013-06-13T11:04:16Z (GMT).' + }, + { + language: 'en', + value: 'Restored into DSpace on 2017-04-24T19:44:08Z (GMT).' + } + ], + 'dc.language': [ + { + language: 'en_US', + value: 'en' + } + ], + 'dc.rights': [ + { + language: 'en_US', + value: '© Jane Doe' + } + ], + 'dc.subject': [ + { + language: 'en_US', + value: 'keyword1' + }, + { + language: 'en_US', + value: 'keyword2' + }, + { + language: 'en_US', + value: 'keyword3' + } + ], + 'dc.title': [ + { + language: 'en_US', + value: 'Donald Davidson' + } + ], + 'dc.type': [ + { + language: 'en_US', + value: 'text' + } + ] + } + } +); + +const ItemMockPid7: Item = Object.assign( + new Item(), + { + handle: '10077/21486', + lastModified: '2017-04-24T19:44:08.178+0000', + isArchived: true, + isDiscoverable: true, + isWithdrawn: false, + _links:{ + self: { + href: 'https://rest.api/rest/api/core/items/0ec7ff22-f211-40ab-a69e-c819b0b1f357' + } + }, + id: 'ITEM4567-e89b-12d3-a456-426614174009', + uuid: 'ITEM4567-e89b-12d3-a456-426614174009', + type: 'item', + metadata: { + 'dc.creator': [ + { + language: 'en_US', + value: 'Doe, Jane' + } + ], + 'dc.date.accessioned': [ + { + language: null, + value: '1650-06-26T19:58:25Z' + } + ], + 'dc.date.available': [ + { + language: null, + value: '1650-06-26T19:58:25Z' + } + ], + 'dc.date.issued': [ + { + language: null, + value: '1650-06-26' + } + ], + 'dc.identifier.issn': [ + { + language: 'en_US', + value: '123456789' + } + ], + 'dc.identifier.uri': [ + { + language: null, + value: 'http://dspace7.4science.it/xmlui/handle/10673/6' + } + ], + 'dc.description.abstract': [ + { + language: 'en_US', + value: 'This is really just a sample abstract. If it was a real abstract it would contain useful information about this test document. Sorry though, nothing useful in this paragraph. You probably shouldn\'t have even bothered to read it!' + } + ], + 'dc.description.provenance': [ + { + language: 'en', + value: 'Made available in DSpace on 2012-06-26T19:58:25Z (GMT). No. of bitstreams: 2\r\ntest_ppt.ppt: 12707328 bytes, checksum: a353fc7d29b3c558c986f7463a41efd3 (MD5)\r\ntest_ppt.pptx: 12468572 bytes, checksum: 599305edb4ebee329667f2c35b14d1d6 (MD5)' + }, + { + language: 'en', + value: 'Restored into DSpace on 2013-06-13T09:17:34Z (GMT).' + }, + { + language: 'en', + value: 'Restored into DSpace on 2013-06-13T11:04:16Z (GMT).' + }, + { + language: 'en', + value: 'Restored into DSpace on 2017-04-24T19:44:08Z (GMT).' + } + ], + 'dc.language': [ + { + language: 'en_US', + value: 'en' + } + ], + 'dc.rights': [ + { + language: 'en_US', + value: '© Jane Doe' + } + ], + 'dc.subject': [ + { + language: 'en_US', + value: 'keyword1' + }, + { + language: 'en_US', + value: 'keyword2' + }, + { + language: 'en_US', + value: 'keyword3' + } + ], + 'dc.title': [ + { + language: 'en_US', + value: 'Missing abstract article' + } + ], + 'dc.type': [ + { + language: 'en_US', + value: 'text' + } + ] + } + } +); + +export const ItemMockPid8: Item = Object.assign( + new Item(), + { + handle: '10077/21486', + lastModified: '2017-04-24T19:44:08.178+0000', + isArchived: true, + isDiscoverable: true, + isWithdrawn: false, + _links:{ + self: { + href: 'https://rest.api/rest/api/core/items/0ec7ff22-f211-40ab-a69e-c819b0b1f357' + } + }, + id: 'ITEM4567-e89b-12d3-a456-426614174002', + uuid: 'ITEM4567-e89b-12d3-a456-426614174002', + type: 'item', + metadata: { + 'dc.creator': [ + { + language: 'en_US', + value: 'Doe, Jane' + } + ], + 'dc.date.accessioned': [ + { + language: null, + value: '1650-06-26T19:58:25Z' + } + ], + 'dc.date.available': [ + { + language: null, + value: '1650-06-26T19:58:25Z' + } + ], + 'dc.date.issued': [ + { + language: null, + value: '1650-06-26' + } + ], + 'dc.identifier.issn': [ + { + language: 'en_US', + value: '123456789' + } + ], + 'dc.identifier.uri': [ + { + language: null, + value: 'http://dspace7.4science.it/xmlui/handle/10673/6' + } + ], + 'dc.description.abstract': [ + { + language: 'en_US', + value: 'This is really just a sample abstract. If it was a real abstract it would contain useful information about this test document. Sorry though, nothing useful in this paragraph. You probably shouldn\'t have even bothered to read it!' + } + ], + 'dc.description.provenance': [ + { + language: 'en', + value: 'Made available in DSpace on 2012-06-26T19:58:25Z (GMT). No. of bitstreams: 2\r\ntest_ppt.ppt: 12707328 bytes, checksum: a353fc7d29b3c558c986f7463a41efd3 (MD5)\r\ntest_ppt.pptx: 12468572 bytes, checksum: 599305edb4ebee329667f2c35b14d1d6 (MD5)' + }, + { + language: 'en', + value: 'Restored into DSpace on 2013-06-13T09:17:34Z (GMT).' + }, + { + language: 'en', + value: 'Restored into DSpace on 2013-06-13T11:04:16Z (GMT).' + }, + { + language: 'en', + value: 'Restored into DSpace on 2017-04-24T19:44:08Z (GMT).' + } + ], + 'dc.language': [ + { + language: 'en_US', + value: 'en' + } + ], + 'dc.rights': [ + { + language: 'en_US', + value: '© Jane Doe' + } + ], + 'dc.subject': [ + { + language: 'en_US', + value: 'keyword1' + }, + { + language: 'en_US', + value: 'keyword2' + }, + { + language: 'en_US', + value: 'keyword3' + } + ], + 'dc.title': [ + { + language: 'en_US', + value: 'Egypt, crossroad of translations and literary interweavings (3rd-6th centuries). A reconsideration of earlier Coptic literature' + } + ], + 'dc.type': [ + { + language: 'en_US', + value: 'text' + } + ] + } + } +); + +export const ItemMockPid9: Item = Object.assign( + new Item(), + { + handle: '10077/21486', + lastModified: '2017-04-24T19:44:08.178+0000', + isArchived: true, + isDiscoverable: true, + isWithdrawn: false, + _links:{ + self: { + href: 'https://rest.api/rest/api/core/items/0ec7ff22-f211-40ab-a69e-c819b0b1f357' + } + }, + id: 'ITEM4567-e89b-12d3-a456-426614174003', + uuid: 'ITEM4567-e89b-12d3-a456-426614174003', + type: 'item', + metadata: { + 'dc.creator': [ + { + language: 'en_US', + value: 'Doe, Jane' + } + ], + 'dc.date.accessioned': [ + { + language: null, + value: '1650-06-26T19:58:25Z' + } + ], + 'dc.date.available': [ + { + language: null, + value: '1650-06-26T19:58:25Z' + } + ], + 'dc.date.issued': [ + { + language: null, + value: '1650-06-26' + } + ], + 'dc.identifier.issn': [ + { + language: 'en_US', + value: '123456789' + } + ], + 'dc.identifier.uri': [ + { + language: null, + value: 'http://dspace7.4science.it/xmlui/handle/10673/6' + } + ], + 'dc.description.abstract': [ + { + language: 'en_US', + value: 'This is really just a sample abstract. If it was a real abstract it would contain useful information about this test document. Sorry though, nothing useful in this paragraph. You probably shouldn\'t have even bothered to read it!' + } + ], + 'dc.description.provenance': [ + { + language: 'en', + value: 'Made available in DSpace on 2012-06-26T19:58:25Z (GMT). No. of bitstreams: 2\r\ntest_ppt.ppt: 12707328 bytes, checksum: a353fc7d29b3c558c986f7463a41efd3 (MD5)\r\ntest_ppt.pptx: 12468572 bytes, checksum: 599305edb4ebee329667f2c35b14d1d6 (MD5)' + }, + { + language: 'en', + value: 'Restored into DSpace on 2013-06-13T09:17:34Z (GMT).' + }, + { + language: 'en', + value: 'Restored into DSpace on 2013-06-13T11:04:16Z (GMT).' + }, + { + language: 'en', + value: 'Restored into DSpace on 2017-04-24T19:44:08Z (GMT).' + } + ], + 'dc.language': [ + { + language: 'en_US', + value: 'en' + } + ], + 'dc.rights': [ + { + language: 'en_US', + value: '© Jane Doe' + } + ], + 'dc.subject': [ + { + language: 'en_US', + value: 'keyword1' + }, + { + language: 'en_US', + value: 'keyword2' + }, + { + language: 'en_US', + value: 'keyword3' + } + ], + 'dc.title': [ + { + language: 'en_US', + value: 'Morocco, crossroad of translations and literary interweavings (3rd-6th centuries). A reconsideration of earlier Coptic literature' + } + ], + 'dc.type': [ + { + language: 'en_US', + value: 'text' + } + ] + } + } +); + +export const ItemMockPid10: Item = Object.assign( + new Item(), + { + handle: '10713/29832', + lastModified: '2017-04-24T19:44:08.178+0000', + isArchived: true, + isDiscoverable: true, + isWithdrawn: false, + _links:{ + self: { + href: 'https://rest.api/rest/api/core/items/0ec7ff22-f211-40ab-a69e-c819b0b1f357' + } + }, + id: 'P23e4567-e89b-12d3-a456-426614174002', + uuid: 'P23e4567-e89b-12d3-a456-426614174002', + type: 'item', + metadata: { + 'dc.creator': [ + { + language: 'en_US', + value: 'Doe, Jane' + } + ], + 'dc.date.accessioned': [ + { + language: null, + value: '1650-06-26T19:58:25Z' + } + ], + 'dc.date.available': [ + { + language: null, + value: '1650-06-26T19:58:25Z' + } + ], + 'dc.date.issued': [ + { + language: null, + value: '1650-06-26' + } + ], + 'dc.identifier.issn': [ + { + language: 'en_US', + value: '123456789' + } + ], + 'dc.identifier.uri': [ + { + language: null, + value: 'http://dspace7.4science.it/xmlui/handle/10673/6' + } + ], + 'dc.description.abstract': [ + { + language: 'en_US', + value: 'This is really just a sample abstract. If it was a real abstract it would contain useful information about this test document. Sorry though, nothing useful in this paragraph. You probably shouldn\'t have even bothered to read it!' + } + ], + 'dc.description.provenance': [ + { + language: 'en', + value: 'Made available in DSpace on 2012-06-26T19:58:25Z (GMT). No. of bitstreams: 2\r\ntest_ppt.ppt: 12707328 bytes, checksum: a353fc7d29b3c558c986f7463a41efd3 (MD5)\r\ntest_ppt.pptx: 12468572 bytes, checksum: 599305edb4ebee329667f2c35b14d1d6 (MD5)' + }, + { + language: 'en', + value: 'Restored into DSpace on 2013-06-13T09:17:34Z (GMT).' + }, + { + language: 'en', + value: 'Restored into DSpace on 2013-06-13T11:04:16Z (GMT).' + }, + { + language: 'en', + value: 'Restored into DSpace on 2017-04-24T19:44:08Z (GMT).' + } + ], + 'dc.language': [ + { + language: 'en_US', + value: 'en' + } + ], + 'dc.rights': [ + { + language: 'en_US', + value: '© Jane Doe' + } + ], + 'dc.subject': [ + { + language: 'en_US', + value: 'keyword1' + }, + { + language: 'en_US', + value: 'keyword2' + }, + { + language: 'en_US', + value: 'keyword3' + } + ], + 'dc.title': [ + { + language: 'en_US', + value: 'Tracking Papyrus and Parchment Paths: An Archaeological Atlas of Coptic Literature.\nLiterary Texts in their Geographical Context: Production, Copying, Usage, Dissemination and Storage' + } + ], + 'dc.type': [ + { + language: 'en_US', + value: 'text' + } + ] + } + } +); + +export const OpenaireMockDspaceObject: SearchResult = Object.assign( + new SearchResult(), + { + handle: '10713/29832', + lastModified: '2017-04-24T19:44:08.178+0000', + isArchived: true, + isDiscoverable: true, + isWithdrawn: false, + _links:{ + self: { + href: 'https://rest.api/rest/api/core/items/0ec7ff22-f211-40ab-a69e-c819b0b1f357' + } + }, + id: 'P23e4567-e89b-12d3-a456-426614174002', + uuid: 'P23e4567-e89b-12d3-a456-426614174002', + type: 'item', + metadata: { + 'dc.creator': [ + { + language: 'en_US', + value: 'Doe, Jane' + } + ], + 'dc.date.accessioned': [ + { + language: null, + value: '1650-06-26T19:58:25Z' + } + ], + 'dc.date.available': [ + { + language: null, + value: '1650-06-26T19:58:25Z' + } + ], + 'dc.date.issued': [ + { + language: null, + value: '1650-06-26' + } + ], + 'dc.identifier.issn': [ + { + language: 'en_US', + value: '123456789' + } + ], + 'dc.identifier.uri': [ + { + language: null, + value: 'http://dspace7.4science.it/xmlui/handle/10673/6' + } + ], + 'dc.description.abstract': [ + { + language: 'en_US', + value: 'This is really just a sample abstract. If it was a real abstract it would contain useful information about this test document. Sorry though, nothing useful in this paragraph. You probably shouldn\'t have even bothered to read it!' + } + ], + 'dc.description.provenance': [ + { + language: 'en', + value: 'Made available in DSpace on 2012-06-26T19:58:25Z (GMT). No. of bitstreams: 2\r\ntest_ppt.ppt: 12707328 bytes, checksum: a353fc7d29b3c558c986f7463a41efd3 (MD5)\r\ntest_ppt.pptx: 12468572 bytes, checksum: 599305edb4ebee329667f2c35b14d1d6 (MD5)' + }, + { + language: 'en', + value: 'Restored into DSpace on 2013-06-13T09:17:34Z (GMT).' + }, + { + language: 'en', + value: 'Restored into DSpace on 2013-06-13T11:04:16Z (GMT).' + }, + { + language: 'en', + value: 'Restored into DSpace on 2017-04-24T19:44:08Z (GMT).' + } + ], + 'dc.language': [ + { + language: 'en_US', + value: 'en' + } + ], + 'dc.rights': [ + { + language: 'en_US', + value: '© Jane Doe' + } + ], + 'dc.subject': [ + { + language: 'en_US', + value: 'keyword1' + }, + { + language: 'en_US', + value: 'keyword2' + }, + { + language: 'en_US', + value: 'keyword3' + } + ], + 'dc.title': [ + { + language: 'en_US', + value: 'Tracking Papyrus and Parchment Paths: An Archaeological Atlas of Coptic Literature.\nLiterary Texts in their Geographical Context: Production, Copying, Usage, Dissemination and Storage' + } + ], + 'dc.type': [ + { + language: 'en_US', + value: 'text' + } + ] + } + } +); + +// Topics +// ------------------------------------------------------------------------------- + +export const openaireBrokerTopicObjectMorePid: OpenaireBrokerTopicObject = { + type: new ResourceType('nbtopic'), + id: 'ENRICH!MORE!PID', + name: 'ENRICH/MORE/PID', + lastEvent: '2020/10/09 10:11 UTC', + totalEvents: 33, + _links: { + self: { + href: 'https://rest.api/rest/api/integration/nbtopics/ENRICH!MORE!PID' + } + } +}; + +export const openaireBrokerTopicObjectMoreAbstract: OpenaireBrokerTopicObject = { + type: new ResourceType('nbtopic'), + id: 'ENRICH!MORE!ABSTRACT', + name: 'ENRICH/MORE/ABSTRACT', + lastEvent: '2020/09/08 21:14 UTC', + totalEvents: 5, + _links: { + self: { + href: 'https://rest.api/rest/api/integration/nbtopics/ENRICH!MORE!ABSTRACT' + } + } +}; + +export const openaireBrokerTopicObjectMissingPid: OpenaireBrokerTopicObject = { + type: new ResourceType('nbtopic'), + id: 'ENRICH!MISSING!PID', + name: 'ENRICH/MISSING/PID', + lastEvent: '2020/10/01 07:36 UTC', + totalEvents: 4, + _links: { + self: { + href: 'https://rest.api/rest/api/integration/nbtopics/ENRICH!MISSING!PID' + } + } +}; + +export const openaireBrokerTopicObjectMissingAbstract: OpenaireBrokerTopicObject = { + type: new ResourceType('nbtopic'), + id: 'ENRICH!MISSING!ABSTRACT', + name: 'ENRICH/MISSING/ABSTRACT', + lastEvent: '2020/10/08 16:14 UTC', + totalEvents: 71, + _links: { + self: { + href: 'https://rest.api/rest/api/integration/nbtopics/ENRICH!MISSING!ABSTRACT' + } + } +}; + +export const openaireBrokerTopicObjectMissingAcm: OpenaireBrokerTopicObject = { + type: new ResourceType('nbtopic'), + id: 'ENRICH!MISSING!SUBJECT!ACM', + name: 'ENRICH/MISSING/SUBJECT/ACM', + lastEvent: '2020/09/21 17:51 UTC', + totalEvents: 18, + _links: { + self: { + href: 'https://rest.api/rest/api/integration/nbtopics/ENRICH!MISSING!SUBJECT!ACM' + } + } +}; + +export const openaireBrokerTopicObjectMissingProject: OpenaireBrokerTopicObject = { + type: new ResourceType('nbtopic'), + id: 'ENRICH!MISSING!PROJECT', + name: 'ENRICH/MISSING/PROJECT', + lastEvent: '2020/09/17 10:28 UTC', + totalEvents: 6, + _links: { + self: { + href: 'https://rest.api/rest/api/integration/nbtopics/ENRICH!MISSING!PROJECT' + } + } +}; + +// Events +// ------------------------------------------------------------------------------- + +export const openaireBrokerEventObjectMissingPid: OpenaireBrokerEventObject = { + id: '123e4567-e89b-12d3-a456-426614174001', + uuid: '123e4567-e89b-12d3-a456-426614174001', + type: new ResourceType('nbevent'), + originalId: 'oai:www.openstarts.units.it:10077/21486', + title: 'Index nominum et rerum', + trust: 0.375, + eventDate: '2020/10/09 10:11 UTC', + status: 'PENDING', + message: { + type: 'doi', + value: '10.18848/1447-9494/cgp/v15i09/45934', + abstract: null, + openaireId: null, + acronym: null, + code: null, + funder: null, + fundingProgram: null, + jurisdiction: null, + title: null + }, + _links: { + self: { + href: 'https://rest.api/rest/api/integration/nbevents/123e4567-e89b-12d3-a456-426614174001', + }, + target: { + href: 'https://rest.api/rest/api/integration/nbevents/123e4567-e89b-12d3-a456-426614174001/target' + }, + related: { + href: 'https://rest.api/rest/api/integration/nbevents/123e4567-e89b-12d3-a456-426614174001/related' + } + }, + target: observableOf(createSuccessfulRemoteDataObject(ItemMockPid1)), + related: observableOf(createSuccessfulRemoteDataObject(ItemMockPid10)) +}; + +export const openaireBrokerEventObjectMissingPid2: OpenaireBrokerEventObject = { + id: '123e4567-e89b-12d3-a456-426614174004', + uuid: '123e4567-e89b-12d3-a456-426614174004', + type: new ResourceType('openaireBrokerEvent'), + originalId: 'oai:www.openstarts.units.it:10077/21486', + title: 'UNA NUOVA RILETTURA DELL\u0027 ARISTOTELE DI FRANZ BRENTANO ALLA LUCE DI ALCUNI INEDITI', + trust: 1.0, + eventDate: '2020/10/09 10:11 UTC', + status: 'PENDING', + message: { + type: 'urn', + value: 'http://thesis2.sba.units.it/store/handle/item/12238', + abstract: null, + openaireId: null, + acronym: null, + code: null, + funder: null, + fundingProgram: null, + jurisdiction: null, + title: null + }, + _links: { + self: { + href: 'https://rest.api/rest/api/integration/nbevents/123e4567-e89b-12d3-a456-426614174004' + }, + target: { + href: 'https://rest.api/rest/api/integration/nbevents/123e4567-e89b-12d3-a456-426614174004/target' + }, + related: { + href: 'https://rest.api/rest/api/integration/nbevents/123e4567-e89b-12d3-a456-426614174004/related' + } + }, + target: observableOf(createSuccessfulRemoteDataObject(ItemMockPid2)), + related: observableOf(createSuccessfulRemoteDataObject(ItemMockPid10)) +}; + +export const openaireBrokerEventObjectMissingPid3: OpenaireBrokerEventObject = { + id: '123e4567-e89b-12d3-a456-426614174005', + uuid: '123e4567-e89b-12d3-a456-426614174005', + type: new ResourceType('openaireBrokerEvent'), + originalId: 'oai:www.openstarts.units.it:10077/554', + title: 'Sustainable development', + trust: 0.375, + eventDate: '2020/10/09 10:11 UTC', + status: 'PENDING', + message: { + type: 'doi', + value: '10.4324/9780203408889', + abstract: null, + openaireId: null, + acronym: null, + code: null, + funder: null, + fundingProgram: null, + jurisdiction: null, + title: null + }, + _links: { + self: { + href: 'https://rest.api/rest/api/integration/nbevents/123e4567-e89b-12d3-a456-426614174005' + }, + target: { + href: 'https://rest.api/rest/api/integration/nbevents/123e4567-e89b-12d3-a456-426614174005/target' + }, + related: { + href: 'https://rest.api/rest/api/integration/nbevents/123e4567-e89b-12d3-a456-426614174005/related' + } + }, + target: observableOf(createSuccessfulRemoteDataObject(ItemMockPid3)), + related: observableOf(createSuccessfulRemoteDataObject(ItemMockPid10)) +}; + +export const openaireBrokerEventObjectMissingPid4: OpenaireBrokerEventObject = { + id: '123e4567-e89b-12d3-a456-426614174006', + uuid: '123e4567-e89b-12d3-a456-426614174006', + type: new ResourceType('openaireBrokerEvent'), + originalId: 'oai:www.openstarts.units.it:10077/10787', + title: 'Reply to Critics', + trust: 1.0, + eventDate: '2020/10/09 10:11 UTC', + status: 'PENDING', + message: { + type: 'doi', + value: '10.1080/13698230.2018.1430104', + abstract: null, + openaireId: null, + acronym: null, + code: null, + funder: null, + fundingProgram: null, + jurisdiction: null, + title: null + }, + _links: { + self: { + href: 'https://rest.api/rest/api/integration/nbevents/123e4567-e89b-12d3-a456-426614174006' + }, + target: { + href: 'https://rest.api/rest/api/integration/nbevents/123e4567-e89b-12d3-a456-426614174006/target' + }, + related: { + href: 'https://rest.api/rest/api/integration/nbevents/123e4567-e89b-12d3-a456-426614174006/related' + } + }, + target: observableOf(createSuccessfulRemoteDataObject(ItemMockPid4)), + related: observableOf(createSuccessfulRemoteDataObject(ItemMockPid10)) +}; + +export const openaireBrokerEventObjectMissingPid5: OpenaireBrokerEventObject = { + id: '123e4567-e89b-12d3-a456-426614174007', + uuid: '123e4567-e89b-12d3-a456-426614174007', + type: new ResourceType('openaireBrokerEvent'), + originalId: 'oai:www.openstarts.units.it:10077/11339', + title: 'PROGETTAZIONE, SINTESI E VALUTAZIONE DELL\u0027ATTIVITA\u0027 ANTIMICOBATTERICA ED ANTIFUNGINA DI NUOVI DERIVATI ETEROCICLICI', + trust: 0.375, + eventDate: '2020/10/09 10:11 UTC', + status: 'PENDING', + message: { + type: 'urn', + value: 'http://thesis2.sba.units.it/store/handle/item/12477', + abstract: null, + openaireId: null, + acronym: null, + code: null, + funder: null, + fundingProgram: null, + jurisdiction: null, + title: null + }, + _links: { + self: { + href: 'https://rest.api/rest/api/integration/nbevents/123e4567-e89b-12d3-a456-426614174007' + }, + target: { + href: 'https://rest.api/rest/api/integration/nbevents/123e4567-e89b-12d3-a456-426614174007/target' + }, + related: { + href: 'https://rest.api/rest/api/integration/nbevents/123e4567-e89b-12d3-a456-426614174007/related' + } + }, + target: observableOf(createSuccessfulRemoteDataObject(ItemMockPid5)), + related: observableOf(createSuccessfulRemoteDataObject(ItemMockPid10)) +}; + +export const openaireBrokerEventObjectMissingPid6: OpenaireBrokerEventObject = { + id: '123e4567-e89b-12d3-a456-426614174008', + uuid: '123e4567-e89b-12d3-a456-426614174008', + type: new ResourceType('openaireBrokerEvent'), + originalId: 'oai:www.openstarts.units.it:10077/29860', + title: 'Donald Davidson', + trust: 0.375, + eventDate: '2020/10/09 10:11 UTC', + status: 'PENDING', + message: { + type: 'doi', + value: '10.1111/j.1475-4975.2004.00098.x', + abstract: null, + openaireId: null, + acronym: null, + code: null, + funder: null, + fundingProgram: null, + jurisdiction: null, + title: null + }, + _links: { + self: { + href: 'https://rest.api/rest/api/integration/nbevents/123e4567-e89b-12d3-a456-426614174008' + }, + target: { + href: 'https://rest.api/rest/api/integration/nbevents/123e4567-e89b-12d3-a456-426614174008/target' + }, + related: { + href: 'https://rest.api/rest/api/integration/nbevents/123e4567-e89b-12d3-a456-426614174008/related' + } + }, + target: observableOf(createSuccessfulRemoteDataObject(ItemMockPid6)), + related: observableOf(createSuccessfulRemoteDataObject(ItemMockPid10)) +}; + +export const openaireBrokerEventObjectMissingAbstract: OpenaireBrokerEventObject = { + id: '123e4567-e89b-12d3-a456-426614174009', + uuid: '123e4567-e89b-12d3-a456-426614174009', + type: new ResourceType('openaireBrokerEvent'), + originalId: 'oai:www.openstarts.units.it:10077/21110', + title: 'Missing abstract article', + trust: 0.751, + eventDate: '2020/10/09 10:11 UTC', + status: 'PENDING', + message: { + type: null, + value: null, + abstract: 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla scelerisque vestibulum tellus sed lacinia. Aenean vitae sapien a quam congue ultrices. Sed vehicula sollicitudin ligula, vitae lacinia velit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla scelerisque vestibulum tellus sed lacinia. Aenean vitae sapien a quam congue ultrices. Sed vehicula sollicitudin ligula, vitae lacinia velit.', + openaireId: null, + acronym: null, + code: null, + funder: null, + fundingProgram: null, + jurisdiction: null, + title: null + }, + _links: { + self: { + href: 'https://rest.api/rest/api/integration/nbevents/123e4567-e89b-12d3-a456-426614174009' + }, + target: { + href: 'https://rest.api/rest/api/integration/nbevents/123e4567-e89b-12d3-a456-426614174009/target' + }, + related: { + href: 'https://rest.api/rest/api/integration/nbevents/123e4567-e89b-12d3-a456-426614174009/related' + } + }, + target: observableOf(createSuccessfulRemoteDataObject(ItemMockPid7)), + related: observableOf(createSuccessfulRemoteDataObject(ItemMockPid10)) +}; + +export const openaireBrokerEventObjectMissingProjectFound: OpenaireBrokerEventObject = { + id: '123e4567-e89b-12d3-a456-426614174002', + uuid: '123e4567-e89b-12d3-a456-426614174002', + type: new ResourceType('openaireBrokerEvent'), + originalId: 'oai:www.openstarts.units.it:10077/21838', + title: 'Egypt, crossroad of translations and literary interweavings (3rd-6th centuries). A reconsideration of earlier Coptic literature', + trust: 1.0, + eventDate: '2020/10/09 10:11 UTC', + status: 'PENDING', + message: { + type: null, + value: null, + abstract: null, + openaireId: null, + acronym: 'PAThs', + code: '687567', + funder: 'EC', + fundingProgram: 'H2020', + jurisdiction: 'EU', + title: 'Tracking Papyrus and Parchment Paths: An Archaeological Atlas of Coptic Literature.\nLiterary Texts in their Geographical Context: Production, Copying, Usage, Dissemination and Storage' + }, + _links: { + self: { + href: 'https://rest.api/rest/api/integration/nbevents/123e4567-e89b-12d3-a456-426614174002' + }, + target: { + href: 'https://rest.api/rest/api/integration/nbevents/123e4567-e89b-12d3-a456-426614174002/target' + }, + related: { + href: 'https://rest.api/rest/api/integration/nbevents/123e4567-e89b-12d3-a456-426614174002/related' + } + }, + target: createSuccessfulRemoteDataObject$(ItemMockPid8), + related: createSuccessfulRemoteDataObject$(ItemMockPid10) +}; + +export const openaireBrokerEventObjectMissingProjectNotFound: OpenaireBrokerEventObject = { + id: '123e4567-e89b-12d3-a456-426614174003', + uuid: '123e4567-e89b-12d3-a456-426614174003', + type: new ResourceType('openaireBrokerEvent'), + originalId: 'oai:www.openstarts.units.it:10077/21838', + title: 'Morocco, crossroad of translations and literary interweavings (3rd-6th centuries). A reconsideration of earlier Coptic literature', + trust: 1.0, + eventDate: '2020/10/09 10:11 UTC', + status: 'PENDING', + message: { + type: null, + value: null, + abstract: null, + openaireId: null, + acronym: 'PAThs', + code: '687567B', + funder: 'EC', + fundingProgram: 'H2021', + jurisdiction: 'EU', + title: 'Tracking Unknown Papyrus and Parchment Paths: An Archaeological Atlas of Coptic Literature.\nLiterary Texts in their Geographical Context: Production, Copying, Usage, Dissemination and Storage' + }, + _links: { + self: { + href: 'https://rest.api/rest/api/integration/nbevents/123e4567-e89b-12d3-a456-426614174003' + }, + target: { + href: 'https://rest.api/rest/api/integration/nbevents/123e4567-e89b-12d3-a456-426614174003/target' + }, + related: { + href: 'https://rest.api/rest/api/integration/nbevents/123e4567-e89b-12d3-a456-426614174003/related' + } + }, + target: createSuccessfulRemoteDataObject$(ItemMockPid9), + related: createNoContentRemoteDataObject$() +}; + +// Classes +// ------------------------------------------------------------------------------- + +/** + * Mock for [[OpenaireStateService]] + */ +export function getMockOpenaireStateService(): any { + return jasmine.createSpyObj('OpenaireStateService', { + getOpenaireBrokerTopics: jasmine.createSpy('getOpenaireBrokerTopics'), + isOpenaireBrokerTopicsLoading: jasmine.createSpy('isOpenaireBrokerTopicsLoading'), + isOpenaireBrokerTopicsLoaded: jasmine.createSpy('isOpenaireBrokerTopicsLoaded'), + isOpenaireBrokerTopicsProcessing: jasmine.createSpy('isOpenaireBrokerTopicsProcessing'), + getOpenaireBrokerTopicsTotalPages: jasmine.createSpy('getOpenaireBrokerTopicsTotalPages'), + getOpenaireBrokerTopicsCurrentPage: jasmine.createSpy('getOpenaireBrokerTopicsCurrentPage'), + getOpenaireBrokerTopicsTotals: jasmine.createSpy('getOpenaireBrokerTopicsTotals'), + dispatchRetrieveOpenaireBrokerTopics: jasmine.createSpy('dispatchRetrieveOpenaireBrokerTopics'), + dispatchMarkUserSuggestionsAsVisitedAction: jasmine.createSpy('dispatchMarkUserSuggestionsAsVisitedAction') + }); +} + +/** + * Mock for [[OpenaireBrokerTopicRestService]] + */ +export function getMockOpenaireBrokerTopicRestService(): OpenaireBrokerTopicRestService { + return jasmine.createSpyObj('OpenaireBrokerTopicRestService', { + getTopics: jasmine.createSpy('getTopics'), + getTopic: jasmine.createSpy('getTopic'), + }); +} + +/** + * Mock for [[OpenaireBrokerEventRestService]] + */ +export function getMockOpenaireBrokerEventRestService(): OpenaireBrokerEventRestService { + return jasmine.createSpyObj('OpenaireBrokerEventRestService', { + getEventsByTopic: jasmine.createSpy('getEventsByTopic'), + getEvent: jasmine.createSpy('getEvent'), + patchEvent: jasmine.createSpy('patchEvent'), + boundProject: jasmine.createSpy('boundProject'), + removeProject: jasmine.createSpy('removeProject'), + clearFindByTopicRequests: jasmine.createSpy('.clearFindByTopicRequests') + }); +} + +/** + * Mock for [[OpenaireBrokerEventRestService]] + */ +export function getMockSuggestionsService(): any { + return jasmine.createSpyObj('SuggestionsService', { + getTargets: jasmine.createSpy('getTargets'), + getSuggestions: jasmine.createSpy('getSuggestions'), + clearSuggestionRequests: jasmine.createSpy('clearSuggestionRequests'), + deleteReviewedSuggestion: jasmine.createSpy('deleteReviewedSuggestion'), + retrieveCurrentUserSuggestions: jasmine.createSpy('retrieveCurrentUserSuggestions'), + getTargetUuid: jasmine.createSpy('getTargetUuid'), + }); +} diff --git a/src/app/shared/pagination/pagination.component.html b/src/app/shared/pagination/pagination.component.html index 2a9aa1a062..e980e73313 100644 --- a/src/app/shared/pagination/pagination.component.html +++ b/src/app/shared/pagination/pagination.component.html @@ -11,8 +11,10 @@
- - + + + +
diff --git a/src/app/shared/pagination/pagination.component.ts b/src/app/shared/pagination/pagination.component.ts index 8f1c6bf26f..50210c4794 100644 --- a/src/app/shared/pagination/pagination.component.ts +++ b/src/app/shared/pagination/pagination.component.ts @@ -93,6 +93,11 @@ export class PaginationComponent implements OnDestroy, OnInit { */ @Input() public hideGear = false; + /** + * Option for hiding the gear + */ + @Input() public hideSortOptions = false; + /** * Option for hiding the pager when there is less than 2 pages */ diff --git a/src/app/shared/selector.util.ts b/src/app/shared/selector.util.ts new file mode 100644 index 0000000000..2343e12f1a --- /dev/null +++ b/src/app/shared/selector.util.ts @@ -0,0 +1,27 @@ +import { createSelector, MemoizedSelector, Selector } from '@ngrx/store'; +import { hasValue } from './empty.util'; + +/** + * Export a function to return a subset of the state by key + */ +export function keySelector(parentSelector: Selector, subState: string, key: string): MemoizedSelector { + return createSelector(parentSelector, (state: T) => { + if (hasValue(state) && hasValue(state[subState])) { + return state[subState][key]; + } else { + return undefined; + } + }); +} +/** + * Export a function to return a subset of the state + */ +export function subStateSelector(parentSelector: Selector, subState: string): MemoizedSelector { + return createSelector(parentSelector, (state: T) => { + if (hasValue(state) && hasValue(state[subState])) { + return state[subState]; + } else { + return undefined; + } + }); +} diff --git a/src/assets/i18n/en.json5 b/src/assets/i18n/en.json5 index f742273edb..360e50790a 100644 --- a/src/assets/i18n/en.json5 +++ b/src/assets/i18n/en.json5 @@ -479,7 +479,13 @@ "admin.access-control.groups.form.return": "Back", + "admin.notifications.openairebroker.breadcrumbs": "OpenAIRE Broker", + "admin.notifications.openairebroker.page.title": "OpenAIRE Broker", + + "admin.notifications.openaireevent.breadcrumbs": "OpenAIRE Broker Suggestions", + + "admin.notifications.openaireevent.page.title": "OpenAIRE Broker Suggestions", "admin.search.breadcrumbs": "Administrative Search", @@ -2408,6 +2414,7 @@ + "menu.header.admin": "Management", "menu.header.image.logo": "Repository logo", @@ -2510,6 +2517,8 @@ "menu.section.icon.unpin": "Unpin sidebar", + "menu.section.icon.notifications": "Notifications menu section", + "menu.section.import": "Import", @@ -2533,6 +2542,12 @@ "menu.section.new_process": "Process", + "menu.section.notifications": "Notifications", + + "menu.section.notifications_openaire_broker": "OpenAIRE Broker", + + "menu.section.notifications_reciter": "Publication Claim", + "menu.section.pin": "Pin sidebar", @@ -2698,6 +2713,126 @@ "none.listelement.badge": "Item", + "openaire.broker.title": "OpenAIRE Broker", + + "openaire.broker.topics.description": "Below you can see all the topics received from the subscriptions to OpenAIRE.", + + "openaire.broker.topics": "Current Topics", + + "openaire.broker.table.topic": "Topic", + + "openaire.broker.table.last-event": "Last Event", + + "openaire.broker.table.actions": "Actions", + + "openaire.broker.button.detail": "Show details", + + "openaire.broker.noTopics": "No topics found.", + + "openaire.broker.topic.error.service.retrieve": "An error occurred while loading the OpenAIRE Broker topics", + + "openaire.broker.loading": "Loading ...", + + "openaire.events.title": "OpenAIRE Broker Suggestions", + + "openaire.broker.events.description": "Below the list of all the suggestions, received from OpenAIRE, for the selected topic.", + + "openaire.broker.events.topic": "Topic:", + + "openaire.broker.noEvents": "No suggestions found.", + + "openaire.broker.event.table.trust": "Trust", + + "openaire.broker.event.table.publication": "Publication", + + "openaire.broker.event.table.details": "Details", + + "openaire.broker.event.table.project-details": "Project details", + + "openaire.broker.event.table.actions": "Actions", + + "openaire.broker.event.action.accept": "Accept suggestion", + + "openaire.broker.event.action.ignore": "Ignore suggestion", + + "openaire.broker.event.action.reject": "Reject suggestion", + + "openaire.broker.event.action.import": "Import project and accept suggestion", + + "openaire.broker.event.table.pidtype": "PID Type:", + + "openaire.broker.event.table.pidvalue": "PID Value:", + + "openaire.broker.event.table.subjectValue": "Subject Value:", + + "openaire.broker.event.table.abstract": "Abstract:", + + "openaire.broker.event.table.suggestedProject": "OpenAIRE Suggested Project data", + + "openaire.broker.event.table.project": "Project title:", + + "openaire.broker.event.table.acronym": "Acronym:", + + "openaire.broker.event.table.code": "Code:", + + "openaire.broker.event.table.funder": "Funder:", + + "openaire.broker.event.table.fundingProgram": "Funding program:", + + "openaire.broker.event.table.jurisdiction": "Jurisdiction:", + + "openaire.broker.events.back": "Back to topics", + + "openaire.broker.event.table.less": "Show less", + + "openaire.broker.event.table.more": "Show more", + + "openaire.broker.event.project.found": "Bound to the local record:", + + "openaire.broker.event.project.notFound": "No local record found", + + "openaire.broker.event.sure": "Are you sure?", + + "openaire.broker.event.ignore.description": "This operation can't be undone. Ignore this suggestion?", + + "openaire.broker.event.reject.description": "This operation can't be undone. Reject this suggestion?", + + "openaire.broker.event.accept.description": "No DSpace project selected. A new project will be created based on the suggestion data.", + + "openaire.broker.event.action.cancel": "Cancel", + + "openaire.broker.event.action.saved": "Your decision has been saved successfully.", + + "openaire.broker.event.action.error": "An error has occurred. Your decision has not been saved.", + + "openaire.broker.event.modal.project.title": "Choose a project to bound", + + "openaire.broker.event.modal.project.publication": "Publication:", + + "openaire.broker.event.modal.project.bountToLocal": "Bound to the local record:", + + "openaire.broker.event.modal.project.select": "Project search", + + "openaire.broker.event.modal.project.search": "Search", + + "openaire.broker.event.modal.project.clear": "Clear", + + "openaire.broker.event.modal.project.cancel": "Cancel", + + "openaire.broker.event.modal.project.bound": "Bound project", + + "openaire.broker.event.modal.project.placeholder": "Enter a project name", + + "openaire.broker.event.modal.project.notFound": "No project found.", + + "openaire.broker.event.project.bounded": "The project has been linked successfully.", + + "openaire.broker.event.project.removed": "The project has been successfully unlinked.", + + "openaire.broker.event.project.error": "An error has occurred. No operation performed.", + + "openaire.broker.event.reason": "Reason", + "orgunit.listelement.badge": "Organizational Unit", @@ -3362,7 +3497,9 @@ "search.filters.filter.submitter.label": "Search submitter", + "search.filters.filter.funding.head": "Funding", + "search.filters.filter.funding.placeholder": "Funding", "search.filters.entityType.JournalIssue": "Journal Issue", From 4ca51387d1e60b7068eeed2f13ed105922a15455 Mon Sep 17 00:00:00 2001 From: Luca Giamminonni Date: Fri, 18 Feb 2022 19:01:30 +0100 Subject: [PATCH 002/409] [CST-5246] Correction service should support multiple providers --- ...ications-broker-events-page.component.html | 1 + ...tions-broker-events-page.component.spec.ts | 26 ++++ ...ifications-broker-events-page.component.ts | 9 ++ ...ifications-broker-events-page.resolver.ts} | 8 +- ...ns-broker-topics-page-resolver.service.ts} | 8 +- ...ications-broker-topics-page.component.html | 1 + ...tions-broker-topics-page.component.spec.ts | 26 ++++ ...ifications-broker-topics-page.component.ts | 9 ++ ...ations-openaire-events-page.component.html | 1 - ...ons-openaire-events-page.component.spec.ts | 26 ---- ...ications-openaire-events-page.component.ts | 9 -- ...ations-openaire-topics-page.component.html | 1 - ...ons-openaire-topics-page.component.spec.ts | 26 ---- ...ications-openaire-topics-page.component.ts | 9 -- .../admin-notifications-routing-paths.ts | 4 +- .../admin-notifications-routing.module.ts | 28 ++-- .../admin-notifications.module.ts | 12 +- .../admin-sidebar/admin-sidebar.component.ts | 4 +- src/app/core/core.module.ts | 8 +- ...cations-broker-event-rest.service.spec.ts} | 54 ++++---- ...otifications-broker-event-rest.service.ts} | 56 ++++---- ...ions-broker-event-object.resource-type.ts} | 4 +- .../notifications-broker-event.model.ts} | 49 ++++--- ...ions-broker-topic-object.resource-type.ts} | 4 +- .../notifications-broker-topic.model.ts} | 16 +-- ...cations-broker-topic-rest.service.spec.ts} | 28 ++-- ...otifications-broker-topic-rest.service.ts} | 38 ++--- ...otifications-broker-events.component.html} | 94 ++++++------- ...fications-broker-events.component.spec.ts} | 114 +++++++-------- .../notifications-broker-events.component.ts} | 130 +++++++++--------- ...tifications-broker-events.scomponent.scss} | 0 .../project-entry-import-modal.component.html | 0 .../project-entry-import-modal.component.scss | 0 ...oject-entry-import-modal.component.spec.ts | 20 +-- .../project-entry-import-modal.component.ts | 29 ++-- .../notifications-broker-topics.actions.ts} | 30 ++-- ...otifications-broker-topics.component.html} | 22 +-- ...otifications-broker-topics.component.scss} | 0 ...fications-broker-topics.component.spec.ts} | 66 ++++----- .../notifications-broker-topics.component.ts} | 54 ++++---- .../notifications-broker-topics.effects.ts} | 38 ++--- ...otifications-broker-topics.reducer.spec.ts | 68 +++++++++ .../notifications-broker-topics.reducer.ts | 72 ++++++++++ ...tifications-broker-topics.service.spec.ts} | 34 ++--- .../notifications-broker-topics.service.ts | 55 ++++++++ .../notifications-state.service.spec.ts} | 112 +++++++-------- .../notifications-state.service.ts | 116 ++++++++++++++++ .../notifications/notifications.effects.ts | 5 + .../notifications.module.ts} | 34 ++--- .../notifications/notifications.reducer.ts | 16 +++ src/app/notifications/selectors.ts | 79 +++++++++++ .../openaire-broker-topics.reducer.spec.ts | 68 --------- .../topics/openaire-broker-topics.reducer.ts | 72 ---------- .../topics/openaire-broker-topics.service.ts | 55 -------- src/app/openaire/openaire-state.service.ts | 116 ---------------- src/app/openaire/openaire.effects.ts | 5 - src/app/openaire/openaire.reducer.ts | 16 --- src/app/openaire/selectors.ts | 79 ----------- ...openaire.mock.ts => notifications.mock.ts} | 94 ++++++------- src/assets/i18n/en.json5 | 130 +++++++++--------- 60 files changed, 1150 insertions(+), 1138 deletions(-) create mode 100644 src/app/admin/admin-notifications/admin-notifications-broker-events-page/admin-notifications-broker-events-page.component.html create mode 100644 src/app/admin/admin-notifications/admin-notifications-broker-events-page/admin-notifications-broker-events-page.component.spec.ts create mode 100644 src/app/admin/admin-notifications/admin-notifications-broker-events-page/admin-notifications-broker-events-page.component.ts rename src/app/admin/admin-notifications/{admin-notifications-openaire-events-page/admin-notifications-openaire-events-page.resolver.ts => admin-notifications-broker-events-page/admin-notifications-broker-events-page.resolver.ts} (72%) rename src/app/admin/admin-notifications/{admin-notifications-openaire-topics-page/admin-notifications-openaire-topics-page-resolver.service.ts => admin-notifications-broker-topics-page/admin-notifications-broker-topics-page-resolver.service.ts} (72%) create mode 100644 src/app/admin/admin-notifications/admin-notifications-broker-topics-page/admin-notifications-broker-topics-page.component.html create mode 100644 src/app/admin/admin-notifications/admin-notifications-broker-topics-page/admin-notifications-broker-topics-page.component.spec.ts create mode 100644 src/app/admin/admin-notifications/admin-notifications-broker-topics-page/admin-notifications-broker-topics-page.component.ts delete mode 100644 src/app/admin/admin-notifications/admin-notifications-openaire-events-page/admin-notifications-openaire-events-page.component.html delete mode 100644 src/app/admin/admin-notifications/admin-notifications-openaire-events-page/admin-notifications-openaire-events-page.component.spec.ts delete mode 100644 src/app/admin/admin-notifications/admin-notifications-openaire-events-page/admin-notifications-openaire-events-page.component.ts delete mode 100644 src/app/admin/admin-notifications/admin-notifications-openaire-topics-page/admin-notifications-openaire-topics-page.component.html delete mode 100644 src/app/admin/admin-notifications/admin-notifications-openaire-topics-page/admin-notifications-openaire-topics-page.component.spec.ts delete mode 100644 src/app/admin/admin-notifications/admin-notifications-openaire-topics-page/admin-notifications-openaire-topics-page.component.ts rename src/app/core/{openaire/broker/events/openaire-broker-event-rest.service.spec.ts => notifications/broker/events/notifications-broker-event-rest.service.spec.ts} (78%) rename src/app/core/{openaire/broker/events/openaire-broker-event-rest.service.ts => notifications/broker/events/notifications-broker-event-rest.service.ts} (73%) rename src/app/core/{openaire/broker/models/openaire-broker-event-object.resource-type.ts => notifications/broker/models/notifications-broker-event-object.resource-type.ts} (53%) rename src/app/core/{openaire/broker/models/openaire-broker-event.model.ts => notifications/broker/models/notifications-broker-event.model.ts} (61%) rename src/app/core/{openaire/broker/models/openaire-broker-topic-object.resource-type.ts => notifications/broker/models/notifications-broker-topic-object.resource-type.ts} (53%) rename src/app/core/{openaire/broker/models/openaire-broker-topic.model.ts => notifications/broker/models/notifications-broker-topic.model.ts} (64%) rename src/app/core/{openaire/broker/topics/openaire-broker-topic-rest.service.spec.ts => notifications/broker/topics/notifications-broker-topic-rest.service.spec.ts} (77%) rename src/app/core/{openaire/broker/topics/openaire-broker-topic-rest.service.ts => notifications/broker/topics/notifications-broker-topic-rest.service.ts} (75%) rename src/app/{openaire/broker/events/openaire-broker-events.component.html => notifications/broker/events/notifications-broker-events.component.html} (60%) rename src/app/{openaire/broker/events/openaire-broker-events.component.spec.ts => notifications/broker/events/notifications-broker-events.component.spec.ts} (66%) rename src/app/{openaire/broker/events/openaire-broker-events.component.ts => notifications/broker/events/notifications-broker-events.component.ts} (71%) rename src/app/{openaire/broker/events/openaire-broker-events.scomponent.scss => notifications/broker/events/notifications-broker-events.scomponent.scss} (100%) rename src/app/{openaire => notifications}/broker/project-entry-import-modal/project-entry-import-modal.component.html (100%) rename src/app/{openaire => notifications}/broker/project-entry-import-modal/project-entry-import-modal.component.scss (100%) rename src/app/{openaire => notifications}/broker/project-entry-import-modal/project-entry-import-modal.component.spec.ts (92%) rename src/app/{openaire => notifications}/broker/project-entry-import-modal/project-entry-import-modal.component.ts (89%) rename src/app/{openaire/broker/topics/openaire-broker-topics.actions.ts => notifications/broker/topics/notifications-broker-topics.actions.ts} (60%) rename src/app/{openaire/broker/topics/openaire-broker-topics.component.html => notifications/broker/topics/notifications-broker-topics.component.html} (66%) rename src/app/{openaire/broker/topics/openaire-broker-topics.component.scss => notifications/broker/topics/notifications-broker-topics.component.scss} (100%) rename src/app/{openaire/broker/topics/openaire-broker-topics.component.spec.ts => notifications/broker/topics/notifications-broker-topics.component.spec.ts} (53%) rename src/app/{openaire/broker/topics/openaire-broker-topics.component.ts => notifications/broker/topics/notifications-broker-topics.component.ts} (60%) rename src/app/{openaire/broker/topics/openaire-broker-topics.effects.ts => notifications/broker/topics/notifications-broker-topics.effects.ts} (57%) create mode 100644 src/app/notifications/broker/topics/notifications-broker-topics.reducer.spec.ts create mode 100644 src/app/notifications/broker/topics/notifications-broker-topics.reducer.ts rename src/app/{openaire/broker/topics/openaire-broker-topics.service.spec.ts => notifications/broker/topics/notifications-broker-topics.service.spec.ts} (56%) create mode 100644 src/app/notifications/broker/topics/notifications-broker-topics.service.ts rename src/app/{openaire/openaire-state.service.spec.ts => notifications/notifications-state.service.spec.ts} (59%) create mode 100644 src/app/notifications/notifications-state.service.ts create mode 100644 src/app/notifications/notifications.effects.ts rename src/app/{openaire/openaire.module.ts => notifications/notifications.module.ts} (50%) create mode 100644 src/app/notifications/notifications.reducer.ts create mode 100644 src/app/notifications/selectors.ts delete mode 100644 src/app/openaire/broker/topics/openaire-broker-topics.reducer.spec.ts delete mode 100644 src/app/openaire/broker/topics/openaire-broker-topics.reducer.ts delete mode 100644 src/app/openaire/broker/topics/openaire-broker-topics.service.ts delete mode 100644 src/app/openaire/openaire-state.service.ts delete mode 100644 src/app/openaire/openaire.effects.ts delete mode 100644 src/app/openaire/openaire.reducer.ts delete mode 100644 src/app/openaire/selectors.ts rename src/app/shared/mocks/{openaire.mock.ts => notifications.mock.ts} (92%) diff --git a/src/app/admin/admin-notifications/admin-notifications-broker-events-page/admin-notifications-broker-events-page.component.html b/src/app/admin/admin-notifications/admin-notifications-broker-events-page/admin-notifications-broker-events-page.component.html new file mode 100644 index 0000000000..89ef1bfc88 --- /dev/null +++ b/src/app/admin/admin-notifications/admin-notifications-broker-events-page/admin-notifications-broker-events-page.component.html @@ -0,0 +1 @@ + diff --git a/src/app/admin/admin-notifications/admin-notifications-broker-events-page/admin-notifications-broker-events-page.component.spec.ts b/src/app/admin/admin-notifications/admin-notifications-broker-events-page/admin-notifications-broker-events-page.component.spec.ts new file mode 100644 index 0000000000..57a79e017b --- /dev/null +++ b/src/app/admin/admin-notifications/admin-notifications-broker-events-page/admin-notifications-broker-events-page.component.spec.ts @@ -0,0 +1,26 @@ +import { NO_ERRORS_SCHEMA } from '@angular/core'; +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; +import { AdminNotificationsBrokerEventsPageComponent } from './admin-notifications-broker-events-page.component'; + +describe('AdminNotificationsBrokerEventsPageComponent', () => { + let component: AdminNotificationsBrokerEventsPageComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ AdminNotificationsBrokerEventsPageComponent ], + schemas: [NO_ERRORS_SCHEMA] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(AdminNotificationsBrokerEventsPageComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create AdminNotificationsBrokerEventsPageComponent', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/admin/admin-notifications/admin-notifications-broker-events-page/admin-notifications-broker-events-page.component.ts b/src/app/admin/admin-notifications/admin-notifications-broker-events-page/admin-notifications-broker-events-page.component.ts new file mode 100644 index 0000000000..f014b4d133 --- /dev/null +++ b/src/app/admin/admin-notifications/admin-notifications-broker-events-page/admin-notifications-broker-events-page.component.ts @@ -0,0 +1,9 @@ +import { Component } from '@angular/core'; + +@Component({ + selector: 'ds-notifications-broker-events-page', + templateUrl: './admin-notifications-broker-events-page.component.html' +}) +export class AdminNotificationsBrokerEventsPageComponent { + +} diff --git a/src/app/admin/admin-notifications/admin-notifications-openaire-events-page/admin-notifications-openaire-events-page.resolver.ts b/src/app/admin/admin-notifications/admin-notifications-broker-events-page/admin-notifications-broker-events-page.resolver.ts similarity index 72% rename from src/app/admin/admin-notifications/admin-notifications-openaire-events-page/admin-notifications-openaire-events-page.resolver.ts rename to src/app/admin/admin-notifications/admin-notifications-broker-events-page/admin-notifications-broker-events-page.resolver.ts index b215013e11..dcf530858c 100644 --- a/src/app/admin/admin-notifications/admin-notifications-openaire-events-page/admin-notifications-openaire-events-page.resolver.ts +++ b/src/app/admin/admin-notifications/admin-notifications-broker-events-page/admin-notifications-broker-events-page.resolver.ts @@ -4,7 +4,7 @@ import { Resolve, ActivatedRouteSnapshot, RouterStateSnapshot } from '@angular/r /** * Interface for the route parameters. */ -export interface AdminNotificationsOpenaireEventsPageParams { +export interface AdminNotificationsBrokerEventsPageParams { pageId?: string; pageSize?: number; currentPage?: number; @@ -14,15 +14,15 @@ export interface AdminNotificationsOpenaireEventsPageParams { * This class represents a resolver that retrieve the route data before the route is activated. */ @Injectable() -export class AdminNotificationsOpenaireEventsPageResolver implements Resolve { +export class AdminNotificationsBrokerEventsPageResolver implements Resolve { /** * Method for resolving the parameters in the current route. * @param {ActivatedRouteSnapshot} route The current ActivatedRouteSnapshot * @param {RouterStateSnapshot} state The current RouterStateSnapshot - * @returns AdminNotificationsOpenaireEventsPageParams Emits the route parameters + * @returns AdminNotificationsBrokerEventsPageParams Emits the route parameters */ - resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): AdminNotificationsOpenaireEventsPageParams { + resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): AdminNotificationsBrokerEventsPageParams { return { pageId: route.queryParams.pageId, pageSize: parseInt(route.queryParams.pageSize, 10), diff --git a/src/app/admin/admin-notifications/admin-notifications-openaire-topics-page/admin-notifications-openaire-topics-page-resolver.service.ts b/src/app/admin/admin-notifications/admin-notifications-broker-topics-page/admin-notifications-broker-topics-page-resolver.service.ts similarity index 72% rename from src/app/admin/admin-notifications/admin-notifications-openaire-topics-page/admin-notifications-openaire-topics-page-resolver.service.ts rename to src/app/admin/admin-notifications/admin-notifications-broker-topics-page/admin-notifications-broker-topics-page-resolver.service.ts index f8e02cabbf..d4fd354d92 100644 --- a/src/app/admin/admin-notifications/admin-notifications-openaire-topics-page/admin-notifications-openaire-topics-page-resolver.service.ts +++ b/src/app/admin/admin-notifications/admin-notifications-broker-topics-page/admin-notifications-broker-topics-page-resolver.service.ts @@ -4,7 +4,7 @@ import { ActivatedRouteSnapshot, Resolve, RouterStateSnapshot } from '@angular/r /** * Interface for the route parameters. */ -export interface AdminNotificationsOpenaireTopicsPageParams { +export interface AdminNotificationsBrokerTopicsPageParams { pageId?: string; pageSize?: number; currentPage?: number; @@ -14,15 +14,15 @@ export interface AdminNotificationsOpenaireTopicsPageParams { * This class represents a resolver that retrieve the route data before the route is activated. */ @Injectable() -export class AdminNotificationsOpenaireTopicsPageResolver implements Resolve { +export class AdminNotificationsBrokerTopicsPageResolver implements Resolve { /** * Method for resolving the parameters in the current route. * @param {ActivatedRouteSnapshot} route The current ActivatedRouteSnapshot * @param {RouterStateSnapshot} state The current RouterStateSnapshot - * @returns AdminNotificationsOpenaireTopicsPageParams Emits the route parameters + * @returns AdminNotificationsBrokerTopicsPageParams Emits the route parameters */ - resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): AdminNotificationsOpenaireTopicsPageParams { + resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): AdminNotificationsBrokerTopicsPageParams { return { pageId: route.queryParams.pageId, pageSize: parseInt(route.queryParams.pageSize, 10), diff --git a/src/app/admin/admin-notifications/admin-notifications-broker-topics-page/admin-notifications-broker-topics-page.component.html b/src/app/admin/admin-notifications/admin-notifications-broker-topics-page/admin-notifications-broker-topics-page.component.html new file mode 100644 index 0000000000..dbdae2e6b9 --- /dev/null +++ b/src/app/admin/admin-notifications/admin-notifications-broker-topics-page/admin-notifications-broker-topics-page.component.html @@ -0,0 +1 @@ + diff --git a/src/app/admin/admin-notifications/admin-notifications-broker-topics-page/admin-notifications-broker-topics-page.component.spec.ts b/src/app/admin/admin-notifications/admin-notifications-broker-topics-page/admin-notifications-broker-topics-page.component.spec.ts new file mode 100644 index 0000000000..c21e0ce73b --- /dev/null +++ b/src/app/admin/admin-notifications/admin-notifications-broker-topics-page/admin-notifications-broker-topics-page.component.spec.ts @@ -0,0 +1,26 @@ +import { NO_ERRORS_SCHEMA } from '@angular/core'; +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; +import { AdminNotificationsBrokerTopicsPageComponent } from './admin-notifications-broker-topics-page.component'; + +describe('AdminNotificationsBrokerTopicsPageComponent', () => { + let component: AdminNotificationsBrokerTopicsPageComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ AdminNotificationsBrokerTopicsPageComponent ], + schemas: [NO_ERRORS_SCHEMA] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(AdminNotificationsBrokerTopicsPageComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create AdminNotificationsBrokerTopicsPageComponent', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/admin/admin-notifications/admin-notifications-broker-topics-page/admin-notifications-broker-topics-page.component.ts b/src/app/admin/admin-notifications/admin-notifications-broker-topics-page/admin-notifications-broker-topics-page.component.ts new file mode 100644 index 0000000000..4f60ffd3fd --- /dev/null +++ b/src/app/admin/admin-notifications/admin-notifications-broker-topics-page/admin-notifications-broker-topics-page.component.ts @@ -0,0 +1,9 @@ +import { Component } from '@angular/core'; + +@Component({ + selector: 'ds-notification-broker-page', + templateUrl: './admin-notifications-broker-topics-page.component.html' +}) +export class AdminNotificationsBrokerTopicsPageComponent { + +} diff --git a/src/app/admin/admin-notifications/admin-notifications-openaire-events-page/admin-notifications-openaire-events-page.component.html b/src/app/admin/admin-notifications/admin-notifications-openaire-events-page/admin-notifications-openaire-events-page.component.html deleted file mode 100644 index 5c8f8820a0..0000000000 --- a/src/app/admin/admin-notifications/admin-notifications-openaire-events-page/admin-notifications-openaire-events-page.component.html +++ /dev/null @@ -1 +0,0 @@ - diff --git a/src/app/admin/admin-notifications/admin-notifications-openaire-events-page/admin-notifications-openaire-events-page.component.spec.ts b/src/app/admin/admin-notifications/admin-notifications-openaire-events-page/admin-notifications-openaire-events-page.component.spec.ts deleted file mode 100644 index ab7a08a695..0000000000 --- a/src/app/admin/admin-notifications/admin-notifications-openaire-events-page/admin-notifications-openaire-events-page.component.spec.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { NO_ERRORS_SCHEMA } from '@angular/core'; -import { async, ComponentFixture, TestBed } from '@angular/core/testing'; -import { AdminNotificationsOpenaireEventsPageComponent } from './admin-notifications-openaire-events-page.component'; - -describe('AdminNotificationsOpenaireEventsPageComponent', () => { - let component: AdminNotificationsOpenaireEventsPageComponent; - let fixture: ComponentFixture; - - beforeEach(async(() => { - TestBed.configureTestingModule({ - declarations: [ AdminNotificationsOpenaireEventsPageComponent ], - schemas: [NO_ERRORS_SCHEMA] - }) - .compileComponents(); - })); - - beforeEach(() => { - fixture = TestBed.createComponent(AdminNotificationsOpenaireEventsPageComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create AdminNotificationsOpenaireEventsPageComponent', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/src/app/admin/admin-notifications/admin-notifications-openaire-events-page/admin-notifications-openaire-events-page.component.ts b/src/app/admin/admin-notifications/admin-notifications-openaire-events-page/admin-notifications-openaire-events-page.component.ts deleted file mode 100644 index df7b21dbda..0000000000 --- a/src/app/admin/admin-notifications/admin-notifications-openaire-events-page/admin-notifications-openaire-events-page.component.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { Component } from '@angular/core'; - -@Component({ - selector: 'ds-notification-openaire-events-page', - templateUrl: './admin-notifications-openaire-events-page.component.html' -}) -export class AdminNotificationsOpenaireEventsPageComponent { - -} diff --git a/src/app/admin/admin-notifications/admin-notifications-openaire-topics-page/admin-notifications-openaire-topics-page.component.html b/src/app/admin/admin-notifications/admin-notifications-openaire-topics-page/admin-notifications-openaire-topics-page.component.html deleted file mode 100644 index b1616cfe78..0000000000 --- a/src/app/admin/admin-notifications/admin-notifications-openaire-topics-page/admin-notifications-openaire-topics-page.component.html +++ /dev/null @@ -1 +0,0 @@ - diff --git a/src/app/admin/admin-notifications/admin-notifications-openaire-topics-page/admin-notifications-openaire-topics-page.component.spec.ts b/src/app/admin/admin-notifications/admin-notifications-openaire-topics-page/admin-notifications-openaire-topics-page.component.spec.ts deleted file mode 100644 index 712c7ba2c3..0000000000 --- a/src/app/admin/admin-notifications/admin-notifications-openaire-topics-page/admin-notifications-openaire-topics-page.component.spec.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { NO_ERRORS_SCHEMA } from '@angular/core'; -import { async, ComponentFixture, TestBed } from '@angular/core/testing'; -import { AdminNotificationsOpenaireTopicsPageComponent } from './admin-notifications-openaire-topics-page.component'; - -describe('AdminNotificationsOpenaireTopicsPageComponent', () => { - let component: AdminNotificationsOpenaireTopicsPageComponent; - let fixture: ComponentFixture; - - beforeEach(async(() => { - TestBed.configureTestingModule({ - declarations: [ AdminNotificationsOpenaireTopicsPageComponent ], - schemas: [NO_ERRORS_SCHEMA] - }) - .compileComponents(); - })); - - beforeEach(() => { - fixture = TestBed.createComponent(AdminNotificationsOpenaireTopicsPageComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create AdminNotificationsOpenaireTopicsPageComponent', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/src/app/admin/admin-notifications/admin-notifications-openaire-topics-page/admin-notifications-openaire-topics-page.component.ts b/src/app/admin/admin-notifications/admin-notifications-openaire-topics-page/admin-notifications-openaire-topics-page.component.ts deleted file mode 100644 index 5bf1832c59..0000000000 --- a/src/app/admin/admin-notifications/admin-notifications-openaire-topics-page/admin-notifications-openaire-topics-page.component.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { Component } from '@angular/core'; - -@Component({ - selector: 'ds-notification-openairebroker-page', - templateUrl: './admin-notifications-openaire-topics-page.component.html' -}) -export class AdminNotificationsOpenaireTopicsPageComponent { - -} diff --git a/src/app/admin/admin-notifications/admin-notifications-routing-paths.ts b/src/app/admin/admin-notifications/admin-notifications-routing-paths.ts index ea7242adcb..469cbb980f 100644 --- a/src/app/admin/admin-notifications/admin-notifications-routing-paths.ts +++ b/src/app/admin/admin-notifications/admin-notifications-routing-paths.ts @@ -1,8 +1,8 @@ import { URLCombiner } from '../../core/url-combiner/url-combiner'; import { getNotificationsModuleRoute } from '../admin-routing-paths'; -export const NOTIFICATIONS_EDIT_PATH = 'openaire-broker'; +export const NOTIFICATIONS_EDIT_PATH = 'notifications-broker'; -export function getNotificationsOpenairebrokerRoute(id: string) { +export function getNotificationsBrokerbrokerRoute(id: string) { return new URLCombiner(getNotificationsModuleRoute(), NOTIFICATIONS_EDIT_PATH, id).toString(); } diff --git a/src/app/admin/admin-notifications/admin-notifications-routing.module.ts b/src/app/admin/admin-notifications/admin-notifications-routing.module.ts index 2dfa938c4f..f1f46ca4f1 100644 --- a/src/app/admin/admin-notifications/admin-notifications-routing.module.ts +++ b/src/app/admin/admin-notifications/admin-notifications-routing.module.ts @@ -5,10 +5,10 @@ import { AuthenticatedGuard } from '../../core/auth/authenticated.guard'; import { I18nBreadcrumbResolver } from '../../core/breadcrumbs/i18n-breadcrumb.resolver'; import { I18nBreadcrumbsService } from '../../core/breadcrumbs/i18n-breadcrumbs.service'; import { NOTIFICATIONS_EDIT_PATH } from './admin-notifications-routing-paths'; -import { AdminNotificationsOpenaireTopicsPageComponent } from './admin-notifications-openaire-topics-page/admin-notifications-openaire-topics-page.component'; -import { AdminNotificationsOpenaireEventsPageComponent } from './admin-notifications-openaire-events-page/admin-notifications-openaire-events-page.component'; -import { AdminNotificationsOpenaireTopicsPageResolver } from './admin-notifications-openaire-topics-page/admin-notifications-openaire-topics-page-resolver.service'; -import { AdminNotificationsOpenaireEventsPageResolver } from './admin-notifications-openaire-events-page/admin-notifications-openaire-events-page.resolver'; +import { AdminNotificationsBrokerTopicsPageComponent } from './admin-notifications-broker-topics-page/admin-notifications-broker-topics-page.component'; +import { AdminNotificationsBrokerEventsPageComponent } from './admin-notifications-broker-events-page/admin-notifications-broker-events-page.component'; +import { AdminNotificationsBrokerTopicsPageResolver } from './admin-notifications-broker-topics-page/admin-notifications-broker-topics-page-resolver.service'; +import { AdminNotificationsBrokerEventsPageResolver } from './admin-notifications-broker-events-page/admin-notifications-broker-events-page.resolver'; @NgModule({ imports: [ @@ -16,30 +16,30 @@ import { AdminNotificationsOpenaireEventsPageResolver } from './admin-notificati { canActivate: [ AuthenticatedGuard ], path: `${NOTIFICATIONS_EDIT_PATH}`, - component: AdminNotificationsOpenaireTopicsPageComponent, + component: AdminNotificationsBrokerTopicsPageComponent, pathMatch: 'full', resolve: { breadcrumb: I18nBreadcrumbResolver, - openaireBrokerTopicsParams: AdminNotificationsOpenaireTopicsPageResolver + openaireBrokerTopicsParams: AdminNotificationsBrokerTopicsPageResolver }, data: { - title: 'admin.notifications.openairebroker.page.title', - breadcrumbKey: 'admin.notifications.openairebroker', + title: 'admin.notifications.broker.page.title', + breadcrumbKey: 'admin.notifications.broker', showBreadcrumbsFluid: false } }, { canActivate: [ AuthenticatedGuard ], path: `${NOTIFICATIONS_EDIT_PATH}/:id`, - component: AdminNotificationsOpenaireEventsPageComponent, + component: AdminNotificationsBrokerEventsPageComponent, pathMatch: 'full', resolve: { breadcrumb: I18nBreadcrumbResolver, - openaireBrokerEventsParams: AdminNotificationsOpenaireEventsPageResolver + openaireBrokerEventsParams: AdminNotificationsBrokerEventsPageResolver }, data: { - title: 'admin.notifications.openaireevent.page.title', - breadcrumbKey: 'admin.notifications.openaireevent', + title: 'admin.notifications.event.page.title', + breadcrumbKey: 'admin.notifications.event', showBreadcrumbsFluid: false } } @@ -48,8 +48,8 @@ import { AdminNotificationsOpenaireEventsPageResolver } from './admin-notificati providers: [ I18nBreadcrumbResolver, I18nBreadcrumbsService, - AdminNotificationsOpenaireTopicsPageResolver, - AdminNotificationsOpenaireEventsPageResolver + AdminNotificationsBrokerTopicsPageResolver, + AdminNotificationsBrokerEventsPageResolver ] }) /** diff --git a/src/app/admin/admin-notifications/admin-notifications.module.ts b/src/app/admin/admin-notifications/admin-notifications.module.ts index 9894dac233..350e9de800 100644 --- a/src/app/admin/admin-notifications/admin-notifications.module.ts +++ b/src/app/admin/admin-notifications/admin-notifications.module.ts @@ -3,9 +3,9 @@ import { NgModule } from '@angular/core'; import { CoreModule } from '../../core/core.module'; import { SharedModule } from '../../shared/shared.module'; import { AdminNotificationsRoutingModule } from './admin-notifications-routing.module'; -import { AdminNotificationsOpenaireTopicsPageComponent } from './admin-notifications-openaire-topics-page/admin-notifications-openaire-topics-page.component'; -import { AdminNotificationsOpenaireEventsPageComponent } from './admin-notifications-openaire-events-page/admin-notifications-openaire-events-page.component'; -import { OpenaireModule } from '../../openaire/openaire.module'; +import { AdminNotificationsBrokerTopicsPageComponent } from './admin-notifications-broker-topics-page/admin-notifications-broker-topics-page.component'; +import { AdminNotificationsBrokerEventsPageComponent } from './admin-notifications-broker-events-page/admin-notifications-broker-events-page.component'; +import { NotificationsModule } from '../../notifications/notifications.module'; @NgModule({ imports: [ @@ -13,11 +13,11 @@ import { OpenaireModule } from '../../openaire/openaire.module'; SharedModule, CoreModule.forRoot(), AdminNotificationsRoutingModule, - OpenaireModule + NotificationsModule ], declarations: [ - AdminNotificationsOpenaireTopicsPageComponent, - AdminNotificationsOpenaireEventsPageComponent + AdminNotificationsBrokerTopicsPageComponent, + AdminNotificationsBrokerEventsPageComponent ], entryComponents: [] }) diff --git a/src/app/admin/admin-sidebar/admin-sidebar.component.ts b/src/app/admin/admin-sidebar/admin-sidebar.component.ts index a2a7eb30b5..3e989f16f3 100644 --- a/src/app/admin/admin-sidebar/admin-sidebar.component.ts +++ b/src/app/admin/admin-sidebar/admin-sidebar.component.ts @@ -483,8 +483,8 @@ export class AdminSidebarComponent extends MenuComponent implements OnInit { visible: authorized, model: { type: MenuItemType.LINK, - text: 'menu.section.notifications_openaire_broker', - link: '/admin/notifications/openaire-broker' + text: 'menu.section.notifications_broker', + link: '/admin/notifications/notifications-broker' } as LinkMenuItemModel, }, /* Admin Search */ diff --git a/src/app/core/core.module.ts b/src/app/core/core.module.ts index 928d34c48e..f5a959592f 100644 --- a/src/app/core/core.module.ts +++ b/src/app/core/core.module.ts @@ -162,8 +162,8 @@ import { SearchConfig } from './shared/search/search-filters/search-config.model import { SequenceService } from './shared/sequence.service'; import { GroupDataService } from './eperson/group-data.service'; import { SubmissionAccessesModel } from './config/models/config-submission-accesses.model'; -import { OpenaireBrokerTopicObject } from './openaire/broker/models/openaire-broker-topic.model'; -import { OpenaireBrokerEventObject } from './openaire/broker/models/openaire-broker-event.model'; +import { NotificationsBrokerTopicObject } from './notifications/broker/models/notifications-broker-topic.model'; +import { NotificationsBrokerEventObject } from './notifications/broker/models/notifications-broker-event.model'; /** * When not in production, endpoint responses can be mocked for testing purposes @@ -345,8 +345,8 @@ export const models = ShortLivedToken, Registration, UsageReport, - OpenaireBrokerTopicObject, - OpenaireBrokerEventObject, + NotificationsBrokerTopicObject, + NotificationsBrokerEventObject, Root, SearchConfig, SubmissionAccessesModel diff --git a/src/app/core/openaire/broker/events/openaire-broker-event-rest.service.spec.ts b/src/app/core/notifications/broker/events/notifications-broker-event-rest.service.spec.ts similarity index 78% rename from src/app/core/openaire/broker/events/openaire-broker-event-rest.service.spec.ts rename to src/app/core/notifications/broker/events/notifications-broker-event-rest.service.spec.ts index 2d0d236330..16d55479ae 100644 --- a/src/app/core/openaire/broker/events/openaire-broker-event-rest.service.spec.ts +++ b/src/app/core/notifications/broker/events/notifications-broker-event-rest.service.spec.ts @@ -15,17 +15,17 @@ import { PageInfo } from '../../../shared/page-info.model'; import { HALEndpointService } from '../../../shared/hal-endpoint.service'; import { NotificationsService } from '../../../../shared/notifications/notifications.service'; import { createSuccessfulRemoteDataObject } from '../../../../shared/remote-data.utils'; -import { OpenaireBrokerEventRestService } from './openaire-broker-event-rest.service'; +import { NotificationsBrokerEventRestService } from './notifications-broker-event-rest.service'; import { - openaireBrokerEventObjectMissingPid, - openaireBrokerEventObjectMissingPid2, - openaireBrokerEventObjectMissingProjectFound -} from '../../../../shared/mocks/openaire.mock'; + notificationsBrokerEventObjectMissingPid, + notificationsBrokerEventObjectMissingPid2, + notificationsBrokerEventObjectMissingProjectFound +} from '../../../../shared/mocks/notifications.mock'; import { ReplaceOperation } from 'fast-json-patch'; -describe('OpenaireBrokerEventRestService', () => { +describe('NotificationsBrokerEventRestService', () => { let scheduler: TestScheduler; - let service: OpenaireBrokerEventRestService; + let service: NotificationsBrokerEventRestService; let serviceASAny: any; let responseCacheEntry: RequestEntry; let responseCacheEntryB: RequestEntry; @@ -43,10 +43,10 @@ describe('OpenaireBrokerEventRestService', () => { const topic = 'ENRICH!MORE!PID'; const pageInfo = new PageInfo(); - const array = [ openaireBrokerEventObjectMissingPid, openaireBrokerEventObjectMissingPid2 ]; + const array = [ notificationsBrokerEventObjectMissingPid, notificationsBrokerEventObjectMissingPid2 ]; const paginatedList = buildPaginatedList(pageInfo, array); - const brokerEventObjectRD = createSuccessfulRemoteDataObject(openaireBrokerEventObjectMissingPid); - const brokerEventObjectMissingProjectRD = createSuccessfulRemoteDataObject(openaireBrokerEventObjectMissingProjectFound); + const brokerEventObjectRD = createSuccessfulRemoteDataObject(notificationsBrokerEventObjectMissingPid); + const brokerEventObjectMissingProjectRD = createSuccessfulRemoteDataObject(notificationsBrokerEventObjectMissingProjectFound); const paginatedListRD = createSuccessfulRemoteDataObject(paginatedList); const status = 'ACCEPTED'; @@ -99,7 +99,7 @@ describe('OpenaireBrokerEventRestService', () => { http = {} as HttpClient; comparator = {} as any; - service = new OpenaireBrokerEventRestService( + service = new NotificationsBrokerEventRestService( requestService, rdbService, objectCache, @@ -138,7 +138,7 @@ describe('OpenaireBrokerEventRestService', () => { expect(serviceASAny.dataService.searchBy).toHaveBeenCalledWith('findByTopic', options, true, true); }); - it('should return a RemoteData> for the object with the given Topic', () => { + it('should return a RemoteData> for the object with the given Topic', () => { const result = service.getEventsByTopic(topic); const expected = cold('(a)', { a: paginatedListRD @@ -155,15 +155,15 @@ describe('OpenaireBrokerEventRestService', () => { }); it('should proxy the call to dataservice.findById', () => { - service.getEvent(openaireBrokerEventObjectMissingPid.id).subscribe( + service.getEvent(notificationsBrokerEventObjectMissingPid.id).subscribe( (res) => { - expect(serviceASAny.dataService.findById).toHaveBeenCalledWith(openaireBrokerEventObjectMissingPid.id, true, true); + expect(serviceASAny.dataService.findById).toHaveBeenCalledWith(notificationsBrokerEventObjectMissingPid.id, true, true); } ); }); - it('should return a RemoteData for the object with the given URL', () => { - const result = service.getEvent(openaireBrokerEventObjectMissingPid.id); + it('should return a RemoteData for the object with the given URL', () => { + const result = service.getEvent(notificationsBrokerEventObjectMissingPid.id); const expected = cold('(a)', { a: brokerEventObjectRD }); @@ -179,17 +179,17 @@ describe('OpenaireBrokerEventRestService', () => { }); it('should proxy the call to dataservice.patch', () => { - service.patchEvent(status, openaireBrokerEventObjectMissingPid).subscribe( + service.patchEvent(status, notificationsBrokerEventObjectMissingPid).subscribe( (res) => { - expect(serviceASAny.dataService.patch).toHaveBeenCalledWith(openaireBrokerEventObjectMissingPid, operation); + expect(serviceASAny.dataService.patch).toHaveBeenCalledWith(notificationsBrokerEventObjectMissingPid, operation); } ); }); it('should return a RemoteData with HTTP 200', () => { - const result = service.patchEvent(status, openaireBrokerEventObjectMissingPid); + const result = service.patchEvent(status, notificationsBrokerEventObjectMissingPid); const expected = cold('(a|)', { - a: createSuccessfulRemoteDataObject(openaireBrokerEventObjectMissingPid) + a: createSuccessfulRemoteDataObject(notificationsBrokerEventObjectMissingPid) }); expect(result).toBeObservable(expected); }); @@ -203,17 +203,17 @@ describe('OpenaireBrokerEventRestService', () => { }); it('should proxy the call to dataservice.postOnRelated', () => { - service.boundProject(openaireBrokerEventObjectMissingProjectFound.id, requestUUID).subscribe( + service.boundProject(notificationsBrokerEventObjectMissingProjectFound.id, requestUUID).subscribe( (res) => { - expect(serviceASAny.dataService.postOnRelated).toHaveBeenCalledWith(openaireBrokerEventObjectMissingProjectFound.id, requestUUID); + expect(serviceASAny.dataService.postOnRelated).toHaveBeenCalledWith(notificationsBrokerEventObjectMissingProjectFound.id, requestUUID); } ); }); it('should return a RestResponse with HTTP 201', () => { - const result = service.boundProject(openaireBrokerEventObjectMissingProjectFound.id, requestUUID); + const result = service.boundProject(notificationsBrokerEventObjectMissingProjectFound.id, requestUUID); const expected = cold('(a|)', { - a: createSuccessfulRemoteDataObject(openaireBrokerEventObjectMissingProjectFound) + a: createSuccessfulRemoteDataObject(notificationsBrokerEventObjectMissingProjectFound) }); expect(result).toBeObservable(expected); }); @@ -227,15 +227,15 @@ describe('OpenaireBrokerEventRestService', () => { }); it('should proxy the call to dataservice.deleteOnRelated', () => { - service.removeProject(openaireBrokerEventObjectMissingProjectFound.id).subscribe( + service.removeProject(notificationsBrokerEventObjectMissingProjectFound.id).subscribe( (res) => { - expect(serviceASAny.dataService.deleteOnRelated).toHaveBeenCalledWith(openaireBrokerEventObjectMissingProjectFound.id); + expect(serviceASAny.dataService.deleteOnRelated).toHaveBeenCalledWith(notificationsBrokerEventObjectMissingProjectFound.id); } ); }); it('should return a RestResponse with HTTP 204', () => { - const result = service.removeProject(openaireBrokerEventObjectMissingProjectFound.id); + const result = service.removeProject(notificationsBrokerEventObjectMissingProjectFound.id); const expected = cold('(a|)', { a: createSuccessfulRemoteDataObject({}) }); diff --git a/src/app/core/openaire/broker/events/openaire-broker-event-rest.service.ts b/src/app/core/notifications/broker/events/notifications-broker-event-rest.service.ts similarity index 73% rename from src/app/core/openaire/broker/events/openaire-broker-event-rest.service.ts rename to src/app/core/notifications/broker/events/notifications-broker-event-rest.service.ts index 6e944c8038..7f4761009d 100644 --- a/src/app/core/openaire/broker/events/openaire-broker-event-rest.service.ts +++ b/src/app/core/notifications/broker/events/notifications-broker-event-rest.service.ts @@ -17,8 +17,8 @@ import { DataService } from '../../../data/data.service'; import { ChangeAnalyzer } from '../../../data/change-analyzer'; import { DefaultChangeAnalyzer } from '../../../data/default-change-analyzer.service'; import { RemoteData } from '../../../data/remote-data'; -import { OpenaireBrokerEventObject } from '../models/openaire-broker-event.model'; -import { OPENAIRE_BROKER_EVENT_OBJECT } from '../models/openaire-broker-event-object.resource-type'; +import { NotificationsBrokerEventObject } from '../models/notifications-broker-event.model'; +import { NOTIFICATIONS_BROKER_EVENT_OBJECT } from '../models/notifications-broker-event-object.resource-type'; import { FollowLinkConfig } from '../../../../shared/utils/follow-link-config.model'; import { PaginatedList } from '../../../data/paginated-list.model'; import { ReplaceOperation } from 'fast-json-patch'; @@ -29,7 +29,7 @@ import { NoContent } from '../../../shared/NoContent.model'; /** * A private DataService implementation to delegate specific methods to. */ -class DataServiceImpl extends DataService { +class DataServiceImpl extends DataService { /** * The REST endpoint. */ @@ -44,7 +44,7 @@ class DataServiceImpl extends DataService { * @param {HALEndpointService} halService * @param {NotificationsService} notificationsService * @param {HttpClient} http - * @param {ChangeAnalyzer} comparator + * @param {ChangeAnalyzer} comparator */ constructor( protected requestService: RequestService, @@ -54,17 +54,17 @@ class DataServiceImpl extends DataService { protected halService: HALEndpointService, protected notificationsService: NotificationsService, protected http: HttpClient, - protected comparator: ChangeAnalyzer) { + protected comparator: ChangeAnalyzer) { super(); } } /** - * The service handling all OpenAIRE Broker topic REST requests. + * The service handling all Notifications Broker topic REST requests. */ @Injectable() -@dataService(OPENAIRE_BROKER_EVENT_OBJECT) -export class OpenaireBrokerEventRestService { +@dataService(NOTIFICATIONS_BROKER_EVENT_OBJECT) +export class NotificationsBrokerEventRestService { /** * A private DataService implementation to delegate specific methods to. */ @@ -78,7 +78,7 @@ export class OpenaireBrokerEventRestService { * @param {HALEndpointService} halService * @param {NotificationsService} notificationsService * @param {HttpClient} http - * @param {DefaultChangeAnalyzer} comparator + * @param {DefaultChangeAnalyzer} comparator */ constructor( protected requestService: RequestService, @@ -87,23 +87,23 @@ export class OpenaireBrokerEventRestService { protected halService: HALEndpointService, protected notificationsService: NotificationsService, protected http: HttpClient, - protected comparator: DefaultChangeAnalyzer) { + protected comparator: DefaultChangeAnalyzer) { this.dataService = new DataServiceImpl(requestService, rdbService, null, objectCache, halService, notificationsService, http, comparator); } /** - * Return the list of OpenAIRE Broker events by topic. + * Return the list of Notifications Broker events by topic. * * @param topic - * The OpenAIRE Broker topic + * The Notifications Broker topic * @param options * Find list options object. * @param linksToFollow * List of {@link FollowLinkConfig} that indicate which {@link HALLink}s should be automatically resolved. - * @return Observable>> - * The list of OpenAIRE Broker events. + * @return Observable>> + * The list of Notifications Broker events. */ - public getEventsByTopic(topic: string, options: FindListOptions = {}, ...linksToFollow: FollowLinkConfig[]): Observable>> { + public getEventsByTopic(topic: string, options: FindListOptions = {}, ...linksToFollow: FollowLinkConfig[]): Observable>> { options.searchParams = [ { fieldName: 'topic', @@ -121,32 +121,32 @@ export class OpenaireBrokerEventRestService { } /** - * Return a single OpenAIRE Broker event. + * Return a single Notifications Broker event. * * @param id - * The OpenAIRE Broker event id + * The Notifications Broker event id * @param linksToFollow * List of {@link FollowLinkConfig} that indicate which {@link HALLink}s should be automatically resolved - * @return Observable> - * The OpenAIRE Broker event. + * @return Observable> + * The Notifications Broker event. */ - public getEvent(id: string, ...linksToFollow: FollowLinkConfig[]): Observable> { + public getEvent(id: string, ...linksToFollow: FollowLinkConfig[]): Observable> { return this.dataService.findById(id, true, true, ...linksToFollow); } /** - * Save the new status of an OpenAIRE Broker event. + * Save the new status of a Notifications Broker event. * * @param status * The new status - * @param dso OpenaireBrokerEventObject + * @param dso NotificationsBrokerEventObject * The event item * @param reason * The optional reason (not used for now; for future implementation) * @return Observable * The REST response. */ - public patchEvent(status, dso, reason?: string): Observable> { + public patchEvent(status, dso, reason?: string): Observable> { const operation: ReplaceOperation[] = [ { path: '/status', @@ -158,24 +158,24 @@ export class OpenaireBrokerEventRestService { } /** - * Bound a project to an OpenAIRE Broker event publication. + * Bound a project to a Notifications Broker event publication. * * @param itemId - * The Id of the OpenAIRE Broker event + * The Id of the Notifications Broker event * @param projectId * The project Id to bound * @return Observable * The REST response. */ - public boundProject(itemId: string, projectId: string): Observable> { + public boundProject(itemId: string, projectId: string): Observable> { return this.dataService.postOnRelated(itemId, projectId); } /** - * Remove a project from an OpenAIRE Broker event publication. + * Remove a project from a Notifications Broker event publication. * * @param itemId - * The Id of the OpenAIRE Broker event + * The Id of the Notifications Broker event * @return Observable * The REST response. */ diff --git a/src/app/core/openaire/broker/models/openaire-broker-event-object.resource-type.ts b/src/app/core/notifications/broker/models/notifications-broker-event-object.resource-type.ts similarity index 53% rename from src/app/core/openaire/broker/models/openaire-broker-event-object.resource-type.ts rename to src/app/core/notifications/broker/models/notifications-broker-event-object.resource-type.ts index c0be0071eb..2493ae02d1 100644 --- a/src/app/core/openaire/broker/models/openaire-broker-event-object.resource-type.ts +++ b/src/app/core/notifications/broker/models/notifications-broker-event-object.resource-type.ts @@ -1,9 +1,9 @@ import { ResourceType } from '../../../shared/resource-type'; /** - * The resource type for the OpenAIRE Broker event + * The resource type for the Notifications Broker event * * Needs to be in a separate file to prevent circular * dependencies in webpack. */ -export const OPENAIRE_BROKER_EVENT_OBJECT = new ResourceType('nbevent'); +export const NOTIFICATIONS_BROKER_EVENT_OBJECT = new ResourceType('nbevent'); diff --git a/src/app/core/openaire/broker/models/openaire-broker-event.model.ts b/src/app/core/notifications/broker/models/notifications-broker-event.model.ts similarity index 61% rename from src/app/core/openaire/broker/models/openaire-broker-event.model.ts rename to src/app/core/notifications/broker/models/notifications-broker-event.model.ts index 40c65412f5..ed73168e6d 100644 --- a/src/app/core/openaire/broker/models/openaire-broker-event.model.ts +++ b/src/app/core/notifications/broker/models/notifications-broker-event.model.ts @@ -1,7 +1,7 @@ import { Observable } from 'rxjs'; import { autoserialize, autoserializeAs, deserialize } from 'cerialize'; import { CacheableObject } from '../../../cache/object-cache.reducer'; -import { OPENAIRE_BROKER_EVENT_OBJECT } from './openaire-broker-event-object.resource-type'; +import { NOTIFICATIONS_BROKER_EVENT_OBJECT } from './notifications-broker-event-object.resource-type'; import { excludeFromEquals } from '../../../utilities/equals.decorators'; import { ResourceType } from '../../../shared/resource-type'; import { HALLink } from '../../../shared/hal-link.model'; @@ -11,85 +11,92 @@ import { link, typedObject } from '../../../cache/builders/build-decorators'; import { RemoteData } from '../../../data/remote-data'; /** - * The interface representing the OpenAIRE Broker event message + * The interface representing the Notifications Broker event message */ -export interface OpenaireBrokerEventMessageObject { +export interface NotificationsBrokerEventMessageObject { + +} + +/** + * The interface representing the Notifications Broker event message + */ +export interface OpenaireBrokerEventMessageObject{ /** * The type of 'value' */ type: string; /** - * The value suggested by OpenAIRE + * The value suggested by Notifications */ value: string; /** - * The abstract suggested by OpenAIRE + * The abstract suggested by Notifications */ abstract: string; /** - * The project acronym suggested by OpenAIRE + * The project acronym suggested by Notifications */ acronym: string; /** - * The project code suggested by OpenAIRE + * The project code suggested by Notifications */ code: string; /** - * The project funder suggested by OpenAIRE + * The project funder suggested by Notifications */ funder: string; /** - * The project program suggested by OpenAIRE + * The project program suggested by Notifications */ fundingProgram?: string; /** - * The project jurisdiction suggested by OpenAIRE + * The project jurisdiction suggested by Notifications */ jurisdiction: string; /** - * The project title suggested by OpenAIRE + * The project title suggested by Notifications */ title: string; /** - * The OpenAIRE ID. + * The OPENAIRE ID. */ openaireId: string; } /** - * The interface representing the OpenAIRE Broker event model + * The interface representing the Notifications Broker event model */ @typedObject -export class OpenaireBrokerEventObject implements CacheableObject { +export class NotificationsBrokerEventObject implements CacheableObject { /** * A string representing the kind of object, e.g. community, item, … */ - static type = OPENAIRE_BROKER_EVENT_OBJECT; + static type = NOTIFICATIONS_BROKER_EVENT_OBJECT; /** - * The OpenAIRE Broker event uuid inside DSpace + * The Notifications Broker event uuid inside DSpace */ @autoserialize id: string; /** - * The universally unique identifier of this OpenAIRE Broker event + * The universally unique identifier of this Notifications Broker event */ @autoserializeAs(String, 'id') uuid: string; /** - * The OpenAIRE Broker event original id (ex.: the source archive OAI-PMH identifier) + * The Notifications Broker event original id (ex.: the source archive OAI-PMH identifier) */ @autoserialize originalId: string; @@ -107,19 +114,19 @@ export class OpenaireBrokerEventObject implements CacheableObject { trust: number; /** - * The timestamp OpenAIRE Broker event was saved in DSpace + * The timestamp Notifications Broker event was saved in DSpace */ @autoserialize eventDate: string; /** - * The OpenAIRE Broker event status (ACCEPTED, REJECTED, DISCARDED, PENDING) + * The Notifications Broker event status (ACCEPTED, REJECTED, DISCARDED, PENDING) */ @autoserialize status: string; /** - * The suggestion data. Data may vary depending on the topic + * The suggestion data. Data may vary depending on the source */ @autoserialize message: OpenaireBrokerEventMessageObject; diff --git a/src/app/core/openaire/broker/models/openaire-broker-topic-object.resource-type.ts b/src/app/core/notifications/broker/models/notifications-broker-topic-object.resource-type.ts similarity index 53% rename from src/app/core/openaire/broker/models/openaire-broker-topic-object.resource-type.ts rename to src/app/core/notifications/broker/models/notifications-broker-topic-object.resource-type.ts index 58ceb4e671..e7012eee4f 100644 --- a/src/app/core/openaire/broker/models/openaire-broker-topic-object.resource-type.ts +++ b/src/app/core/notifications/broker/models/notifications-broker-topic-object.resource-type.ts @@ -1,9 +1,9 @@ import { ResourceType } from '../../../shared/resource-type'; /** - * The resource type for the OpenAIRE Broker topic + * The resource type for the Notifications Broker topic * * Needs to be in a separate file to prevent circular * dependencies in webpack. */ -export const OPENAIRE_BROKER_TOPIC_OBJECT = new ResourceType('nbtopic'); +export const NOTIFICATIONS_BROKER_TOPIC_OBJECT = new ResourceType('nbtopic'); diff --git a/src/app/core/openaire/broker/models/openaire-broker-topic.model.ts b/src/app/core/notifications/broker/models/notifications-broker-topic.model.ts similarity index 64% rename from src/app/core/openaire/broker/models/openaire-broker-topic.model.ts rename to src/app/core/notifications/broker/models/notifications-broker-topic.model.ts index 3f286e5fea..d1f2e6ff50 100644 --- a/src/app/core/openaire/broker/models/openaire-broker-topic.model.ts +++ b/src/app/core/notifications/broker/models/notifications-broker-topic.model.ts @@ -1,42 +1,42 @@ import { autoserialize, deserialize } from 'cerialize'; import { CacheableObject } from '../../../cache/object-cache.reducer'; -import { OPENAIRE_BROKER_TOPIC_OBJECT } from './openaire-broker-topic-object.resource-type'; +import { NOTIFICATIONS_BROKER_TOPIC_OBJECT } from './notifications-broker-topic-object.resource-type'; import { excludeFromEquals } from '../../../utilities/equals.decorators'; import { ResourceType } from '../../../shared/resource-type'; import { HALLink } from '../../../shared/hal-link.model'; import { typedObject } from '../../../cache/builders/build-decorators'; /** - * The interface representing the OpenAIRE Broker topic model + * The interface representing the Notifications Broker topic model */ @typedObject -export class OpenaireBrokerTopicObject implements CacheableObject { +export class NotificationsBrokerTopicObject implements CacheableObject { /** * A string representing the kind of object, e.g. community, item, … */ - static type = OPENAIRE_BROKER_TOPIC_OBJECT; + static type = NOTIFICATIONS_BROKER_TOPIC_OBJECT; /** - * The OpenAIRE Broker topic id + * The Notifications Broker topic id */ @autoserialize id: string; /** - * The OpenAIRE Broker topic name to display + * The Notifications Broker topic name to display */ @autoserialize name: string; /** - * The date of the last udate from OpenAIRE + * The date of the last udate from Notifications */ @autoserialize lastEvent: string; /** - * The total number of suggestions provided by OpenAIRE for this topic + * The total number of suggestions provided by Notifications for this topic */ @autoserialize totalEvents: number; diff --git a/src/app/core/openaire/broker/topics/openaire-broker-topic-rest.service.spec.ts b/src/app/core/notifications/broker/topics/notifications-broker-topic-rest.service.spec.ts similarity index 77% rename from src/app/core/openaire/broker/topics/openaire-broker-topic-rest.service.spec.ts rename to src/app/core/notifications/broker/topics/notifications-broker-topic-rest.service.spec.ts index 87aa0b42f0..06931e2032 100644 --- a/src/app/core/openaire/broker/topics/openaire-broker-topic-rest.service.spec.ts +++ b/src/app/core/notifications/broker/topics/notifications-broker-topic-rest.service.spec.ts @@ -14,15 +14,15 @@ import { PageInfo } from '../../../shared/page-info.model'; import { HALEndpointService } from '../../../shared/hal-endpoint.service'; import { NotificationsService } from '../../../../shared/notifications/notifications.service'; import { createSuccessfulRemoteDataObject } from '../../../../shared/remote-data.utils'; -import { OpenaireBrokerTopicRestService } from './openaire-broker-topic-rest.service'; +import { NotificationsBrokerTopicRestService } from './notifications-broker-topic-rest.service'; import { - openaireBrokerTopicObjectMoreAbstract, - openaireBrokerTopicObjectMorePid -} from '../../../../shared/mocks/openaire.mock'; + notificationsBrokerTopicObjectMoreAbstract, + notificationsBrokerTopicObjectMorePid +} from '../../../../shared/mocks/notifications.mock'; -describe('OpenaireBrokerTopicRestService', () => { +describe('NotificationsBrokerTopicRestService', () => { let scheduler: TestScheduler; - let service: OpenaireBrokerTopicRestService; + let service: NotificationsBrokerTopicRestService; let responseCacheEntry: RequestEntry; let requestService: RequestService; let rdbService: RemoteDataBuildService; @@ -36,9 +36,9 @@ describe('OpenaireBrokerTopicRestService', () => { const requestUUID = '8b3c913a-5a4b-438b-9181-be1a5b4a1c8a'; const pageInfo = new PageInfo(); - const array = [ openaireBrokerTopicObjectMorePid, openaireBrokerTopicObjectMoreAbstract ]; + const array = [ notificationsBrokerTopicObjectMorePid, notificationsBrokerTopicObjectMoreAbstract ]; const paginatedList = buildPaginatedList(pageInfo, array); - const brokerTopicObjectRD = createSuccessfulRemoteDataObject(openaireBrokerTopicObjectMorePid); + const brokerTopicObjectRD = createSuccessfulRemoteDataObject(notificationsBrokerTopicObjectMorePid); const paginatedListRD = createSuccessfulRemoteDataObject(paginatedList); beforeEach(() => { @@ -72,7 +72,7 @@ describe('OpenaireBrokerTopicRestService', () => { http = {} as HttpClient; comparator = {} as any; - service = new OpenaireBrokerTopicRestService( + service = new NotificationsBrokerTopicRestService( requestService, rdbService, objectCache, @@ -96,7 +96,7 @@ describe('OpenaireBrokerTopicRestService', () => { done(); }); - it('should return a RemoteData> for the object with the given URL', () => { + it('should return a RemoteData> for the object with the given URL', () => { const result = service.getTopics(); const expected = cold('(a)', { a: paginatedListRD @@ -107,16 +107,16 @@ describe('OpenaireBrokerTopicRestService', () => { describe('getTopic', () => { it('should proxy the call to dataservice.findByHref', (done) => { - service.getTopic(openaireBrokerTopicObjectMorePid.id).subscribe( + service.getTopic(notificationsBrokerTopicObjectMorePid.id).subscribe( (res) => { - expect((service as any).dataService.findByHref).toHaveBeenCalledWith(endpointURL + '/' + openaireBrokerTopicObjectMorePid.id, true, true); + expect((service as any).dataService.findByHref).toHaveBeenCalledWith(endpointURL + '/' + notificationsBrokerTopicObjectMorePid.id, true, true); } ); done(); }); - it('should return a RemoteData for the object with the given URL', () => { - const result = service.getTopic(openaireBrokerTopicObjectMorePid.id); + it('should return a RemoteData for the object with the given URL', () => { + const result = service.getTopic(notificationsBrokerTopicObjectMorePid.id); const expected = cold('(a)', { a: brokerTopicObjectRD }); diff --git a/src/app/core/openaire/broker/topics/openaire-broker-topic-rest.service.ts b/src/app/core/notifications/broker/topics/notifications-broker-topic-rest.service.ts similarity index 75% rename from src/app/core/openaire/broker/topics/openaire-broker-topic-rest.service.ts rename to src/app/core/notifications/broker/topics/notifications-broker-topic-rest.service.ts index 3fe3917485..9f0b93cfb3 100644 --- a/src/app/core/openaire/broker/topics/openaire-broker-topic-rest.service.ts +++ b/src/app/core/notifications/broker/topics/notifications-broker-topic-rest.service.ts @@ -17,8 +17,8 @@ import { DataService } from '../../../data/data.service'; import { ChangeAnalyzer } from '../../../data/change-analyzer'; import { DefaultChangeAnalyzer } from '../../../data/default-change-analyzer.service'; import { RemoteData } from '../../../data/remote-data'; -import { OpenaireBrokerTopicObject } from '../models/openaire-broker-topic.model'; -import { OPENAIRE_BROKER_TOPIC_OBJECT } from '../models/openaire-broker-topic-object.resource-type'; +import { NotificationsBrokerTopicObject } from '../models/notifications-broker-topic.model'; +import { NOTIFICATIONS_BROKER_TOPIC_OBJECT } from '../models/notifications-broker-topic-object.resource-type'; import { FollowLinkConfig } from '../../../../shared/utils/follow-link-config.model'; import { PaginatedList } from '../../../data/paginated-list.model'; @@ -27,7 +27,7 @@ import { PaginatedList } from '../../../data/paginated-list.model'; /** * A private DataService implementation to delegate specific methods to. */ -class DataServiceImpl extends DataService { +class DataServiceImpl extends DataService { /** * The REST endpoint. */ @@ -42,7 +42,7 @@ class DataServiceImpl extends DataService { * @param {HALEndpointService} halService * @param {NotificationsService} notificationsService * @param {HttpClient} http - * @param {ChangeAnalyzer} comparator + * @param {ChangeAnalyzer} comparator */ constructor( protected requestService: RequestService, @@ -52,17 +52,17 @@ class DataServiceImpl extends DataService { protected halService: HALEndpointService, protected notificationsService: NotificationsService, protected http: HttpClient, - protected comparator: ChangeAnalyzer) { + protected comparator: ChangeAnalyzer) { super(); } } /** - * The service handling all OpenAIRE Broker topic REST requests. + * The service handling all Notifications Broker topic REST requests. */ @Injectable() -@dataService(OPENAIRE_BROKER_TOPIC_OBJECT) -export class OpenaireBrokerTopicRestService { +@dataService(NOTIFICATIONS_BROKER_TOPIC_OBJECT) +export class NotificationsBrokerTopicRestService { /** * A private DataService implementation to delegate specific methods to. */ @@ -76,7 +76,7 @@ export class OpenaireBrokerTopicRestService { * @param {HALEndpointService} halService * @param {NotificationsService} notificationsService * @param {HttpClient} http - * @param {DefaultChangeAnalyzer} comparator + * @param {DefaultChangeAnalyzer} comparator */ constructor( protected requestService: RequestService, @@ -85,21 +85,21 @@ export class OpenaireBrokerTopicRestService { protected halService: HALEndpointService, protected notificationsService: NotificationsService, protected http: HttpClient, - protected comparator: DefaultChangeAnalyzer) { + protected comparator: DefaultChangeAnalyzer) { this.dataService = new DataServiceImpl(requestService, rdbService, null, objectCache, halService, notificationsService, http, comparator); } /** - * Return the list of OpenAIRE Broker topics. + * Return the list of Notifications Broker topics. * * @param options * Find list options object. * @param linksToFollow * List of {@link FollowLinkConfig} that indicate which {@link HALLink}s should be automatically resolved. - * @return Observable>> - * The list of OpenAIRE Broker topics. + * @return Observable>> + * The list of Notifications Broker topics. */ - public getTopics(options: FindListOptions = {}, ...linksToFollow: FollowLinkConfig[]): Observable>> { + public getTopics(options: FindListOptions = {}, ...linksToFollow: FollowLinkConfig[]): Observable>> { return this.dataService.getBrowseEndpoint(options, 'nbtopics').pipe( take(1), mergeMap((href: string) => this.dataService.findAllByHref(href, options, true, true, ...linksToFollow)), @@ -114,16 +114,16 @@ export class OpenaireBrokerTopicRestService { } /** - * Return a single OpenAIRE Broker topic. + * Return a single Notifications Broker topic. * * @param id - * The OpenAIRE Broker topic id + * The Notifications Broker topic id * @param linksToFollow * List of {@link FollowLinkConfig} that indicate which {@link HALLink}s should be automatically resolved. - * @return Observable> - * The OpenAIRE Broker topic. + * @return Observable> + * The Notifications Broker topic. */ - public getTopic(id: string, ...linksToFollow: FollowLinkConfig[]): Observable> { + public getTopic(id: string, ...linksToFollow: FollowLinkConfig[]): Observable> { const options = {}; return this.dataService.getBrowseEndpoint(options, 'nbtopics').pipe( take(1), diff --git a/src/app/openaire/broker/events/openaire-broker-events.component.html b/src/app/notifications/broker/events/notifications-broker-events.component.html similarity index 60% rename from src/app/openaire/broker/events/openaire-broker-events.component.html rename to src/app/notifications/broker/events/notifications-broker-events.component.html index 05d7722291..a9f51cefd0 100644 --- a/src/app/openaire/broker/events/openaire-broker-events.component.html +++ b/src/app/notifications/broker/events/notifications-broker-events.component.html @@ -1,12 +1,12 @@
-

{{'openaire.events.title'| translate}}

-

{{'openaire.broker.events.description'| translate}}

+

{{'notifications.events.title'| translate}}

+

{{'notifications.broker.events.description'| translate}}

- + - {{'openaire.broker.events.back' | translate}} + {{'notifications.broker.events.back' | translate}}

@@ -14,31 +14,31 @@

- {{'openaire.broker.events.topic' | translate}} {{this.showTopic}} + {{'notifications.broker.events.topic' | translate}} {{this.showTopic}}

- + + (paginationChange)="getNotificationsBrokerEvents()"> - +
- - - - - + + + + + @@ -51,8 +51,8 @@ {{eventElement.title}} @@ -140,9 +140,9 @@ @@ -150,58 +150,58 @@ diff --git a/src/app/openaire/broker/events/openaire-broker-events.component.spec.ts b/src/app/notifications/broker/events/notifications-broker-events.component.spec.ts similarity index 66% rename from src/app/openaire/broker/events/openaire-broker-events.component.spec.ts rename to src/app/notifications/broker/events/notifications-broker-events.component.spec.ts index 267f6a8242..40be083567 100644 --- a/src/app/openaire/broker/events/openaire-broker-events.component.spec.ts +++ b/src/app/notifications/broker/events/notifications-broker-events.component.spec.ts @@ -5,25 +5,25 @@ import { ComponentFixture, inject, TestBed, waitForAsync } from '@angular/core/t import { TranslateModule, TranslateService } from '@ngx-translate/core'; import { NgbModal } from '@ng-bootstrap/ng-bootstrap'; import { of as observableOf } from 'rxjs'; -import { OpenaireBrokerEventRestService } from '../../../core/openaire/broker/events/openaire-broker-event-rest.service'; -import { OpenaireBrokerEventsComponent } from './openaire-broker-events.component'; +import { NotificationsBrokerEventRestService } from '../../../core/notifications/broker/events/notifications-broker-event-rest.service'; +import { NotificationsBrokerEventsComponent } from './notifications-broker-events.component'; import { - getMockOpenaireBrokerEventRestService, + getMockNotificationsBrokerEventRestService, ItemMockPid10, ItemMockPid8, ItemMockPid9, - openaireBrokerEventObjectMissingProjectFound, - openaireBrokerEventObjectMissingProjectNotFound, - OpenaireMockDspaceObject -} from '../../../shared/mocks/openaire.mock'; + notificationsBrokerEventObjectMissingProjectFound, + notificationsBrokerEventObjectMissingProjectNotFound, + NotificationsMockDspaceObject +} from '../../../shared/mocks/notifications.mock'; import { NotificationsServiceStub } from '../../../shared/testing/notifications-service.stub'; import { NotificationsService } from '../../../shared/notifications/notifications.service'; import { getMockTranslateService } from '../../../shared/mocks/translate.service.mock'; import { createTestComponent } from '../../../shared/testing/utils.test'; import { ActivatedRouteStub } from '../../../shared/testing/active-router.stub'; import { PaginationComponentOptions } from '../../../shared/pagination/pagination-component-options.model'; -import { OpenaireBrokerEventObject } from '../../../core/openaire/broker/models/openaire-broker-event.model'; -import { OpenaireBrokerEventData } from '../project-entry-import-modal/project-entry-import-modal.component'; +import { NotificationsBrokerEventObject } from '../../../core/notifications/broker/models/notifications-broker-event.model'; +import { NotificationsBrokerEventData } from '../project-entry-import-modal/project-entry-import-modal.component'; import { TestScheduler } from 'rxjs/testing'; import { getTestScheduler } from 'jasmine-marbles'; import { followLink } from '../../../shared/utils/follow-link-config.model'; @@ -39,9 +39,9 @@ import { SortDirection, SortOptions } from '../../../core/cache/models/sort-opti import { PaginationService } from '../../../core/pagination/pagination.service'; import { PaginationServiceStub } from '../../../shared/testing/pagination-service.stub'; -describe('OpenaireBrokerEventsComponent test suite', () => { - let fixture: ComponentFixture; - let comp: OpenaireBrokerEventsComponent; +describe('NotificationsBrokerEventsComponent test suite', () => { + let fixture: ComponentFixture; + let comp: NotificationsBrokerEventsComponent; let compAsAny: any; let scheduler: TestScheduler; @@ -50,9 +50,9 @@ describe('OpenaireBrokerEventsComponent test suite', () => { close: () => null, dismiss: () => null }; - const openaireBrokerEventRestServiceStub: any = getMockOpenaireBrokerEventRestService(); + const notificationsBrokerEventRestServiceStub: any = getMockNotificationsBrokerEventRestService(); const activatedRouteParams = { - openaireBrokerEventsParams: { + notificationsBrokerEventsParams: { currentPage: 0, pageSize: 10 } @@ -61,19 +61,19 @@ describe('OpenaireBrokerEventsComponent test suite', () => { id: 'ENRICH!MISSING!PROJECT' }; - const events: OpenaireBrokerEventObject[] = [ - openaireBrokerEventObjectMissingProjectFound, - openaireBrokerEventObjectMissingProjectNotFound + const events: NotificationsBrokerEventObject[] = [ + notificationsBrokerEventObjectMissingProjectFound, + notificationsBrokerEventObjectMissingProjectNotFound ]; const paginationService = new PaginationServiceStub(); - function getOpenAireBrokerEventData1(): OpenaireBrokerEventData { + function getNotificationsBrokerEventData1(): NotificationsBrokerEventData { return { - event: openaireBrokerEventObjectMissingProjectFound, - id: openaireBrokerEventObjectMissingProjectFound.id, - title: openaireBrokerEventObjectMissingProjectFound.title, + event: notificationsBrokerEventObjectMissingProjectFound, + id: notificationsBrokerEventObjectMissingProjectFound.id, + title: notificationsBrokerEventObjectMissingProjectFound.title, hasProject: true, - projectTitle: openaireBrokerEventObjectMissingProjectFound.message.title, + projectTitle: notificationsBrokerEventObjectMissingProjectFound.message.title, projectId: ItemMockPid10.id, handle: ItemMockPid10.handle, reason: null, @@ -82,11 +82,11 @@ describe('OpenaireBrokerEventsComponent test suite', () => { }; } - function getOpenAireBrokerEventData2(): OpenaireBrokerEventData { + function getNotificationsBrokerEventData2(): NotificationsBrokerEventData { return { - event: openaireBrokerEventObjectMissingProjectNotFound, - id: openaireBrokerEventObjectMissingProjectNotFound.id, - title: openaireBrokerEventObjectMissingProjectNotFound.title, + event: notificationsBrokerEventObjectMissingProjectNotFound, + id: notificationsBrokerEventObjectMissingProjectNotFound.id, + title: notificationsBrokerEventObjectMissingProjectNotFound.title, hasProject: false, projectTitle: null, projectId: null, @@ -104,17 +104,17 @@ describe('OpenaireBrokerEventsComponent test suite', () => { TranslateModule.forRoot(), ], declarations: [ - OpenaireBrokerEventsComponent, + NotificationsBrokerEventsComponent, TestComponent, ], providers: [ { provide: ActivatedRoute, useValue: new ActivatedRouteStub(activatedRouteParamsMap, activatedRouteParams) }, - { provide: OpenaireBrokerEventRestService, useValue: openaireBrokerEventRestServiceStub }, + { provide: NotificationsBrokerEventRestService, useValue: notificationsBrokerEventRestServiceStub }, { provide: NgbModal, useValue: modalStub }, { provide: NotificationsService, useValue: new NotificationsServiceStub() }, { provide: TranslateService, useValue: getMockTranslateService() }, { provide: PaginationService, useValue: paginationService }, - OpenaireBrokerEventsComponent + NotificationsBrokerEventsComponent ], schemas: [NO_ERRORS_SCHEMA] }).compileComponents().then(); @@ -129,7 +129,7 @@ describe('OpenaireBrokerEventsComponent test suite', () => { // synchronous beforeEach beforeEach(() => { const html = ` - `; + `; testFixture = createTestComponent(html, TestComponent) as ComponentFixture; testComp = testFixture.componentInstance; }); @@ -138,14 +138,14 @@ describe('OpenaireBrokerEventsComponent test suite', () => { testFixture.destroy(); }); - it('should create OpenaireBrokerEventsComponent', inject([OpenaireBrokerEventsComponent], (app: OpenaireBrokerEventsComponent) => { + it('should create NotificationsBrokerEventsComponent', inject([NotificationsBrokerEventsComponent], (app: NotificationsBrokerEventsComponent) => { expect(app).toBeDefined(); })); }); describe('Main tests', () => { beforeEach(() => { - fixture = TestBed.createComponent(OpenaireBrokerEventsComponent); + fixture = TestBed.createComponent(NotificationsBrokerEventsComponent); comp = fixture.componentInstance; compAsAny = comp; }); @@ -159,8 +159,8 @@ describe('OpenaireBrokerEventsComponent test suite', () => { describe('setEventUpdated', () => { it('should update events', () => { const expected = [ - getOpenAireBrokerEventData1(), - getOpenAireBrokerEventData2() + getNotificationsBrokerEventData1(), + getNotificationsBrokerEventData2() ]; scheduler.schedule(() => { compAsAny.setEventUpdated(events); @@ -179,14 +179,14 @@ describe('OpenaireBrokerEventsComponent test suite', () => { it('should call executeAction if a project is present', () => { const action = 'ACCEPTED'; - comp.modalChoice(action, getOpenAireBrokerEventData1(), modalStub); - expect(comp.executeAction).toHaveBeenCalledWith(action, getOpenAireBrokerEventData1()); + comp.modalChoice(action, getNotificationsBrokerEventData1(), modalStub); + expect(comp.executeAction).toHaveBeenCalledWith(action, getNotificationsBrokerEventData1()); }); it('should call openModal if a project is not present', () => { const action = 'ACCEPTED'; - comp.modalChoice(action, getOpenAireBrokerEventData2(), modalStub); - expect(comp.openModal).toHaveBeenCalledWith(action, getOpenAireBrokerEventData2(), modalStub); + comp.modalChoice(action, getNotificationsBrokerEventData2(), modalStub); + expect(comp.openModal).toHaveBeenCalledWith(action, getNotificationsBrokerEventData2(), modalStub); }); }); @@ -197,7 +197,7 @@ describe('OpenaireBrokerEventsComponent test suite', () => { spyOn(compAsAny.modalService, 'open').and.returnValue({ result: new Promise((res, rej) => 'do' ) }); spyOn(comp, 'executeAction'); - comp.openModal(action, getOpenAireBrokerEventData1(), modalStub); + comp.openModal(action, getNotificationsBrokerEventData1(), modalStub); expect(compAsAny.modalService.open).toHaveBeenCalled(); }); }); @@ -211,13 +211,13 @@ describe('OpenaireBrokerEventsComponent test suite', () => { externalSourceEntry: null, label: null, importedObject: observableOf({ - indexableObject: OpenaireMockDspaceObject + indexableObject: NotificationsMockDspaceObject }) } } ); scheduler.schedule(() => { - comp.openModalLookup(getOpenAireBrokerEventData1()); + comp.openModalLookup(getNotificationsBrokerEventData1()); }); scheduler.flush(); @@ -227,27 +227,27 @@ describe('OpenaireBrokerEventsComponent test suite', () => { }); describe('executeAction', () => { - it('should call getOpenaireBrokerEvents on 200 response from REST', () => { + it('should call getNotificationsBrokerEvents on 200 response from REST', () => { const action = 'ACCEPTED'; - spyOn(compAsAny, 'getOpenaireBrokerEvents'); - openaireBrokerEventRestServiceStub.patchEvent.and.returnValue(createSuccessfulRemoteDataObject$({})); + spyOn(compAsAny, 'getNotificationsBrokerEvents'); + notificationsBrokerEventRestServiceStub.patchEvent.and.returnValue(createSuccessfulRemoteDataObject$({})); scheduler.schedule(() => { - comp.executeAction(action, getOpenAireBrokerEventData1()); + comp.executeAction(action, getNotificationsBrokerEventData1()); }); scheduler.flush(); - expect(compAsAny.getOpenaireBrokerEvents).toHaveBeenCalled(); + expect(compAsAny.getNotificationsBrokerEvents).toHaveBeenCalled(); }); }); describe('boundProject', () => { it('should populate the project data inside "eventData"', () => { - const eventData = getOpenAireBrokerEventData2(); + const eventData = getNotificationsBrokerEventData2(); const projectId = 'UUID-23943-34u43-38344'; const projectName = 'Test Project'; const projectHandle = '1000/1000'; - openaireBrokerEventRestServiceStub.boundProject.and.returnValue(createSuccessfulRemoteDataObject$({})); + notificationsBrokerEventRestServiceStub.boundProject.and.returnValue(createSuccessfulRemoteDataObject$({})); scheduler.schedule(() => { comp.boundProject(eventData, projectId, projectName, projectHandle); @@ -263,8 +263,8 @@ describe('OpenaireBrokerEventsComponent test suite', () => { describe('removeProject', () => { it('should remove the project data inside "eventData"', () => { - const eventData = getOpenAireBrokerEventData1(); - openaireBrokerEventRestServiceStub.removeProject.and.returnValue(createNoContentRemoteDataObject$()); + const eventData = getNotificationsBrokerEventData1(); + notificationsBrokerEventRestServiceStub.removeProject.and.returnValue(createNoContentRemoteDataObject$()); scheduler.schedule(() => { comp.removeProject(eventData); @@ -278,8 +278,8 @@ describe('OpenaireBrokerEventsComponent test suite', () => { }); }); - describe('getOpenaireBrokerEvents', () => { - it('should call the "openaireBrokerEventRestService.getEventsByTopic" to take data and "setEventUpdated" to populate eventData', () => { + describe('getNotificationsBrokerEvents', () => { + it('should call the "notificationsBrokerEventRestService.getEventsByTopic" to take data and "setEventUpdated" to populate eventData', () => { comp.paginationConfig = new PaginationComponentOptions(); comp.paginationConfig.currentPage = 1; comp.paginationConfig.pageSize = 20; @@ -297,20 +297,20 @@ describe('OpenaireBrokerEventsComponent test suite', () => { currentPage: comp.paginationConfig.currentPage }); const array = [ - openaireBrokerEventObjectMissingProjectFound, - openaireBrokerEventObjectMissingProjectNotFound, + notificationsBrokerEventObjectMissingProjectFound, + notificationsBrokerEventObjectMissingProjectNotFound, ]; const paginatedList = buildPaginatedList(pageInfo, array); const paginatedListRD = createSuccessfulRemoteDataObject(paginatedList); - openaireBrokerEventRestServiceStub.getEventsByTopic.and.returnValue(observableOf(paginatedListRD)); + notificationsBrokerEventRestServiceStub.getEventsByTopic.and.returnValue(observableOf(paginatedListRD)); spyOn(compAsAny, 'setEventUpdated'); scheduler.schedule(() => { - compAsAny.getOpenaireBrokerEvents(); + compAsAny.getNotificationsBrokerEvents(); }); scheduler.flush(); - expect(compAsAny.openaireBrokerEventRestService.getEventsByTopic).toHaveBeenCalledWith( + expect(compAsAny.notificationsBrokerEventRestService.getEventsByTopic).toHaveBeenCalledWith( activatedRouteParamsMap.id, options, followLink('target'),followLink('related') diff --git a/src/app/openaire/broker/events/openaire-broker-events.component.ts b/src/app/notifications/broker/events/notifications-broker-events.component.ts similarity index 71% rename from src/app/openaire/broker/events/openaire-broker-events.component.ts rename to src/app/notifications/broker/events/notifications-broker-events.component.ts index 14ad175e80..b416664fca 100644 --- a/src/app/openaire/broker/events/openaire-broker-events.component.ts +++ b/src/app/notifications/broker/events/notifications-broker-events.component.ts @@ -11,10 +11,10 @@ import { PaginatedList } from '../../../core/data/paginated-list.model'; import { RemoteData } from '../../../core/data/remote-data'; import { FindListOptions } from '../../../core/data/request.models'; import { - OpenaireBrokerEventMessageObject, - OpenaireBrokerEventObject -} from '../../../core/openaire/broker/models/openaire-broker-event.model'; -import { OpenaireBrokerEventRestService } from '../../../core/openaire/broker/events/openaire-broker-event-rest.service'; + NotificationsBrokerEventObject, + OpenaireBrokerEventMessageObject +} from '../../../core/notifications/broker/models/notifications-broker-event.model'; +import { NotificationsBrokerEventRestService } from '../../../core/notifications/broker/events/notifications-broker-event-rest.service'; import { PaginationComponentOptions } from '../../../shared/pagination/pagination-component-options.model'; import { Metadata } from '../../../core/shared/metadata.utils'; import { followLink } from '../../../shared/utils/follow-link-config.model'; @@ -22,7 +22,7 @@ import { hasValue } from '../../../shared/empty.util'; import { ItemSearchResult } from '../../../shared/object-collection/shared/item-search-result.model'; import { NotificationsService } from '../../../shared/notifications/notifications.service'; import { - OpenaireBrokerEventData, + NotificationsBrokerEventData, ProjectEntryImportModalComponent } from '../project-entry-import-modal/project-entry-import-modal.component'; import { getFirstCompletedRemoteData } from '../../../core/shared/operators'; @@ -31,14 +31,14 @@ import { combineLatest } from 'rxjs/internal/observable/combineLatest'; import { Item } from '../../../core/shared/item.model'; /** - * Component to display the OpenAIRE Broker event list. + * Component to display the Notifications Broker event list. */ @Component({ - selector: 'ds-openaire-broker-events', - templateUrl: './openaire-broker-events.component.html', - styleUrls: ['./openaire-broker-events.scomponent.scss'], + selector: 'ds-notifications-broker-events', + templateUrl: './notifications-broker-events.component.html', + styleUrls: ['./notifications-broker-events.scomponent.scss'], }) -export class OpenaireBrokerEventsComponent implements OnInit { +export class NotificationsBrokerEventsComponent implements OnInit { /** * The pagination system configuration for HTML listing. * @type {PaginationComponentOptions} @@ -50,27 +50,27 @@ export class OpenaireBrokerEventsComponent implements OnInit { pageSizeOptions: [5, 10, 20, 40, 60] }); /** - * The OpenAIRE Broker event list sort options. + * The Notifications Broker event list sort options. * @type {SortOptions} */ public paginationSortConfig: SortOptions = new SortOptions('trust', SortDirection.DESC); /** - * Array to save the presence of a project inside an OpenAIRE Broker event. - * @type {OpenaireBrokerEventData[]>} + * Array to save the presence of a project inside an Notifications Broker event. + * @type {NotificationsBrokerEventData[]>} */ - public eventsUpdated$: BehaviorSubject = new BehaviorSubject([]); + public eventsUpdated$: BehaviorSubject = new BehaviorSubject([]); /** - * The total number of OpenAIRE Broker events. + * The total number of Notifications Broker events. * @type {Observable} */ public totalElements$: Observable; /** - * The topic of the OpenAIRE Broker events; suitable for displaying. + * The topic of the Notifications Broker events; suitable for displaying. * @type {string} */ public showTopic: string; /** - * The topic of the OpenAIRE Broker events; suitable for HTTP calls. + * The topic of the Notifications Broker events; suitable for HTTP calls. * @type {string} */ public topic: string; @@ -114,7 +114,7 @@ export class OpenaireBrokerEventsComponent implements OnInit { * @param {ActivatedRoute} activatedRoute * @param {NgbModal} modalService * @param {NotificationsService} notificationsService - * @param {OpenaireBrokerEventRestService} openaireBrokerEventRestService + * @param {NotificationsBrokerEventRestService} notificationsBrokerEventRestService * @param {PaginationService} paginationService * @param {TranslateService} translateService */ @@ -122,7 +122,7 @@ export class OpenaireBrokerEventsComponent implements OnInit { private activatedRoute: ActivatedRoute, private modalService: NgbModal, private notificationsService: NotificationsService, - private openaireBrokerEventRestService: OpenaireBrokerEventRestService, + private notificationsBrokerEventRestService: NotificationsBrokerEventRestService, private paginationService: PaginationService, private translateService: TranslateService ) { @@ -142,7 +142,7 @@ export class OpenaireBrokerEventsComponent implements OnInit { this.showTopic = id.replace(regEx, '/'); this.topic = id; this.isEventPageLoading.next(false); - this.getOpenaireBrokerEvents(); + this.getNotificationsBrokerEvents(); }); } @@ -162,12 +162,12 @@ export class OpenaireBrokerEventsComponent implements OnInit { * * @param {string} action * the action (can be: ACCEPTED, REJECTED, DISCARDED, PENDING) - * @param {OpenaireBrokerEventData} eventData - * the OpenAIRE Broker event data + * @param {NotificationsBrokerEventData} eventData + * the Notifications Broker event data * @param {any} content * Reference to the modal */ - public modalChoice(action: string, eventData: OpenaireBrokerEventData, content: any): void { + public modalChoice(action: string, eventData: NotificationsBrokerEventData, content: any): void { if (eventData.hasProject) { this.executeAction(action, eventData); } else { @@ -180,12 +180,12 @@ export class OpenaireBrokerEventsComponent implements OnInit { * * @param {string} action * the action (can be: ACCEPTED, REJECTED, DISCARDED, PENDING) - * @param {OpenaireBrokerEventData} eventData - * the OpenAIRE Broker event data + * @param {NotificationsBrokerEventData} eventData + * the Notifications Broker event data * @param {any} content * Reference to the modal */ - public openModal(action: string, eventData: OpenaireBrokerEventData, content: any): void { + public openModal(action: string, eventData: NotificationsBrokerEventData, content: any): void { this.modalService.open(content, { ariaLabelledBy: 'modal-basic-title' }).result.then( (result) => { if (result === 'do') { @@ -203,10 +203,10 @@ export class OpenaireBrokerEventsComponent implements OnInit { /** * Open a modal where the user can select the project. * - * @param {OpenaireBrokerEventData} eventData - * the OpenAIRE Broker event item data + * @param {NotificationsBrokerEventData} eventData + * the Notifications Broker event item data */ - public openModalLookup(eventData: OpenaireBrokerEventData): void { + public openModalLookup(eventData: NotificationsBrokerEventData): void { this.modalRef = this.modalService.open(ProjectEntryImportModalComponent, { size: 'lg' }); @@ -232,22 +232,22 @@ export class OpenaireBrokerEventsComponent implements OnInit { * * @param {string} action * the action (can be: ACCEPTED, REJECTED, DISCARDED, PENDING) - * @param {OpenaireBrokerEventData} eventData - * the OpenAIRE Broker event data + * @param {NotificationsBrokerEventData} eventData + * the Notifications Broker event data */ - public executeAction(action: string, eventData: OpenaireBrokerEventData): void { + public executeAction(action: string, eventData: NotificationsBrokerEventData): void { eventData.isRunning = true; this.subs.push( - this.openaireBrokerEventRestService.patchEvent(action, eventData.event, eventData.reason).pipe(getFirstCompletedRemoteData()) - .subscribe((rd: RemoteData) => { + this.notificationsBrokerEventRestService.patchEvent(action, eventData.event, eventData.reason).pipe(getFirstCompletedRemoteData()) + .subscribe((rd: RemoteData) => { if (rd.isSuccess && rd.statusCode === 200) { this.notificationsService.success( - this.translateService.instant('openaire.broker.event.action.saved') + this.translateService.instant('notifications.broker.event.action.saved') ); - this.getOpenaireBrokerEvents(); + this.getNotificationsBrokerEvents(); } else { this.notificationsService.error( - this.translateService.instant('openaire.broker.event.action.error') + this.translateService.instant('notifications.broker.event.action.error') ); } eventData.isRunning = false; @@ -256,10 +256,10 @@ export class OpenaireBrokerEventsComponent implements OnInit { } /** - * Bound a project to the publication described in the OpenAIRE Broker event calling the REST service. + * Bound a project to the publication described in the Notifications Broker event calling the REST service. * - * @param {OpenaireBrokerEventData} eventData - * the OpenAIRE Broker event item data + * @param {NotificationsBrokerEventData} eventData + * the Notifications Broker event item data * @param {string} projectId * the project Id to bound * @param {string} projectTitle @@ -267,14 +267,14 @@ export class OpenaireBrokerEventsComponent implements OnInit { * @param {string} projectHandle * the project handle */ - public boundProject(eventData: OpenaireBrokerEventData, projectId: string, projectTitle: string, projectHandle: string): void { + public boundProject(eventData: NotificationsBrokerEventData, projectId: string, projectTitle: string, projectHandle: string): void { eventData.isRunning = true; this.subs.push( - this.openaireBrokerEventRestService.boundProject(eventData.id, projectId).pipe(getFirstCompletedRemoteData()) - .subscribe((rd: RemoteData) => { + this.notificationsBrokerEventRestService.boundProject(eventData.id, projectId).pipe(getFirstCompletedRemoteData()) + .subscribe((rd: RemoteData) => { if (rd.isSuccess) { this.notificationsService.success( - this.translateService.instant('openaire.broker.event.project.bounded') + this.translateService.instant('notifications.broker.event.project.bounded') ); eventData.hasProject = true; eventData.projectTitle = projectTitle; @@ -282,7 +282,7 @@ export class OpenaireBrokerEventsComponent implements OnInit { eventData.projectId = projectId; } else { this.notificationsService.error( - this.translateService.instant('openaire.broker.event.project.error') + this.translateService.instant('notifications.broker.event.project.error') ); } eventData.isRunning = false; @@ -291,19 +291,19 @@ export class OpenaireBrokerEventsComponent implements OnInit { } /** - * Remove the bounded project from the publication described in the OpenAIRE Broker event calling the REST service. + * Remove the bounded project from the publication described in the Notifications Broker event calling the REST service. * - * @param {OpenaireBrokerEventData} eventData - * the OpenAIRE Broker event data + * @param {NotificationsBrokerEventData} eventData + * the Notifications Broker event data */ - public removeProject(eventData: OpenaireBrokerEventData): void { + public removeProject(eventData: NotificationsBrokerEventData): void { eventData.isRunning = true; this.subs.push( - this.openaireBrokerEventRestService.removeProject(eventData.id).pipe(getFirstCompletedRemoteData()) - .subscribe((rd: RemoteData) => { + this.notificationsBrokerEventRestService.removeProject(eventData.id).pipe(getFirstCompletedRemoteData()) + .subscribe((rd: RemoteData) => { if (rd.isSuccess) { this.notificationsService.success( - this.translateService.instant('openaire.broker.event.project.removed') + this.translateService.instant('notifications.broker.event.project.removed') ); eventData.hasProject = false; eventData.projectTitle = null; @@ -311,7 +311,7 @@ export class OpenaireBrokerEventsComponent implements OnInit { eventData.projectId = null; } else { this.notificationsService.error( - this.translateService.instant('openaire.broker.event.project.error') + this.translateService.instant('notifications.broker.event.project.error') ); } eventData.isRunning = false; @@ -337,26 +337,26 @@ export class OpenaireBrokerEventsComponent implements OnInit { /** - * Dispatch the OpenAIRE Broker events retrival. + * Dispatch the Notifications Broker events retrival. */ - public getOpenaireBrokerEvents(): void { + public getNotificationsBrokerEvents(): void { this.paginationService.getFindListOptions(this.paginationConfig.id, this.defaultConfig).pipe( distinctUntilChanged(), - switchMap((options: FindListOptions) => this.openaireBrokerEventRestService.getEventsByTopic( + switchMap((options: FindListOptions) => this.notificationsBrokerEventRestService.getEventsByTopic( this.topic, options, followLink('target'), followLink('related') )), getFirstCompletedRemoteData(), - ).subscribe((rd: RemoteData>) => { + ).subscribe((rd: RemoteData>) => { if (rd.hasSucceeded) { this.isEventLoading.next(false); this.totalElements$ = observableOf(rd.payload.totalElements); this.setEventUpdated(rd.payload.page); } else { - throw new Error('Can\'t retrieve OpenAIRE Broker events from the Broker events REST service'); + throw new Error('Can\'t retrieve Notifications Broker events from the Broker events REST service'); } - this.openaireBrokerEventRestService.clearFindByTopicRequests(); + this.notificationsBrokerEventRestService.clearFindByTopicRequests(); }); } @@ -370,15 +370,15 @@ export class OpenaireBrokerEventsComponent implements OnInit { } /** - * Set the project status for the OpenAIRE Broker events. + * Set the project status for the Notifications Broker events. * - * @param {OpenaireBrokerEventObject[]} events - * the OpenAIRE Broker event item + * @param {NotificationsBrokerEventObject[]} events + * the Notifications Broker event item */ - protected setEventUpdated(events: OpenaireBrokerEventObject[]): void { + protected setEventUpdated(events: NotificationsBrokerEventObject[]): void { this.subs.push( from(events).pipe( - mergeMap((event: OpenaireBrokerEventObject) => { + mergeMap((event: NotificationsBrokerEventObject) => { const related$ = event.related.pipe( getFirstCompletedRemoteData(), ); @@ -387,7 +387,7 @@ export class OpenaireBrokerEventsComponent implements OnInit { ); return combineLatest([related$, target$]).pipe( map(([relatedItemRD, targetItemRD]: [RemoteData, RemoteData]) => { - const data: OpenaireBrokerEventData = { + const data: NotificationsBrokerEventData = { event: event, id: event.id, title: event.title, diff --git a/src/app/openaire/broker/events/openaire-broker-events.scomponent.scss b/src/app/notifications/broker/events/notifications-broker-events.scomponent.scss similarity index 100% rename from src/app/openaire/broker/events/openaire-broker-events.scomponent.scss rename to src/app/notifications/broker/events/notifications-broker-events.scomponent.scss diff --git a/src/app/openaire/broker/project-entry-import-modal/project-entry-import-modal.component.html b/src/app/notifications/broker/project-entry-import-modal/project-entry-import-modal.component.html similarity index 100% rename from src/app/openaire/broker/project-entry-import-modal/project-entry-import-modal.component.html rename to src/app/notifications/broker/project-entry-import-modal/project-entry-import-modal.component.html diff --git a/src/app/openaire/broker/project-entry-import-modal/project-entry-import-modal.component.scss b/src/app/notifications/broker/project-entry-import-modal/project-entry-import-modal.component.scss similarity index 100% rename from src/app/openaire/broker/project-entry-import-modal/project-entry-import-modal.component.scss rename to src/app/notifications/broker/project-entry-import-modal/project-entry-import-modal.component.scss diff --git a/src/app/openaire/broker/project-entry-import-modal/project-entry-import-modal.component.spec.ts b/src/app/notifications/broker/project-entry-import-modal/project-entry-import-modal.component.spec.ts similarity index 92% rename from src/app/openaire/broker/project-entry-import-modal/project-entry-import-modal.component.spec.ts rename to src/app/notifications/broker/project-entry-import-modal/project-entry-import-modal.component.spec.ts index e19d0a7c86..7cac576844 100644 --- a/src/app/openaire/broker/project-entry-import-modal/project-entry-import-modal.component.spec.ts +++ b/src/app/notifications/broker/project-entry-import-modal/project-entry-import-modal.component.spec.ts @@ -17,16 +17,16 @@ import { buildPaginatedList } from '../../../core/data/paginated-list.model'; import { PageInfo } from '../../../core/shared/page-info.model'; import { ItemMockPid10, - openaireBrokerEventObjectMissingProjectFound, - OpenaireMockDspaceObject -} from '../../../shared/mocks/openaire.mock'; + notificationsBrokerEventObjectMissingProjectFound, + NotificationsMockDspaceObject +} from '../../../shared/mocks/notifications.mock'; const eventData = { - event: openaireBrokerEventObjectMissingProjectFound, - id: openaireBrokerEventObjectMissingProjectFound.id, - title: openaireBrokerEventObjectMissingProjectFound.title, + event: notificationsBrokerEventObjectMissingProjectFound, + id: notificationsBrokerEventObjectMissingProjectFound.id, + title: notificationsBrokerEventObjectMissingProjectFound.title, hasProject: true, - projectTitle: openaireBrokerEventObjectMissingProjectFound.message.title, + projectTitle: notificationsBrokerEventObjectMissingProjectFound.message.title, projectId: ItemMockPid10.id, handle: ItemMockPid10.handle, reason: null, @@ -36,7 +36,7 @@ const eventData = { const searchString = 'Test project to search'; const pagination = Object.assign( new PaginationComponentOptions(), { - id: 'openaire-project-bound', + id: 'notifications-project-bound', pageSize: 3 } ); @@ -54,7 +54,7 @@ const pageInfo = new PageInfo({ currentPage: 1 }); const array = [ - OpenaireMockDspaceObject, + NotificationsMockDspaceObject, ]; const paginatedList = buildPaginatedList(pageInfo, array); const paginatedListRD = createSuccessfulRemoteDataObject(paginatedList); @@ -143,7 +143,7 @@ describe('ProjectEntryImportModalComponent test suite', () => { spyOn(comp, 'deselectAllLists'); spyOn(comp, 'close'); spyOn(comp.importedObject, 'emit'); - comp.selectedEntity = OpenaireMockDspaceObject; + comp.selectedEntity = NotificationsMockDspaceObject; comp.bound(); expect(comp.importedObject.emit).toHaveBeenCalled(); diff --git a/src/app/openaire/broker/project-entry-import-modal/project-entry-import-modal.component.ts b/src/app/notifications/broker/project-entry-import-modal/project-entry-import-modal.component.ts similarity index 89% rename from src/app/openaire/broker/project-entry-import-modal/project-entry-import-modal.component.ts rename to src/app/notifications/broker/project-entry-import-modal/project-entry-import-modal.component.ts index 5d8cb20c6d..64672fa1fa 100644 --- a/src/app/openaire/broker/project-entry-import-modal/project-entry-import-modal.component.ts +++ b/src/app/notifications/broker/project-entry-import-modal/project-entry-import-modal.component.ts @@ -12,7 +12,11 @@ import { ListableObject } from '../../../shared/object-collection/shared/listabl import { PaginationComponentOptions } from '../../../shared/pagination/pagination-component-options.model'; import { SearchService } from '../../../core/shared/search/search.service'; import { DSpaceObject } from '../../../core/shared/dspace-object.model'; -import { OpenaireBrokerEventObject } from '../../../core/openaire/broker/models/openaire-broker-event.model'; +import { + NotificationsBrokerEventObject, + NotificationsBrokerEventMessageObject, + OpenaireBrokerEventMessageObject, +} from '../../../core/notifications/broker/models/notifications-broker-event.model'; import { hasValue, isNotEmpty } from '../../../shared/empty.util'; import { Item } from '../../../core/shared/item.model'; @@ -30,13 +34,13 @@ export enum ImportType { /** * The data type passed from the parent page */ -export interface OpenaireBrokerEventData { +export interface NotificationsBrokerEventData { /** - * The OpenAIRE Broker event + * The Notifications Broker event */ - event: OpenaireBrokerEventObject; + event: NotificationsBrokerEventObject; /** - * The OpenAIRE Broker event Id (uuid) + * The Notifications Broker event Id (uuid) */ id: string; /** @@ -79,14 +83,14 @@ export interface OpenaireBrokerEventData { templateUrl: './project-entry-import-modal.component.html' }) /** - * Component to display a modal window for linking a project to an OpenAIRE Broker event + * Component to display a modal window for linking a project to an Notifications Broker event * Shows information about the selected project and a selectable list. */ export class ProjectEntryImportModalComponent implements OnInit { /** * The external source entry */ - @Input() externalSourceEntry: OpenaireBrokerEventData; + @Input() externalSourceEntry: NotificationsBrokerEventData; /** * The number of results per page */ @@ -94,7 +98,7 @@ export class ProjectEntryImportModalComponent implements OnInit { /** * The prefix for every i18n key within this modal */ - labelPrefix = 'openaire.broker.event.modal.'; + labelPrefix = 'notifications.broker.event.modal.'; /** * The search configuration to retrieve project */ @@ -126,11 +130,11 @@ export class ProjectEntryImportModalComponent implements OnInit { /** * List ID for selecting local entities */ - entityListId = 'openaire-project-bound'; + entityListId = 'notifications-project-bound'; /** * List ID for selecting local authorities */ - authorityListId = 'openaire-project-bound-authority'; + authorityListId = 'notifications-project-bound-authority'; /** * ImportType enum */ @@ -175,8 +179,9 @@ export class ProjectEntryImportModalComponent implements OnInit { * Component intitialization. */ public ngOnInit(): void { - this.pagination = Object.assign(new PaginationComponentOptions(), { id: 'openaire-project-bound', pageSize: this.pageSize }); - this.projectTitle = (this.externalSourceEntry.projectTitle !== null) ? this.externalSourceEntry.projectTitle : this.externalSourceEntry.event.message.title; + this.pagination = Object.assign(new PaginationComponentOptions(), { id: 'notifications-project-bound', pageSize: this.pageSize }); + this.projectTitle = (this.externalSourceEntry.projectTitle !== null) ? this.externalSourceEntry.projectTitle + : (this.externalSourceEntry.event.message as OpenaireBrokerEventMessageObject).title; this.searchOptions = Object.assign(new PaginatedSearchOptions( { configuration: this.configuration, diff --git a/src/app/openaire/broker/topics/openaire-broker-topics.actions.ts b/src/app/notifications/broker/topics/notifications-broker-topics.actions.ts similarity index 60% rename from src/app/openaire/broker/topics/openaire-broker-topics.actions.ts rename to src/app/notifications/broker/topics/notifications-broker-topics.actions.ts index fd98c6acb8..622ecc8141 100644 --- a/src/app/openaire/broker/topics/openaire-broker-topics.actions.ts +++ b/src/app/notifications/broker/topics/notifications-broker-topics.actions.ts @@ -1,6 +1,6 @@ import { Action } from '@ngrx/store'; import { type } from '../../../shared/ngrx/type'; -import { OpenaireBrokerTopicObject } from '../../../core/openaire/broker/models/openaire-broker-topic.model'; +import { NotificationsBrokerTopicObject } from '../../../core/notifications/broker/models/notifications-broker-topic.model'; /** * For each action type in an action group, make a simple @@ -10,19 +10,19 @@ import { OpenaireBrokerTopicObject } from '../../../core/openaire/broker/models/ * literal types and runs a simple check to guarantee all * action types in the application are unique. */ -export const OpenaireBrokerTopicActionTypes = { - ADD_TOPICS: type('dspace/integration/openaire/broker/topic/ADD_TOPICS'), - RETRIEVE_ALL_TOPICS: type('dspace/integration/openaire/broker/topic/RETRIEVE_ALL_TOPICS'), - RETRIEVE_ALL_TOPICS_ERROR: type('dspace/integration/openaire/broker/topic/RETRIEVE_ALL_TOPICS_ERROR'), +export const NotificationsBrokerTopicActionTypes = { + ADD_TOPICS: type('dspace/integration/notifications/broker/topic/ADD_TOPICS'), + RETRIEVE_ALL_TOPICS: type('dspace/integration/notifications/broker/topic/RETRIEVE_ALL_TOPICS'), + RETRIEVE_ALL_TOPICS_ERROR: type('dspace/integration/notifications/broker/topic/RETRIEVE_ALL_TOPICS_ERROR'), }; /* tslint:disable:max-classes-per-file */ /** - * An ngrx action to retrieve all the OpenAIRE Broker topics. + * An ngrx action to retrieve all the Notifications Broker topics. */ export class RetrieveAllTopicsAction implements Action { - type = OpenaireBrokerTopicActionTypes.RETRIEVE_ALL_TOPICS; + type = NotificationsBrokerTopicActionTypes.RETRIEVE_ALL_TOPICS; payload: { elementsPerPage: number; currentPage: number; @@ -45,20 +45,20 @@ export class RetrieveAllTopicsAction implements Action { } /** - * An ngrx action for retrieving 'all OpenAIRE Broker topics' error. + * An ngrx action for retrieving 'all Notifications Broker topics' error. */ export class RetrieveAllTopicsErrorAction implements Action { - type = OpenaireBrokerTopicActionTypes.RETRIEVE_ALL_TOPICS_ERROR; + type = NotificationsBrokerTopicActionTypes.RETRIEVE_ALL_TOPICS_ERROR; } /** - * An ngrx action to load the OpenAIRE Broker topic objects. + * An ngrx action to load the Notifications Broker topic objects. * Called by the ??? effect. */ export class AddTopicsAction implements Action { - type = OpenaireBrokerTopicActionTypes.ADD_TOPICS; + type = NotificationsBrokerTopicActionTypes.ADD_TOPICS; payload: { - topics: OpenaireBrokerTopicObject[]; + topics: NotificationsBrokerTopicObject[]; totalPages: number; currentPage: number; totalElements: number; @@ -74,9 +74,9 @@ export class AddTopicsAction implements Action { * @param currentPage * the current page * @param totalElements - * the total available OpenAIRE Broker topics + * the total available Notifications Broker topics */ - constructor(topics: OpenaireBrokerTopicObject[], totalPages: number, currentPage: number, totalElements: number) { + constructor(topics: NotificationsBrokerTopicObject[], totalPages: number, currentPage: number, totalElements: number) { this.payload = { topics, totalPages, @@ -93,7 +93,7 @@ export class AddTopicsAction implements Action { * Export a type alias of all actions in this action group * so that reducers can easily compose action types. */ -export type OpenaireBrokerTopicsActions +export type NotificationsBrokerTopicsActions = AddTopicsAction |RetrieveAllTopicsAction |RetrieveAllTopicsErrorAction; diff --git a/src/app/openaire/broker/topics/openaire-broker-topics.component.html b/src/app/notifications/broker/topics/notifications-broker-topics.component.html similarity index 66% rename from src/app/openaire/broker/topics/openaire-broker-topics.component.html rename to src/app/notifications/broker/topics/notifications-broker-topics.component.html index d8321bc932..02371a8a6b 100644 --- a/src/app/openaire/broker/topics/openaire-broker-topics.component.html +++ b/src/app/notifications/broker/topics/notifications-broker-topics.component.html @@ -1,34 +1,34 @@
-

{{'openaire.broker.title'| translate}}

-

{{'openaire.broker.topics.description'| translate}}

+

{{'notifications.broker.title'| translate}}

+

{{'notifications.broker.topics.description'| translate}}

-

{{'openaire.broker.topics'| translate}}

+

{{'notifications.broker.topics'| translate}}

- + + (paginationChange)="getNotificationsBrokerTopics()"> - +
{{'openaire.broker.event.table.trust' | translate}}{{'openaire.broker.event.table.publication' | translate}}{{'openaire.broker.event.table.details' | translate}}{{'openaire.broker.event.table.project-details' | translate}}{{'openaire.broker.event.table.actions' | translate}}{{'notifications.broker.event.table.trust' | translate}}{{'notifications.broker.event.table.publication' | translate}}{{'notifications.broker.event.table.details' | translate}}{{'notifications.broker.event.table.project-details' | translate}}{{'notifications.broker.event.table.actions' | translate}}
-

{{'openaire.broker.event.table.pidtype' | translate}} {{eventElement.event.message.type}}

-

{{'openaire.broker.event.table.pidvalue' | translate}}
+

{{'notifications.broker.event.table.pidtype' | translate}} {{eventElement.event.message.type}}

+

{{'notifications.broker.event.table.pidvalue' | translate}}
{{eventElement.event.message.value}} @@ -60,37 +60,37 @@

-

{{'openaire.broker.event.table.subjectValue' | translate}}
{{eventElement.event.message.value}}

+

{{'notifications.broker.event.table.subjectValue' | translate}}
{{eventElement.event.message.value}}

- {{'openaire.broker.event.table.abstract' | translate}}
+ {{'notifications.broker.event.table.abstract' | translate}}
{{eventElement.event.message.abstract}}

- {{'openaire.broker.event.table.suggestedProject' | translate}} + {{'notifications.broker.event.table.suggestedProject' | translate}}

- {{'openaire.broker.event.table.project' | translate}}
+ {{'notifications.broker.event.table.project' | translate}}
{{eventElement.event.message.title}}

- {{'openaire.broker.event.table.acronym' | translate}} {{eventElement.event.message.acronym}}
- {{'openaire.broker.event.table.code' | translate}} {{eventElement.event.message.code}}
- {{'openaire.broker.event.table.funder' | translate}} {{eventElement.event.message.funder}}
- {{'openaire.broker.event.table.fundingProgram' | translate}} {{eventElement.event.message.fundingProgram}}
- {{'openaire.broker.event.table.jurisdiction' | translate}} {{eventElement.event.message.jurisdiction}} + {{'notifications.broker.event.table.acronym' | translate}} {{eventElement.event.message.acronym}}
+ {{'notifications.broker.event.table.code' | translate}} {{eventElement.event.message.code}}
+ {{'notifications.broker.event.table.funder' | translate}} {{eventElement.event.message.funder}}
+ {{'notifications.broker.event.table.fundingProgram' | translate}} {{eventElement.event.message.fundingProgram}}
+ {{'notifications.broker.event.table.jurisdiction' | translate}} {{eventElement.event.message.jurisdiction}}


- {{(eventElement.hasProject ? 'openaire.broker.event.project.found' : 'openaire.broker.event.project.notFound') | translate}} + {{(eventElement.hasProject ? 'notifications.broker.event.project.found' : 'notifications.broker.event.project.notFound') | translate}} {{eventElement.handle}}
- - - + + + @@ -39,7 +39,7 @@
{{'openaire.broker.table.topic' | translate}}{{'openaire.broker.table.last-event' | translate}}{{'openaire.broker.table.actions' | translate}}{{'notifications.broker.table.topic' | translate}}{{'notifications.broker.table.last-event' | translate}}{{'notifications.broker.table.actions' | translate}}
+ + + + + + + + + + + + + + +
{{'notifications.broker.table.source' | translate}}{{'notifications.broker.table.last-event' | translate}}{{'notifications.broker.table.actions' | translate}}
{{sourceElement.id}}{{sourceElement.lastEvent}} +
+ +
+
+
+
+
+
+
+
+ diff --git a/src/app/notifications/broker/source/notifications-broker-source.component.scss b/src/app/notifications/broker/source/notifications-broker-source.component.scss new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/app/notifications/broker/source/notifications-broker-source.component.spec.ts b/src/app/notifications/broker/source/notifications-broker-source.component.spec.ts new file mode 100644 index 0000000000..7d18c726c5 --- /dev/null +++ b/src/app/notifications/broker/source/notifications-broker-source.component.spec.ts @@ -0,0 +1,25 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { NotificationsBrokerSourceComponent } from './notifications-broker-source.component'; + +describe('NotificationsBrokerSourceComponent', () => { + let component: NotificationsBrokerSourceComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [ NotificationsBrokerSourceComponent ] + }) + .compileComponents(); + }); + + beforeEach(() => { + fixture = TestBed.createComponent(NotificationsBrokerSourceComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/notifications/broker/source/notifications-broker-source.component.ts b/src/app/notifications/broker/source/notifications-broker-source.component.ts new file mode 100644 index 0000000000..070e03f396 --- /dev/null +++ b/src/app/notifications/broker/source/notifications-broker-source.component.ts @@ -0,0 +1,139 @@ +import { Component, OnInit } from '@angular/core'; +import { PaginationService } from '../../../core/pagination/pagination.service'; +import { Observable, Subscription } from 'rxjs'; +import { distinctUntilChanged, take } from 'rxjs/operators'; +import { SortOptions } from '../../../core/cache/models/sort-options.model'; +import { NotificationsBrokerSourceObject } from '../../../core/notifications/broker/models/notifications-broker-source.model'; +import { PaginationComponentOptions } from '../../../shared/pagination/pagination-component-options.model'; +import { NotificationsStateService } from '../../notifications-state.service'; +import { AdminNotificationsBrokerSourcePageParams } from '../../../admin/admin-notifications/admin-notifications-broker-source-page-component/admin-notifications-broker-source-page-resolver.service'; +import { hasValue } from '../../../shared/empty.util'; + +@Component({ + selector: 'ds-notifications-broker-source', + templateUrl: './notifications-broker-source.component.html', + styleUrls: ['./notifications-broker-source.component.scss'] +}) +export class NotificationsBrokerSourceComponent implements OnInit { + + /** + * The pagination system configuration for HTML listing. + * @type {PaginationComponentOptions} + */ + public paginationConfig: PaginationComponentOptions = Object.assign(new PaginationComponentOptions(), { + id: 'btp', + pageSize: 10, + pageSizeOptions: [5, 10, 20, 40, 60] + }); + /** + * The Notifications Broker source list sort options. + * @type {SortOptions} + */ + public paginationSortConfig: SortOptions; + /** + * The Notifications Broker source list. + */ + public sources$: Observable; + /** + * The total number of Notifications Broker sources. + */ + public totalElements$: Observable; + /** + * Array to track all the component subscriptions. Useful to unsubscribe them with 'onDestroy'. + * @type {Array} + */ + protected subs: Subscription[] = []; + + /** + * Initialize the component variables. + * @param {PaginationService} paginationService + * @param {NotificationsStateService} notificationsStateService + */ + constructor( + private paginationService: PaginationService, + private notificationsStateService: NotificationsStateService, + ) { } + + /** + * Component initialization. + */ + ngOnInit(): void { + this.sources$ = this.notificationsStateService.getNotificationsBrokerSource(); + this.totalElements$ = this.notificationsStateService.getNotificationsBrokerSourceTotals(); + } + + /** + * First Notifications Broker source loading after view initialization. + */ + ngAfterViewInit(): void { + this.subs.push( + this.notificationsStateService.isNotificationsBrokerSourceLoaded().pipe( + take(1) + ).subscribe(() => { + this.getNotificationsBrokerSource(); + }) + ); + } + + /** + * Returns the information about the loading status of the Notifications Broker source (if it's running or not). + * + * @return Observable + * 'true' if the source are loading, 'false' otherwise. + */ + public isSourceLoading(): Observable { + return this.notificationsStateService.isNotificationsBrokerSourceLoading(); + } + + /** + * Returns the information about the processing status of the Notifications Broker source (if it's running or not). + * + * @return Observable + * 'true' if there are operations running on the source (ex.: a REST call), 'false' otherwise. + */ + public isSourceProcessing(): Observable { + return this.notificationsStateService.isNotificationsBrokerSourceProcessing(); + } + + /** + * Dispatch the Notifications Broker source retrival. + */ + public getNotificationsBrokerSource(): void { + this.paginationService.getCurrentPagination(this.paginationConfig.id, this.paginationConfig).pipe( + distinctUntilChanged(), + ).subscribe((options: PaginationComponentOptions) => { + this.notificationsStateService.dispatchRetrieveNotificationsBrokerSource( + options.pageSize, + options.currentPage + ); + }); + } + + /** + * Update pagination Config from route params + * + * @param eventsRouteParams + */ + protected updatePaginationFromRouteParams(eventsRouteParams: AdminNotificationsBrokerSourcePageParams) { + if (eventsRouteParams.currentPage) { + this.paginationConfig.currentPage = eventsRouteParams.currentPage; + } + if (eventsRouteParams.pageSize) { + if (this.paginationConfig.pageSizeOptions.includes(eventsRouteParams.pageSize)) { + this.paginationConfig.pageSize = eventsRouteParams.pageSize; + } else { + this.paginationConfig.pageSize = this.paginationConfig.pageSizeOptions[0]; + } + } + } + + /** + * Unsubscribe from all subscriptions. + */ + ngOnDestroy(): void { + this.subs + .filter((sub) => hasValue(sub)) + .forEach((sub) => sub.unsubscribe()); + } + +} diff --git a/src/app/notifications/broker/source/notifications-broker-source.effects.ts b/src/app/notifications/broker/source/notifications-broker-source.effects.ts new file mode 100644 index 0000000000..bd8b3f00cd --- /dev/null +++ b/src/app/notifications/broker/source/notifications-broker-source.effects.ts @@ -0,0 +1,87 @@ +import { Injectable } from '@angular/core'; +import { Store } from '@ngrx/store'; +import { Actions, Effect, ofType } from '@ngrx/effects'; +import { TranslateService } from '@ngx-translate/core'; +import { catchError, map, switchMap, tap, withLatestFrom } from 'rxjs/operators'; +import { of as observableOf } from 'rxjs'; +import { + AddSourceAction, + NotificationsBrokerSourceActionTypes, + RetrieveAllSourceAction, + RetrieveAllSourceErrorAction, +} from './notifications-broker-source.actions'; + +import { NotificationsBrokerSourceObject } from '../../../core/notifications/broker/models/notifications-broker-source.model'; +import { PaginatedList } from '../../../core/data/paginated-list.model'; +import { NotificationsBrokerSourceService } from './notifications-broker-source.service'; +import { NotificationsService } from '../../../shared/notifications/notifications.service'; +import { NotificationsBrokerSourceRestService } from '../../../core/notifications/broker/source/notifications-broker-source-rest.service'; + +/** + * Provides effect methods for the Notifications Broker source actions. + */ +@Injectable() +export class NotificationsBrokerSourceEffects { + + /** + * Retrieve all Notifications Broker source managing pagination and errors. + */ + @Effect() retrieveAllSource$ = this.actions$.pipe( + ofType(NotificationsBrokerSourceActionTypes.RETRIEVE_ALL_SOURCE), + withLatestFrom(this.store$), + switchMap(([action, currentState]: [RetrieveAllSourceAction, any]) => { + return this.notificationsBrokerSourceService.getSources( + action.payload.elementsPerPage, + action.payload.currentPage + ).pipe( + map((sources: PaginatedList) => + new AddSourceAction(sources.page, sources.totalPages, sources.currentPage, sources.totalElements) + ), + catchError((error: Error) => { + if (error) { + console.error(error.message); + } + return observableOf(new RetrieveAllSourceErrorAction()); + }) + ); + }) + ); + + /** + * Show a notification on error. + */ + @Effect({ dispatch: false }) retrieveAllSourceErrorAction$ = this.actions$.pipe( + ofType(NotificationsBrokerSourceActionTypes.RETRIEVE_ALL_SOURCE_ERROR), + tap(() => { + this.notificationsService.error(null, this.translate.get('notifications.broker.source.error.service.retrieve')); + }) + ); + + /** + * Clear find all source requests from cache. + */ + @Effect({ dispatch: false }) addSourceAction$ = this.actions$.pipe( + ofType(NotificationsBrokerSourceActionTypes.ADD_SOURCE), + tap(() => { + this.notificationsBrokerSourceDataService.clearFindAllSourceRequests(); + }) + ); + + /** + * Initialize the effect class variables. + * @param {Actions} actions$ + * @param {Store} store$ + * @param {TranslateService} translate + * @param {NotificationsService} notificationsService + * @param {NotificationsBrokerSourceService} notificationsBrokerSourceService + * @param {NotificationsBrokerSourceRestService} notificationsBrokerSourceDataService + */ + constructor( + private actions$: Actions, + private store$: Store, + private translate: TranslateService, + private notificationsService: NotificationsService, + private notificationsBrokerSourceService: NotificationsBrokerSourceService, + private notificationsBrokerSourceDataService: NotificationsBrokerSourceRestService + ) { } +} diff --git a/src/app/notifications/broker/source/notifications-broker-source.reducer.ts b/src/app/notifications/broker/source/notifications-broker-source.reducer.ts new file mode 100644 index 0000000000..5395796380 --- /dev/null +++ b/src/app/notifications/broker/source/notifications-broker-source.reducer.ts @@ -0,0 +1,72 @@ +import { NotificationsBrokerSourceObject } from '../../../core/notifications/broker/models/notifications-broker-source.model'; +import { NotificationsBrokerSourceActionTypes, NotificationsBrokerSourceActions } from './notifications-broker-source.actions'; + +/** + * The interface representing the Notifications Broker source state. + */ +export interface NotificationsBrokerSourceState { + source: NotificationsBrokerSourceObject[]; + processing: boolean; + loaded: boolean; + totalPages: number; + currentPage: number; + totalElements: number; +} + +/** + * Used for the Notifications Broker source state initialization. + */ +const notificationsBrokerSourceInitialState: NotificationsBrokerSourceState = { + source: [], + processing: false, + loaded: false, + totalPages: 0, + currentPage: 0, + totalElements: 0 +}; + +/** + * The Notifications Broker Source Reducer + * + * @param state + * the current state initialized with notificationsBrokerSourceInitialState + * @param action + * the action to perform on the state + * @return NotificationsBrokerSourceState + * the new state + */ +export function notificationsBrokerSourceReducer(state = notificationsBrokerSourceInitialState, action: NotificationsBrokerSourceActions): NotificationsBrokerSourceState { + switch (action.type) { + case NotificationsBrokerSourceActionTypes.RETRIEVE_ALL_SOURCE: { + return Object.assign({}, state, { + source: [], + processing: true + }); + } + + case NotificationsBrokerSourceActionTypes.ADD_SOURCE: { + return Object.assign({}, state, { + source: action.payload.source, + processing: false, + loaded: true, + totalPages: action.payload.totalPages, + currentPage: state.currentPage, + totalElements: action.payload.totalElements + }); + } + + case NotificationsBrokerSourceActionTypes.RETRIEVE_ALL_SOURCE_ERROR: { + return Object.assign({}, state, { + processing: false, + loaded: true, + totalPages: 0, + currentPage: 0, + totalElements: 0 + }); + } + + default: { + return state; + } + } +} diff --git a/src/app/notifications/broker/source/notifications-broker-source.service.ts b/src/app/notifications/broker/source/notifications-broker-source.service.ts new file mode 100644 index 0000000000..e80643049c --- /dev/null +++ b/src/app/notifications/broker/source/notifications-broker-source.service.ts @@ -0,0 +1,55 @@ +import { Injectable } from '@angular/core'; +import { Observable } from 'rxjs'; +import { find, map } from 'rxjs/operators'; +import { NotificationsBrokerSourceRestService } from '../../../core/notifications/broker/source/notifications-broker-source-rest.service'; +import { SortDirection, SortOptions } from '../../../core/cache/models/sort-options.model'; +import { FindListOptions } from '../../../core/data/request.models'; +import { RemoteData } from '../../../core/data/remote-data'; +import { PaginatedList } from '../../../core/data/paginated-list.model'; +import { NotificationsBrokerSourceObject } from '../../../core/notifications/broker/models/notifications-broker-source.model'; + +/** + * The service handling all Notifications Broker source requests to the REST service. + */ +@Injectable() +export class NotificationsBrokerSourceService { + + /** + * Initialize the service variables. + * @param {NotificationsBrokerSourceRestService} notificationsBrokerSourceRestService + */ + constructor( + private notificationsBrokerSourceRestService: NotificationsBrokerSourceRestService + ) { } + + /** + * Return the list of Notifications Broker source managing pagination and errors. + * + * @param elementsPerPage + * The number of the source per page + * @param currentPage + * The page number to retrieve + * @return Observable> + * The list of Notifications Broker source. + */ + public getSources(elementsPerPage, currentPage): Observable> { + const sortOptions = new SortOptions('name', SortDirection.ASC); + + const findListOptions: FindListOptions = { + elementsPerPage: elementsPerPage, + currentPage: currentPage, + sort: sortOptions + }; + + return this.notificationsBrokerSourceRestService.getSources(findListOptions).pipe( + find((rd: RemoteData>) => !rd.isResponsePending), + map((rd: RemoteData>) => { + if (rd.hasSucceeded) { + return rd.payload; + } else { + throw new Error('Can\'t retrieve Notifications Broker source from the Broker source REST service'); + } + }) + ); + } +} diff --git a/src/app/notifications/broker/topics/notifications-broker-topics.component.html b/src/app/notifications/broker/topics/notifications-broker-topics.component.html index 02371a8a6b..8b27778ee9 100644 --- a/src/app/notifications/broker/topics/notifications-broker-topics.component.html +++ b/src/app/notifications/broker/topics/notifications-broker-topics.component.html @@ -2,7 +2,7 @@

{{'notifications.broker.title'| translate}}

-

{{'notifications.broker.topics.description'| translate}}

+

{{'notifications.broker.topics.description'| translate:{source: sourceId} }}

diff --git a/src/app/notifications/broker/topics/notifications-broker-topics.component.ts b/src/app/notifications/broker/topics/notifications-broker-topics.component.ts index 3bedf6b9d0..f33d3c2fb1 100644 --- a/src/app/notifications/broker/topics/notifications-broker-topics.component.ts +++ b/src/app/notifications/broker/topics/notifications-broker-topics.component.ts @@ -1,7 +1,7 @@ import { Component, OnInit } from '@angular/core'; import { Observable, Subscription } from 'rxjs'; -import { distinctUntilChanged, take } from 'rxjs/operators'; +import { distinctUntilChanged, map, take } from 'rxjs/operators'; import { SortOptions } from '../../../core/cache/models/sort-options.model'; import { NotificationsBrokerTopicObject } from '../../../core/notifications/broker/models/notifications-broker-topic.model'; @@ -10,6 +10,8 @@ import { PaginationComponentOptions } from '../../../shared/pagination/paginatio import { NotificationsStateService } from '../../notifications-state.service'; import { AdminNotificationsBrokerTopicsPageParams } from '../../../admin/admin-notifications/admin-notifications-broker-topics-page/admin-notifications-broker-topics-page-resolver.service'; import { PaginationService } from '../../../core/pagination/pagination.service'; +import { ActivatedRoute } from '@angular/router'; +import { NotificationsBrokerTopicsService } from './notifications-broker-topics.service'; /** * Component to display the Notifications Broker topic list. @@ -48,6 +50,12 @@ export class NotificationsBrokerTopicsComponent implements OnInit { */ protected subs: Subscription[] = []; + /** + * This property represents a sourceId which is used to retrive a topic + * @type {string} + */ + public sourceId: string; + /** * Initialize the component variables. * @param {PaginationService} paginationService @@ -55,8 +63,18 @@ export class NotificationsBrokerTopicsComponent implements OnInit { */ constructor( private paginationService: PaginationService, + private activatedRoute: ActivatedRoute, private notificationsStateService: NotificationsStateService, - ) { } + private notificationsBrokerTopicsService: NotificationsBrokerTopicsService + ) { + this.activatedRoute.paramMap.pipe( + map((params) => params.get('sourceId')), + take(1) + ).subscribe((id: string) => { + this.sourceId = id; + this.notificationsBrokerTopicsService.setSourceId(this.sourceId); + }); + } /** * Component initialization. diff --git a/src/app/notifications/broker/topics/notifications-broker-topics.service.ts b/src/app/notifications/broker/topics/notifications-broker-topics.service.ts index b04229e0d9..80c52a70a9 100644 --- a/src/app/notifications/broker/topics/notifications-broker-topics.service.ts +++ b/src/app/notifications/broker/topics/notifications-broker-topics.service.ts @@ -7,6 +7,7 @@ import { FindListOptions } from '../../../core/data/request.models'; import { RemoteData } from '../../../core/data/remote-data'; import { PaginatedList } from '../../../core/data/paginated-list.model'; import { NotificationsBrokerTopicObject } from '../../../core/notifications/broker/models/notifications-broker-topic.model'; +import { RequestParam } from '../../../core/cache/models/request-param.model'; /** * The service handling all Notifications Broker topic requests to the REST service. @@ -22,6 +23,11 @@ export class NotificationsBrokerTopicsService { private notificationsBrokerTopicRestService: NotificationsBrokerTopicRestService ) { } + /** + * sourceId used to get topics + */ + sourceId: string; + /** * Return the list of Notifications Broker topics managing pagination and errors. * @@ -38,7 +44,8 @@ export class NotificationsBrokerTopicsService { const findListOptions: FindListOptions = { elementsPerPage: elementsPerPage, currentPage: currentPage, - sort: sortOptions + sort: sortOptions, + searchParams: [new RequestParam('source', this.sourceId)] }; return this.notificationsBrokerTopicRestService.getTopics(findListOptions).pipe( @@ -52,4 +59,12 @@ export class NotificationsBrokerTopicsService { }) ); } + + /** + * set sourceId which is used to get topics + * @param sourceId string + */ + setSourceId(sourceId: string) { + this.sourceId = sourceId; + } } diff --git a/src/app/notifications/notifications-state.service.ts b/src/app/notifications/notifications-state.service.ts index c81c924465..cbee503acd 100644 --- a/src/app/notifications/notifications-state.service.ts +++ b/src/app/notifications/notifications-state.service.ts @@ -8,11 +8,19 @@ import { getNotificationsBrokerTopicsTotalsSelector, isNotificationsBrokerTopicsLoadedSelector, notificationsBrokerTopicsObjectSelector, - isNotificationsBrokerTopicsProcessingSelector + isNotificationsBrokerTopicsProcessingSelector, + notificationsBrokerSourceObjectSelector, + isNotificationsBrokerSourceLoadedSelector, + isNotificationsBrokerSourceProcessingSelector, + getNotificationsBrokerSourceTotalPagesSelector, + getNotificationsBrokerSourceCurrentPageSelector, + getNotificationsBrokerSourceTotalsSelector } from './selectors'; import { NotificationsBrokerTopicObject } from '../core/notifications/broker/models/notifications-broker-topic.model'; import { NotificationsState } from './notifications.reducer'; import { RetrieveAllTopicsAction } from './broker/topics/notifications-broker-topics.actions'; +import { NotificationsBrokerSourceObject } from '../core/notifications/broker/models/notifications-broker-source.model'; +import { RetrieveAllSourceAction } from './broker/source/notifications-broker-source.actions'; /** * The service handling the Notifications State. @@ -113,4 +121,92 @@ export class NotificationsStateService { public dispatchRetrieveNotificationsBrokerTopics(elementsPerPage: number, currentPage: number): void { this.store.dispatch(new RetrieveAllTopicsAction(elementsPerPage, currentPage)); } + + // Notifications Broker source + // -------------------------------------------------------------------------- + + /** + * Returns the list of Notifications Broker source from the state. + * + * @return Observable + * The list of Notifications Broker source. + */ + public getNotificationsBrokerSource(): Observable { + return this.store.pipe(select(notificationsBrokerSourceObjectSelector())); + } + + /** + * Returns the information about the loading status of the Notifications Broker source (if it's running or not). + * + * @return Observable + * 'true' if the source are loading, 'false' otherwise. + */ + public isNotificationsBrokerSourceLoading(): Observable { + return this.store.pipe( + select(isNotificationsBrokerSourceLoadedSelector), + map((loaded: boolean) => !loaded) + ); + } + + /** + * Returns the information about the loading status of the Notifications Broker source (whether or not they were loaded). + * + * @return Observable + * 'true' if the source are loaded, 'false' otherwise. + */ + public isNotificationsBrokerSourceLoaded(): Observable { + return this.store.pipe(select(isNotificationsBrokerSourceLoadedSelector)); + } + + /** + * Returns the information about the processing status of the Notifications Broker source (if it's running or not). + * + * @return Observable + * 'true' if there are operations running on the source (ex.: a REST call), 'false' otherwise. + */ + public isNotificationsBrokerSourceProcessing(): Observable { + return this.store.pipe(select(isNotificationsBrokerSourceProcessingSelector)); + } + + /** + * Returns, from the state, the total available pages of the Notifications Broker source. + * + * @return Observable + * The number of the Notifications Broker source pages. + */ + public getNotificationsBrokerSourceTotalPages(): Observable { + return this.store.pipe(select(getNotificationsBrokerSourceTotalPagesSelector)); + } + + /** + * Returns the current page of the Notifications Broker source, from the state. + * + * @return Observable + * The number of the current Notifications Broker source page. + */ + public getNotificationsBrokerSourceCurrentPage(): Observable { + return this.store.pipe(select(getNotificationsBrokerSourceCurrentPageSelector)); + } + + /** + * Returns the total number of the Notifications Broker source. + * + * @return Observable + * The number of the Notifications Broker source. + */ + public getNotificationsBrokerSourceTotals(): Observable { + return this.store.pipe(select(getNotificationsBrokerSourceTotalsSelector)); + } + + /** + * Dispatch a request to change the Notifications Broker source state, retrieving the source from the server. + * + * @param elementsPerPage + * The number of the source per page. + * @param currentPage + * The number of the current page. + */ + public dispatchRetrieveNotificationsBrokerSource(elementsPerPage: number, currentPage: number): void { + this.store.dispatch(new RetrieveAllSourceAction(elementsPerPage, currentPage)); + } } diff --git a/src/app/notifications/notifications.effects.ts b/src/app/notifications/notifications.effects.ts index cbc76a5b3e..39ecded797 100644 --- a/src/app/notifications/notifications.effects.ts +++ b/src/app/notifications/notifications.effects.ts @@ -1,5 +1,7 @@ +import { NotificationsBrokerSourceEffects } from './broker/source/notifications-broker-source.effects'; import { NotificationsBrokerTopicsEffects } from './broker/topics/notifications-broker-topics.effects'; export const notificationsEffects = [ - NotificationsBrokerTopicsEffects + NotificationsBrokerTopicsEffects, + NotificationsBrokerSourceEffects ]; diff --git a/src/app/notifications/notifications.module.ts b/src/app/notifications/notifications.module.ts index 4b0ba3cfd1..63224fdd81 100644 --- a/src/app/notifications/notifications.module.ts +++ b/src/app/notifications/notifications.module.ts @@ -17,6 +17,9 @@ import { NotificationsBrokerEventRestService } from '../core/notifications/broke import { ProjectEntryImportModalComponent } from './broker/project-entry-import-modal/project-entry-import-modal.component'; import { TranslateModule } from '@ngx-translate/core'; import { SearchModule } from '../shared/search/search.module'; +import { NotificationsBrokerSourceComponent } from './broker/source/notifications-broker-source.component'; +import { NotificationsBrokerSourceService } from './broker/source/notifications-broker-source.service'; +import { NotificationsBrokerSourceRestService } from '../core/notifications/broker/source/notifications-broker-source-rest.service'; const MODULES = [ CommonModule, @@ -29,7 +32,8 @@ const MODULES = [ const COMPONENTS = [ NotificationsBrokerTopicsComponent, - NotificationsBrokerEventsComponent + NotificationsBrokerEventsComponent, + NotificationsBrokerSourceComponent ]; const DIRECTIVES = [ ]; @@ -41,7 +45,9 @@ const ENTRY_COMPONENTS = [ const PROVIDERS = [ NotificationsStateService, NotificationsBrokerTopicsService, + NotificationsBrokerSourceService, NotificationsBrokerTopicRestService, + NotificationsBrokerSourceRestService, NotificationsBrokerEventRestService ]; diff --git a/src/app/notifications/notifications.reducer.ts b/src/app/notifications/notifications.reducer.ts index b3dc54d524..27bebbea20 100644 --- a/src/app/notifications/notifications.reducer.ts +++ b/src/app/notifications/notifications.reducer.ts @@ -1,5 +1,5 @@ import { ActionReducerMap, createFeatureSelector } from '@ngrx/store'; - +import { notificationsBrokerSourceReducer, NotificationsBrokerSourceState } from './broker/source/notifications-broker-source.reducer'; import { notificationsBrokerTopicsReducer, NotificationsBrokerTopicState, } from './broker/topics/notifications-broker-topics.reducer'; /** @@ -7,10 +7,12 @@ import { notificationsBrokerTopicsReducer, NotificationsBrokerTopicState, } from */ export interface NotificationsState { 'brokerTopic': NotificationsBrokerTopicState; + 'brokerSource': NotificationsBrokerSourceState; } export const notificationsReducers: ActionReducerMap = { brokerTopic: notificationsBrokerTopicsReducer, + brokerSource: notificationsBrokerSourceReducer }; export const notificationsSelector = createFeatureSelector('notifications'); diff --git a/src/app/notifications/selectors.ts b/src/app/notifications/selectors.ts index 7474aa3adc..0436a35eb3 100644 --- a/src/app/notifications/selectors.ts +++ b/src/app/notifications/selectors.ts @@ -3,6 +3,8 @@ import { subStateSelector } from '../shared/selector.util'; import { notificationsSelector, NotificationsState } from './notifications.reducer'; import { NotificationsBrokerTopicObject } from '../core/notifications/broker/models/notifications-broker-topic.model'; import { NotificationsBrokerTopicState } from './broker/topics/notifications-broker-topics.reducer'; +import { NotificationsBrokerSourceState } from './broker/source/notifications-broker-source.reducer'; +import { NotificationsBrokerSourceObject } from '../core/notifications/broker/models/notifications-broker-source.model'; /** * Returns the Notifications state. @@ -77,3 +79,69 @@ export const getNotificationsBrokerTopicsCurrentPageSelector = createSelector(_g export const getNotificationsBrokerTopicsTotalsSelector = createSelector(_getNotificationsState, (state: NotificationsState) => state.brokerTopic.totalElements ); + +// Notifications Broker source +// ---------------------------------------------------------------------------- + +/** + * Returns the Notifications Broker source State. + * @function notificationsBrokerSourceStateSelector + * @return {NotificationsBrokerSourceState} + */ + export function notificationsBrokerSourceStateSelector(): MemoizedSelector { + return subStateSelector(notificationsSelector, 'brokerSource'); +} + +/** + * Returns the Notifications Broker source list. + * @function notificationsBrokerSourceObjectSelector + * @return {NotificationsBrokerSourceObject[]} + */ +export function notificationsBrokerSourceObjectSelector(): MemoizedSelector { + return subStateSelector(notificationsBrokerSourceStateSelector(), 'source'); +} + +/** + * Returns true if the Notifications Broker source are loaded. + * @function isNotificationsBrokerSourceLoadedSelector + * @return {boolean} + */ +export const isNotificationsBrokerSourceLoadedSelector = createSelector(_getNotificationsState, + (state: NotificationsState) => state.brokerSource.loaded +); + +/** + * Returns true if the deduplication sets are processing. + * @function isDeduplicationSetsProcessingSelector + * @return {boolean} + */ +export const isNotificationsBrokerSourceProcessingSelector = createSelector(_getNotificationsState, + (state: NotificationsState) => state.brokerSource.processing +); + +/** + * Returns the total available pages of Notifications Broker source. + * @function getNotificationsBrokerSourceTotalPagesSelector + * @return {number} + */ +export const getNotificationsBrokerSourceTotalPagesSelector = createSelector(_getNotificationsState, + (state: NotificationsState) => state.brokerSource.totalPages +); + +/** + * Returns the current page of Notifications Broker source. + * @function getNotificationsBrokerSourceCurrentPageSelector + * @return {number} + */ +export const getNotificationsBrokerSourceCurrentPageSelector = createSelector(_getNotificationsState, + (state: NotificationsState) => state.brokerSource.currentPage +); + +/** + * Returns the total number of Notifications Broker source. + * @function getNotificationsBrokerSourceTotalsSelector + * @return {number} + */ +export const getNotificationsBrokerSourceTotalsSelector = createSelector(_getNotificationsState, + (state: NotificationsState) => state.brokerSource.totalElements +); diff --git a/src/assets/i18n/en.json5 b/src/assets/i18n/en.json5 index 674254e605..e04792273b 100644 --- a/src/assets/i18n/en.json5 +++ b/src/assets/i18n/en.json5 @@ -487,6 +487,8 @@ "admin.notifications.broker.page.title": "Notifications Broker", + "admin.notifications.source.breadcrumbs": "Notifications Source", + "admin.search.breadcrumbs": "Administrative Search", "admin.search.collection.edit": "Edit", @@ -2713,14 +2715,20 @@ "none.listelement.badge": "Item", - "notifications.broker.title": "{{source}} Broker", + "notifications.broker.title": "Broker Title", "notifications.broker.topics.description": "Below you can see all the topics received from the subscriptions to {{source}}.", + "notifications.broker.source.description": "Below you can see all the sources.", + "notifications.broker.topics": "Current Topics", + "notifications.broker.source": "Current Sources", + "notifications.broker.table.topic": "Topic", + "notifications.broker.table.source": "Source", + "notifications.broker.table.last-event": "Last Event", "notifications.broker.table.actions": "Actions", @@ -2729,10 +2737,14 @@ "notifications.broker.noTopics": "No topics found.", + "notifications.broker.noSource": "No sources found.", + "notifications.events.title": "{{source}} Broker Suggestions", "notifications.broker.topic.error.service.retrieve": "An error occurred while loading the Notifications Broker topics", + "notifications.broker.source.error.service.retrieve": "An error occurred while loading the Notifications Broker source", + "notifications.broker.events.description": "Below the list of all the suggestions, received from {{source}}, for the selected topic.", "notifications.broker.loading": "Loading ...", From 00f7fa97f1462d5370a50025c63e2dd97cc27d74 Mon Sep 17 00:00:00 2001 From: Pratik Rajkotiya Date: Thu, 10 Mar 2022 11:49:12 +0530 Subject: [PATCH 004/409] [CST-5337] test cases done. --- config/config.yml | 4 +- ...tions-broker-source-page.component.spec.ts | 6 +- ...cations-broker-source-rest.service.spec.ts | 127 +++ ...ifications-broker-source.component.spec.ts | 159 +++- ...otifications-broker-source.reducer.spec.ts | 68 ++ ...otifications-broker-source.service.spec.ts | 68 ++ ...ifications-broker-topics.component.spec.ts | 15 +- .../notifications-broker-topics.component.ts | 9 +- ...otifications-broker-topics.service.spec.ts | 5 +- .../notifications-state.service.spec.ts | 732 ++++++++++++------ src/app/shared/mocks/notifications.mock.ts | 58 ++ 11 files changed, 986 insertions(+), 265 deletions(-) create mode 100644 src/app/core/notifications/broker/source/notifications-broker-source-rest.service.spec.ts create mode 100644 src/app/notifications/broker/source/notifications-broker-source.reducer.spec.ts create mode 100644 src/app/notifications/broker/source/notifications-broker-source.service.spec.ts diff --git a/config/config.yml b/config/config.yml index b5eecd112f..3866797f5d 100644 --- a/config/config.yml +++ b/config/config.yml @@ -1,5 +1,5 @@ rest: - ssl: true - host: api7.dspace.org + ssl: false + host: localhost:8080 port: 443 nameSpace: /server diff --git a/src/app/admin/admin-notifications/admin-notifications-broker-source-page-component/admin-notifications-broker-source-page.component.spec.ts b/src/app/admin/admin-notifications/admin-notifications-broker-source-page-component/admin-notifications-broker-source-page.component.spec.ts index c4a3611c58..f6d3eb20fe 100644 --- a/src/app/admin/admin-notifications/admin-notifications-broker-source-page-component/admin-notifications-broker-source-page.component.spec.ts +++ b/src/app/admin/admin-notifications/admin-notifications-broker-source-page-component/admin-notifications-broker-source-page.component.spec.ts @@ -1,3 +1,4 @@ +import { NO_ERRORS_SCHEMA } from '@angular/core'; import { ComponentFixture, TestBed } from '@angular/core/testing'; import { AdminNotificationsBrokerSourcePageComponent } from './admin-notifications-broker-source-page.component'; @@ -8,7 +9,8 @@ describe('AdminNotificationsBrokerSourcePageComponent', () => { beforeEach(async () => { await TestBed.configureTestingModule({ - declarations: [ AdminNotificationsBrokerSourcePageComponent ] + declarations: [ AdminNotificationsBrokerSourcePageComponent ], + schemas: [NO_ERRORS_SCHEMA] }) .compileComponents(); }); @@ -19,7 +21,7 @@ describe('AdminNotificationsBrokerSourcePageComponent', () => { fixture.detectChanges(); }); - it('should create', () => { + it('should create AdminNotificationsBrokerSourcePageComponent', () => { expect(component).toBeTruthy(); }); }); diff --git a/src/app/core/notifications/broker/source/notifications-broker-source-rest.service.spec.ts b/src/app/core/notifications/broker/source/notifications-broker-source-rest.service.spec.ts new file mode 100644 index 0000000000..984f44bd15 --- /dev/null +++ b/src/app/core/notifications/broker/source/notifications-broker-source-rest.service.spec.ts @@ -0,0 +1,127 @@ +import { HttpClient } from '@angular/common/http'; + +import { TestScheduler } from 'rxjs/testing'; +import { of as observableOf } from 'rxjs'; +import { cold, getTestScheduler } from 'jasmine-marbles'; + +import { RequestService } from '../../../data/request.service'; +import { buildPaginatedList } from '../../../data/paginated-list.model'; +import { RequestEntry } from '../../../data/request.reducer'; +import { RemoteDataBuildService } from '../../../cache/builders/remote-data-build.service'; +import { ObjectCacheService } from '../../../cache/object-cache.service'; +import { RestResponse } from '../../../cache/response.models'; +import { PageInfo } from '../../../shared/page-info.model'; +import { HALEndpointService } from '../../../shared/hal-endpoint.service'; +import { NotificationsService } from '../../../../shared/notifications/notifications.service'; +import { createSuccessfulRemoteDataObject } from '../../../../shared/remote-data.utils'; +import { NotificationsBrokerSourceRestService } from './notifications-broker-source-rest.service'; +import { + notificationsBrokerSourceObjectMoreAbstract, + notificationsBrokerSourceObjectMorePid +} from '../../../../shared/mocks/notifications.mock'; + +describe('NotificationsBrokerSourceRestService', () => { + let scheduler: TestScheduler; + let service: NotificationsBrokerSourceRestService; + let responseCacheEntry: RequestEntry; + let requestService: RequestService; + let rdbService: RemoteDataBuildService; + let objectCache: ObjectCacheService; + let halService: HALEndpointService; + let notificationsService: NotificationsService; + let http: HttpClient; + let comparator: any; + + const endpointURL = 'https://rest.api/rest/api/integration/nbsources'; + const requestUUID = '8b3c913a-5a4b-438b-9181-be1a5b4a1c8a'; + + const pageInfo = new PageInfo(); + const array = [ notificationsBrokerSourceObjectMorePid, notificationsBrokerSourceObjectMoreAbstract ]; + const paginatedList = buildPaginatedList(pageInfo, array); + const brokerSourceObjectRD = createSuccessfulRemoteDataObject(notificationsBrokerSourceObjectMorePid); + const paginatedListRD = createSuccessfulRemoteDataObject(paginatedList); + + beforeEach(() => { + scheduler = getTestScheduler(); + + responseCacheEntry = new RequestEntry(); + responseCacheEntry.response = new RestResponse(true, 200, 'Success'); + requestService = jasmine.createSpyObj('requestService', { + generateRequestId: requestUUID, + send: true, + removeByHrefSubstring: {}, + getByHref: observableOf(responseCacheEntry), + getByUUID: observableOf(responseCacheEntry), + }); + + rdbService = jasmine.createSpyObj('rdbService', { + buildSingle: cold('(a)', { + a: brokerSourceObjectRD + }), + buildList: cold('(a)', { + a: paginatedListRD + }), + }); + + objectCache = {} as ObjectCacheService; + halService = jasmine.createSpyObj('halService', { + getEndpoint: cold('a|', { a: endpointURL }) + }); + + notificationsService = {} as NotificationsService; + http = {} as HttpClient; + comparator = {} as any; + + service = new NotificationsBrokerSourceRestService( + requestService, + rdbService, + objectCache, + halService, + notificationsService, + http, + comparator + ); + + spyOn((service as any).dataService, 'findAllByHref').and.callThrough(); + spyOn((service as any).dataService, 'findByHref').and.callThrough(); + }); + + describe('getSources', () => { + it('should proxy the call to dataservice.findAllByHref', (done) => { + service.getSources().subscribe( + (res) => { + expect((service as any).dataService.findAllByHref).toHaveBeenCalledWith(endpointURL, {}, true, true); + } + ); + done(); + }); + + it('should return a RemoteData> for the object with the given URL', () => { + const result = service.getSources(); + const expected = cold('(a)', { + a: paginatedListRD + }); + expect(result).toBeObservable(expected); + }); + }); + + describe('getSource', () => { + it('should proxy the call to dataservice.findByHref', (done) => { + service.getSource(notificationsBrokerSourceObjectMorePid.id).subscribe( + (res) => { + expect((service as any).dataService.findByHref).toHaveBeenCalledWith(endpointURL + '/' + notificationsBrokerSourceObjectMorePid.id, true, true); + } + ); + done(); + }); + + it('should return a RemoteData for the object with the given URL', () => { + const result = service.getSource(notificationsBrokerSourceObjectMorePid.id); + const expected = cold('(a)', { + a: brokerSourceObjectRD + }); + expect(result).toBeObservable(expected); + }); + }); + +}); diff --git a/src/app/notifications/broker/source/notifications-broker-source.component.spec.ts b/src/app/notifications/broker/source/notifications-broker-source.component.spec.ts index 7d18c726c5..6c0ad42ce8 100644 --- a/src/app/notifications/broker/source/notifications-broker-source.component.spec.ts +++ b/src/app/notifications/broker/source/notifications-broker-source.component.spec.ts @@ -1,25 +1,152 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing'; - +import { CommonModule } from '@angular/common'; +import { Component, NO_ERRORS_SCHEMA } from '@angular/core'; +import { ActivatedRoute } from '@angular/router'; +import { TranslateModule } from '@ngx-translate/core'; +import { of as observableOf } from 'rxjs'; +import { ComponentFixture, inject, TestBed, waitForAsync } from '@angular/core/testing'; +import { createTestComponent } from '../../../shared/testing/utils.test'; +import { + getMockNotificationsStateService, + notificationsBrokerSourceObjectMoreAbstract, + notificationsBrokerSourceObjectMorePid +} from '../../../shared/mocks/notifications.mock'; import { NotificationsBrokerSourceComponent } from './notifications-broker-source.component'; +import { NotificationsStateService } from '../../notifications-state.service'; +import { cold } from 'jasmine-marbles'; +import { PaginationServiceStub } from '../../../shared/testing/pagination-service.stub'; +import { PaginationService } from '../../../core/pagination/pagination.service'; -describe('NotificationsBrokerSourceComponent', () => { - let component: NotificationsBrokerSourceComponent; +describe('NotificationsBrokerSourceComponent test suite', () => { let fixture: ComponentFixture; + let comp: NotificationsBrokerSourceComponent; + let compAsAny: any; + const mockNotificationsStateService = getMockNotificationsStateService(); + const activatedRouteParams = { + notificationsBrokerSourceParams: { + currentPage: 0, + pageSize: 5 + } + }; + const paginationService = new PaginationServiceStub(); - beforeEach(async () => { - await TestBed.configureTestingModule({ - declarations: [ NotificationsBrokerSourceComponent ] - }) - .compileComponents(); + beforeEach(waitForAsync(() => { + TestBed.configureTestingModule({ + imports: [ + CommonModule, + TranslateModule.forRoot(), + ], + declarations: [ + NotificationsBrokerSourceComponent, + TestComponent, + ], + providers: [ + { provide: NotificationsStateService, useValue: mockNotificationsStateService }, + { provide: ActivatedRoute, useValue: { data: observableOf(activatedRouteParams), params: observableOf({}) } }, + { provide: PaginationService, useValue: paginationService }, + NotificationsBrokerSourceComponent + ], + schemas: [NO_ERRORS_SCHEMA] + }).compileComponents().then(() => { + mockNotificationsStateService.getNotificationsBrokerSource.and.returnValue(observableOf([ + notificationsBrokerSourceObjectMorePid, + notificationsBrokerSourceObjectMoreAbstract + ])); + mockNotificationsStateService.getNotificationsBrokerSourceTotalPages.and.returnValue(observableOf(1)); + mockNotificationsStateService.getNotificationsBrokerSourceCurrentPage.and.returnValue(observableOf(0)); + mockNotificationsStateService.getNotificationsBrokerSourceTotals.and.returnValue(observableOf(2)); + mockNotificationsStateService.isNotificationsBrokerSourceLoaded.and.returnValue(observableOf(true)); + mockNotificationsStateService.isNotificationsBrokerSourceLoading.and.returnValue(observableOf(false)); + mockNotificationsStateService.isNotificationsBrokerSourceProcessing.and.returnValue(observableOf(false)); + }); + })); + + // First test to check the correct component creation + describe('', () => { + let testComp: TestComponent; + let testFixture: ComponentFixture; + + // synchronous beforeEach + beforeEach(() => { + const html = ` + `; + testFixture = createTestComponent(html, TestComponent) as ComponentFixture; + testComp = testFixture.componentInstance; + }); + + afterEach(() => { + testFixture.destroy(); + }); + + it('should create NotificationsBrokerSourceComponent', inject([NotificationsBrokerSourceComponent], (app: NotificationsBrokerSourceComponent) => { + expect(app).toBeDefined(); + })); }); - beforeEach(() => { - fixture = TestBed.createComponent(NotificationsBrokerSourceComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); + describe('Main tests running with two Source', () => { + beforeEach(() => { + fixture = TestBed.createComponent(NotificationsBrokerSourceComponent); + comp = fixture.componentInstance; + compAsAny = comp; - it('should create', () => { - expect(component).toBeTruthy(); + }); + + afterEach(() => { + fixture.destroy(); + comp = null; + compAsAny = null; + }); + + it(('Should init component properly'), () => { + comp.ngOnInit(); + fixture.detectChanges(); + + expect(comp.sources$).toBeObservable(cold('(a|)', { + a: [ + notificationsBrokerSourceObjectMorePid, + notificationsBrokerSourceObjectMoreAbstract + ] + })); + expect(comp.totalElements$).toBeObservable(cold('(a|)', { + a: 2 + })); + }); + + it(('Should set data properly after the view init'), () => { + spyOn(compAsAny, 'getNotificationsBrokerSource'); + + comp.ngAfterViewInit(); + fixture.detectChanges(); + + expect(compAsAny.getNotificationsBrokerSource).toHaveBeenCalled(); + }); + + it(('isSourceLoading should return FALSE'), () => { + expect(comp.isSourceLoading()).toBeObservable(cold('(a|)', { + a: false + })); + }); + + it(('isSourceProcessing should return FALSE'), () => { + expect(comp.isSourceProcessing()).toBeObservable(cold('(a|)', { + a: false + })); + }); + + it(('getNotificationsBrokerSource should call the service to dispatch a STATE change'), () => { + comp.ngOnInit(); + fixture.detectChanges(); + + compAsAny.notificationsStateService.dispatchRetrieveNotificationsBrokerSource(comp.paginationConfig.pageSize, comp.paginationConfig.currentPage).and.callThrough(); + expect(compAsAny.notificationsStateService.dispatchRetrieveNotificationsBrokerSource).toHaveBeenCalledWith(comp.paginationConfig.pageSize, comp.paginationConfig.currentPage); + }); }); }); + +// declare a test component +@Component({ + selector: 'ds-test-cmp', + template: `` +}) +class TestComponent { + +} diff --git a/src/app/notifications/broker/source/notifications-broker-source.reducer.spec.ts b/src/app/notifications/broker/source/notifications-broker-source.reducer.spec.ts new file mode 100644 index 0000000000..74bc77d3ec --- /dev/null +++ b/src/app/notifications/broker/source/notifications-broker-source.reducer.spec.ts @@ -0,0 +1,68 @@ +import { + AddSourceAction, + RetrieveAllSourceAction, + RetrieveAllSourceErrorAction + } from './notifications-broker-source.actions'; + import { notificationsBrokerSourceReducer, NotificationsBrokerSourceState } from './notifications-broker-source.reducer'; + import { + notificationsBrokerSourceObjectMoreAbstract, + notificationsBrokerSourceObjectMorePid + } from '../../../shared/mocks/notifications.mock'; + + describe('notificationsBrokerSourceReducer test suite', () => { + let notificationsBrokerSourceInitialState: NotificationsBrokerSourceState; + const elementPerPage = 3; + const currentPage = 0; + + beforeEach(() => { + notificationsBrokerSourceInitialState = { + source: [], + processing: false, + loaded: false, + totalPages: 0, + currentPage: 0, + totalElements: 0 + }; + }); + + it('Action RETRIEVE_ALL_SOURCE should set the State property "processing" to TRUE', () => { + const expectedState = notificationsBrokerSourceInitialState; + expectedState.processing = true; + + const action = new RetrieveAllSourceAction(elementPerPage, currentPage); + const newState = notificationsBrokerSourceReducer(notificationsBrokerSourceInitialState, action); + + expect(newState).toEqual(expectedState); + }); + + it('Action RETRIEVE_ALL_SOURCE_ERROR should change the State to initial State but processing, loaded, and currentPage', () => { + const expectedState = notificationsBrokerSourceInitialState; + expectedState.processing = false; + expectedState.loaded = true; + expectedState.currentPage = 0; + + const action = new RetrieveAllSourceErrorAction(); + const newState = notificationsBrokerSourceReducer(notificationsBrokerSourceInitialState, action); + + expect(newState).toEqual(expectedState); + }); + + it('Action ADD_SOURCE should populate the State with Notifications Broker source', () => { + const expectedState = { + source: [ notificationsBrokerSourceObjectMorePid, notificationsBrokerSourceObjectMoreAbstract ], + processing: false, + loaded: true, + totalPages: 1, + currentPage: 0, + totalElements: 2 + }; + + const action = new AddSourceAction( + [ notificationsBrokerSourceObjectMorePid, notificationsBrokerSourceObjectMoreAbstract ], + 1, 0, 2 + ); + const newState = notificationsBrokerSourceReducer(notificationsBrokerSourceInitialState, action); + + expect(newState).toEqual(expectedState); + }); + }); diff --git a/src/app/notifications/broker/source/notifications-broker-source.service.spec.ts b/src/app/notifications/broker/source/notifications-broker-source.service.spec.ts new file mode 100644 index 0000000000..e94804cbf6 --- /dev/null +++ b/src/app/notifications/broker/source/notifications-broker-source.service.spec.ts @@ -0,0 +1,68 @@ +import { TestBed } from '@angular/core/testing'; +import { of as observableOf } from 'rxjs'; +import { NotificationsBrokerSourceService } from './notifications-broker-source.service'; +import { SortDirection, SortOptions } from '../../../core/cache/models/sort-options.model'; +import { PageInfo } from '../../../core/shared/page-info.model'; +import { FindListOptions } from '../../../core/data/request.models'; +import { + getMockNotificationsBrokerSourceRestService, + notificationsBrokerSourceObjectMoreAbstract, + notificationsBrokerSourceObjectMorePid +} from '../../../shared/mocks/notifications.mock'; +import { createSuccessfulRemoteDataObject } from '../../../shared/remote-data.utils'; +import { cold } from 'jasmine-marbles'; +import { buildPaginatedList } from '../../../core/data/paginated-list.model'; +import { NotificationsBrokerSourceRestService } from '../../../core/notifications/broker/source/notifications-broker-source-rest.service'; +import { RequestParam } from '../../../core/cache/models/request-param.model'; + +describe('NotificationsBrokerSourceService', () => { + let service: NotificationsBrokerSourceService; + let restService: NotificationsBrokerSourceRestService; + let serviceAsAny: any; + let restServiceAsAny: any; + + const pageInfo = new PageInfo(); + const array = [ notificationsBrokerSourceObjectMorePid, notificationsBrokerSourceObjectMoreAbstract ]; + const paginatedList = buildPaginatedList(pageInfo, array); + const paginatedListRD = createSuccessfulRemoteDataObject(paginatedList); + const elementsPerPage = 3; + const currentPage = 0; + + beforeEach(async () => { + TestBed.configureTestingModule({ + providers: [ + { provide: NotificationsBrokerSourceRestService, useClass: getMockNotificationsBrokerSourceRestService }, + { provide: NotificationsBrokerSourceService, useValue: service } + ] + }).compileComponents(); + }); + + beforeEach(() => { + restService = TestBed.get(NotificationsBrokerSourceRestService); + restServiceAsAny = restService; + restServiceAsAny.getSources.and.returnValue(observableOf(paginatedListRD)); + service = new NotificationsBrokerSourceService(restService); + serviceAsAny = service; + }); + + describe('getSources', () => { + it('Should proxy the call to notificationsBrokerSourceRestService.getSources', () => { + const sortOptions = new SortOptions('name', SortDirection.ASC); + const findListOptions: FindListOptions = { + elementsPerPage: elementsPerPage, + currentPage: currentPage, + sort: sortOptions + }; + const result = service.getSources(elementsPerPage, currentPage); + expect((service as any).notificationsBrokerSourceRestService.getSources).toHaveBeenCalledWith(findListOptions); + }); + + it('Should return a paginated list of Notifications Broker Source', () => { + const expected = cold('(a|)', { + a: paginatedList + }); + const result = service.getSources(elementsPerPage, currentPage); + expect(result).toBeObservable(expected); + }); + }); +}); diff --git a/src/app/notifications/broker/topics/notifications-broker-topics.component.spec.ts b/src/app/notifications/broker/topics/notifications-broker-topics.component.spec.ts index 5bbe3b2907..dbb8137321 100644 --- a/src/app/notifications/broker/topics/notifications-broker-topics.component.spec.ts +++ b/src/app/notifications/broker/topics/notifications-broker-topics.component.spec.ts @@ -1,8 +1,8 @@ import { CommonModule } from '@angular/common'; import { Component, NO_ERRORS_SCHEMA } from '@angular/core'; -import { ActivatedRoute } from '@angular/router'; +import { ActivatedRoute, Router } from '@angular/router'; import { TranslateModule } from '@ngx-translate/core'; -import { of as observableOf } from 'rxjs'; +import { of as observableOf, of } from 'rxjs'; import { ComponentFixture, inject, TestBed, waitForAsync } from '@angular/core/testing'; import { createTestComponent } from '../../../shared/testing/utils.test'; import { @@ -15,6 +15,7 @@ import { NotificationsStateService } from '../../notifications-state.service'; import { cold } from 'jasmine-marbles'; import { PaginationServiceStub } from '../../../shared/testing/pagination-service.stub'; import { PaginationService } from '../../../core/pagination/pagination.service'; +import { NotificationsBrokerTopicsService } from './notifications-broker-topics.service'; describe('NotificationsBrokerTopicsComponent test suite', () => { let fixture: ComponentFixture; @@ -41,9 +42,15 @@ describe('NotificationsBrokerTopicsComponent test suite', () => { ], providers: [ { provide: NotificationsStateService, useValue: mockNotificationsStateService }, - { provide: ActivatedRoute, useValue: { data: observableOf(activatedRouteParams), params: observableOf({}) } }, + { provide: ActivatedRoute, useValue: { data: observableOf(activatedRouteParams), snapshot: { + paramMap: { + get: () => 'openaire', + }, + }}}, { provide: PaginationService, useValue: paginationService }, - NotificationsBrokerTopicsComponent + NotificationsBrokerTopicsComponent, + // tslint:disable-next-line: no-empty + { provide: NotificationsBrokerTopicsService, useValue: { setSourceId: (sourceId: string) => { } }} ], schemas: [NO_ERRORS_SCHEMA] }).compileComponents().then(() => { diff --git a/src/app/notifications/broker/topics/notifications-broker-topics.component.ts b/src/app/notifications/broker/topics/notifications-broker-topics.component.ts index f33d3c2fb1..a740ca5c1e 100644 --- a/src/app/notifications/broker/topics/notifications-broker-topics.component.ts +++ b/src/app/notifications/broker/topics/notifications-broker-topics.component.ts @@ -67,19 +67,14 @@ export class NotificationsBrokerTopicsComponent implements OnInit { private notificationsStateService: NotificationsStateService, private notificationsBrokerTopicsService: NotificationsBrokerTopicsService ) { - this.activatedRoute.paramMap.pipe( - map((params) => params.get('sourceId')), - take(1) - ).subscribe((id: string) => { - this.sourceId = id; - this.notificationsBrokerTopicsService.setSourceId(this.sourceId); - }); } /** * Component initialization. */ ngOnInit(): void { + this.sourceId = this.activatedRoute.snapshot.paramMap.get('sourceId'); + this.notificationsBrokerTopicsService.setSourceId(this.sourceId); this.topics$ = this.notificationsStateService.getNotificationsBrokerTopics(); this.totalElements$ = this.notificationsStateService.getNotificationsBrokerTopicsTotals(); } diff --git a/src/app/notifications/broker/topics/notifications-broker-topics.service.spec.ts b/src/app/notifications/broker/topics/notifications-broker-topics.service.spec.ts index 3b780fc173..e5616df320 100644 --- a/src/app/notifications/broker/topics/notifications-broker-topics.service.spec.ts +++ b/src/app/notifications/broker/topics/notifications-broker-topics.service.spec.ts @@ -13,6 +13,7 @@ import { import { createSuccessfulRemoteDataObject } from '../../../shared/remote-data.utils'; import { cold } from 'jasmine-marbles'; import { buildPaginatedList } from '../../../core/data/paginated-list.model'; +import { RequestParam } from '../../../core/cache/models/request-param.model'; describe('NotificationsBrokerTopicsService', () => { let service: NotificationsBrokerTopicsService; @@ -50,8 +51,10 @@ describe('NotificationsBrokerTopicsService', () => { const findListOptions: FindListOptions = { elementsPerPage: elementsPerPage, currentPage: currentPage, - sort: sortOptions + sort: sortOptions, + searchParams: [new RequestParam('source', 'ENRICH!MORE!ABSTRACT')] }; + service.setSourceId('ENRICH!MORE!ABSTRACT'); const result = service.getTopics(elementsPerPage, currentPage); expect((service as any).notificationsBrokerTopicRestService.getTopics).toHaveBeenCalledWith(findListOptions); }); diff --git a/src/app/notifications/notifications-state.service.spec.ts b/src/app/notifications/notifications-state.service.spec.ts index 97d958e243..91048a93ef 100644 --- a/src/app/notifications/notifications-state.service.spec.ts +++ b/src/app/notifications/notifications-state.service.spec.ts @@ -5,11 +5,15 @@ import { cold } from 'jasmine-marbles'; import { notificationsReducers } from './notifications.reducer'; import { NotificationsStateService } from './notifications-state.service'; import { + notificationsBrokerSourceObjectMissingPid, + notificationsBrokerSourceObjectMoreAbstract, + notificationsBrokerSourceObjectMorePid, notificationsBrokerTopicObjectMissingPid, notificationsBrokerTopicObjectMoreAbstract, notificationsBrokerTopicObjectMorePid } from '../shared/mocks/notifications.mock'; import { RetrieveAllTopicsAction } from './broker/topics/notifications-broker-topics.actions'; +import { RetrieveAllSourceAction } from './broker/source/notifications-broker-source.actions'; describe('NotificationsStateService', () => { let service: NotificationsStateService; @@ -17,259 +21,521 @@ describe('NotificationsStateService', () => { let store: any; let initialState: any; - function init(mode: string) { - if (mode === 'empty') { - initialState = { - notifications: { - brokerTopic: { - topics: [], - processing: false, - loaded: false, - totalPages: 0, - currentPage: 0, - totalElements: 0, - totalLoadedPages: 0 + describe('Topis State', () => { + function init(mode: string) { + if (mode === 'empty') { + initialState = { + notifications: { + brokerTopic: { + topics: [], + processing: false, + loaded: false, + totalPages: 0, + currentPage: 0, + totalElements: 0, + totalLoadedPages: 0 + } } - } - }; - } else { - initialState = { - notifications: { - brokerTopic: { - topics: [ + }; + } else { + initialState = { + notifications: { + brokerTopic: { + topics: [ + notificationsBrokerTopicObjectMorePid, + notificationsBrokerTopicObjectMoreAbstract, + notificationsBrokerTopicObjectMissingPid + ], + processing: false, + loaded: true, + totalPages: 1, + currentPage: 1, + totalElements: 3, + totalLoadedPages: 1 + } + } + }; + } + } + + describe('Testing methods with empty topic objects', () => { + beforeEach(async () => { + init('empty'); + TestBed.configureTestingModule({ + imports: [ + StoreModule.forRoot({ notifications: notificationsReducers } as any), + ], + providers: [ + provideMockStore({ initialState }), + { provide: NotificationsStateService, useValue: service } + ] + }).compileComponents(); + }); + + beforeEach(() => { + store = TestBed.get(Store); + service = new NotificationsStateService(store); + serviceAsAny = service; + spyOn(store, 'dispatch'); + }); + + describe('getNotificationsBrokerTopics', () => { + it('Should return an empty array', () => { + const result = service.getNotificationsBrokerTopics(); + const expected = cold('(a)', { + a: [] + }); + expect(result).toBeObservable(expected); + }); + }); + + describe('getNotificationsBrokerTopicsTotalPages', () => { + it('Should return zero (0)', () => { + const result = service.getNotificationsBrokerTopicsTotalPages(); + const expected = cold('(a)', { + a: 0 + }); + expect(result).toBeObservable(expected); + }); + }); + + describe('getNotificationsBrokerTopicsCurrentPage', () => { + it('Should return minus one (0)', () => { + const result = service.getNotificationsBrokerTopicsCurrentPage(); + const expected = cold('(a)', { + a: 0 + }); + expect(result).toBeObservable(expected); + }); + }); + + describe('getNotificationsBrokerTopicsTotals', () => { + it('Should return zero (0)', () => { + const result = service.getNotificationsBrokerTopicsTotals(); + const expected = cold('(a)', { + a: 0 + }); + expect(result).toBeObservable(expected); + }); + }); + + describe('isNotificationsBrokerTopicsLoading', () => { + it('Should return TRUE', () => { + const result = service.isNotificationsBrokerTopicsLoading(); + const expected = cold('(a)', { + a: true + }); + expect(result).toBeObservable(expected); + }); + }); + + describe('isNotificationsBrokerTopicsLoaded', () => { + it('Should return FALSE', () => { + const result = service.isNotificationsBrokerTopicsLoaded(); + const expected = cold('(a)', { + a: false + }); + expect(result).toBeObservable(expected); + }); + }); + + describe('isNotificationsBrokerTopicsProcessing', () => { + it('Should return FALSE', () => { + const result = service.isNotificationsBrokerTopicsProcessing(); + const expected = cold('(a)', { + a: false + }); + expect(result).toBeObservable(expected); + }); + }); + }); + + describe('Testing methods with topic objects', () => { + beforeEach(async () => { + init('full'); + TestBed.configureTestingModule({ + imports: [ + StoreModule.forRoot({ notifications: notificationsReducers } as any), + ], + providers: [ + provideMockStore({ initialState }), + { provide: NotificationsStateService, useValue: service } + ] + }).compileComponents(); + }); + + beforeEach(() => { + store = TestBed.get(Store); + service = new NotificationsStateService(store); + serviceAsAny = service; + spyOn(store, 'dispatch'); + }); + + describe('getNotificationsBrokerTopics', () => { + it('Should return an array of topics', () => { + const result = service.getNotificationsBrokerTopics(); + const expected = cold('(a)', { + a: [ notificationsBrokerTopicObjectMorePid, notificationsBrokerTopicObjectMoreAbstract, notificationsBrokerTopicObjectMissingPid - ], - processing: false, - loaded: true, - totalPages: 1, - currentPage: 1, - totalElements: 3, - totalLoadedPages: 1 - } - } - }; - } - } - - describe('Testing methods with empty topic objects', () => { - beforeEach(async () => { - init('empty'); - TestBed.configureTestingModule({ - imports: [ - StoreModule.forRoot({ notifications: notificationsReducers } as any), - ], - providers: [ - provideMockStore({ initialState }), - { provide: NotificationsStateService, useValue: service } - ] - }).compileComponents(); - }); - - beforeEach(() => { - store = TestBed.get(Store); - service = new NotificationsStateService(store); - serviceAsAny = service; - spyOn(store, 'dispatch'); - }); - - describe('getNotificationsBrokerTopics', () => { - it('Should return an empty array', () => { - const result = service.getNotificationsBrokerTopics(); - const expected = cold('(a)', { - a: [] + ] + }); + expect(result).toBeObservable(expected); + }); + }); + + describe('getNotificationsBrokerTopicsTotalPages', () => { + it('Should return one (1)', () => { + const result = service.getNotificationsBrokerTopicsTotalPages(); + const expected = cold('(a)', { + a: 1 + }); + expect(result).toBeObservable(expected); + }); + }); + + describe('getNotificationsBrokerTopicsCurrentPage', () => { + it('Should return minus zero (1)', () => { + const result = service.getNotificationsBrokerTopicsCurrentPage(); + const expected = cold('(a)', { + a: 1 + }); + expect(result).toBeObservable(expected); + }); + }); + + describe('getNotificationsBrokerTopicsTotals', () => { + it('Should return three (3)', () => { + const result = service.getNotificationsBrokerTopicsTotals(); + const expected = cold('(a)', { + a: 3 + }); + expect(result).toBeObservable(expected); + }); + }); + + describe('isNotificationsBrokerTopicsLoading', () => { + it('Should return FALSE', () => { + const result = service.isNotificationsBrokerTopicsLoading(); + const expected = cold('(a)', { + a: false + }); + expect(result).toBeObservable(expected); + }); + }); + + describe('isNotificationsBrokerTopicsLoaded', () => { + it('Should return TRUE', () => { + const result = service.isNotificationsBrokerTopicsLoaded(); + const expected = cold('(a)', { + a: true + }); + expect(result).toBeObservable(expected); + }); + }); + + describe('isNotificationsBrokerTopicsProcessing', () => { + it('Should return FALSE', () => { + const result = service.isNotificationsBrokerTopicsProcessing(); + const expected = cold('(a)', { + a: false + }); + expect(result).toBeObservable(expected); }); - expect(result).toBeObservable(expected); }); }); - describe('getNotificationsBrokerTopicsTotalPages', () => { - it('Should return zero (0)', () => { - const result = service.getNotificationsBrokerTopicsTotalPages(); - const expected = cold('(a)', { - a: 0 - }); - expect(result).toBeObservable(expected); - }); - }); - - describe('getNotificationsBrokerTopicsCurrentPage', () => { - it('Should return minus one (0)', () => { - const result = service.getNotificationsBrokerTopicsCurrentPage(); - const expected = cold('(a)', { - a: 0 - }); - expect(result).toBeObservable(expected); - }); - }); - - describe('getNotificationsBrokerTopicsTotals', () => { - it('Should return zero (0)', () => { - const result = service.getNotificationsBrokerTopicsTotals(); - const expected = cold('(a)', { - a: 0 - }); - expect(result).toBeObservable(expected); - }); - }); - - describe('isNotificationsBrokerTopicsLoading', () => { - it('Should return TRUE', () => { - const result = service.isNotificationsBrokerTopicsLoading(); - const expected = cold('(a)', { - a: true - }); - expect(result).toBeObservable(expected); - }); - }); - - describe('isNotificationsBrokerTopicsLoaded', () => { - it('Should return FALSE', () => { - const result = service.isNotificationsBrokerTopicsLoaded(); - const expected = cold('(a)', { - a: false - }); - expect(result).toBeObservable(expected); - }); - }); - - describe('isNotificationsBrokerTopicsProcessing', () => { - it('Should return FALSE', () => { - const result = service.isNotificationsBrokerTopicsProcessing(); - const expected = cold('(a)', { - a: false - }); - expect(result).toBeObservable(expected); - }); - }); - }); - - describe('Testing methods with topic objects', () => { - beforeEach(async () => { - init('full'); - TestBed.configureTestingModule({ - imports: [ - StoreModule.forRoot({ notifications: notificationsReducers } as any), - ], - providers: [ - provideMockStore({ initialState }), - { provide: NotificationsStateService, useValue: service } - ] - }).compileComponents(); - }); - - beforeEach(() => { - store = TestBed.get(Store); - service = new NotificationsStateService(store); - serviceAsAny = service; - spyOn(store, 'dispatch'); - }); - - describe('getNotificationsBrokerTopics', () => { - it('Should return an array of topics', () => { - const result = service.getNotificationsBrokerTopics(); - const expected = cold('(a)', { - a: [ - notificationsBrokerTopicObjectMorePid, - notificationsBrokerTopicObjectMoreAbstract, - notificationsBrokerTopicObjectMissingPid + describe('Testing the topic dispatch methods', () => { + beforeEach(async () => { + init('full'); + TestBed.configureTestingModule({ + imports: [ + StoreModule.forRoot({ notifications: notificationsReducers } as any), + ], + providers: [ + provideMockStore({ initialState }), + { provide: NotificationsStateService, useValue: service } ] - }); - expect(result).toBeObservable(expected); + }).compileComponents(); }); - }); - describe('getNotificationsBrokerTopicsTotalPages', () => { - it('Should return one (1)', () => { - const result = service.getNotificationsBrokerTopicsTotalPages(); - const expected = cold('(a)', { - a: 1 - }); - expect(result).toBeObservable(expected); + beforeEach(() => { + store = TestBed.get(Store); + service = new NotificationsStateService(store); + serviceAsAny = service; + spyOn(store, 'dispatch'); }); - }); - describe('getNotificationsBrokerTopicsCurrentPage', () => { - it('Should return minus zero (1)', () => { - const result = service.getNotificationsBrokerTopicsCurrentPage(); - const expected = cold('(a)', { - a: 1 + describe('dispatchRetrieveNotificationsBrokerTopics', () => { + it('Should call store.dispatch', () => { + const elementsPerPage = 3; + const currentPage = 1; + const action = new RetrieveAllTopicsAction(elementsPerPage, currentPage); + service.dispatchRetrieveNotificationsBrokerTopics(elementsPerPage, currentPage); + expect(serviceAsAny.store.dispatch).toHaveBeenCalledWith(action); }); - expect(result).toBeObservable(expected); - }); - }); - - describe('getNotificationsBrokerTopicsTotals', () => { - it('Should return three (3)', () => { - const result = service.getNotificationsBrokerTopicsTotals(); - const expected = cold('(a)', { - a: 3 - }); - expect(result).toBeObservable(expected); - }); - }); - - describe('isNotificationsBrokerTopicsLoading', () => { - it('Should return FALSE', () => { - const result = service.isNotificationsBrokerTopicsLoading(); - const expected = cold('(a)', { - a: false - }); - expect(result).toBeObservable(expected); - }); - }); - - describe('isNotificationsBrokerTopicsLoaded', () => { - it('Should return TRUE', () => { - const result = service.isNotificationsBrokerTopicsLoaded(); - const expected = cold('(a)', { - a: true - }); - expect(result).toBeObservable(expected); - }); - }); - - describe('isNotificationsBrokerTopicsProcessing', () => { - it('Should return FALSE', () => { - const result = service.isNotificationsBrokerTopicsProcessing(); - const expected = cold('(a)', { - a: false - }); - expect(result).toBeObservable(expected); }); }); }); - describe('Testing the topic dispatch methods', () => { - beforeEach(async () => { - init('full'); - TestBed.configureTestingModule({ - imports: [ - StoreModule.forRoot({ notifications: notificationsReducers } as any), - ], - providers: [ - provideMockStore({ initialState }), - { provide: NotificationsStateService, useValue: service } - ] - }).compileComponents(); - }); + describe('Source State', () => { + function init(mode: string) { + if (mode === 'empty') { + initialState = { + notifications: { + brokerSource: { + source: [], + processing: false, + loaded: false, + totalPages: 0, + currentPage: 0, + totalElements: 0, + totalLoadedPages: 0 + } + } + }; + } else { + initialState = { + notifications: { + brokerSource: { + source: [ + notificationsBrokerSourceObjectMorePid, + notificationsBrokerSourceObjectMoreAbstract, + notificationsBrokerSourceObjectMissingPid + ], + processing: false, + loaded: true, + totalPages: 1, + currentPage: 1, + totalElements: 3, + totalLoadedPages: 1 + } + } + }; + } + } - beforeEach(() => { - store = TestBed.get(Store); - service = new NotificationsStateService(store); - serviceAsAny = service; - spyOn(store, 'dispatch'); - }); + describe('Testing methods with empty source objects', () => { + beforeEach(async () => { + init('empty'); + TestBed.configureTestingModule({ + imports: [ + StoreModule.forRoot({ notifications: notificationsReducers } as any), + ], + providers: [ + provideMockStore({ initialState }), + { provide: NotificationsStateService, useValue: service } + ] + }).compileComponents(); + }); - describe('dispatchRetrieveNotificationsBrokerTopics', () => { - it('Should call store.dispatch', () => { - const elementsPerPage = 3; - const currentPage = 1; - const action = new RetrieveAllTopicsAction(elementsPerPage, currentPage); - service.dispatchRetrieveNotificationsBrokerTopics(elementsPerPage, currentPage); - expect(serviceAsAny.store.dispatch).toHaveBeenCalledWith(action); + beforeEach(() => { + store = TestBed.get(Store); + service = new NotificationsStateService(store); + serviceAsAny = service; + spyOn(store, 'dispatch'); + }); + + describe('getNotificationsBrokerSource', () => { + it('Should return an empty array', () => { + const result = service.getNotificationsBrokerSource(); + const expected = cold('(a)', { + a: [] + }); + expect(result).toBeObservable(expected); + }); + }); + + describe('getNotificationsBrokerSourceTotalPages', () => { + it('Should return zero (0)', () => { + const result = service.getNotificationsBrokerSourceTotalPages(); + const expected = cold('(a)', { + a: 0 + }); + expect(result).toBeObservable(expected); + }); + }); + + describe('getNotificationsBrokerSourcesCurrentPage', () => { + it('Should return minus one (0)', () => { + const result = service.getNotificationsBrokerSourceCurrentPage(); + const expected = cold('(a)', { + a: 0 + }); + expect(result).toBeObservable(expected); + }); + }); + + describe('getNotificationsBrokerSourceTotals', () => { + it('Should return zero (0)', () => { + const result = service.getNotificationsBrokerSourceTotals(); + const expected = cold('(a)', { + a: 0 + }); + expect(result).toBeObservable(expected); + }); + }); + + describe('isNotificationsBrokerSourceLoading', () => { + it('Should return TRUE', () => { + const result = service.isNotificationsBrokerSourceLoading(); + const expected = cold('(a)', { + a: true + }); + expect(result).toBeObservable(expected); + }); + }); + + describe('isNotificationsBrokerSourceLoaded', () => { + it('Should return FALSE', () => { + const result = service.isNotificationsBrokerSourceLoaded(); + const expected = cold('(a)', { + a: false + }); + expect(result).toBeObservable(expected); + }); + }); + + describe('isNotificationsBrokerSourceProcessing', () => { + it('Should return FALSE', () => { + const result = service.isNotificationsBrokerSourceProcessing(); + const expected = cold('(a)', { + a: false + }); + expect(result).toBeObservable(expected); + }); }); }); - }); + + describe('Testing methods with Source objects', () => { + beforeEach(async () => { + init('full'); + TestBed.configureTestingModule({ + imports: [ + StoreModule.forRoot({ notifications: notificationsReducers } as any), + ], + providers: [ + provideMockStore({ initialState }), + { provide: NotificationsStateService, useValue: service } + ] + }).compileComponents(); + }); + + beforeEach(() => { + store = TestBed.get(Store); + service = new NotificationsStateService(store); + serviceAsAny = service; + spyOn(store, 'dispatch'); + }); + + describe('getNotificationsBrokerSource', () => { + it('Should return an array of Source', () => { + const result = service.getNotificationsBrokerSource(); + const expected = cold('(a)', { + a: [ + notificationsBrokerSourceObjectMorePid, + notificationsBrokerSourceObjectMoreAbstract, + notificationsBrokerSourceObjectMissingPid + ] + }); + expect(result).toBeObservable(expected); + }); + }); + + describe('getNotificationsBrokerSourceTotalPages', () => { + it('Should return one (1)', () => { + const result = service.getNotificationsBrokerSourceTotalPages(); + const expected = cold('(a)', { + a: 1 + }); + expect(result).toBeObservable(expected); + }); + }); + + describe('getNotificationsBrokerSourceCurrentPage', () => { + it('Should return minus zero (1)', () => { + const result = service.getNotificationsBrokerSourceCurrentPage(); + const expected = cold('(a)', { + a: 1 + }); + expect(result).toBeObservable(expected); + }); + }); + + describe('getNotificationsBrokerSourceTotals', () => { + it('Should return three (3)', () => { + const result = service.getNotificationsBrokerSourceTotals(); + const expected = cold('(a)', { + a: 3 + }); + expect(result).toBeObservable(expected); + }); + }); + + describe('isNotificationsBrokerSourceLoading', () => { + it('Should return FALSE', () => { + const result = service.isNotificationsBrokerSourceLoading(); + const expected = cold('(a)', { + a: false + }); + expect(result).toBeObservable(expected); + }); + }); + + describe('isNotificationsBrokerSourceLoaded', () => { + it('Should return TRUE', () => { + const result = service.isNotificationsBrokerSourceLoaded(); + const expected = cold('(a)', { + a: true + }); + expect(result).toBeObservable(expected); + }); + }); + + describe('isNotificationsBrokerSourceProcessing', () => { + it('Should return FALSE', () => { + const result = service.isNotificationsBrokerSourceProcessing(); + const expected = cold('(a)', { + a: false + }); + expect(result).toBeObservable(expected); + }); + }); + }); + + describe('Testing the Source dispatch methods', () => { + beforeEach(async () => { + init('full'); + TestBed.configureTestingModule({ + imports: [ + StoreModule.forRoot({ notifications: notificationsReducers } as any), + ], + providers: [ + provideMockStore({ initialState }), + { provide: NotificationsStateService, useValue: service } + ] + }).compileComponents(); + }); + + beforeEach(() => { + store = TestBed.get(Store); + service = new NotificationsStateService(store); + serviceAsAny = service; + spyOn(store, 'dispatch'); + }); + + describe('dispatchRetrieveNotificationsBrokerSource', () => { + it('Should call store.dispatch', () => { + const elementsPerPage = 3; + const currentPage = 1; + const action = new RetrieveAllSourceAction(elementsPerPage, currentPage); + service.dispatchRetrieveNotificationsBrokerSource(elementsPerPage, currentPage); + expect(serviceAsAny.store.dispatch).toHaveBeenCalledWith(action); + }); + }); + }); + }); + + }); diff --git a/src/app/shared/mocks/notifications.mock.ts b/src/app/shared/mocks/notifications.mock.ts index 2e9303c3a3..8af034ea32 100644 --- a/src/app/shared/mocks/notifications.mock.ts +++ b/src/app/shared/mocks/notifications.mock.ts @@ -13,6 +13,7 @@ import { createSuccessfulRemoteDataObject$ } from '../remote-data.utils'; import { SearchResult } from '../search/models/search-result.model'; +import { NotificationsBrokerSourceObject } from '../../core/notifications/broker/models/notifications-broker-source.model'; // REST Mock --------------------------------------------------------------------- // ------------------------------------------------------------------------------- @@ -1329,6 +1330,45 @@ export const NotificationsMockDspaceObject: SearchResult = Object. } ); +// Sources +// ------------------------------------------------------------------------------- + +export const notificationsBrokerSourceObjectMorePid: NotificationsBrokerSourceObject = { + type: new ResourceType('nbsource'), + id: 'ENRICH!MORE!PID', + lastEvent: '2020/10/09 10:11 UTC', + totalEvents: 33, + _links: { + self: { + href: 'https://rest.api/rest/api/integration/nbsources/ENRICH!MORE!PID' + } + } +}; + +export const notificationsBrokerSourceObjectMoreAbstract: NotificationsBrokerSourceObject = { + type: new ResourceType('nbsource'), + id: 'ENRICH!MORE!ABSTRACT', + lastEvent: '2020/09/08 21:14 UTC', + totalEvents: 5, + _links: { + self: { + href: 'https://rest.api/rest/api/integration/nbsources/ENRICH!MORE!ABSTRACT' + } + } +}; + +export const notificationsBrokerSourceObjectMissingPid: NotificationsBrokerSourceObject = { + type: new ResourceType('nbsource'), + id: 'ENRICH!MISSING!PID', + lastEvent: '2020/10/01 07:36 UTC', + totalEvents: 4, + _links: { + self: { + href: 'https://rest.api/rest/api/integration/nbsources/ENRICH!MISSING!PID' + } + } +}; + // Topics // ------------------------------------------------------------------------------- @@ -1753,10 +1793,28 @@ export function getMockNotificationsStateService(): any { getNotificationsBrokerTopicsCurrentPage: jasmine.createSpy('getNotificationsBrokerTopicsCurrentPage'), getNotificationsBrokerTopicsTotals: jasmine.createSpy('getNotificationsBrokerTopicsTotals'), dispatchRetrieveNotificationsBrokerTopics: jasmine.createSpy('dispatchRetrieveNotificationsBrokerTopics'), + getNotificationsBrokerSource: jasmine.createSpy('getNotificationsBrokerSource'), + isNotificationsBrokerSourceLoading: jasmine.createSpy('isNotificationsBrokerSourceLoading'), + isNotificationsBrokerSourceLoaded: jasmine.createSpy('isNotificationsBrokerSourceLoaded'), + isNotificationsBrokerSourceProcessing: jasmine.createSpy('isNotificationsBrokerSourceProcessing'), + getNotificationsBrokerSourceTotalPages: jasmine.createSpy('getNotificationsBrokerSourceTotalPages'), + getNotificationsBrokerSourceCurrentPage: jasmine.createSpy('getNotificationsBrokerSourceCurrentPage'), + getNotificationsBrokerSourceTotals: jasmine.createSpy('getNotificationsBrokerSourceTotals'), + dispatchRetrieveNotificationsBrokerSource: jasmine.createSpy('dispatchRetrieveNotificationsBrokerSource'), dispatchMarkUserSuggestionsAsVisitedAction: jasmine.createSpy('dispatchMarkUserSuggestionsAsVisitedAction') }); } +/** + * Mock for [[NotificationsBrokerSourceRestService]] + */ + export function getMockNotificationsBrokerSourceRestService(): NotificationsBrokerTopicRestService { + return jasmine.createSpyObj('NotificationsBrokerSourceRestService', { + getSources: jasmine.createSpy('getSources'), + getSource: jasmine.createSpy('getSource'), + }); +} + /** * Mock for [[NotificationsBrokerTopicRestService]] */ From d63bf55458bd9cab6a417107c14325b3add16b85 Mon Sep 17 00:00:00 2001 From: Pratik Rajkotiya Date: Thu, 10 Mar 2022 11:56:39 +0530 Subject: [PATCH 005/409] [CST-5337] change end point. --- config/config.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/config/config.yml b/config/config.yml index 3866797f5d..b5eecd112f 100644 --- a/config/config.yml +++ b/config/config.yml @@ -1,5 +1,5 @@ rest: - ssl: false - host: localhost:8080 + ssl: true + host: api7.dspace.org port: 443 nameSpace: /server From 6dfeb1a06b0310f3a087fb3c10b7f5d2f10aecc7 Mon Sep 17 00:00:00 2001 From: Luca Giamminonni Date: Thu, 17 Mar 2022 16:53:59 +0100 Subject: [PATCH 006/409] [CST-5337] Fixed notifications labels --- src/assets/i18n/en.json5 | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/assets/i18n/en.json5 b/src/assets/i18n/en.json5 index 72d22fb502..873fad622c 100644 --- a/src/assets/i18n/en.json5 +++ b/src/assets/i18n/en.json5 @@ -2716,11 +2716,11 @@ "none.listelement.badge": "Item", - "notifications.broker.title": "Broker Title", + "notifications.broker.title": "Notifications", "notifications.broker.topics.description": "Below you can see all the topics received from the subscriptions to {{source}}.", - "notifications.broker.source.description": "Below you can see all the sources.", + "notifications.broker.source.description": "Below you can see all the notification's sources.", "notifications.broker.topics": "Current Topics", @@ -2740,13 +2740,13 @@ "notifications.broker.noSource": "No sources found.", - "notifications.events.title": "{{source}} Broker Suggestions", + "notifications.events.title": "Broker Suggestions", "notifications.broker.topic.error.service.retrieve": "An error occurred while loading the Notifications Broker topics", "notifications.broker.source.error.service.retrieve": "An error occurred while loading the Notifications Broker source", - "notifications.broker.events.description": "Below the list of all the suggestions, received from {{source}}, for the selected topic.", + "notifications.broker.events.description": "Below the list of all the suggestions for the selected topic.", "notifications.broker.loading": "Loading ...", From 5d8d3e35d58f2151e37faff9191159b44c5a33c9 Mon Sep 17 00:00:00 2001 From: Luca Giamminonni Date: Tue, 29 Mar 2022 16:16:22 +0200 Subject: [PATCH 007/409] [CST-5249] Added suggestions from openaire --- .../admin-notifications-routing-paths.ts | 9 + .../admin-notifications-routing.module.ts | 42 + ...uggestion-targets-page-resolver.service.ts | 32 + ...ons-suggestion-targets-page.component.html | 1 + ...ons-suggestion-targets-page.component.scss | 0 ...-suggestion-targets-page.component.spec.ts | 38 + ...tions-suggestion-targets-page.component.ts | 10 + .../admin-notifications.module.ts | 27 + src/app/admin/admin-routing-paths.ts | 5 + src/app/admin/admin-routing.module.ts | 7 +- .../admin-sidebar/admin-sidebar.component.ts | 38 +- src/app/app-routing.module.ts | 6 + src/app/core/core.module.ts | 6 + ...enaire-suggestion-objects.resource-type.ts | 25 + .../openaire-suggestion-source.model.ts | 47 + .../openaire-suggestion-target.model.ts | 60 + .../models/openaire-suggestion.model.ts | 85 + .../openaire-suggestions-data.service.ts | 301 +++ src/app/openaire/openaire.module.ts | 72 + src/app/openaire/openaire.reducer.ts | 19 + .../openaire/reciter-suggestions/selectors.ts | 97 + .../suggestion-actions.component.html | 28 + .../suggestion-actions.component.scss | 1 + .../suggestion-actions.component.ts | 92 + .../suggestion-evidences.component.html | 20 + .../suggestion-evidences.component.scss | 0 .../suggestion-evidences.component.ts | 15 + .../suggestion-list-element.component.html | 44 + .../suggestion-list-element.component.scss | 16 + .../suggestion-list-element.component.ts | 98 + .../suggestion-targets.actions.ts | 154 ++ .../suggestion-targets.component.html | 51 + .../suggestion-targets.component.scss | 0 .../suggestion-targets.component.ts | 150 ++ .../suggestion-targets.effects.ts | 110 + .../suggestion-targets.reducer.ts | 100 + .../suggestion-targets.state.service.ts | 164 ++ .../suggestions-notification.component.html | 8 + .../suggestions-notification.component.scss | 0 .../suggestions-notification.component.ts | 42 + .../suggestions-popup.component.html | 1 + .../suggestions-popup.component.scss | 0 .../suggestions-popup.component.spec.ts | 79 + .../suggestions-popup.component.ts | 67 + .../suggestions.service.ts | 296 +++ src/app/shared/mocks/openaire.mock.ts | 1797 +++++++++++++++++ .../mocks/reciter-suggestion-targets.mock.ts | 42 + .../shared/mocks/reciter-suggestion.mock.ts | 210 ++ .../suggestions-page-routing-paths.ts | 11 + .../suggestions-page-routing.module.ts | 36 + .../suggestions-page.component.html | 48 + .../suggestions-page.component.scss | 0 .../suggestions-page.component.spec.ts | 107 + .../suggestions-page.component.ts | 285 +++ .../suggestions-page.module.ts | 24 + .../suggestions-page.resolver.ts | 32 + src/assets/i18n/en.json5 | 65 + 57 files changed, 5112 insertions(+), 8 deletions(-) create mode 100644 src/app/admin/admin-notifications/admin-notifications-routing-paths.ts create mode 100644 src/app/admin/admin-notifications/admin-notifications-routing.module.ts create mode 100644 src/app/admin/admin-notifications/admin-notifications-suggestion-targets-page/admin-notifications-suggestion-targets-page-resolver.service.ts create mode 100644 src/app/admin/admin-notifications/admin-notifications-suggestion-targets-page/admin-notifications-suggestion-targets-page.component.html create mode 100644 src/app/admin/admin-notifications/admin-notifications-suggestion-targets-page/admin-notifications-suggestion-targets-page.component.scss create mode 100644 src/app/admin/admin-notifications/admin-notifications-suggestion-targets-page/admin-notifications-suggestion-targets-page.component.spec.ts create mode 100644 src/app/admin/admin-notifications/admin-notifications-suggestion-targets-page/admin-notifications-suggestion-targets-page.component.ts create mode 100644 src/app/admin/admin-notifications/admin-notifications.module.ts create mode 100644 src/app/core/openaire/reciter-suggestions/models/openaire-suggestion-objects.resource-type.ts create mode 100644 src/app/core/openaire/reciter-suggestions/models/openaire-suggestion-source.model.ts create mode 100644 src/app/core/openaire/reciter-suggestions/models/openaire-suggestion-target.model.ts create mode 100644 src/app/core/openaire/reciter-suggestions/models/openaire-suggestion.model.ts create mode 100644 src/app/core/openaire/reciter-suggestions/openaire-suggestions-data.service.ts create mode 100644 src/app/openaire/openaire.module.ts create mode 100644 src/app/openaire/openaire.reducer.ts create mode 100644 src/app/openaire/reciter-suggestions/selectors.ts create mode 100644 src/app/openaire/reciter-suggestions/suggestion-actions/suggestion-actions.component.html create mode 100644 src/app/openaire/reciter-suggestions/suggestion-actions/suggestion-actions.component.scss create mode 100644 src/app/openaire/reciter-suggestions/suggestion-actions/suggestion-actions.component.ts create mode 100644 src/app/openaire/reciter-suggestions/suggestion-list-element/suggestion-evidences/suggestion-evidences.component.html create mode 100644 src/app/openaire/reciter-suggestions/suggestion-list-element/suggestion-evidences/suggestion-evidences.component.scss create mode 100644 src/app/openaire/reciter-suggestions/suggestion-list-element/suggestion-evidences/suggestion-evidences.component.ts create mode 100644 src/app/openaire/reciter-suggestions/suggestion-list-element/suggestion-list-element.component.html create mode 100644 src/app/openaire/reciter-suggestions/suggestion-list-element/suggestion-list-element.component.scss create mode 100644 src/app/openaire/reciter-suggestions/suggestion-list-element/suggestion-list-element.component.ts create mode 100644 src/app/openaire/reciter-suggestions/suggestion-targets/suggestion-targets.actions.ts create mode 100644 src/app/openaire/reciter-suggestions/suggestion-targets/suggestion-targets.component.html create mode 100644 src/app/openaire/reciter-suggestions/suggestion-targets/suggestion-targets.component.scss create mode 100644 src/app/openaire/reciter-suggestions/suggestion-targets/suggestion-targets.component.ts create mode 100644 src/app/openaire/reciter-suggestions/suggestion-targets/suggestion-targets.effects.ts create mode 100644 src/app/openaire/reciter-suggestions/suggestion-targets/suggestion-targets.reducer.ts create mode 100644 src/app/openaire/reciter-suggestions/suggestion-targets/suggestion-targets.state.service.ts create mode 100644 src/app/openaire/reciter-suggestions/suggestions-notification/suggestions-notification.component.html create mode 100644 src/app/openaire/reciter-suggestions/suggestions-notification/suggestions-notification.component.scss create mode 100644 src/app/openaire/reciter-suggestions/suggestions-notification/suggestions-notification.component.ts create mode 100644 src/app/openaire/reciter-suggestions/suggestions-popup/suggestions-popup.component.html create mode 100644 src/app/openaire/reciter-suggestions/suggestions-popup/suggestions-popup.component.scss create mode 100644 src/app/openaire/reciter-suggestions/suggestions-popup/suggestions-popup.component.spec.ts create mode 100644 src/app/openaire/reciter-suggestions/suggestions-popup/suggestions-popup.component.ts create mode 100644 src/app/openaire/reciter-suggestions/suggestions.service.ts create mode 100644 src/app/shared/mocks/openaire.mock.ts create mode 100644 src/app/shared/mocks/reciter-suggestion-targets.mock.ts create mode 100644 src/app/shared/mocks/reciter-suggestion.mock.ts create mode 100644 src/app/suggestions-page/suggestions-page-routing-paths.ts create mode 100644 src/app/suggestions-page/suggestions-page-routing.module.ts create mode 100644 src/app/suggestions-page/suggestions-page.component.html create mode 100644 src/app/suggestions-page/suggestions-page.component.scss create mode 100644 src/app/suggestions-page/suggestions-page.component.spec.ts create mode 100644 src/app/suggestions-page/suggestions-page.component.ts create mode 100644 src/app/suggestions-page/suggestions-page.module.ts create mode 100644 src/app/suggestions-page/suggestions-page.resolver.ts diff --git a/src/app/admin/admin-notifications/admin-notifications-routing-paths.ts b/src/app/admin/admin-notifications/admin-notifications-routing-paths.ts new file mode 100644 index 0000000000..614b2ef49b --- /dev/null +++ b/src/app/admin/admin-notifications/admin-notifications-routing-paths.ts @@ -0,0 +1,9 @@ +import { URLCombiner } from '../../core/url-combiner/url-combiner'; +import { getNotificationsModuleRoute } from '../admin-routing-paths'; + +export const NOTIFICATIONS_EDIT_PATH = 'openaire-broker'; +export const NOTIFICATIONS_RECITER_SUGGESTION_PATH = 'suggestion-targets'; + +export function getNotificationsOpenairebrokerRoute(id: string) { + return new URLCombiner(getNotificationsModuleRoute(), NOTIFICATIONS_EDIT_PATH, id).toString(); +} diff --git a/src/app/admin/admin-notifications/admin-notifications-routing.module.ts b/src/app/admin/admin-notifications/admin-notifications-routing.module.ts new file mode 100644 index 0000000000..12bc7b9ec7 --- /dev/null +++ b/src/app/admin/admin-notifications/admin-notifications-routing.module.ts @@ -0,0 +1,42 @@ +import { NgModule } from '@angular/core'; +import { RouterModule } from '@angular/router'; + +import { AuthenticatedGuard } from '../../core/auth/authenticated.guard'; +import { I18nBreadcrumbResolver } from '../../core/breadcrumbs/i18n-breadcrumb.resolver'; +import { I18nBreadcrumbsService } from '../../core/breadcrumbs/i18n-breadcrumbs.service'; +import { NOTIFICATIONS_EDIT_PATH, NOTIFICATIONS_RECITER_SUGGESTION_PATH } from './admin-notifications-routing-paths'; +import { AdminNotificationsSuggestionTargetsPageComponent } from './admin-notifications-suggestion-targets-page/admin-notifications-suggestion-targets-page.component'; +import { AdminNotificationsSuggestionTargetsPageResolver } from './admin-notifications-suggestion-targets-page/admin-notifications-suggestion-targets-page-resolver.service'; + +@NgModule({ + imports: [ + RouterModule.forChild([ + { + canActivate: [ AuthenticatedGuard ], + path: `${NOTIFICATIONS_RECITER_SUGGESTION_PATH}`, + component: AdminNotificationsSuggestionTargetsPageComponent, + pathMatch: 'full', + resolve: { + breadcrumb: I18nBreadcrumbResolver, + reciterSuggestionTargetParams: AdminNotificationsSuggestionTargetsPageResolver + }, + data: { + title: 'admin.notifications.recitersuggestion.page.title', + breadcrumbKey: 'admin.notifications.recitersuggestion', + showBreadcrumbsFluid: false + } + }, + ]) + ], + providers: [ + I18nBreadcrumbResolver, + I18nBreadcrumbsService, + AdminNotificationsSuggestionTargetsPageResolver + ] +}) +/** + * Routing module for the Notifications section of the admin sidebar + */ +export class AdminNotificationsRoutingModule { + +} diff --git a/src/app/admin/admin-notifications/admin-notifications-suggestion-targets-page/admin-notifications-suggestion-targets-page-resolver.service.ts b/src/app/admin/admin-notifications/admin-notifications-suggestion-targets-page/admin-notifications-suggestion-targets-page-resolver.service.ts new file mode 100644 index 0000000000..df1f4b81e6 --- /dev/null +++ b/src/app/admin/admin-notifications/admin-notifications-suggestion-targets-page/admin-notifications-suggestion-targets-page-resolver.service.ts @@ -0,0 +1,32 @@ +import { Injectable } from '@angular/core'; +import { ActivatedRouteSnapshot, Resolve, RouterStateSnapshot } from '@angular/router'; + +/** + * Interface for the route parameters. + */ +export interface AdminNotificationsSuggestionTargetsPageParams { + pageId?: string; + pageSize?: number; + currentPage?: number; +} + +/** + * This class represents a resolver that retrieve the route data before the route is activated. + */ +@Injectable() +export class AdminNotificationsSuggestionTargetsPageResolver implements Resolve { + + /** + * Method for resolving the parameters in the current route. + * @param {ActivatedRouteSnapshot} route The current ActivatedRouteSnapshot + * @param {RouterStateSnapshot} state The current RouterStateSnapshot + * @returns AdminNotificationsSuggestionTargetsPageParams Emits the route parameters + */ + resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): AdminNotificationsSuggestionTargetsPageParams { + return { + pageId: route.queryParams.pageId, + pageSize: parseInt(route.queryParams.pageSize, 10), + currentPage: parseInt(route.queryParams.page, 10) + }; + } +} diff --git a/src/app/admin/admin-notifications/admin-notifications-suggestion-targets-page/admin-notifications-suggestion-targets-page.component.html b/src/app/admin/admin-notifications/admin-notifications-suggestion-targets-page/admin-notifications-suggestion-targets-page.component.html new file mode 100644 index 0000000000..5d06a1a6bd --- /dev/null +++ b/src/app/admin/admin-notifications/admin-notifications-suggestion-targets-page/admin-notifications-suggestion-targets-page.component.html @@ -0,0 +1 @@ + diff --git a/src/app/admin/admin-notifications/admin-notifications-suggestion-targets-page/admin-notifications-suggestion-targets-page.component.scss b/src/app/admin/admin-notifications/admin-notifications-suggestion-targets-page/admin-notifications-suggestion-targets-page.component.scss new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/app/admin/admin-notifications/admin-notifications-suggestion-targets-page/admin-notifications-suggestion-targets-page.component.spec.ts b/src/app/admin/admin-notifications/admin-notifications-suggestion-targets-page/admin-notifications-suggestion-targets-page.component.spec.ts new file mode 100644 index 0000000000..f9e407f402 --- /dev/null +++ b/src/app/admin/admin-notifications/admin-notifications-suggestion-targets-page/admin-notifications-suggestion-targets-page.component.spec.ts @@ -0,0 +1,38 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { AdminNotificationsSuggestionTargetsPageComponent } from './admin-notifications-suggestion-targets-page.component'; +import { NO_ERRORS_SCHEMA } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { TranslateModule } from '@ngx-translate/core'; + +describe('AdminNotificationsSuggestionTargetsPageComponent', () => { + let component: AdminNotificationsSuggestionTargetsPageComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + imports: [ + CommonModule, + TranslateModule.forRoot() + ], + declarations: [ + AdminNotificationsSuggestionTargetsPageComponent + ], + providers: [ + AdminNotificationsSuggestionTargetsPageComponent + ], + schemas: [NO_ERRORS_SCHEMA] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(AdminNotificationsSuggestionTargetsPageComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/admin/admin-notifications/admin-notifications-suggestion-targets-page/admin-notifications-suggestion-targets-page.component.ts b/src/app/admin/admin-notifications/admin-notifications-suggestion-targets-page/admin-notifications-suggestion-targets-page.component.ts new file mode 100644 index 0000000000..a9a77f5089 --- /dev/null +++ b/src/app/admin/admin-notifications/admin-notifications-suggestion-targets-page/admin-notifications-suggestion-targets-page.component.ts @@ -0,0 +1,10 @@ +import { Component } from '@angular/core'; + +@Component({ + selector: 'ds-admin-notifications-reciter-page', + templateUrl: './admin-notifications-suggestion-targets-page.component.html', + styleUrls: ['./admin-notifications-suggestion-targets-page.component.scss'] +}) +export class AdminNotificationsSuggestionTargetsPageComponent { + +} diff --git a/src/app/admin/admin-notifications/admin-notifications.module.ts b/src/app/admin/admin-notifications/admin-notifications.module.ts new file mode 100644 index 0000000000..47125daad6 --- /dev/null +++ b/src/app/admin/admin-notifications/admin-notifications.module.ts @@ -0,0 +1,27 @@ +import { CommonModule } from '@angular/common'; +import { NgModule } from '@angular/core'; +import { CoreModule } from '../../core/core.module'; +import { SharedModule } from '../../shared/shared.module'; +import { AdminNotificationsRoutingModule } from './admin-notifications-routing.module'; +import { OpenaireModule } from '../../openaire/openaire.module'; +import { AdminNotificationsSuggestionTargetsPageComponent } from './admin-notifications-suggestion-targets-page/admin-notifications-suggestion-targets-page.component'; + +@NgModule({ + imports: [ + CommonModule, + SharedModule, + CoreModule.forRoot(), + AdminNotificationsRoutingModule, + OpenaireModule + ], + declarations: [ + AdminNotificationsSuggestionTargetsPageComponent + ], + entryComponents: [] +}) +/** + * This module handles all components related to the notifications pages + */ +export class AdminNotificationsModule { + +} diff --git a/src/app/admin/admin-routing-paths.ts b/src/app/admin/admin-routing-paths.ts index 3168ea93c9..30f801cecb 100644 --- a/src/app/admin/admin-routing-paths.ts +++ b/src/app/admin/admin-routing-paths.ts @@ -2,7 +2,12 @@ import { URLCombiner } from '../core/url-combiner/url-combiner'; import { getAdminModuleRoute } from '../app-routing-paths'; export const REGISTRIES_MODULE_PATH = 'registries'; +export const NOTIFICATIONS_MODULE_PATH = 'notifications'; export function getRegistriesModuleRoute() { return new URLCombiner(getAdminModuleRoute(), REGISTRIES_MODULE_PATH).toString(); } + +export function getNotificationsModuleRoute() { + return new URLCombiner(getAdminModuleRoute(), NOTIFICATIONS_MODULE_PATH).toString(); +} diff --git a/src/app/admin/admin-routing.module.ts b/src/app/admin/admin-routing.module.ts index ee5cb8737b..782a7faa38 100644 --- a/src/app/admin/admin-routing.module.ts +++ b/src/app/admin/admin-routing.module.ts @@ -6,11 +6,16 @@ import { I18nBreadcrumbResolver } from '../core/breadcrumbs/i18n-breadcrumb.reso import { AdminWorkflowPageComponent } from './admin-workflow-page/admin-workflow-page.component'; import { I18nBreadcrumbsService } from '../core/breadcrumbs/i18n-breadcrumbs.service'; import { AdminCurationTasksComponent } from './admin-curation-tasks/admin-curation-tasks.component'; -import { REGISTRIES_MODULE_PATH } from './admin-routing-paths'; +import { REGISTRIES_MODULE_PATH, NOTIFICATIONS_MODULE_PATH } from './admin-routing-paths'; @NgModule({ imports: [ RouterModule.forChild([ + { + path: NOTIFICATIONS_MODULE_PATH, + loadChildren: () => import('./admin-notifications/admin-notifications.module') + .then((m) => m.AdminNotificationsModule), + }, { path: REGISTRIES_MODULE_PATH, loadChildren: () => import('./admin-registries/admin-registries.module') diff --git a/src/app/admin/admin-sidebar/admin-sidebar.component.ts b/src/app/admin/admin-sidebar/admin-sidebar.component.ts index dc9d2a817f..dd5d7e507a 100644 --- a/src/app/admin/admin-sidebar/admin-sidebar.component.ts +++ b/src/app/admin/admin-sidebar/admin-sidebar.component.ts @@ -22,6 +22,7 @@ import { CSSVariableService } from '../../shared/sass-helper/sass-helper.service import { AuthorizationDataService } from '../../core/data/feature-authorization/authorization-data.service'; import { FeatureID } from '../../core/data/feature-authorization/feature-id'; import { Router, ActivatedRoute } from '@angular/router'; +import {NOTIFICATIONS_RECITER_SUGGESTION_PATH} from "../admin-notifications/admin-notifications-routing-paths"; /** * Component representing the admin sidebar @@ -277,7 +278,7 @@ export class AdminSidebarComponent extends MenuComponent implements OnInit { // link: '' // } as LinkMenuItemModel, // icon: 'chart-bar', - // index: 8 + // index: 9 // }, /* Control Panel */ @@ -292,7 +293,7 @@ export class AdminSidebarComponent extends MenuComponent implements OnInit { // link: '' // } as LinkMenuItemModel, // icon: 'cogs', - // index: 9 + // index: 10 // }, /* Processes */ @@ -306,7 +307,7 @@ export class AdminSidebarComponent extends MenuComponent implements OnInit { link: '/processes' } as LinkMenuItemModel, icon: 'terminal', - index: 10 + index: 12 }, ]; menuList.forEach((menuSection) => this.menuService.addSection(this.menuID, Object.assign(menuSection, { @@ -465,6 +466,29 @@ export class AdminSidebarComponent extends MenuComponent implements OnInit { createSiteAdministratorMenuSections() { this.authorizationService.isAuthorized(FeatureID.AdministratorOf).subscribe((authorized) => { const menuList = [ + /* Notifications */ + { + id: 'notifications', + active: false, + visible: authorized, + model: { + type: MenuItemType.TEXT, + text: 'menu.section.notifications' + } as TextMenuItemModel, + icon: 'bell', + index: 4 + }, + { + id: 'notifications_reciter', + parentID: 'notifications', + active: false, + visible: authorized, + model: { + type: MenuItemType.LINK, + text: 'menu.section.notifications_reciter', + link: '/admin/notifications/' + NOTIFICATIONS_RECITER_SUGGESTION_PATH + } as LinkMenuItemModel, + }, /* Admin Search */ { id: 'admin_search', @@ -476,7 +500,7 @@ export class AdminSidebarComponent extends MenuComponent implements OnInit { link: '/admin/search' } as LinkMenuItemModel, icon: 'search', - index: 5 + index: 6 }, /* Registries */ { @@ -488,7 +512,7 @@ export class AdminSidebarComponent extends MenuComponent implements OnInit { text: 'menu.section.registries' } as TextMenuItemModel, icon: 'list', - index: 6 + index: 7 }, { id: 'registries_metadata', @@ -524,7 +548,7 @@ export class AdminSidebarComponent extends MenuComponent implements OnInit { link: 'admin/curation-tasks' } as LinkMenuItemModel, icon: 'filter', - index: 7 + index: 8 }, /* Workflow */ @@ -601,7 +625,7 @@ export class AdminSidebarComponent extends MenuComponent implements OnInit { text: 'menu.section.access_control' } as TextMenuItemModel, icon: 'key', - index: 4 + index: 5 }, ]; diff --git a/src/app/app-routing.module.ts b/src/app/app-routing.module.ts index 88f7791b1b..9bf5518558 100644 --- a/src/app/app-routing.module.ts +++ b/src/app/app-routing.module.ts @@ -30,6 +30,7 @@ import { ThemedForbiddenComponent } from './forbidden/themed-forbidden.component import { GroupAdministratorGuard } from './core/data/feature-authorization/feature-authorization-guard/group-administrator.guard'; import { ThemedPageInternalServerErrorComponent } from './page-internal-server-error/themed-page-internal-server-error.component'; import { ServerCheckGuard } from './core/server-check/server-check.guard'; +import { SUGGESTION_MODULE_PATH } from './suggestions-page/suggestions-page-routing-paths'; @NgModule({ imports: [ @@ -190,6 +191,11 @@ import { ServerCheckGuard } from './core/server-check/server-check.guard'; .then((m) => m.ProcessPageModule), canActivate: [AuthenticatedGuard, EndUserAgreementCurrentUserGuard] }, + { path: SUGGESTION_MODULE_PATH, + loadChildren: () => import('./suggestions-page/suggestions-page.module') + .then((m) => m.SuggestionsPageModule), + canActivate: [AuthenticatedGuard, EndUserAgreementCurrentUserGuard] + }, { path: INFO_MODULE_PATH, loadChildren: () => import('./info/info.module').then((m) => m.InfoModule) diff --git a/src/app/core/core.module.ts b/src/app/core/core.module.ts index 8d8a614a89..6293fbd109 100644 --- a/src/app/core/core.module.ts +++ b/src/app/core/core.module.ts @@ -162,6 +162,9 @@ import { SearchConfig } from './shared/search/search-filters/search-config.model import { SequenceService } from './shared/sequence.service'; import { GroupDataService } from './eperson/group-data.service'; import { SubmissionAccessesModel } from './config/models/config-submission-accesses.model'; +import { OpenaireSuggestionTarget } from './openaire/reciter-suggestions/models/openaire-suggestion-target.model'; +import { OpenaireSuggestion } from './openaire/reciter-suggestions/models/openaire-suggestion.model'; +import { OpenaireSuggestionSource } from './openaire/reciter-suggestions/models/openaire-suggestion-source.model'; /** * When not in production, endpoint responses can be mocked for testing purposes @@ -343,6 +346,9 @@ export const models = ShortLivedToken, Registration, UsageReport, + OpenaireSuggestion, + OpenaireSuggestionTarget, + OpenaireSuggestionSource, Root, SearchConfig, SubmissionAccessesModel diff --git a/src/app/core/openaire/reciter-suggestions/models/openaire-suggestion-objects.resource-type.ts b/src/app/core/openaire/reciter-suggestions/models/openaire-suggestion-objects.resource-type.ts new file mode 100644 index 0000000000..e31006959f --- /dev/null +++ b/src/app/core/openaire/reciter-suggestions/models/openaire-suggestion-objects.resource-type.ts @@ -0,0 +1,25 @@ +import { ResourceType } from '../../../shared/resource-type'; + +/** + * The resource type for the Suggestion Target object + * + * Needs to be in a separate file to prevent circular + * dependencies in webpack. + */ +export const SUGGESTION_TARGET = new ResourceType('suggestiontarget'); + +/** + * The resource type for the Suggestion Source object + * + * Needs to be in a separate file to prevent circular + * dependencies in webpack. + */ +export const SUGGESTION_SOURCE = new ResourceType('suggestionsource'); + +/** + * The resource type for the Suggestion object + * + * Needs to be in a separate file to prevent circular + * dependencies in webpack. + */ +export const SUGGESTION = new ResourceType('suggestion'); diff --git a/src/app/core/openaire/reciter-suggestions/models/openaire-suggestion-source.model.ts b/src/app/core/openaire/reciter-suggestions/models/openaire-suggestion-source.model.ts new file mode 100644 index 0000000000..6da9fd47b9 --- /dev/null +++ b/src/app/core/openaire/reciter-suggestions/models/openaire-suggestion-source.model.ts @@ -0,0 +1,47 @@ +import { autoserialize, deserialize } from 'cerialize'; + +import { CacheableObject } from '../../../cache/object-cache.reducer'; +import { SUGGESTION_SOURCE } from './openaire-suggestion-objects.resource-type'; +import { excludeFromEquals } from '../../../utilities/equals.decorators'; +import { ResourceType } from '../../../shared/resource-type'; +import { HALLink } from '../../../shared/hal-link.model'; +import { typedObject } from '../../../cache/builders/build-decorators'; + +/** + * The interface representing the Suggestion Source model + */ +@typedObject +export class OpenaireSuggestionSource implements CacheableObject { + /** + * A string representing the kind of object, e.g. community, item, … + */ + static type = SUGGESTION_SOURCE; + + /** + * The Suggestion Target id + */ + @autoserialize + id: string; + + /** + * The total number of suggestions provided by Suggestion Target for + */ + @autoserialize + total: number; + + /** + * The type of this ConfigObject + */ + @excludeFromEquals + @autoserialize + type: ResourceType; + + /** + * The links to all related resources returned by the rest api. + */ + @deserialize + _links: { + self: HALLink, + suggestiontargets: HALLink + }; +} diff --git a/src/app/core/openaire/reciter-suggestions/models/openaire-suggestion-target.model.ts b/src/app/core/openaire/reciter-suggestions/models/openaire-suggestion-target.model.ts new file mode 100644 index 0000000000..e35972bc79 --- /dev/null +++ b/src/app/core/openaire/reciter-suggestions/models/openaire-suggestion-target.model.ts @@ -0,0 +1,60 @@ +import { autoserialize, deserialize } from 'cerialize'; + +import { CacheableObject } from '../../../cache/object-cache.reducer'; +import { SUGGESTION_TARGET } from './openaire-suggestion-objects.resource-type'; +import { excludeFromEquals } from '../../../utilities/equals.decorators'; +import { ResourceType } from '../../../shared/resource-type'; +import { HALLink } from '../../../shared/hal-link.model'; +import { typedObject } from '../../../cache/builders/build-decorators'; + +/** + * The interface representing the Suggestion Target model + */ +@typedObject +export class OpenaireSuggestionTarget implements CacheableObject { + /** + * A string representing the kind of object, e.g. community, item, … + */ + static type = SUGGESTION_TARGET; + + /** + * The Suggestion Target id + */ + @autoserialize + id: string; + + /** + * The Suggestion Target name to display + */ + @autoserialize + display: string; + + /** + * The Suggestion Target source to display + */ + @autoserialize + source: string; + + /** + * The total number of suggestions provided by Suggestion Target for + */ + @autoserialize + total: number; + + /** + * The type of this ConfigObject + */ + @excludeFromEquals + @autoserialize + type: ResourceType; + + /** + * The links to all related resources returned by the rest api. + */ + @deserialize + _links: { + self: HALLink, + suggestions: HALLink, + target: HALLink + }; +} diff --git a/src/app/core/openaire/reciter-suggestions/models/openaire-suggestion.model.ts b/src/app/core/openaire/reciter-suggestions/models/openaire-suggestion.model.ts new file mode 100644 index 0000000000..3ff5d7b630 --- /dev/null +++ b/src/app/core/openaire/reciter-suggestions/models/openaire-suggestion.model.ts @@ -0,0 +1,85 @@ +import { autoserialize, autoserializeAs, deserialize } from 'cerialize'; + +import { CacheableObject } from '../../../cache/object-cache.reducer'; +import { SUGGESTION } from './openaire-suggestion-objects.resource-type'; +import { excludeFromEquals } from '../../../utilities/equals.decorators'; +import { ResourceType } from '../../../shared/resource-type'; +import { HALLink } from '../../../shared/hal-link.model'; +import { typedObject } from '../../../cache/builders/build-decorators'; +import { MetadataMap, MetadataMapSerializer } from '../../../shared/metadata.models'; + +export interface SuggestionEvidences { + [sectionId: string]: { + score: string; + notes: string + }; +} +/** + * The interface representing the Suggestion Source model + */ +@typedObject +export class OpenaireSuggestion implements CacheableObject { + /** + * A string representing the kind of object, e.g. community, item, … + */ + static type = SUGGESTION; + + /** + * The Suggestion id + */ + @autoserialize + id: string; + + /** + * The Suggestion name to display + */ + @autoserialize + display: string; + + /** + * The Suggestion source to display + */ + @autoserialize + source: string; + + /** + * The Suggestion external source uri + */ + @autoserialize + externalSourceUri: string; + + /** + * The Total Score of the suggestion + */ + @autoserialize + score: string; + + /** + * The total number of suggestions provided by Suggestion Target for + */ + @autoserialize + evidences: SuggestionEvidences; + + /** + * All metadata of this suggestion object + */ + @excludeFromEquals + @autoserializeAs(MetadataMapSerializer) + metadata: MetadataMap; + + /** + * The type of this ConfigObject + */ + @excludeFromEquals + @autoserialize + type: ResourceType; + + /** + * The links to all related resources returned by the rest api. + */ + @deserialize + _links: { + self: HALLink, + target: HALLink + }; +} diff --git a/src/app/core/openaire/reciter-suggestions/openaire-suggestions-data.service.ts b/src/app/core/openaire/reciter-suggestions/openaire-suggestions-data.service.ts new file mode 100644 index 0000000000..d961eaf9b5 --- /dev/null +++ b/src/app/core/openaire/reciter-suggestions/openaire-suggestions-data.service.ts @@ -0,0 +1,301 @@ +import { Injectable } from '@angular/core'; +import { HttpClient } from '@angular/common/http'; +import { Store } from '@ngrx/store'; + +import { Observable } from 'rxjs'; + +import { CoreState } from '../../core.reducers'; +import { HALEndpointService } from '../../shared/hal-endpoint.service'; +import { NotificationsService } from '../../../shared/notifications/notifications.service'; +import { RemoteDataBuildService } from '../../cache/builders/remote-data-build.service'; +import { ObjectCacheService } from '../../cache/object-cache.service'; +import { dataService } from '../../cache/builders/build-decorators'; +import { RequestService } from '../../data/request.service'; +import { FindListOptions } from '../../data/request.models'; +import { DataService } from '../../data/data.service'; +import { ChangeAnalyzer } from '../../data/change-analyzer'; +import { DefaultChangeAnalyzer } from '../../data/default-change-analyzer.service'; +import { RemoteData } from '../../data/remote-data'; +import { SUGGESTION_TARGET } from './models/openaire-suggestion-objects.resource-type'; +import { FollowLinkConfig } from '../../../shared/utils/follow-link-config.model'; +import { PaginatedList } from '../../data/paginated-list.model'; +import { OpenaireSuggestionSource } from './models/openaire-suggestion-source.model'; +import { OpenaireSuggestionTarget } from './models/openaire-suggestion-target.model'; +import { OpenaireSuggestion } from './models/openaire-suggestion.model'; +import { RequestParam } from '../../cache/models/request-param.model'; +import { NoContent } from '../../shared/NoContent.model'; + +/* tslint:disable:max-classes-per-file */ + +/** + * A private DataService implementation to delegate specific methods to. + */ +class SuggestionDataServiceImpl extends DataService { + /** + * The REST endpoint. + */ + protected linkPath = 'suggestions'; + + /** + * Initialize service variables + * @param {RequestService} requestService + * @param {RemoteDataBuildService} rdbService + * @param {Store} store + * @param {ObjectCacheService} objectCache + * @param {HALEndpointService} halService + * @param {NotificationsService} notificationsService + * @param {HttpClient} http + * @param {ChangeAnalyzer} comparator + */ + constructor( + protected requestService: RequestService, + protected rdbService: RemoteDataBuildService, + protected store: Store, + protected objectCache: ObjectCacheService, + protected halService: HALEndpointService, + protected notificationsService: NotificationsService, + protected http: HttpClient, + protected comparator: ChangeAnalyzer) { + super(); + } +} + +/** + * A private DataService implementation to delegate specific methods to. + */ +class SuggestionTargetsDataServiceImpl extends DataService { + /** + * The REST endpoint. + */ + protected linkPath = 'suggestiontargets'; + + /** + * Initialize service variables + * @param {RequestService} requestService + * @param {RemoteDataBuildService} rdbService + * @param {Store} store + * @param {ObjectCacheService} objectCache + * @param {HALEndpointService} halService + * @param {NotificationsService} notificationsService + * @param {HttpClient} http + * @param {ChangeAnalyzer} comparator + */ + constructor( + protected requestService: RequestService, + protected rdbService: RemoteDataBuildService, + protected store: Store, + protected objectCache: ObjectCacheService, + protected halService: HALEndpointService, + protected notificationsService: NotificationsService, + protected http: HttpClient, + protected comparator: ChangeAnalyzer) { + super(); + } +} + +/** + * A private DataService implementation to delegate specific methods to. + */ +class SuggestionSourcesDataServiceImpl extends DataService { + /** + * The REST endpoint. + */ + protected linkPath = 'suggestionsources'; + + /** + * Initialize service variables + * @param {RequestService} requestService + * @param {RemoteDataBuildService} rdbService + * @param {Store} store + * @param {ObjectCacheService} objectCache + * @param {HALEndpointService} halService + * @param {NotificationsService} notificationsService + * @param {HttpClient} http + * @param {ChangeAnalyzer} comparator + */ + constructor( + protected requestService: RequestService, + protected rdbService: RemoteDataBuildService, + protected store: Store, + protected objectCache: ObjectCacheService, + protected halService: HALEndpointService, + protected notificationsService: NotificationsService, + protected http: HttpClient, + protected comparator: ChangeAnalyzer) { + super(); + } +} + +/** + * The service handling all Suggestion Target REST requests. + */ +@Injectable() +@dataService(SUGGESTION_TARGET) +export class OpenaireSuggestionsDataService { + protected searchFindBySourceMethod = 'findBySource'; + protected searchFindByTargetMethod = 'findByTarget'; + protected searchFindByTargetAndSourceMethod = 'findByTargetAndSource'; + + /** + * A private DataService implementation to delegate specific methods to. + */ + private suggestionsDataService: SuggestionDataServiceImpl; + + /** + * A private DataService implementation to delegate specific methods to. + */ + private suggestionSourcesDataService: SuggestionSourcesDataServiceImpl; + + /** + * A private DataService implementation to delegate specific methods to. + */ + private suggestionTargetsDataService: SuggestionTargetsDataServiceImpl; + + /** + * Initialize service variables + * @param {RequestService} requestService + * @param {RemoteDataBuildService} rdbService + * @param {ObjectCacheService} objectCache + * @param {HALEndpointService} halService + * @param {NotificationsService} notificationsService + * @param {HttpClient} http + * @param {DefaultChangeAnalyzer} comparatorSuggestions + * @param {DefaultChangeAnalyzer} comparatorSources + * @param {DefaultChangeAnalyzer} comparatorTargets + */ + constructor( + protected requestService: RequestService, + protected rdbService: RemoteDataBuildService, + protected objectCache: ObjectCacheService, + protected halService: HALEndpointService, + protected notificationsService: NotificationsService, + protected http: HttpClient, + protected comparatorSuggestions: DefaultChangeAnalyzer, + protected comparatorSources: DefaultChangeAnalyzer, + protected comparatorTargets: DefaultChangeAnalyzer, + ) { + this.suggestionsDataService = new SuggestionDataServiceImpl(requestService, rdbService, null, objectCache, halService, notificationsService, http, comparatorSuggestions); + this.suggestionSourcesDataService = new SuggestionSourcesDataServiceImpl(requestService, rdbService, null, objectCache, halService, notificationsService, http, comparatorSources); + this.suggestionTargetsDataService = new SuggestionTargetsDataServiceImpl(requestService, rdbService, null, objectCache, halService, notificationsService, http, comparatorTargets); + } + + /** + * Return the list of Suggestion Target + * + * @param options + * Find list options object. + * @return Observable>> + * The list of Suggestion Sources. + */ + public getSources(options: FindListOptions = {}): Observable>> { + return this.suggestionSourcesDataService.findAll(options); + } + + /** + * Return the list of Suggestion Target for a given source + * + * @param source + * The source for which to find targets. + * @param options + * Find list options object. + * @param linksToFollow + * List of {@link FollowLinkConfig} that indicate which {@link HALLink}s should be automatically resolved. + * @return Observable>> + * The list of Suggestion Target. + */ + public getTargets( + source: string, + options: FindListOptions = {}, + ...linksToFollow: FollowLinkConfig[] + ): Observable>> { + options.searchParams = [new RequestParam('source', source)]; + + return this.suggestionTargetsDataService.searchBy(this.searchFindBySourceMethod, options, true, true, ...linksToFollow); + } + + /** + * Return the list of Suggestion Target for a given user + * + * @param userId + * The user Id for which to find targets. + * @param options + * Find list options object. + * @param linksToFollow + * List of {@link FollowLinkConfig} that indicate which {@link HALLink}s should be automatically resolved. + * @return Observable>> + * The list of Suggestion Target. + */ + public getTargetsByUser( + userId: string, + options: FindListOptions = {}, + ...linksToFollow: FollowLinkConfig[] + ): Observable>> { + options.searchParams = [new RequestParam('target', userId)]; + + return this.suggestionTargetsDataService.searchBy(this.searchFindByTargetMethod, options, true, true, ...linksToFollow); + } + + /** + * Return a Suggestion Target for a given id + * + * @param targetId + * The target id to retrieve. + * + * @return Observable> + * The list of Suggestion Target. + */ + public getTargetById(targetId: string): Observable> { + return this.suggestionTargetsDataService.findById(targetId); + } + + /** + * Used to delete Suggestion + * @suggestionId + */ + public deleteSuggestion(suggestionId: string): Observable> { + return this.suggestionsDataService.delete(suggestionId); + } + + /** + * Used to fetch Suggestion notification for user + * @suggestionId + */ + public getSuggestion(suggestionId: string, ...linksToFollow: FollowLinkConfig[]): Observable> { + return this.suggestionsDataService.findById(suggestionId, true, true, ...linksToFollow); + } + + /** + * Return the list of Suggestion for a given target and source + * + * @param target + * The target for which to find suggestions. + * @param source + * The source for which to find suggestions. + * @param options + * Find list options object. + * @param linksToFollow + * List of {@link FollowLinkConfig} that indicate which {@link HALLink}s should be automatically resolved. + * @return Observable>> + * The list of Suggestion. + */ + public getSuggestionsByTargetAndSource( + target: string, + source: string, + options: FindListOptions = {}, + ...linksToFollow: FollowLinkConfig[] + ): Observable>> { + options.searchParams = [ + new RequestParam('target', target), + new RequestParam('source', source) + ]; + + return this.suggestionsDataService.searchBy(this.searchFindByTargetAndSourceMethod, options, true, true, ...linksToFollow); + } + + /** + * Clear findByTargetAndSource suggestions requests from cache + */ + public clearSuggestionRequests() { + this.requestService.setStaleByHrefSubstring(this.searchFindByTargetAndSourceMethod); + } +} diff --git a/src/app/openaire/openaire.module.ts b/src/app/openaire/openaire.module.ts new file mode 100644 index 0000000000..22d04f3002 --- /dev/null +++ b/src/app/openaire/openaire.module.ts @@ -0,0 +1,72 @@ +import { NgModule } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { Action, StoreConfig, StoreModule } from '@ngrx/store'; +import { EffectsModule } from '@ngrx/effects'; + +import { CoreModule } from '../core/core.module'; +import { SharedModule } from '../shared/shared.module'; +import { storeModuleConfig } from '../app.reducer'; +import { openaireReducers, OpenaireState } from './openaire.reducer'; +import { SuggestionTargetsStateService } from './reciter-suggestions/suggestion-targets/suggestion-targets.state.service'; +import { SuggestionsService } from './reciter-suggestions/suggestions.service'; +import { OpenaireSuggestionsDataService } from '../core/openaire/reciter-suggestions/openaire-suggestions-data.service'; +import { SuggestionTargetsComponent } from './reciter-suggestions/suggestion-targets/suggestion-targets.component'; +import { SuggestionListElementComponent } from './reciter-suggestions/suggestion-list-element/suggestion-list-element.component'; +import { SuggestionEvidencesComponent } from './reciter-suggestions/suggestion-list-element/suggestion-evidences/suggestion-evidences.component'; +import { SuggestionActionsComponent } from './reciter-suggestions/suggestion-actions/suggestion-actions.component'; +import { SuggestionsPopupComponent } from './reciter-suggestions/suggestions-popup/suggestions-popup.component'; +import { SuggestionsNotificationComponent } from './reciter-suggestions/suggestions-notification/suggestions-notification.component'; +import { TranslateModule } from '@ngx-translate/core'; +import { SearchModule } from '../shared/search/search.module'; + +const MODULES = [ + CommonModule, + SharedModule, + CoreModule.forRoot(), + StoreModule.forFeature('openaire', openaireReducers, storeModuleConfig as StoreConfig), + TranslateModule +]; + +const COMPONENTS = [ + SuggestionTargetsComponent, + SuggestionActionsComponent, + SuggestionListElementComponent, + SuggestionEvidencesComponent, + SuggestionsPopupComponent, + SuggestionsNotificationComponent +]; + +const DIRECTIVES = [ ]; + + +const PROVIDERS = [ + SuggestionTargetsStateService, + SuggestionsService, + OpenaireSuggestionsDataService +]; + +@NgModule({ + imports: [ + ...MODULES, + SearchModule + ], + declarations: [ + ...COMPONENTS, + ...DIRECTIVES, + ], + providers: [ + ...PROVIDERS + ], + entryComponents: [ + ], + exports: [ + ...COMPONENTS, + ...DIRECTIVES + ] +}) + +/** + * This module handles all components that are necessary for the OpenAIRE components + */ +export class OpenaireModule { +} diff --git a/src/app/openaire/openaire.reducer.ts b/src/app/openaire/openaire.reducer.ts new file mode 100644 index 0000000000..cacf3c7283 --- /dev/null +++ b/src/app/openaire/openaire.reducer.ts @@ -0,0 +1,19 @@ +import { ActionReducerMap, createFeatureSelector } from '@ngrx/store'; + +import { + SuggestionTargetsReducer, + SuggestionTargetState +} from './reciter-suggestions/suggestion-targets/suggestion-targets.reducer'; + +/** + * The OpenAIRE State + */ +export interface OpenaireState { + 'suggestionTarget': SuggestionTargetState; +} + +export const openaireReducers: ActionReducerMap = { + suggestionTarget: SuggestionTargetsReducer, +}; + +export const openaireSelector = createFeatureSelector('openaire'); diff --git a/src/app/openaire/reciter-suggestions/selectors.ts b/src/app/openaire/reciter-suggestions/selectors.ts new file mode 100644 index 0000000000..e699b27dba --- /dev/null +++ b/src/app/openaire/reciter-suggestions/selectors.ts @@ -0,0 +1,97 @@ +import { createSelector, MemoizedSelector } from '@ngrx/store'; +import { subStateSelector } from '../../shared/selector.util'; +import { openaireSelector, OpenaireState } from '../openaire.reducer'; +import { OpenaireSuggestionTarget } from '../../core/openaire/reciter-suggestions/models/openaire-suggestion-target.model'; +import { SuggestionTargetState } from './suggestion-targets/suggestion-targets.reducer'; + +/** + * Returns the Reciter Suggestion Target state. + * @function _getReciterSuggestionTargetState + * @param {AppState} state Top level state. + * @return {OpenaireState} + */ +const _getReciterSuggestionTargetState = (state: any) => state.openaire; + +// Reciter Suggestion Targets +// ---------------------------------------------------------------------------- + +/** + * Returns the Reciter Suggestion Targets State. + * @function reciterSuggestionTargetStateSelector + * @return {OpenaireState} + */ +export function reciterSuggestionTargetStateSelector(): MemoizedSelector { + return subStateSelector(openaireSelector, 'suggestionTarget'); +} + +/** + * Returns the Reciter Suggestion Targets list. + * @function reciterSuggestionTargetObjectSelector + * @return {OpenaireReciterSuggestionTarget[]} + */ +export function reciterSuggestionTargetObjectSelector(): MemoizedSelector { + return subStateSelector(reciterSuggestionTargetStateSelector(), 'targets'); +} + +/** + * Returns true if the Reciter Suggestion Targets are loaded. + * @function isReciterSuggestionTargetLoadedSelector + * @return {boolean} + */ +export const isReciterSuggestionTargetLoadedSelector = createSelector(_getReciterSuggestionTargetState, + (state: OpenaireState) => state.suggestionTarget.loaded +); + +/** + * Returns true if the deduplication sets are processing. + * @function isDeduplicationSetsProcessingSelector + * @return {boolean} + */ +export const isreciterSuggestionTargetProcessingSelector = createSelector(_getReciterSuggestionTargetState, + (state: OpenaireState) => state.suggestionTarget.processing +); + +/** + * Returns the total available pages of Reciter Suggestion Targets. + * @function getreciterSuggestionTargetTotalPagesSelector + * @return {number} + */ +export const getreciterSuggestionTargetTotalPagesSelector = createSelector(_getReciterSuggestionTargetState, + (state: OpenaireState) => state.suggestionTarget.totalPages +); + +/** + * Returns the current page of Reciter Suggestion Targets. + * @function getreciterSuggestionTargetCurrentPageSelector + * @return {number} + */ +export const getreciterSuggestionTargetCurrentPageSelector = createSelector(_getReciterSuggestionTargetState, + (state: OpenaireState) => state.suggestionTarget.currentPage +); + +/** + * Returns the total number of Reciter Suggestion Targets. + * @function getreciterSuggestionTargetTotalsSelector + * @return {number} + */ +export const getreciterSuggestionTargetTotalsSelector = createSelector(_getReciterSuggestionTargetState, + (state: OpenaireState) => state.suggestionTarget.totalElements +); + +/** + * Returns Suggestion Targets for the current user. + * @function getCurrentUserReciterSuggestionTargetSelector + * @return {OpenaireSuggestionTarget[]} + */ +export const getCurrentUserSuggestionTargetsSelector = createSelector(_getReciterSuggestionTargetState, + (state: OpenaireState) => state.suggestionTarget.currentUserTargets +); + +/** + * Returns whether or not the user has consulted their suggestions + * @function getCurrentUserReciterSuggestionTargetSelector + * @return {boolean} + */ +export const getCurrentUserSuggestionTargetsVisitedSelector = createSelector(_getReciterSuggestionTargetState, + (state: OpenaireState) => state.suggestionTarget.currentUserTargetsVisited +); diff --git a/src/app/openaire/reciter-suggestions/suggestion-actions/suggestion-actions.component.html b/src/app/openaire/reciter-suggestions/suggestion-actions/suggestion-actions.component.html new file mode 100644 index 0000000000..7ec3e61395 --- /dev/null +++ b/src/app/openaire/reciter-suggestions/suggestion-actions/suggestion-actions.component.html @@ -0,0 +1,28 @@ +
+
+ + + + + + + +
+ + +
diff --git a/src/app/openaire/reciter-suggestions/suggestion-actions/suggestion-actions.component.scss b/src/app/openaire/reciter-suggestions/suggestion-actions/suggestion-actions.component.scss new file mode 100644 index 0000000000..8b13789179 --- /dev/null +++ b/src/app/openaire/reciter-suggestions/suggestion-actions/suggestion-actions.component.scss @@ -0,0 +1 @@ + diff --git a/src/app/openaire/reciter-suggestions/suggestion-actions/suggestion-actions.component.ts b/src/app/openaire/reciter-suggestions/suggestion-actions/suggestion-actions.component.ts new file mode 100644 index 0000000000..cf21901123 --- /dev/null +++ b/src/app/openaire/reciter-suggestions/suggestion-actions/suggestion-actions.component.ts @@ -0,0 +1,92 @@ +import { Component, EventEmitter, Input, Output } from '@angular/core'; +import { ItemType } from '../../../core/shared/item-relationships/item-type.model'; +import { NgbModal } from '@ng-bootstrap/ng-bootstrap'; +import { OpenaireSuggestion } from '../../../core/openaire/reciter-suggestions/models/openaire-suggestion.model'; +import { SuggestionApproveAndImport } from '../suggestion-list-element/suggestion-list-element.component'; +import { Collection } from '../../../core/shared/collection.model'; +import { take } from 'rxjs/operators'; +import { CreateItemParentSelectorComponent } from '../../../shared/dso-selector/modal-wrappers/create-item-parent-selector/create-item-parent-selector.component'; + +@Component({ + selector: 'ds-suggestion-actions', + styleUrls: [ './suggestion-actions.component.scss' ], + templateUrl: './suggestion-actions.component.html' +}) +export class SuggestionActionsComponent { + + @Input() object: OpenaireSuggestion; + + @Input() isBulk = false; + + @Input() hasEvidence = false; + + @Input() seeEvidence = false; + + @Input() isCollectionFixed = false; + + /** + * The component is used to Delete suggestion + */ + @Output() notMineClicked = new EventEmitter(); + + /** + * The component is used to approve & import + */ + @Output() approveAndImport = new EventEmitter(); + + /** + * The component is used to approve & import + */ + @Output() seeEvidences = new EventEmitter(); + + constructor(private modalService: NgbModal) { } + + /** + * Method called on clicking the button "approve & import", It opens a dialog for + * select a collection and it emits an approveAndImport event. + */ + openDialog(entity: ItemType) { + + const modalRef = this.modalService.open(CreateItemParentSelectorComponent); + modalRef.componentInstance.emitOnly = true; + modalRef.componentInstance.entityType = entity.label; + + modalRef.componentInstance.select.pipe(take(1)) + .subscribe((collection: Collection) => { + this.approveAndImport.emit({ + suggestion: this.isBulk ? undefined : this.object, + collectionId: collection.id + }); + }); + } + + approveAndImportCollectionFixed() { + this.approveAndImport.emit({ + suggestion: this.isBulk ? undefined : this.object, + collectionId: null + }); + } + + + /** + * Delete the suggestion + */ + notMine() { + this.notMineClicked.emit(this.isBulk ? undefined : this.object.id); + } + + /** + * Toggle See Evidence + */ + toggleSeeEvidences() { + this.seeEvidences.emit(!this.seeEvidence); + } + + notMineLabel(): string { + return this.isBulk ? 'reciter.suggestion.notMine.bulk' : 'reciter.suggestion.notMine' ; + } + + approveAndImportLabel(): string { + return this.isBulk ? 'reciter.suggestion.approveAndImport.bulk' : 'reciter.suggestion.approveAndImport'; + } +} diff --git a/src/app/openaire/reciter-suggestions/suggestion-list-element/suggestion-evidences/suggestion-evidences.component.html b/src/app/openaire/reciter-suggestions/suggestion-list-element/suggestion-evidences/suggestion-evidences.component.html new file mode 100644 index 0000000000..5ad4f0a978 --- /dev/null +++ b/src/app/openaire/reciter-suggestions/suggestion-list-element/suggestion-evidences/suggestion-evidences.component.html @@ -0,0 +1,20 @@ +
+
+ + + + + + + + + + + + + + + +
{{'reciter.suggestion.evidence.score' | translate}}{{'reciter.suggestion.evidence.type' | translate}}{{'reciter.suggestion.evidence.notes' | translate}}
{{evidences[evidence].score}}{{evidence | translate}}{{evidences[evidence].notes}}
+
+
diff --git a/src/app/openaire/reciter-suggestions/suggestion-list-element/suggestion-evidences/suggestion-evidences.component.scss b/src/app/openaire/reciter-suggestions/suggestion-list-element/suggestion-evidences/suggestion-evidences.component.scss new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/app/openaire/reciter-suggestions/suggestion-list-element/suggestion-evidences/suggestion-evidences.component.ts b/src/app/openaire/reciter-suggestions/suggestion-list-element/suggestion-evidences/suggestion-evidences.component.ts new file mode 100644 index 0000000000..e0536ae723 --- /dev/null +++ b/src/app/openaire/reciter-suggestions/suggestion-list-element/suggestion-evidences/suggestion-evidences.component.ts @@ -0,0 +1,15 @@ +import { Component, Input } from '@angular/core'; +import { fadeIn } from '../../../../shared/animations/fade'; +import { SuggestionEvidences } from '../../../../core/openaire/reciter-suggestions/models/openaire-suggestion.model'; + +@Component({ + selector: 'ds-suggestion-evidences', + styleUrls: [ './suggestion-evidences.component.scss' ], + templateUrl: './suggestion-evidences.component.html', + animations: [fadeIn] +}) +export class SuggestionEvidencesComponent { + + @Input() evidences: SuggestionEvidences; + +} diff --git a/src/app/openaire/reciter-suggestions/suggestion-list-element/suggestion-list-element.component.html b/src/app/openaire/reciter-suggestions/suggestion-list-element/suggestion-list-element.component.html new file mode 100644 index 0000000000..05f9c0ac77 --- /dev/null +++ b/src/app/openaire/reciter-suggestions/suggestion-list-element/suggestion-list-element.component.html @@ -0,0 +1,44 @@ +
+
+ +
+
+ +
+
+ +
+
+
{{'reciter.suggestion.totalScore' | translate}}
+ {{ object.score }} +
+
+ +
+ + + + +
+
+ +
+
+ +
+
+
+
diff --git a/src/app/openaire/reciter-suggestions/suggestion-list-element/suggestion-list-element.component.scss b/src/app/openaire/reciter-suggestions/suggestion-list-element/suggestion-list-element.component.scss new file mode 100644 index 0000000000..1c52209518 --- /dev/null +++ b/src/app/openaire/reciter-suggestions/suggestion-list-element/suggestion-list-element.component.scss @@ -0,0 +1,16 @@ +.issue-date { + color: #c8c8c8; +} + +.parent { + display: flex; + gap:10px; +} + +.import { + flex: initial; +} + +.suggestion-score { + font-size: 1.5rem; +} diff --git a/src/app/openaire/reciter-suggestions/suggestion-list-element/suggestion-list-element.component.ts b/src/app/openaire/reciter-suggestions/suggestion-list-element/suggestion-list-element.component.ts new file mode 100644 index 0000000000..8227dc3213 --- /dev/null +++ b/src/app/openaire/reciter-suggestions/suggestion-list-element/suggestion-list-element.component.ts @@ -0,0 +1,98 @@ +import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core'; + +import { NgbModal } from '@ng-bootstrap/ng-bootstrap'; + +import { fadeIn } from '../../../shared/animations/fade'; +import { OpenaireSuggestion } from '../../../core/openaire/reciter-suggestions/models/openaire-suggestion.model'; +import { Item } from '../../../core/shared/item.model'; +import { isNotEmpty } from '../../../shared/empty.util'; + +export interface SuggestionApproveAndImport { + suggestion: OpenaireSuggestion; + collectionId: string; +} + +@Component({ + selector: 'ds-suggestion-list-item', + styleUrls: ['./suggestion-list-element.component.scss'], + templateUrl: './suggestion-list-element.component.html', + animations: [fadeIn] +}) +export class SuggestionListElementComponent implements OnInit { + + @Input() object: OpenaireSuggestion; + + @Input() isSelected = false; + + @Input() isCollectionFixed = false; + + public listableObject: any; + + public seeEvidence = false; + + /** + * The component is used to Delete suggestion + */ + @Output() notMineClicked = new EventEmitter(); + + /** + * The component is used to approve & import + */ + @Output() approveAndImport = new EventEmitter(); + + /** + * New value whether the element is selected + */ + @Output() selected = new EventEmitter(); + + /** + * Initialize instance variables + * + * @param {NgbModal} modalService + */ + constructor(private modalService: NgbModal) { } + + ngOnInit() { + this.listableObject = { + indexableObject: Object.assign(new Item(), {id: this.object.id, metadata: this.object.metadata}), + hitHighlights: {} + }; + } + + /** + * Approve and import the suggestion + */ + onApproveAndImport(event: SuggestionApproveAndImport) { + this.approveAndImport.emit(event); + } + + /** + * Delete the suggestion + */ + onNotMine(suggestionId: string) { + this.notMineClicked.emit(suggestionId); + } + + /** + * Change is selected value. + */ + changeSelected(event) { + this.isSelected = event.target.checked; + this.selected.next(this.isSelected); + } + + /** + * See the Evidence + */ + hasEvidences() { + return isNotEmpty(this.object.evidences); + } + + /** + * Set the see evidence variable. + */ + onSeeEvidences(seeEvidence: boolean) { + this.seeEvidence = seeEvidence; + } + +} diff --git a/src/app/openaire/reciter-suggestions/suggestion-targets/suggestion-targets.actions.ts b/src/app/openaire/reciter-suggestions/suggestion-targets/suggestion-targets.actions.ts new file mode 100644 index 0000000000..6c44d40b91 --- /dev/null +++ b/src/app/openaire/reciter-suggestions/suggestion-targets/suggestion-targets.actions.ts @@ -0,0 +1,154 @@ +import { Action } from '@ngrx/store'; +import { type } from '../../../shared/ngrx/type'; +import { OpenaireSuggestionTarget } from '../../../core/openaire/reciter-suggestions/models/openaire-suggestion-target.model'; + +/** + * For each action type in an action group, make a simple + * enum object for all of this group's action types. + * + * The 'type' utility function coerces strings into string + * literal types and runs a simple check to guarantee all + * action types in the application are unique. + */ +export const SuggestionTargetActionTypes = { + ADD_TARGETS: type('dspace/integration/openaire/suggestions/target/ADD_TARGETS'), + CLEAR_TARGETS: type('dspace/integration/openaire/suggestions/target/CLEAR_TARGETS'), + RETRIEVE_TARGETS_BY_SOURCE: type('dspace/integration/openaire/suggestions/target/RETRIEVE_TARGETS_BY_SOURCE'), + RETRIEVE_TARGETS_BY_SOURCE_ERROR: type('dspace/integration/openaire/suggestions/target/RETRIEVE_TARGETS_BY_SOURCE_ERROR'), + ADD_USER_SUGGESTIONS: type('dspace/integration/openaire/suggestions/target/ADD_USER_SUGGESTIONS'), + REFRESH_USER_SUGGESTIONS: type('dspace/integration/openaire/suggestions/target/REFRESH_USER_SUGGESTIONS'), + MARK_USER_SUGGESTIONS_AS_VISITED: type('dspace/integration/openaire/suggestions/target/MARK_USER_SUGGESTIONS_AS_VISITED') +}; + +/* tslint:disable:max-classes-per-file */ + +/** + * An ngrx action to retrieve all the Suggestion Targets. + */ +export class RetrieveTargetsBySourceAction implements Action { + type = SuggestionTargetActionTypes.RETRIEVE_TARGETS_BY_SOURCE; + payload: { + source: string; + elementsPerPage: number; + currentPage: number; + }; + + /** + * Create a new RetrieveTargetsBySourceAction. + * + * @param source + * the source for which to retrieve suggestion targets + * @param elementsPerPage + * the number of targets per page + * @param currentPage + * The page number to retrieve + */ + constructor(source: string, elementsPerPage: number, currentPage: number) { + this.payload = { + source, + elementsPerPage, + currentPage + }; + } +} + +/** + * An ngrx action for retrieving 'all Suggestion Targets' error. + */ +export class RetrieveAllTargetsErrorAction implements Action { + type = SuggestionTargetActionTypes.RETRIEVE_TARGETS_BY_SOURCE_ERROR; +} + +/** + * An ngrx action to load the Suggestion Target objects. + */ +export class AddTargetAction implements Action { + type = SuggestionTargetActionTypes.ADD_TARGETS; + payload: { + targets: OpenaireSuggestionTarget[]; + totalPages: number; + currentPage: number; + totalElements: number; + }; + + /** + * Create a new AddTargetAction. + * + * @param targets + * the list of targets + * @param totalPages + * the total available pages of targets + * @param currentPage + * the current page + * @param totalElements + * the total available Suggestion Targets + */ + constructor(targets: OpenaireSuggestionTarget[], totalPages: number, currentPage: number, totalElements: number) { + this.payload = { + targets, + totalPages, + currentPage, + totalElements + }; + } + +} + +/** + * An ngrx action to load the user Suggestion Target object. + * Called by the ??? effect. + */ +export class AddUserSuggestionsAction implements Action { + type = SuggestionTargetActionTypes.ADD_USER_SUGGESTIONS; + payload: { + suggestionTargets: OpenaireSuggestionTarget[]; + }; + + /** + * Create a new AddUserSuggestionsAction. + * + * @param suggestionTargets + * the user suggestions target + */ + constructor(suggestionTargets: OpenaireSuggestionTarget[]) { + this.payload = { suggestionTargets }; + } + +} + +/** + * An ngrx action to reload the user Suggestion Target object. + * Called by the ??? effect. + */ +export class RefreshUserSuggestionsAction implements Action { + type = SuggestionTargetActionTypes.REFRESH_USER_SUGGESTIONS; +} + +/** + * An ngrx action to Mark User Suggestions As Visited. + * Called by the ??? effect. + */ +export class MarkUserSuggestionsAsVisitedAction implements Action { + type = SuggestionTargetActionTypes.MARK_USER_SUGGESTIONS_AS_VISITED; +} + +/** + * An ngrx action to clear targets state. + */ +export class ClearSuggestionTargetsAction implements Action { + type = SuggestionTargetActionTypes.CLEAR_TARGETS; +} + +/* tslint:enable:max-classes-per-file */ + +/** + * Export a type alias of all actions in this action group + * so that reducers can easily compose action types. + */ +export type SuggestionTargetsActions + = AddTargetAction + | AddUserSuggestionsAction + | ClearSuggestionTargetsAction + | MarkUserSuggestionsAsVisitedAction + | RetrieveTargetsBySourceAction + | RetrieveAllTargetsErrorAction; diff --git a/src/app/openaire/reciter-suggestions/suggestion-targets/suggestion-targets.component.html b/src/app/openaire/reciter-suggestions/suggestion-targets/suggestion-targets.component.html new file mode 100644 index 0000000000..791e694ba9 --- /dev/null +++ b/src/app/openaire/reciter-suggestions/suggestion-targets/suggestion-targets.component.html @@ -0,0 +1,51 @@ +
+
+
+ + + + + + + + +
+ + + + + + + + + + + + + +
{{'reciter.suggestion.table.name' | translate}}{{'reciter.suggestion.table.actions' | translate}}
+ {{targetElement.display}} + +
+ +
+
+
+
+
+
+
+
diff --git a/src/app/openaire/reciter-suggestions/suggestion-targets/suggestion-targets.component.scss b/src/app/openaire/reciter-suggestions/suggestion-targets/suggestion-targets.component.scss new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/app/openaire/reciter-suggestions/suggestion-targets/suggestion-targets.component.ts b/src/app/openaire/reciter-suggestions/suggestion-targets/suggestion-targets.component.ts new file mode 100644 index 0000000000..b9ed6c4e87 --- /dev/null +++ b/src/app/openaire/reciter-suggestions/suggestion-targets/suggestion-targets.component.ts @@ -0,0 +1,150 @@ +import { Component, Input, OnInit } from '@angular/core'; +import { Router } from '@angular/router'; + +import { Observable, Subscription } from 'rxjs'; +import { distinctUntilChanged, take } from 'rxjs/operators'; + +import { OpenaireSuggestionTarget } from '../../../core/openaire/reciter-suggestions/models/openaire-suggestion-target.model'; +import { hasValue } from '../../../shared/empty.util'; +import { PaginationComponentOptions } from '../../../shared/pagination/pagination-component-options.model'; +import { SuggestionTargetsStateService } from './suggestion-targets.state.service'; +import { getSuggestionPageRoute } from '../../../suggestions-page/suggestions-page-routing-paths'; +import { SuggestionsService } from '../suggestions.service'; +import { PaginationService } from '../../../core/pagination/pagination.service'; + +/** + * Component to display the Suggestion Target list. + */ +@Component({ + selector: 'ds-suggestion-target', + templateUrl: './suggestion-targets.component.html', + styleUrls: ['./suggestion-targets.component.scss'], +}) +export class SuggestionTargetsComponent implements OnInit { + + /** + * The source for which to list targets + */ + @Input() source: string; + + /** + * The pagination system configuration for HTML listing. + * @type {PaginationComponentOptions} + */ + public paginationConfig: PaginationComponentOptions = Object.assign(new PaginationComponentOptions(), { + id: 'stp', + pageSizeOptions: [5, 10, 20, 40, 60] + }); + + /** + * The Suggestion Target list. + */ + public targets$: Observable; + /** + * The total number of Suggestion Targets. + */ + public totalElements$: Observable; + /** + * Array to track all the component subscriptions. Useful to unsubscribe them with 'onDestroy'. + * @type {Array} + */ + protected subs: Subscription[] = []; + + /** + * Initialize the component variables. + * @param {PaginationService} paginationService + * @param {SuggestionTargetsStateService} suggestionTargetsStateService + * @param {SuggestionsService} suggestionService + * @param {Router} router + */ + constructor( + private paginationService: PaginationService, + private suggestionTargetsStateService: SuggestionTargetsStateService, + private suggestionService: SuggestionsService, + private router: Router + ) { + } + + /** + * Component initialization. + */ + ngOnInit(): void { + this.targets$ = this.suggestionTargetsStateService.getReciterSuggestionTargets(); + this.totalElements$ = this.suggestionTargetsStateService.getReciterSuggestionTargetsTotals(); + } + + /** + * First Suggestion Targets loading after view initialization. + */ + ngAfterViewInit(): void { + this.subs.push( + this.suggestionTargetsStateService.isReciterSuggestionTargetsLoaded().pipe( + take(1) + ).subscribe(() => { + this.getSuggestionTargets(); + }) + ); + } + + /** + * Returns the information about the loading status of the Suggestion Targets (if it's running or not). + * + * @return Observable + * 'true' if the targets are loading, 'false' otherwise. + */ + public isTargetsLoading(): Observable { + return this.suggestionTargetsStateService.isReciterSuggestionTargetsLoading(); + } + + /** + * Returns the information about the processing status of the Suggestion Targets (if it's running or not). + * + * @return Observable + * 'true' if there are operations running on the targets (ex.: a REST call), 'false' otherwise. + */ + public isTargetsProcessing(): Observable { + return this.suggestionTargetsStateService.isReciterSuggestionTargetsProcessing(); + } + + /** + * Redirect to suggestion page. + * + * @param {string} id + * the id of suggestion target + * @param {string} name + * the name of suggestion target + */ + public redirectToSuggestions(id: string, name: string) { + this.router.navigate([getSuggestionPageRoute(id)]); + } + + /** + * Unsubscribe from all subscriptions. + */ + ngOnDestroy(): void { + this.suggestionTargetsStateService.dispatchClearSuggestionTargetsAction(); + this.subs + .filter((sub) => hasValue(sub)) + .forEach((sub) => sub.unsubscribe()); + } + + /** + * Dispatch the Suggestion Targets retrival. + */ + public getSuggestionTargets(): void { + this.paginationService.getCurrentPagination(this.paginationConfig.id, this.paginationConfig).pipe( + distinctUntilChanged(), + take(1) + ).subscribe((options: PaginationComponentOptions) => { + this.suggestionTargetsStateService.dispatchRetrieveReciterSuggestionTargets( + this.source, + options.pageSize, + options.currentPage + ); + }); + } + + public getTargetUuid(target: OpenaireSuggestionTarget) { + return this.suggestionService.getTargetUuid(target); + } +} diff --git a/src/app/openaire/reciter-suggestions/suggestion-targets/suggestion-targets.effects.ts b/src/app/openaire/reciter-suggestions/suggestion-targets/suggestion-targets.effects.ts new file mode 100644 index 0000000000..85e871403c --- /dev/null +++ b/src/app/openaire/reciter-suggestions/suggestion-targets/suggestion-targets.effects.ts @@ -0,0 +1,110 @@ +import { Injectable } from '@angular/core'; + +import { Store } from '@ngrx/store'; +import { Actions, Effect, ofType } from '@ngrx/effects'; +import { TranslateService } from '@ngx-translate/core'; +import { catchError, map, switchMap, tap } from 'rxjs/operators'; +import { of } from 'rxjs'; + +import { + AddTargetAction, + AddUserSuggestionsAction, + RefreshUserSuggestionsAction, + RetrieveAllTargetsErrorAction, + RetrieveTargetsBySourceAction, + SuggestionTargetActionTypes, +} from './suggestion-targets.actions'; +import { PaginatedList } from '../../../core/data/paginated-list.model'; +import { SuggestionsService } from '../suggestions.service'; +import { NotificationsService } from '../../../shared/notifications/notifications.service'; +import { AuthActionTypes, RetrieveAuthenticatedEpersonSuccessAction } from '../../../core/auth/auth.actions'; +import { OpenaireSuggestionTarget } from '../../../core/openaire/reciter-suggestions/models/openaire-suggestion-target.model'; +import { EPerson } from '../../../core/eperson/models/eperson.model'; + +/** + * Provides effect methods for the Suggestion Targets actions. + */ +@Injectable() +export class SuggestionTargetsEffects { + + /** + * Retrieve all Suggestion Targets managing pagination and errors. + */ + @Effect() retrieveTargetsBySource$ = this.actions$.pipe( + ofType(SuggestionTargetActionTypes.RETRIEVE_TARGETS_BY_SOURCE), + switchMap((action: RetrieveTargetsBySourceAction) => { + return this.suggestionsService.getTargets( + action.payload.source, + action.payload.elementsPerPage, + action.payload.currentPage + ).pipe( + map((targets: PaginatedList) => + new AddTargetAction(targets.page, targets.totalPages, targets.currentPage, targets.totalElements) + ), + catchError((error: Error) => { + if (error) { + console.error(error.message); + } + return of(new RetrieveAllTargetsErrorAction()); + }) + ); + }) + ); + + /** + * Show a notification on error. + */ + @Effect({ dispatch: false }) retrieveAllTargetsErrorAction$ = this.actions$.pipe( + ofType(SuggestionTargetActionTypes.RETRIEVE_TARGETS_BY_SOURCE_ERROR), + tap(() => { + this.notificationsService.error(null, this.translate.get('reciter.suggestion.target.error.service.retrieve')); + }) + ); + + /** + * Show a notification on error. + */ + @Effect() retrieveUserTargets$ = this.actions$.pipe( + ofType(AuthActionTypes.RETRIEVE_AUTHENTICATED_EPERSON_SUCCESS), + switchMap((action: RetrieveAuthenticatedEpersonSuccessAction) => { + return this.suggestionsService.retrieveCurrentUserSuggestions(action.payload).pipe( + map((suggestionTargets: OpenaireSuggestionTarget[]) => new AddUserSuggestionsAction(suggestionTargets)) + ); + })); + + /** + * Fetch the current user suggestion + */ + @Effect() refreshUserTargets$ = this.actions$.pipe( + ofType(SuggestionTargetActionTypes.REFRESH_USER_SUGGESTIONS), + switchMap((action: RefreshUserSuggestionsAction) => { + return this.store$.select((state: any) => state.core.auth.user) + .pipe( + switchMap((user: EPerson) => { + return this.suggestionsService.retrieveCurrentUserSuggestions(user) + .pipe( + map((suggestionTargets: OpenaireSuggestionTarget[]) => new AddUserSuggestionsAction(suggestionTargets)), + catchError((errors) => of(errors)) + ); + }), + catchError((errors) => of(errors)) + ); + })); + + /** + * Initialize the effect class variables. + * @param {Actions} actions$ + * @param {Store} store$ + * @param {TranslateService} translate + * @param {NotificationsService} notificationsService + * @param {SuggestionsService} suggestionsService + */ + constructor( + private actions$: Actions, + private store$: Store, + private translate: TranslateService, + private notificationsService: NotificationsService, + private suggestionsService: SuggestionsService + ) { + } +} diff --git a/src/app/openaire/reciter-suggestions/suggestion-targets/suggestion-targets.reducer.ts b/src/app/openaire/reciter-suggestions/suggestion-targets/suggestion-targets.reducer.ts new file mode 100644 index 0000000000..f8bd53ec05 --- /dev/null +++ b/src/app/openaire/reciter-suggestions/suggestion-targets/suggestion-targets.reducer.ts @@ -0,0 +1,100 @@ +import { SuggestionTargetActionTypes, SuggestionTargetsActions } from './suggestion-targets.actions'; +import { OpenaireSuggestionTarget } from '../../../core/openaire/reciter-suggestions/models/openaire-suggestion-target.model'; + +/** + * The interface representing the OpenAIRE suggestion targets state. + */ +export interface SuggestionTargetState { + targets: OpenaireSuggestionTarget[]; + processing: boolean; + loaded: boolean; + totalPages: number; + currentPage: number; + totalElements: number; + currentUserTargets: OpenaireSuggestionTarget[]; + currentUserTargetsVisited: boolean; +} + +/** + * Used for the OpenAIRE Suggestion Target state initialization. + */ +const SuggestionTargetInitialState: SuggestionTargetState = { + targets: [], + processing: false, + loaded: false, + totalPages: 0, + currentPage: 0, + totalElements: 0, + currentUserTargets: null, + currentUserTargetsVisited: false +}; + +/** + * The OpenAIRE Broker Topic Reducer + * + * @param state + * the current state initialized with SuggestionTargetInitialState + * @param action + * the action to perform on the state + * @return SuggestionTargetState + * the new state + */ +export function SuggestionTargetsReducer(state = SuggestionTargetInitialState, action: SuggestionTargetsActions): SuggestionTargetState { + switch (action.type) { + case SuggestionTargetActionTypes.RETRIEVE_TARGETS_BY_SOURCE: { + return Object.assign({}, state, { + targets: [], + processing: true + }); + } + + case SuggestionTargetActionTypes.ADD_TARGETS: { + return Object.assign({}, state, { + targets: state.targets.concat(action.payload.targets), + processing: false, + loaded: true, + totalPages: action.payload.totalPages, + currentPage: state.currentPage, + totalElements: action.payload.totalElements + }); + } + + case SuggestionTargetActionTypes.RETRIEVE_TARGETS_BY_SOURCE_ERROR: { + return Object.assign({}, state, { + targets: [], + processing: false, + loaded: true, + totalPages: 0, + currentPage: 0, + totalElements: 0, + }); + } + + case SuggestionTargetActionTypes.ADD_USER_SUGGESTIONS: { + return Object.assign({}, state, { + currentUserTargets: action.payload.suggestionTargets + }); + } + + case SuggestionTargetActionTypes.MARK_USER_SUGGESTIONS_AS_VISITED: { + return Object.assign({}, state, { + currentUserTargetsVisited: true + }); + } + + case SuggestionTargetActionTypes.CLEAR_TARGETS: { + return Object.assign({}, state, { + targets: [], + processing: false, + loaded: false, + totalPages: 0, + currentPage: 0, + totalElements: 0, + }); + } + + default: { + return state; + } + } +} diff --git a/src/app/openaire/reciter-suggestions/suggestion-targets/suggestion-targets.state.service.ts b/src/app/openaire/reciter-suggestions/suggestion-targets/suggestion-targets.state.service.ts new file mode 100644 index 0000000000..2e05bce0a9 --- /dev/null +++ b/src/app/openaire/reciter-suggestions/suggestion-targets/suggestion-targets.state.service.ts @@ -0,0 +1,164 @@ +import { Injectable } from '@angular/core'; + +import { select, Store } from '@ngrx/store'; +import { Observable } from 'rxjs'; +import { map } from 'rxjs/operators'; + +import { + getCurrentUserSuggestionTargetsSelector, + getCurrentUserSuggestionTargetsVisitedSelector, + getreciterSuggestionTargetCurrentPageSelector, + getreciterSuggestionTargetTotalsSelector, + isReciterSuggestionTargetLoadedSelector, + isreciterSuggestionTargetProcessingSelector, + reciterSuggestionTargetObjectSelector +} from '../selectors'; +import { OpenaireSuggestionTarget } from '../../../core/openaire/reciter-suggestions/models/openaire-suggestion-target.model'; +import { + ClearSuggestionTargetsAction, + MarkUserSuggestionsAsVisitedAction, + RefreshUserSuggestionsAction, + RetrieveTargetsBySourceAction +} from './suggestion-targets.actions'; +import { OpenaireState } from '../../openaire.reducer'; + +/** + * The service handling the Suggestion targets State. + */ +@Injectable() +export class SuggestionTargetsStateService { + + /** + * Initialize the service variables. + * @param {Store} store + */ + constructor(private store: Store) { } + + /** + * Returns the list of Reciter Suggestion Targets from the state. + * + * @return Observable + * The list of Reciter Suggestion Targets. + */ + public getReciterSuggestionTargets(): Observable { + return this.store.pipe(select(reciterSuggestionTargetObjectSelector())); + } + + /** + * Returns the information about the loading status of the Reciter Suggestion Targets (if it's running or not). + * + * @return Observable + * 'true' if the targets are loading, 'false' otherwise. + */ + public isReciterSuggestionTargetsLoading(): Observable { + return this.store.pipe( + select(isReciterSuggestionTargetLoadedSelector), + map((loaded: boolean) => !loaded) + ); + } + + /** + * Returns the information about the loading status of the Reciter Suggestion Targets (whether or not they were loaded). + * + * @return Observable + * 'true' if the targets are loaded, 'false' otherwise. + */ + public isReciterSuggestionTargetsLoaded(): Observable { + return this.store.pipe(select(isReciterSuggestionTargetLoadedSelector)); + } + + /** + * Returns the information about the processing status of the Reciter Suggestion Targets (if it's running or not). + * + * @return Observable + * 'true' if there are operations running on the targets (ex.: a REST call), 'false' otherwise. + */ + public isReciterSuggestionTargetsProcessing(): Observable { + return this.store.pipe(select(isreciterSuggestionTargetProcessingSelector)); + } + + /** + * Returns, from the state, the total available pages of the Reciter Suggestion Targets. + * + * @return Observable + * The number of the Reciter Suggestion Targets pages. + */ + public getReciterSuggestionTargetsTotalPages(): Observable { + return this.store.pipe(select(getreciterSuggestionTargetTotalsSelector)); + } + + /** + * Returns the current page of the Reciter Suggestion Targets, from the state. + * + * @return Observable + * The number of the current Reciter Suggestion Targets page. + */ + public getReciterSuggestionTargetsCurrentPage(): Observable { + return this.store.pipe(select(getreciterSuggestionTargetCurrentPageSelector)); + } + + /** + * Returns the total number of the Reciter Suggestion Targets. + * + * @return Observable + * The number of the Reciter Suggestion Targets. + */ + public getReciterSuggestionTargetsTotals(): Observable { + return this.store.pipe(select(getreciterSuggestionTargetTotalsSelector)); + } + + /** + * Dispatch a request to change the Reciter Suggestion Targets state, retrieving the targets from the server. + * + * @param source + * the source for which to retrieve suggestion targets + * @param elementsPerPage + * The number of the targets per page. + * @param currentPage + * The number of the current page. + */ + public dispatchRetrieveReciterSuggestionTargets(source: string, elementsPerPage: number, currentPage: number): void { + this.store.dispatch(new RetrieveTargetsBySourceAction(source, elementsPerPage, currentPage)); + } + + /** + * Returns, from the state, the reciter suggestion targets for the current user. + * + * @return Observable + * The Reciter Suggestion Targets object. + */ + public getCurrentUserSuggestionTargets(): Observable { + return this.store.pipe(select(getCurrentUserSuggestionTargetsSelector)); + } + + /** + * Returns, from the state, whether or not the user has consulted their suggestion targets. + * + * @return Observable + * True if user already visited, false otherwise. + */ + public hasUserVisitedSuggestions(): Observable { + return this.store.pipe(select(getCurrentUserSuggestionTargetsVisitedSelector)); + } + + /** + * Dispatch a new MarkUserSuggestionsAsVisitedAction + */ + public dispatchMarkUserSuggestionsAsVisitedAction(): void { + this.store.dispatch(new MarkUserSuggestionsAsVisitedAction()); + } + + /** + * Dispatch an action to clear the Reciter Suggestion Targets state. + */ + public dispatchClearSuggestionTargetsAction(): void { + this.store.dispatch(new ClearSuggestionTargetsAction()); + } + + /** + * Dispatch an action to refresh the user suggestions. + */ + public dispatchRefreshUserSuggestionsAction(): void { + this.store.dispatch(new RefreshUserSuggestionsAction()); + } +} diff --git a/src/app/openaire/reciter-suggestions/suggestions-notification/suggestions-notification.component.html b/src/app/openaire/reciter-suggestions/suggestions-notification/suggestions-notification.component.html new file mode 100644 index 0000000000..577aa496b3 --- /dev/null +++ b/src/app/openaire/reciter-suggestions/suggestions-notification/suggestions-notification.component.html @@ -0,0 +1,8 @@ + + +
+
+
+
+
+
diff --git a/src/app/openaire/reciter-suggestions/suggestions-notification/suggestions-notification.component.scss b/src/app/openaire/reciter-suggestions/suggestions-notification/suggestions-notification.component.scss new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/app/openaire/reciter-suggestions/suggestions-notification/suggestions-notification.component.ts b/src/app/openaire/reciter-suggestions/suggestions-notification/suggestions-notification.component.ts new file mode 100644 index 0000000000..094dfab017 --- /dev/null +++ b/src/app/openaire/reciter-suggestions/suggestions-notification/suggestions-notification.component.ts @@ -0,0 +1,42 @@ +import { Component, OnInit } from '@angular/core'; +import { OpenaireSuggestionTarget } from '../../../core/openaire/reciter-suggestions/models/openaire-suggestion-target.model'; +import { TranslateService } from '@ngx-translate/core'; +import { SuggestionTargetsStateService } from '../suggestion-targets/suggestion-targets.state.service'; +import { NotificationsService } from '../../../shared/notifications/notifications.service'; +import { SuggestionsService } from '../suggestions.service'; +import { Observable } from 'rxjs'; + +@Component({ + selector: 'ds-suggestions-notification', + templateUrl: './suggestions-notification.component.html', + styleUrls: ['./suggestions-notification.component.scss'] +}) +export class SuggestionsNotificationComponent implements OnInit { + + labelPrefix = 'mydspace.'; + + /** + * The user suggestion targets. + */ + suggestionsRD$: Observable; + + constructor( + private translateService: TranslateService, + private reciterSuggestionStateService: SuggestionTargetsStateService, + private notificationsService: NotificationsService, + private suggestionsService: SuggestionsService + ) { } + + ngOnInit() { + this.suggestionsRD$ = this.reciterSuggestionStateService.getCurrentUserSuggestionTargets(); + } + + /** + * Interpolated params to build the notification suggestions notification. + * @param suggestionTarget + */ + public getNotificationSuggestionInterpolation(suggestionTarget: OpenaireSuggestionTarget): any { + return this.suggestionsService.getNotificationSuggestionInterpolation(suggestionTarget); + } + +} diff --git a/src/app/openaire/reciter-suggestions/suggestions-popup/suggestions-popup.component.html b/src/app/openaire/reciter-suggestions/suggestions-popup/suggestions-popup.component.html new file mode 100644 index 0000000000..8b13789179 --- /dev/null +++ b/src/app/openaire/reciter-suggestions/suggestions-popup/suggestions-popup.component.html @@ -0,0 +1 @@ + diff --git a/src/app/openaire/reciter-suggestions/suggestions-popup/suggestions-popup.component.scss b/src/app/openaire/reciter-suggestions/suggestions-popup/suggestions-popup.component.scss new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/app/openaire/reciter-suggestions/suggestions-popup/suggestions-popup.component.spec.ts b/src/app/openaire/reciter-suggestions/suggestions-popup/suggestions-popup.component.spec.ts new file mode 100644 index 0000000000..67678354ca --- /dev/null +++ b/src/app/openaire/reciter-suggestions/suggestions-popup/suggestions-popup.component.spec.ts @@ -0,0 +1,79 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { SuggestionsPopupComponent } from './suggestions-popup.component'; +import { TranslateModule } from '@ngx-translate/core'; +import { SuggestionTargetsStateService } from '../suggestion-targets/suggestion-targets.state.service'; +import { NotificationsService } from '../../../shared/notifications/notifications.service'; +import { NotificationsServiceStub } from '../../../shared/testing/notifications-service.stub'; +import { NO_ERRORS_SCHEMA } from '@angular/core'; +import { of as observableOf } from 'rxjs'; +import { mockSuggestionTargetsObjectOne } from '../../../shared/mocks/reciter-suggestion-targets.mock'; +import { SuggestionsService } from '../suggestions.service'; + +describe('SuggestionsPopupComponent', () => { + let component: SuggestionsPopupComponent; + let fixture: ComponentFixture; + + const suggestionStateService = jasmine.createSpyObj('SuggestionTargetsStateService', { + hasUserVisitedSuggestions: jasmine.createSpy('hasUserVisitedSuggestions'), + getCurrentUserSuggestionTargets: jasmine.createSpy('getCurrentUserSuggestionTargets'), + dispatchMarkUserSuggestionsAsVisitedAction: jasmine.createSpy('dispatchMarkUserSuggestionsAsVisitedAction') + }); + + const mockNotificationInterpolation = { count: 12, source: 'source', suggestionId: 'id', displayName: 'displayName' }; + const suggestionService = jasmine.createSpyObj('SuggestionService', { + getNotificationSuggestionInterpolation: + jasmine.createSpy('getNotificationSuggestionInterpolation').and.returnValue(mockNotificationInterpolation) + }); + + beforeEach(async(() => { + TestBed.configureTestingModule({ + imports: [TranslateModule.forRoot()], + declarations: [ SuggestionsPopupComponent ], + providers: [ + { provide: SuggestionTargetsStateService, useValue: suggestionStateService }, + { provide: SuggestionsService, useValue: suggestionService }, + { provide: NotificationsService, useValue: new NotificationsServiceStub() }, + ], + schemas: [NO_ERRORS_SCHEMA] + + }) + .compileComponents(); + })); + + describe('should create', () => { + + beforeEach(() => { + fixture = TestBed.createComponent(SuggestionsPopupComponent); + component = fixture.componentInstance; + spyOn(component, 'initializePopup').and.returnValue(null); + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + expect(component.initializePopup).toHaveBeenCalled(); + }); + + }); + + describe('when there are publication suggestions', () => { + + beforeEach(() => { + + suggestionStateService.hasUserVisitedSuggestions.and.returnValue(observableOf(false)); + suggestionStateService.getCurrentUserSuggestionTargets.and.returnValue(observableOf([mockSuggestionTargetsObjectOne])); + suggestionStateService.dispatchMarkUserSuggestionsAsVisitedAction.and.returnValue(observableOf(null)); + + fixture = TestBed.createComponent(SuggestionsPopupComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should show a notification when new publication suggestions are available', () => { + expect((component as any).notificationsService.success).toHaveBeenCalled(); + expect(suggestionStateService.dispatchMarkUserSuggestionsAsVisitedAction).toHaveBeenCalled(); + }); + + }); +}); diff --git a/src/app/openaire/reciter-suggestions/suggestions-popup/suggestions-popup.component.ts b/src/app/openaire/reciter-suggestions/suggestions-popup/suggestions-popup.component.ts new file mode 100644 index 0000000000..6135cd99ea --- /dev/null +++ b/src/app/openaire/reciter-suggestions/suggestions-popup/suggestions-popup.component.ts @@ -0,0 +1,67 @@ +import { Component, OnDestroy, OnInit } from '@angular/core'; +import { TranslateService } from '@ngx-translate/core'; +import { SuggestionTargetsStateService } from '../suggestion-targets/suggestion-targets.state.service'; +import { NotificationsService } from '../../../shared/notifications/notifications.service'; +import { SuggestionsService } from '../suggestions.service'; +import { takeUntil } from 'rxjs/operators'; +import { OpenaireSuggestionTarget } from '../../../core/openaire/reciter-suggestions/models/openaire-suggestion-target.model'; +import { isNotEmpty } from '../../../shared/empty.util'; +import { combineLatest, Subject } from 'rxjs'; + +@Component({ + selector: 'ds-suggestions-popup', + templateUrl: './suggestions-popup.component.html', + styleUrls: ['./suggestions-popup.component.scss'] +}) +export class SuggestionsPopupComponent implements OnInit, OnDestroy { + + labelPrefix = 'mydspace.'; + + subscription; + + constructor( + private translateService: TranslateService, + private reciterSuggestionStateService: SuggestionTargetsStateService, + private notificationsService: NotificationsService, + private suggestionsService: SuggestionsService + ) { } + + ngOnInit() { + this.initializePopup(); + } + + public initializePopup() { + const notifier = new Subject(); + this.subscription = combineLatest([ + this.reciterSuggestionStateService.getCurrentUserSuggestionTargets(), + this.reciterSuggestionStateService.hasUserVisitedSuggestions() + ]).pipe(takeUntil(notifier)).subscribe(([suggestions, visited]) => { + if (isNotEmpty(suggestions)) { + if (!visited) { + suggestions.forEach((suggestionTarget: OpenaireSuggestionTarget) => this.showNotificationForNewSuggestions(suggestionTarget)); + this.reciterSuggestionStateService.dispatchMarkUserSuggestionsAsVisitedAction(); + notifier.next(); + notifier.complete(); + } + } + }); + } + + /** + * Show a notification to user for a new suggestions detected + * @param suggestionTarget + * @private + */ + private showNotificationForNewSuggestions(suggestionTarget: OpenaireSuggestionTarget): void { + const content = this.translateService.instant(this.labelPrefix + 'notification.suggestion', + this.suggestionsService.getNotificationSuggestionInterpolation(suggestionTarget)); + this.notificationsService.success('', content, {timeOut:0}, true); + } + + ngOnDestroy() { + if (this.subscription) { + this.subscription.unsubscribe(); + } + } + +} diff --git a/src/app/openaire/reciter-suggestions/suggestions.service.ts b/src/app/openaire/reciter-suggestions/suggestions.service.ts new file mode 100644 index 0000000000..de743d95e3 --- /dev/null +++ b/src/app/openaire/reciter-suggestions/suggestions.service.ts @@ -0,0 +1,296 @@ +import { Injectable } from '@angular/core'; + +import { of, forkJoin, Observable } from 'rxjs'; +import { catchError, map, mergeMap, take } from 'rxjs/operators'; + +import { OpenaireSuggestionsDataService } from '../../core/openaire/reciter-suggestions/openaire-suggestions-data.service'; +import { SortDirection, SortOptions } from '../../core/cache/models/sort-options.model'; +import { FindListOptions } from '../../core/data/request.models'; +import { RemoteData } from '../../core/data/remote-data'; +import { PaginatedList } from '../../core/data/paginated-list.model'; +import { OpenaireSuggestionTarget } from '../../core/openaire/reciter-suggestions/models/openaire-suggestion-target.model'; +import { ResearcherProfileService } from '../../core/profile/researcher-profile.service'; +import { AuthService } from '../../core/auth/auth.service'; +import { EPerson } from '../../core/eperson/models/eperson.model'; +import { hasValue, isNotEmpty } from '../../shared/empty.util'; +import { ResearcherProfile } from '../../core/profile/model/researcher-profile.model'; +import { + getAllSucceededRemoteDataPayload, + getFinishedRemoteData, + getFirstSucceededRemoteDataPayload, + getFirstSucceededRemoteListPayload +} from '../../core/shared/operators'; +import { OpenaireSuggestion } from '../../core/openaire/reciter-suggestions/models/openaire-suggestion.model'; +import { WorkspaceitemDataService } from '../../core/submission/workspaceitem-data.service'; +import { TranslateService } from '@ngx-translate/core'; +import { NoContent } from '../../core/shared/NoContent.model'; +import { environment } from '../../../environments/environment'; +import { SuggestionConfig } from '../../../config/layout-config.interfaces'; +import { WorkspaceItem } from '../../core/submission/models/workspaceitem.model'; + +export interface SuggestionBulkResult { + success: number; + fails: number; +} + +/** + * The service handling all Suggestion Target requests to the REST service. + */ +@Injectable() +export class SuggestionsService { + + /** + * Initialize the service variables. + * @param {AuthService} authService + * @param {ResearcherProfileService} researcherProfileService + * @param {OpenaireSuggestionsDataService} suggestionsDataService + */ + constructor( + private authService: AuthService, + private researcherProfileService: ResearcherProfileService, + private suggestionsDataService: OpenaireSuggestionsDataService, + private translateService: TranslateService + ) { + } + + /** + * Return the list of Suggestion Target managing pagination and errors. + * + * @param source + * The source for which to retrieve targets + * @param elementsPerPage + * The number of the target per page + * @param currentPage + * The page number to retrieve + * @return Observable> + * The list of Suggestion Targets. + */ + public getTargets(source, elementsPerPage, currentPage): Observable> { + const sortOptions = new SortOptions('display', SortDirection.ASC); + + const findListOptions: FindListOptions = { + elementsPerPage: elementsPerPage, + currentPage: currentPage, + sort: sortOptions + }; + + return this.suggestionsDataService.getTargets(source, findListOptions).pipe( + getFinishedRemoteData(), + take(1), + map((rd: RemoteData>) => { + if (rd.hasSucceeded) { + return rd.payload; + } else { + throw new Error('Can\'t retrieve Suggestion Target from the Search Target REST service'); + } + }) + ); + } + + /** + * Return the list of review suggestions Target managing pagination and errors. + * + * @param targetId + * The target id for which to find suggestions. + * @param elementsPerPage + * The number of the target per page + * @param currentPage + * The page number to retrieve + * @param sortOptions + * The sort options + * @return Observable>> + * The list of Suggestion. + */ + public getSuggestions(targetId: string, elementsPerPage, currentPage, sortOptions: SortOptions): Observable> { + const [source, target] = targetId.split(':'); + + const findListOptions: FindListOptions = { + elementsPerPage: elementsPerPage, + currentPage: currentPage, + sort: sortOptions + }; + + return this.suggestionsDataService.getSuggestionsByTargetAndSource(target, source, findListOptions).pipe( + getAllSucceededRemoteDataPayload() + ); + } + + /** + * Clear suggestions requests from cache + */ + public clearSuggestionRequests() { + this.suggestionsDataService.clearSuggestionRequests(); + } + + /** + * Used to delete Suggestion + * @suggestionId + */ + public deleteReviewedSuggestion(suggestionId: string): Observable> { + return this.suggestionsDataService.deleteSuggestion(suggestionId).pipe( + map((response: RemoteData) => { + if (response.isSuccess) { + return response; + } else { + throw new Error('Can\'t delete Suggestion from the Search Target REST service'); + } + }), + take(1) + ); + } + + /** + * Retrieve suggestion targets for the given user + * + * @param user + * The EPerson object for which to retrieve suggestion targets + */ + public retrieveCurrentUserSuggestions(user: EPerson): Observable { + return this.researcherProfileService.findById(user.uuid).pipe( + mergeMap((profile: ResearcherProfile) => { + if (isNotEmpty(profile)) { + return this.researcherProfileService.findRelatedItemId(profile).pipe( + mergeMap((itemId: string) => { + return this.suggestionsDataService.getTargetsByUser(itemId).pipe( + getFirstSucceededRemoteListPayload() + ); + }) + ); + } else { + return of([]); + } + }), + take(1) + ); + } + + /** + * Perform the approve and import operation over a single suggestion + * @param suggestion target suggestion + * @param collectionId the collectionId + * @param workspaceitemService injected dependency + * @private + */ + public approveAndImport(workspaceitemService: WorkspaceitemDataService, + suggestion: OpenaireSuggestion, + collectionId: string): Observable { + + const resolvedCollectionId = this.resolveCollectionId(suggestion, collectionId); + return workspaceitemService.importExternalSourceEntry(suggestion.externalSourceUri, resolvedCollectionId) + .pipe( + getFirstSucceededRemoteDataPayload(), + catchError((error) => of(null)) + ); + } + + /** + * Perform the delete operation over a single suggestion. + * @param suggestionId + */ + public notMine(suggestionId): Observable> { + return this.deleteReviewedSuggestion(suggestionId).pipe( + catchError((error) => of(null)) + ); + } + + /** + * Perform a bulk approve and import operation. + * @param workspaceitemService injected dependency + * @param suggestions the array containing the suggestions + * @param collectionId the collectionId + */ + public approveAndImportMultiple(workspaceitemService: WorkspaceitemDataService, + suggestions: OpenaireSuggestion[], + collectionId: string): Observable { + + return forkJoin(suggestions.map((suggestion: OpenaireSuggestion) => + this.approveAndImport(workspaceitemService, suggestion, collectionId))) + .pipe(map((results: WorkspaceItem[]) => { + return { + success: results.filter((result) => result != null).length, + fails: results.filter((result) => result == null).length + }; + }), take(1)); + } + + /** + * Perform a bulk notMine operation. + * @param suggestions the array containing the suggestions + */ + public notMineMultiple(suggestions: OpenaireSuggestion[]): Observable { + return forkJoin(suggestions.map((suggestion: OpenaireSuggestion) => this.notMine(suggestion.id))) + .pipe(map((results: RemoteData[]) => { + return { + success: results.filter((result) => result != null).length, + fails: results.filter((result) => result == null).length + }; + }), take(1)); + } + + /** + * Get the researcher uuid (for navigation purpose) from a target instance. + * TODO Find a better way + * @param target + * @return the researchUuid + */ + public getTargetUuid(target: OpenaireSuggestionTarget): string { + const tokens = target.id.split(':'); + return tokens.length === 2 ? tokens[1] : null; + } + + /** + * Interpolated params to build the notification suggestions notification. + * @param suggestionTarget + */ + public getNotificationSuggestionInterpolation(suggestionTarget: OpenaireSuggestionTarget): any { + return { + count: suggestionTarget.total, + source: this.translateService.instant(this.translateSuggestionSource(suggestionTarget.source)), + type: this.translateService.instant(this.translateSuggestionType(suggestionTarget.source)), + suggestionId: suggestionTarget.id, + displayName: suggestionTarget.display + }; + } + + public translateSuggestionType(source: string): string { + return 'reciter.suggestion.type.' + source; + } + + public translateSuggestionSource(source: string): string { + return 'reciter.suggestion.source.' + source; + } + + /** + * If the provided collectionId ha no value, tries to resolve it by suggestion source. + * @param suggestion + * @param collectionId + */ + public resolveCollectionId(suggestion: OpenaireSuggestion, collectionId): string { + if (hasValue(collectionId)) { + return collectionId; + } + return environment.suggestion + .find((suggestionConf: SuggestionConfig) => suggestionConf.source === suggestion.source) + .collectionId; + } + + /** + * Return true if all the suggestion are configured with the same fixed collection + * in the configuration. + * @param suggestions + */ + public isCollectionFixed(suggestions: OpenaireSuggestion[]): boolean { + return this.getFixedCollectionIds(suggestions).length === 1; + } + + private getFixedCollectionIds(suggestions: OpenaireSuggestion[]): string[] { + const collectionIds = {}; + suggestions.forEach((suggestion: OpenaireSuggestion) => { + const conf = environment.suggestion.find((suggestionConf: SuggestionConfig) => suggestionConf.source === suggestion.source); + if (hasValue(conf)) { + collectionIds[conf.collectionId] = true; + } + }); + return Object.keys(collectionIds); + } +} diff --git a/src/app/shared/mocks/openaire.mock.ts b/src/app/shared/mocks/openaire.mock.ts new file mode 100644 index 0000000000..95ea871727 --- /dev/null +++ b/src/app/shared/mocks/openaire.mock.ts @@ -0,0 +1,1797 @@ +import { of as observableOf } from 'rxjs'; +import { ResourceType } from '../../core/shared/resource-type'; +import { OpenaireBrokerTopicObject } from '../../core/openaire/broker/models/openaire-broker-topic.model'; +import { OpenaireBrokerEventObject } from '../../core/openaire/broker/models/openaire-broker-event.model'; +import { OpenaireBrokerTopicRestService } from '../../core/openaire/broker/topics/openaire-broker-topic-rest.service'; +import { OpenaireBrokerEventRestService } from '../../core/openaire/broker/events/openaire-broker-event-rest.service'; +import { DSpaceObject } from '../../core/shared/dspace-object.model'; +import { OpenaireStateService } from '../../openaire/openaire-state.service'; +import { Item } from '../../core/shared/item.model'; +import { + createNoContentRemoteDataObject$, + createSuccessfulRemoteDataObject, + createSuccessfulRemoteDataObject$ +} from '../remote-data.utils'; +import { SearchResult } from '../search/models/search-result.model'; +import { SuggestionsService } from '../../openaire/reciter-suggestions/suggestions.service'; + +// REST Mock --------------------------------------------------------------------- +// ------------------------------------------------------------------------------- + +// Items +// ------------------------------------------------------------------------------- + +const ItemMockPid1: Item = Object.assign( + new Item(), + { + handle: '10077/21486', + lastModified: '2017-04-24T19:44:08.178+0000', + isArchived: true, + isDiscoverable: true, + isWithdrawn: false, + _links:{ + self: { + href: 'https://rest.api/rest/api/core/items/0ec7ff22-f211-40ab-a69e-c819b0b1f357' + } + }, + id: 'ITEM4567-e89b-12d3-a456-426614174001', + uuid: 'ITEM4567-e89b-12d3-a456-426614174001', + type: 'item', + metadata: { + 'dc.creator': [ + { + language: 'en_US', + value: 'Doe, Jane' + } + ], + 'dc.date.accessioned': [ + { + language: null, + value: '1650-06-26T19:58:25Z' + } + ], + 'dc.date.available': [ + { + language: null, + value: '1650-06-26T19:58:25Z' + } + ], + 'dc.date.issued': [ + { + language: null, + value: '1650-06-26' + } + ], + 'dc.identifier.issn': [ + { + language: 'en_US', + value: '123456789' + } + ], + 'dc.identifier.uri': [ + { + language: null, + value: 'http://dspace7.4science.it/xmlui/handle/10673/6' + } + ], + 'dc.description.abstract': [ + { + language: 'en_US', + value: 'This is really just a sample abstract. If it was a real abstract it would contain useful information about this test document. Sorry though, nothing useful in this paragraph. You probably shouldn\'t have even bothered to read it!' + } + ], + 'dc.description.provenance': [ + { + language: 'en', + value: 'Made available in DSpace on 2012-06-26T19:58:25Z (GMT). No. of bitstreams: 2\r\ntest_ppt.ppt: 12707328 bytes, checksum: a353fc7d29b3c558c986f7463a41efd3 (MD5)\r\ntest_ppt.pptx: 12468572 bytes, checksum: 599305edb4ebee329667f2c35b14d1d6 (MD5)' + }, + { + language: 'en', + value: 'Restored into DSpace on 2013-06-13T09:17:34Z (GMT).' + }, + { + language: 'en', + value: 'Restored into DSpace on 2013-06-13T11:04:16Z (GMT).' + }, + { + language: 'en', + value: 'Restored into DSpace on 2017-04-24T19:44:08Z (GMT).' + } + ], + 'dc.language': [ + { + language: 'en_US', + value: 'en' + } + ], + 'dc.rights': [ + { + language: 'en_US', + value: '© Jane Doe' + } + ], + 'dc.subject': [ + { + language: 'en_US', + value: 'keyword1' + }, + { + language: 'en_US', + value: 'keyword2' + }, + { + language: 'en_US', + value: 'keyword3' + } + ], + 'dc.title': [ + { + language: 'en_US', + value: 'Index nominum et rerum' + } + ], + 'dc.type': [ + { + language: 'en_US', + value: 'text' + } + ] + } + } +); + +const ItemMockPid2: Item = Object.assign( + new Item(), + { + handle: '10077/21486', + lastModified: '2017-04-24T19:44:08.178+0000', + isArchived: true, + isDiscoverable: true, + isWithdrawn: false, + _links:{ + self: { + href: 'https://rest.api/rest/api/core/items/0ec7ff22-f211-40ab-a69e-c819b0b1f357' + } + }, + id: 'ITEM4567-e89b-12d3-a456-426614174004', + uuid: 'ITEM4567-e89b-12d3-a456-426614174004', + type: 'item', + metadata: { + 'dc.creator': [ + { + language: 'en_US', + value: 'Doe, Jane' + } + ], + 'dc.date.accessioned': [ + { + language: null, + value: '1650-06-26T19:58:25Z' + } + ], + 'dc.date.available': [ + { + language: null, + value: '1650-06-26T19:58:25Z' + } + ], + 'dc.date.issued': [ + { + language: null, + value: '1650-06-26' + } + ], + 'dc.identifier.issn': [ + { + language: 'en_US', + value: '123456789' + } + ], + 'dc.identifier.uri': [ + { + language: null, + value: 'http://dspace7.4science.it/xmlui/handle/10673/6' + } + ], + 'dc.description.abstract': [ + { + language: 'en_US', + value: 'This is really just a sample abstract. If it was a real abstract it would contain useful information about this test document. Sorry though, nothing useful in this paragraph. You probably shouldn\'t have even bothered to read it!' + } + ], + 'dc.description.provenance': [ + { + language: 'en', + value: 'Made available in DSpace on 2012-06-26T19:58:25Z (GMT). No. of bitstreams: 2\r\ntest_ppt.ppt: 12707328 bytes, checksum: a353fc7d29b3c558c986f7463a41efd3 (MD5)\r\ntest_ppt.pptx: 12468572 bytes, checksum: 599305edb4ebee329667f2c35b14d1d6 (MD5)' + }, + { + language: 'en', + value: 'Restored into DSpace on 2013-06-13T09:17:34Z (GMT).' + }, + { + language: 'en', + value: 'Restored into DSpace on 2013-06-13T11:04:16Z (GMT).' + }, + { + language: 'en', + value: 'Restored into DSpace on 2017-04-24T19:44:08Z (GMT).' + } + ], + 'dc.language': [ + { + language: 'en_US', + value: 'en' + } + ], + 'dc.rights': [ + { + language: 'en_US', + value: '© Jane Doe' + } + ], + 'dc.subject': [ + { + language: 'en_US', + value: 'keyword1' + }, + { + language: 'en_US', + value: 'keyword2' + }, + { + language: 'en_US', + value: 'keyword3' + } + ], + 'dc.title': [ + { + language: 'en_US', + value: 'UNA NUOVA RILETTURA DELL\u0027 ARISTOTELE DI FRANZ BRENTANO ALLA LUCE DI ALCUNI INEDITI' + } + ], + 'dc.type': [ + { + language: 'en_US', + value: 'text' + } + ] + } + } +); + +const ItemMockPid3: Item = Object.assign( + new Item(), + { + handle: '10077/21486', + lastModified: '2017-04-24T19:44:08.178+0000', + isArchived: true, + isDiscoverable: true, + isWithdrawn: false, + _links:{ + self: { + href: 'https://rest.api/rest/api/core/items/0ec7ff22-f211-40ab-a69e-c819b0b1f357' + } + }, + id: 'ITEM4567-e89b-12d3-a456-426614174005', + uuid: 'ITEM4567-e89b-12d3-a456-426614174005', + type: 'item', + metadata: { + 'dc.creator': [ + { + language: 'en_US', + value: 'Doe, Jane' + } + ], + 'dc.date.accessioned': [ + { + language: null, + value: '1650-06-26T19:58:25Z' + } + ], + 'dc.date.available': [ + { + language: null, + value: '1650-06-26T19:58:25Z' + } + ], + 'dc.date.issued': [ + { + language: null, + value: '1650-06-26' + } + ], + 'dc.identifier.issn': [ + { + language: 'en_US', + value: '123456789' + } + ], + 'dc.identifier.uri': [ + { + language: null, + value: 'http://dspace7.4science.it/xmlui/handle/10673/6' + } + ], + 'dc.description.abstract': [ + { + language: 'en_US', + value: 'This is really just a sample abstract. If it was a real abstract it would contain useful information about this test document. Sorry though, nothing useful in this paragraph. You probably shouldn\'t have even bothered to read it!' + } + ], + 'dc.description.provenance': [ + { + language: 'en', + value: 'Made available in DSpace on 2012-06-26T19:58:25Z (GMT). No. of bitstreams: 2\r\ntest_ppt.ppt: 12707328 bytes, checksum: a353fc7d29b3c558c986f7463a41efd3 (MD5)\r\ntest_ppt.pptx: 12468572 bytes, checksum: 599305edb4ebee329667f2c35b14d1d6 (MD5)' + }, + { + language: 'en', + value: 'Restored into DSpace on 2013-06-13T09:17:34Z (GMT).' + }, + { + language: 'en', + value: 'Restored into DSpace on 2013-06-13T11:04:16Z (GMT).' + }, + { + language: 'en', + value: 'Restored into DSpace on 2017-04-24T19:44:08Z (GMT).' + } + ], + 'dc.language': [ + { + language: 'en_US', + value: 'en' + } + ], + 'dc.rights': [ + { + language: 'en_US', + value: '© Jane Doe' + } + ], + 'dc.subject': [ + { + language: 'en_US', + value: 'keyword1' + }, + { + language: 'en_US', + value: 'keyword2' + }, + { + language: 'en_US', + value: 'keyword3' + } + ], + 'dc.title': [ + { + language: 'en_US', + value: 'Sustainable development' + } + ], + 'dc.type': [ + { + language: 'en_US', + value: 'text' + } + ] + } + } +); + +const ItemMockPid4: Item = Object.assign( + new Item(), + { + handle: '10077/21486', + lastModified: '2017-04-24T19:44:08.178+0000', + isArchived: true, + isDiscoverable: true, + isWithdrawn: false, + _links:{ + self: { + href: 'https://rest.api/rest/api/core/items/0ec7ff22-f211-40ab-a69e-c819b0b1f357' + } + }, + id: 'ITEM4567-e89b-12d3-a456-426614174006', + uuid: 'ITEM4567-e89b-12d3-a456-426614174006', + type: 'item', + metadata: { + 'dc.creator': [ + { + language: 'en_US', + value: 'Doe, Jane' + } + ], + 'dc.date.accessioned': [ + { + language: null, + value: '1650-06-26T19:58:25Z' + } + ], + 'dc.date.available': [ + { + language: null, + value: '1650-06-26T19:58:25Z' + } + ], + 'dc.date.issued': [ + { + language: null, + value: '1650-06-26' + } + ], + 'dc.identifier.issn': [ + { + language: 'en_US', + value: '123456789' + } + ], + 'dc.identifier.uri': [ + { + language: null, + value: 'http://dspace7.4science.it/xmlui/handle/10673/6' + } + ], + 'dc.description.abstract': [ + { + language: 'en_US', + value: 'This is really just a sample abstract. If it was a real abstract it would contain useful information about this test document. Sorry though, nothing useful in this paragraph. You probably shouldn\'t have even bothered to read it!' + } + ], + 'dc.description.provenance': [ + { + language: 'en', + value: 'Made available in DSpace on 2012-06-26T19:58:25Z (GMT). No. of bitstreams: 2\r\ntest_ppt.ppt: 12707328 bytes, checksum: a353fc7d29b3c558c986f7463a41efd3 (MD5)\r\ntest_ppt.pptx: 12468572 bytes, checksum: 599305edb4ebee329667f2c35b14d1d6 (MD5)' + }, + { + language: 'en', + value: 'Restored into DSpace on 2013-06-13T09:17:34Z (GMT).' + }, + { + language: 'en', + value: 'Restored into DSpace on 2013-06-13T11:04:16Z (GMT).' + }, + { + language: 'en', + value: 'Restored into DSpace on 2017-04-24T19:44:08Z (GMT).' + } + ], + 'dc.language': [ + { + language: 'en_US', + value: 'en' + } + ], + 'dc.rights': [ + { + language: 'en_US', + value: '© Jane Doe' + } + ], + 'dc.subject': [ + { + language: 'en_US', + value: 'keyword1' + }, + { + language: 'en_US', + value: 'keyword2' + }, + { + language: 'en_US', + value: 'keyword3' + } + ], + 'dc.title': [ + { + language: 'en_US', + value: 'Reply to Critics' + } + ], + 'dc.type': [ + { + language: 'en_US', + value: 'text' + } + ] + } + } +); + +const ItemMockPid5: Item = Object.assign( + new Item(), + { + handle: '10077/21486', + lastModified: '2017-04-24T19:44:08.178+0000', + isArchived: true, + isDiscoverable: true, + isWithdrawn: false, + _links:{ + self: { + href: 'https://rest.api/rest/api/core/items/0ec7ff22-f211-40ab-a69e-c819b0b1f357' + } + }, + id: 'ITEM4567-e89b-12d3-a456-426614174007', + uuid: 'ITEM4567-e89b-12d3-a456-426614174007', + type: 'item', + metadata: { + 'dc.creator': [ + { + language: 'en_US', + value: 'Doe, Jane' + } + ], + 'dc.date.accessioned': [ + { + language: null, + value: '1650-06-26T19:58:25Z' + } + ], + 'dc.date.available': [ + { + language: null, + value: '1650-06-26T19:58:25Z' + } + ], + 'dc.date.issued': [ + { + language: null, + value: '1650-06-26' + } + ], + 'dc.identifier.issn': [ + { + language: 'en_US', + value: '123456789' + } + ], + 'dc.identifier.uri': [ + { + language: null, + value: 'http://dspace7.4science.it/xmlui/handle/10673/6' + } + ], + 'dc.description.abstract': [ + { + language: 'en_US', + value: 'This is really just a sample abstract. If it was a real abstract it would contain useful information about this test document. Sorry though, nothing useful in this paragraph. You probably shouldn\'t have even bothered to read it!' + } + ], + 'dc.description.provenance': [ + { + language: 'en', + value: 'Made available in DSpace on 2012-06-26T19:58:25Z (GMT). No. of bitstreams: 2\r\ntest_ppt.ppt: 12707328 bytes, checksum: a353fc7d29b3c558c986f7463a41efd3 (MD5)\r\ntest_ppt.pptx: 12468572 bytes, checksum: 599305edb4ebee329667f2c35b14d1d6 (MD5)' + }, + { + language: 'en', + value: 'Restored into DSpace on 2013-06-13T09:17:34Z (GMT).' + }, + { + language: 'en', + value: 'Restored into DSpace on 2013-06-13T11:04:16Z (GMT).' + }, + { + language: 'en', + value: 'Restored into DSpace on 2017-04-24T19:44:08Z (GMT).' + } + ], + 'dc.language': [ + { + language: 'en_US', + value: 'en' + } + ], + 'dc.rights': [ + { + language: 'en_US', + value: '© Jane Doe' + } + ], + 'dc.subject': [ + { + language: 'en_US', + value: 'keyword1' + }, + { + language: 'en_US', + value: 'keyword2' + }, + { + language: 'en_US', + value: 'keyword3' + } + ], + 'dc.title': [ + { + language: 'en_US', + value: 'PROGETTAZIONE, SINTESI E VALUTAZIONE DELL\u0027ATTIVITA\u0027 ANTIMICOBATTERICA ED ANTIFUNGINA DI NUOVI DERIVATI ETEROCICLICI' + } + ], + 'dc.type': [ + { + language: 'en_US', + value: 'text' + } + ] + } + } +); + +const ItemMockPid6: Item = Object.assign( + new Item(), + { + handle: '10077/21486', + lastModified: '2017-04-24T19:44:08.178+0000', + isArchived: true, + isDiscoverable: true, + isWithdrawn: false, + _links:{ + self: { + href: 'https://rest.api/rest/api/core/items/0ec7ff22-f211-40ab-a69e-c819b0b1f357' + } + }, + id: 'ITEM4567-e89b-12d3-a456-426614174008', + uuid: 'ITEM4567-e89b-12d3-a456-426614174008', + type: 'item', + metadata: { + 'dc.creator': [ + { + language: 'en_US', + value: 'Doe, Jane' + } + ], + 'dc.date.accessioned': [ + { + language: null, + value: '1650-06-26T19:58:25Z' + } + ], + 'dc.date.available': [ + { + language: null, + value: '1650-06-26T19:58:25Z' + } + ], + 'dc.date.issued': [ + { + language: null, + value: '1650-06-26' + } + ], + 'dc.identifier.issn': [ + { + language: 'en_US', + value: '123456789' + } + ], + 'dc.identifier.uri': [ + { + language: null, + value: 'http://dspace7.4science.it/xmlui/handle/10673/6' + } + ], + 'dc.description.abstract': [ + { + language: 'en_US', + value: 'This is really just a sample abstract. If it was a real abstract it would contain useful information about this test document. Sorry though, nothing useful in this paragraph. You probably shouldn\'t have even bothered to read it!' + } + ], + 'dc.description.provenance': [ + { + language: 'en', + value: 'Made available in DSpace on 2012-06-26T19:58:25Z (GMT). No. of bitstreams: 2\r\ntest_ppt.ppt: 12707328 bytes, checksum: a353fc7d29b3c558c986f7463a41efd3 (MD5)\r\ntest_ppt.pptx: 12468572 bytes, checksum: 599305edb4ebee329667f2c35b14d1d6 (MD5)' + }, + { + language: 'en', + value: 'Restored into DSpace on 2013-06-13T09:17:34Z (GMT).' + }, + { + language: 'en', + value: 'Restored into DSpace on 2013-06-13T11:04:16Z (GMT).' + }, + { + language: 'en', + value: 'Restored into DSpace on 2017-04-24T19:44:08Z (GMT).' + } + ], + 'dc.language': [ + { + language: 'en_US', + value: 'en' + } + ], + 'dc.rights': [ + { + language: 'en_US', + value: '© Jane Doe' + } + ], + 'dc.subject': [ + { + language: 'en_US', + value: 'keyword1' + }, + { + language: 'en_US', + value: 'keyword2' + }, + { + language: 'en_US', + value: 'keyword3' + } + ], + 'dc.title': [ + { + language: 'en_US', + value: 'Donald Davidson' + } + ], + 'dc.type': [ + { + language: 'en_US', + value: 'text' + } + ] + } + } +); + +const ItemMockPid7: Item = Object.assign( + new Item(), + { + handle: '10077/21486', + lastModified: '2017-04-24T19:44:08.178+0000', + isArchived: true, + isDiscoverable: true, + isWithdrawn: false, + _links:{ + self: { + href: 'https://rest.api/rest/api/core/items/0ec7ff22-f211-40ab-a69e-c819b0b1f357' + } + }, + id: 'ITEM4567-e89b-12d3-a456-426614174009', + uuid: 'ITEM4567-e89b-12d3-a456-426614174009', + type: 'item', + metadata: { + 'dc.creator': [ + { + language: 'en_US', + value: 'Doe, Jane' + } + ], + 'dc.date.accessioned': [ + { + language: null, + value: '1650-06-26T19:58:25Z' + } + ], + 'dc.date.available': [ + { + language: null, + value: '1650-06-26T19:58:25Z' + } + ], + 'dc.date.issued': [ + { + language: null, + value: '1650-06-26' + } + ], + 'dc.identifier.issn': [ + { + language: 'en_US', + value: '123456789' + } + ], + 'dc.identifier.uri': [ + { + language: null, + value: 'http://dspace7.4science.it/xmlui/handle/10673/6' + } + ], + 'dc.description.abstract': [ + { + language: 'en_US', + value: 'This is really just a sample abstract. If it was a real abstract it would contain useful information about this test document. Sorry though, nothing useful in this paragraph. You probably shouldn\'t have even bothered to read it!' + } + ], + 'dc.description.provenance': [ + { + language: 'en', + value: 'Made available in DSpace on 2012-06-26T19:58:25Z (GMT). No. of bitstreams: 2\r\ntest_ppt.ppt: 12707328 bytes, checksum: a353fc7d29b3c558c986f7463a41efd3 (MD5)\r\ntest_ppt.pptx: 12468572 bytes, checksum: 599305edb4ebee329667f2c35b14d1d6 (MD5)' + }, + { + language: 'en', + value: 'Restored into DSpace on 2013-06-13T09:17:34Z (GMT).' + }, + { + language: 'en', + value: 'Restored into DSpace on 2013-06-13T11:04:16Z (GMT).' + }, + { + language: 'en', + value: 'Restored into DSpace on 2017-04-24T19:44:08Z (GMT).' + } + ], + 'dc.language': [ + { + language: 'en_US', + value: 'en' + } + ], + 'dc.rights': [ + { + language: 'en_US', + value: '© Jane Doe' + } + ], + 'dc.subject': [ + { + language: 'en_US', + value: 'keyword1' + }, + { + language: 'en_US', + value: 'keyword2' + }, + { + language: 'en_US', + value: 'keyword3' + } + ], + 'dc.title': [ + { + language: 'en_US', + value: 'Missing abstract article' + } + ], + 'dc.type': [ + { + language: 'en_US', + value: 'text' + } + ] + } + } +); + +export const ItemMockPid8: Item = Object.assign( + new Item(), + { + handle: '10077/21486', + lastModified: '2017-04-24T19:44:08.178+0000', + isArchived: true, + isDiscoverable: true, + isWithdrawn: false, + _links:{ + self: { + href: 'https://rest.api/rest/api/core/items/0ec7ff22-f211-40ab-a69e-c819b0b1f357' + } + }, + id: 'ITEM4567-e89b-12d3-a456-426614174002', + uuid: 'ITEM4567-e89b-12d3-a456-426614174002', + type: 'item', + metadata: { + 'dc.creator': [ + { + language: 'en_US', + value: 'Doe, Jane' + } + ], + 'dc.date.accessioned': [ + { + language: null, + value: '1650-06-26T19:58:25Z' + } + ], + 'dc.date.available': [ + { + language: null, + value: '1650-06-26T19:58:25Z' + } + ], + 'dc.date.issued': [ + { + language: null, + value: '1650-06-26' + } + ], + 'dc.identifier.issn': [ + { + language: 'en_US', + value: '123456789' + } + ], + 'dc.identifier.uri': [ + { + language: null, + value: 'http://dspace7.4science.it/xmlui/handle/10673/6' + } + ], + 'dc.description.abstract': [ + { + language: 'en_US', + value: 'This is really just a sample abstract. If it was a real abstract it would contain useful information about this test document. Sorry though, nothing useful in this paragraph. You probably shouldn\'t have even bothered to read it!' + } + ], + 'dc.description.provenance': [ + { + language: 'en', + value: 'Made available in DSpace on 2012-06-26T19:58:25Z (GMT). No. of bitstreams: 2\r\ntest_ppt.ppt: 12707328 bytes, checksum: a353fc7d29b3c558c986f7463a41efd3 (MD5)\r\ntest_ppt.pptx: 12468572 bytes, checksum: 599305edb4ebee329667f2c35b14d1d6 (MD5)' + }, + { + language: 'en', + value: 'Restored into DSpace on 2013-06-13T09:17:34Z (GMT).' + }, + { + language: 'en', + value: 'Restored into DSpace on 2013-06-13T11:04:16Z (GMT).' + }, + { + language: 'en', + value: 'Restored into DSpace on 2017-04-24T19:44:08Z (GMT).' + } + ], + 'dc.language': [ + { + language: 'en_US', + value: 'en' + } + ], + 'dc.rights': [ + { + language: 'en_US', + value: '© Jane Doe' + } + ], + 'dc.subject': [ + { + language: 'en_US', + value: 'keyword1' + }, + { + language: 'en_US', + value: 'keyword2' + }, + { + language: 'en_US', + value: 'keyword3' + } + ], + 'dc.title': [ + { + language: 'en_US', + value: 'Egypt, crossroad of translations and literary interweavings (3rd-6th centuries). A reconsideration of earlier Coptic literature' + } + ], + 'dc.type': [ + { + language: 'en_US', + value: 'text' + } + ] + } + } +); + +export const ItemMockPid9: Item = Object.assign( + new Item(), + { + handle: '10077/21486', + lastModified: '2017-04-24T19:44:08.178+0000', + isArchived: true, + isDiscoverable: true, + isWithdrawn: false, + _links:{ + self: { + href: 'https://rest.api/rest/api/core/items/0ec7ff22-f211-40ab-a69e-c819b0b1f357' + } + }, + id: 'ITEM4567-e89b-12d3-a456-426614174003', + uuid: 'ITEM4567-e89b-12d3-a456-426614174003', + type: 'item', + metadata: { + 'dc.creator': [ + { + language: 'en_US', + value: 'Doe, Jane' + } + ], + 'dc.date.accessioned': [ + { + language: null, + value: '1650-06-26T19:58:25Z' + } + ], + 'dc.date.available': [ + { + language: null, + value: '1650-06-26T19:58:25Z' + } + ], + 'dc.date.issued': [ + { + language: null, + value: '1650-06-26' + } + ], + 'dc.identifier.issn': [ + { + language: 'en_US', + value: '123456789' + } + ], + 'dc.identifier.uri': [ + { + language: null, + value: 'http://dspace7.4science.it/xmlui/handle/10673/6' + } + ], + 'dc.description.abstract': [ + { + language: 'en_US', + value: 'This is really just a sample abstract. If it was a real abstract it would contain useful information about this test document. Sorry though, nothing useful in this paragraph. You probably shouldn\'t have even bothered to read it!' + } + ], + 'dc.description.provenance': [ + { + language: 'en', + value: 'Made available in DSpace on 2012-06-26T19:58:25Z (GMT). No. of bitstreams: 2\r\ntest_ppt.ppt: 12707328 bytes, checksum: a353fc7d29b3c558c986f7463a41efd3 (MD5)\r\ntest_ppt.pptx: 12468572 bytes, checksum: 599305edb4ebee329667f2c35b14d1d6 (MD5)' + }, + { + language: 'en', + value: 'Restored into DSpace on 2013-06-13T09:17:34Z (GMT).' + }, + { + language: 'en', + value: 'Restored into DSpace on 2013-06-13T11:04:16Z (GMT).' + }, + { + language: 'en', + value: 'Restored into DSpace on 2017-04-24T19:44:08Z (GMT).' + } + ], + 'dc.language': [ + { + language: 'en_US', + value: 'en' + } + ], + 'dc.rights': [ + { + language: 'en_US', + value: '© Jane Doe' + } + ], + 'dc.subject': [ + { + language: 'en_US', + value: 'keyword1' + }, + { + language: 'en_US', + value: 'keyword2' + }, + { + language: 'en_US', + value: 'keyword3' + } + ], + 'dc.title': [ + { + language: 'en_US', + value: 'Morocco, crossroad of translations and literary interweavings (3rd-6th centuries). A reconsideration of earlier Coptic literature' + } + ], + 'dc.type': [ + { + language: 'en_US', + value: 'text' + } + ] + } + } +); + +export const ItemMockPid10: Item = Object.assign( + new Item(), + { + handle: '10713/29832', + lastModified: '2017-04-24T19:44:08.178+0000', + isArchived: true, + isDiscoverable: true, + isWithdrawn: false, + _links:{ + self: { + href: 'https://rest.api/rest/api/core/items/0ec7ff22-f211-40ab-a69e-c819b0b1f357' + } + }, + id: 'P23e4567-e89b-12d3-a456-426614174002', + uuid: 'P23e4567-e89b-12d3-a456-426614174002', + type: 'item', + metadata: { + 'dc.creator': [ + { + language: 'en_US', + value: 'Doe, Jane' + } + ], + 'dc.date.accessioned': [ + { + language: null, + value: '1650-06-26T19:58:25Z' + } + ], + 'dc.date.available': [ + { + language: null, + value: '1650-06-26T19:58:25Z' + } + ], + 'dc.date.issued': [ + { + language: null, + value: '1650-06-26' + } + ], + 'dc.identifier.issn': [ + { + language: 'en_US', + value: '123456789' + } + ], + 'dc.identifier.uri': [ + { + language: null, + value: 'http://dspace7.4science.it/xmlui/handle/10673/6' + } + ], + 'dc.description.abstract': [ + { + language: 'en_US', + value: 'This is really just a sample abstract. If it was a real abstract it would contain useful information about this test document. Sorry though, nothing useful in this paragraph. You probably shouldn\'t have even bothered to read it!' + } + ], + 'dc.description.provenance': [ + { + language: 'en', + value: 'Made available in DSpace on 2012-06-26T19:58:25Z (GMT). No. of bitstreams: 2\r\ntest_ppt.ppt: 12707328 bytes, checksum: a353fc7d29b3c558c986f7463a41efd3 (MD5)\r\ntest_ppt.pptx: 12468572 bytes, checksum: 599305edb4ebee329667f2c35b14d1d6 (MD5)' + }, + { + language: 'en', + value: 'Restored into DSpace on 2013-06-13T09:17:34Z (GMT).' + }, + { + language: 'en', + value: 'Restored into DSpace on 2013-06-13T11:04:16Z (GMT).' + }, + { + language: 'en', + value: 'Restored into DSpace on 2017-04-24T19:44:08Z (GMT).' + } + ], + 'dc.language': [ + { + language: 'en_US', + value: 'en' + } + ], + 'dc.rights': [ + { + language: 'en_US', + value: '© Jane Doe' + } + ], + 'dc.subject': [ + { + language: 'en_US', + value: 'keyword1' + }, + { + language: 'en_US', + value: 'keyword2' + }, + { + language: 'en_US', + value: 'keyword3' + } + ], + 'dc.title': [ + { + language: 'en_US', + value: 'Tracking Papyrus and Parchment Paths: An Archaeological Atlas of Coptic Literature.\nLiterary Texts in their Geographical Context: Production, Copying, Usage, Dissemination and Storage' + } + ], + 'dc.type': [ + { + language: 'en_US', + value: 'text' + } + ] + } + } +); + +export const OpenaireMockDspaceObject: SearchResult = Object.assign( + new SearchResult(), + { + handle: '10713/29832', + lastModified: '2017-04-24T19:44:08.178+0000', + isArchived: true, + isDiscoverable: true, + isWithdrawn: false, + _links:{ + self: { + href: 'https://rest.api/rest/api/core/items/0ec7ff22-f211-40ab-a69e-c819b0b1f357' + } + }, + id: 'P23e4567-e89b-12d3-a456-426614174002', + uuid: 'P23e4567-e89b-12d3-a456-426614174002', + type: 'item', + metadata: { + 'dc.creator': [ + { + language: 'en_US', + value: 'Doe, Jane' + } + ], + 'dc.date.accessioned': [ + { + language: null, + value: '1650-06-26T19:58:25Z' + } + ], + 'dc.date.available': [ + { + language: null, + value: '1650-06-26T19:58:25Z' + } + ], + 'dc.date.issued': [ + { + language: null, + value: '1650-06-26' + } + ], + 'dc.identifier.issn': [ + { + language: 'en_US', + value: '123456789' + } + ], + 'dc.identifier.uri': [ + { + language: null, + value: 'http://dspace7.4science.it/xmlui/handle/10673/6' + } + ], + 'dc.description.abstract': [ + { + language: 'en_US', + value: 'This is really just a sample abstract. If it was a real abstract it would contain useful information about this test document. Sorry though, nothing useful in this paragraph. You probably shouldn\'t have even bothered to read it!' + } + ], + 'dc.description.provenance': [ + { + language: 'en', + value: 'Made available in DSpace on 2012-06-26T19:58:25Z (GMT). No. of bitstreams: 2\r\ntest_ppt.ppt: 12707328 bytes, checksum: a353fc7d29b3c558c986f7463a41efd3 (MD5)\r\ntest_ppt.pptx: 12468572 bytes, checksum: 599305edb4ebee329667f2c35b14d1d6 (MD5)' + }, + { + language: 'en', + value: 'Restored into DSpace on 2013-06-13T09:17:34Z (GMT).' + }, + { + language: 'en', + value: 'Restored into DSpace on 2013-06-13T11:04:16Z (GMT).' + }, + { + language: 'en', + value: 'Restored into DSpace on 2017-04-24T19:44:08Z (GMT).' + } + ], + 'dc.language': [ + { + language: 'en_US', + value: 'en' + } + ], + 'dc.rights': [ + { + language: 'en_US', + value: '© Jane Doe' + } + ], + 'dc.subject': [ + { + language: 'en_US', + value: 'keyword1' + }, + { + language: 'en_US', + value: 'keyword2' + }, + { + language: 'en_US', + value: 'keyword3' + } + ], + 'dc.title': [ + { + language: 'en_US', + value: 'Tracking Papyrus and Parchment Paths: An Archaeological Atlas of Coptic Literature.\nLiterary Texts in their Geographical Context: Production, Copying, Usage, Dissemination and Storage' + } + ], + 'dc.type': [ + { + language: 'en_US', + value: 'text' + } + ] + } + } +); + +// Topics +// ------------------------------------------------------------------------------- + +export const openaireBrokerTopicObjectMorePid: OpenaireBrokerTopicObject = { + type: new ResourceType('nbtopic'), + id: 'ENRICH!MORE!PID', + name: 'ENRICH/MORE/PID', + lastEvent: '2020/10/09 10:11 UTC', + totalEvents: 33, + _links: { + self: { + href: 'https://rest.api/rest/api/integration/nbtopics/ENRICH!MORE!PID' + } + } +}; + +export const openaireBrokerTopicObjectMoreAbstract: OpenaireBrokerTopicObject = { + type: new ResourceType('nbtopic'), + id: 'ENRICH!MORE!ABSTRACT', + name: 'ENRICH/MORE/ABSTRACT', + lastEvent: '2020/09/08 21:14 UTC', + totalEvents: 5, + _links: { + self: { + href: 'https://rest.api/rest/api/integration/nbtopics/ENRICH!MORE!ABSTRACT' + } + } +}; + +export const openaireBrokerTopicObjectMissingPid: OpenaireBrokerTopicObject = { + type: new ResourceType('nbtopic'), + id: 'ENRICH!MISSING!PID', + name: 'ENRICH/MISSING/PID', + lastEvent: '2020/10/01 07:36 UTC', + totalEvents: 4, + _links: { + self: { + href: 'https://rest.api/rest/api/integration/nbtopics/ENRICH!MISSING!PID' + } + } +}; + +export const openaireBrokerTopicObjectMissingAbstract: OpenaireBrokerTopicObject = { + type: new ResourceType('nbtopic'), + id: 'ENRICH!MISSING!ABSTRACT', + name: 'ENRICH/MISSING/ABSTRACT', + lastEvent: '2020/10/08 16:14 UTC', + totalEvents: 71, + _links: { + self: { + href: 'https://rest.api/rest/api/integration/nbtopics/ENRICH!MISSING!ABSTRACT' + } + } +}; + +export const openaireBrokerTopicObjectMissingAcm: OpenaireBrokerTopicObject = { + type: new ResourceType('nbtopic'), + id: 'ENRICH!MISSING!SUBJECT!ACM', + name: 'ENRICH/MISSING/SUBJECT/ACM', + lastEvent: '2020/09/21 17:51 UTC', + totalEvents: 18, + _links: { + self: { + href: 'https://rest.api/rest/api/integration/nbtopics/ENRICH!MISSING!SUBJECT!ACM' + } + } +}; + +export const openaireBrokerTopicObjectMissingProject: OpenaireBrokerTopicObject = { + type: new ResourceType('nbtopic'), + id: 'ENRICH!MISSING!PROJECT', + name: 'ENRICH/MISSING/PROJECT', + lastEvent: '2020/09/17 10:28 UTC', + totalEvents: 6, + _links: { + self: { + href: 'https://rest.api/rest/api/integration/nbtopics/ENRICH!MISSING!PROJECT' + } + } +}; + +// Events +// ------------------------------------------------------------------------------- + +export const openaireBrokerEventObjectMissingPid: OpenaireBrokerEventObject = { + id: '123e4567-e89b-12d3-a456-426614174001', + uuid: '123e4567-e89b-12d3-a456-426614174001', + type: new ResourceType('nbevent'), + originalId: 'oai:www.openstarts.units.it:10077/21486', + title: 'Index nominum et rerum', + trust: 0.375, + eventDate: '2020/10/09 10:11 UTC', + status: 'PENDING', + message: { + type: 'doi', + value: '10.18848/1447-9494/cgp/v15i09/45934', + abstract: null, + openaireId: null, + acronym: null, + code: null, + funder: null, + fundingProgram: null, + jurisdiction: null, + title: null + }, + _links: { + self: { + href: 'https://rest.api/rest/api/integration/nbevents/123e4567-e89b-12d3-a456-426614174001', + }, + target: { + href: 'https://rest.api/rest/api/integration/nbevents/123e4567-e89b-12d3-a456-426614174001/target' + }, + related: { + href: 'https://rest.api/rest/api/integration/nbevents/123e4567-e89b-12d3-a456-426614174001/related' + } + }, + target: observableOf(createSuccessfulRemoteDataObject(ItemMockPid1)), + related: observableOf(createSuccessfulRemoteDataObject(ItemMockPid10)) +}; + +export const openaireBrokerEventObjectMissingPid2: OpenaireBrokerEventObject = { + id: '123e4567-e89b-12d3-a456-426614174004', + uuid: '123e4567-e89b-12d3-a456-426614174004', + type: new ResourceType('openaireBrokerEvent'), + originalId: 'oai:www.openstarts.units.it:10077/21486', + title: 'UNA NUOVA RILETTURA DELL\u0027 ARISTOTELE DI FRANZ BRENTANO ALLA LUCE DI ALCUNI INEDITI', + trust: 1.0, + eventDate: '2020/10/09 10:11 UTC', + status: 'PENDING', + message: { + type: 'urn', + value: 'http://thesis2.sba.units.it/store/handle/item/12238', + abstract: null, + openaireId: null, + acronym: null, + code: null, + funder: null, + fundingProgram: null, + jurisdiction: null, + title: null + }, + _links: { + self: { + href: 'https://rest.api/rest/api/integration/nbevents/123e4567-e89b-12d3-a456-426614174004' + }, + target: { + href: 'https://rest.api/rest/api/integration/nbevents/123e4567-e89b-12d3-a456-426614174004/target' + }, + related: { + href: 'https://rest.api/rest/api/integration/nbevents/123e4567-e89b-12d3-a456-426614174004/related' + } + }, + target: observableOf(createSuccessfulRemoteDataObject(ItemMockPid2)), + related: observableOf(createSuccessfulRemoteDataObject(ItemMockPid10)) +}; + +export const openaireBrokerEventObjectMissingPid3: OpenaireBrokerEventObject = { + id: '123e4567-e89b-12d3-a456-426614174005', + uuid: '123e4567-e89b-12d3-a456-426614174005', + type: new ResourceType('openaireBrokerEvent'), + originalId: 'oai:www.openstarts.units.it:10077/554', + title: 'Sustainable development', + trust: 0.375, + eventDate: '2020/10/09 10:11 UTC', + status: 'PENDING', + message: { + type: 'doi', + value: '10.4324/9780203408889', + abstract: null, + openaireId: null, + acronym: null, + code: null, + funder: null, + fundingProgram: null, + jurisdiction: null, + title: null + }, + _links: { + self: { + href: 'https://rest.api/rest/api/integration/nbevents/123e4567-e89b-12d3-a456-426614174005' + }, + target: { + href: 'https://rest.api/rest/api/integration/nbevents/123e4567-e89b-12d3-a456-426614174005/target' + }, + related: { + href: 'https://rest.api/rest/api/integration/nbevents/123e4567-e89b-12d3-a456-426614174005/related' + } + }, + target: observableOf(createSuccessfulRemoteDataObject(ItemMockPid3)), + related: observableOf(createSuccessfulRemoteDataObject(ItemMockPid10)) +}; + +export const openaireBrokerEventObjectMissingPid4: OpenaireBrokerEventObject = { + id: '123e4567-e89b-12d3-a456-426614174006', + uuid: '123e4567-e89b-12d3-a456-426614174006', + type: new ResourceType('openaireBrokerEvent'), + originalId: 'oai:www.openstarts.units.it:10077/10787', + title: 'Reply to Critics', + trust: 1.0, + eventDate: '2020/10/09 10:11 UTC', + status: 'PENDING', + message: { + type: 'doi', + value: '10.1080/13698230.2018.1430104', + abstract: null, + openaireId: null, + acronym: null, + code: null, + funder: null, + fundingProgram: null, + jurisdiction: null, + title: null + }, + _links: { + self: { + href: 'https://rest.api/rest/api/integration/nbevents/123e4567-e89b-12d3-a456-426614174006' + }, + target: { + href: 'https://rest.api/rest/api/integration/nbevents/123e4567-e89b-12d3-a456-426614174006/target' + }, + related: { + href: 'https://rest.api/rest/api/integration/nbevents/123e4567-e89b-12d3-a456-426614174006/related' + } + }, + target: observableOf(createSuccessfulRemoteDataObject(ItemMockPid4)), + related: observableOf(createSuccessfulRemoteDataObject(ItemMockPid10)) +}; + +export const openaireBrokerEventObjectMissingPid5: OpenaireBrokerEventObject = { + id: '123e4567-e89b-12d3-a456-426614174007', + uuid: '123e4567-e89b-12d3-a456-426614174007', + type: new ResourceType('openaireBrokerEvent'), + originalId: 'oai:www.openstarts.units.it:10077/11339', + title: 'PROGETTAZIONE, SINTESI E VALUTAZIONE DELL\u0027ATTIVITA\u0027 ANTIMICOBATTERICA ED ANTIFUNGINA DI NUOVI DERIVATI ETEROCICLICI', + trust: 0.375, + eventDate: '2020/10/09 10:11 UTC', + status: 'PENDING', + message: { + type: 'urn', + value: 'http://thesis2.sba.units.it/store/handle/item/12477', + abstract: null, + openaireId: null, + acronym: null, + code: null, + funder: null, + fundingProgram: null, + jurisdiction: null, + title: null + }, + _links: { + self: { + href: 'https://rest.api/rest/api/integration/nbevents/123e4567-e89b-12d3-a456-426614174007' + }, + target: { + href: 'https://rest.api/rest/api/integration/nbevents/123e4567-e89b-12d3-a456-426614174007/target' + }, + related: { + href: 'https://rest.api/rest/api/integration/nbevents/123e4567-e89b-12d3-a456-426614174007/related' + } + }, + target: observableOf(createSuccessfulRemoteDataObject(ItemMockPid5)), + related: observableOf(createSuccessfulRemoteDataObject(ItemMockPid10)) +}; + +export const openaireBrokerEventObjectMissingPid6: OpenaireBrokerEventObject = { + id: '123e4567-e89b-12d3-a456-426614174008', + uuid: '123e4567-e89b-12d3-a456-426614174008', + type: new ResourceType('openaireBrokerEvent'), + originalId: 'oai:www.openstarts.units.it:10077/29860', + title: 'Donald Davidson', + trust: 0.375, + eventDate: '2020/10/09 10:11 UTC', + status: 'PENDING', + message: { + type: 'doi', + value: '10.1111/j.1475-4975.2004.00098.x', + abstract: null, + openaireId: null, + acronym: null, + code: null, + funder: null, + fundingProgram: null, + jurisdiction: null, + title: null + }, + _links: { + self: { + href: 'https://rest.api/rest/api/integration/nbevents/123e4567-e89b-12d3-a456-426614174008' + }, + target: { + href: 'https://rest.api/rest/api/integration/nbevents/123e4567-e89b-12d3-a456-426614174008/target' + }, + related: { + href: 'https://rest.api/rest/api/integration/nbevents/123e4567-e89b-12d3-a456-426614174008/related' + } + }, + target: observableOf(createSuccessfulRemoteDataObject(ItemMockPid6)), + related: observableOf(createSuccessfulRemoteDataObject(ItemMockPid10)) +}; + +export const openaireBrokerEventObjectMissingAbstract: OpenaireBrokerEventObject = { + id: '123e4567-e89b-12d3-a456-426614174009', + uuid: '123e4567-e89b-12d3-a456-426614174009', + type: new ResourceType('openaireBrokerEvent'), + originalId: 'oai:www.openstarts.units.it:10077/21110', + title: 'Missing abstract article', + trust: 0.751, + eventDate: '2020/10/09 10:11 UTC', + status: 'PENDING', + message: { + type: null, + value: null, + abstract: 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla scelerisque vestibulum tellus sed lacinia. Aenean vitae sapien a quam congue ultrices. Sed vehicula sollicitudin ligula, vitae lacinia velit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla scelerisque vestibulum tellus sed lacinia. Aenean vitae sapien a quam congue ultrices. Sed vehicula sollicitudin ligula, vitae lacinia velit.', + openaireId: null, + acronym: null, + code: null, + funder: null, + fundingProgram: null, + jurisdiction: null, + title: null + }, + _links: { + self: { + href: 'https://rest.api/rest/api/integration/nbevents/123e4567-e89b-12d3-a456-426614174009' + }, + target: { + href: 'https://rest.api/rest/api/integration/nbevents/123e4567-e89b-12d3-a456-426614174009/target' + }, + related: { + href: 'https://rest.api/rest/api/integration/nbevents/123e4567-e89b-12d3-a456-426614174009/related' + } + }, + target: observableOf(createSuccessfulRemoteDataObject(ItemMockPid7)), + related: observableOf(createSuccessfulRemoteDataObject(ItemMockPid10)) +}; + +export const openaireBrokerEventObjectMissingProjectFound: OpenaireBrokerEventObject = { + id: '123e4567-e89b-12d3-a456-426614174002', + uuid: '123e4567-e89b-12d3-a456-426614174002', + type: new ResourceType('openaireBrokerEvent'), + originalId: 'oai:www.openstarts.units.it:10077/21838', + title: 'Egypt, crossroad of translations and literary interweavings (3rd-6th centuries). A reconsideration of earlier Coptic literature', + trust: 1.0, + eventDate: '2020/10/09 10:11 UTC', + status: 'PENDING', + message: { + type: null, + value: null, + abstract: null, + openaireId: null, + acronym: 'PAThs', + code: '687567', + funder: 'EC', + fundingProgram: 'H2020', + jurisdiction: 'EU', + title: 'Tracking Papyrus and Parchment Paths: An Archaeological Atlas of Coptic Literature.\nLiterary Texts in their Geographical Context: Production, Copying, Usage, Dissemination and Storage' + }, + _links: { + self: { + href: 'https://rest.api/rest/api/integration/nbevents/123e4567-e89b-12d3-a456-426614174002' + }, + target: { + href: 'https://rest.api/rest/api/integration/nbevents/123e4567-e89b-12d3-a456-426614174002/target' + }, + related: { + href: 'https://rest.api/rest/api/integration/nbevents/123e4567-e89b-12d3-a456-426614174002/related' + } + }, + target: createSuccessfulRemoteDataObject$(ItemMockPid8), + related: createSuccessfulRemoteDataObject$(ItemMockPid10) +}; + +export const openaireBrokerEventObjectMissingProjectNotFound: OpenaireBrokerEventObject = { + id: '123e4567-e89b-12d3-a456-426614174003', + uuid: '123e4567-e89b-12d3-a456-426614174003', + type: new ResourceType('openaireBrokerEvent'), + originalId: 'oai:www.openstarts.units.it:10077/21838', + title: 'Morocco, crossroad of translations and literary interweavings (3rd-6th centuries). A reconsideration of earlier Coptic literature', + trust: 1.0, + eventDate: '2020/10/09 10:11 UTC', + status: 'PENDING', + message: { + type: null, + value: null, + abstract: null, + openaireId: null, + acronym: 'PAThs', + code: '687567B', + funder: 'EC', + fundingProgram: 'H2021', + jurisdiction: 'EU', + title: 'Tracking Unknown Papyrus and Parchment Paths: An Archaeological Atlas of Coptic Literature.\nLiterary Texts in their Geographical Context: Production, Copying, Usage, Dissemination and Storage' + }, + _links: { + self: { + href: 'https://rest.api/rest/api/integration/nbevents/123e4567-e89b-12d3-a456-426614174003' + }, + target: { + href: 'https://rest.api/rest/api/integration/nbevents/123e4567-e89b-12d3-a456-426614174003/target' + }, + related: { + href: 'https://rest.api/rest/api/integration/nbevents/123e4567-e89b-12d3-a456-426614174003/related' + } + }, + target: createSuccessfulRemoteDataObject$(ItemMockPid9), + related: createNoContentRemoteDataObject$() +}; + +// Classes +// ------------------------------------------------------------------------------- + +/** + * Mock for [[OpenaireStateService]] + */ +export function getMockOpenaireStateService(): any { + return jasmine.createSpyObj('OpenaireStateService', { + getOpenaireBrokerTopics: jasmine.createSpy('getOpenaireBrokerTopics'), + isOpenaireBrokerTopicsLoading: jasmine.createSpy('isOpenaireBrokerTopicsLoading'), + isOpenaireBrokerTopicsLoaded: jasmine.createSpy('isOpenaireBrokerTopicsLoaded'), + isOpenaireBrokerTopicsProcessing: jasmine.createSpy('isOpenaireBrokerTopicsProcessing'), + getOpenaireBrokerTopicsTotalPages: jasmine.createSpy('getOpenaireBrokerTopicsTotalPages'), + getOpenaireBrokerTopicsCurrentPage: jasmine.createSpy('getOpenaireBrokerTopicsCurrentPage'), + getOpenaireBrokerTopicsTotals: jasmine.createSpy('getOpenaireBrokerTopicsTotals'), + dispatchRetrieveOpenaireBrokerTopics: jasmine.createSpy('dispatchRetrieveOpenaireBrokerTopics'), + dispatchMarkUserSuggestionsAsVisitedAction: jasmine.createSpy('dispatchMarkUserSuggestionsAsVisitedAction') + }); +} + +/** + * Mock for [[OpenaireBrokerTopicRestService]] + */ +export function getMockOpenaireBrokerTopicRestService(): OpenaireBrokerTopicRestService { + return jasmine.createSpyObj('OpenaireBrokerTopicRestService', { + getTopics: jasmine.createSpy('getTopics'), + getTopic: jasmine.createSpy('getTopic'), + }); +} + +/** + * Mock for [[OpenaireBrokerEventRestService]] + */ +export function getMockOpenaireBrokerEventRestService(): OpenaireBrokerEventRestService { + return jasmine.createSpyObj('OpenaireBrokerEventRestService', { + getEventsByTopic: jasmine.createSpy('getEventsByTopic'), + getEvent: jasmine.createSpy('getEvent'), + patchEvent: jasmine.createSpy('patchEvent'), + boundProject: jasmine.createSpy('boundProject'), + removeProject: jasmine.createSpy('removeProject'), + clearFindByTopicRequests: jasmine.createSpy('.clearFindByTopicRequests') + }); +} + +/** + * Mock for [[OpenaireBrokerEventRestService]] + */ +export function getMockSuggestionsService(): any { + return jasmine.createSpyObj('SuggestionsService', { + getTargets: jasmine.createSpy('getTargets'), + getSuggestions: jasmine.createSpy('getSuggestions'), + clearSuggestionRequests: jasmine.createSpy('clearSuggestionRequests'), + deleteReviewedSuggestion: jasmine.createSpy('deleteReviewedSuggestion'), + retrieveCurrentUserSuggestions: jasmine.createSpy('retrieveCurrentUserSuggestions'), + getTargetUuid: jasmine.createSpy('getTargetUuid'), + }); +} diff --git a/src/app/shared/mocks/reciter-suggestion-targets.mock.ts b/src/app/shared/mocks/reciter-suggestion-targets.mock.ts new file mode 100644 index 0000000000..42e293e603 --- /dev/null +++ b/src/app/shared/mocks/reciter-suggestion-targets.mock.ts @@ -0,0 +1,42 @@ +import { ResourceType } from '../../core/shared/resource-type'; +import { OpenaireSuggestionTarget } from '../../core/openaire/reciter-suggestions/models/openaire-suggestion-target.model'; + +// REST Mock --------------------------------------------------------------------- +// ------------------------------------------------------------------------------- +export const mockSuggestionTargetsObjectOne: OpenaireSuggestionTarget = { + type: new ResourceType('suggestiontarget'), + id: 'reciter:gf3d657-9d6d-4a87-b905-fef0f8cae26', + display: 'Bollini, Andrea', + source: 'reciter', + total: 31, + _links: { + target: { + href: 'https://rest.api/rest/api/core/items/gf3d657-9d6d-4a87-b905-fef0f8cae26' + }, + suggestions: { + href: 'https://rest.api/rest/api/integration/suggestions/search/findByTargetAndSource?target=gf3d657-9d6d-4a87-b905-fef0f8cae26c&source=reciter' + }, + self: { + href: 'https://rest.api/rest/api/integration/suggestiontargets/reciter:gf3d657-9d6d-4a87-b905-fef0f8cae26' + } + } +}; + +export const mockSuggestionTargetsObjectTwo: OpenaireSuggestionTarget = { + type: new ResourceType('suggestiontarget'), + id: 'reciter:nhy567-9d6d-ty67-b905-fef0f8cae26', + display: 'Digilio, Andrea', + source: 'reciter', + total: 12, + _links: { + target: { + href: 'https://rest.api/rest/api/core/items/nhy567-9d6d-ty67-b905-fef0f8cae26' + }, + suggestions: { + href: 'https://rest.api/rest/api/integration/suggestions/search/findByTargetAndSource?target=nhy567-9d6d-ty67-b905-fef0f8cae26&source=reciter' + }, + self: { + href: 'https://rest.api/rest/api/integration/suggestiontargets/reciter:nhy567-9d6d-ty67-b905-fef0f8cae26' + } + } +}; diff --git a/src/app/shared/mocks/reciter-suggestion.mock.ts b/src/app/shared/mocks/reciter-suggestion.mock.ts new file mode 100644 index 0000000000..2ddb49868f --- /dev/null +++ b/src/app/shared/mocks/reciter-suggestion.mock.ts @@ -0,0 +1,210 @@ + +// REST Mock --------------------------------------------------------------------- +// ------------------------------------------------------------------------------- + +import { OpenaireSuggestion } from '../../core/openaire/reciter-suggestions/models/openaire-suggestion.model'; +import { SUGGESTION } from '../../core/openaire/reciter-suggestions/models/openaire-suggestion-objects.resource-type'; + +export const mockSuggestionPublicationOne: OpenaireSuggestion = { + id: '24694772', + display: 'publication one', + source: 'reciter', + externalSourceUri: 'https://dspace7.4science.cloud/server/api/integration/reciterSourcesEntry/pubmed/entryValues/24694772', + score: '48', + evidences: { + acceptedRejectedEvidence: { + score: '2.7', + notes: 'some notes, eventually empty or null' + }, + authorNameEvidence: { + score: '0', + notes: 'some notes, eventually empty or null' + }, + journalCategoryEvidence: { + score: '6', + notes: 'some notes, eventually empty or null' + }, + affiliationEvidence: { + score: 'xxx', + notes: 'some notes, eventually empty or null' + }, + relationshipEvidence: { + score: '9', + notes: 'some notes, eventually empty or null' + }, + educationYearEvidence: { + score: '3.6', + notes: 'some notes, eventually empty or null' + }, + personTypeEvidence: { + score: '4', + notes: 'some notes, eventually empty or null' + }, + articleCountEvidence: { + score: '6.7', + notes: 'some notes, eventually empty or null' + }, + averageClusteringEvidence: { + score: '7', + notes: 'some notes, eventually empty or null' + } + }, + metadata: { + 'dc.identifier.uri': [ + { + value: 'https://publication/0000-0003-3681-2038', + language: null, + authority: null, + confidence: -1, + place: -1 + } as any + ], + 'dc.title': [ + { + value: 'publication one', + language: null, + authority: null, + confidence: -1 + } as any + ], + 'dc.date.issued': [ + { + value: '2010-11-03', + language: null, + authority: null, + confidence: -1 + } as any + ], + 'dspace.entity.type': [ + { + uuid: '95f21fe6-ce38-43d6-96d4-60ae66385a06', + language: null, + value: 'OrgUnit', + place: 0, + authority: null, + confidence: -1 + } as any + ], + 'dc.description': [ + { + uuid: '95f21fe6-ce38-43d6-96d4-60ae66385a06', + language: null, + value: "It is a long established fact that a reader will be distracted by the readable content of a page when looking at its layout. The point of using Lorem Ipsum is that it has a more-or-less normal distribution of letters, as opposed to using 'Content here, content here', making it look like readable English. Many desktop publishing packages and web page editors now use Lorem Ipsum as their default model text, and a search for 'lorem ipsum' will uncover many web sites still in their infancy. Various versions have evolved over the years, sometimes by accident, sometimes on purpose (injected humour and the like).", + place: 0, + authority: null, + confidence: -1 + } as any + ] + }, + type: SUGGESTION, + _links: { + target: { + href: 'https://dspace7.4science.cloud/server/api/core/items/gf3d657-9d6d-4a87-b905-fef0f8cae26' + }, + self: { + href: 'https://dspace7.4science.cloud/server/api/integration/suggestions/reciter:gf3d657-9d6d-4a87-b905-fef0f8cae26c:24694772' + } + } +}; + +export const mockSuggestionPublicationTwo: OpenaireSuggestion = { + id: '24694772', + display: 'publication two', + source: 'reciter', + externalSourceUri: 'https://dspace7.4science.cloud/server/api/integration/reciterSourcesEntry/pubmed/entryValues/24694772', + score: '48', + evidences: { + acceptedRejectedEvidence: { + score: '2.7', + notes: 'some notes, eventually empty or null' + }, + authorNameEvidence: { + score: '0', + notes: 'some notes, eventually empty or null' + }, + journalCategoryEvidence: { + score: '6', + notes: 'some notes, eventually empty or null' + }, + affiliationEvidence: { + score: 'xxx', + notes: 'some notes, eventually empty or null' + }, + relationshipEvidence: { + score: '9', + notes: 'some notes, eventually empty or null' + }, + educationYearEvidence: { + score: '3.6', + notes: 'some notes, eventually empty or null' + }, + personTypeEvidence: { + score: '4', + notes: 'some notes, eventually empty or null' + }, + articleCountEvidence: { + score: '6.7', + notes: 'some notes, eventually empty or null' + }, + averageClusteringEvidence: { + score: '7', + notes: 'some notes, eventually empty or null' + } + }, + metadata: { + 'dc.identifier.uri': [ + { + value: 'https://publication/0000-0003-3681-2038', + language: null, + authority: null, + confidence: -1, + place: -1 + } as any + ], + 'dc.title': [ + { + value: 'publication one', + language: null, + authority: null, + confidence: -1 + } as any + ], + 'dc.date.issued': [ + { + value: '2010-11-03', + language: null, + authority: null, + confidence: -1 + } as any + ], + 'dspace.entity.type': [ + { + uuid: '95f21fe6-ce38-43d6-96d4-60ae66385a06', + language: null, + value: 'OrgUnit', + place: 0, + authority: null, + confidence: -1 + } as any + ], + 'dc.description': [ + { + uuid: '95f21fe6-ce38-43d6-96d4-60ae66385a06', + language: null, + value: "It is a long established fact that a reader will be distracted by the readable content of a page when looking at its layout. The point of using Lorem Ipsum is that it has a more-or-less normal distribution of letters, as opposed to using 'Content here, content here', making it look like readable English. Many desktop publishing packages and web page editors now use Lorem Ipsum as their default model text, and a search for 'lorem ipsum' will uncover many web sites still in their infancy. Various versions have evolved over the years, sometimes by accident, sometimes on purpose (injected humour and the like).", + place: 0, + authority: null, + confidence: -1 + } as any + ] + }, + type: SUGGESTION, + _links: { + target: { + href: 'https://dspace7.4science.cloud/server/api/core/items/gf3d657-9d6d-4a87-b905-fef0f8cae26' + }, + self: { + href: 'https://dspace7.4science.cloud/server/api/integration/suggestions/reciter:gf3d657-9d6d-4a87-b905-fef0f8cae26c:24694772' + } + } +}; diff --git a/src/app/suggestions-page/suggestions-page-routing-paths.ts b/src/app/suggestions-page/suggestions-page-routing-paths.ts new file mode 100644 index 0000000000..0f3aa782d2 --- /dev/null +++ b/src/app/suggestions-page/suggestions-page-routing-paths.ts @@ -0,0 +1,11 @@ +import { URLCombiner } from '../core/url-combiner/url-combiner'; + +export const SUGGESTION_MODULE_PATH = 'suggestions'; + +export function getSuggestionModuleRoute() { + return `/${SUGGESTION_MODULE_PATH}`; +} + +export function getSuggestionPageRoute(SuggestionId: string) { + return new URLCombiner(getSuggestionModuleRoute(), SuggestionId).toString(); +} diff --git a/src/app/suggestions-page/suggestions-page-routing.module.ts b/src/app/suggestions-page/suggestions-page-routing.module.ts new file mode 100644 index 0000000000..20ed658707 --- /dev/null +++ b/src/app/suggestions-page/suggestions-page-routing.module.ts @@ -0,0 +1,36 @@ +import { NgModule } from '@angular/core'; +import { RouterModule } from '@angular/router'; + +import { SuggestionsPageResolver } from './suggestions-page.resolver'; +import { SuggestionsPageComponent } from './suggestions-page.component'; +import { AuthenticatedGuard } from '../core/auth/authenticated.guard'; +import { I18nBreadcrumbResolver } from '../core/breadcrumbs/i18n-breadcrumb.resolver'; +import { SiteAdministratorGuard } from '../core/data/feature-authorization/feature-authorization-guard/site-administrator.guard'; + +@NgModule({ + imports: [ + RouterModule.forChild([ + { + path: ':targetId', + resolve: { + suggestionTargets: SuggestionsPageResolver, + breadcrumb: I18nBreadcrumbResolver + }, + data: { + title: 'admin.notifications.recitersuggestion.page.title', + breadcrumbKey: 'admin.notifications.recitersuggestion', + showBreadcrumbsFluid: false + }, + canActivate: [AuthenticatedGuard], + runGuardsAndResolvers: 'always', + component: SuggestionsPageComponent, + }, + ]) + ], + providers: [ + SuggestionsPageResolver + ] +}) +export class SuggestionsPageRoutingModule { + +} diff --git a/src/app/suggestions-page/suggestions-page.component.html b/src/app/suggestions-page/suggestions-page.component.html new file mode 100644 index 0000000000..fb5f08b6a4 --- /dev/null +++ b/src/app/suggestions-page/suggestions-page.component.html @@ -0,0 +1,48 @@ +
+
+
+ +
+ +

+ {{ translateSuggestionType() | translate }} + {{'reciter.suggestion.suggestionFor' | translate}} + {{researcherName}} + {{'reciter.suggestion.from.source' | translate}} {{ translateSuggestionSource() | translate }} +

+ +
+ + ({{ getSelectedSuggestionsCount() }}) + + +
+ + +
    +
  • + +
  • +
+
+
+
+
+
+
diff --git a/src/app/suggestions-page/suggestions-page.component.scss b/src/app/suggestions-page/suggestions-page.component.scss new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/app/suggestions-page/suggestions-page.component.spec.ts b/src/app/suggestions-page/suggestions-page.component.spec.ts new file mode 100644 index 0000000000..ad518930d9 --- /dev/null +++ b/src/app/suggestions-page/suggestions-page.component.spec.ts @@ -0,0 +1,107 @@ +import { CommonModule } from '@angular/common'; +import { BrowserModule } from '@angular/platform-browser'; +import { NO_ERRORS_SCHEMA } from '@angular/core'; +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { TranslateModule, TranslateService } from '@ngx-translate/core'; +import { of as observableOf } from 'rxjs'; + +import { SuggestionsPageComponent } from './suggestions-page.component'; +import { SuggestionListElementComponent } from '../openaire/reciter-suggestions/suggestion-list-element/suggestion-list-element.component'; +import { SuggestionsService } from '../openaire/reciter-suggestions/suggestions.service'; +import { getMockOpenaireStateService, getMockSuggestionsService } from '../shared/mocks/openaire.mock'; +import { buildPaginatedList, PaginatedList } from '../core/data/paginated-list.model'; +import { OpenaireSuggestion } from '../core/openaire/reciter-suggestions/models/openaire-suggestion.model'; +import { mockSuggestionPublicationOne, mockSuggestionPublicationTwo } from '../shared/mocks/reciter-suggestion.mock'; +import { SuggestionEvidencesComponent } from '../openaire/reciter-suggestions/suggestion-list-element/suggestion-evidences/suggestion-evidences.component'; +import { ObjectKeysPipe } from '../shared/utils/object-keys-pipe'; +import { VarDirective } from '../shared/utils/var.directive'; +import { ActivatedRoute, Router } from '@angular/router'; +import { RouterStub } from '../shared/testing/router.stub'; +import { mockSuggestionTargetsObjectOne } from '../shared/mocks/reciter-suggestion-targets.mock'; +import { AuthService } from '../core/auth/auth.service'; +import { NotificationsService } from '../shared/notifications/notifications.service'; +import { NotificationsServiceStub } from '../shared/testing/notifications-service.stub'; +import { getMockTranslateService } from '../shared/mocks/translate.service.mock'; +import { SuggestionTargetsStateService } from '../openaire/reciter-suggestions/suggestion-targets/suggestion-targets.state.service'; +import { WorkspaceitemDataService } from '../core/submission/workspaceitem-data.service'; +import { createSuccessfulRemoteDataObject } from '../shared/remote-data.utils'; +import { PageInfo } from '../core/shared/page-info.model'; +import { TestScheduler } from 'rxjs/testing'; +import { getTestScheduler } from 'jasmine-marbles'; +import { PaginationServiceStub } from '../shared/testing/pagination-service.stub'; +import { PaginationService } from '../core/pagination/pagination.service'; + +describe('SuggestionPageComponent', () => { + let component: SuggestionsPageComponent; + let fixture: ComponentFixture; + let scheduler: TestScheduler; + const mockSuggestionsService = getMockSuggestionsService(); + const mockSuggestionsTargetStateService = getMockOpenaireStateService(); + const suggestionTargetsList: PaginatedList = buildPaginatedList(new PageInfo(), [mockSuggestionPublicationOne, mockSuggestionPublicationTwo]); + const router = new RouterStub(); + const routeStub = { + data: observableOf({ + suggestionTargets: createSuccessfulRemoteDataObject(mockSuggestionTargetsObjectOne) + }), + queryParams: observableOf({}) + }; + const workspaceitemServiceMock = jasmine.createSpyObj('WorkspaceitemDataService', { + importExternalSourceEntry: jasmine.createSpy('importExternalSourceEntry') + }); + + const authService = jasmine.createSpyObj('authService', { + isAuthenticated: observableOf(true), + setRedirectUrl: {} + }); + const paginationService = new PaginationServiceStub(); + + beforeEach(async(() => { + TestBed.configureTestingModule({ + imports: [ + BrowserModule, + CommonModule, + TranslateModule.forRoot() + ], + declarations: [ + SuggestionEvidencesComponent, + SuggestionListElementComponent, + SuggestionsPageComponent, + ObjectKeysPipe, + VarDirective + ], + providers: [ + { provide: AuthService, useValue: authService }, + { provide: ActivatedRoute, useValue: routeStub }, + { provide: WorkspaceitemDataService, useValue: workspaceitemServiceMock }, + { provide: Router, useValue: router }, + { provide: SuggestionsService, useValue: mockSuggestionsService }, + { provide: SuggestionTargetsStateService, useValue: mockSuggestionsTargetStateService }, + { provide: NotificationsService, useValue: new NotificationsServiceStub() }, + { provide: TranslateService, useValue: getMockTranslateService() }, + { provide: PaginationService, useValue: paginationService }, + SuggestionsPageComponent + ], + schemas: [NO_ERRORS_SCHEMA] + }) + .compileComponents().then(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(SuggestionsPageComponent); + component = fixture.componentInstance; + scheduler = getTestScheduler(); + }); + + it('should create', () => { + spyOn(component, 'updatePage').and.stub(); + + scheduler.schedule(() => fixture.detectChanges()); + scheduler.flush(); + + expect(component).toBeTruthy(); + expect(component.suggestionId).toBe(mockSuggestionTargetsObjectOne.id); + expect(component.researcherName).toBe(mockSuggestionTargetsObjectOne.display); + expect(component.updatePage).toHaveBeenCalled(); + }); +}); diff --git a/src/app/suggestions-page/suggestions-page.component.ts b/src/app/suggestions-page/suggestions-page.component.ts new file mode 100644 index 0000000000..911f6167de --- /dev/null +++ b/src/app/suggestions-page/suggestions-page.component.ts @@ -0,0 +1,285 @@ +import { Component, OnInit } from '@angular/core'; +import { ActivatedRoute, Data, Router } from '@angular/router'; + +import { BehaviorSubject, combineLatest, Observable } from 'rxjs'; +import { distinctUntilChanged, map, switchMap, take } from 'rxjs/operators'; +import { TranslateService } from '@ngx-translate/core'; + +import { SortDirection, SortOptions, } from '../core/cache/models/sort-options.model'; +import { PaginatedList } from '../core/data/paginated-list.model'; +import { RemoteData } from '../core/data/remote-data'; +import { getFirstSucceededRemoteDataPayload, redirectOn4xx } from '../core/shared/operators'; +import { SuggestionBulkResult, SuggestionsService } from '../openaire/reciter-suggestions/suggestions.service'; +import { PaginationComponentOptions } from '../shared/pagination/pagination-component-options.model'; +import { OpenaireSuggestion } from '../core/openaire/reciter-suggestions/models/openaire-suggestion.model'; +import { OpenaireSuggestionTarget } from '../core/openaire/reciter-suggestions/models/openaire-suggestion-target.model'; +import { AuthService } from '../core/auth/auth.service'; +import { SuggestionApproveAndImport } from '../openaire/reciter-suggestions/suggestion-list-element/suggestion-list-element.component'; +import { NotificationsService } from '../shared/notifications/notifications.service'; +import { SuggestionTargetsStateService } from '../openaire/reciter-suggestions/suggestion-targets/suggestion-targets.state.service'; +import { WorkspaceitemDataService } from '../core/submission/workspaceitem-data.service'; +import { PaginationService } from '../core/pagination/pagination.service'; +import { FindListOptions } from '../core/data/request.models'; +import { WorkspaceItem } from '../core/submission/models/workspaceitem.model'; + +@Component({ + selector: 'ds-suggestion-page', + templateUrl: './suggestions-page.component.html', + styleUrls: ['./suggestions-page.component.scss'], +}) +export class SuggestionsPageComponent implements OnInit { + + /** + * The pagination configuration + */ + paginationOptions: PaginationComponentOptions = Object.assign(new PaginationComponentOptions(), { + id: 'sp', + pageSizeOptions: [5, 10, 20, 40, 60] + }); + + /** + * The sorting configuration + */ + paginationSortConfig: SortOptions = new SortOptions('trust', SortDirection.DESC); + + /** + * The FindListOptions object + */ + defaultConfig: FindListOptions = Object.assign(new FindListOptions(), {sort: this.paginationSortConfig}); + + /** + * A boolean representing if results are loading + */ + public processing$ = new BehaviorSubject(false); + + /** + * A list of remote data objects of suggestions + */ + suggestionsRD$: BehaviorSubject> = new BehaviorSubject>({} as any); + + targetRD$: Observable>; + targetId$: Observable; + + suggestionTarget: OpenaireSuggestionTarget; + suggestionId: any; + suggestionSource: any; + researcherName: any; + researcherUuid: any; + + selectedSuggestions: { [id: string]: OpenaireSuggestion } = {}; + isBulkOperationPending = false; + + constructor( + private authService: AuthService, + private notificationService: NotificationsService, + private paginationService: PaginationService, + private route: ActivatedRoute, + private router: Router, + private suggestionService: SuggestionsService, + private suggestionTargetsStateService: SuggestionTargetsStateService, + private translateService: TranslateService, + private workspaceItemService: WorkspaceitemDataService + ) { + } + + ngOnInit(): void { + this.targetRD$ = this.route.data.pipe( + map((data: Data) => data.suggestionTargets as RemoteData), + redirectOn4xx(this.router, this.authService) + ); + + this.targetId$ = this.targetRD$.pipe( + getFirstSucceededRemoteDataPayload(), + map((target: OpenaireSuggestionTarget) => target.id) + ); + this.targetRD$.pipe( + getFirstSucceededRemoteDataPayload() + ).subscribe((suggestionTarget: OpenaireSuggestionTarget) => { + this.suggestionTarget = suggestionTarget; + this.suggestionId = suggestionTarget.id; + this.researcherName = suggestionTarget.display; + this.suggestionSource = suggestionTarget.source; + this.researcherUuid = this.suggestionService.getTargetUuid(suggestionTarget); + this.updatePage(); + }); + + this.suggestionTargetsStateService.dispatchMarkUserSuggestionsAsVisitedAction(); + } + + /** + * Called when one of the pagination settings is changed + */ + onPaginationChange() { + this.updatePage(); + } + + /** + * Update the list of suggestions + */ + updatePage() { + this.processing$.next(true); + const pageConfig$: Observable = this.paginationService.getFindListOptions( + this.paginationOptions.id, + this.defaultConfig, + ).pipe( + distinctUntilChanged() + ); + combineLatest([this.targetId$, pageConfig$]).pipe( + switchMap(([targetId, config]: [string, FindListOptions]) => { + return this.suggestionService.getSuggestions( + targetId, + config.elementsPerPage, + config.currentPage, + config.sort + ); + }), + take(1) + ).subscribe((results: PaginatedList) => { + this.processing$.next(false); + this.suggestionsRD$.next(results); + this.suggestionService.clearSuggestionRequests(); + // navigate to the mydspace if no suggestions remains + + // if (results.totalElements === 0) { + // const content = this.translateService.instant('reciter.suggestion.empty', + // this.suggestionService.getNotificationSuggestionInterpolation(this.suggestionTarget)); + // this.notificationService.success('', content, {timeOut:0}, true); + // TODO if the target is not the current use route to the suggestion target page + // this.router.navigate(['/mydspace']); + // } + }); + } + + /** + * Used to delete a suggestion. + * @suggestionId + */ + notMine(suggestionId) { + this.suggestionService.notMine(suggestionId).subscribe((res) => { + this.suggestionTargetsStateService.dispatchRefreshUserSuggestionsAction(); + this.updatePage(); + }); + } + + /** + * Used to delete all selected suggestions. + */ + notMineAllSelected() { + this.isBulkOperationPending = true; + this.suggestionService + .notMineMultiple(Object.values(this.selectedSuggestions)) + .subscribe((results: SuggestionBulkResult) => { + this.suggestionTargetsStateService.dispatchRefreshUserSuggestionsAction(); + this.updatePage(); + this.isBulkOperationPending = false; + this.selectedSuggestions = {}; + if (results.success > 0) { + this.notificationService.success( + this.translateService.get('reciter.suggestion.notMine.bulk.success', + {count: results.success})); + } + if (results.fails > 0) { + this.notificationService.error( + this.translateService.get('reciter.suggestion.notMine.bulk.error', + {count: results.fails})); + } + }); + } + + /** + * Used to approve & import. + * @param event contains the suggestion and the target collection + */ + approveAndImport(event: SuggestionApproveAndImport) { + this.suggestionService.approveAndImport(this.workspaceItemService, event.suggestion, event.collectionId) + .subscribe((workspaceitem: WorkspaceItem) => { + const content = this.translateService.instant('reciter.suggestion.approveAndImport.success', { workspaceItemId: workspaceitem.id }); + this.notificationService.success('', content, {timeOut:0}, true); + this.suggestionTargetsStateService.dispatchRefreshUserSuggestionsAction(); + this.updatePage(); + }); + } + + /** + * Used to approve & import all selected suggestions. + * @param event contains the target collection + */ + approveAndImportAllSelected(event: SuggestionApproveAndImport) { + this.isBulkOperationPending = true; + this.suggestionService + .approveAndImportMultiple(this.workspaceItemService, Object.values(this.selectedSuggestions), event.collectionId) + .subscribe((results: SuggestionBulkResult) => { + this.suggestionTargetsStateService.dispatchRefreshUserSuggestionsAction(); + this.updatePage(); + this.isBulkOperationPending = false; + this.selectedSuggestions = {}; + if (results.success > 0) { + this.notificationService.success( + this.translateService.get('reciter.suggestion.approveAndImport.bulk.success', + {count: results.success})); + } + if (results.fails > 0) { + this.notificationService.error( + this.translateService.get('reciter.suggestion.approveAndImport.bulk.error', + {count: results.fails})); + } + }); + } + + /** + * When a specific suggestion is selected. + * @param object the suggestions + * @param selected the new selected value for the suggestion + */ + onSelected(object: OpenaireSuggestion, selected: boolean) { + if (selected) { + this.selectedSuggestions[object.id] = object; + } else { + delete this.selectedSuggestions[object.id]; + } + } + + /** + * When Toggle Select All occurs. + * @param suggestions all the visible suggestions inside the page + */ + onToggleSelectAll(suggestions: OpenaireSuggestion[]) { + if ( this.getSelectedSuggestionsCount() > 0) { + this.selectedSuggestions = {}; + } else { + suggestions.forEach((suggestion) => { + this.selectedSuggestions[suggestion.id] = suggestion; + }); + } + } + + /** + * The current number of selected suggestions. + */ + getSelectedSuggestionsCount(): number { + return Object.keys(this.selectedSuggestions).length; + } + + /** + * Return true if all the suggestion are configured with the same fixed collection in the configuration. + * @param suggestions + */ + isCollectionFixed(suggestions: OpenaireSuggestion[]): boolean { + return this.suggestionService.isCollectionFixed(suggestions); + } + + /** + * Label to be used to translate the suggestion source. + */ + translateSuggestionSource() { + return this.suggestionService.translateSuggestionSource(this.suggestionSource); + } + + /** + * Label to be used to translate the suggestion type. + */ + translateSuggestionType() { + return this.suggestionService.translateSuggestionType(this.suggestionSource); + } + +} diff --git a/src/app/suggestions-page/suggestions-page.module.ts b/src/app/suggestions-page/suggestions-page.module.ts new file mode 100644 index 0000000000..3fad2d0c19 --- /dev/null +++ b/src/app/suggestions-page/suggestions-page.module.ts @@ -0,0 +1,24 @@ +import { NgModule } from '@angular/core'; +import { CommonModule } from '@angular/common'; + +import { SuggestionsPageComponent } from './suggestions-page.component'; +import { SharedModule } from '../shared/shared.module'; +import { SuggestionsPageRoutingModule } from './suggestions-page-routing.module'; +import { SuggestionsService } from '../openaire/reciter-suggestions/suggestions.service'; +import { OpenaireSuggestionsDataService } from '../core/openaire/reciter-suggestions/openaire-suggestions-data.service'; +import { OpenaireModule } from '../openaire/openaire.module'; + +@NgModule({ + declarations: [SuggestionsPageComponent], + imports: [ + CommonModule, + SharedModule, + OpenaireModule, + SuggestionsPageRoutingModule + ], + providers: [ + OpenaireSuggestionsDataService, + SuggestionsService + ] +}) +export class SuggestionsPageModule { } diff --git a/src/app/suggestions-page/suggestions-page.resolver.ts b/src/app/suggestions-page/suggestions-page.resolver.ts new file mode 100644 index 0000000000..0027ae2e77 --- /dev/null +++ b/src/app/suggestions-page/suggestions-page.resolver.ts @@ -0,0 +1,32 @@ +import { Injectable } from '@angular/core'; +import { ActivatedRouteSnapshot, Resolve, RouterStateSnapshot } from '@angular/router'; + +import { Observable } from 'rxjs'; +import { find } from 'rxjs/operators'; + +import { RemoteData } from '../core/data/remote-data'; +import { hasValue } from '../shared/empty.util'; +import { OpenaireSuggestionsDataService } from '../core/openaire/reciter-suggestions/openaire-suggestions-data.service'; +import { OpenaireSuggestionTarget } from '../core/openaire/reciter-suggestions/models/openaire-suggestion-target.model'; + +/** + * This class represents a resolver that requests a specific collection before the route is activated + */ +@Injectable() +export class SuggestionsPageResolver implements Resolve> { + constructor(private suggestionsDataService: OpenaireSuggestionsDataService) { + } + + /** + * Method for resolving a suggestion target based on the parameters in the current route + * @param {ActivatedRouteSnapshot} route The current ActivatedRouteSnapshot + * @param {RouterStateSnapshot} state The current RouterStateSnapshot + * @returns Observable<> Emits the found collection based on the parameters in the current route, + * or an error if something went wrong + */ + resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable> { + return this.suggestionsDataService.getTargetById(route.params.targetId).pipe( + find((RD) => hasValue(RD.hasFailed) || RD.hasSucceeded), + ); + } +} diff --git a/src/assets/i18n/en.json5 b/src/assets/i18n/en.json5 index 2af9d16b0c..e2919097d6 100644 --- a/src/assets/i18n/en.json5 +++ b/src/assets/i18n/en.json5 @@ -27,6 +27,10 @@ "404.page-not-found": "page not found", + "admin.notifications.recitersuggestion.breadcrumbs": "Suggestions", + + "admin.notifications.recitersuggestion.page.title": "Suggestions", + "admin.curation-tasks.breadcrumbs": "System curation tasks", "admin.curation-tasks.title": "System curation tasks", @@ -2511,6 +2515,7 @@ "menu.section.icon.unpin": "Unpin sidebar", + "menu.section.icon.notifications": "Notifictions menu section", "menu.section.import": "Import", @@ -2533,6 +2538,10 @@ "menu.section.new_process": "Process", + "menu.section.notifications": "Notifications", + + "menu.section.notifications_reciter": "Publication Claim", + "menu.section.pin": "Pin sidebar", @@ -2960,6 +2969,62 @@ "media-viewer.playlist": "Playlist", + "reciter.suggestion.loading": "Loading ...", + + "reciter.suggestion.title": "Suggestions", + + "reciter.suggestion.targets.description": "Below you can see all the suggestions ", + + "reciter.suggestion.targets": "Current Suggestions", + + "reciter.suggestion.table.name": "Researcher Name", + + "reciter.suggestion.table.actions": "Actions", + + "reciter.suggestion.button.review": "Review {{ total }} suggestion(s)", + + "reciter.suggestion.noTargets": "No target found.", + + "reciter.suggestion.target.error.service.retrieve": "An error occurred while loading the Suggestion targets", + + "reciter.suggestion.evidence.type": "Type", + + "reciter.suggestion.evidence.score": "Score", + + "reciter.suggestion.evidence.notes": "Notes", + + "reciter.suggestion.approveAndImport": "Approve & import", + + "reciter.suggestion.approveAndImport.success": "The suggestion has been imported successfully", + + "reciter.suggestion.approveAndImport.bulk": "Approve & import Selected", + + "reciter.suggestion.approveAndImport.bulk.success": "{{ count }} suggestions have been imported successfully ", + + "reciter.suggestion.approveAndImport.bulk.error": "{{ count }} suggestions haven't been imported due to unexpected server errors", + + "reciter.suggestion.notMine": "Not mine", + + "reciter.suggestion.notMine.success": "The suggestion has been discarded", + + "reciter.suggestion.notMine.bulk": "Not mine Selected", + + "reciter.suggestion.notMine.bulk.success": "{{ count }} suggestions have been discarded ", + + "reciter.suggestion.notMine.bulk.error": "{{ count }} suggestions haven't been discarded due to unexpected server errors", + + "reciter.suggestion.seeEvidence": "See evidence", + + "reciter.suggestion.hideEvidence": "Hide evidence", + + "reciter.suggestion.suggestionFor": "Suggestion for", + + "reciter.suggestion.source.oaire": "OpenAIRE Graph", + + "reciter.suggestion.from.source": "from the ", + + "reciter.suggestion.totalScore": "Total Score", + "register-email.title": "New user registration", From b4d6fbc390282a381e1f7cc340615c40f39e936a Mon Sep 17 00:00:00 2001 From: Luca Giamminonni Date: Mon, 2 May 2022 17:40:51 +0200 Subject: [PATCH 008/409] [CST-5249] Fixed compilation issues --- .../admin-sidebar/admin-sidebar.component.ts | 1 - .../openaire-suggestion-source.model.ts | 2 +- .../openaire-suggestion-target.model.ts | 2 +- .../models/openaire-suggestion.model.ts | 2 +- .../openaire-suggestions-data.service.ts | 4 +- .../submission/workspaceitem-data.service.ts | 31 ++++++++++++- src/app/openaire/openaire.effects.ts | 5 ++ src/app/openaire/openaire.module.ts | 2 + .../openaire/reciter-suggestions/selectors.ts | 6 +-- .../suggestion-list-element.component.html | 1 - .../suggestion-targets.component.html | 1 - .../suggestion-targets.effects.ts | 2 +- .../suggestions.service.ts | 12 ++--- .../suggestions-page.component.ts | 5 +- src/config/app-config.interface.ts | 2 + src/config/default-app-config.ts | 9 ++++ src/config/layout-config.interfaces.ts | 46 +++++++++++++++++++ 17 files changed, 112 insertions(+), 21 deletions(-) create mode 100644 src/app/openaire/openaire.effects.ts create mode 100644 src/config/layout-config.interfaces.ts diff --git a/src/app/admin/admin-sidebar/admin-sidebar.component.ts b/src/app/admin/admin-sidebar/admin-sidebar.component.ts index a8c5ef800c..b770e3d675 100644 --- a/src/app/admin/admin-sidebar/admin-sidebar.component.ts +++ b/src/app/admin/admin-sidebar/admin-sidebar.component.ts @@ -42,7 +42,6 @@ import { Router, ActivatedRoute } from '@angular/router'; import {NOTIFICATIONS_RECITER_SUGGESTION_PATH} from "../admin-notifications/admin-notifications-routing-paths"; import { MenuID } from '../../shared/menu/menu-id.model'; import { MenuItemType } from '../../shared/menu/menu-item-type.model'; -import { ActivatedRoute } from '@angular/router'; /** * Component representing the admin sidebar diff --git a/src/app/core/openaire/reciter-suggestions/models/openaire-suggestion-source.model.ts b/src/app/core/openaire/reciter-suggestions/models/openaire-suggestion-source.model.ts index 6da9fd47b9..d71b49b913 100644 --- a/src/app/core/openaire/reciter-suggestions/models/openaire-suggestion-source.model.ts +++ b/src/app/core/openaire/reciter-suggestions/models/openaire-suggestion-source.model.ts @@ -1,11 +1,11 @@ import { autoserialize, deserialize } from 'cerialize'; -import { CacheableObject } from '../../../cache/object-cache.reducer'; import { SUGGESTION_SOURCE } from './openaire-suggestion-objects.resource-type'; import { excludeFromEquals } from '../../../utilities/equals.decorators'; import { ResourceType } from '../../../shared/resource-type'; import { HALLink } from '../../../shared/hal-link.model'; import { typedObject } from '../../../cache/builders/build-decorators'; +import {CacheableObject} from "../../../cache/cacheable-object.model"; /** * The interface representing the Suggestion Source model diff --git a/src/app/core/openaire/reciter-suggestions/models/openaire-suggestion-target.model.ts b/src/app/core/openaire/reciter-suggestions/models/openaire-suggestion-target.model.ts index e35972bc79..06f85ea5b3 100644 --- a/src/app/core/openaire/reciter-suggestions/models/openaire-suggestion-target.model.ts +++ b/src/app/core/openaire/reciter-suggestions/models/openaire-suggestion-target.model.ts @@ -1,11 +1,11 @@ import { autoserialize, deserialize } from 'cerialize'; -import { CacheableObject } from '../../../cache/object-cache.reducer'; import { SUGGESTION_TARGET } from './openaire-suggestion-objects.resource-type'; import { excludeFromEquals } from '../../../utilities/equals.decorators'; import { ResourceType } from '../../../shared/resource-type'; import { HALLink } from '../../../shared/hal-link.model'; import { typedObject } from '../../../cache/builders/build-decorators'; +import {CacheableObject} from "../../../cache/cacheable-object.model"; /** * The interface representing the Suggestion Target model diff --git a/src/app/core/openaire/reciter-suggestions/models/openaire-suggestion.model.ts b/src/app/core/openaire/reciter-suggestions/models/openaire-suggestion.model.ts index 3ff5d7b630..2d28ccf9bc 100644 --- a/src/app/core/openaire/reciter-suggestions/models/openaire-suggestion.model.ts +++ b/src/app/core/openaire/reciter-suggestions/models/openaire-suggestion.model.ts @@ -1,12 +1,12 @@ import { autoserialize, autoserializeAs, deserialize } from 'cerialize'; -import { CacheableObject } from '../../../cache/object-cache.reducer'; import { SUGGESTION } from './openaire-suggestion-objects.resource-type'; import { excludeFromEquals } from '../../../utilities/equals.decorators'; import { ResourceType } from '../../../shared/resource-type'; import { HALLink } from '../../../shared/hal-link.model'; import { typedObject } from '../../../cache/builders/build-decorators'; import { MetadataMap, MetadataMapSerializer } from '../../../shared/metadata.models'; +import {CacheableObject} from "../../../cache/cacheable-object.model"; export interface SuggestionEvidences { [sectionId: string]: { diff --git a/src/app/core/openaire/reciter-suggestions/openaire-suggestions-data.service.ts b/src/app/core/openaire/reciter-suggestions/openaire-suggestions-data.service.ts index d961eaf9b5..7454caa1d9 100644 --- a/src/app/core/openaire/reciter-suggestions/openaire-suggestions-data.service.ts +++ b/src/app/core/openaire/reciter-suggestions/openaire-suggestions-data.service.ts @@ -4,14 +4,12 @@ import { Store } from '@ngrx/store'; import { Observable } from 'rxjs'; -import { CoreState } from '../../core.reducers'; import { HALEndpointService } from '../../shared/hal-endpoint.service'; import { NotificationsService } from '../../../shared/notifications/notifications.service'; import { RemoteDataBuildService } from '../../cache/builders/remote-data-build.service'; import { ObjectCacheService } from '../../cache/object-cache.service'; import { dataService } from '../../cache/builders/build-decorators'; import { RequestService } from '../../data/request.service'; -import { FindListOptions } from '../../data/request.models'; import { DataService } from '../../data/data.service'; import { ChangeAnalyzer } from '../../data/change-analyzer'; import { DefaultChangeAnalyzer } from '../../data/default-change-analyzer.service'; @@ -24,6 +22,8 @@ import { OpenaireSuggestionTarget } from './models/openaire-suggestion-target.mo import { OpenaireSuggestion } from './models/openaire-suggestion.model'; import { RequestParam } from '../../cache/models/request-param.model'; import { NoContent } from '../../shared/NoContent.model'; +import {CoreState} from "../../core-state.model"; +import {FindListOptions} from "../../data/find-list-options.model"; /* tslint:disable:max-classes-per-file */ diff --git a/src/app/core/submission/workspaceitem-data.service.ts b/src/app/core/submission/workspaceitem-data.service.ts index 1b9782834c..a4dbaab6ca 100644 --- a/src/app/core/submission/workspaceitem-data.service.ts +++ b/src/app/core/submission/workspaceitem-data.service.ts @@ -1,5 +1,5 @@ import { Injectable } from '@angular/core'; -import { HttpClient } from '@angular/common/http'; +import {HttpClient, HttpHeaders} from '@angular/common/http'; import { Store } from '@ngrx/store'; import { dataService } from '../cache/builders/build-decorators'; @@ -17,6 +17,10 @@ import { FollowLinkConfig } from '../../shared/utils/follow-link-config.model'; import { RequestParam } from '../cache/models/request-param.model'; import { CoreState } from '../core-state.model'; import { FindListOptions } from '../data/find-list-options.model'; +import {HttpOptions} from "../dspace-rest/dspace-rest.service"; +import {find, map} from "rxjs/operators"; +import {PostRequest} from "../data/request.models"; +import {hasValue} from "../../shared/empty.util"; /** * A service that provides methods to make REST requests with workspaceitems endpoint. @@ -57,4 +61,29 @@ export class WorkspaceitemDataService extends DataService { return this.findByHref(href$, useCachedVersionIfAvailable, reRequestOnStale, ...linksToFollow); } + /** + * Import an external source entry into a collection + * @param externalSourceEntryHref + * @param collectionId + */ + public importExternalSourceEntry(externalSourceEntryHref: string, collectionId: string): Observable> { + 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 href$ = this.halService.getEndpoint(this.linkPath).pipe(map((href) => `${href}?owningCollection=${collectionId}`)); + + href$.pipe( + find((href: string) => hasValue(href)), + map((href: string) => { + const request = new PostRequest(requestId, href, externalSourceEntryHref, options); + this.requestService.send(request); + }) + ).subscribe(); + + return this.rdbService.buildFromRequestUUID(requestId); + } + } diff --git a/src/app/openaire/openaire.effects.ts b/src/app/openaire/openaire.effects.ts new file mode 100644 index 0000000000..d771089f92 --- /dev/null +++ b/src/app/openaire/openaire.effects.ts @@ -0,0 +1,5 @@ +import { SuggestionTargetsEffects } from './reciter-suggestions/suggestion-targets/suggestion-targets.effects'; + +export const openaireEffects = [ + SuggestionTargetsEffects +]; diff --git a/src/app/openaire/openaire.module.ts b/src/app/openaire/openaire.module.ts index 22d04f3002..ace4622190 100644 --- a/src/app/openaire/openaire.module.ts +++ b/src/app/openaire/openaire.module.ts @@ -18,12 +18,14 @@ import { SuggestionsPopupComponent } from './reciter-suggestions/suggestions-pop import { SuggestionsNotificationComponent } from './reciter-suggestions/suggestions-notification/suggestions-notification.component'; import { TranslateModule } from '@ngx-translate/core'; import { SearchModule } from '../shared/search/search.module'; +import {openaireEffects} from "./openaire.effects"; const MODULES = [ CommonModule, SharedModule, CoreModule.forRoot(), StoreModule.forFeature('openaire', openaireReducers, storeModuleConfig as StoreConfig), + EffectsModule.forFeature(openaireEffects), TranslateModule ]; diff --git a/src/app/openaire/reciter-suggestions/selectors.ts b/src/app/openaire/reciter-suggestions/selectors.ts index e699b27dba..292e63472a 100644 --- a/src/app/openaire/reciter-suggestions/selectors.ts +++ b/src/app/openaire/reciter-suggestions/selectors.ts @@ -1,8 +1,8 @@ -import { createSelector, MemoizedSelector } from '@ngrx/store'; -import { subStateSelector } from '../../shared/selector.util'; +import {createFeatureSelector, createSelector, MemoizedSelector} from '@ngrx/store'; import { openaireSelector, OpenaireState } from '../openaire.reducer'; import { OpenaireSuggestionTarget } from '../../core/openaire/reciter-suggestions/models/openaire-suggestion-target.model'; import { SuggestionTargetState } from './suggestion-targets/suggestion-targets.reducer'; +import {subStateSelector} from "../../submission/selectors"; /** * Returns the Reciter Suggestion Target state. @@ -10,7 +10,7 @@ import { SuggestionTargetState } from './suggestion-targets/suggestion-targets.r * @param {AppState} state Top level state. * @return {OpenaireState} */ -const _getReciterSuggestionTargetState = (state: any) => state.openaire; +const _getReciterSuggestionTargetState = createFeatureSelector('openaire'); // Reciter Suggestion Targets // ---------------------------------------------------------------------------- diff --git a/src/app/openaire/reciter-suggestions/suggestion-list-element/suggestion-list-element.component.html b/src/app/openaire/reciter-suggestions/suggestion-list-element/suggestion-list-element.component.html index 05f9c0ac77..f37d595c45 100644 --- a/src/app/openaire/reciter-suggestions/suggestion-list-element/suggestion-list-element.component.html +++ b/src/app/openaire/reciter-suggestions/suggestion-list-element/suggestion-list-element.component.html @@ -21,7 +21,6 @@ [showLabel]="false" [object]="listableObject" [linkType]="0" - [hideMetrics]="true" > diff --git a/src/app/openaire/reciter-suggestions/suggestion-targets/suggestion-targets.effects.ts b/src/app/openaire/reciter-suggestions/suggestion-targets/suggestion-targets.effects.ts index 85e871403c..9a007fab21 100644 --- a/src/app/openaire/reciter-suggestions/suggestion-targets/suggestion-targets.effects.ts +++ b/src/app/openaire/reciter-suggestions/suggestion-targets/suggestion-targets.effects.ts @@ -81,7 +81,7 @@ export class SuggestionTargetsEffects { return this.store$.select((state: any) => state.core.auth.user) .pipe( switchMap((user: EPerson) => { - return this.suggestionsService.retrieveCurrentUserSuggestions(user) + return this.suggestionsService.retrieveCurrentUserSuggestions(user.uuid) .pipe( map((suggestionTargets: OpenaireSuggestionTarget[]) => new AddUserSuggestionsAction(suggestionTargets)), catchError((errors) => of(errors)) diff --git a/src/app/openaire/reciter-suggestions/suggestions.service.ts b/src/app/openaire/reciter-suggestions/suggestions.service.ts index de743d95e3..5908c8c6bf 100644 --- a/src/app/openaire/reciter-suggestions/suggestions.service.ts +++ b/src/app/openaire/reciter-suggestions/suggestions.service.ts @@ -5,7 +5,6 @@ import { catchError, map, mergeMap, take } from 'rxjs/operators'; import { OpenaireSuggestionsDataService } from '../../core/openaire/reciter-suggestions/openaire-suggestions-data.service'; import { SortDirection, SortOptions } from '../../core/cache/models/sort-options.model'; -import { FindListOptions } from '../../core/data/request.models'; import { RemoteData } from '../../core/data/remote-data'; import { PaginatedList } from '../../core/data/paginated-list.model'; import { OpenaireSuggestionTarget } from '../../core/openaire/reciter-suggestions/models/openaire-suggestion-target.model'; @@ -25,8 +24,9 @@ import { WorkspaceitemDataService } from '../../core/submission/workspaceitem-da import { TranslateService } from '@ngx-translate/core'; import { NoContent } from '../../core/shared/NoContent.model'; import { environment } from '../../../environments/environment'; -import { SuggestionConfig } from '../../../config/layout-config.interfaces'; import { WorkspaceItem } from '../../core/submission/models/workspaceitem.model'; +import {FindListOptions} from "../../core/data/find-list-options.model"; +import {SuggestionConfig} from "../../../config/layout-config.interfaces"; export interface SuggestionBulkResult { success: number; @@ -142,11 +142,11 @@ export class SuggestionsService { /** * Retrieve suggestion targets for the given user * - * @param user - * The EPerson object for which to retrieve suggestion targets + * @param userUuid + * The EPerson id for which to retrieve suggestion targets */ - public retrieveCurrentUserSuggestions(user: EPerson): Observable { - return this.researcherProfileService.findById(user.uuid).pipe( + public retrieveCurrentUserSuggestions(userUuid: string): Observable { + return this.researcherProfileService.findById(userUuid).pipe( mergeMap((profile: ResearcherProfile) => { if (isNotEmpty(profile)) { return this.researcherProfileService.findRelatedItemId(profile).pipe( diff --git a/src/app/suggestions-page/suggestions-page.component.ts b/src/app/suggestions-page/suggestions-page.component.ts index 911f6167de..850a30da22 100644 --- a/src/app/suggestions-page/suggestions-page.component.ts +++ b/src/app/suggestions-page/suggestions-page.component.ts @@ -8,7 +8,7 @@ import { TranslateService } from '@ngx-translate/core'; import { SortDirection, SortOptions, } from '../core/cache/models/sort-options.model'; import { PaginatedList } from '../core/data/paginated-list.model'; import { RemoteData } from '../core/data/remote-data'; -import { getFirstSucceededRemoteDataPayload, redirectOn4xx } from '../core/shared/operators'; +import { getFirstSucceededRemoteDataPayload } from '../core/shared/operators'; import { SuggestionBulkResult, SuggestionsService } from '../openaire/reciter-suggestions/suggestions.service'; import { PaginationComponentOptions } from '../shared/pagination/pagination-component-options.model'; import { OpenaireSuggestion } from '../core/openaire/reciter-suggestions/models/openaire-suggestion.model'; @@ -19,8 +19,9 @@ import { NotificationsService } from '../shared/notifications/notifications.serv import { SuggestionTargetsStateService } from '../openaire/reciter-suggestions/suggestion-targets/suggestion-targets.state.service'; import { WorkspaceitemDataService } from '../core/submission/workspaceitem-data.service'; import { PaginationService } from '../core/pagination/pagination.service'; -import { FindListOptions } from '../core/data/request.models'; import { WorkspaceItem } from '../core/submission/models/workspaceitem.model'; +import {FindListOptions} from "../core/data/find-list-options.model"; +import {redirectOn4xx} from "../core/shared/authorized.operators"; @Component({ selector: 'ds-suggestion-page', diff --git a/src/config/app-config.interface.ts b/src/config/app-config.interface.ts index 121e80cd74..6446e7f127 100644 --- a/src/config/app-config.interface.ts +++ b/src/config/app-config.interface.ts @@ -14,6 +14,7 @@ import { AuthConfig } from './auth-config.interfaces'; import { UIServerConfig } from './ui-server-config.interface'; import { MediaViewerConfig } from './media-viewer-config.interface'; import { BrowseByConfig } from './browse-by-config.interface'; +import {SuggestionConfig} from "./layout-config.interfaces"; interface AppConfig extends Config { ui: UIServerConfig; @@ -32,6 +33,7 @@ interface AppConfig extends Config { collection: CollectionPageConfig; themes: ThemeConfig[]; mediaViewer: MediaViewerConfig; + suggestion: SuggestionConfig[]; } const APP_CONFIG = new InjectionToken('APP_CONFIG'); diff --git a/src/config/default-app-config.ts b/src/config/default-app-config.ts index dc54c2fcb0..aea29fc819 100644 --- a/src/config/default-app-config.ts +++ b/src/config/default-app-config.ts @@ -14,6 +14,7 @@ import { ServerConfig } from './server-config.interface'; import { SubmissionConfig } from './submission-config.interface'; import { ThemeConfig } from './theme.model'; import { UIServerConfig } from './ui-server-config.interface'; +import {SuggestionConfig} from "./layout-config.interfaces"; export class DefaultAppConfig implements AppConfig { production = false; @@ -210,6 +211,14 @@ export class DefaultAppConfig implements AppConfig { } }; + suggestion: SuggestionConfig[] = [ + // { + // // Use this configuration to map a suggestion import to a specific collection based on the suggestion type. + // source: 'suggestionSource', + // collectionId: 'collectionUUID' + // } + ]; + // Theme Config themes: ThemeConfig[] = [ // Add additional themes here. In the case where multiple themes match a route, the first one diff --git a/src/config/layout-config.interfaces.ts b/src/config/layout-config.interfaces.ts new file mode 100644 index 0000000000..0b15a06aa9 --- /dev/null +++ b/src/config/layout-config.interfaces.ts @@ -0,0 +1,46 @@ +import { Config } from './config.interface'; + +export interface UrnConfig extends Config { + name: string; + baseUrl: string; +} + +export interface CrisRefConfig extends Config { + entityType: string; + icon: string; +} + +export interface CrisLayoutMetadataBoxConfig extends Config { + defaultMetadataLabelColStyle: string; + defaultMetadataValueColStyle: string; +} + +export interface CrisLayoutTypeConfig { + orientation: string; +} + +export interface NavbarConfig extends Config { + showCommunityCollection: boolean; +} + +export interface CrisItemPageConfig extends Config { + [entity: string]: CrisLayoutTypeConfig; + default: CrisLayoutTypeConfig; +} + + +export interface CrisLayoutConfig extends Config { + urn: UrnConfig[]; + crisRef: CrisRefConfig[]; + itemPage: CrisItemPageConfig; + metadataBox: CrisLayoutMetadataBoxConfig; +} + +export interface LayoutConfig extends Config { + navbar: NavbarConfig; +} + +export interface SuggestionConfig extends Config { + source: string; + collectionId: string; +} From 11d25e66997d99bd1cb932c057feff3f8dc30e70 Mon Sep 17 00:00:00 2001 From: Luca Giamminonni Date: Wed, 4 May 2022 13:16:13 +0200 Subject: [PATCH 009/409] [CST-5249] Fixed suggestion page --- .../admin-sidebar/admin-sidebar.component.ts | 2 +- src/app/core/core.module.ts | 2 +- .../openaire-suggestion-source.model.ts | 2 +- .../openaire-suggestion-target.model.ts | 2 +- .../models/openaire-suggestion.model.ts | 2 +- .../openaire-suggestions-data.service.ts | 5 +- .../submission/workspaceitem-data.service.ts | 8 +- src/app/openaire/openaire.module.ts | 2 +- .../openaire/reciter-suggestions/selectors.ts | 2 +- .../suggestion-targets.actions.ts | 1 + .../suggestion-targets.effects.ts | 6 +- .../suggestions.service.ts | 4 +- .../dso-selector-modal-wrapper.component.ts | 24 +- src/app/shared/mocks/openaire.mock.ts | 445 ------------------ .../suggestions-page.component.ts | 4 +- src/assets/i18n/en.json5 | 1 + src/config/app-config.interface.ts | 2 +- src/config/default-app-config.ts | 2 +- src/environments/environment.test.ts | 8 + 19 files changed, 55 insertions(+), 469 deletions(-) diff --git a/src/app/admin/admin-sidebar/admin-sidebar.component.ts b/src/app/admin/admin-sidebar/admin-sidebar.component.ts index b770e3d675..c13599be9d 100644 --- a/src/app/admin/admin-sidebar/admin-sidebar.component.ts +++ b/src/app/admin/admin-sidebar/admin-sidebar.component.ts @@ -39,7 +39,7 @@ import { CSSVariableService } from '../../shared/sass-helper/sass-helper.service import { AuthorizationDataService } from '../../core/data/feature-authorization/authorization-data.service'; import { FeatureID } from '../../core/data/feature-authorization/feature-id'; import { Router, ActivatedRoute } from '@angular/router'; -import {NOTIFICATIONS_RECITER_SUGGESTION_PATH} from "../admin-notifications/admin-notifications-routing-paths"; +import {NOTIFICATIONS_RECITER_SUGGESTION_PATH} from '../admin-notifications/admin-notifications-routing-paths'; import { MenuID } from '../../shared/menu/menu-id.model'; import { MenuItemType } from '../../shared/menu/menu-item-type.model'; diff --git a/src/app/core/core.module.ts b/src/app/core/core.module.ts index 7273996401..879ba76c7d 100644 --- a/src/app/core/core.module.ts +++ b/src/app/core/core.module.ts @@ -168,7 +168,7 @@ import { OpenaireSuggestionSource } from './openaire/reciter-suggestions/models/ import { ResearcherProfileService } from './profile/researcher-profile.service'; import { ProfileClaimService } from '../profile-page/profile-claim/profile-claim.service'; import { ResearcherProfile } from './profile/model/researcher-profile.model'; -import {SubmissionAccessesModel} from "./config/models/config-submission-accesses.model"; +import {SubmissionAccessesModel} from './config/models/config-submission-accesses.model'; /** * When not in production, endpoint responses can be mocked for testing purposes diff --git a/src/app/core/openaire/reciter-suggestions/models/openaire-suggestion-source.model.ts b/src/app/core/openaire/reciter-suggestions/models/openaire-suggestion-source.model.ts index d71b49b913..00f5f11936 100644 --- a/src/app/core/openaire/reciter-suggestions/models/openaire-suggestion-source.model.ts +++ b/src/app/core/openaire/reciter-suggestions/models/openaire-suggestion-source.model.ts @@ -5,7 +5,7 @@ import { excludeFromEquals } from '../../../utilities/equals.decorators'; import { ResourceType } from '../../../shared/resource-type'; import { HALLink } from '../../../shared/hal-link.model'; import { typedObject } from '../../../cache/builders/build-decorators'; -import {CacheableObject} from "../../../cache/cacheable-object.model"; +import {CacheableObject} from '../../../cache/cacheable-object.model'; /** * The interface representing the Suggestion Source model diff --git a/src/app/core/openaire/reciter-suggestions/models/openaire-suggestion-target.model.ts b/src/app/core/openaire/reciter-suggestions/models/openaire-suggestion-target.model.ts index 06f85ea5b3..96a43c9654 100644 --- a/src/app/core/openaire/reciter-suggestions/models/openaire-suggestion-target.model.ts +++ b/src/app/core/openaire/reciter-suggestions/models/openaire-suggestion-target.model.ts @@ -5,7 +5,7 @@ import { excludeFromEquals } from '../../../utilities/equals.decorators'; import { ResourceType } from '../../../shared/resource-type'; import { HALLink } from '../../../shared/hal-link.model'; import { typedObject } from '../../../cache/builders/build-decorators'; -import {CacheableObject} from "../../../cache/cacheable-object.model"; +import {CacheableObject} from '../../../cache/cacheable-object.model'; /** * The interface representing the Suggestion Target model diff --git a/src/app/core/openaire/reciter-suggestions/models/openaire-suggestion.model.ts b/src/app/core/openaire/reciter-suggestions/models/openaire-suggestion.model.ts index 2d28ccf9bc..0f84072c6b 100644 --- a/src/app/core/openaire/reciter-suggestions/models/openaire-suggestion.model.ts +++ b/src/app/core/openaire/reciter-suggestions/models/openaire-suggestion.model.ts @@ -6,7 +6,7 @@ import { ResourceType } from '../../../shared/resource-type'; import { HALLink } from '../../../shared/hal-link.model'; import { typedObject } from '../../../cache/builders/build-decorators'; import { MetadataMap, MetadataMapSerializer } from '../../../shared/metadata.models'; -import {CacheableObject} from "../../../cache/cacheable-object.model"; +import {CacheableObject} from '../../../cache/cacheable-object.model'; export interface SuggestionEvidences { [sectionId: string]: { diff --git a/src/app/core/openaire/reciter-suggestions/openaire-suggestions-data.service.ts b/src/app/core/openaire/reciter-suggestions/openaire-suggestions-data.service.ts index 7454caa1d9..3c1d04c040 100644 --- a/src/app/core/openaire/reciter-suggestions/openaire-suggestions-data.service.ts +++ b/src/app/core/openaire/reciter-suggestions/openaire-suggestions-data.service.ts @@ -1,3 +1,4 @@ +/* eslint-disable max-classes-per-file */ import { Injectable } from '@angular/core'; import { HttpClient } from '@angular/common/http'; import { Store } from '@ngrx/store'; @@ -22,8 +23,8 @@ import { OpenaireSuggestionTarget } from './models/openaire-suggestion-target.mo import { OpenaireSuggestion } from './models/openaire-suggestion.model'; import { RequestParam } from '../../cache/models/request-param.model'; import { NoContent } from '../../shared/NoContent.model'; -import {CoreState} from "../../core-state.model"; -import {FindListOptions} from "../../data/find-list-options.model"; +import {CoreState} from '../../core-state.model'; +import {FindListOptions} from '../../data/find-list-options.model'; /* tslint:disable:max-classes-per-file */ diff --git a/src/app/core/submission/workspaceitem-data.service.ts b/src/app/core/submission/workspaceitem-data.service.ts index a4dbaab6ca..6c0e909bb4 100644 --- a/src/app/core/submission/workspaceitem-data.service.ts +++ b/src/app/core/submission/workspaceitem-data.service.ts @@ -17,10 +17,10 @@ import { FollowLinkConfig } from '../../shared/utils/follow-link-config.model'; import { RequestParam } from '../cache/models/request-param.model'; import { CoreState } from '../core-state.model'; import { FindListOptions } from '../data/find-list-options.model'; -import {HttpOptions} from "../dspace-rest/dspace-rest.service"; -import {find, map} from "rxjs/operators"; -import {PostRequest} from "../data/request.models"; -import {hasValue} from "../../shared/empty.util"; +import {HttpOptions} from '../dspace-rest/dspace-rest.service'; +import {find, map} from 'rxjs/operators'; +import {PostRequest} from '../data/request.models'; +import {hasValue} from '../../shared/empty.util'; /** * A service that provides methods to make REST requests with workspaceitems endpoint. diff --git a/src/app/openaire/openaire.module.ts b/src/app/openaire/openaire.module.ts index ace4622190..8ae52b27f4 100644 --- a/src/app/openaire/openaire.module.ts +++ b/src/app/openaire/openaire.module.ts @@ -18,7 +18,7 @@ import { SuggestionsPopupComponent } from './reciter-suggestions/suggestions-pop import { SuggestionsNotificationComponent } from './reciter-suggestions/suggestions-notification/suggestions-notification.component'; import { TranslateModule } from '@ngx-translate/core'; import { SearchModule } from '../shared/search/search.module'; -import {openaireEffects} from "./openaire.effects"; +import {openaireEffects} from './openaire.effects'; const MODULES = [ CommonModule, diff --git a/src/app/openaire/reciter-suggestions/selectors.ts b/src/app/openaire/reciter-suggestions/selectors.ts index 292e63472a..cfbb36d4c2 100644 --- a/src/app/openaire/reciter-suggestions/selectors.ts +++ b/src/app/openaire/reciter-suggestions/selectors.ts @@ -2,7 +2,7 @@ import {createFeatureSelector, createSelector, MemoizedSelector} from '@ngrx/sto import { openaireSelector, OpenaireState } from '../openaire.reducer'; import { OpenaireSuggestionTarget } from '../../core/openaire/reciter-suggestions/models/openaire-suggestion-target.model'; import { SuggestionTargetState } from './suggestion-targets/suggestion-targets.reducer'; -import {subStateSelector} from "../../submission/selectors"; +import {subStateSelector} from '../../submission/selectors'; /** * Returns the Reciter Suggestion Target state. diff --git a/src/app/openaire/reciter-suggestions/suggestion-targets/suggestion-targets.actions.ts b/src/app/openaire/reciter-suggestions/suggestion-targets/suggestion-targets.actions.ts index 6c44d40b91..33dfb1474b 100644 --- a/src/app/openaire/reciter-suggestions/suggestion-targets/suggestion-targets.actions.ts +++ b/src/app/openaire/reciter-suggestions/suggestion-targets/suggestion-targets.actions.ts @@ -1,3 +1,4 @@ +/* eslint-disable max-classes-per-file */ import { Action } from '@ngrx/store'; import { type } from '../../../shared/ngrx/type'; import { OpenaireSuggestionTarget } from '../../../core/openaire/reciter-suggestions/models/openaire-suggestion-target.model'; diff --git a/src/app/openaire/reciter-suggestions/suggestion-targets/suggestion-targets.effects.ts b/src/app/openaire/reciter-suggestions/suggestion-targets/suggestion-targets.effects.ts index 9a007fab21..29672ad49b 100644 --- a/src/app/openaire/reciter-suggestions/suggestion-targets/suggestion-targets.effects.ts +++ b/src/app/openaire/reciter-suggestions/suggestion-targets/suggestion-targets.effects.ts @@ -78,10 +78,10 @@ export class SuggestionTargetsEffects { @Effect() refreshUserTargets$ = this.actions$.pipe( ofType(SuggestionTargetActionTypes.REFRESH_USER_SUGGESTIONS), switchMap((action: RefreshUserSuggestionsAction) => { - return this.store$.select((state: any) => state.core.auth.user) + return this.store$.select((state: any) => state.core.auth.userId) .pipe( - switchMap((user: EPerson) => { - return this.suggestionsService.retrieveCurrentUserSuggestions(user.uuid) + switchMap((userId: string) => { + return this.suggestionsService.retrieveCurrentUserSuggestions(userId) .pipe( map((suggestionTargets: OpenaireSuggestionTarget[]) => new AddUserSuggestionsAction(suggestionTargets)), catchError((errors) => of(errors)) diff --git a/src/app/openaire/reciter-suggestions/suggestions.service.ts b/src/app/openaire/reciter-suggestions/suggestions.service.ts index 5908c8c6bf..67b496b903 100644 --- a/src/app/openaire/reciter-suggestions/suggestions.service.ts +++ b/src/app/openaire/reciter-suggestions/suggestions.service.ts @@ -25,8 +25,8 @@ import { TranslateService } from '@ngx-translate/core'; import { NoContent } from '../../core/shared/NoContent.model'; import { environment } from '../../../environments/environment'; import { WorkspaceItem } from '../../core/submission/models/workspaceitem.model'; -import {FindListOptions} from "../../core/data/find-list-options.model"; -import {SuggestionConfig} from "../../../config/layout-config.interfaces"; +import {FindListOptions} from '../../core/data/find-list-options.model'; +import {SuggestionConfig} from '../../../config/layout-config.interfaces'; export interface SuggestionBulkResult { success: number; diff --git a/src/app/shared/dso-selector/modal-wrappers/dso-selector-modal-wrapper.component.ts b/src/app/shared/dso-selector/modal-wrappers/dso-selector-modal-wrapper.component.ts index ca8343cfad..3b3ef59ae5 100644 --- a/src/app/shared/dso-selector/modal-wrappers/dso-selector-modal-wrapper.component.ts +++ b/src/app/shared/dso-selector/modal-wrappers/dso-selector-modal-wrapper.component.ts @@ -1,4 +1,4 @@ -import { Component, Input, OnInit } from '@angular/core'; +import {Component, EventEmitter, Input, OnInit, Output} from '@angular/core'; import { ActivatedRoute, ActivatedRouteSnapshot } from '@angular/router'; import { DSpaceObject } from '../../../core/shared/dspace-object.model'; import { RemoteData } from '../../../core/data/remote-data'; @@ -21,11 +21,22 @@ export enum SelectorActionType { template: '' }) export abstract class DSOSelectorModalWrapperComponent implements OnInit { + + /** + * The discovery configuration. + */ + @Input() configuration = 'default'; + /** * The current page's DSO */ @Input() dsoRD: RemoteData; + /** + * Representing if component should emit value of selected entries or navigate + */ + @Input() emitOnly = false; + /** * Optional header to display above the selection list * Supports i18n keys @@ -47,6 +58,11 @@ export abstract class DSOSelectorModalWrapperComponent implements OnInit { */ action: SelectorActionType; + /** + * Event emitted when a DSO entry is selected if emitOnly is set to true + */ + @Output() select: EventEmitter = new EventEmitter(); + constructor(protected activeModal: NgbActiveModal, protected route: ActivatedRoute) { } @@ -85,7 +101,11 @@ export abstract class DSOSelectorModalWrapperComponent implements OnInit { */ selectObject(dso: DSpaceObject) { this.close(); - this.navigate(dso); + if (this.emitOnly) { + this.select.emit(dso); + } else { + this.navigate(dso); + } } /** diff --git a/src/app/shared/mocks/openaire.mock.ts b/src/app/shared/mocks/openaire.mock.ts index 95ea871727..d6c50510cd 100644 --- a/src/app/shared/mocks/openaire.mock.ts +++ b/src/app/shared/mocks/openaire.mock.ts @@ -1,17 +1,5 @@ -import { of as observableOf } from 'rxjs'; -import { ResourceType } from '../../core/shared/resource-type'; -import { OpenaireBrokerTopicObject } from '../../core/openaire/broker/models/openaire-broker-topic.model'; -import { OpenaireBrokerEventObject } from '../../core/openaire/broker/models/openaire-broker-event.model'; -import { OpenaireBrokerTopicRestService } from '../../core/openaire/broker/topics/openaire-broker-topic-rest.service'; -import { OpenaireBrokerEventRestService } from '../../core/openaire/broker/events/openaire-broker-event-rest.service'; import { DSpaceObject } from '../../core/shared/dspace-object.model'; -import { OpenaireStateService } from '../../openaire/openaire-state.service'; import { Item } from '../../core/shared/item.model'; -import { - createNoContentRemoteDataObject$, - createSuccessfulRemoteDataObject, - createSuccessfulRemoteDataObject$ -} from '../remote-data.utils'; import { SearchResult } from '../search/models/search-result.model'; import { SuggestionsService } from '../../openaire/reciter-suggestions/suggestions.service'; @@ -1330,414 +1318,6 @@ export const OpenaireMockDspaceObject: SearchResult = Object.assig } ); -// Topics -// ------------------------------------------------------------------------------- - -export const openaireBrokerTopicObjectMorePid: OpenaireBrokerTopicObject = { - type: new ResourceType('nbtopic'), - id: 'ENRICH!MORE!PID', - name: 'ENRICH/MORE/PID', - lastEvent: '2020/10/09 10:11 UTC', - totalEvents: 33, - _links: { - self: { - href: 'https://rest.api/rest/api/integration/nbtopics/ENRICH!MORE!PID' - } - } -}; - -export const openaireBrokerTopicObjectMoreAbstract: OpenaireBrokerTopicObject = { - type: new ResourceType('nbtopic'), - id: 'ENRICH!MORE!ABSTRACT', - name: 'ENRICH/MORE/ABSTRACT', - lastEvent: '2020/09/08 21:14 UTC', - totalEvents: 5, - _links: { - self: { - href: 'https://rest.api/rest/api/integration/nbtopics/ENRICH!MORE!ABSTRACT' - } - } -}; - -export const openaireBrokerTopicObjectMissingPid: OpenaireBrokerTopicObject = { - type: new ResourceType('nbtopic'), - id: 'ENRICH!MISSING!PID', - name: 'ENRICH/MISSING/PID', - lastEvent: '2020/10/01 07:36 UTC', - totalEvents: 4, - _links: { - self: { - href: 'https://rest.api/rest/api/integration/nbtopics/ENRICH!MISSING!PID' - } - } -}; - -export const openaireBrokerTopicObjectMissingAbstract: OpenaireBrokerTopicObject = { - type: new ResourceType('nbtopic'), - id: 'ENRICH!MISSING!ABSTRACT', - name: 'ENRICH/MISSING/ABSTRACT', - lastEvent: '2020/10/08 16:14 UTC', - totalEvents: 71, - _links: { - self: { - href: 'https://rest.api/rest/api/integration/nbtopics/ENRICH!MISSING!ABSTRACT' - } - } -}; - -export const openaireBrokerTopicObjectMissingAcm: OpenaireBrokerTopicObject = { - type: new ResourceType('nbtopic'), - id: 'ENRICH!MISSING!SUBJECT!ACM', - name: 'ENRICH/MISSING/SUBJECT/ACM', - lastEvent: '2020/09/21 17:51 UTC', - totalEvents: 18, - _links: { - self: { - href: 'https://rest.api/rest/api/integration/nbtopics/ENRICH!MISSING!SUBJECT!ACM' - } - } -}; - -export const openaireBrokerTopicObjectMissingProject: OpenaireBrokerTopicObject = { - type: new ResourceType('nbtopic'), - id: 'ENRICH!MISSING!PROJECT', - name: 'ENRICH/MISSING/PROJECT', - lastEvent: '2020/09/17 10:28 UTC', - totalEvents: 6, - _links: { - self: { - href: 'https://rest.api/rest/api/integration/nbtopics/ENRICH!MISSING!PROJECT' - } - } -}; - -// Events -// ------------------------------------------------------------------------------- - -export const openaireBrokerEventObjectMissingPid: OpenaireBrokerEventObject = { - id: '123e4567-e89b-12d3-a456-426614174001', - uuid: '123e4567-e89b-12d3-a456-426614174001', - type: new ResourceType('nbevent'), - originalId: 'oai:www.openstarts.units.it:10077/21486', - title: 'Index nominum et rerum', - trust: 0.375, - eventDate: '2020/10/09 10:11 UTC', - status: 'PENDING', - message: { - type: 'doi', - value: '10.18848/1447-9494/cgp/v15i09/45934', - abstract: null, - openaireId: null, - acronym: null, - code: null, - funder: null, - fundingProgram: null, - jurisdiction: null, - title: null - }, - _links: { - self: { - href: 'https://rest.api/rest/api/integration/nbevents/123e4567-e89b-12d3-a456-426614174001', - }, - target: { - href: 'https://rest.api/rest/api/integration/nbevents/123e4567-e89b-12d3-a456-426614174001/target' - }, - related: { - href: 'https://rest.api/rest/api/integration/nbevents/123e4567-e89b-12d3-a456-426614174001/related' - } - }, - target: observableOf(createSuccessfulRemoteDataObject(ItemMockPid1)), - related: observableOf(createSuccessfulRemoteDataObject(ItemMockPid10)) -}; - -export const openaireBrokerEventObjectMissingPid2: OpenaireBrokerEventObject = { - id: '123e4567-e89b-12d3-a456-426614174004', - uuid: '123e4567-e89b-12d3-a456-426614174004', - type: new ResourceType('openaireBrokerEvent'), - originalId: 'oai:www.openstarts.units.it:10077/21486', - title: 'UNA NUOVA RILETTURA DELL\u0027 ARISTOTELE DI FRANZ BRENTANO ALLA LUCE DI ALCUNI INEDITI', - trust: 1.0, - eventDate: '2020/10/09 10:11 UTC', - status: 'PENDING', - message: { - type: 'urn', - value: 'http://thesis2.sba.units.it/store/handle/item/12238', - abstract: null, - openaireId: null, - acronym: null, - code: null, - funder: null, - fundingProgram: null, - jurisdiction: null, - title: null - }, - _links: { - self: { - href: 'https://rest.api/rest/api/integration/nbevents/123e4567-e89b-12d3-a456-426614174004' - }, - target: { - href: 'https://rest.api/rest/api/integration/nbevents/123e4567-e89b-12d3-a456-426614174004/target' - }, - related: { - href: 'https://rest.api/rest/api/integration/nbevents/123e4567-e89b-12d3-a456-426614174004/related' - } - }, - target: observableOf(createSuccessfulRemoteDataObject(ItemMockPid2)), - related: observableOf(createSuccessfulRemoteDataObject(ItemMockPid10)) -}; - -export const openaireBrokerEventObjectMissingPid3: OpenaireBrokerEventObject = { - id: '123e4567-e89b-12d3-a456-426614174005', - uuid: '123e4567-e89b-12d3-a456-426614174005', - type: new ResourceType('openaireBrokerEvent'), - originalId: 'oai:www.openstarts.units.it:10077/554', - title: 'Sustainable development', - trust: 0.375, - eventDate: '2020/10/09 10:11 UTC', - status: 'PENDING', - message: { - type: 'doi', - value: '10.4324/9780203408889', - abstract: null, - openaireId: null, - acronym: null, - code: null, - funder: null, - fundingProgram: null, - jurisdiction: null, - title: null - }, - _links: { - self: { - href: 'https://rest.api/rest/api/integration/nbevents/123e4567-e89b-12d3-a456-426614174005' - }, - target: { - href: 'https://rest.api/rest/api/integration/nbevents/123e4567-e89b-12d3-a456-426614174005/target' - }, - related: { - href: 'https://rest.api/rest/api/integration/nbevents/123e4567-e89b-12d3-a456-426614174005/related' - } - }, - target: observableOf(createSuccessfulRemoteDataObject(ItemMockPid3)), - related: observableOf(createSuccessfulRemoteDataObject(ItemMockPid10)) -}; - -export const openaireBrokerEventObjectMissingPid4: OpenaireBrokerEventObject = { - id: '123e4567-e89b-12d3-a456-426614174006', - uuid: '123e4567-e89b-12d3-a456-426614174006', - type: new ResourceType('openaireBrokerEvent'), - originalId: 'oai:www.openstarts.units.it:10077/10787', - title: 'Reply to Critics', - trust: 1.0, - eventDate: '2020/10/09 10:11 UTC', - status: 'PENDING', - message: { - type: 'doi', - value: '10.1080/13698230.2018.1430104', - abstract: null, - openaireId: null, - acronym: null, - code: null, - funder: null, - fundingProgram: null, - jurisdiction: null, - title: null - }, - _links: { - self: { - href: 'https://rest.api/rest/api/integration/nbevents/123e4567-e89b-12d3-a456-426614174006' - }, - target: { - href: 'https://rest.api/rest/api/integration/nbevents/123e4567-e89b-12d3-a456-426614174006/target' - }, - related: { - href: 'https://rest.api/rest/api/integration/nbevents/123e4567-e89b-12d3-a456-426614174006/related' - } - }, - target: observableOf(createSuccessfulRemoteDataObject(ItemMockPid4)), - related: observableOf(createSuccessfulRemoteDataObject(ItemMockPid10)) -}; - -export const openaireBrokerEventObjectMissingPid5: OpenaireBrokerEventObject = { - id: '123e4567-e89b-12d3-a456-426614174007', - uuid: '123e4567-e89b-12d3-a456-426614174007', - type: new ResourceType('openaireBrokerEvent'), - originalId: 'oai:www.openstarts.units.it:10077/11339', - title: 'PROGETTAZIONE, SINTESI E VALUTAZIONE DELL\u0027ATTIVITA\u0027 ANTIMICOBATTERICA ED ANTIFUNGINA DI NUOVI DERIVATI ETEROCICLICI', - trust: 0.375, - eventDate: '2020/10/09 10:11 UTC', - status: 'PENDING', - message: { - type: 'urn', - value: 'http://thesis2.sba.units.it/store/handle/item/12477', - abstract: null, - openaireId: null, - acronym: null, - code: null, - funder: null, - fundingProgram: null, - jurisdiction: null, - title: null - }, - _links: { - self: { - href: 'https://rest.api/rest/api/integration/nbevents/123e4567-e89b-12d3-a456-426614174007' - }, - target: { - href: 'https://rest.api/rest/api/integration/nbevents/123e4567-e89b-12d3-a456-426614174007/target' - }, - related: { - href: 'https://rest.api/rest/api/integration/nbevents/123e4567-e89b-12d3-a456-426614174007/related' - } - }, - target: observableOf(createSuccessfulRemoteDataObject(ItemMockPid5)), - related: observableOf(createSuccessfulRemoteDataObject(ItemMockPid10)) -}; - -export const openaireBrokerEventObjectMissingPid6: OpenaireBrokerEventObject = { - id: '123e4567-e89b-12d3-a456-426614174008', - uuid: '123e4567-e89b-12d3-a456-426614174008', - type: new ResourceType('openaireBrokerEvent'), - originalId: 'oai:www.openstarts.units.it:10077/29860', - title: 'Donald Davidson', - trust: 0.375, - eventDate: '2020/10/09 10:11 UTC', - status: 'PENDING', - message: { - type: 'doi', - value: '10.1111/j.1475-4975.2004.00098.x', - abstract: null, - openaireId: null, - acronym: null, - code: null, - funder: null, - fundingProgram: null, - jurisdiction: null, - title: null - }, - _links: { - self: { - href: 'https://rest.api/rest/api/integration/nbevents/123e4567-e89b-12d3-a456-426614174008' - }, - target: { - href: 'https://rest.api/rest/api/integration/nbevents/123e4567-e89b-12d3-a456-426614174008/target' - }, - related: { - href: 'https://rest.api/rest/api/integration/nbevents/123e4567-e89b-12d3-a456-426614174008/related' - } - }, - target: observableOf(createSuccessfulRemoteDataObject(ItemMockPid6)), - related: observableOf(createSuccessfulRemoteDataObject(ItemMockPid10)) -}; - -export const openaireBrokerEventObjectMissingAbstract: OpenaireBrokerEventObject = { - id: '123e4567-e89b-12d3-a456-426614174009', - uuid: '123e4567-e89b-12d3-a456-426614174009', - type: new ResourceType('openaireBrokerEvent'), - originalId: 'oai:www.openstarts.units.it:10077/21110', - title: 'Missing abstract article', - trust: 0.751, - eventDate: '2020/10/09 10:11 UTC', - status: 'PENDING', - message: { - type: null, - value: null, - abstract: 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla scelerisque vestibulum tellus sed lacinia. Aenean vitae sapien a quam congue ultrices. Sed vehicula sollicitudin ligula, vitae lacinia velit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla scelerisque vestibulum tellus sed lacinia. Aenean vitae sapien a quam congue ultrices. Sed vehicula sollicitudin ligula, vitae lacinia velit.', - openaireId: null, - acronym: null, - code: null, - funder: null, - fundingProgram: null, - jurisdiction: null, - title: null - }, - _links: { - self: { - href: 'https://rest.api/rest/api/integration/nbevents/123e4567-e89b-12d3-a456-426614174009' - }, - target: { - href: 'https://rest.api/rest/api/integration/nbevents/123e4567-e89b-12d3-a456-426614174009/target' - }, - related: { - href: 'https://rest.api/rest/api/integration/nbevents/123e4567-e89b-12d3-a456-426614174009/related' - } - }, - target: observableOf(createSuccessfulRemoteDataObject(ItemMockPid7)), - related: observableOf(createSuccessfulRemoteDataObject(ItemMockPid10)) -}; - -export const openaireBrokerEventObjectMissingProjectFound: OpenaireBrokerEventObject = { - id: '123e4567-e89b-12d3-a456-426614174002', - uuid: '123e4567-e89b-12d3-a456-426614174002', - type: new ResourceType('openaireBrokerEvent'), - originalId: 'oai:www.openstarts.units.it:10077/21838', - title: 'Egypt, crossroad of translations and literary interweavings (3rd-6th centuries). A reconsideration of earlier Coptic literature', - trust: 1.0, - eventDate: '2020/10/09 10:11 UTC', - status: 'PENDING', - message: { - type: null, - value: null, - abstract: null, - openaireId: null, - acronym: 'PAThs', - code: '687567', - funder: 'EC', - fundingProgram: 'H2020', - jurisdiction: 'EU', - title: 'Tracking Papyrus and Parchment Paths: An Archaeological Atlas of Coptic Literature.\nLiterary Texts in their Geographical Context: Production, Copying, Usage, Dissemination and Storage' - }, - _links: { - self: { - href: 'https://rest.api/rest/api/integration/nbevents/123e4567-e89b-12d3-a456-426614174002' - }, - target: { - href: 'https://rest.api/rest/api/integration/nbevents/123e4567-e89b-12d3-a456-426614174002/target' - }, - related: { - href: 'https://rest.api/rest/api/integration/nbevents/123e4567-e89b-12d3-a456-426614174002/related' - } - }, - target: createSuccessfulRemoteDataObject$(ItemMockPid8), - related: createSuccessfulRemoteDataObject$(ItemMockPid10) -}; - -export const openaireBrokerEventObjectMissingProjectNotFound: OpenaireBrokerEventObject = { - id: '123e4567-e89b-12d3-a456-426614174003', - uuid: '123e4567-e89b-12d3-a456-426614174003', - type: new ResourceType('openaireBrokerEvent'), - originalId: 'oai:www.openstarts.units.it:10077/21838', - title: 'Morocco, crossroad of translations and literary interweavings (3rd-6th centuries). A reconsideration of earlier Coptic literature', - trust: 1.0, - eventDate: '2020/10/09 10:11 UTC', - status: 'PENDING', - message: { - type: null, - value: null, - abstract: null, - openaireId: null, - acronym: 'PAThs', - code: '687567B', - funder: 'EC', - fundingProgram: 'H2021', - jurisdiction: 'EU', - title: 'Tracking Unknown Papyrus and Parchment Paths: An Archaeological Atlas of Coptic Literature.\nLiterary Texts in their Geographical Context: Production, Copying, Usage, Dissemination and Storage' - }, - _links: { - self: { - href: 'https://rest.api/rest/api/integration/nbevents/123e4567-e89b-12d3-a456-426614174003' - }, - target: { - href: 'https://rest.api/rest/api/integration/nbevents/123e4567-e89b-12d3-a456-426614174003/target' - }, - related: { - href: 'https://rest.api/rest/api/integration/nbevents/123e4567-e89b-12d3-a456-426614174003/related' - } - }, - target: createSuccessfulRemoteDataObject$(ItemMockPid9), - related: createNoContentRemoteDataObject$() -}; - // Classes // ------------------------------------------------------------------------------- @@ -1757,31 +1337,6 @@ export function getMockOpenaireStateService(): any { dispatchMarkUserSuggestionsAsVisitedAction: jasmine.createSpy('dispatchMarkUserSuggestionsAsVisitedAction') }); } - -/** - * Mock for [[OpenaireBrokerTopicRestService]] - */ -export function getMockOpenaireBrokerTopicRestService(): OpenaireBrokerTopicRestService { - return jasmine.createSpyObj('OpenaireBrokerTopicRestService', { - getTopics: jasmine.createSpy('getTopics'), - getTopic: jasmine.createSpy('getTopic'), - }); -} - -/** - * Mock for [[OpenaireBrokerEventRestService]] - */ -export function getMockOpenaireBrokerEventRestService(): OpenaireBrokerEventRestService { - return jasmine.createSpyObj('OpenaireBrokerEventRestService', { - getEventsByTopic: jasmine.createSpy('getEventsByTopic'), - getEvent: jasmine.createSpy('getEvent'), - patchEvent: jasmine.createSpy('patchEvent'), - boundProject: jasmine.createSpy('boundProject'), - removeProject: jasmine.createSpy('removeProject'), - clearFindByTopicRequests: jasmine.createSpy('.clearFindByTopicRequests') - }); -} - /** * Mock for [[OpenaireBrokerEventRestService]] */ diff --git a/src/app/suggestions-page/suggestions-page.component.ts b/src/app/suggestions-page/suggestions-page.component.ts index 850a30da22..3d6ced5ef5 100644 --- a/src/app/suggestions-page/suggestions-page.component.ts +++ b/src/app/suggestions-page/suggestions-page.component.ts @@ -20,8 +20,8 @@ import { SuggestionTargetsStateService } from '../openaire/reciter-suggestions/s import { WorkspaceitemDataService } from '../core/submission/workspaceitem-data.service'; import { PaginationService } from '../core/pagination/pagination.service'; import { WorkspaceItem } from '../core/submission/models/workspaceitem.model'; -import {FindListOptions} from "../core/data/find-list-options.model"; -import {redirectOn4xx} from "../core/shared/authorized.operators"; +import {FindListOptions} from '../core/data/find-list-options.model'; +import {redirectOn4xx} from '../core/shared/authorized.operators'; @Component({ selector: 'ds-suggestion-page', diff --git a/src/assets/i18n/en.json5 b/src/assets/i18n/en.json5 index fbc04033d6..f79cf799e5 100644 --- a/src/assets/i18n/en.json5 +++ b/src/assets/i18n/en.json5 @@ -3033,6 +3033,7 @@ "reciter.suggestion.totalScore": "Total Score", + "reciter.suggestion.type.oaire": "OpenAIRE", "register-email.title": "New user registration", diff --git a/src/config/app-config.interface.ts b/src/config/app-config.interface.ts index 6446e7f127..fbd84fae84 100644 --- a/src/config/app-config.interface.ts +++ b/src/config/app-config.interface.ts @@ -14,7 +14,7 @@ import { AuthConfig } from './auth-config.interfaces'; import { UIServerConfig } from './ui-server-config.interface'; import { MediaViewerConfig } from './media-viewer-config.interface'; import { BrowseByConfig } from './browse-by-config.interface'; -import {SuggestionConfig} from "./layout-config.interfaces"; +import {SuggestionConfig} from './layout-config.interfaces'; interface AppConfig extends Config { ui: UIServerConfig; diff --git a/src/config/default-app-config.ts b/src/config/default-app-config.ts index aea29fc819..9def4849f5 100644 --- a/src/config/default-app-config.ts +++ b/src/config/default-app-config.ts @@ -14,7 +14,7 @@ import { ServerConfig } from './server-config.interface'; import { SubmissionConfig } from './submission-config.interface'; import { ThemeConfig } from './theme.model'; import { UIServerConfig } from './ui-server-config.interface'; -import {SuggestionConfig} from "./layout-config.interfaces"; +import {SuggestionConfig} from './layout-config.interfaces'; export class DefaultAppConfig implements AppConfig { production = false; diff --git a/src/environments/environment.test.ts b/src/environments/environment.test.ts index 7c24ef8f05..6bf3a9ab8f 100644 --- a/src/environments/environment.test.ts +++ b/src/environments/environment.test.ts @@ -2,6 +2,7 @@ import { BuildConfig } from 'src/config/build-config.interface'; import { RestRequestMethod } from '../app/core/data/rest-request-method'; import { NotificationAnimationsType } from '../app/shared/notifications/models/notification-animations-type'; +import {SuggestionConfig} from '../config/layout-config.interfaces'; export const environment: BuildConfig = { production: false, @@ -203,6 +204,13 @@ export const environment: BuildConfig = { undoTimeout: 10000 // 10 seconds } }, + suggestion: [ + // { + // // Use this configuration to map a suggestion import to a specific collection based on the suggestion type. + // source: 'suggestionSource', + // collectionId: 'collectionUUID' + // } + ], themes: [ { name: 'full-item-page-theme', From d5c1b11d77a67e29e687f94d529764b2bbb410b5 Mon Sep 17 00:00:00 2001 From: Luca Giamminonni Date: Wed, 6 Jul 2022 17:04:11 +0200 Subject: [PATCH 010/409] [CST-5337] Replace Notifications broker with Quality assurance --- ...ications-broker-events-page.component.html | 1 - ...tions-broker-events-page.component.spec.ts | 26 --- ...ifications-broker-events-page.component.ts | 9 - ...ications-broker-source-page.component.html | 1 - ...tions-broker-source-page.component.spec.ts | 27 --- ...ifications-broker-source-page.component.ts | 7 - ...ications-broker-topics-page.component.html | 1 - ...tions-broker-topics-page.component.spec.ts | 26 --- ...ifications-broker-topics-page.component.ts | 9 - .../admin-notifications-routing-paths.ts | 6 +- .../admin-notifications-routing.module.ts | 40 ++--- .../admin-notifications.module.ts | 12 +- ...ality-assurance-events-page.component.html | 1 + ...ty-assurance-events-page.component.spec.ts | 26 +++ ...quality-assurance-events-page.component.ts | 9 + ...quality-assurance-events-page.resolver.ts} | 8 +- ...quality-assurance-source-data.reslover.ts} | 18 +- ...assurance-source-page-resolver.service.ts} | 8 +- ...ality-assurance-source-page.component.html | 1 + ...ty-assurance-source-page.component.spec.ts | 27 +++ ...quality-assurance-source-page.component.ts | 7 + ...assurance-topics-page-resolver.service.ts} | 8 +- ...ality-assurance-topics-page.component.html | 1 + ...ty-assurance-topics-page.component.spec.ts | 26 +++ ...quality-assurance-topics-page.component.ts | 9 + src/app/core/core.module.ts | 12 +- ...lity-assurance-event-rest.service.spec.ts} | 56 +++--- .../quality-assurance-event-rest.service.ts} | 60 +++---- ...y-assurance-event-object.resource-type.ts} | 4 +- .../models/quality-assurance-event.model.ts} | 10 +- ...-assurance-source-object.resource-type.ts} | 4 +- .../models/quality-assurance-source.model.ts} | 12 +- ...y-assurance-topic-object.resource-type.ts} | 4 +- .../models/quality-assurance-topic.model.ts} | 14 +- ...ity-assurance-source-rest.service.spec.ts} | 28 +-- .../quality-assurance-source-rest.service.ts} | 42 ++--- ...lity-assurance-topic-rest.service.spec.ts} | 28 +-- .../quality-assurance-topic-rest.service.ts} | 42 ++--- .../notifications-broker-source.reducer.ts | 72 -------- .../notifications-broker-source.service.ts | 55 ------ .../notifications-broker-topics.reducer.ts | 72 -------- .../notifications-state.service.spec.ts | 160 +++++++++--------- .../notifications-state.service.ts | 148 ++++++++-------- .../notifications/notifications.effects.ts | 8 +- src/app/notifications/notifications.module.ts | 34 ++-- .../notifications/notifications.reducer.ts | 12 +- .../quality-assurance-events.component.html} | 6 +- ...uality-assurance-events.component.spec.ts} | 110 ++++++------ .../quality-assurance-events.component.ts} | 118 ++++++------- .../quality-assurance-events.scomponent.scss} | 0 .../project-entry-import-modal.component.html | 0 .../project-entry-import-modal.component.scss | 0 ...oject-entry-import-modal.component.spec.ts | 10 +- .../project-entry-import-modal.component.ts | 18 +- .../quality-assurance-source.actions.ts} | 30 ++-- .../quality-assurance-source.component.html} | 8 +- .../quality-assurance-source.component.scss} | 0 ...uality-assurance-source.component.spec.ts} | 56 +++--- .../quality-assurance-source.component.ts} | 46 ++--- .../quality-assurance-source.effects.ts} | 36 ++-- .../quality-assurance-source.reducer.spec.ts} | 30 ++-- .../quality-assurance-source.reducer.ts | 72 ++++++++ .../quality-assurance-source.service.spec.ts} | 34 ++-- .../quality-assurance-source.service.ts | 55 ++++++ .../quality-assurance-topics.actions.ts} | 30 ++-- .../quality-assurance-topics.component.html} | 2 +- .../quality-assurance-topics.component.scss} | 0 ...uality-assurance-topics.component.spec.ts} | 60 +++---- .../quality-assurance-topics.component.ts} | 54 +++--- .../quality-assurance-topics.effects.ts} | 36 ++-- .../quality-assurance-topics.reducer.spec.ts} | 30 ++-- .../quality-assurance-topics.reducer.ts | 72 ++++++++ .../quality-assurance-topics.service.spec.ts} | 34 ++-- .../quality-assurance-topics.service.ts} | 30 ++-- src/app/notifications/selectors.ts | 104 ++++++------ src/app/shared/mocks/notifications.mock.ts | 114 ++++++------- src/assets/i18n/en.json5 | 10 +- 77 files changed, 1198 insertions(+), 1198 deletions(-) delete mode 100644 src/app/admin/admin-notifications/admin-notifications-broker-events-page/admin-notifications-broker-events-page.component.html delete mode 100644 src/app/admin/admin-notifications/admin-notifications-broker-events-page/admin-notifications-broker-events-page.component.spec.ts delete mode 100644 src/app/admin/admin-notifications/admin-notifications-broker-events-page/admin-notifications-broker-events-page.component.ts delete mode 100644 src/app/admin/admin-notifications/admin-notifications-broker-source-page-component/admin-notifications-broker-source-page.component.html delete mode 100644 src/app/admin/admin-notifications/admin-notifications-broker-source-page-component/admin-notifications-broker-source-page.component.spec.ts delete mode 100644 src/app/admin/admin-notifications/admin-notifications-broker-source-page-component/admin-notifications-broker-source-page.component.ts delete mode 100644 src/app/admin/admin-notifications/admin-notifications-broker-topics-page/admin-notifications-broker-topics-page.component.html delete mode 100644 src/app/admin/admin-notifications/admin-notifications-broker-topics-page/admin-notifications-broker-topics-page.component.spec.ts delete mode 100644 src/app/admin/admin-notifications/admin-notifications-broker-topics-page/admin-notifications-broker-topics-page.component.ts create mode 100644 src/app/admin/admin-notifications/admin-quality-assurance-events-page/admin-quality-assurance-events-page.component.html create mode 100644 src/app/admin/admin-notifications/admin-quality-assurance-events-page/admin-quality-assurance-events-page.component.spec.ts create mode 100644 src/app/admin/admin-notifications/admin-quality-assurance-events-page/admin-quality-assurance-events-page.component.ts rename src/app/admin/admin-notifications/{admin-notifications-broker-events-page/admin-notifications-broker-events-page.resolver.ts => admin-quality-assurance-events-page/admin-quality-assurance-events-page.resolver.ts} (72%) rename src/app/admin/admin-notifications/{admin-notifications-broker-source-page-component/admin-notifications-broker-source-data.reslover.ts => admin-quality-assurance-source-page-component/admin-quality-assurance-source-data.reslover.ts} (61%) rename src/app/admin/admin-notifications/{admin-notifications-broker-topics-page/admin-notifications-broker-topics-page-resolver.service.ts => admin-quality-assurance-source-page-component/admin-quality-assurance-source-page-resolver.service.ts} (72%) create mode 100644 src/app/admin/admin-notifications/admin-quality-assurance-source-page-component/admin-quality-assurance-source-page.component.html create mode 100644 src/app/admin/admin-notifications/admin-quality-assurance-source-page-component/admin-quality-assurance-source-page.component.spec.ts create mode 100644 src/app/admin/admin-notifications/admin-quality-assurance-source-page-component/admin-quality-assurance-source-page.component.ts rename src/app/admin/admin-notifications/{admin-notifications-broker-source-page-component/admin-notifications-broker-source-page-resolver.service.ts => admin-quality-assurance-topics-page/admin-quality-assurance-topics-page-resolver.service.ts} (72%) create mode 100644 src/app/admin/admin-notifications/admin-quality-assurance-topics-page/admin-quality-assurance-topics-page.component.html create mode 100644 src/app/admin/admin-notifications/admin-quality-assurance-topics-page/admin-quality-assurance-topics-page.component.spec.ts create mode 100644 src/app/admin/admin-notifications/admin-quality-assurance-topics-page/admin-quality-assurance-topics-page.component.ts rename src/app/core/notifications/{broker/events/notifications-broker-event-rest.service.spec.ts => qa/events/quality-assurance-event-rest.service.spec.ts} (77%) rename src/app/core/notifications/{broker/events/notifications-broker-event-rest.service.ts => qa/events/quality-assurance-event-rest.service.ts} (71%) rename src/app/core/notifications/{broker/models/notifications-broker-topic-object.resource-type.ts => qa/models/quality-assurance-event-object.resource-type.ts} (53%) rename src/app/core/notifications/{broker/models/notifications-broker-event.model.ts => qa/models/quality-assurance-event.model.ts} (90%) rename src/app/core/notifications/{broker/models/notifications-broker-event-object.resource-type.ts => qa/models/quality-assurance-source-object.resource-type.ts} (53%) rename src/app/core/notifications/{broker/models/notifications-broker-source.model.ts => qa/models/quality-assurance-source.model.ts} (69%) rename src/app/core/notifications/{broker/models/notifications-broker-source-object.resource-type.ts => qa/models/quality-assurance-topic-object.resource-type.ts} (53%) rename src/app/core/notifications/{broker/models/notifications-broker-topic.model.ts => qa/models/quality-assurance-topic.model.ts} (68%) rename src/app/core/notifications/{broker/source/notifications-broker-source-rest.service.spec.ts => qa/source/quality-assurance-source-rest.service.spec.ts} (78%) rename src/app/core/notifications/{broker/source/notifications-broker-source-rest.service.ts => qa/source/quality-assurance-source-rest.service.ts} (72%) rename src/app/core/notifications/{broker/topics/notifications-broker-topic-rest.service.spec.ts => qa/topics/quality-assurance-topic-rest.service.spec.ts} (76%) rename src/app/core/notifications/{broker/topics/notifications-broker-topic-rest.service.ts => qa/topics/quality-assurance-topic-rest.service.ts} (73%) delete mode 100644 src/app/notifications/broker/source/notifications-broker-source.reducer.ts delete mode 100644 src/app/notifications/broker/source/notifications-broker-source.service.ts delete mode 100644 src/app/notifications/broker/topics/notifications-broker-topics.reducer.ts rename src/app/notifications/{broker/events/notifications-broker-events.component.html => qa/events/quality-assurance-events.component.html} (98%) rename src/app/notifications/{broker/events/notifications-broker-events.component.spec.ts => qa/events/quality-assurance-events.component.spec.ts} (66%) rename src/app/notifications/{broker/events/notifications-broker-events.component.ts => qa/events/quality-assurance-events.component.ts} (74%) rename src/app/notifications/{broker/events/notifications-broker-events.scomponent.scss => qa/events/quality-assurance-events.scomponent.scss} (100%) rename src/app/notifications/{broker => qa}/project-entry-import-modal/project-entry-import-modal.component.html (100%) rename src/app/notifications/{broker => qa}/project-entry-import-modal/project-entry-import-modal.component.scss (100%) rename src/app/notifications/{broker => qa}/project-entry-import-modal/project-entry-import-modal.component.spec.ts (95%) rename src/app/notifications/{broker => qa}/project-entry-import-modal/project-entry-import-modal.component.ts (94%) rename src/app/notifications/{broker/source/notifications-broker-source.actions.ts => qa/source/quality-assurance-source.actions.ts} (62%) rename src/app/notifications/{broker/source/notifications-broker-source.component.html => qa/source/quality-assurance-source.component.html} (97%) rename src/app/notifications/{broker/source/notifications-broker-source.component.scss => qa/source/quality-assurance-source.component.scss} (100%) rename src/app/notifications/{broker/source/notifications-broker-source.component.spec.ts => qa/source/quality-assurance-source.component.spec.ts} (60%) rename src/app/notifications/{broker/source/notifications-broker-source.component.ts => qa/source/quality-assurance-source.component.ts} (64%) rename src/app/notifications/{broker/source/notifications-broker-source.effects.ts => qa/source/quality-assurance-source.effects.ts} (59%) rename src/app/notifications/{broker/source/notifications-broker-source.reducer.spec.ts => qa/source/quality-assurance-source.reducer.spec.ts} (52%) create mode 100644 src/app/notifications/qa/source/quality-assurance-source.reducer.ts rename src/app/notifications/{broker/source/notifications-broker-source.service.spec.ts => qa/source/quality-assurance-source.service.spec.ts} (56%) create mode 100644 src/app/notifications/qa/source/quality-assurance-source.service.ts rename src/app/notifications/{broker/topics/notifications-broker-topics.actions.ts => qa/topics/quality-assurance-topics.actions.ts} (62%) rename src/app/notifications/{broker/topics/notifications-broker-topics.component.html => qa/topics/quality-assurance-topics.component.html} (97%) rename src/app/notifications/{broker/topics/notifications-broker-topics.component.scss => qa/topics/quality-assurance-topics.component.scss} (100%) rename src/app/notifications/{broker/topics/notifications-broker-topics.component.spec.ts => qa/topics/quality-assurance-topics.component.spec.ts} (59%) rename src/app/notifications/{broker/topics/notifications-broker-topics.component.ts => qa/topics/quality-assurance-topics.component.ts} (63%) rename src/app/notifications/{broker/topics/notifications-broker-topics.effects.ts => qa/topics/quality-assurance-topics.effects.ts} (59%) rename src/app/notifications/{broker/topics/notifications-broker-topics.reducer.spec.ts => qa/topics/quality-assurance-topics.reducer.spec.ts} (51%) create mode 100644 src/app/notifications/qa/topics/quality-assurance-topics.reducer.ts rename src/app/notifications/{broker/topics/notifications-broker-topics.service.spec.ts => qa/topics/quality-assurance-topics.service.spec.ts} (58%) rename src/app/notifications/{broker/topics/notifications-broker-topics.service.ts => qa/topics/quality-assurance-topics.service.ts} (51%) diff --git a/src/app/admin/admin-notifications/admin-notifications-broker-events-page/admin-notifications-broker-events-page.component.html b/src/app/admin/admin-notifications/admin-notifications-broker-events-page/admin-notifications-broker-events-page.component.html deleted file mode 100644 index 89ef1bfc88..0000000000 --- a/src/app/admin/admin-notifications/admin-notifications-broker-events-page/admin-notifications-broker-events-page.component.html +++ /dev/null @@ -1 +0,0 @@ - diff --git a/src/app/admin/admin-notifications/admin-notifications-broker-events-page/admin-notifications-broker-events-page.component.spec.ts b/src/app/admin/admin-notifications/admin-notifications-broker-events-page/admin-notifications-broker-events-page.component.spec.ts deleted file mode 100644 index 57a79e017b..0000000000 --- a/src/app/admin/admin-notifications/admin-notifications-broker-events-page/admin-notifications-broker-events-page.component.spec.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { NO_ERRORS_SCHEMA } from '@angular/core'; -import { async, ComponentFixture, TestBed } from '@angular/core/testing'; -import { AdminNotificationsBrokerEventsPageComponent } from './admin-notifications-broker-events-page.component'; - -describe('AdminNotificationsBrokerEventsPageComponent', () => { - let component: AdminNotificationsBrokerEventsPageComponent; - let fixture: ComponentFixture; - - beforeEach(async(() => { - TestBed.configureTestingModule({ - declarations: [ AdminNotificationsBrokerEventsPageComponent ], - schemas: [NO_ERRORS_SCHEMA] - }) - .compileComponents(); - })); - - beforeEach(() => { - fixture = TestBed.createComponent(AdminNotificationsBrokerEventsPageComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create AdminNotificationsBrokerEventsPageComponent', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/src/app/admin/admin-notifications/admin-notifications-broker-events-page/admin-notifications-broker-events-page.component.ts b/src/app/admin/admin-notifications/admin-notifications-broker-events-page/admin-notifications-broker-events-page.component.ts deleted file mode 100644 index f014b4d133..0000000000 --- a/src/app/admin/admin-notifications/admin-notifications-broker-events-page/admin-notifications-broker-events-page.component.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { Component } from '@angular/core'; - -@Component({ - selector: 'ds-notifications-broker-events-page', - templateUrl: './admin-notifications-broker-events-page.component.html' -}) -export class AdminNotificationsBrokerEventsPageComponent { - -} diff --git a/src/app/admin/admin-notifications/admin-notifications-broker-source-page-component/admin-notifications-broker-source-page.component.html b/src/app/admin/admin-notifications/admin-notifications-broker-source-page-component/admin-notifications-broker-source-page.component.html deleted file mode 100644 index 57f635d5da..0000000000 --- a/src/app/admin/admin-notifications/admin-notifications-broker-source-page-component/admin-notifications-broker-source-page.component.html +++ /dev/null @@ -1 +0,0 @@ - diff --git a/src/app/admin/admin-notifications/admin-notifications-broker-source-page-component/admin-notifications-broker-source-page.component.spec.ts b/src/app/admin/admin-notifications/admin-notifications-broker-source-page-component/admin-notifications-broker-source-page.component.spec.ts deleted file mode 100644 index f6d3eb20fe..0000000000 --- a/src/app/admin/admin-notifications/admin-notifications-broker-source-page-component/admin-notifications-broker-source-page.component.spec.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { NO_ERRORS_SCHEMA } from '@angular/core'; -import { ComponentFixture, TestBed } from '@angular/core/testing'; - -import { AdminNotificationsBrokerSourcePageComponent } from './admin-notifications-broker-source-page.component'; - -describe('AdminNotificationsBrokerSourcePageComponent', () => { - let component: AdminNotificationsBrokerSourcePageComponent; - let fixture: ComponentFixture; - - beforeEach(async () => { - await TestBed.configureTestingModule({ - declarations: [ AdminNotificationsBrokerSourcePageComponent ], - schemas: [NO_ERRORS_SCHEMA] - }) - .compileComponents(); - }); - - beforeEach(() => { - fixture = TestBed.createComponent(AdminNotificationsBrokerSourcePageComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create AdminNotificationsBrokerSourcePageComponent', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/src/app/admin/admin-notifications/admin-notifications-broker-source-page-component/admin-notifications-broker-source-page.component.ts b/src/app/admin/admin-notifications/admin-notifications-broker-source-page-component/admin-notifications-broker-source-page.component.ts deleted file mode 100644 index 1ec0894827..0000000000 --- a/src/app/admin/admin-notifications/admin-notifications-broker-source-page-component/admin-notifications-broker-source-page.component.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { Component, OnInit } from '@angular/core'; - -@Component({ - selector: 'ds-admin-notifications-broker-source-page-component', - templateUrl: './admin-notifications-broker-source-page.component.html', -}) -export class AdminNotificationsBrokerSourcePageComponent {} diff --git a/src/app/admin/admin-notifications/admin-notifications-broker-topics-page/admin-notifications-broker-topics-page.component.html b/src/app/admin/admin-notifications/admin-notifications-broker-topics-page/admin-notifications-broker-topics-page.component.html deleted file mode 100644 index dbdae2e6b9..0000000000 --- a/src/app/admin/admin-notifications/admin-notifications-broker-topics-page/admin-notifications-broker-topics-page.component.html +++ /dev/null @@ -1 +0,0 @@ - diff --git a/src/app/admin/admin-notifications/admin-notifications-broker-topics-page/admin-notifications-broker-topics-page.component.spec.ts b/src/app/admin/admin-notifications/admin-notifications-broker-topics-page/admin-notifications-broker-topics-page.component.spec.ts deleted file mode 100644 index c21e0ce73b..0000000000 --- a/src/app/admin/admin-notifications/admin-notifications-broker-topics-page/admin-notifications-broker-topics-page.component.spec.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { NO_ERRORS_SCHEMA } from '@angular/core'; -import { async, ComponentFixture, TestBed } from '@angular/core/testing'; -import { AdminNotificationsBrokerTopicsPageComponent } from './admin-notifications-broker-topics-page.component'; - -describe('AdminNotificationsBrokerTopicsPageComponent', () => { - let component: AdminNotificationsBrokerTopicsPageComponent; - let fixture: ComponentFixture; - - beforeEach(async(() => { - TestBed.configureTestingModule({ - declarations: [ AdminNotificationsBrokerTopicsPageComponent ], - schemas: [NO_ERRORS_SCHEMA] - }) - .compileComponents(); - })); - - beforeEach(() => { - fixture = TestBed.createComponent(AdminNotificationsBrokerTopicsPageComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create AdminNotificationsBrokerTopicsPageComponent', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/src/app/admin/admin-notifications/admin-notifications-broker-topics-page/admin-notifications-broker-topics-page.component.ts b/src/app/admin/admin-notifications/admin-notifications-broker-topics-page/admin-notifications-broker-topics-page.component.ts deleted file mode 100644 index 4f60ffd3fd..0000000000 --- a/src/app/admin/admin-notifications/admin-notifications-broker-topics-page/admin-notifications-broker-topics-page.component.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { Component } from '@angular/core'; - -@Component({ - selector: 'ds-notification-broker-page', - templateUrl: './admin-notifications-broker-topics-page.component.html' -}) -export class AdminNotificationsBrokerTopicsPageComponent { - -} diff --git a/src/app/admin/admin-notifications/admin-notifications-routing-paths.ts b/src/app/admin/admin-notifications/admin-notifications-routing-paths.ts index 469cbb980f..2820a9a2c7 100644 --- a/src/app/admin/admin-notifications/admin-notifications-routing-paths.ts +++ b/src/app/admin/admin-notifications/admin-notifications-routing-paths.ts @@ -1,8 +1,8 @@ import { URLCombiner } from '../../core/url-combiner/url-combiner'; import { getNotificationsModuleRoute } from '../admin-routing-paths'; -export const NOTIFICATIONS_EDIT_PATH = 'notifications-broker'; +export const QUALITY_ASSURANCE_EDIT_PATH = 'quality-assurance'; -export function getNotificationsBrokerbrokerRoute(id: string) { - return new URLCombiner(getNotificationsModuleRoute(), NOTIFICATIONS_EDIT_PATH, id).toString(); +export function getQualityAssuranceRoute(id: string) { + return new URLCombiner(getNotificationsModuleRoute(), QUALITY_ASSURANCE_EDIT_PATH, id).toString(); } diff --git a/src/app/admin/admin-notifications/admin-notifications-routing.module.ts b/src/app/admin/admin-notifications/admin-notifications-routing.module.ts index 4e5997e203..c9cca6d8d8 100644 --- a/src/app/admin/admin-notifications/admin-notifications-routing.module.ts +++ b/src/app/admin/admin-notifications/admin-notifications-routing.module.ts @@ -4,26 +4,26 @@ import { RouterModule } from '@angular/router'; import { AuthenticatedGuard } from '../../core/auth/authenticated.guard'; import { I18nBreadcrumbResolver } from '../../core/breadcrumbs/i18n-breadcrumb.resolver'; import { I18nBreadcrumbsService } from '../../core/breadcrumbs/i18n-breadcrumbs.service'; -import { NOTIFICATIONS_EDIT_PATH } from './admin-notifications-routing-paths'; -import { AdminNotificationsBrokerTopicsPageComponent } from './admin-notifications-broker-topics-page/admin-notifications-broker-topics-page.component'; -import { AdminNotificationsBrokerEventsPageComponent } from './admin-notifications-broker-events-page/admin-notifications-broker-events-page.component'; -import { AdminNotificationsBrokerTopicsPageResolver } from './admin-notifications-broker-topics-page/admin-notifications-broker-topics-page-resolver.service'; -import { AdminNotificationsBrokerEventsPageResolver } from './admin-notifications-broker-events-page/admin-notifications-broker-events-page.resolver'; -import { AdminNotificationsBrokerSourcePageComponent } from './admin-notifications-broker-source-page-component/admin-notifications-broker-source-page.component'; -import { AdminNotificationsBrokerSourcePageResolver } from './admin-notifications-broker-source-page-component/admin-notifications-broker-source-page-resolver.service'; -import { SourceDataResolver } from './admin-notifications-broker-source-page-component/admin-notifications-broker-source-data.reslover'; +import { QUALITY_ASSURANCE_EDIT_PATH } from './admin-notifications-routing-paths'; +import { AdminQualityAssuranceTopicsPageComponent } from './admin-quality-assurance-topics-page/admin-quality-assurance-topics-page.component'; +import { AdminQualityAssuranceEventsPageComponent } from './admin-quality-assurance-events-page/admin-quality-assurance-events-page.component'; +import { AdminQualityAssuranceTopicsPageResolver } from './admin-quality-assurance-topics-page/admin-quality-assurance-topics-page-resolver.service'; +import { AdminQualityAssuranceEventsPageResolver } from './admin-quality-assurance-events-page/admin-quality-assurance-events-page.resolver'; +import { AdminQualityAssuranceSourcePageComponent } from './admin-quality-assurance-source-page-component/admin-quality-assurance-source-page.component'; +import { AdminQualityAssuranceSourcePageResolver } from './admin-quality-assurance-source-page-component/admin-quality-assurance-source-page-resolver.service'; +import { SourceDataResolver } from './admin-quality-assurance-source-page-component/admin-quality-assurance-source-data.reslover'; @NgModule({ imports: [ RouterModule.forChild([ { canActivate: [ AuthenticatedGuard ], - path: `${NOTIFICATIONS_EDIT_PATH}/:sourceId`, - component: AdminNotificationsBrokerTopicsPageComponent, + path: `${QUALITY_ASSURANCE_EDIT_PATH}/:sourceId`, + component: AdminQualityAssuranceTopicsPageComponent, pathMatch: 'full', resolve: { breadcrumb: I18nBreadcrumbResolver, - openaireBrokerTopicsParams: AdminNotificationsBrokerTopicsPageResolver + openaireBrokerTopicsParams: AdminQualityAssuranceTopicsPageResolver }, data: { title: 'admin.notifications.broker.page.title', @@ -33,12 +33,12 @@ import { SourceDataResolver } from './admin-notifications-broker-source-page-com }, { canActivate: [ AuthenticatedGuard ], - path: `${NOTIFICATIONS_EDIT_PATH}`, - component: AdminNotificationsBrokerSourcePageComponent, + path: `${QUALITY_ASSURANCE_EDIT_PATH}`, + component: AdminQualityAssuranceSourcePageComponent, pathMatch: 'full', resolve: { breadcrumb: I18nBreadcrumbResolver, - openaireBrokerSourceParams: AdminNotificationsBrokerSourcePageResolver, + openaireBrokerSourceParams: AdminQualityAssuranceSourcePageResolver, sourceData: SourceDataResolver }, data: { @@ -49,12 +49,12 @@ import { SourceDataResolver } from './admin-notifications-broker-source-page-com }, { canActivate: [ AuthenticatedGuard ], - path: `${NOTIFICATIONS_EDIT_PATH}/:sourceId/:topicId`, - component: AdminNotificationsBrokerEventsPageComponent, + path: `${QUALITY_ASSURANCE_EDIT_PATH}/:sourceId/:topicId`, + component: AdminQualityAssuranceEventsPageComponent, pathMatch: 'full', resolve: { breadcrumb: I18nBreadcrumbResolver, - openaireBrokerEventsParams: AdminNotificationsBrokerEventsPageResolver + openaireBrokerEventsParams: AdminQualityAssuranceEventsPageResolver }, data: { title: 'admin.notifications.event.page.title', @@ -68,9 +68,9 @@ import { SourceDataResolver } from './admin-notifications-broker-source-page-com I18nBreadcrumbResolver, I18nBreadcrumbsService, SourceDataResolver, - AdminNotificationsBrokerTopicsPageResolver, - AdminNotificationsBrokerEventsPageResolver, - AdminNotificationsBrokerSourcePageResolver + AdminQualityAssuranceTopicsPageResolver, + AdminQualityAssuranceEventsPageResolver, + AdminQualityAssuranceSourcePageResolver ] }) /** diff --git a/src/app/admin/admin-notifications/admin-notifications.module.ts b/src/app/admin/admin-notifications/admin-notifications.module.ts index 6351498dc5..ba0c6eee58 100644 --- a/src/app/admin/admin-notifications/admin-notifications.module.ts +++ b/src/app/admin/admin-notifications/admin-notifications.module.ts @@ -3,10 +3,10 @@ import { NgModule } from '@angular/core'; import { CoreModule } from '../../core/core.module'; import { SharedModule } from '../../shared/shared.module'; import { AdminNotificationsRoutingModule } from './admin-notifications-routing.module'; -import { AdminNotificationsBrokerTopicsPageComponent } from './admin-notifications-broker-topics-page/admin-notifications-broker-topics-page.component'; -import { AdminNotificationsBrokerEventsPageComponent } from './admin-notifications-broker-events-page/admin-notifications-broker-events-page.component'; +import { AdminQualityAssuranceTopicsPageComponent } from './admin-quality-assurance-topics-page/admin-quality-assurance-topics-page.component'; +import { AdminQualityAssuranceEventsPageComponent } from './admin-quality-assurance-events-page/admin-quality-assurance-events-page.component'; import { NotificationsModule } from '../../notifications/notifications.module'; -import { AdminNotificationsBrokerSourcePageComponent } from './admin-notifications-broker-source-page-component/admin-notifications-broker-source-page.component'; +import { AdminQualityAssuranceSourcePageComponent } from './admin-quality-assurance-source-page-component/admin-quality-assurance-source-page.component'; @NgModule({ imports: [ @@ -17,9 +17,9 @@ import { AdminNotificationsBrokerSourcePageComponent } from './admin-notificatio NotificationsModule ], declarations: [ - AdminNotificationsBrokerTopicsPageComponent, - AdminNotificationsBrokerEventsPageComponent, - AdminNotificationsBrokerSourcePageComponent + AdminQualityAssuranceTopicsPageComponent, + AdminQualityAssuranceEventsPageComponent, + AdminQualityAssuranceSourcePageComponent ], entryComponents: [] }) diff --git a/src/app/admin/admin-notifications/admin-quality-assurance-events-page/admin-quality-assurance-events-page.component.html b/src/app/admin/admin-notifications/admin-quality-assurance-events-page/admin-quality-assurance-events-page.component.html new file mode 100644 index 0000000000..315209d342 --- /dev/null +++ b/src/app/admin/admin-notifications/admin-quality-assurance-events-page/admin-quality-assurance-events-page.component.html @@ -0,0 +1 @@ + diff --git a/src/app/admin/admin-notifications/admin-quality-assurance-events-page/admin-quality-assurance-events-page.component.spec.ts b/src/app/admin/admin-notifications/admin-quality-assurance-events-page/admin-quality-assurance-events-page.component.spec.ts new file mode 100644 index 0000000000..b952078215 --- /dev/null +++ b/src/app/admin/admin-notifications/admin-quality-assurance-events-page/admin-quality-assurance-events-page.component.spec.ts @@ -0,0 +1,26 @@ +import { NO_ERRORS_SCHEMA } from '@angular/core'; +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; +import { AdminQualityAssuranceEventsPageComponent } from './admin-quality-assurance-events-page.component'; + +describe('AdminQualityAssuranceEventsPageComponent', () => { + let component: AdminQualityAssuranceEventsPageComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ AdminQualityAssuranceEventsPageComponent ], + schemas: [NO_ERRORS_SCHEMA] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(AdminQualityAssuranceEventsPageComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create AdminQualityAssuranceEventsPageComponent', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/admin/admin-notifications/admin-quality-assurance-events-page/admin-quality-assurance-events-page.component.ts b/src/app/admin/admin-notifications/admin-quality-assurance-events-page/admin-quality-assurance-events-page.component.ts new file mode 100644 index 0000000000..a1e15d5bdb --- /dev/null +++ b/src/app/admin/admin-notifications/admin-quality-assurance-events-page/admin-quality-assurance-events-page.component.ts @@ -0,0 +1,9 @@ +import { Component } from '@angular/core'; + +@Component({ + selector: 'ds-quality-assurance-events-page', + templateUrl: './admin-quality-assurance-events-page.component.html' +}) +export class AdminQualityAssuranceEventsPageComponent { + +} diff --git a/src/app/admin/admin-notifications/admin-notifications-broker-events-page/admin-notifications-broker-events-page.resolver.ts b/src/app/admin/admin-notifications/admin-quality-assurance-events-page/admin-quality-assurance-events-page.resolver.ts similarity index 72% rename from src/app/admin/admin-notifications/admin-notifications-broker-events-page/admin-notifications-broker-events-page.resolver.ts rename to src/app/admin/admin-notifications/admin-quality-assurance-events-page/admin-quality-assurance-events-page.resolver.ts index dcf530858c..3139355629 100644 --- a/src/app/admin/admin-notifications/admin-notifications-broker-events-page/admin-notifications-broker-events-page.resolver.ts +++ b/src/app/admin/admin-notifications/admin-quality-assurance-events-page/admin-quality-assurance-events-page.resolver.ts @@ -4,7 +4,7 @@ import { Resolve, ActivatedRouteSnapshot, RouterStateSnapshot } from '@angular/r /** * Interface for the route parameters. */ -export interface AdminNotificationsBrokerEventsPageParams { +export interface AdminQualityAssuranceEventsPageParams { pageId?: string; pageSize?: number; currentPage?: number; @@ -14,15 +14,15 @@ export interface AdminNotificationsBrokerEventsPageParams { * This class represents a resolver that retrieve the route data before the route is activated. */ @Injectable() -export class AdminNotificationsBrokerEventsPageResolver implements Resolve { +export class AdminQualityAssuranceEventsPageResolver implements Resolve { /** * Method for resolving the parameters in the current route. * @param {ActivatedRouteSnapshot} route The current ActivatedRouteSnapshot * @param {RouterStateSnapshot} state The current RouterStateSnapshot - * @returns AdminNotificationsBrokerEventsPageParams Emits the route parameters + * @returns AdminQualityAssuranceEventsPageParams Emits the route parameters */ - resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): AdminNotificationsBrokerEventsPageParams { + resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): AdminQualityAssuranceEventsPageParams { return { pageId: route.queryParams.pageId, pageSize: parseInt(route.queryParams.pageSize, 10), diff --git a/src/app/admin/admin-notifications/admin-notifications-broker-source-page-component/admin-notifications-broker-source-data.reslover.ts b/src/app/admin/admin-notifications/admin-quality-assurance-source-page-component/admin-quality-assurance-source-data.reslover.ts similarity index 61% rename from src/app/admin/admin-notifications/admin-notifications-broker-source-page-component/admin-notifications-broker-source-data.reslover.ts rename to src/app/admin/admin-notifications/admin-quality-assurance-source-page-component/admin-quality-assurance-source-data.reslover.ts index 114f5f7df1..6201e0a743 100644 --- a/src/app/admin/admin-notifications/admin-notifications-broker-source-page-component/admin-notifications-broker-source-data.reslover.ts +++ b/src/app/admin/admin-notifications/admin-quality-assurance-source-page-component/admin-quality-assurance-source-data.reslover.ts @@ -3,30 +3,30 @@ import { ActivatedRouteSnapshot, Resolve, RouterStateSnapshot, Router } from '@a import { Observable } from 'rxjs'; import { map } from 'rxjs/operators'; import { PaginatedList } from '../../../core/data/paginated-list.model'; -import { NotificationsBrokerSourceObject } from '../../../core/notifications/broker/models/notifications-broker-source.model'; -import { NotificationsBrokerSourceService } from '../../../notifications/broker/source/notifications-broker-source.service'; +import { QualityAssuranceSourceObject } from '../../../core/notifications/qa/models/quality-assurance-source.model'; +import { QualityAssuranceSourceService } from '../../../notifications/qa/source/quality-assurance-source.service'; /** * This class represents a resolver that retrieve the route data before the route is activated. */ @Injectable() -export class SourceDataResolver implements Resolve> { +export class SourceDataResolver implements Resolve> { /** * Initialize the effect class variables. - * @param {NotificationsBrokerSourceService} notificationsBrokerSourceService + * @param {QualityAssuranceSourceService} qualityAssuranceSourceService */ constructor( - private notificationsBrokerSourceService: NotificationsBrokerSourceService, + private qualityAssuranceSourceService: QualityAssuranceSourceService, private router: Router ) { } /** * Method for resolving the parameters in the current route. * @param {ActivatedRouteSnapshot} route The current ActivatedRouteSnapshot * @param {RouterStateSnapshot} state The current RouterStateSnapshot - * @returns Observable + * @returns Observable */ - resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable { - return this.notificationsBrokerSourceService.getSources(5,0).pipe( - map((sources: PaginatedList) => { + resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable { + return this.qualityAssuranceSourceService.getSources(5,0).pipe( + map((sources: PaginatedList) => { if (sources.page.length === 1) { this.router.navigate([this.getResolvedUrl(route) + '/' + sources.page[0].id]); } diff --git a/src/app/admin/admin-notifications/admin-notifications-broker-topics-page/admin-notifications-broker-topics-page-resolver.service.ts b/src/app/admin/admin-notifications/admin-quality-assurance-source-page-component/admin-quality-assurance-source-page-resolver.service.ts similarity index 72% rename from src/app/admin/admin-notifications/admin-notifications-broker-topics-page/admin-notifications-broker-topics-page-resolver.service.ts rename to src/app/admin/admin-notifications/admin-quality-assurance-source-page-component/admin-quality-assurance-source-page-resolver.service.ts index d4fd354d92..ac9bdb48d6 100644 --- a/src/app/admin/admin-notifications/admin-notifications-broker-topics-page/admin-notifications-broker-topics-page-resolver.service.ts +++ b/src/app/admin/admin-notifications/admin-quality-assurance-source-page-component/admin-quality-assurance-source-page-resolver.service.ts @@ -4,7 +4,7 @@ import { ActivatedRouteSnapshot, Resolve, RouterStateSnapshot } from '@angular/r /** * Interface for the route parameters. */ -export interface AdminNotificationsBrokerTopicsPageParams { +export interface AdminQualityAssuranceSourcePageParams { pageId?: string; pageSize?: number; currentPage?: number; @@ -14,15 +14,15 @@ export interface AdminNotificationsBrokerTopicsPageParams { * This class represents a resolver that retrieve the route data before the route is activated. */ @Injectable() -export class AdminNotificationsBrokerTopicsPageResolver implements Resolve { +export class AdminQualityAssuranceSourcePageResolver implements Resolve { /** * Method for resolving the parameters in the current route. * @param {ActivatedRouteSnapshot} route The current ActivatedRouteSnapshot * @param {RouterStateSnapshot} state The current RouterStateSnapshot - * @returns AdminNotificationsBrokerTopicsPageParams Emits the route parameters + * @returns AdminQualityAssuranceSourcePageParams Emits the route parameters */ - resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): AdminNotificationsBrokerTopicsPageParams { + resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): AdminQualityAssuranceSourcePageParams { return { pageId: route.queryParams.pageId, pageSize: parseInt(route.queryParams.pageSize, 10), diff --git a/src/app/admin/admin-notifications/admin-quality-assurance-source-page-component/admin-quality-assurance-source-page.component.html b/src/app/admin/admin-notifications/admin-quality-assurance-source-page-component/admin-quality-assurance-source-page.component.html new file mode 100644 index 0000000000..709103cf3d --- /dev/null +++ b/src/app/admin/admin-notifications/admin-quality-assurance-source-page-component/admin-quality-assurance-source-page.component.html @@ -0,0 +1 @@ + diff --git a/src/app/admin/admin-notifications/admin-quality-assurance-source-page-component/admin-quality-assurance-source-page.component.spec.ts b/src/app/admin/admin-notifications/admin-quality-assurance-source-page-component/admin-quality-assurance-source-page.component.spec.ts new file mode 100644 index 0000000000..451c911c4c --- /dev/null +++ b/src/app/admin/admin-notifications/admin-quality-assurance-source-page-component/admin-quality-assurance-source-page.component.spec.ts @@ -0,0 +1,27 @@ +import { NO_ERRORS_SCHEMA } from '@angular/core'; +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { AdminQualityAssuranceSourcePageComponent } from './admin-quality-assurance-source-page.component'; + +describe('AdminQualityAssuranceSourcePageComponent', () => { + let component: AdminQualityAssuranceSourcePageComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [ AdminQualityAssuranceSourcePageComponent ], + schemas: [NO_ERRORS_SCHEMA] + }) + .compileComponents(); + }); + + beforeEach(() => { + fixture = TestBed.createComponent(AdminQualityAssuranceSourcePageComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create AdminQualityAssuranceSourcePageComponent', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/admin/admin-notifications/admin-quality-assurance-source-page-component/admin-quality-assurance-source-page.component.ts b/src/app/admin/admin-notifications/admin-quality-assurance-source-page-component/admin-quality-assurance-source-page.component.ts new file mode 100644 index 0000000000..624e71f281 --- /dev/null +++ b/src/app/admin/admin-notifications/admin-quality-assurance-source-page-component/admin-quality-assurance-source-page.component.ts @@ -0,0 +1,7 @@ +import { Component, OnInit } from '@angular/core'; + +@Component({ + selector: 'ds-admin-quality-assurance-source-page-component', + templateUrl: './admin-quality-assurance-source-page.component.html', +}) +export class AdminQualityAssuranceSourcePageComponent {} diff --git a/src/app/admin/admin-notifications/admin-notifications-broker-source-page-component/admin-notifications-broker-source-page-resolver.service.ts b/src/app/admin/admin-notifications/admin-quality-assurance-topics-page/admin-quality-assurance-topics-page-resolver.service.ts similarity index 72% rename from src/app/admin/admin-notifications/admin-notifications-broker-source-page-component/admin-notifications-broker-source-page-resolver.service.ts rename to src/app/admin/admin-notifications/admin-quality-assurance-topics-page/admin-quality-assurance-topics-page-resolver.service.ts index 8450e20c3c..47500d1878 100644 --- a/src/app/admin/admin-notifications/admin-notifications-broker-source-page-component/admin-notifications-broker-source-page-resolver.service.ts +++ b/src/app/admin/admin-notifications/admin-quality-assurance-topics-page/admin-quality-assurance-topics-page-resolver.service.ts @@ -4,7 +4,7 @@ import { ActivatedRouteSnapshot, Resolve, RouterStateSnapshot } from '@angular/r /** * Interface for the route parameters. */ -export interface AdminNotificationsBrokerSourcePageParams { +export interface AdminQualityAssuranceTopicsPageParams { pageId?: string; pageSize?: number; currentPage?: number; @@ -14,15 +14,15 @@ export interface AdminNotificationsBrokerSourcePageParams { * This class represents a resolver that retrieve the route data before the route is activated. */ @Injectable() -export class AdminNotificationsBrokerSourcePageResolver implements Resolve { +export class AdminQualityAssuranceTopicsPageResolver implements Resolve { /** * Method for resolving the parameters in the current route. * @param {ActivatedRouteSnapshot} route The current ActivatedRouteSnapshot * @param {RouterStateSnapshot} state The current RouterStateSnapshot - * @returns AdminNotificationsBrokerSourcePageParams Emits the route parameters + * @returns AdminQualityAssuranceTopicsPageParams Emits the route parameters */ - resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): AdminNotificationsBrokerSourcePageParams { + resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): AdminQualityAssuranceTopicsPageParams { return { pageId: route.queryParams.pageId, pageSize: parseInt(route.queryParams.pageSize, 10), diff --git a/src/app/admin/admin-notifications/admin-quality-assurance-topics-page/admin-quality-assurance-topics-page.component.html b/src/app/admin/admin-notifications/admin-quality-assurance-topics-page/admin-quality-assurance-topics-page.component.html new file mode 100644 index 0000000000..fc905ad724 --- /dev/null +++ b/src/app/admin/admin-notifications/admin-quality-assurance-topics-page/admin-quality-assurance-topics-page.component.html @@ -0,0 +1 @@ + diff --git a/src/app/admin/admin-notifications/admin-quality-assurance-topics-page/admin-quality-assurance-topics-page.component.spec.ts b/src/app/admin/admin-notifications/admin-quality-assurance-topics-page/admin-quality-assurance-topics-page.component.spec.ts new file mode 100644 index 0000000000..a32f60f017 --- /dev/null +++ b/src/app/admin/admin-notifications/admin-quality-assurance-topics-page/admin-quality-assurance-topics-page.component.spec.ts @@ -0,0 +1,26 @@ +import { NO_ERRORS_SCHEMA } from '@angular/core'; +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; +import { AdminQualityAssuranceTopicsPageComponent } from './admin-quality-assurance-topics-page.component'; + +describe('AdminQualityAssuranceTopicsPageComponent', () => { + let component: AdminQualityAssuranceTopicsPageComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ AdminQualityAssuranceTopicsPageComponent ], + schemas: [NO_ERRORS_SCHEMA] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(AdminQualityAssuranceTopicsPageComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create AdminQualityAssuranceTopicsPageComponent', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/admin/admin-notifications/admin-quality-assurance-topics-page/admin-quality-assurance-topics-page.component.ts b/src/app/admin/admin-notifications/admin-quality-assurance-topics-page/admin-quality-assurance-topics-page.component.ts new file mode 100644 index 0000000000..53f951ba54 --- /dev/null +++ b/src/app/admin/admin-notifications/admin-quality-assurance-topics-page/admin-quality-assurance-topics-page.component.ts @@ -0,0 +1,9 @@ +import { Component } from '@angular/core'; + +@Component({ + selector: 'ds-notification-broker-page', + templateUrl: './admin-quality-assurance-topics-page.component.html' +}) +export class AdminQualityAssuranceTopicsPageComponent { + +} diff --git a/src/app/core/core.module.ts b/src/app/core/core.module.ts index a2ee9abc2d..fcc8160f88 100644 --- a/src/app/core/core.module.ts +++ b/src/app/core/core.module.ts @@ -167,9 +167,9 @@ import { SequenceService } from './shared/sequence.service'; import { CoreState } from './core-state.model'; import { GroupDataService } from './eperson/group-data.service'; import { SubmissionAccessesModel } from './config/models/config-submission-accesses.model'; -import { NotificationsBrokerTopicObject } from './notifications/broker/models/notifications-broker-topic.model'; -import { NotificationsBrokerEventObject } from './notifications/broker/models/notifications-broker-event.model'; -import { NotificationsBrokerSourceObject } from './notifications/broker/models/notifications-broker-source.model'; +import { QualityAssuranceTopicObject } from './notifications/qa/models/quality-assurance-topic.model'; +import { QualityAssuranceEventObject } from './notifications/qa/models/quality-assurance-event.model'; +import { QualityAssuranceSourceObject } from './notifications/qa/models/quality-assurance-source.model'; import { AccessStatusObject } from '../shared/object-list/access-status-badge/access-status.model'; import { AccessStatusDataService } from './data/access-status-data.service'; import { LinkHeadService } from './services/link-head.service'; @@ -369,12 +369,12 @@ export const models = ShortLivedToken, Registration, UsageReport, - NotificationsBrokerTopicObject, - NotificationsBrokerEventObject, + QualityAssuranceTopicObject, + QualityAssuranceEventObject, Root, SearchConfig, SubmissionAccessesModel, - NotificationsBrokerSourceObject, + QualityAssuranceSourceObject, AccessStatusObject, ResearcherProfile, OrcidQueue, diff --git a/src/app/core/notifications/broker/events/notifications-broker-event-rest.service.spec.ts b/src/app/core/notifications/qa/events/quality-assurance-event-rest.service.spec.ts similarity index 77% rename from src/app/core/notifications/broker/events/notifications-broker-event-rest.service.spec.ts rename to src/app/core/notifications/qa/events/quality-assurance-event-rest.service.spec.ts index 16d55479ae..556665adbd 100644 --- a/src/app/core/notifications/broker/events/notifications-broker-event-rest.service.spec.ts +++ b/src/app/core/notifications/qa/events/quality-assurance-event-rest.service.spec.ts @@ -6,8 +6,6 @@ import { cold, getTestScheduler } from 'jasmine-marbles'; import { RequestService } from '../../../data/request.service'; import { buildPaginatedList } from '../../../data/paginated-list.model'; -import { RequestEntry } from '../../../data/request.reducer'; -import { FindListOptions } from '../../../data/request.models'; import { RemoteDataBuildService } from '../../../cache/builders/remote-data-build.service'; import { ObjectCacheService } from '../../../cache/object-cache.service'; import { RestResponse } from '../../../cache/response.models'; @@ -15,17 +13,19 @@ import { PageInfo } from '../../../shared/page-info.model'; import { HALEndpointService } from '../../../shared/hal-endpoint.service'; import { NotificationsService } from '../../../../shared/notifications/notifications.service'; import { createSuccessfulRemoteDataObject } from '../../../../shared/remote-data.utils'; -import { NotificationsBrokerEventRestService } from './notifications-broker-event-rest.service'; +import { QualityAssuranceEventRestService } from './quality-assurance-event-rest.service'; import { - notificationsBrokerEventObjectMissingPid, - notificationsBrokerEventObjectMissingPid2, - notificationsBrokerEventObjectMissingProjectFound + qualityAssuranceEventObjectMissingPid, + qualityAssuranceEventObjectMissingPid2, + qualityAssuranceEventObjectMissingProjectFound } from '../../../../shared/mocks/notifications.mock'; import { ReplaceOperation } from 'fast-json-patch'; +import {RequestEntry} from '../../../data/request-entry.model'; +import {FindListOptions} from '../../../data/find-list-options.model'; -describe('NotificationsBrokerEventRestService', () => { +describe('QualityAssuranceEventRestService', () => { let scheduler: TestScheduler; - let service: NotificationsBrokerEventRestService; + let service: QualityAssuranceEventRestService; let serviceASAny: any; let responseCacheEntry: RequestEntry; let responseCacheEntryB: RequestEntry; @@ -43,10 +43,10 @@ describe('NotificationsBrokerEventRestService', () => { const topic = 'ENRICH!MORE!PID'; const pageInfo = new PageInfo(); - const array = [ notificationsBrokerEventObjectMissingPid, notificationsBrokerEventObjectMissingPid2 ]; + const array = [ qualityAssuranceEventObjectMissingPid, qualityAssuranceEventObjectMissingPid2 ]; const paginatedList = buildPaginatedList(pageInfo, array); - const brokerEventObjectRD = createSuccessfulRemoteDataObject(notificationsBrokerEventObjectMissingPid); - const brokerEventObjectMissingProjectRD = createSuccessfulRemoteDataObject(notificationsBrokerEventObjectMissingProjectFound); + const brokerEventObjectRD = createSuccessfulRemoteDataObject(qualityAssuranceEventObjectMissingPid); + const brokerEventObjectMissingProjectRD = createSuccessfulRemoteDataObject(qualityAssuranceEventObjectMissingProjectFound); const paginatedListRD = createSuccessfulRemoteDataObject(paginatedList); const status = 'ACCEPTED'; @@ -99,7 +99,7 @@ describe('NotificationsBrokerEventRestService', () => { http = {} as HttpClient; comparator = {} as any; - service = new NotificationsBrokerEventRestService( + service = new QualityAssuranceEventRestService( requestService, rdbService, objectCache, @@ -138,7 +138,7 @@ describe('NotificationsBrokerEventRestService', () => { expect(serviceASAny.dataService.searchBy).toHaveBeenCalledWith('findByTopic', options, true, true); }); - it('should return a RemoteData> for the object with the given Topic', () => { + it('should return a RemoteData> for the object with the given Topic', () => { const result = service.getEventsByTopic(topic); const expected = cold('(a)', { a: paginatedListRD @@ -155,15 +155,15 @@ describe('NotificationsBrokerEventRestService', () => { }); it('should proxy the call to dataservice.findById', () => { - service.getEvent(notificationsBrokerEventObjectMissingPid.id).subscribe( + service.getEvent(qualityAssuranceEventObjectMissingPid.id).subscribe( (res) => { - expect(serviceASAny.dataService.findById).toHaveBeenCalledWith(notificationsBrokerEventObjectMissingPid.id, true, true); + expect(serviceASAny.dataService.findById).toHaveBeenCalledWith(qualityAssuranceEventObjectMissingPid.id, true, true); } ); }); - it('should return a RemoteData for the object with the given URL', () => { - const result = service.getEvent(notificationsBrokerEventObjectMissingPid.id); + it('should return a RemoteData for the object with the given URL', () => { + const result = service.getEvent(qualityAssuranceEventObjectMissingPid.id); const expected = cold('(a)', { a: brokerEventObjectRD }); @@ -179,17 +179,17 @@ describe('NotificationsBrokerEventRestService', () => { }); it('should proxy the call to dataservice.patch', () => { - service.patchEvent(status, notificationsBrokerEventObjectMissingPid).subscribe( + service.patchEvent(status, qualityAssuranceEventObjectMissingPid).subscribe( (res) => { - expect(serviceASAny.dataService.patch).toHaveBeenCalledWith(notificationsBrokerEventObjectMissingPid, operation); + expect(serviceASAny.dataService.patch).toHaveBeenCalledWith(qualityAssuranceEventObjectMissingPid, operation); } ); }); it('should return a RemoteData with HTTP 200', () => { - const result = service.patchEvent(status, notificationsBrokerEventObjectMissingPid); + const result = service.patchEvent(status, qualityAssuranceEventObjectMissingPid); const expected = cold('(a|)', { - a: createSuccessfulRemoteDataObject(notificationsBrokerEventObjectMissingPid) + a: createSuccessfulRemoteDataObject(qualityAssuranceEventObjectMissingPid) }); expect(result).toBeObservable(expected); }); @@ -203,17 +203,17 @@ describe('NotificationsBrokerEventRestService', () => { }); it('should proxy the call to dataservice.postOnRelated', () => { - service.boundProject(notificationsBrokerEventObjectMissingProjectFound.id, requestUUID).subscribe( + service.boundProject(qualityAssuranceEventObjectMissingProjectFound.id, requestUUID).subscribe( (res) => { - expect(serviceASAny.dataService.postOnRelated).toHaveBeenCalledWith(notificationsBrokerEventObjectMissingProjectFound.id, requestUUID); + expect(serviceASAny.dataService.postOnRelated).toHaveBeenCalledWith(qualityAssuranceEventObjectMissingProjectFound.id, requestUUID); } ); }); it('should return a RestResponse with HTTP 201', () => { - const result = service.boundProject(notificationsBrokerEventObjectMissingProjectFound.id, requestUUID); + const result = service.boundProject(qualityAssuranceEventObjectMissingProjectFound.id, requestUUID); const expected = cold('(a|)', { - a: createSuccessfulRemoteDataObject(notificationsBrokerEventObjectMissingProjectFound) + a: createSuccessfulRemoteDataObject(qualityAssuranceEventObjectMissingProjectFound) }); expect(result).toBeObservable(expected); }); @@ -227,15 +227,15 @@ describe('NotificationsBrokerEventRestService', () => { }); it('should proxy the call to dataservice.deleteOnRelated', () => { - service.removeProject(notificationsBrokerEventObjectMissingProjectFound.id).subscribe( + service.removeProject(qualityAssuranceEventObjectMissingProjectFound.id).subscribe( (res) => { - expect(serviceASAny.dataService.deleteOnRelated).toHaveBeenCalledWith(notificationsBrokerEventObjectMissingProjectFound.id); + expect(serviceASAny.dataService.deleteOnRelated).toHaveBeenCalledWith(qualityAssuranceEventObjectMissingProjectFound.id); } ); }); it('should return a RestResponse with HTTP 204', () => { - const result = service.removeProject(notificationsBrokerEventObjectMissingProjectFound.id); + const result = service.removeProject(qualityAssuranceEventObjectMissingProjectFound.id); const expected = cold('(a|)', { a: createSuccessfulRemoteDataObject({}) }); diff --git a/src/app/core/notifications/broker/events/notifications-broker-event-rest.service.ts b/src/app/core/notifications/qa/events/quality-assurance-event-rest.service.ts similarity index 71% rename from src/app/core/notifications/broker/events/notifications-broker-event-rest.service.ts rename to src/app/core/notifications/qa/events/quality-assurance-event-rest.service.ts index 7f4761009d..59f6c31e05 100644 --- a/src/app/core/notifications/broker/events/notifications-broker-event-rest.service.ts +++ b/src/app/core/notifications/qa/events/quality-assurance-event-rest.service.ts @@ -4,7 +4,6 @@ import { Store } from '@ngrx/store'; import { Observable } from 'rxjs'; -import { CoreState } from '../../../core.reducers'; import { HALEndpointService } from '../../../shared/hal-endpoint.service'; import { NotificationsService } from '../../../../shared/notifications/notifications.service'; import { RemoteDataBuildService } from '../../../cache/builders/remote-data-build.service'; @@ -12,24 +11,25 @@ import { RestResponse } from '../../../cache/response.models'; import { ObjectCacheService } from '../../../cache/object-cache.service'; import { dataService } from '../../../cache/builders/build-decorators'; import { RequestService } from '../../../data/request.service'; -import { FindListOptions } from '../../../data/request.models'; import { DataService } from '../../../data/data.service'; import { ChangeAnalyzer } from '../../../data/change-analyzer'; import { DefaultChangeAnalyzer } from '../../../data/default-change-analyzer.service'; import { RemoteData } from '../../../data/remote-data'; -import { NotificationsBrokerEventObject } from '../models/notifications-broker-event.model'; -import { NOTIFICATIONS_BROKER_EVENT_OBJECT } from '../models/notifications-broker-event-object.resource-type'; +import { QualityAssuranceEventObject } from '../models/quality-assurance-event.model'; +import { QUALITY_ASSURANCE_EVENT_OBJECT } from '../models/quality-assurance-event-object.resource-type'; import { FollowLinkConfig } from '../../../../shared/utils/follow-link-config.model'; import { PaginatedList } from '../../../data/paginated-list.model'; import { ReplaceOperation } from 'fast-json-patch'; import { NoContent } from '../../../shared/NoContent.model'; +import {CoreState} from '../../../core-state.model'; +import {FindListOptions} from '../../../data/find-list-options.model'; /* tslint:disable:max-classes-per-file */ /** * A private DataService implementation to delegate specific methods to. */ -class DataServiceImpl extends DataService { +class DataServiceImpl extends DataService { /** * The REST endpoint. */ @@ -44,7 +44,7 @@ class DataServiceImpl extends DataService { * @param {HALEndpointService} halService * @param {NotificationsService} notificationsService * @param {HttpClient} http - * @param {ChangeAnalyzer} comparator + * @param {ChangeAnalyzer} comparator */ constructor( protected requestService: RequestService, @@ -54,17 +54,17 @@ class DataServiceImpl extends DataService { protected halService: HALEndpointService, protected notificationsService: NotificationsService, protected http: HttpClient, - protected comparator: ChangeAnalyzer) { + protected comparator: ChangeAnalyzer) { super(); } } /** - * The service handling all Notifications Broker topic REST requests. + * The service handling all Quality Assurance topic REST requests. */ @Injectable() -@dataService(NOTIFICATIONS_BROKER_EVENT_OBJECT) -export class NotificationsBrokerEventRestService { +@dataService(QUALITY_ASSURANCE_EVENT_OBJECT) +export class QualityAssuranceEventRestService { /** * A private DataService implementation to delegate specific methods to. */ @@ -78,7 +78,7 @@ export class NotificationsBrokerEventRestService { * @param {HALEndpointService} halService * @param {NotificationsService} notificationsService * @param {HttpClient} http - * @param {DefaultChangeAnalyzer} comparator + * @param {DefaultChangeAnalyzer} comparator */ constructor( protected requestService: RequestService, @@ -87,23 +87,23 @@ export class NotificationsBrokerEventRestService { protected halService: HALEndpointService, protected notificationsService: NotificationsService, protected http: HttpClient, - protected comparator: DefaultChangeAnalyzer) { + protected comparator: DefaultChangeAnalyzer) { this.dataService = new DataServiceImpl(requestService, rdbService, null, objectCache, halService, notificationsService, http, comparator); } /** - * Return the list of Notifications Broker events by topic. + * Return the list of Quality Assurance events by topic. * * @param topic - * The Notifications Broker topic + * The Quality Assurance topic * @param options * Find list options object. * @param linksToFollow * List of {@link FollowLinkConfig} that indicate which {@link HALLink}s should be automatically resolved. - * @return Observable>> - * The list of Notifications Broker events. + * @return Observable>> + * The list of Quality Assurance events. */ - public getEventsByTopic(topic: string, options: FindListOptions = {}, ...linksToFollow: FollowLinkConfig[]): Observable>> { + public getEventsByTopic(topic: string, options: FindListOptions = {}, ...linksToFollow: FollowLinkConfig[]): Observable>> { options.searchParams = [ { fieldName: 'topic', @@ -121,32 +121,32 @@ export class NotificationsBrokerEventRestService { } /** - * Return a single Notifications Broker event. + * Return a single Quality Assurance event. * * @param id - * The Notifications Broker event id + * The Quality Assurance event id * @param linksToFollow * List of {@link FollowLinkConfig} that indicate which {@link HALLink}s should be automatically resolved - * @return Observable> - * The Notifications Broker event. + * @return Observable> + * The Quality Assurance event. */ - public getEvent(id: string, ...linksToFollow: FollowLinkConfig[]): Observable> { + public getEvent(id: string, ...linksToFollow: FollowLinkConfig[]): Observable> { return this.dataService.findById(id, true, true, ...linksToFollow); } /** - * Save the new status of a Notifications Broker event. + * Save the new status of a Quality Assurance event. * * @param status * The new status - * @param dso NotificationsBrokerEventObject + * @param dso QualityAssuranceEventObject * The event item * @param reason * The optional reason (not used for now; for future implementation) * @return Observable * The REST response. */ - public patchEvent(status, dso, reason?: string): Observable> { + public patchEvent(status, dso, reason?: string): Observable> { const operation: ReplaceOperation[] = [ { path: '/status', @@ -158,24 +158,24 @@ export class NotificationsBrokerEventRestService { } /** - * Bound a project to a Notifications Broker event publication. + * Bound a project to a Quality Assurance event publication. * * @param itemId - * The Id of the Notifications Broker event + * The Id of the Quality Assurance event * @param projectId * The project Id to bound * @return Observable * The REST response. */ - public boundProject(itemId: string, projectId: string): Observable> { + public boundProject(itemId: string, projectId: string): Observable> { return this.dataService.postOnRelated(itemId, projectId); } /** - * Remove a project from a Notifications Broker event publication. + * Remove a project from a Quality Assurance event publication. * * @param itemId - * The Id of the Notifications Broker event + * The Id of the Quality Assurance event * @return Observable * The REST response. */ diff --git a/src/app/core/notifications/broker/models/notifications-broker-topic-object.resource-type.ts b/src/app/core/notifications/qa/models/quality-assurance-event-object.resource-type.ts similarity index 53% rename from src/app/core/notifications/broker/models/notifications-broker-topic-object.resource-type.ts rename to src/app/core/notifications/qa/models/quality-assurance-event-object.resource-type.ts index e7012eee4f..33c7b338ed 100644 --- a/src/app/core/notifications/broker/models/notifications-broker-topic-object.resource-type.ts +++ b/src/app/core/notifications/qa/models/quality-assurance-event-object.resource-type.ts @@ -1,9 +1,9 @@ import { ResourceType } from '../../../shared/resource-type'; /** - * The resource type for the Notifications Broker topic + * The resource type for the Quality Assurance event * * Needs to be in a separate file to prevent circular * dependencies in webpack. */ -export const NOTIFICATIONS_BROKER_TOPIC_OBJECT = new ResourceType('nbtopic'); +export const QUALITY_ASSURANCE_EVENT_OBJECT = new ResourceType('nbevent'); diff --git a/src/app/core/notifications/broker/models/notifications-broker-event.model.ts b/src/app/core/notifications/qa/models/quality-assurance-event.model.ts similarity index 90% rename from src/app/core/notifications/broker/models/notifications-broker-event.model.ts rename to src/app/core/notifications/qa/models/quality-assurance-event.model.ts index 4df326f325..15fbae7821 100644 --- a/src/app/core/notifications/broker/models/notifications-broker-event.model.ts +++ b/src/app/core/notifications/qa/models/quality-assurance-event.model.ts @@ -1,7 +1,6 @@ import { Observable } from 'rxjs'; import { autoserialize, autoserializeAs, deserialize } from 'cerialize'; -import { CacheableObject } from '../../../cache/object-cache.reducer'; -import { NOTIFICATIONS_BROKER_EVENT_OBJECT } from './notifications-broker-event-object.resource-type'; +import { QUALITY_ASSURANCE_EVENT_OBJECT } from './quality-assurance-event-object.resource-type'; import { excludeFromEquals } from '../../../utilities/equals.decorators'; import { ResourceType } from '../../../shared/resource-type'; import { HALLink } from '../../../shared/hal-link.model'; @@ -9,11 +8,12 @@ import { Item } from '../../../shared/item.model'; import { ITEM } from '../../../shared/item.resource-type'; import { link, typedObject } from '../../../cache/builders/build-decorators'; import { RemoteData } from '../../../data/remote-data'; +import {CacheableObject} from '../../../cache/cacheable-object.model'; /** * The interface representing the Notifications Broker event message */ -export interface NotificationsBrokerEventMessageObject { +export interface QualityAssuranceEventMessageObject { } @@ -77,11 +77,11 @@ export interface OpenaireBrokerEventMessageObject { * The interface representing the Notifications Broker event model */ @typedObject -export class NotificationsBrokerEventObject implements CacheableObject { +export class QualityAssuranceEventObject implements CacheableObject { /** * A string representing the kind of object, e.g. community, item, … */ - static type = NOTIFICATIONS_BROKER_EVENT_OBJECT; + static type = QUALITY_ASSURANCE_EVENT_OBJECT; /** * The Notifications Broker event uuid inside DSpace diff --git a/src/app/core/notifications/broker/models/notifications-broker-event-object.resource-type.ts b/src/app/core/notifications/qa/models/quality-assurance-source-object.resource-type.ts similarity index 53% rename from src/app/core/notifications/broker/models/notifications-broker-event-object.resource-type.ts rename to src/app/core/notifications/qa/models/quality-assurance-source-object.resource-type.ts index 2493ae02d1..585216c34f 100644 --- a/src/app/core/notifications/broker/models/notifications-broker-event-object.resource-type.ts +++ b/src/app/core/notifications/qa/models/quality-assurance-source-object.resource-type.ts @@ -1,9 +1,9 @@ import { ResourceType } from '../../../shared/resource-type'; /** - * The resource type for the Notifications Broker event + * The resource type for the Quality Assurance source * * Needs to be in a separate file to prevent circular * dependencies in webpack. */ -export const NOTIFICATIONS_BROKER_EVENT_OBJECT = new ResourceType('nbevent'); +export const QUALITY_ASSURANCE_SOURCE_OBJECT = new ResourceType('nbsource'); diff --git a/src/app/core/notifications/broker/models/notifications-broker-source.model.ts b/src/app/core/notifications/qa/models/quality-assurance-source.model.ts similarity index 69% rename from src/app/core/notifications/broker/models/notifications-broker-source.model.ts rename to src/app/core/notifications/qa/models/quality-assurance-source.model.ts index 3f18c3affb..f59467384f 100644 --- a/src/app/core/notifications/broker/models/notifications-broker-source.model.ts +++ b/src/app/core/notifications/qa/models/quality-assurance-source.model.ts @@ -1,24 +1,24 @@ import { autoserialize, deserialize } from 'cerialize'; -import { CacheableObject } from '../../../cache/object-cache.reducer'; import { excludeFromEquals } from '../../../utilities/equals.decorators'; import { ResourceType } from '../../../shared/resource-type'; import { HALLink } from '../../../shared/hal-link.model'; import { typedObject } from '../../../cache/builders/build-decorators'; -import { NOTIFICATIONS_BROKER_SOURCE_OBJECT } from './notifications-broker-source-object.resource-type'; +import { QUALITY_ASSURANCE_SOURCE_OBJECT } from './quality-assurance-source-object.resource-type'; +import {CacheableObject} from '../../../cache/cacheable-object.model'; /** - * The interface representing the Notifications Broker source model + * The interface representing the Quality Assurance source model */ @typedObject -export class NotificationsBrokerSourceObject implements CacheableObject { +export class QualityAssuranceSourceObject implements CacheableObject { /** * A string representing the kind of object, e.g. community, item, … */ - static type = NOTIFICATIONS_BROKER_SOURCE_OBJECT; + static type = QUALITY_ASSURANCE_SOURCE_OBJECT; /** - * The Notifications Broker source id + * The Quality Assurance source id */ @autoserialize id: string; diff --git a/src/app/core/notifications/broker/models/notifications-broker-source-object.resource-type.ts b/src/app/core/notifications/qa/models/quality-assurance-topic-object.resource-type.ts similarity index 53% rename from src/app/core/notifications/broker/models/notifications-broker-source-object.resource-type.ts rename to src/app/core/notifications/qa/models/quality-assurance-topic-object.resource-type.ts index e3d10dc5ab..8cd5bec61b 100644 --- a/src/app/core/notifications/broker/models/notifications-broker-source-object.resource-type.ts +++ b/src/app/core/notifications/qa/models/quality-assurance-topic-object.resource-type.ts @@ -1,9 +1,9 @@ import { ResourceType } from '../../../shared/resource-type'; /** - * The resource type for the Notifications Broker source + * The resource type for the Quality Assurance topic * * Needs to be in a separate file to prevent circular * dependencies in webpack. */ -export const NOTIFICATIONS_BROKER_SOURCE_OBJECT = new ResourceType('nbsource'); +export const QUALITY_ASSURANCE_TOPIC_OBJECT = new ResourceType('nbtopic'); diff --git a/src/app/core/notifications/broker/models/notifications-broker-topic.model.ts b/src/app/core/notifications/qa/models/quality-assurance-topic.model.ts similarity index 68% rename from src/app/core/notifications/broker/models/notifications-broker-topic.model.ts rename to src/app/core/notifications/qa/models/quality-assurance-topic.model.ts index d1f2e6ff50..529980e5f7 100644 --- a/src/app/core/notifications/broker/models/notifications-broker-topic.model.ts +++ b/src/app/core/notifications/qa/models/quality-assurance-topic.model.ts @@ -1,30 +1,30 @@ import { autoserialize, deserialize } from 'cerialize'; -import { CacheableObject } from '../../../cache/object-cache.reducer'; -import { NOTIFICATIONS_BROKER_TOPIC_OBJECT } from './notifications-broker-topic-object.resource-type'; +import { QUALITY_ASSURANCE_TOPIC_OBJECT } from './quality-assurance-topic-object.resource-type'; import { excludeFromEquals } from '../../../utilities/equals.decorators'; import { ResourceType } from '../../../shared/resource-type'; import { HALLink } from '../../../shared/hal-link.model'; import { typedObject } from '../../../cache/builders/build-decorators'; +import {CacheableObject} from '../../../cache/cacheable-object.model'; /** - * The interface representing the Notifications Broker topic model + * The interface representing the Quality Assurance topic model */ @typedObject -export class NotificationsBrokerTopicObject implements CacheableObject { +export class QualityAssuranceTopicObject implements CacheableObject { /** * A string representing the kind of object, e.g. community, item, … */ - static type = NOTIFICATIONS_BROKER_TOPIC_OBJECT; + static type = QUALITY_ASSURANCE_TOPIC_OBJECT; /** - * The Notifications Broker topic id + * The Quality Assurance topic id */ @autoserialize id: string; /** - * The Notifications Broker topic name to display + * The Quality Assurance topic name to display */ @autoserialize name: string; diff --git a/src/app/core/notifications/broker/source/notifications-broker-source-rest.service.spec.ts b/src/app/core/notifications/qa/source/quality-assurance-source-rest.service.spec.ts similarity index 78% rename from src/app/core/notifications/broker/source/notifications-broker-source-rest.service.spec.ts rename to src/app/core/notifications/qa/source/quality-assurance-source-rest.service.spec.ts index 984f44bd15..dff604b0c4 100644 --- a/src/app/core/notifications/broker/source/notifications-broker-source-rest.service.spec.ts +++ b/src/app/core/notifications/qa/source/quality-assurance-source-rest.service.spec.ts @@ -6,7 +6,6 @@ import { cold, getTestScheduler } from 'jasmine-marbles'; import { RequestService } from '../../../data/request.service'; import { buildPaginatedList } from '../../../data/paginated-list.model'; -import { RequestEntry } from '../../../data/request.reducer'; import { RemoteDataBuildService } from '../../../cache/builders/remote-data-build.service'; import { ObjectCacheService } from '../../../cache/object-cache.service'; import { RestResponse } from '../../../cache/response.models'; @@ -14,15 +13,16 @@ import { PageInfo } from '../../../shared/page-info.model'; import { HALEndpointService } from '../../../shared/hal-endpoint.service'; import { NotificationsService } from '../../../../shared/notifications/notifications.service'; import { createSuccessfulRemoteDataObject } from '../../../../shared/remote-data.utils'; -import { NotificationsBrokerSourceRestService } from './notifications-broker-source-rest.service'; import { - notificationsBrokerSourceObjectMoreAbstract, - notificationsBrokerSourceObjectMorePid + qualityAssuranceSourceObjectMoreAbstract, + qualityAssuranceSourceObjectMorePid } from '../../../../shared/mocks/notifications.mock'; +import {RequestEntry} from '../../../data/request-entry.model'; +import {QualityAssuranceSourceRestService} from './quality-assurance-source-rest.service'; -describe('NotificationsBrokerSourceRestService', () => { +describe('QualityAssuranceSourceRestService', () => { let scheduler: TestScheduler; - let service: NotificationsBrokerSourceRestService; + let service: QualityAssuranceSourceRestService; let responseCacheEntry: RequestEntry; let requestService: RequestService; let rdbService: RemoteDataBuildService; @@ -36,9 +36,9 @@ describe('NotificationsBrokerSourceRestService', () => { const requestUUID = '8b3c913a-5a4b-438b-9181-be1a5b4a1c8a'; const pageInfo = new PageInfo(); - const array = [ notificationsBrokerSourceObjectMorePid, notificationsBrokerSourceObjectMoreAbstract ]; + const array = [ qualityAssuranceSourceObjectMorePid, qualityAssuranceSourceObjectMoreAbstract ]; const paginatedList = buildPaginatedList(pageInfo, array); - const brokerSourceObjectRD = createSuccessfulRemoteDataObject(notificationsBrokerSourceObjectMorePid); + const brokerSourceObjectRD = createSuccessfulRemoteDataObject(qualityAssuranceSourceObjectMorePid); const paginatedListRD = createSuccessfulRemoteDataObject(paginatedList); beforeEach(() => { @@ -72,7 +72,7 @@ describe('NotificationsBrokerSourceRestService', () => { http = {} as HttpClient; comparator = {} as any; - service = new NotificationsBrokerSourceRestService( + service = new QualityAssuranceSourceRestService( requestService, rdbService, objectCache, @@ -96,7 +96,7 @@ describe('NotificationsBrokerSourceRestService', () => { done(); }); - it('should return a RemoteData> for the object with the given URL', () => { + it('should return a RemoteData> for the object with the given URL', () => { const result = service.getSources(); const expected = cold('(a)', { a: paginatedListRD @@ -107,16 +107,16 @@ describe('NotificationsBrokerSourceRestService', () => { describe('getSource', () => { it('should proxy the call to dataservice.findByHref', (done) => { - service.getSource(notificationsBrokerSourceObjectMorePid.id).subscribe( + service.getSource(qualityAssuranceSourceObjectMorePid.id).subscribe( (res) => { - expect((service as any).dataService.findByHref).toHaveBeenCalledWith(endpointURL + '/' + notificationsBrokerSourceObjectMorePid.id, true, true); + expect((service as any).dataService.findByHref).toHaveBeenCalledWith(endpointURL + '/' + qualityAssuranceSourceObjectMorePid.id, true, true); } ); done(); }); - it('should return a RemoteData for the object with the given URL', () => { - const result = service.getSource(notificationsBrokerSourceObjectMorePid.id); + it('should return a RemoteData for the object with the given URL', () => { + const result = service.getSource(qualityAssuranceSourceObjectMorePid.id); const expected = cold('(a)', { a: brokerSourceObjectRD }); diff --git a/src/app/core/notifications/broker/source/notifications-broker-source-rest.service.ts b/src/app/core/notifications/qa/source/quality-assurance-source-rest.service.ts similarity index 72% rename from src/app/core/notifications/broker/source/notifications-broker-source-rest.service.ts rename to src/app/core/notifications/qa/source/quality-assurance-source-rest.service.ts index ebbbe995d1..85045aebcd 100644 --- a/src/app/core/notifications/broker/source/notifications-broker-source-rest.service.ts +++ b/src/app/core/notifications/qa/source/quality-assurance-source-rest.service.ts @@ -5,29 +5,29 @@ import { Store } from '@ngrx/store'; import { Observable } from 'rxjs'; import { mergeMap, take } from 'rxjs/operators'; -import { CoreState } from '../../../core.reducers'; import { HALEndpointService } from '../../../shared/hal-endpoint.service'; import { NotificationsService } from '../../../../shared/notifications/notifications.service'; import { RemoteDataBuildService } from '../../../cache/builders/remote-data-build.service'; import { ObjectCacheService } from '../../../cache/object-cache.service'; import { dataService } from '../../../cache/builders/build-decorators'; import { RequestService } from '../../../data/request.service'; -import { FindListOptions } from '../../../data/request.models'; import { DataService } from '../../../data/data.service'; import { ChangeAnalyzer } from '../../../data/change-analyzer'; import { DefaultChangeAnalyzer } from '../../../data/default-change-analyzer.service'; import { RemoteData } from '../../../data/remote-data'; -import { NotificationsBrokerSourceObject } from '../models/notifications-broker-source.model'; -import { NOTIFICATIONS_BROKER_SOURCE_OBJECT } from '../models/notifications-broker-source-object.resource-type'; +import { QualityAssuranceSourceObject } from '../models/quality-assurance-source.model'; +import { QUALITY_ASSURANCE_SOURCE_OBJECT } from '../models/quality-assurance-source-object.resource-type'; import { FollowLinkConfig } from '../../../../shared/utils/follow-link-config.model'; import { PaginatedList } from '../../../data/paginated-list.model'; +import {CoreState} from '../../../core-state.model'; +import {FindListOptions} from '../../../data/find-list-options.model'; /* tslint:disable:max-classes-per-file */ /** * A private DataService implementation to delegate specific methods to. */ -class DataServiceImpl extends DataService { +class DataServiceImpl extends DataService { /** * The REST endpoint. */ @@ -42,7 +42,7 @@ class DataServiceImpl extends DataService { * @param {HALEndpointService} halService * @param {NotificationsService} notificationsService * @param {HttpClient} http - * @param {ChangeAnalyzer} comparator + * @param {ChangeAnalyzer} comparator */ constructor( protected requestService: RequestService, @@ -52,17 +52,17 @@ class DataServiceImpl extends DataService { protected halService: HALEndpointService, protected notificationsService: NotificationsService, protected http: HttpClient, - protected comparator: ChangeAnalyzer) { + protected comparator: ChangeAnalyzer) { super(); } } /** - * The service handling all Notifications Broker source REST requests. + * The service handling all Quality Assurance source REST requests. */ @Injectable() -@dataService(NOTIFICATIONS_BROKER_SOURCE_OBJECT) -export class NotificationsBrokerSourceRestService { +@dataService(QUALITY_ASSURANCE_SOURCE_OBJECT) +export class QualityAssuranceSourceRestService { /** * A private DataService implementation to delegate specific methods to. */ @@ -76,7 +76,7 @@ export class NotificationsBrokerSourceRestService { * @param {HALEndpointService} halService * @param {NotificationsService} notificationsService * @param {HttpClient} http - * @param {DefaultChangeAnalyzer} comparator + * @param {DefaultChangeAnalyzer} comparator */ constructor( protected requestService: RequestService, @@ -85,21 +85,21 @@ export class NotificationsBrokerSourceRestService { protected halService: HALEndpointService, protected notificationsService: NotificationsService, protected http: HttpClient, - protected comparator: DefaultChangeAnalyzer) { + protected comparator: DefaultChangeAnalyzer) { this.dataService = new DataServiceImpl(requestService, rdbService, null, objectCache, halService, notificationsService, http, comparator); } /** - * Return the list of Notifications Broker source. + * Return the list of Quality Assurance source. * * @param options * Find list options object. * @param linksToFollow * List of {@link FollowLinkConfig} that indicate which {@link HALLink}s should be automatically resolved. - * @return Observable>> - * The list of Notifications Broker source. + * @return Observable>> + * The list of Quality Assurance source. */ - public getSources(options: FindListOptions = {}, ...linksToFollow: FollowLinkConfig[]): Observable>> { + public getSources(options: FindListOptions = {}, ...linksToFollow: FollowLinkConfig[]): Observable>> { return this.dataService.getBrowseEndpoint(options, 'nbsources').pipe( take(1), mergeMap((href: string) => this.dataService.findAllByHref(href, options, true, true, ...linksToFollow)), @@ -114,16 +114,16 @@ export class NotificationsBrokerSourceRestService { } /** - * Return a single Notifications Broker source. + * Return a single Quality Assurance source. * * @param id - * The Notifications Broker source id + * The Quality Assurance source id * @param linksToFollow * List of {@link FollowLinkConfig} that indicate which {@link HALLink}s should be automatically resolved. - * @return Observable> - * The Notifications Broker source. + * @return Observable> + * The Quality Assurance source. */ - public getSource(id: string, ...linksToFollow: FollowLinkConfig[]): Observable> { + public getSource(id: string, ...linksToFollow: FollowLinkConfig[]): Observable> { const options = {}; return this.dataService.getBrowseEndpoint(options, 'nbsources').pipe( take(1), diff --git a/src/app/core/notifications/broker/topics/notifications-broker-topic-rest.service.spec.ts b/src/app/core/notifications/qa/topics/quality-assurance-topic-rest.service.spec.ts similarity index 76% rename from src/app/core/notifications/broker/topics/notifications-broker-topic-rest.service.spec.ts rename to src/app/core/notifications/qa/topics/quality-assurance-topic-rest.service.spec.ts index 06931e2032..cb828141a6 100644 --- a/src/app/core/notifications/broker/topics/notifications-broker-topic-rest.service.spec.ts +++ b/src/app/core/notifications/qa/topics/quality-assurance-topic-rest.service.spec.ts @@ -6,7 +6,6 @@ import { cold, getTestScheduler } from 'jasmine-marbles'; import { RequestService } from '../../../data/request.service'; import { buildPaginatedList } from '../../../data/paginated-list.model'; -import { RequestEntry } from '../../../data/request.reducer'; import { RemoteDataBuildService } from '../../../cache/builders/remote-data-build.service'; import { ObjectCacheService } from '../../../cache/object-cache.service'; import { RestResponse } from '../../../cache/response.models'; @@ -14,15 +13,16 @@ import { PageInfo } from '../../../shared/page-info.model'; import { HALEndpointService } from '../../../shared/hal-endpoint.service'; import { NotificationsService } from '../../../../shared/notifications/notifications.service'; import { createSuccessfulRemoteDataObject } from '../../../../shared/remote-data.utils'; -import { NotificationsBrokerTopicRestService } from './notifications-broker-topic-rest.service'; +import { QualityAssuranceTopicRestService } from './quality-assurance-topic-rest.service'; import { - notificationsBrokerTopicObjectMoreAbstract, - notificationsBrokerTopicObjectMorePid + qualityAssuranceTopicObjectMoreAbstract, + qualityAssuranceTopicObjectMorePid } from '../../../../shared/mocks/notifications.mock'; +import {RequestEntry} from '../../../data/request-entry.model'; -describe('NotificationsBrokerTopicRestService', () => { +describe('QualityAssuranceTopicRestService', () => { let scheduler: TestScheduler; - let service: NotificationsBrokerTopicRestService; + let service: QualityAssuranceTopicRestService; let responseCacheEntry: RequestEntry; let requestService: RequestService; let rdbService: RemoteDataBuildService; @@ -36,9 +36,9 @@ describe('NotificationsBrokerTopicRestService', () => { const requestUUID = '8b3c913a-5a4b-438b-9181-be1a5b4a1c8a'; const pageInfo = new PageInfo(); - const array = [ notificationsBrokerTopicObjectMorePid, notificationsBrokerTopicObjectMoreAbstract ]; + const array = [ qualityAssuranceTopicObjectMorePid, qualityAssuranceTopicObjectMoreAbstract ]; const paginatedList = buildPaginatedList(pageInfo, array); - const brokerTopicObjectRD = createSuccessfulRemoteDataObject(notificationsBrokerTopicObjectMorePid); + const brokerTopicObjectRD = createSuccessfulRemoteDataObject(qualityAssuranceTopicObjectMorePid); const paginatedListRD = createSuccessfulRemoteDataObject(paginatedList); beforeEach(() => { @@ -72,7 +72,7 @@ describe('NotificationsBrokerTopicRestService', () => { http = {} as HttpClient; comparator = {} as any; - service = new NotificationsBrokerTopicRestService( + service = new QualityAssuranceTopicRestService( requestService, rdbService, objectCache, @@ -96,7 +96,7 @@ describe('NotificationsBrokerTopicRestService', () => { done(); }); - it('should return a RemoteData> for the object with the given URL', () => { + it('should return a RemoteData> for the object with the given URL', () => { const result = service.getTopics(); const expected = cold('(a)', { a: paginatedListRD @@ -107,16 +107,16 @@ describe('NotificationsBrokerTopicRestService', () => { describe('getTopic', () => { it('should proxy the call to dataservice.findByHref', (done) => { - service.getTopic(notificationsBrokerTopicObjectMorePid.id).subscribe( + service.getTopic(qualityAssuranceTopicObjectMorePid.id).subscribe( (res) => { - expect((service as any).dataService.findByHref).toHaveBeenCalledWith(endpointURL + '/' + notificationsBrokerTopicObjectMorePid.id, true, true); + expect((service as any).dataService.findByHref).toHaveBeenCalledWith(endpointURL + '/' + qualityAssuranceTopicObjectMorePid.id, true, true); } ); done(); }); - it('should return a RemoteData for the object with the given URL', () => { - const result = service.getTopic(notificationsBrokerTopicObjectMorePid.id); + it('should return a RemoteData for the object with the given URL', () => { + const result = service.getTopic(qualityAssuranceTopicObjectMorePid.id); const expected = cold('(a)', { a: brokerTopicObjectRD }); diff --git a/src/app/core/notifications/broker/topics/notifications-broker-topic-rest.service.ts b/src/app/core/notifications/qa/topics/quality-assurance-topic-rest.service.ts similarity index 73% rename from src/app/core/notifications/broker/topics/notifications-broker-topic-rest.service.ts rename to src/app/core/notifications/qa/topics/quality-assurance-topic-rest.service.ts index 9f0b93cfb3..da90126709 100644 --- a/src/app/core/notifications/broker/topics/notifications-broker-topic-rest.service.ts +++ b/src/app/core/notifications/qa/topics/quality-assurance-topic-rest.service.ts @@ -5,29 +5,29 @@ import { Store } from '@ngrx/store'; import { Observable } from 'rxjs'; import { mergeMap, take } from 'rxjs/operators'; -import { CoreState } from '../../../core.reducers'; import { HALEndpointService } from '../../../shared/hal-endpoint.service'; import { NotificationsService } from '../../../../shared/notifications/notifications.service'; import { RemoteDataBuildService } from '../../../cache/builders/remote-data-build.service'; import { ObjectCacheService } from '../../../cache/object-cache.service'; import { dataService } from '../../../cache/builders/build-decorators'; import { RequestService } from '../../../data/request.service'; -import { FindListOptions } from '../../../data/request.models'; import { DataService } from '../../../data/data.service'; import { ChangeAnalyzer } from '../../../data/change-analyzer'; import { DefaultChangeAnalyzer } from '../../../data/default-change-analyzer.service'; import { RemoteData } from '../../../data/remote-data'; -import { NotificationsBrokerTopicObject } from '../models/notifications-broker-topic.model'; -import { NOTIFICATIONS_BROKER_TOPIC_OBJECT } from '../models/notifications-broker-topic-object.resource-type'; +import { QualityAssuranceTopicObject } from '../models/quality-assurance-topic.model'; +import { QUALITY_ASSURANCE_TOPIC_OBJECT } from '../models/quality-assurance-topic-object.resource-type'; import { FollowLinkConfig } from '../../../../shared/utils/follow-link-config.model'; import { PaginatedList } from '../../../data/paginated-list.model'; +import {CoreState} from '../../../core-state.model'; +import {FindListOptions} from '../../../data/find-list-options.model'; /* tslint:disable:max-classes-per-file */ /** * A private DataService implementation to delegate specific methods to. */ -class DataServiceImpl extends DataService { +class DataServiceImpl extends DataService { /** * The REST endpoint. */ @@ -42,7 +42,7 @@ class DataServiceImpl extends DataService { * @param {HALEndpointService} halService * @param {NotificationsService} notificationsService * @param {HttpClient} http - * @param {ChangeAnalyzer} comparator + * @param {ChangeAnalyzer} comparator */ constructor( protected requestService: RequestService, @@ -52,17 +52,17 @@ class DataServiceImpl extends DataService { protected halService: HALEndpointService, protected notificationsService: NotificationsService, protected http: HttpClient, - protected comparator: ChangeAnalyzer) { + protected comparator: ChangeAnalyzer) { super(); } } /** - * The service handling all Notifications Broker topic REST requests. + * The service handling all Quality Assurance topic REST requests. */ @Injectable() -@dataService(NOTIFICATIONS_BROKER_TOPIC_OBJECT) -export class NotificationsBrokerTopicRestService { +@dataService(QUALITY_ASSURANCE_TOPIC_OBJECT) +export class QualityAssuranceTopicRestService { /** * A private DataService implementation to delegate specific methods to. */ @@ -76,7 +76,7 @@ export class NotificationsBrokerTopicRestService { * @param {HALEndpointService} halService * @param {NotificationsService} notificationsService * @param {HttpClient} http - * @param {DefaultChangeAnalyzer} comparator + * @param {DefaultChangeAnalyzer} comparator */ constructor( protected requestService: RequestService, @@ -85,21 +85,21 @@ export class NotificationsBrokerTopicRestService { protected halService: HALEndpointService, protected notificationsService: NotificationsService, protected http: HttpClient, - protected comparator: DefaultChangeAnalyzer) { + protected comparator: DefaultChangeAnalyzer) { this.dataService = new DataServiceImpl(requestService, rdbService, null, objectCache, halService, notificationsService, http, comparator); } /** - * Return the list of Notifications Broker topics. + * Return the list of Quality Assurance topics. * * @param options * Find list options object. * @param linksToFollow * List of {@link FollowLinkConfig} that indicate which {@link HALLink}s should be automatically resolved. - * @return Observable>> - * The list of Notifications Broker topics. + * @return Observable>> + * The list of Quality Assurance topics. */ - public getTopics(options: FindListOptions = {}, ...linksToFollow: FollowLinkConfig[]): Observable>> { + public getTopics(options: FindListOptions = {}, ...linksToFollow: FollowLinkConfig[]): Observable>> { return this.dataService.getBrowseEndpoint(options, 'nbtopics').pipe( take(1), mergeMap((href: string) => this.dataService.findAllByHref(href, options, true, true, ...linksToFollow)), @@ -114,16 +114,16 @@ export class NotificationsBrokerTopicRestService { } /** - * Return a single Notifications Broker topic. + * Return a single Quality Assurance topic. * * @param id - * The Notifications Broker topic id + * The Quality Assurance topic id * @param linksToFollow * List of {@link FollowLinkConfig} that indicate which {@link HALLink}s should be automatically resolved. - * @return Observable> - * The Notifications Broker topic. + * @return Observable> + * The Quality Assurance topic. */ - public getTopic(id: string, ...linksToFollow: FollowLinkConfig[]): Observable> { + public getTopic(id: string, ...linksToFollow: FollowLinkConfig[]): Observable> { const options = {}; return this.dataService.getBrowseEndpoint(options, 'nbtopics').pipe( take(1), diff --git a/src/app/notifications/broker/source/notifications-broker-source.reducer.ts b/src/app/notifications/broker/source/notifications-broker-source.reducer.ts deleted file mode 100644 index 5395796380..0000000000 --- a/src/app/notifications/broker/source/notifications-broker-source.reducer.ts +++ /dev/null @@ -1,72 +0,0 @@ -import { NotificationsBrokerSourceObject } from '../../../core/notifications/broker/models/notifications-broker-source.model'; -import { NotificationsBrokerSourceActionTypes, NotificationsBrokerSourceActions } from './notifications-broker-source.actions'; - -/** - * The interface representing the Notifications Broker source state. - */ -export interface NotificationsBrokerSourceState { - source: NotificationsBrokerSourceObject[]; - processing: boolean; - loaded: boolean; - totalPages: number; - currentPage: number; - totalElements: number; -} - -/** - * Used for the Notifications Broker source state initialization. - */ -const notificationsBrokerSourceInitialState: NotificationsBrokerSourceState = { - source: [], - processing: false, - loaded: false, - totalPages: 0, - currentPage: 0, - totalElements: 0 -}; - -/** - * The Notifications Broker Source Reducer - * - * @param state - * the current state initialized with notificationsBrokerSourceInitialState - * @param action - * the action to perform on the state - * @return NotificationsBrokerSourceState - * the new state - */ -export function notificationsBrokerSourceReducer(state = notificationsBrokerSourceInitialState, action: NotificationsBrokerSourceActions): NotificationsBrokerSourceState { - switch (action.type) { - case NotificationsBrokerSourceActionTypes.RETRIEVE_ALL_SOURCE: { - return Object.assign({}, state, { - source: [], - processing: true - }); - } - - case NotificationsBrokerSourceActionTypes.ADD_SOURCE: { - return Object.assign({}, state, { - source: action.payload.source, - processing: false, - loaded: true, - totalPages: action.payload.totalPages, - currentPage: state.currentPage, - totalElements: action.payload.totalElements - }); - } - - case NotificationsBrokerSourceActionTypes.RETRIEVE_ALL_SOURCE_ERROR: { - return Object.assign({}, state, { - processing: false, - loaded: true, - totalPages: 0, - currentPage: 0, - totalElements: 0 - }); - } - - default: { - return state; - } - } -} diff --git a/src/app/notifications/broker/source/notifications-broker-source.service.ts b/src/app/notifications/broker/source/notifications-broker-source.service.ts deleted file mode 100644 index e80643049c..0000000000 --- a/src/app/notifications/broker/source/notifications-broker-source.service.ts +++ /dev/null @@ -1,55 +0,0 @@ -import { Injectable } from '@angular/core'; -import { Observable } from 'rxjs'; -import { find, map } from 'rxjs/operators'; -import { NotificationsBrokerSourceRestService } from '../../../core/notifications/broker/source/notifications-broker-source-rest.service'; -import { SortDirection, SortOptions } from '../../../core/cache/models/sort-options.model'; -import { FindListOptions } from '../../../core/data/request.models'; -import { RemoteData } from '../../../core/data/remote-data'; -import { PaginatedList } from '../../../core/data/paginated-list.model'; -import { NotificationsBrokerSourceObject } from '../../../core/notifications/broker/models/notifications-broker-source.model'; - -/** - * The service handling all Notifications Broker source requests to the REST service. - */ -@Injectable() -export class NotificationsBrokerSourceService { - - /** - * Initialize the service variables. - * @param {NotificationsBrokerSourceRestService} notificationsBrokerSourceRestService - */ - constructor( - private notificationsBrokerSourceRestService: NotificationsBrokerSourceRestService - ) { } - - /** - * Return the list of Notifications Broker source managing pagination and errors. - * - * @param elementsPerPage - * The number of the source per page - * @param currentPage - * The page number to retrieve - * @return Observable> - * The list of Notifications Broker source. - */ - public getSources(elementsPerPage, currentPage): Observable> { - const sortOptions = new SortOptions('name', SortDirection.ASC); - - const findListOptions: FindListOptions = { - elementsPerPage: elementsPerPage, - currentPage: currentPage, - sort: sortOptions - }; - - return this.notificationsBrokerSourceRestService.getSources(findListOptions).pipe( - find((rd: RemoteData>) => !rd.isResponsePending), - map((rd: RemoteData>) => { - if (rd.hasSucceeded) { - return rd.payload; - } else { - throw new Error('Can\'t retrieve Notifications Broker source from the Broker source REST service'); - } - }) - ); - } -} diff --git a/src/app/notifications/broker/topics/notifications-broker-topics.reducer.ts b/src/app/notifications/broker/topics/notifications-broker-topics.reducer.ts deleted file mode 100644 index 2a7be1bf13..0000000000 --- a/src/app/notifications/broker/topics/notifications-broker-topics.reducer.ts +++ /dev/null @@ -1,72 +0,0 @@ -import { NotificationsBrokerTopicObject } from '../../../core/notifications/broker/models/notifications-broker-topic.model'; -import { NotificationsBrokerTopicActionTypes, NotificationsBrokerTopicsActions } from './notifications-broker-topics.actions'; - -/** - * The interface representing the Notifications Broker topic state. - */ -export interface NotificationsBrokerTopicState { - topics: NotificationsBrokerTopicObject[]; - processing: boolean; - loaded: boolean; - totalPages: number; - currentPage: number; - totalElements: number; -} - -/** - * Used for the Notifications Broker topic state initialization. - */ -const notificationsBrokerTopicInitialState: NotificationsBrokerTopicState = { - topics: [], - processing: false, - loaded: false, - totalPages: 0, - currentPage: 0, - totalElements: 0 -}; - -/** - * The Notifications Broker Topic Reducer - * - * @param state - * the current state initialized with notificationsBrokerTopicInitialState - * @param action - * the action to perform on the state - * @return NotificationsBrokerTopicState - * the new state - */ -export function notificationsBrokerTopicsReducer(state = notificationsBrokerTopicInitialState, action: NotificationsBrokerTopicsActions): NotificationsBrokerTopicState { - switch (action.type) { - case NotificationsBrokerTopicActionTypes.RETRIEVE_ALL_TOPICS: { - return Object.assign({}, state, { - topics: [], - processing: true - }); - } - - case NotificationsBrokerTopicActionTypes.ADD_TOPICS: { - return Object.assign({}, state, { - topics: action.payload.topics, - processing: false, - loaded: true, - totalPages: action.payload.totalPages, - currentPage: state.currentPage, - totalElements: action.payload.totalElements - }); - } - - case NotificationsBrokerTopicActionTypes.RETRIEVE_ALL_TOPICS_ERROR: { - return Object.assign({}, state, { - processing: false, - loaded: true, - totalPages: 0, - currentPage: 0, - totalElements: 0 - }); - } - - default: { - return state; - } - } -} diff --git a/src/app/notifications/notifications-state.service.spec.ts b/src/app/notifications/notifications-state.service.spec.ts index 91048a93ef..cabda48ec5 100644 --- a/src/app/notifications/notifications-state.service.spec.ts +++ b/src/app/notifications/notifications-state.service.spec.ts @@ -5,15 +5,15 @@ import { cold } from 'jasmine-marbles'; import { notificationsReducers } from './notifications.reducer'; import { NotificationsStateService } from './notifications-state.service'; import { - notificationsBrokerSourceObjectMissingPid, - notificationsBrokerSourceObjectMoreAbstract, - notificationsBrokerSourceObjectMorePid, - notificationsBrokerTopicObjectMissingPid, - notificationsBrokerTopicObjectMoreAbstract, - notificationsBrokerTopicObjectMorePid + qualityAssuranceSourceObjectMissingPid, + qualityAssuranceSourceObjectMoreAbstract, + qualityAssuranceSourceObjectMorePid, + qualityAssuranceTopicObjectMissingPid, + qualityAssuranceTopicObjectMoreAbstract, + qualityAssuranceTopicObjectMorePid } from '../shared/mocks/notifications.mock'; -import { RetrieveAllTopicsAction } from './broker/topics/notifications-broker-topics.actions'; -import { RetrieveAllSourceAction } from './broker/source/notifications-broker-source.actions'; +import { RetrieveAllTopicsAction } from './qa/topics/quality-assurance-topics.actions'; +import { RetrieveAllSourceAction } from './qa/source/quality-assurance-source.actions'; describe('NotificationsStateService', () => { let service: NotificationsStateService; @@ -42,9 +42,9 @@ describe('NotificationsStateService', () => { notifications: { brokerTopic: { topics: [ - notificationsBrokerTopicObjectMorePid, - notificationsBrokerTopicObjectMoreAbstract, - notificationsBrokerTopicObjectMissingPid + qualityAssuranceTopicObjectMorePid, + qualityAssuranceTopicObjectMoreAbstract, + qualityAssuranceTopicObjectMissingPid ], processing: false, loaded: true, @@ -79,9 +79,9 @@ describe('NotificationsStateService', () => { spyOn(store, 'dispatch'); }); - describe('getNotificationsBrokerTopics', () => { + describe('getQualityAssuranceTopics', () => { it('Should return an empty array', () => { - const result = service.getNotificationsBrokerTopics(); + const result = service.getQualityAssuranceTopics(); const expected = cold('(a)', { a: [] }); @@ -89,9 +89,9 @@ describe('NotificationsStateService', () => { }); }); - describe('getNotificationsBrokerTopicsTotalPages', () => { + describe('getQualityAssuranceTopicsTotalPages', () => { it('Should return zero (0)', () => { - const result = service.getNotificationsBrokerTopicsTotalPages(); + const result = service.getQualityAssuranceTopicsTotalPages(); const expected = cold('(a)', { a: 0 }); @@ -99,9 +99,9 @@ describe('NotificationsStateService', () => { }); }); - describe('getNotificationsBrokerTopicsCurrentPage', () => { + describe('getQualityAssuranceTopicsCurrentPage', () => { it('Should return minus one (0)', () => { - const result = service.getNotificationsBrokerTopicsCurrentPage(); + const result = service.getQualityAssuranceTopicsCurrentPage(); const expected = cold('(a)', { a: 0 }); @@ -109,9 +109,9 @@ describe('NotificationsStateService', () => { }); }); - describe('getNotificationsBrokerTopicsTotals', () => { + describe('getQualityAssuranceTopicsTotals', () => { it('Should return zero (0)', () => { - const result = service.getNotificationsBrokerTopicsTotals(); + const result = service.getQualityAssuranceTopicsTotals(); const expected = cold('(a)', { a: 0 }); @@ -119,9 +119,9 @@ describe('NotificationsStateService', () => { }); }); - describe('isNotificationsBrokerTopicsLoading', () => { + describe('isQualityAssuranceTopicsLoading', () => { it('Should return TRUE', () => { - const result = service.isNotificationsBrokerTopicsLoading(); + const result = service.isQualityAssuranceTopicsLoading(); const expected = cold('(a)', { a: true }); @@ -129,9 +129,9 @@ describe('NotificationsStateService', () => { }); }); - describe('isNotificationsBrokerTopicsLoaded', () => { + describe('isQualityAssuranceTopicsLoaded', () => { it('Should return FALSE', () => { - const result = service.isNotificationsBrokerTopicsLoaded(); + const result = service.isQualityAssuranceTopicsLoaded(); const expected = cold('(a)', { a: false }); @@ -139,9 +139,9 @@ describe('NotificationsStateService', () => { }); }); - describe('isNotificationsBrokerTopicsProcessing', () => { + describe('isQualityAssuranceTopicsProcessing', () => { it('Should return FALSE', () => { - const result = service.isNotificationsBrokerTopicsProcessing(); + const result = service.isQualityAssuranceTopicsProcessing(); const expected = cold('(a)', { a: false }); @@ -171,23 +171,23 @@ describe('NotificationsStateService', () => { spyOn(store, 'dispatch'); }); - describe('getNotificationsBrokerTopics', () => { + describe('getQualityAssuranceTopics', () => { it('Should return an array of topics', () => { - const result = service.getNotificationsBrokerTopics(); + const result = service.getQualityAssuranceTopics(); const expected = cold('(a)', { a: [ - notificationsBrokerTopicObjectMorePid, - notificationsBrokerTopicObjectMoreAbstract, - notificationsBrokerTopicObjectMissingPid + qualityAssuranceTopicObjectMorePid, + qualityAssuranceTopicObjectMoreAbstract, + qualityAssuranceTopicObjectMissingPid ] }); expect(result).toBeObservable(expected); }); }); - describe('getNotificationsBrokerTopicsTotalPages', () => { + describe('getQualityAssuranceTopicsTotalPages', () => { it('Should return one (1)', () => { - const result = service.getNotificationsBrokerTopicsTotalPages(); + const result = service.getQualityAssuranceTopicsTotalPages(); const expected = cold('(a)', { a: 1 }); @@ -195,9 +195,9 @@ describe('NotificationsStateService', () => { }); }); - describe('getNotificationsBrokerTopicsCurrentPage', () => { + describe('getQualityAssuranceTopicsCurrentPage', () => { it('Should return minus zero (1)', () => { - const result = service.getNotificationsBrokerTopicsCurrentPage(); + const result = service.getQualityAssuranceTopicsCurrentPage(); const expected = cold('(a)', { a: 1 }); @@ -205,9 +205,9 @@ describe('NotificationsStateService', () => { }); }); - describe('getNotificationsBrokerTopicsTotals', () => { + describe('getQualityAssuranceTopicsTotals', () => { it('Should return three (3)', () => { - const result = service.getNotificationsBrokerTopicsTotals(); + const result = service.getQualityAssuranceTopicsTotals(); const expected = cold('(a)', { a: 3 }); @@ -215,9 +215,9 @@ describe('NotificationsStateService', () => { }); }); - describe('isNotificationsBrokerTopicsLoading', () => { + describe('isQualityAssuranceTopicsLoading', () => { it('Should return FALSE', () => { - const result = service.isNotificationsBrokerTopicsLoading(); + const result = service.isQualityAssuranceTopicsLoading(); const expected = cold('(a)', { a: false }); @@ -225,9 +225,9 @@ describe('NotificationsStateService', () => { }); }); - describe('isNotificationsBrokerTopicsLoaded', () => { + describe('isQualityAssuranceTopicsLoaded', () => { it('Should return TRUE', () => { - const result = service.isNotificationsBrokerTopicsLoaded(); + const result = service.isQualityAssuranceTopicsLoaded(); const expected = cold('(a)', { a: true }); @@ -235,9 +235,9 @@ describe('NotificationsStateService', () => { }); }); - describe('isNotificationsBrokerTopicsProcessing', () => { + describe('isQualityAssuranceTopicsProcessing', () => { it('Should return FALSE', () => { - const result = service.isNotificationsBrokerTopicsProcessing(); + const result = service.isQualityAssuranceTopicsProcessing(); const expected = cold('(a)', { a: false }); @@ -267,12 +267,12 @@ describe('NotificationsStateService', () => { spyOn(store, 'dispatch'); }); - describe('dispatchRetrieveNotificationsBrokerTopics', () => { + describe('dispatchRetrieveQualityAssuranceTopics', () => { it('Should call store.dispatch', () => { const elementsPerPage = 3; const currentPage = 1; const action = new RetrieveAllTopicsAction(elementsPerPage, currentPage); - service.dispatchRetrieveNotificationsBrokerTopics(elementsPerPage, currentPage); + service.dispatchRetrieveQualityAssuranceTopics(elementsPerPage, currentPage); expect(serviceAsAny.store.dispatch).toHaveBeenCalledWith(action); }); }); @@ -300,9 +300,9 @@ describe('NotificationsStateService', () => { notifications: { brokerSource: { source: [ - notificationsBrokerSourceObjectMorePid, - notificationsBrokerSourceObjectMoreAbstract, - notificationsBrokerSourceObjectMissingPid + qualityAssuranceSourceObjectMorePid, + qualityAssuranceSourceObjectMoreAbstract, + qualityAssuranceSourceObjectMissingPid ], processing: false, loaded: true, @@ -337,9 +337,9 @@ describe('NotificationsStateService', () => { spyOn(store, 'dispatch'); }); - describe('getNotificationsBrokerSource', () => { + describe('getQualityAssuranceSource', () => { it('Should return an empty array', () => { - const result = service.getNotificationsBrokerSource(); + const result = service.getQualityAssuranceSource(); const expected = cold('(a)', { a: [] }); @@ -347,9 +347,9 @@ describe('NotificationsStateService', () => { }); }); - describe('getNotificationsBrokerSourceTotalPages', () => { + describe('getQualityAssuranceSourceTotalPages', () => { it('Should return zero (0)', () => { - const result = service.getNotificationsBrokerSourceTotalPages(); + const result = service.getQualityAssuranceSourceTotalPages(); const expected = cold('(a)', { a: 0 }); @@ -357,9 +357,9 @@ describe('NotificationsStateService', () => { }); }); - describe('getNotificationsBrokerSourcesCurrentPage', () => { + describe('getQualityAssuranceSourcesCurrentPage', () => { it('Should return minus one (0)', () => { - const result = service.getNotificationsBrokerSourceCurrentPage(); + const result = service.getQualityAssuranceSourceCurrentPage(); const expected = cold('(a)', { a: 0 }); @@ -367,9 +367,9 @@ describe('NotificationsStateService', () => { }); }); - describe('getNotificationsBrokerSourceTotals', () => { + describe('getQualityAssuranceSourceTotals', () => { it('Should return zero (0)', () => { - const result = service.getNotificationsBrokerSourceTotals(); + const result = service.getQualityAssuranceSourceTotals(); const expected = cold('(a)', { a: 0 }); @@ -377,9 +377,9 @@ describe('NotificationsStateService', () => { }); }); - describe('isNotificationsBrokerSourceLoading', () => { + describe('isQualityAssuranceSourceLoading', () => { it('Should return TRUE', () => { - const result = service.isNotificationsBrokerSourceLoading(); + const result = service.isQualityAssuranceSourceLoading(); const expected = cold('(a)', { a: true }); @@ -387,9 +387,9 @@ describe('NotificationsStateService', () => { }); }); - describe('isNotificationsBrokerSourceLoaded', () => { + describe('isQualityAssuranceSourceLoaded', () => { it('Should return FALSE', () => { - const result = service.isNotificationsBrokerSourceLoaded(); + const result = service.isQualityAssuranceSourceLoaded(); const expected = cold('(a)', { a: false }); @@ -397,9 +397,9 @@ describe('NotificationsStateService', () => { }); }); - describe('isNotificationsBrokerSourceProcessing', () => { + describe('isQualityAssuranceSourceProcessing', () => { it('Should return FALSE', () => { - const result = service.isNotificationsBrokerSourceProcessing(); + const result = service.isQualityAssuranceSourceProcessing(); const expected = cold('(a)', { a: false }); @@ -429,23 +429,23 @@ describe('NotificationsStateService', () => { spyOn(store, 'dispatch'); }); - describe('getNotificationsBrokerSource', () => { + describe('getQualityAssuranceSource', () => { it('Should return an array of Source', () => { - const result = service.getNotificationsBrokerSource(); + const result = service.getQualityAssuranceSource(); const expected = cold('(a)', { a: [ - notificationsBrokerSourceObjectMorePid, - notificationsBrokerSourceObjectMoreAbstract, - notificationsBrokerSourceObjectMissingPid + qualityAssuranceSourceObjectMorePid, + qualityAssuranceSourceObjectMoreAbstract, + qualityAssuranceSourceObjectMissingPid ] }); expect(result).toBeObservable(expected); }); }); - describe('getNotificationsBrokerSourceTotalPages', () => { + describe('getQualityAssuranceSourceTotalPages', () => { it('Should return one (1)', () => { - const result = service.getNotificationsBrokerSourceTotalPages(); + const result = service.getQualityAssuranceSourceTotalPages(); const expected = cold('(a)', { a: 1 }); @@ -453,9 +453,9 @@ describe('NotificationsStateService', () => { }); }); - describe('getNotificationsBrokerSourceCurrentPage', () => { + describe('getQualityAssuranceSourceCurrentPage', () => { it('Should return minus zero (1)', () => { - const result = service.getNotificationsBrokerSourceCurrentPage(); + const result = service.getQualityAssuranceSourceCurrentPage(); const expected = cold('(a)', { a: 1 }); @@ -463,9 +463,9 @@ describe('NotificationsStateService', () => { }); }); - describe('getNotificationsBrokerSourceTotals', () => { + describe('getQualityAssuranceSourceTotals', () => { it('Should return three (3)', () => { - const result = service.getNotificationsBrokerSourceTotals(); + const result = service.getQualityAssuranceSourceTotals(); const expected = cold('(a)', { a: 3 }); @@ -473,9 +473,9 @@ describe('NotificationsStateService', () => { }); }); - describe('isNotificationsBrokerSourceLoading', () => { + describe('isQualityAssuranceSourceLoading', () => { it('Should return FALSE', () => { - const result = service.isNotificationsBrokerSourceLoading(); + const result = service.isQualityAssuranceSourceLoading(); const expected = cold('(a)', { a: false }); @@ -483,9 +483,9 @@ describe('NotificationsStateService', () => { }); }); - describe('isNotificationsBrokerSourceLoaded', () => { + describe('isQualityAssuranceSourceLoaded', () => { it('Should return TRUE', () => { - const result = service.isNotificationsBrokerSourceLoaded(); + const result = service.isQualityAssuranceSourceLoaded(); const expected = cold('(a)', { a: true }); @@ -493,9 +493,9 @@ describe('NotificationsStateService', () => { }); }); - describe('isNotificationsBrokerSourceProcessing', () => { + describe('isQualityAssuranceSourceProcessing', () => { it('Should return FALSE', () => { - const result = service.isNotificationsBrokerSourceProcessing(); + const result = service.isQualityAssuranceSourceProcessing(); const expected = cold('(a)', { a: false }); @@ -525,12 +525,12 @@ describe('NotificationsStateService', () => { spyOn(store, 'dispatch'); }); - describe('dispatchRetrieveNotificationsBrokerSource', () => { + describe('dispatchRetrieveQualityAssuranceSource', () => { it('Should call store.dispatch', () => { const elementsPerPage = 3; const currentPage = 1; const action = new RetrieveAllSourceAction(elementsPerPage, currentPage); - service.dispatchRetrieveNotificationsBrokerSource(elementsPerPage, currentPage); + service.dispatchRetrieveQualityAssuranceSource(elementsPerPage, currentPage); expect(serviceAsAny.store.dispatch).toHaveBeenCalledWith(action); }); }); diff --git a/src/app/notifications/notifications-state.service.ts b/src/app/notifications/notifications-state.service.ts index cbee503acd..99605a54fa 100644 --- a/src/app/notifications/notifications-state.service.ts +++ b/src/app/notifications/notifications-state.service.ts @@ -3,24 +3,24 @@ import { select, Store } from '@ngrx/store'; import { Observable } from 'rxjs'; import { map } from 'rxjs/operators'; import { - getNotificationsBrokerTopicsCurrentPageSelector, - getNotificationsBrokerTopicsTotalPagesSelector, - getNotificationsBrokerTopicsTotalsSelector, - isNotificationsBrokerTopicsLoadedSelector, - notificationsBrokerTopicsObjectSelector, - isNotificationsBrokerTopicsProcessingSelector, - notificationsBrokerSourceObjectSelector, - isNotificationsBrokerSourceLoadedSelector, - isNotificationsBrokerSourceProcessingSelector, - getNotificationsBrokerSourceTotalPagesSelector, - getNotificationsBrokerSourceCurrentPageSelector, - getNotificationsBrokerSourceTotalsSelector + getQualityAssuranceTopicsCurrentPageSelector, + getQualityAssuranceTopicsTotalPagesSelector, + getQualityAssuranceTopicsTotalsSelector, + isQualityAssuranceTopicsLoadedSelector, + qualityAssuranceTopicsObjectSelector, + isQualityAssuranceTopicsProcessingSelector, + qualityAssuranceSourceObjectSelector, + isQualityAssuranceSourceLoadedSelector, + isQualityAssuranceSourceProcessingSelector, + getQualityAssuranceSourceTotalPagesSelector, + getQualityAssuranceSourceCurrentPageSelector, + getQualityAssuranceSourceTotalsSelector } from './selectors'; -import { NotificationsBrokerTopicObject } from '../core/notifications/broker/models/notifications-broker-topic.model'; +import { QualityAssuranceTopicObject } from '../core/notifications/qa/models/quality-assurance-topic.model'; import { NotificationsState } from './notifications.reducer'; -import { RetrieveAllTopicsAction } from './broker/topics/notifications-broker-topics.actions'; -import { NotificationsBrokerSourceObject } from '../core/notifications/broker/models/notifications-broker-source.model'; -import { RetrieveAllSourceAction } from './broker/source/notifications-broker-source.actions'; +import { RetrieveAllTopicsAction } from './qa/topics/quality-assurance-topics.actions'; +import { QualityAssuranceSourceObject } from '../core/notifications/qa/models/quality-assurance-source.model'; +import { RetrieveAllSourceAction } from './qa/source/quality-assurance-source.actions'; /** * The service handling the Notifications State. @@ -34,179 +34,179 @@ export class NotificationsStateService { */ constructor(private store: Store) { } - // Notifications Broker topics + // Quality Assurance topics // -------------------------------------------------------------------------- /** - * Returns the list of Notifications Broker topics from the state. + * Returns the list of Quality Assurance topics from the state. * - * @return Observable - * The list of Notifications Broker topics. + * @return Observable + * The list of Quality Assurance topics. */ - public getNotificationsBrokerTopics(): Observable { - return this.store.pipe(select(notificationsBrokerTopicsObjectSelector())); + public getQualityAssuranceTopics(): Observable { + return this.store.pipe(select(qualityAssuranceTopicsObjectSelector())); } /** - * Returns the information about the loading status of the Notifications Broker topics (if it's running or not). + * Returns the information about the loading status of the Quality Assurance topics (if it's running or not). * * @return Observable * 'true' if the topics are loading, 'false' otherwise. */ - public isNotificationsBrokerTopicsLoading(): Observable { + public isQualityAssuranceTopicsLoading(): Observable { return this.store.pipe( - select(isNotificationsBrokerTopicsLoadedSelector), + select(isQualityAssuranceTopicsLoadedSelector), map((loaded: boolean) => !loaded) ); } /** - * Returns the information about the loading status of the Notifications Broker topics (whether or not they were loaded). + * Returns the information about the loading status of the Quality Assurance topics (whether or not they were loaded). * * @return Observable * 'true' if the topics are loaded, 'false' otherwise. */ - public isNotificationsBrokerTopicsLoaded(): Observable { - return this.store.pipe(select(isNotificationsBrokerTopicsLoadedSelector)); + public isQualityAssuranceTopicsLoaded(): Observable { + return this.store.pipe(select(isQualityAssuranceTopicsLoadedSelector)); } /** - * Returns the information about the processing status of the Notifications Broker topics (if it's running or not). + * Returns the information about the processing status of the Quality Assurance topics (if it's running or not). * * @return Observable * 'true' if there are operations running on the topics (ex.: a REST call), 'false' otherwise. */ - public isNotificationsBrokerTopicsProcessing(): Observable { - return this.store.pipe(select(isNotificationsBrokerTopicsProcessingSelector)); + public isQualityAssuranceTopicsProcessing(): Observable { + return this.store.pipe(select(isQualityAssuranceTopicsProcessingSelector)); } /** - * Returns, from the state, the total available pages of the Notifications Broker topics. + * Returns, from the state, the total available pages of the Quality Assurance topics. * * @return Observable - * The number of the Notifications Broker topics pages. + * The number of the Quality Assurance topics pages. */ - public getNotificationsBrokerTopicsTotalPages(): Observable { - return this.store.pipe(select(getNotificationsBrokerTopicsTotalPagesSelector)); + public getQualityAssuranceTopicsTotalPages(): Observable { + return this.store.pipe(select(getQualityAssuranceTopicsTotalPagesSelector)); } /** - * Returns the current page of the Notifications Broker topics, from the state. + * Returns the current page of the Quality Assurance topics, from the state. * * @return Observable - * The number of the current Notifications Broker topics page. + * The number of the current Quality Assurance topics page. */ - public getNotificationsBrokerTopicsCurrentPage(): Observable { - return this.store.pipe(select(getNotificationsBrokerTopicsCurrentPageSelector)); + public getQualityAssuranceTopicsCurrentPage(): Observable { + return this.store.pipe(select(getQualityAssuranceTopicsCurrentPageSelector)); } /** - * Returns the total number of the Notifications Broker topics. + * Returns the total number of the Quality Assurance topics. * * @return Observable - * The number of the Notifications Broker topics. + * The number of the Quality Assurance topics. */ - public getNotificationsBrokerTopicsTotals(): Observable { - return this.store.pipe(select(getNotificationsBrokerTopicsTotalsSelector)); + public getQualityAssuranceTopicsTotals(): Observable { + return this.store.pipe(select(getQualityAssuranceTopicsTotalsSelector)); } /** - * Dispatch a request to change the Notifications Broker topics state, retrieving the topics from the server. + * Dispatch a request to change the Quality Assurance topics state, retrieving the topics from the server. * * @param elementsPerPage * The number of the topics per page. * @param currentPage * The number of the current page. */ - public dispatchRetrieveNotificationsBrokerTopics(elementsPerPage: number, currentPage: number): void { + public dispatchRetrieveQualityAssuranceTopics(elementsPerPage: number, currentPage: number): void { this.store.dispatch(new RetrieveAllTopicsAction(elementsPerPage, currentPage)); } - // Notifications Broker source + // Quality Assurance source // -------------------------------------------------------------------------- /** - * Returns the list of Notifications Broker source from the state. + * Returns the list of Quality Assurance source from the state. * - * @return Observable - * The list of Notifications Broker source. + * @return Observable + * The list of Quality Assurance source. */ - public getNotificationsBrokerSource(): Observable { - return this.store.pipe(select(notificationsBrokerSourceObjectSelector())); + public getQualityAssuranceSource(): Observable { + return this.store.pipe(select(qualityAssuranceSourceObjectSelector())); } /** - * Returns the information about the loading status of the Notifications Broker source (if it's running or not). + * Returns the information about the loading status of the Quality Assurance source (if it's running or not). * * @return Observable * 'true' if the source are loading, 'false' otherwise. */ - public isNotificationsBrokerSourceLoading(): Observable { + public isQualityAssuranceSourceLoading(): Observable { return this.store.pipe( - select(isNotificationsBrokerSourceLoadedSelector), + select(isQualityAssuranceSourceLoadedSelector), map((loaded: boolean) => !loaded) ); } /** - * Returns the information about the loading status of the Notifications Broker source (whether or not they were loaded). + * Returns the information about the loading status of the Quality Assurance source (whether or not they were loaded). * * @return Observable * 'true' if the source are loaded, 'false' otherwise. */ - public isNotificationsBrokerSourceLoaded(): Observable { - return this.store.pipe(select(isNotificationsBrokerSourceLoadedSelector)); + public isQualityAssuranceSourceLoaded(): Observable { + return this.store.pipe(select(isQualityAssuranceSourceLoadedSelector)); } /** - * Returns the information about the processing status of the Notifications Broker source (if it's running or not). + * Returns the information about the processing status of the Quality Assurance source (if it's running or not). * * @return Observable * 'true' if there are operations running on the source (ex.: a REST call), 'false' otherwise. */ - public isNotificationsBrokerSourceProcessing(): Observable { - return this.store.pipe(select(isNotificationsBrokerSourceProcessingSelector)); + public isQualityAssuranceSourceProcessing(): Observable { + return this.store.pipe(select(isQualityAssuranceSourceProcessingSelector)); } /** - * Returns, from the state, the total available pages of the Notifications Broker source. + * Returns, from the state, the total available pages of the Quality Assurance source. * * @return Observable - * The number of the Notifications Broker source pages. + * The number of the Quality Assurance source pages. */ - public getNotificationsBrokerSourceTotalPages(): Observable { - return this.store.pipe(select(getNotificationsBrokerSourceTotalPagesSelector)); + public getQualityAssuranceSourceTotalPages(): Observable { + return this.store.pipe(select(getQualityAssuranceSourceTotalPagesSelector)); } /** - * Returns the current page of the Notifications Broker source, from the state. + * Returns the current page of the Quality Assurance source, from the state. * * @return Observable - * The number of the current Notifications Broker source page. + * The number of the current Quality Assurance source page. */ - public getNotificationsBrokerSourceCurrentPage(): Observable { - return this.store.pipe(select(getNotificationsBrokerSourceCurrentPageSelector)); + public getQualityAssuranceSourceCurrentPage(): Observable { + return this.store.pipe(select(getQualityAssuranceSourceCurrentPageSelector)); } /** - * Returns the total number of the Notifications Broker source. + * Returns the total number of the Quality Assurance source. * * @return Observable - * The number of the Notifications Broker source. + * The number of the Quality Assurance source. */ - public getNotificationsBrokerSourceTotals(): Observable { - return this.store.pipe(select(getNotificationsBrokerSourceTotalsSelector)); + public getQualityAssuranceSourceTotals(): Observable { + return this.store.pipe(select(getQualityAssuranceSourceTotalsSelector)); } /** - * Dispatch a request to change the Notifications Broker source state, retrieving the source from the server. + * Dispatch a request to change the Quality Assurance source state, retrieving the source from the server. * * @param elementsPerPage * The number of the source per page. * @param currentPage * The number of the current page. */ - public dispatchRetrieveNotificationsBrokerSource(elementsPerPage: number, currentPage: number): void { + public dispatchRetrieveQualityAssuranceSource(elementsPerPage: number, currentPage: number): void { this.store.dispatch(new RetrieveAllSourceAction(elementsPerPage, currentPage)); } } diff --git a/src/app/notifications/notifications.effects.ts b/src/app/notifications/notifications.effects.ts index 39ecded797..bf70a05855 100644 --- a/src/app/notifications/notifications.effects.ts +++ b/src/app/notifications/notifications.effects.ts @@ -1,7 +1,7 @@ -import { NotificationsBrokerSourceEffects } from './broker/source/notifications-broker-source.effects'; -import { NotificationsBrokerTopicsEffects } from './broker/topics/notifications-broker-topics.effects'; +import { QualityAssuranceSourceEffects } from './qa/source/quality-assurance-source.effects'; +import { QualityAssuranceTopicsEffects } from './qa/topics/quality-assurance-topics.effects'; export const notificationsEffects = [ - NotificationsBrokerTopicsEffects, - NotificationsBrokerSourceEffects + QualityAssuranceTopicsEffects, + QualityAssuranceSourceEffects ]; diff --git a/src/app/notifications/notifications.module.ts b/src/app/notifications/notifications.module.ts index 63224fdd81..27e34c8d51 100644 --- a/src/app/notifications/notifications.module.ts +++ b/src/app/notifications/notifications.module.ts @@ -6,20 +6,20 @@ import { EffectsModule } from '@ngrx/effects'; import { CoreModule } from '../core/core.module'; import { SharedModule } from '../shared/shared.module'; import { storeModuleConfig } from '../app.reducer'; -import { NotificationsBrokerTopicsComponent } from './broker/topics/notifications-broker-topics.component'; -import { NotificationsBrokerEventsComponent } from './broker/events/notifications-broker-events.component'; +import { QualityAssuranceTopicsComponent } from './qa/topics/quality-assurance-topics.component'; +import { QualityAssuranceEventsComponent } from './qa/events/quality-assurance-events.component'; import { NotificationsStateService } from './notifications-state.service'; import { notificationsReducers, NotificationsState } from './notifications.reducer'; import { notificationsEffects } from './notifications.effects'; -import { NotificationsBrokerTopicsService } from './broker/topics/notifications-broker-topics.service'; -import { NotificationsBrokerTopicRestService } from '../core/notifications/broker/topics/notifications-broker-topic-rest.service'; -import { NotificationsBrokerEventRestService } from '../core/notifications/broker/events/notifications-broker-event-rest.service'; -import { ProjectEntryImportModalComponent } from './broker/project-entry-import-modal/project-entry-import-modal.component'; +import { QualityAssuranceTopicsService } from './qa/topics/quality-assurance-topics.service'; +import { QualityAssuranceTopicRestService } from '../core/notifications/qa/topics/quality-assurance-topic-rest.service'; +import { QualityAssuranceEventRestService } from '../core/notifications/qa/events/quality-assurance-event-rest.service'; +import { ProjectEntryImportModalComponent } from './qa/project-entry-import-modal/project-entry-import-modal.component'; import { TranslateModule } from '@ngx-translate/core'; import { SearchModule } from '../shared/search/search.module'; -import { NotificationsBrokerSourceComponent } from './broker/source/notifications-broker-source.component'; -import { NotificationsBrokerSourceService } from './broker/source/notifications-broker-source.service'; -import { NotificationsBrokerSourceRestService } from '../core/notifications/broker/source/notifications-broker-source-rest.service'; +import { QualityAssuranceSourceComponent } from './qa/source/quality-assurance-source.component'; +import { QualityAssuranceSourceService } from './qa/source/quality-assurance-source.service'; +import { QualityAssuranceSourceRestService } from '../core/notifications/qa/source/quality-assurance-source-rest.service'; const MODULES = [ CommonModule, @@ -31,9 +31,9 @@ const MODULES = [ ]; const COMPONENTS = [ - NotificationsBrokerTopicsComponent, - NotificationsBrokerEventsComponent, - NotificationsBrokerSourceComponent + QualityAssuranceTopicsComponent, + QualityAssuranceEventsComponent, + QualityAssuranceSourceComponent ]; const DIRECTIVES = [ ]; @@ -44,11 +44,11 @@ const ENTRY_COMPONENTS = [ const PROVIDERS = [ NotificationsStateService, - NotificationsBrokerTopicsService, - NotificationsBrokerSourceService, - NotificationsBrokerTopicRestService, - NotificationsBrokerSourceRestService, - NotificationsBrokerEventRestService + QualityAssuranceTopicsService, + QualityAssuranceSourceService, + QualityAssuranceTopicRestService, + QualityAssuranceSourceRestService, + QualityAssuranceEventRestService ]; @NgModule({ diff --git a/src/app/notifications/notifications.reducer.ts b/src/app/notifications/notifications.reducer.ts index 27bebbea20..5800788c42 100644 --- a/src/app/notifications/notifications.reducer.ts +++ b/src/app/notifications/notifications.reducer.ts @@ -1,18 +1,18 @@ import { ActionReducerMap, createFeatureSelector } from '@ngrx/store'; -import { notificationsBrokerSourceReducer, NotificationsBrokerSourceState } from './broker/source/notifications-broker-source.reducer'; -import { notificationsBrokerTopicsReducer, NotificationsBrokerTopicState, } from './broker/topics/notifications-broker-topics.reducer'; +import { qualityAssuranceSourceReducer, QualityAssuranceSourceState } from './qa/source/quality-assurance-source.reducer'; +import { qualityAssuranceTopicsReducer, QualityAssuranceTopicState, } from './qa/topics/quality-assurance-topics.reducer'; /** * The OpenAIRE State */ export interface NotificationsState { - 'brokerTopic': NotificationsBrokerTopicState; - 'brokerSource': NotificationsBrokerSourceState; + 'brokerTopic': QualityAssuranceTopicState; + 'brokerSource': QualityAssuranceSourceState; } export const notificationsReducers: ActionReducerMap = { - brokerTopic: notificationsBrokerTopicsReducer, - brokerSource: notificationsBrokerSourceReducer + brokerTopic: qualityAssuranceTopicsReducer, + brokerSource: qualityAssuranceSourceReducer }; export const notificationsSelector = createFeatureSelector('notifications'); diff --git a/src/app/notifications/broker/events/notifications-broker-events.component.html b/src/app/notifications/qa/events/quality-assurance-events.component.html similarity index 98% rename from src/app/notifications/broker/events/notifications-broker-events.component.html rename to src/app/notifications/qa/events/quality-assurance-events.component.html index a9f51cefd0..40fa75943f 100644 --- a/src/app/notifications/broker/events/notifications-broker-events.component.html +++ b/src/app/notifications/qa/events/quality-assurance-events.component.html @@ -4,7 +4,7 @@

{{'notifications.events.title'| translate}}

{{'notifications.broker.events.description'| translate}}

- + {{'notifications.broker.events.back' | translate}} @@ -23,7 +23,7 @@ [paginationOptions]="paginationConfig" [collectionSize]="(totalElements$ | async)" [sortOptions]="paginationSortConfig" - (paginationChange)="getNotificationsBrokerEvents()"> + (paginationChange)="getQualityAssuranceEvents()"> @@ -140,7 +140,7 @@

- + {{'notifications.broker.events.back' | translate}} diff --git a/src/app/notifications/broker/events/notifications-broker-events.component.spec.ts b/src/app/notifications/qa/events/quality-assurance-events.component.spec.ts similarity index 66% rename from src/app/notifications/broker/events/notifications-broker-events.component.spec.ts rename to src/app/notifications/qa/events/quality-assurance-events.component.spec.ts index 40be083567..976d8540e3 100644 --- a/src/app/notifications/broker/events/notifications-broker-events.component.spec.ts +++ b/src/app/notifications/qa/events/quality-assurance-events.component.spec.ts @@ -5,15 +5,15 @@ import { ComponentFixture, inject, TestBed, waitForAsync } from '@angular/core/t import { TranslateModule, TranslateService } from '@ngx-translate/core'; import { NgbModal } from '@ng-bootstrap/ng-bootstrap'; import { of as observableOf } from 'rxjs'; -import { NotificationsBrokerEventRestService } from '../../../core/notifications/broker/events/notifications-broker-event-rest.service'; -import { NotificationsBrokerEventsComponent } from './notifications-broker-events.component'; +import { QualityAssuranceEventRestService } from '../../../core/notifications/qa/events/quality-assurance-event-rest.service'; +import { QualityAssuranceEventsComponent } from './quality-assurance-events.component'; import { - getMockNotificationsBrokerEventRestService, + getMockQualityAssuranceEventRestService, ItemMockPid10, ItemMockPid8, ItemMockPid9, - notificationsBrokerEventObjectMissingProjectFound, - notificationsBrokerEventObjectMissingProjectNotFound, + qualityAssuranceEventObjectMissingProjectFound, + qualityAssuranceEventObjectMissingProjectNotFound, NotificationsMockDspaceObject } from '../../../shared/mocks/notifications.mock'; import { NotificationsServiceStub } from '../../../shared/testing/notifications-service.stub'; @@ -22,8 +22,8 @@ import { getMockTranslateService } from '../../../shared/mocks/translate.service import { createTestComponent } from '../../../shared/testing/utils.test'; import { ActivatedRouteStub } from '../../../shared/testing/active-router.stub'; import { PaginationComponentOptions } from '../../../shared/pagination/pagination-component-options.model'; -import { NotificationsBrokerEventObject } from '../../../core/notifications/broker/models/notifications-broker-event.model'; -import { NotificationsBrokerEventData } from '../project-entry-import-modal/project-entry-import-modal.component'; +import { QualityAssuranceEventObject } from '../../../core/notifications/qa/models/quality-assurance-event.model'; +import { QualityAssuranceEventData } from '../project-entry-import-modal/project-entry-import-modal.component'; import { TestScheduler } from 'rxjs/testing'; import { getTestScheduler } from 'jasmine-marbles'; import { followLink } from '../../../shared/utils/follow-link-config.model'; @@ -34,14 +34,14 @@ import { createSuccessfulRemoteDataObject, createSuccessfulRemoteDataObject$ } from '../../../shared/remote-data.utils'; -import { FindListOptions } from '../../../core/data/request.models'; import { SortDirection, SortOptions } from '../../../core/cache/models/sort-options.model'; import { PaginationService } from '../../../core/pagination/pagination.service'; import { PaginationServiceStub } from '../../../shared/testing/pagination-service.stub'; +import {FindListOptions} from '../../../core/data/find-list-options.model'; -describe('NotificationsBrokerEventsComponent test suite', () => { - let fixture: ComponentFixture; - let comp: NotificationsBrokerEventsComponent; +describe('QualityAssuranceEventsComponent test suite', () => { + let fixture: ComponentFixture; + let comp: QualityAssuranceEventsComponent; let compAsAny: any; let scheduler: TestScheduler; @@ -50,9 +50,9 @@ describe('NotificationsBrokerEventsComponent test suite', () => { close: () => null, dismiss: () => null }; - const notificationsBrokerEventRestServiceStub: any = getMockNotificationsBrokerEventRestService(); + const qualityAssuranceEventRestServiceStub: any = getMockQualityAssuranceEventRestService(); const activatedRouteParams = { - notificationsBrokerEventsParams: { + qualityAssuranceEventsParams: { currentPage: 0, pageSize: 10 } @@ -61,19 +61,19 @@ describe('NotificationsBrokerEventsComponent test suite', () => { id: 'ENRICH!MISSING!PROJECT' }; - const events: NotificationsBrokerEventObject[] = [ - notificationsBrokerEventObjectMissingProjectFound, - notificationsBrokerEventObjectMissingProjectNotFound + const events: QualityAssuranceEventObject[] = [ + qualityAssuranceEventObjectMissingProjectFound, + qualityAssuranceEventObjectMissingProjectNotFound ]; const paginationService = new PaginationServiceStub(); - function getNotificationsBrokerEventData1(): NotificationsBrokerEventData { + function getQualityAssuranceEventData1(): QualityAssuranceEventData { return { - event: notificationsBrokerEventObjectMissingProjectFound, - id: notificationsBrokerEventObjectMissingProjectFound.id, - title: notificationsBrokerEventObjectMissingProjectFound.title, + event: qualityAssuranceEventObjectMissingProjectFound, + id: qualityAssuranceEventObjectMissingProjectFound.id, + title: qualityAssuranceEventObjectMissingProjectFound.title, hasProject: true, - projectTitle: notificationsBrokerEventObjectMissingProjectFound.message.title, + projectTitle: qualityAssuranceEventObjectMissingProjectFound.message.title, projectId: ItemMockPid10.id, handle: ItemMockPid10.handle, reason: null, @@ -82,11 +82,11 @@ describe('NotificationsBrokerEventsComponent test suite', () => { }; } - function getNotificationsBrokerEventData2(): NotificationsBrokerEventData { + function getQualityAssuranceEventData2(): QualityAssuranceEventData { return { - event: notificationsBrokerEventObjectMissingProjectNotFound, - id: notificationsBrokerEventObjectMissingProjectNotFound.id, - title: notificationsBrokerEventObjectMissingProjectNotFound.title, + event: qualityAssuranceEventObjectMissingProjectNotFound, + id: qualityAssuranceEventObjectMissingProjectNotFound.id, + title: qualityAssuranceEventObjectMissingProjectNotFound.title, hasProject: false, projectTitle: null, projectId: null, @@ -104,17 +104,17 @@ describe('NotificationsBrokerEventsComponent test suite', () => { TranslateModule.forRoot(), ], declarations: [ - NotificationsBrokerEventsComponent, + QualityAssuranceEventsComponent, TestComponent, ], providers: [ { provide: ActivatedRoute, useValue: new ActivatedRouteStub(activatedRouteParamsMap, activatedRouteParams) }, - { provide: NotificationsBrokerEventRestService, useValue: notificationsBrokerEventRestServiceStub }, + { provide: QualityAssuranceEventRestService, useValue: qualityAssuranceEventRestServiceStub }, { provide: NgbModal, useValue: modalStub }, { provide: NotificationsService, useValue: new NotificationsServiceStub() }, { provide: TranslateService, useValue: getMockTranslateService() }, { provide: PaginationService, useValue: paginationService }, - NotificationsBrokerEventsComponent + QualityAssuranceEventsComponent ], schemas: [NO_ERRORS_SCHEMA] }).compileComponents().then(); @@ -129,7 +129,7 @@ describe('NotificationsBrokerEventsComponent test suite', () => { // synchronous beforeEach beforeEach(() => { const html = ` - `; + `; testFixture = createTestComponent(html, TestComponent) as ComponentFixture; testComp = testFixture.componentInstance; }); @@ -138,14 +138,14 @@ describe('NotificationsBrokerEventsComponent test suite', () => { testFixture.destroy(); }); - it('should create NotificationsBrokerEventsComponent', inject([NotificationsBrokerEventsComponent], (app: NotificationsBrokerEventsComponent) => { + it('should create QualityAssuranceEventsComponent', inject([QualityAssuranceEventsComponent], (app: QualityAssuranceEventsComponent) => { expect(app).toBeDefined(); })); }); describe('Main tests', () => { beforeEach(() => { - fixture = TestBed.createComponent(NotificationsBrokerEventsComponent); + fixture = TestBed.createComponent(QualityAssuranceEventsComponent); comp = fixture.componentInstance; compAsAny = comp; }); @@ -159,8 +159,8 @@ describe('NotificationsBrokerEventsComponent test suite', () => { describe('setEventUpdated', () => { it('should update events', () => { const expected = [ - getNotificationsBrokerEventData1(), - getNotificationsBrokerEventData2() + getQualityAssuranceEventData1(), + getQualityAssuranceEventData2() ]; scheduler.schedule(() => { compAsAny.setEventUpdated(events); @@ -179,14 +179,14 @@ describe('NotificationsBrokerEventsComponent test suite', () => { it('should call executeAction if a project is present', () => { const action = 'ACCEPTED'; - comp.modalChoice(action, getNotificationsBrokerEventData1(), modalStub); - expect(comp.executeAction).toHaveBeenCalledWith(action, getNotificationsBrokerEventData1()); + comp.modalChoice(action, getQualityAssuranceEventData1(), modalStub); + expect(comp.executeAction).toHaveBeenCalledWith(action, getQualityAssuranceEventData1()); }); it('should call openModal if a project is not present', () => { const action = 'ACCEPTED'; - comp.modalChoice(action, getNotificationsBrokerEventData2(), modalStub); - expect(comp.openModal).toHaveBeenCalledWith(action, getNotificationsBrokerEventData2(), modalStub); + comp.modalChoice(action, getQualityAssuranceEventData2(), modalStub); + expect(comp.openModal).toHaveBeenCalledWith(action, getQualityAssuranceEventData2(), modalStub); }); }); @@ -197,7 +197,7 @@ describe('NotificationsBrokerEventsComponent test suite', () => { spyOn(compAsAny.modalService, 'open').and.returnValue({ result: new Promise((res, rej) => 'do' ) }); spyOn(comp, 'executeAction'); - comp.openModal(action, getNotificationsBrokerEventData1(), modalStub); + comp.openModal(action, getQualityAssuranceEventData1(), modalStub); expect(compAsAny.modalService.open).toHaveBeenCalled(); }); }); @@ -217,7 +217,7 @@ describe('NotificationsBrokerEventsComponent test suite', () => { } ); scheduler.schedule(() => { - comp.openModalLookup(getNotificationsBrokerEventData1()); + comp.openModalLookup(getQualityAssuranceEventData1()); }); scheduler.flush(); @@ -227,27 +227,27 @@ describe('NotificationsBrokerEventsComponent test suite', () => { }); describe('executeAction', () => { - it('should call getNotificationsBrokerEvents on 200 response from REST', () => { + it('should call getQualityAssuranceEvents on 200 response from REST', () => { const action = 'ACCEPTED'; - spyOn(compAsAny, 'getNotificationsBrokerEvents'); - notificationsBrokerEventRestServiceStub.patchEvent.and.returnValue(createSuccessfulRemoteDataObject$({})); + spyOn(compAsAny, 'getQualityAssuranceEvents'); + qualityAssuranceEventRestServiceStub.patchEvent.and.returnValue(createSuccessfulRemoteDataObject$({})); scheduler.schedule(() => { - comp.executeAction(action, getNotificationsBrokerEventData1()); + comp.executeAction(action, getQualityAssuranceEventData1()); }); scheduler.flush(); - expect(compAsAny.getNotificationsBrokerEvents).toHaveBeenCalled(); + expect(compAsAny.getQualityAssuranceEvents).toHaveBeenCalled(); }); }); describe('boundProject', () => { it('should populate the project data inside "eventData"', () => { - const eventData = getNotificationsBrokerEventData2(); + const eventData = getQualityAssuranceEventData2(); const projectId = 'UUID-23943-34u43-38344'; const projectName = 'Test Project'; const projectHandle = '1000/1000'; - notificationsBrokerEventRestServiceStub.boundProject.and.returnValue(createSuccessfulRemoteDataObject$({})); + qualityAssuranceEventRestServiceStub.boundProject.and.returnValue(createSuccessfulRemoteDataObject$({})); scheduler.schedule(() => { comp.boundProject(eventData, projectId, projectName, projectHandle); @@ -263,8 +263,8 @@ describe('NotificationsBrokerEventsComponent test suite', () => { describe('removeProject', () => { it('should remove the project data inside "eventData"', () => { - const eventData = getNotificationsBrokerEventData1(); - notificationsBrokerEventRestServiceStub.removeProject.and.returnValue(createNoContentRemoteDataObject$()); + const eventData = getQualityAssuranceEventData1(); + qualityAssuranceEventRestServiceStub.removeProject.and.returnValue(createNoContentRemoteDataObject$()); scheduler.schedule(() => { comp.removeProject(eventData); @@ -278,8 +278,8 @@ describe('NotificationsBrokerEventsComponent test suite', () => { }); }); - describe('getNotificationsBrokerEvents', () => { - it('should call the "notificationsBrokerEventRestService.getEventsByTopic" to take data and "setEventUpdated" to populate eventData', () => { + describe('getQualityAssuranceEvents', () => { + it('should call the "qualityAssuranceEventRestService.getEventsByTopic" to take data and "setEventUpdated" to populate eventData', () => { comp.paginationConfig = new PaginationComponentOptions(); comp.paginationConfig.currentPage = 1; comp.paginationConfig.pageSize = 20; @@ -297,20 +297,20 @@ describe('NotificationsBrokerEventsComponent test suite', () => { currentPage: comp.paginationConfig.currentPage }); const array = [ - notificationsBrokerEventObjectMissingProjectFound, - notificationsBrokerEventObjectMissingProjectNotFound, + qualityAssuranceEventObjectMissingProjectFound, + qualityAssuranceEventObjectMissingProjectNotFound, ]; const paginatedList = buildPaginatedList(pageInfo, array); const paginatedListRD = createSuccessfulRemoteDataObject(paginatedList); - notificationsBrokerEventRestServiceStub.getEventsByTopic.and.returnValue(observableOf(paginatedListRD)); + qualityAssuranceEventRestServiceStub.getEventsByTopic.and.returnValue(observableOf(paginatedListRD)); spyOn(compAsAny, 'setEventUpdated'); scheduler.schedule(() => { - compAsAny.getNotificationsBrokerEvents(); + compAsAny.getQualityAssuranceEvents(); }); scheduler.flush(); - expect(compAsAny.notificationsBrokerEventRestService.getEventsByTopic).toHaveBeenCalledWith( + expect(compAsAny.qualityAssuranceEventRestService.getEventsByTopic).toHaveBeenCalledWith( activatedRouteParamsMap.id, options, followLink('target'),followLink('related') diff --git a/src/app/notifications/broker/events/notifications-broker-events.component.ts b/src/app/notifications/qa/events/quality-assurance-events.component.ts similarity index 74% rename from src/app/notifications/broker/events/notifications-broker-events.component.ts rename to src/app/notifications/qa/events/quality-assurance-events.component.ts index 7639554c55..aa47bfc590 100644 --- a/src/app/notifications/broker/events/notifications-broker-events.component.ts +++ b/src/app/notifications/qa/events/quality-assurance-events.component.ts @@ -9,12 +9,11 @@ import { distinctUntilChanged, map, mergeMap, scan, switchMap, take } from 'rxjs import { SortDirection, SortOptions } from '../../../core/cache/models/sort-options.model'; import { PaginatedList } from '../../../core/data/paginated-list.model'; import { RemoteData } from '../../../core/data/remote-data'; -import { FindListOptions } from '../../../core/data/request.models'; import { - NotificationsBrokerEventObject, + QualityAssuranceEventObject, OpenaireBrokerEventMessageObject -} from '../../../core/notifications/broker/models/notifications-broker-event.model'; -import { NotificationsBrokerEventRestService } from '../../../core/notifications/broker/events/notifications-broker-event-rest.service'; +} from '../../../core/notifications/qa/models/quality-assurance-event.model'; +import { QualityAssuranceEventRestService } from '../../../core/notifications/qa/events/quality-assurance-event-rest.service'; import { PaginationComponentOptions } from '../../../shared/pagination/pagination-component-options.model'; import { Metadata } from '../../../core/shared/metadata.utils'; import { followLink } from '../../../shared/utils/follow-link-config.model'; @@ -22,23 +21,24 @@ import { hasValue } from '../../../shared/empty.util'; import { ItemSearchResult } from '../../../shared/object-collection/shared/item-search-result.model'; import { NotificationsService } from '../../../shared/notifications/notifications.service'; import { - NotificationsBrokerEventData, + QualityAssuranceEventData, ProjectEntryImportModalComponent } from '../project-entry-import-modal/project-entry-import-modal.component'; import { getFirstCompletedRemoteData } from '../../../core/shared/operators'; import { PaginationService } from '../../../core/pagination/pagination.service'; import { combineLatest } from 'rxjs/internal/observable/combineLatest'; import { Item } from '../../../core/shared/item.model'; +import {FindListOptions} from '../../../core/data/find-list-options.model'; /** - * Component to display the Notifications Broker event list. + * Component to display the Quality Assurance event list. */ @Component({ - selector: 'ds-notifications-broker-events', - templateUrl: './notifications-broker-events.component.html', - styleUrls: ['./notifications-broker-events.scomponent.scss'], + selector: 'ds-quality-assurance-events', + templateUrl: './quality-assurance-events.component.html', + styleUrls: ['./quality-assurance-events.scomponent.scss'], }) -export class NotificationsBrokerEventsComponent implements OnInit { +export class QualityAssuranceEventsComponent implements OnInit { /** * The pagination system configuration for HTML listing. * @type {PaginationComponentOptions} @@ -50,27 +50,27 @@ export class NotificationsBrokerEventsComponent implements OnInit { pageSizeOptions: [5, 10, 20, 40, 60] }); /** - * The Notifications Broker event list sort options. + * The Quality Assurance event list sort options. * @type {SortOptions} */ public paginationSortConfig: SortOptions = new SortOptions('trust', SortDirection.DESC); /** - * Array to save the presence of a project inside an Notifications Broker event. - * @type {NotificationsBrokerEventData[]>} + * Array to save the presence of a project inside an Quality Assurance event. + * @type {QualityAssuranceEventData[]>} */ - public eventsUpdated$: BehaviorSubject = new BehaviorSubject([]); + public eventsUpdated$: BehaviorSubject = new BehaviorSubject([]); /** - * The total number of Notifications Broker events. + * The total number of Quality Assurance events. * @type {Observable} */ public totalElements$: Observable; /** - * The topic of the Notifications Broker events; suitable for displaying. + * The topic of the Quality Assurance events; suitable for displaying. * @type {string} */ public showTopic: string; /** - * The topic of the Notifications Broker events; suitable for HTTP calls. + * The topic of the Quality Assurance events; suitable for HTTP calls. * @type {string} */ public topic: string; @@ -114,7 +114,7 @@ export class NotificationsBrokerEventsComponent implements OnInit { * @param {ActivatedRoute} activatedRoute * @param {NgbModal} modalService * @param {NotificationsService} notificationsService - * @param {NotificationsBrokerEventRestService} notificationsBrokerEventRestService + * @param {QualityAssuranceEventRestService} qualityAssuranceEventRestService * @param {PaginationService} paginationService * @param {TranslateService} translateService */ @@ -122,7 +122,7 @@ export class NotificationsBrokerEventsComponent implements OnInit { private activatedRoute: ActivatedRoute, private modalService: NgbModal, private notificationsService: NotificationsService, - private notificationsBrokerEventRestService: NotificationsBrokerEventRestService, + private qualityAssuranceEventRestService: QualityAssuranceEventRestService, private paginationService: PaginationService, private translateService: TranslateService ) { @@ -142,7 +142,7 @@ export class NotificationsBrokerEventsComponent implements OnInit { this.showTopic = id.replace(regEx, '/'); this.topic = id; this.isEventPageLoading.next(false); - this.getNotificationsBrokerEvents(); + this.getQualityAssuranceEvents(); }); } @@ -162,12 +162,12 @@ export class NotificationsBrokerEventsComponent implements OnInit { * * @param {string} action * the action (can be: ACCEPTED, REJECTED, DISCARDED, PENDING) - * @param {NotificationsBrokerEventData} eventData - * the Notifications Broker event data + * @param {QualityAssuranceEventData} eventData + * the Quality Assurance event data * @param {any} content * Reference to the modal */ - public modalChoice(action: string, eventData: NotificationsBrokerEventData, content: any): void { + public modalChoice(action: string, eventData: QualityAssuranceEventData, content: any): void { if (eventData.hasProject) { this.executeAction(action, eventData); } else { @@ -180,12 +180,12 @@ export class NotificationsBrokerEventsComponent implements OnInit { * * @param {string} action * the action (can be: ACCEPTED, REJECTED, DISCARDED, PENDING) - * @param {NotificationsBrokerEventData} eventData - * the Notifications Broker event data + * @param {QualityAssuranceEventData} eventData + * the Quality Assurance event data * @param {any} content * Reference to the modal */ - public openModal(action: string, eventData: NotificationsBrokerEventData, content: any): void { + public openModal(action: string, eventData: QualityAssuranceEventData, content: any): void { this.modalService.open(content, { ariaLabelledBy: 'modal-basic-title' }).result.then( (result) => { if (result === 'do') { @@ -203,10 +203,10 @@ export class NotificationsBrokerEventsComponent implements OnInit { /** * Open a modal where the user can select the project. * - * @param {NotificationsBrokerEventData} eventData - * the Notifications Broker event item data + * @param {QualityAssuranceEventData} eventData + * the Quality Assurance event item data */ - public openModalLookup(eventData: NotificationsBrokerEventData): void { + public openModalLookup(eventData: QualityAssuranceEventData): void { this.modalRef = this.modalService.open(ProjectEntryImportModalComponent, { size: 'lg' }); @@ -232,19 +232,19 @@ export class NotificationsBrokerEventsComponent implements OnInit { * * @param {string} action * the action (can be: ACCEPTED, REJECTED, DISCARDED, PENDING) - * @param {NotificationsBrokerEventData} eventData - * the Notifications Broker event data + * @param {QualityAssuranceEventData} eventData + * the Quality Assurance event data */ - public executeAction(action: string, eventData: NotificationsBrokerEventData): void { + public executeAction(action: string, eventData: QualityAssuranceEventData): void { eventData.isRunning = true; this.subs.push( - this.notificationsBrokerEventRestService.patchEvent(action, eventData.event, eventData.reason).pipe(getFirstCompletedRemoteData()) - .subscribe((rd: RemoteData) => { + this.qualityAssuranceEventRestService.patchEvent(action, eventData.event, eventData.reason).pipe(getFirstCompletedRemoteData()) + .subscribe((rd: RemoteData) => { if (rd.isSuccess && rd.statusCode === 200) { this.notificationsService.success( this.translateService.instant('notifications.broker.event.action.saved') ); - this.getNotificationsBrokerEvents(); + this.getQualityAssuranceEvents(); } else { this.notificationsService.error( this.translateService.instant('notifications.broker.event.action.error') @@ -256,10 +256,10 @@ export class NotificationsBrokerEventsComponent implements OnInit { } /** - * Bound a project to the publication described in the Notifications Broker event calling the REST service. + * Bound a project to the publication described in the Quality Assurance event calling the REST service. * - * @param {NotificationsBrokerEventData} eventData - * the Notifications Broker event item data + * @param {QualityAssuranceEventData} eventData + * the Quality Assurance event item data * @param {string} projectId * the project Id to bound * @param {string} projectTitle @@ -267,11 +267,11 @@ export class NotificationsBrokerEventsComponent implements OnInit { * @param {string} projectHandle * the project handle */ - public boundProject(eventData: NotificationsBrokerEventData, projectId: string, projectTitle: string, projectHandle: string): void { + public boundProject(eventData: QualityAssuranceEventData, projectId: string, projectTitle: string, projectHandle: string): void { eventData.isRunning = true; this.subs.push( - this.notificationsBrokerEventRestService.boundProject(eventData.id, projectId).pipe(getFirstCompletedRemoteData()) - .subscribe((rd: RemoteData) => { + this.qualityAssuranceEventRestService.boundProject(eventData.id, projectId).pipe(getFirstCompletedRemoteData()) + .subscribe((rd: RemoteData) => { if (rd.isSuccess) { this.notificationsService.success( this.translateService.instant('notifications.broker.event.project.bounded') @@ -291,16 +291,16 @@ export class NotificationsBrokerEventsComponent implements OnInit { } /** - * Remove the bounded project from the publication described in the Notifications Broker event calling the REST service. + * Remove the bounded project from the publication described in the Quality Assurance event calling the REST service. * - * @param {NotificationsBrokerEventData} eventData - * the Notifications Broker event data + * @param {QualityAssuranceEventData} eventData + * the Quality Assurance event data */ - public removeProject(eventData: NotificationsBrokerEventData): void { + public removeProject(eventData: QualityAssuranceEventData): void { eventData.isRunning = true; this.subs.push( - this.notificationsBrokerEventRestService.removeProject(eventData.id).pipe(getFirstCompletedRemoteData()) - .subscribe((rd: RemoteData) => { + this.qualityAssuranceEventRestService.removeProject(eventData.id).pipe(getFirstCompletedRemoteData()) + .subscribe((rd: RemoteData) => { if (rd.isSuccess) { this.notificationsService.success( this.translateService.instant('notifications.broker.event.project.removed') @@ -337,26 +337,26 @@ export class NotificationsBrokerEventsComponent implements OnInit { /** - * Dispatch the Notifications Broker events retrival. + * Dispatch the Quality Assurance events retrival. */ - public getNotificationsBrokerEvents(): void { + public getQualityAssuranceEvents(): void { this.paginationService.getFindListOptions(this.paginationConfig.id, this.defaultConfig).pipe( distinctUntilChanged(), - switchMap((options: FindListOptions) => this.notificationsBrokerEventRestService.getEventsByTopic( + switchMap((options: FindListOptions) => this.qualityAssuranceEventRestService.getEventsByTopic( this.topic, options, followLink('target'), followLink('related') )), getFirstCompletedRemoteData(), - ).subscribe((rd: RemoteData>) => { + ).subscribe((rd: RemoteData>) => { if (rd.hasSucceeded) { this.isEventLoading.next(false); this.totalElements$ = observableOf(rd.payload.totalElements); this.setEventUpdated(rd.payload.page); } else { - throw new Error('Can\'t retrieve Notifications Broker events from the Broker events REST service'); + throw new Error('Can\'t retrieve Quality Assurance events from the Broker events REST service'); } - this.notificationsBrokerEventRestService.clearFindByTopicRequests(); + this.qualityAssuranceEventRestService.clearFindByTopicRequests(); }); } @@ -370,15 +370,15 @@ export class NotificationsBrokerEventsComponent implements OnInit { } /** - * Set the project status for the Notifications Broker events. + * Set the project status for the Quality Assurance events. * - * @param {NotificationsBrokerEventObject[]} events - * the Notifications Broker event item + * @param {QualityAssuranceEventObject[]} events + * the Quality Assurance event item */ - protected setEventUpdated(events: NotificationsBrokerEventObject[]): void { + protected setEventUpdated(events: QualityAssuranceEventObject[]): void { this.subs.push( from(events).pipe( - mergeMap((event: NotificationsBrokerEventObject) => { + mergeMap((event: QualityAssuranceEventObject) => { const related$ = event.related.pipe( getFirstCompletedRemoteData(), ); @@ -387,7 +387,7 @@ export class NotificationsBrokerEventsComponent implements OnInit { ); return combineLatest([related$, target$]).pipe( map(([relatedItemRD, targetItemRD]: [RemoteData, RemoteData]) => { - const data: NotificationsBrokerEventData = { + const data: QualityAssuranceEventData = { event: event, id: event.id, title: event.title, diff --git a/src/app/notifications/broker/events/notifications-broker-events.scomponent.scss b/src/app/notifications/qa/events/quality-assurance-events.scomponent.scss similarity index 100% rename from src/app/notifications/broker/events/notifications-broker-events.scomponent.scss rename to src/app/notifications/qa/events/quality-assurance-events.scomponent.scss diff --git a/src/app/notifications/broker/project-entry-import-modal/project-entry-import-modal.component.html b/src/app/notifications/qa/project-entry-import-modal/project-entry-import-modal.component.html similarity index 100% rename from src/app/notifications/broker/project-entry-import-modal/project-entry-import-modal.component.html rename to src/app/notifications/qa/project-entry-import-modal/project-entry-import-modal.component.html diff --git a/src/app/notifications/broker/project-entry-import-modal/project-entry-import-modal.component.scss b/src/app/notifications/qa/project-entry-import-modal/project-entry-import-modal.component.scss similarity index 100% rename from src/app/notifications/broker/project-entry-import-modal/project-entry-import-modal.component.scss rename to src/app/notifications/qa/project-entry-import-modal/project-entry-import-modal.component.scss diff --git a/src/app/notifications/broker/project-entry-import-modal/project-entry-import-modal.component.spec.ts b/src/app/notifications/qa/project-entry-import-modal/project-entry-import-modal.component.spec.ts similarity index 95% rename from src/app/notifications/broker/project-entry-import-modal/project-entry-import-modal.component.spec.ts rename to src/app/notifications/qa/project-entry-import-modal/project-entry-import-modal.component.spec.ts index 7cac576844..42a57c2ac5 100644 --- a/src/app/notifications/broker/project-entry-import-modal/project-entry-import-modal.component.spec.ts +++ b/src/app/notifications/qa/project-entry-import-modal/project-entry-import-modal.component.spec.ts @@ -17,16 +17,16 @@ import { buildPaginatedList } from '../../../core/data/paginated-list.model'; import { PageInfo } from '../../../core/shared/page-info.model'; import { ItemMockPid10, - notificationsBrokerEventObjectMissingProjectFound, + qualityAssuranceEventObjectMissingProjectFound, NotificationsMockDspaceObject } from '../../../shared/mocks/notifications.mock'; const eventData = { - event: notificationsBrokerEventObjectMissingProjectFound, - id: notificationsBrokerEventObjectMissingProjectFound.id, - title: notificationsBrokerEventObjectMissingProjectFound.title, + event: qualityAssuranceEventObjectMissingProjectFound, + id: qualityAssuranceEventObjectMissingProjectFound.id, + title: qualityAssuranceEventObjectMissingProjectFound.title, hasProject: true, - projectTitle: notificationsBrokerEventObjectMissingProjectFound.message.title, + projectTitle: qualityAssuranceEventObjectMissingProjectFound.message.title, projectId: ItemMockPid10.id, handle: ItemMockPid10.handle, reason: null, diff --git a/src/app/notifications/broker/project-entry-import-modal/project-entry-import-modal.component.ts b/src/app/notifications/qa/project-entry-import-modal/project-entry-import-modal.component.ts similarity index 94% rename from src/app/notifications/broker/project-entry-import-modal/project-entry-import-modal.component.ts rename to src/app/notifications/qa/project-entry-import-modal/project-entry-import-modal.component.ts index 64672fa1fa..64a5f6908f 100644 --- a/src/app/notifications/broker/project-entry-import-modal/project-entry-import-modal.component.ts +++ b/src/app/notifications/qa/project-entry-import-modal/project-entry-import-modal.component.ts @@ -13,10 +13,10 @@ import { PaginationComponentOptions } from '../../../shared/pagination/paginatio import { SearchService } from '../../../core/shared/search/search.service'; import { DSpaceObject } from '../../../core/shared/dspace-object.model'; import { - NotificationsBrokerEventObject, - NotificationsBrokerEventMessageObject, + QualityAssuranceEventObject, + QualityAssuranceEventMessageObject, OpenaireBrokerEventMessageObject, -} from '../../../core/notifications/broker/models/notifications-broker-event.model'; +} from '../../../core/notifications/qa/models/quality-assurance-event.model'; import { hasValue, isNotEmpty } from '../../../shared/empty.util'; import { Item } from '../../../core/shared/item.model'; @@ -34,13 +34,13 @@ export enum ImportType { /** * The data type passed from the parent page */ -export interface NotificationsBrokerEventData { +export interface QualityAssuranceEventData { /** - * The Notifications Broker event + * The Quality Assurance event */ - event: NotificationsBrokerEventObject; + event: QualityAssuranceEventObject; /** - * The Notifications Broker event Id (uuid) + * The Quality Assurance event Id (uuid) */ id: string; /** @@ -83,14 +83,14 @@ export interface NotificationsBrokerEventData { templateUrl: './project-entry-import-modal.component.html' }) /** - * Component to display a modal window for linking a project to an Notifications Broker event + * Component to display a modal window for linking a project to an Quality Assurance event * Shows information about the selected project and a selectable list. */ export class ProjectEntryImportModalComponent implements OnInit { /** * The external source entry */ - @Input() externalSourceEntry: NotificationsBrokerEventData; + @Input() externalSourceEntry: QualityAssuranceEventData; /** * The number of results per page */ diff --git a/src/app/notifications/broker/source/notifications-broker-source.actions.ts b/src/app/notifications/qa/source/quality-assurance-source.actions.ts similarity index 62% rename from src/app/notifications/broker/source/notifications-broker-source.actions.ts rename to src/app/notifications/qa/source/quality-assurance-source.actions.ts index a3fd9240c8..7a22e7a9ae 100644 --- a/src/app/notifications/broker/source/notifications-broker-source.actions.ts +++ b/src/app/notifications/qa/source/quality-assurance-source.actions.ts @@ -1,6 +1,6 @@ import { Action } from '@ngrx/store'; import { type } from '../../../shared/ngrx/type'; -import { NotificationsBrokerSourceObject } from '../../../core/notifications/broker/models/notifications-broker-source.model'; +import { QualityAssuranceSourceObject } from '../../../core/notifications/qa/models/quality-assurance-source.model'; /** * For each action type in an action group, make a simple @@ -10,19 +10,19 @@ import { NotificationsBrokerSourceObject } from '../../../core/notifications/bro * literal types and runs a simple check to guarantee all * action types in the application are unique. */ -export const NotificationsBrokerSourceActionTypes = { - ADD_SOURCE: type('dspace/integration/notifications/broker/ADD_SOURCE'), - RETRIEVE_ALL_SOURCE: type('dspace/integration/notifications/broker/RETRIEVE_ALL_SOURCE'), - RETRIEVE_ALL_SOURCE_ERROR: type('dspace/integration/notifications/broker/RETRIEVE_ALL_SOURCE_ERROR'), +export const QualityAssuranceSourceActionTypes = { + ADD_SOURCE: type('dspace/integration/notifications/qa/ADD_SOURCE'), + RETRIEVE_ALL_SOURCE: type('dspace/integration/notifications/qa/RETRIEVE_ALL_SOURCE'), + RETRIEVE_ALL_SOURCE_ERROR: type('dspace/integration/notifications/qa/RETRIEVE_ALL_SOURCE_ERROR'), }; /* tslint:disable:max-classes-per-file */ /** - * An ngrx action to retrieve all the Notifications Broker source. + * An ngrx action to retrieve all the Quality Assurance source. */ export class RetrieveAllSourceAction implements Action { - type = NotificationsBrokerSourceActionTypes.RETRIEVE_ALL_SOURCE; + type = QualityAssuranceSourceActionTypes.RETRIEVE_ALL_SOURCE; payload: { elementsPerPage: number; currentPage: number; @@ -45,20 +45,20 @@ export class RetrieveAllSourceAction implements Action { } /** - * An ngrx action for retrieving 'all Notifications Broker source' error. + * An ngrx action for retrieving 'all Quality Assurance source' error. */ export class RetrieveAllSourceErrorAction implements Action { - type = NotificationsBrokerSourceActionTypes.RETRIEVE_ALL_SOURCE_ERROR; + type = QualityAssuranceSourceActionTypes.RETRIEVE_ALL_SOURCE_ERROR; } /** - * An ngrx action to load the Notifications Broker source objects. + * An ngrx action to load the Quality Assurance source objects. * Called by the ??? effect. */ export class AddSourceAction implements Action { - type = NotificationsBrokerSourceActionTypes.ADD_SOURCE; + type = QualityAssuranceSourceActionTypes.ADD_SOURCE; payload: { - source: NotificationsBrokerSourceObject[]; + source: QualityAssuranceSourceObject[]; totalPages: number; currentPage: number; totalElements: number; @@ -74,9 +74,9 @@ export class AddSourceAction implements Action { * @param currentPage * the current page * @param totalElements - * the total available Notifications Broker source + * the total available Quality Assurance source */ - constructor(source: NotificationsBrokerSourceObject[], totalPages: number, currentPage: number, totalElements: number) { + constructor(source: QualityAssuranceSourceObject[], totalPages: number, currentPage: number, totalElements: number) { this.payload = { source, totalPages, @@ -93,7 +93,7 @@ export class AddSourceAction implements Action { * Export a type alias of all actions in this action group * so that reducers can easily compose action types. */ -export type NotificationsBrokerSourceActions +export type QualityAssuranceSourceActions = RetrieveAllSourceAction |RetrieveAllSourceErrorAction |AddSourceAction; diff --git a/src/app/notifications/broker/source/notifications-broker-source.component.html b/src/app/notifications/qa/source/quality-assurance-source.component.html similarity index 97% rename from src/app/notifications/broker/source/notifications-broker-source.component.html rename to src/app/notifications/qa/source/quality-assurance-source.component.html index a7e1e52748..5309098c55 100644 --- a/src/app/notifications/broker/source/notifications-broker-source.component.html +++ b/src/app/notifications/qa/source/quality-assurance-source.component.html @@ -8,15 +8,15 @@

{{'notifications.broker.source'| translate}}

- + - + (paginationChange)="getQualityAssuranceSource()"> +
- + diff --git a/src/app/notifications/broker/source/notifications-broker-source.component.scss b/src/app/notifications/qa/source/quality-assurance-source.component.scss similarity index 100% rename from src/app/notifications/broker/source/notifications-broker-source.component.scss rename to src/app/notifications/qa/source/quality-assurance-source.component.scss diff --git a/src/app/notifications/broker/source/notifications-broker-source.component.spec.ts b/src/app/notifications/qa/source/quality-assurance-source.component.spec.ts similarity index 60% rename from src/app/notifications/broker/source/notifications-broker-source.component.spec.ts rename to src/app/notifications/qa/source/quality-assurance-source.component.spec.ts index 6c0ad42ce8..ba3a903cc5 100644 --- a/src/app/notifications/broker/source/notifications-broker-source.component.spec.ts +++ b/src/app/notifications/qa/source/quality-assurance-source.component.spec.ts @@ -7,22 +7,22 @@ import { ComponentFixture, inject, TestBed, waitForAsync } from '@angular/core/t import { createTestComponent } from '../../../shared/testing/utils.test'; import { getMockNotificationsStateService, - notificationsBrokerSourceObjectMoreAbstract, - notificationsBrokerSourceObjectMorePid + qualityAssuranceSourceObjectMoreAbstract, + qualityAssuranceSourceObjectMorePid } from '../../../shared/mocks/notifications.mock'; -import { NotificationsBrokerSourceComponent } from './notifications-broker-source.component'; +import { QualityAssuranceSourceComponent } from './quality-assurance-source.component'; import { NotificationsStateService } from '../../notifications-state.service'; import { cold } from 'jasmine-marbles'; import { PaginationServiceStub } from '../../../shared/testing/pagination-service.stub'; import { PaginationService } from '../../../core/pagination/pagination.service'; -describe('NotificationsBrokerSourceComponent test suite', () => { - let fixture: ComponentFixture; - let comp: NotificationsBrokerSourceComponent; +describe('QualityAssuranceSourceComponent test suite', () => { + let fixture: ComponentFixture; + let comp: QualityAssuranceSourceComponent; let compAsAny: any; const mockNotificationsStateService = getMockNotificationsStateService(); const activatedRouteParams = { - notificationsBrokerSourceParams: { + qualityAssuranceSourceParams: { currentPage: 0, pageSize: 5 } @@ -36,27 +36,27 @@ describe('NotificationsBrokerSourceComponent test suite', () => { TranslateModule.forRoot(), ], declarations: [ - NotificationsBrokerSourceComponent, + QualityAssuranceSourceComponent, TestComponent, ], providers: [ { provide: NotificationsStateService, useValue: mockNotificationsStateService }, { provide: ActivatedRoute, useValue: { data: observableOf(activatedRouteParams), params: observableOf({}) } }, { provide: PaginationService, useValue: paginationService }, - NotificationsBrokerSourceComponent + QualityAssuranceSourceComponent ], schemas: [NO_ERRORS_SCHEMA] }).compileComponents().then(() => { - mockNotificationsStateService.getNotificationsBrokerSource.and.returnValue(observableOf([ - notificationsBrokerSourceObjectMorePid, - notificationsBrokerSourceObjectMoreAbstract + mockNotificationsStateService.getQualityAssuranceSource.and.returnValue(observableOf([ + qualityAssuranceSourceObjectMorePid, + qualityAssuranceSourceObjectMoreAbstract ])); - mockNotificationsStateService.getNotificationsBrokerSourceTotalPages.and.returnValue(observableOf(1)); - mockNotificationsStateService.getNotificationsBrokerSourceCurrentPage.and.returnValue(observableOf(0)); - mockNotificationsStateService.getNotificationsBrokerSourceTotals.and.returnValue(observableOf(2)); - mockNotificationsStateService.isNotificationsBrokerSourceLoaded.and.returnValue(observableOf(true)); - mockNotificationsStateService.isNotificationsBrokerSourceLoading.and.returnValue(observableOf(false)); - mockNotificationsStateService.isNotificationsBrokerSourceProcessing.and.returnValue(observableOf(false)); + mockNotificationsStateService.getQualityAssuranceSourceTotalPages.and.returnValue(observableOf(1)); + mockNotificationsStateService.getQualityAssuranceSourceCurrentPage.and.returnValue(observableOf(0)); + mockNotificationsStateService.getQualityAssuranceSourceTotals.and.returnValue(observableOf(2)); + mockNotificationsStateService.isQualityAssuranceSourceLoaded.and.returnValue(observableOf(true)); + mockNotificationsStateService.isQualityAssuranceSourceLoading.and.returnValue(observableOf(false)); + mockNotificationsStateService.isQualityAssuranceSourceProcessing.and.returnValue(observableOf(false)); }); })); @@ -68,7 +68,7 @@ describe('NotificationsBrokerSourceComponent test suite', () => { // synchronous beforeEach beforeEach(() => { const html = ` - `; + `; testFixture = createTestComponent(html, TestComponent) as ComponentFixture; testComp = testFixture.componentInstance; }); @@ -77,14 +77,14 @@ describe('NotificationsBrokerSourceComponent test suite', () => { testFixture.destroy(); }); - it('should create NotificationsBrokerSourceComponent', inject([NotificationsBrokerSourceComponent], (app: NotificationsBrokerSourceComponent) => { + it('should create QualityAssuranceSourceComponent', inject([QualityAssuranceSourceComponent], (app: QualityAssuranceSourceComponent) => { expect(app).toBeDefined(); })); }); describe('Main tests running with two Source', () => { beforeEach(() => { - fixture = TestBed.createComponent(NotificationsBrokerSourceComponent); + fixture = TestBed.createComponent(QualityAssuranceSourceComponent); comp = fixture.componentInstance; compAsAny = comp; @@ -102,8 +102,8 @@ describe('NotificationsBrokerSourceComponent test suite', () => { expect(comp.sources$).toBeObservable(cold('(a|)', { a: [ - notificationsBrokerSourceObjectMorePid, - notificationsBrokerSourceObjectMoreAbstract + qualityAssuranceSourceObjectMorePid, + qualityAssuranceSourceObjectMoreAbstract ] })); expect(comp.totalElements$).toBeObservable(cold('(a|)', { @@ -112,12 +112,12 @@ describe('NotificationsBrokerSourceComponent test suite', () => { }); it(('Should set data properly after the view init'), () => { - spyOn(compAsAny, 'getNotificationsBrokerSource'); + spyOn(compAsAny, 'getQualityAssuranceSource'); comp.ngAfterViewInit(); fixture.detectChanges(); - expect(compAsAny.getNotificationsBrokerSource).toHaveBeenCalled(); + expect(compAsAny.getQualityAssuranceSource).toHaveBeenCalled(); }); it(('isSourceLoading should return FALSE'), () => { @@ -132,12 +132,12 @@ describe('NotificationsBrokerSourceComponent test suite', () => { })); }); - it(('getNotificationsBrokerSource should call the service to dispatch a STATE change'), () => { + it(('getQualityAssuranceSource should call the service to dispatch a STATE change'), () => { comp.ngOnInit(); fixture.detectChanges(); - compAsAny.notificationsStateService.dispatchRetrieveNotificationsBrokerSource(comp.paginationConfig.pageSize, comp.paginationConfig.currentPage).and.callThrough(); - expect(compAsAny.notificationsStateService.dispatchRetrieveNotificationsBrokerSource).toHaveBeenCalledWith(comp.paginationConfig.pageSize, comp.paginationConfig.currentPage); + compAsAny.notificationsStateService.dispatchRetrieveQualityAssuranceSource(comp.paginationConfig.pageSize, comp.paginationConfig.currentPage).and.callThrough(); + expect(compAsAny.notificationsStateService.dispatchRetrieveQualityAssuranceSource).toHaveBeenCalledWith(comp.paginationConfig.pageSize, comp.paginationConfig.currentPage); }); }); }); diff --git a/src/app/notifications/broker/source/notifications-broker-source.component.ts b/src/app/notifications/qa/source/quality-assurance-source.component.ts similarity index 64% rename from src/app/notifications/broker/source/notifications-broker-source.component.ts rename to src/app/notifications/qa/source/quality-assurance-source.component.ts index 070e03f396..fde1afec43 100644 --- a/src/app/notifications/broker/source/notifications-broker-source.component.ts +++ b/src/app/notifications/qa/source/quality-assurance-source.component.ts @@ -3,18 +3,18 @@ import { PaginationService } from '../../../core/pagination/pagination.service'; import { Observable, Subscription } from 'rxjs'; import { distinctUntilChanged, take } from 'rxjs/operators'; import { SortOptions } from '../../../core/cache/models/sort-options.model'; -import { NotificationsBrokerSourceObject } from '../../../core/notifications/broker/models/notifications-broker-source.model'; +import { QualityAssuranceSourceObject } from '../../../core/notifications/qa/models/quality-assurance-source.model'; import { PaginationComponentOptions } from '../../../shared/pagination/pagination-component-options.model'; import { NotificationsStateService } from '../../notifications-state.service'; -import { AdminNotificationsBrokerSourcePageParams } from '../../../admin/admin-notifications/admin-notifications-broker-source-page-component/admin-notifications-broker-source-page-resolver.service'; +import { AdminQualityAssuranceSourcePageParams } from '../../../admin/admin-notifications/admin-quality-assurance-source-page-component/admin-quality-assurance-source-page-resolver.service'; import { hasValue } from '../../../shared/empty.util'; @Component({ - selector: 'ds-notifications-broker-source', - templateUrl: './notifications-broker-source.component.html', - styleUrls: ['./notifications-broker-source.component.scss'] + selector: 'ds-quality-assurance-source', + templateUrl: './quality-assurance-source.component.html', + styleUrls: ['./quality-assurance-source.component.scss'] }) -export class NotificationsBrokerSourceComponent implements OnInit { +export class QualityAssuranceSourceComponent implements OnInit { /** * The pagination system configuration for HTML listing. @@ -26,16 +26,16 @@ export class NotificationsBrokerSourceComponent implements OnInit { pageSizeOptions: [5, 10, 20, 40, 60] }); /** - * The Notifications Broker source list sort options. + * The Quality Assurance source list sort options. * @type {SortOptions} */ public paginationSortConfig: SortOptions; /** - * The Notifications Broker source list. + * The Quality Assurance source list. */ - public sources$: Observable; + public sources$: Observable; /** - * The total number of Notifications Broker sources. + * The total number of Quality Assurance sources. */ public totalElements$: Observable; /** @@ -58,51 +58,51 @@ export class NotificationsBrokerSourceComponent implements OnInit { * Component initialization. */ ngOnInit(): void { - this.sources$ = this.notificationsStateService.getNotificationsBrokerSource(); - this.totalElements$ = this.notificationsStateService.getNotificationsBrokerSourceTotals(); + this.sources$ = this.notificationsStateService.getQualityAssuranceSource(); + this.totalElements$ = this.notificationsStateService.getQualityAssuranceSourceTotals(); } /** - * First Notifications Broker source loading after view initialization. + * First Quality Assurance source loading after view initialization. */ ngAfterViewInit(): void { this.subs.push( - this.notificationsStateService.isNotificationsBrokerSourceLoaded().pipe( + this.notificationsStateService.isQualityAssuranceSourceLoaded().pipe( take(1) ).subscribe(() => { - this.getNotificationsBrokerSource(); + this.getQualityAssuranceSource(); }) ); } /** - * Returns the information about the loading status of the Notifications Broker source (if it's running or not). + * Returns the information about the loading status of the Quality Assurance source (if it's running or not). * * @return Observable * 'true' if the source are loading, 'false' otherwise. */ public isSourceLoading(): Observable { - return this.notificationsStateService.isNotificationsBrokerSourceLoading(); + return this.notificationsStateService.isQualityAssuranceSourceLoading(); } /** - * Returns the information about the processing status of the Notifications Broker source (if it's running or not). + * Returns the information about the processing status of the Quality Assurance source (if it's running or not). * * @return Observable * 'true' if there are operations running on the source (ex.: a REST call), 'false' otherwise. */ public isSourceProcessing(): Observable { - return this.notificationsStateService.isNotificationsBrokerSourceProcessing(); + return this.notificationsStateService.isQualityAssuranceSourceProcessing(); } /** - * Dispatch the Notifications Broker source retrival. + * Dispatch the Quality Assurance source retrival. */ - public getNotificationsBrokerSource(): void { + public getQualityAssuranceSource(): void { this.paginationService.getCurrentPagination(this.paginationConfig.id, this.paginationConfig).pipe( distinctUntilChanged(), ).subscribe((options: PaginationComponentOptions) => { - this.notificationsStateService.dispatchRetrieveNotificationsBrokerSource( + this.notificationsStateService.dispatchRetrieveQualityAssuranceSource( options.pageSize, options.currentPage ); @@ -114,7 +114,7 @@ export class NotificationsBrokerSourceComponent implements OnInit { * * @param eventsRouteParams */ - protected updatePaginationFromRouteParams(eventsRouteParams: AdminNotificationsBrokerSourcePageParams) { + protected updatePaginationFromRouteParams(eventsRouteParams: AdminQualityAssuranceSourcePageParams) { if (eventsRouteParams.currentPage) { this.paginationConfig.currentPage = eventsRouteParams.currentPage; } diff --git a/src/app/notifications/broker/source/notifications-broker-source.effects.ts b/src/app/notifications/qa/source/quality-assurance-source.effects.ts similarity index 59% rename from src/app/notifications/broker/source/notifications-broker-source.effects.ts rename to src/app/notifications/qa/source/quality-assurance-source.effects.ts index bd8b3f00cd..6d8aa275d5 100644 --- a/src/app/notifications/broker/source/notifications-broker-source.effects.ts +++ b/src/app/notifications/qa/source/quality-assurance-source.effects.ts @@ -6,35 +6,35 @@ import { catchError, map, switchMap, tap, withLatestFrom } from 'rxjs/operators' import { of as observableOf } from 'rxjs'; import { AddSourceAction, - NotificationsBrokerSourceActionTypes, + QualityAssuranceSourceActionTypes, RetrieveAllSourceAction, RetrieveAllSourceErrorAction, -} from './notifications-broker-source.actions'; +} from './quality-assurance-source.actions'; -import { NotificationsBrokerSourceObject } from '../../../core/notifications/broker/models/notifications-broker-source.model'; +import { QualityAssuranceSourceObject } from '../../../core/notifications/qa/models/quality-assurance-source.model'; import { PaginatedList } from '../../../core/data/paginated-list.model'; -import { NotificationsBrokerSourceService } from './notifications-broker-source.service'; +import { QualityAssuranceSourceService } from './quality-assurance-source.service'; import { NotificationsService } from '../../../shared/notifications/notifications.service'; -import { NotificationsBrokerSourceRestService } from '../../../core/notifications/broker/source/notifications-broker-source-rest.service'; +import { QualityAssuranceSourceRestService } from '../../../core/notifications/qa/source/quality-assurance-source-rest.service'; /** - * Provides effect methods for the Notifications Broker source actions. + * Provides effect methods for the Quality Assurance source actions. */ @Injectable() -export class NotificationsBrokerSourceEffects { +export class QualityAssuranceSourceEffects { /** - * Retrieve all Notifications Broker source managing pagination and errors. + * Retrieve all Quality Assurance source managing pagination and errors. */ @Effect() retrieveAllSource$ = this.actions$.pipe( - ofType(NotificationsBrokerSourceActionTypes.RETRIEVE_ALL_SOURCE), + ofType(QualityAssuranceSourceActionTypes.RETRIEVE_ALL_SOURCE), withLatestFrom(this.store$), switchMap(([action, currentState]: [RetrieveAllSourceAction, any]) => { - return this.notificationsBrokerSourceService.getSources( + return this.qualityAssuranceSourceService.getSources( action.payload.elementsPerPage, action.payload.currentPage ).pipe( - map((sources: PaginatedList) => + map((sources: PaginatedList) => new AddSourceAction(sources.page, sources.totalPages, sources.currentPage, sources.totalElements) ), catchError((error: Error) => { @@ -51,7 +51,7 @@ export class NotificationsBrokerSourceEffects { * Show a notification on error. */ @Effect({ dispatch: false }) retrieveAllSourceErrorAction$ = this.actions$.pipe( - ofType(NotificationsBrokerSourceActionTypes.RETRIEVE_ALL_SOURCE_ERROR), + ofType(QualityAssuranceSourceActionTypes.RETRIEVE_ALL_SOURCE_ERROR), tap(() => { this.notificationsService.error(null, this.translate.get('notifications.broker.source.error.service.retrieve')); }) @@ -61,9 +61,9 @@ export class NotificationsBrokerSourceEffects { * Clear find all source requests from cache. */ @Effect({ dispatch: false }) addSourceAction$ = this.actions$.pipe( - ofType(NotificationsBrokerSourceActionTypes.ADD_SOURCE), + ofType(QualityAssuranceSourceActionTypes.ADD_SOURCE), tap(() => { - this.notificationsBrokerSourceDataService.clearFindAllSourceRequests(); + this.qualityAssuranceSourceDataService.clearFindAllSourceRequests(); }) ); @@ -73,15 +73,15 @@ export class NotificationsBrokerSourceEffects { * @param {Store} store$ * @param {TranslateService} translate * @param {NotificationsService} notificationsService - * @param {NotificationsBrokerSourceService} notificationsBrokerSourceService - * @param {NotificationsBrokerSourceRestService} notificationsBrokerSourceDataService + * @param {QualityAssuranceSourceService} qualityAssuranceSourceService + * @param {QualityAssuranceSourceRestService} qualityAssuranceSourceDataService */ constructor( private actions$: Actions, private store$: Store, private translate: TranslateService, private notificationsService: NotificationsService, - private notificationsBrokerSourceService: NotificationsBrokerSourceService, - private notificationsBrokerSourceDataService: NotificationsBrokerSourceRestService + private qualityAssuranceSourceService: QualityAssuranceSourceService, + private qualityAssuranceSourceDataService: QualityAssuranceSourceRestService ) { } } diff --git a/src/app/notifications/broker/source/notifications-broker-source.reducer.spec.ts b/src/app/notifications/qa/source/quality-assurance-source.reducer.spec.ts similarity index 52% rename from src/app/notifications/broker/source/notifications-broker-source.reducer.spec.ts rename to src/app/notifications/qa/source/quality-assurance-source.reducer.spec.ts index 74bc77d3ec..fcb717067d 100644 --- a/src/app/notifications/broker/source/notifications-broker-source.reducer.spec.ts +++ b/src/app/notifications/qa/source/quality-assurance-source.reducer.spec.ts @@ -2,20 +2,20 @@ import { AddSourceAction, RetrieveAllSourceAction, RetrieveAllSourceErrorAction - } from './notifications-broker-source.actions'; - import { notificationsBrokerSourceReducer, NotificationsBrokerSourceState } from './notifications-broker-source.reducer'; + } from './quality-assurance-source.actions'; + import { qualityAssuranceSourceReducer, QualityAssuranceSourceState } from './quality-assurance-source.reducer'; import { - notificationsBrokerSourceObjectMoreAbstract, - notificationsBrokerSourceObjectMorePid + qualityAssuranceSourceObjectMoreAbstract, + qualityAssuranceSourceObjectMorePid } from '../../../shared/mocks/notifications.mock'; - describe('notificationsBrokerSourceReducer test suite', () => { - let notificationsBrokerSourceInitialState: NotificationsBrokerSourceState; + describe('qualityAssuranceSourceReducer test suite', () => { + let qualityAssuranceSourceInitialState: QualityAssuranceSourceState; const elementPerPage = 3; const currentPage = 0; beforeEach(() => { - notificationsBrokerSourceInitialState = { + qualityAssuranceSourceInitialState = { source: [], processing: false, loaded: false, @@ -26,30 +26,30 @@ import { }); it('Action RETRIEVE_ALL_SOURCE should set the State property "processing" to TRUE', () => { - const expectedState = notificationsBrokerSourceInitialState; + const expectedState = qualityAssuranceSourceInitialState; expectedState.processing = true; const action = new RetrieveAllSourceAction(elementPerPage, currentPage); - const newState = notificationsBrokerSourceReducer(notificationsBrokerSourceInitialState, action); + const newState = qualityAssuranceSourceReducer(qualityAssuranceSourceInitialState, action); expect(newState).toEqual(expectedState); }); it('Action RETRIEVE_ALL_SOURCE_ERROR should change the State to initial State but processing, loaded, and currentPage', () => { - const expectedState = notificationsBrokerSourceInitialState; + const expectedState = qualityAssuranceSourceInitialState; expectedState.processing = false; expectedState.loaded = true; expectedState.currentPage = 0; const action = new RetrieveAllSourceErrorAction(); - const newState = notificationsBrokerSourceReducer(notificationsBrokerSourceInitialState, action); + const newState = qualityAssuranceSourceReducer(qualityAssuranceSourceInitialState, action); expect(newState).toEqual(expectedState); }); - it('Action ADD_SOURCE should populate the State with Notifications Broker source', () => { + it('Action ADD_SOURCE should populate the State with Quality Assurance source', () => { const expectedState = { - source: [ notificationsBrokerSourceObjectMorePid, notificationsBrokerSourceObjectMoreAbstract ], + source: [ qualityAssuranceSourceObjectMorePid, qualityAssuranceSourceObjectMoreAbstract ], processing: false, loaded: true, totalPages: 1, @@ -58,10 +58,10 @@ import { }; const action = new AddSourceAction( - [ notificationsBrokerSourceObjectMorePid, notificationsBrokerSourceObjectMoreAbstract ], + [ qualityAssuranceSourceObjectMorePid, qualityAssuranceSourceObjectMoreAbstract ], 1, 0, 2 ); - const newState = notificationsBrokerSourceReducer(notificationsBrokerSourceInitialState, action); + const newState = qualityAssuranceSourceReducer(qualityAssuranceSourceInitialState, action); expect(newState).toEqual(expectedState); }); diff --git a/src/app/notifications/qa/source/quality-assurance-source.reducer.ts b/src/app/notifications/qa/source/quality-assurance-source.reducer.ts new file mode 100644 index 0000000000..08e26a177a --- /dev/null +++ b/src/app/notifications/qa/source/quality-assurance-source.reducer.ts @@ -0,0 +1,72 @@ +import { QualityAssuranceSourceObject } from '../../../core/notifications/qa/models/quality-assurance-source.model'; +import { QualityAssuranceSourceActionTypes, QualityAssuranceSourceActions } from './quality-assurance-source.actions'; + +/** + * The interface representing the Quality Assurance source state. + */ +export interface QualityAssuranceSourceState { + source: QualityAssuranceSourceObject[]; + processing: boolean; + loaded: boolean; + totalPages: number; + currentPage: number; + totalElements: number; +} + +/** + * Used for the Quality Assurance source state initialization. + */ +const qualityAssuranceSourceInitialState: QualityAssuranceSourceState = { + source: [], + processing: false, + loaded: false, + totalPages: 0, + currentPage: 0, + totalElements: 0 +}; + +/** + * The Quality Assurance Source Reducer + * + * @param state + * the current state initialized with qualityAssuranceSourceInitialState + * @param action + * the action to perform on the state + * @return QualityAssuranceSourceState + * the new state + */ +export function qualityAssuranceSourceReducer(state = qualityAssuranceSourceInitialState, action: QualityAssuranceSourceActions): QualityAssuranceSourceState { + switch (action.type) { + case QualityAssuranceSourceActionTypes.RETRIEVE_ALL_SOURCE: { + return Object.assign({}, state, { + source: [], + processing: true + }); + } + + case QualityAssuranceSourceActionTypes.ADD_SOURCE: { + return Object.assign({}, state, { + source: action.payload.source, + processing: false, + loaded: true, + totalPages: action.payload.totalPages, + currentPage: state.currentPage, + totalElements: action.payload.totalElements + }); + } + + case QualityAssuranceSourceActionTypes.RETRIEVE_ALL_SOURCE_ERROR: { + return Object.assign({}, state, { + processing: false, + loaded: true, + totalPages: 0, + currentPage: 0, + totalElements: 0 + }); + } + + default: { + return state; + } + } +} diff --git a/src/app/notifications/broker/source/notifications-broker-source.service.spec.ts b/src/app/notifications/qa/source/quality-assurance-source.service.spec.ts similarity index 56% rename from src/app/notifications/broker/source/notifications-broker-source.service.spec.ts rename to src/app/notifications/qa/source/quality-assurance-source.service.spec.ts index e94804cbf6..06f020be1d 100644 --- a/src/app/notifications/broker/source/notifications-broker-source.service.spec.ts +++ b/src/app/notifications/qa/source/quality-assurance-source.service.spec.ts @@ -1,28 +1,28 @@ import { TestBed } from '@angular/core/testing'; import { of as observableOf } from 'rxjs'; -import { NotificationsBrokerSourceService } from './notifications-broker-source.service'; +import { QualityAssuranceSourceService } from './quality-assurance-source.service'; import { SortDirection, SortOptions } from '../../../core/cache/models/sort-options.model'; import { PageInfo } from '../../../core/shared/page-info.model'; -import { FindListOptions } from '../../../core/data/request.models'; import { - getMockNotificationsBrokerSourceRestService, - notificationsBrokerSourceObjectMoreAbstract, - notificationsBrokerSourceObjectMorePid + getMockQualityAssuranceSourceRestService, + qualityAssuranceSourceObjectMoreAbstract, + qualityAssuranceSourceObjectMorePid } from '../../../shared/mocks/notifications.mock'; import { createSuccessfulRemoteDataObject } from '../../../shared/remote-data.utils'; import { cold } from 'jasmine-marbles'; import { buildPaginatedList } from '../../../core/data/paginated-list.model'; -import { NotificationsBrokerSourceRestService } from '../../../core/notifications/broker/source/notifications-broker-source-rest.service'; +import { QualityAssuranceSourceRestService } from '../../../core/notifications/qa/source/quality-assurance-source-rest.service'; import { RequestParam } from '../../../core/cache/models/request-param.model'; +import {FindListOptions} from '../../../core/data/find-list-options.model'; -describe('NotificationsBrokerSourceService', () => { - let service: NotificationsBrokerSourceService; - let restService: NotificationsBrokerSourceRestService; +describe('QualityAssuranceSourceService', () => { + let service: QualityAssuranceSourceService; + let restService: QualityAssuranceSourceRestService; let serviceAsAny: any; let restServiceAsAny: any; const pageInfo = new PageInfo(); - const array = [ notificationsBrokerSourceObjectMorePid, notificationsBrokerSourceObjectMoreAbstract ]; + const array = [ qualityAssuranceSourceObjectMorePid, qualityAssuranceSourceObjectMoreAbstract ]; const paginatedList = buildPaginatedList(pageInfo, array); const paginatedListRD = createSuccessfulRemoteDataObject(paginatedList); const elementsPerPage = 3; @@ -31,22 +31,22 @@ describe('NotificationsBrokerSourceService', () => { beforeEach(async () => { TestBed.configureTestingModule({ providers: [ - { provide: NotificationsBrokerSourceRestService, useClass: getMockNotificationsBrokerSourceRestService }, - { provide: NotificationsBrokerSourceService, useValue: service } + { provide: QualityAssuranceSourceRestService, useClass: getMockQualityAssuranceSourceRestService }, + { provide: QualityAssuranceSourceService, useValue: service } ] }).compileComponents(); }); beforeEach(() => { - restService = TestBed.get(NotificationsBrokerSourceRestService); + restService = TestBed.get(QualityAssuranceSourceRestService); restServiceAsAny = restService; restServiceAsAny.getSources.and.returnValue(observableOf(paginatedListRD)); - service = new NotificationsBrokerSourceService(restService); + service = new QualityAssuranceSourceService(restService); serviceAsAny = service; }); describe('getSources', () => { - it('Should proxy the call to notificationsBrokerSourceRestService.getSources', () => { + it('Should proxy the call to qualityAssuranceSourceRestService.getSources', () => { const sortOptions = new SortOptions('name', SortDirection.ASC); const findListOptions: FindListOptions = { elementsPerPage: elementsPerPage, @@ -54,10 +54,10 @@ describe('NotificationsBrokerSourceService', () => { sort: sortOptions }; const result = service.getSources(elementsPerPage, currentPage); - expect((service as any).notificationsBrokerSourceRestService.getSources).toHaveBeenCalledWith(findListOptions); + expect((service as any).qualityAssuranceSourceRestService.getSources).toHaveBeenCalledWith(findListOptions); }); - it('Should return a paginated list of Notifications Broker Source', () => { + it('Should return a paginated list of Quality Assurance Source', () => { const expected = cold('(a|)', { a: paginatedList }); diff --git a/src/app/notifications/qa/source/quality-assurance-source.service.ts b/src/app/notifications/qa/source/quality-assurance-source.service.ts new file mode 100644 index 0000000000..30a889d3e2 --- /dev/null +++ b/src/app/notifications/qa/source/quality-assurance-source.service.ts @@ -0,0 +1,55 @@ +import { Injectable } from '@angular/core'; +import { Observable } from 'rxjs'; +import { find, map } from 'rxjs/operators'; +import { QualityAssuranceSourceRestService } from '../../../core/notifications/qa/source/quality-assurance-source-rest.service'; +import { SortDirection, SortOptions } from '../../../core/cache/models/sort-options.model'; +import { RemoteData } from '../../../core/data/remote-data'; +import { PaginatedList } from '../../../core/data/paginated-list.model'; +import { QualityAssuranceSourceObject } from '../../../core/notifications/qa/models/quality-assurance-source.model'; +import {FindListOptions} from '../../../core/data/find-list-options.model'; + +/** + * The service handling all Quality Assurance source requests to the REST service. + */ +@Injectable() +export class QualityAssuranceSourceService { + + /** + * Initialize the service variables. + * @param {QualityAssuranceSourceRestService} qualityAssuranceSourceRestService + */ + constructor( + private qualityAssuranceSourceRestService: QualityAssuranceSourceRestService + ) { } + + /** + * Return the list of Quality Assurance source managing pagination and errors. + * + * @param elementsPerPage + * The number of the source per page + * @param currentPage + * The page number to retrieve + * @return Observable> + * The list of Quality Assurance source. + */ + public getSources(elementsPerPage, currentPage): Observable> { + const sortOptions = new SortOptions('name', SortDirection.ASC); + + const findListOptions: FindListOptions = { + elementsPerPage: elementsPerPage, + currentPage: currentPage, + sort: sortOptions + }; + + return this.qualityAssuranceSourceRestService.getSources(findListOptions).pipe( + find((rd: RemoteData>) => !rd.isResponsePending), + map((rd: RemoteData>) => { + if (rd.hasSucceeded) { + return rd.payload; + } else { + throw new Error('Can\'t retrieve Quality Assurance source from the Broker source REST service'); + } + }) + ); + } +} diff --git a/src/app/notifications/broker/topics/notifications-broker-topics.actions.ts b/src/app/notifications/qa/topics/quality-assurance-topics.actions.ts similarity index 62% rename from src/app/notifications/broker/topics/notifications-broker-topics.actions.ts rename to src/app/notifications/qa/topics/quality-assurance-topics.actions.ts index 622ecc8141..0506806587 100644 --- a/src/app/notifications/broker/topics/notifications-broker-topics.actions.ts +++ b/src/app/notifications/qa/topics/quality-assurance-topics.actions.ts @@ -1,6 +1,6 @@ import { Action } from '@ngrx/store'; import { type } from '../../../shared/ngrx/type'; -import { NotificationsBrokerTopicObject } from '../../../core/notifications/broker/models/notifications-broker-topic.model'; +import { QualityAssuranceTopicObject } from '../../../core/notifications/qa/models/quality-assurance-topic.model'; /** * For each action type in an action group, make a simple @@ -10,19 +10,19 @@ import { NotificationsBrokerTopicObject } from '../../../core/notifications/brok * literal types and runs a simple check to guarantee all * action types in the application are unique. */ -export const NotificationsBrokerTopicActionTypes = { - ADD_TOPICS: type('dspace/integration/notifications/broker/topic/ADD_TOPICS'), - RETRIEVE_ALL_TOPICS: type('dspace/integration/notifications/broker/topic/RETRIEVE_ALL_TOPICS'), - RETRIEVE_ALL_TOPICS_ERROR: type('dspace/integration/notifications/broker/topic/RETRIEVE_ALL_TOPICS_ERROR'), +export const QualityAssuranceTopicActionTypes = { + ADD_TOPICS: type('dspace/integration/notifications/qa/topic/ADD_TOPICS'), + RETRIEVE_ALL_TOPICS: type('dspace/integration/notifications/qa/topic/RETRIEVE_ALL_TOPICS'), + RETRIEVE_ALL_TOPICS_ERROR: type('dspace/integration/notifications/qa/topic/RETRIEVE_ALL_TOPICS_ERROR'), }; /* tslint:disable:max-classes-per-file */ /** - * An ngrx action to retrieve all the Notifications Broker topics. + * An ngrx action to retrieve all the Quality Assurance topics. */ export class RetrieveAllTopicsAction implements Action { - type = NotificationsBrokerTopicActionTypes.RETRIEVE_ALL_TOPICS; + type = QualityAssuranceTopicActionTypes.RETRIEVE_ALL_TOPICS; payload: { elementsPerPage: number; currentPage: number; @@ -45,20 +45,20 @@ export class RetrieveAllTopicsAction implements Action { } /** - * An ngrx action for retrieving 'all Notifications Broker topics' error. + * An ngrx action for retrieving 'all Quality Assurance topics' error. */ export class RetrieveAllTopicsErrorAction implements Action { - type = NotificationsBrokerTopicActionTypes.RETRIEVE_ALL_TOPICS_ERROR; + type = QualityAssuranceTopicActionTypes.RETRIEVE_ALL_TOPICS_ERROR; } /** - * An ngrx action to load the Notifications Broker topic objects. + * An ngrx action to load the Quality Assurance topic objects. * Called by the ??? effect. */ export class AddTopicsAction implements Action { - type = NotificationsBrokerTopicActionTypes.ADD_TOPICS; + type = QualityAssuranceTopicActionTypes.ADD_TOPICS; payload: { - topics: NotificationsBrokerTopicObject[]; + topics: QualityAssuranceTopicObject[]; totalPages: number; currentPage: number; totalElements: number; @@ -74,9 +74,9 @@ export class AddTopicsAction implements Action { * @param currentPage * the current page * @param totalElements - * the total available Notifications Broker topics + * the total available Quality Assurance topics */ - constructor(topics: NotificationsBrokerTopicObject[], totalPages: number, currentPage: number, totalElements: number) { + constructor(topics: QualityAssuranceTopicObject[], totalPages: number, currentPage: number, totalElements: number) { this.payload = { topics, totalPages, @@ -93,7 +93,7 @@ export class AddTopicsAction implements Action { * Export a type alias of all actions in this action group * so that reducers can easily compose action types. */ -export type NotificationsBrokerTopicsActions +export type QualityAssuranceTopicsActions = AddTopicsAction |RetrieveAllTopicsAction |RetrieveAllTopicsErrorAction; diff --git a/src/app/notifications/broker/topics/notifications-broker-topics.component.html b/src/app/notifications/qa/topics/quality-assurance-topics.component.html similarity index 97% rename from src/app/notifications/broker/topics/notifications-broker-topics.component.html rename to src/app/notifications/qa/topics/quality-assurance-topics.component.html index 8b27778ee9..b563a355f5 100644 --- a/src/app/notifications/broker/topics/notifications-broker-topics.component.html +++ b/src/app/notifications/qa/topics/quality-assurance-topics.component.html @@ -15,7 +15,7 @@ [collectionSize]="(totalElements$ | async)" [hideGear]="false" [hideSortOptions]="true" - (paginationChange)="getNotificationsBrokerTopics()"> + (paginationChange)="getQualityAssuranceTopics()"> diff --git a/src/app/notifications/broker/topics/notifications-broker-topics.component.scss b/src/app/notifications/qa/topics/quality-assurance-topics.component.scss similarity index 100% rename from src/app/notifications/broker/topics/notifications-broker-topics.component.scss rename to src/app/notifications/qa/topics/quality-assurance-topics.component.scss diff --git a/src/app/notifications/broker/topics/notifications-broker-topics.component.spec.ts b/src/app/notifications/qa/topics/quality-assurance-topics.component.spec.ts similarity index 59% rename from src/app/notifications/broker/topics/notifications-broker-topics.component.spec.ts rename to src/app/notifications/qa/topics/quality-assurance-topics.component.spec.ts index dbb8137321..8e154eca99 100644 --- a/src/app/notifications/broker/topics/notifications-broker-topics.component.spec.ts +++ b/src/app/notifications/qa/topics/quality-assurance-topics.component.spec.ts @@ -7,23 +7,23 @@ import { ComponentFixture, inject, TestBed, waitForAsync } from '@angular/core/t import { createTestComponent } from '../../../shared/testing/utils.test'; import { getMockNotificationsStateService, - notificationsBrokerTopicObjectMoreAbstract, - notificationsBrokerTopicObjectMorePid + qualityAssuranceTopicObjectMoreAbstract, + qualityAssuranceTopicObjectMorePid } from '../../../shared/mocks/notifications.mock'; -import { NotificationsBrokerTopicsComponent } from './notifications-broker-topics.component'; +import { QualityAssuranceTopicsComponent } from './quality-assurance-topics.component'; import { NotificationsStateService } from '../../notifications-state.service'; import { cold } from 'jasmine-marbles'; import { PaginationServiceStub } from '../../../shared/testing/pagination-service.stub'; import { PaginationService } from '../../../core/pagination/pagination.service'; -import { NotificationsBrokerTopicsService } from './notifications-broker-topics.service'; +import { QualityAssuranceTopicsService } from './quality-assurance-topics.service'; -describe('NotificationsBrokerTopicsComponent test suite', () => { - let fixture: ComponentFixture; - let comp: NotificationsBrokerTopicsComponent; +describe('QualityAssuranceTopicsComponent test suite', () => { + let fixture: ComponentFixture; + let comp: QualityAssuranceTopicsComponent; let compAsAny: any; const mockNotificationsStateService = getMockNotificationsStateService(); const activatedRouteParams = { - notificationsBrokerTopicsParams: { + qualityAssuranceTopicsParams: { currentPage: 0, pageSize: 5 } @@ -37,7 +37,7 @@ describe('NotificationsBrokerTopicsComponent test suite', () => { TranslateModule.forRoot(), ], declarations: [ - NotificationsBrokerTopicsComponent, + QualityAssuranceTopicsComponent, TestComponent, ], providers: [ @@ -48,22 +48,22 @@ describe('NotificationsBrokerTopicsComponent test suite', () => { }, }}}, { provide: PaginationService, useValue: paginationService }, - NotificationsBrokerTopicsComponent, + QualityAssuranceTopicsComponent, // tslint:disable-next-line: no-empty - { provide: NotificationsBrokerTopicsService, useValue: { setSourceId: (sourceId: string) => { } }} + { provide: QualityAssuranceTopicsService, useValue: { setSourceId: (sourceId: string) => { } }} ], schemas: [NO_ERRORS_SCHEMA] }).compileComponents().then(() => { - mockNotificationsStateService.getNotificationsBrokerTopics.and.returnValue(observableOf([ - notificationsBrokerTopicObjectMorePid, - notificationsBrokerTopicObjectMoreAbstract + mockNotificationsStateService.getQualityAssuranceTopics.and.returnValue(observableOf([ + qualityAssuranceTopicObjectMorePid, + qualityAssuranceTopicObjectMoreAbstract ])); - mockNotificationsStateService.getNotificationsBrokerTopicsTotalPages.and.returnValue(observableOf(1)); - mockNotificationsStateService.getNotificationsBrokerTopicsCurrentPage.and.returnValue(observableOf(0)); - mockNotificationsStateService.getNotificationsBrokerTopicsTotals.and.returnValue(observableOf(2)); - mockNotificationsStateService.isNotificationsBrokerTopicsLoaded.and.returnValue(observableOf(true)); - mockNotificationsStateService.isNotificationsBrokerTopicsLoading.and.returnValue(observableOf(false)); - mockNotificationsStateService.isNotificationsBrokerTopicsProcessing.and.returnValue(observableOf(false)); + mockNotificationsStateService.getQualityAssuranceTopicsTotalPages.and.returnValue(observableOf(1)); + mockNotificationsStateService.getQualityAssuranceTopicsCurrentPage.and.returnValue(observableOf(0)); + mockNotificationsStateService.getQualityAssuranceTopicsTotals.and.returnValue(observableOf(2)); + mockNotificationsStateService.isQualityAssuranceTopicsLoaded.and.returnValue(observableOf(true)); + mockNotificationsStateService.isQualityAssuranceTopicsLoading.and.returnValue(observableOf(false)); + mockNotificationsStateService.isQualityAssuranceTopicsProcessing.and.returnValue(observableOf(false)); }); })); @@ -75,7 +75,7 @@ describe('NotificationsBrokerTopicsComponent test suite', () => { // synchronous beforeEach beforeEach(() => { const html = ` - `; + `; testFixture = createTestComponent(html, TestComponent) as ComponentFixture; testComp = testFixture.componentInstance; }); @@ -84,14 +84,14 @@ describe('NotificationsBrokerTopicsComponent test suite', () => { testFixture.destroy(); }); - it('should create NotificationsBrokerTopicsComponent', inject([NotificationsBrokerTopicsComponent], (app: NotificationsBrokerTopicsComponent) => { + it('should create QualityAssuranceTopicsComponent', inject([QualityAssuranceTopicsComponent], (app: QualityAssuranceTopicsComponent) => { expect(app).toBeDefined(); })); }); describe('Main tests running with two topics', () => { beforeEach(() => { - fixture = TestBed.createComponent(NotificationsBrokerTopicsComponent); + fixture = TestBed.createComponent(QualityAssuranceTopicsComponent); comp = fixture.componentInstance; compAsAny = comp; @@ -109,8 +109,8 @@ describe('NotificationsBrokerTopicsComponent test suite', () => { expect(comp.topics$).toBeObservable(cold('(a|)', { a: [ - notificationsBrokerTopicObjectMorePid, - notificationsBrokerTopicObjectMoreAbstract + qualityAssuranceTopicObjectMorePid, + qualityAssuranceTopicObjectMoreAbstract ] })); expect(comp.totalElements$).toBeObservable(cold('(a|)', { @@ -119,12 +119,12 @@ describe('NotificationsBrokerTopicsComponent test suite', () => { }); it(('Should set data properly after the view init'), () => { - spyOn(compAsAny, 'getNotificationsBrokerTopics'); + spyOn(compAsAny, 'getQualityAssuranceTopics'); comp.ngAfterViewInit(); fixture.detectChanges(); - expect(compAsAny.getNotificationsBrokerTopics).toHaveBeenCalled(); + expect(compAsAny.getQualityAssuranceTopics).toHaveBeenCalled(); }); it(('isTopicsLoading should return FALSE'), () => { @@ -139,12 +139,12 @@ describe('NotificationsBrokerTopicsComponent test suite', () => { })); }); - it(('getNotificationsBrokerTopics should call the service to dispatch a STATE change'), () => { + it(('getQualityAssuranceTopics should call the service to dispatch a STATE change'), () => { comp.ngOnInit(); fixture.detectChanges(); - compAsAny.notificationsStateService.dispatchRetrieveNotificationsBrokerTopics(comp.paginationConfig.pageSize, comp.paginationConfig.currentPage).and.callThrough(); - expect(compAsAny.notificationsStateService.dispatchRetrieveNotificationsBrokerTopics).toHaveBeenCalledWith(comp.paginationConfig.pageSize, comp.paginationConfig.currentPage); + compAsAny.notificationsStateService.dispatchRetrieveQualityAssuranceTopics(comp.paginationConfig.pageSize, comp.paginationConfig.currentPage).and.callThrough(); + expect(compAsAny.notificationsStateService.dispatchRetrieveQualityAssuranceTopics).toHaveBeenCalledWith(comp.paginationConfig.pageSize, comp.paginationConfig.currentPage); }); }); }); diff --git a/src/app/notifications/broker/topics/notifications-broker-topics.component.ts b/src/app/notifications/qa/topics/quality-assurance-topics.component.ts similarity index 63% rename from src/app/notifications/broker/topics/notifications-broker-topics.component.ts rename to src/app/notifications/qa/topics/quality-assurance-topics.component.ts index a740ca5c1e..f825358f3b 100644 --- a/src/app/notifications/broker/topics/notifications-broker-topics.component.ts +++ b/src/app/notifications/qa/topics/quality-assurance-topics.component.ts @@ -4,24 +4,24 @@ import { Observable, Subscription } from 'rxjs'; import { distinctUntilChanged, map, take } from 'rxjs/operators'; import { SortOptions } from '../../../core/cache/models/sort-options.model'; -import { NotificationsBrokerTopicObject } from '../../../core/notifications/broker/models/notifications-broker-topic.model'; +import { QualityAssuranceTopicObject } from '../../../core/notifications/qa/models/quality-assurance-topic.model'; import { hasValue } from '../../../shared/empty.util'; import { PaginationComponentOptions } from '../../../shared/pagination/pagination-component-options.model'; import { NotificationsStateService } from '../../notifications-state.service'; -import { AdminNotificationsBrokerTopicsPageParams } from '../../../admin/admin-notifications/admin-notifications-broker-topics-page/admin-notifications-broker-topics-page-resolver.service'; +import { AdminQualityAssuranceTopicsPageParams } from '../../../admin/admin-notifications/admin-quality-assurance-topics-page/admin-quality-assurance-topics-page-resolver.service'; import { PaginationService } from '../../../core/pagination/pagination.service'; import { ActivatedRoute } from '@angular/router'; -import { NotificationsBrokerTopicsService } from './notifications-broker-topics.service'; +import { QualityAssuranceTopicsService } from './quality-assurance-topics.service'; /** - * Component to display the Notifications Broker topic list. + * Component to display the Quality Assurance topic list. */ @Component({ - selector: 'ds-notifications-broker-topic', - templateUrl: './notifications-broker-topics.component.html', - styleUrls: ['./notifications-broker-topics.component.scss'], + selector: 'ds-quality-assurance-topic', + templateUrl: './quality-assurance-topics.component.html', + styleUrls: ['./quality-assurance-topics.component.scss'], }) -export class NotificationsBrokerTopicsComponent implements OnInit { +export class QualityAssuranceTopicsComponent implements OnInit { /** * The pagination system configuration for HTML listing. * @type {PaginationComponentOptions} @@ -32,16 +32,16 @@ export class NotificationsBrokerTopicsComponent implements OnInit { pageSizeOptions: [5, 10, 20, 40, 60] }); /** - * The Notifications Broker topic list sort options. + * The Quality Assurance topic list sort options. * @type {SortOptions} */ public paginationSortConfig: SortOptions; /** - * The Notifications Broker topic list. + * The Quality Assurance topic list. */ - public topics$: Observable; + public topics$: Observable; /** - * The total number of Notifications Broker topics. + * The total number of Quality Assurance topics. */ public totalElements$: Observable; /** @@ -65,7 +65,7 @@ export class NotificationsBrokerTopicsComponent implements OnInit { private paginationService: PaginationService, private activatedRoute: ActivatedRoute, private notificationsStateService: NotificationsStateService, - private notificationsBrokerTopicsService: NotificationsBrokerTopicsService + private qualityAssuranceTopicsService: QualityAssuranceTopicsService ) { } @@ -74,52 +74,52 @@ export class NotificationsBrokerTopicsComponent implements OnInit { */ ngOnInit(): void { this.sourceId = this.activatedRoute.snapshot.paramMap.get('sourceId'); - this.notificationsBrokerTopicsService.setSourceId(this.sourceId); - this.topics$ = this.notificationsStateService.getNotificationsBrokerTopics(); - this.totalElements$ = this.notificationsStateService.getNotificationsBrokerTopicsTotals(); + this.qualityAssuranceTopicsService.setSourceId(this.sourceId); + this.topics$ = this.notificationsStateService.getQualityAssuranceTopics(); + this.totalElements$ = this.notificationsStateService.getQualityAssuranceTopicsTotals(); } /** - * First Notifications Broker topics loading after view initialization. + * First Quality Assurance topics loading after view initialization. */ ngAfterViewInit(): void { this.subs.push( - this.notificationsStateService.isNotificationsBrokerTopicsLoaded().pipe( + this.notificationsStateService.isQualityAssuranceTopicsLoaded().pipe( take(1) ).subscribe(() => { - this.getNotificationsBrokerTopics(); + this.getQualityAssuranceTopics(); }) ); } /** - * Returns the information about the loading status of the Notifications Broker topics (if it's running or not). + * Returns the information about the loading status of the Quality Assurance topics (if it's running or not). * * @return Observable * 'true' if the topics are loading, 'false' otherwise. */ public isTopicsLoading(): Observable { - return this.notificationsStateService.isNotificationsBrokerTopicsLoading(); + return this.notificationsStateService.isQualityAssuranceTopicsLoading(); } /** - * Returns the information about the processing status of the Notifications Broker topics (if it's running or not). + * Returns the information about the processing status of the Quality Assurance topics (if it's running or not). * * @return Observable * 'true' if there are operations running on the topics (ex.: a REST call), 'false' otherwise. */ public isTopicsProcessing(): Observable { - return this.notificationsStateService.isNotificationsBrokerTopicsProcessing(); + return this.notificationsStateService.isQualityAssuranceTopicsProcessing(); } /** - * Dispatch the Notifications Broker topics retrival. + * Dispatch the Quality Assurance topics retrival. */ - public getNotificationsBrokerTopics(): void { + public getQualityAssuranceTopics(): void { this.paginationService.getCurrentPagination(this.paginationConfig.id, this.paginationConfig).pipe( distinctUntilChanged(), ).subscribe((options: PaginationComponentOptions) => { - this.notificationsStateService.dispatchRetrieveNotificationsBrokerTopics( + this.notificationsStateService.dispatchRetrieveQualityAssuranceTopics( options.pageSize, options.currentPage ); @@ -131,7 +131,7 @@ export class NotificationsBrokerTopicsComponent implements OnInit { * * @param eventsRouteParams */ - protected updatePaginationFromRouteParams(eventsRouteParams: AdminNotificationsBrokerTopicsPageParams) { + protected updatePaginationFromRouteParams(eventsRouteParams: AdminQualityAssuranceTopicsPageParams) { if (eventsRouteParams.currentPage) { this.paginationConfig.currentPage = eventsRouteParams.currentPage; } diff --git a/src/app/notifications/broker/topics/notifications-broker-topics.effects.ts b/src/app/notifications/qa/topics/quality-assurance-topics.effects.ts similarity index 59% rename from src/app/notifications/broker/topics/notifications-broker-topics.effects.ts rename to src/app/notifications/qa/topics/quality-assurance-topics.effects.ts index e3e1e16098..14c0dacc23 100644 --- a/src/app/notifications/broker/topics/notifications-broker-topics.effects.ts +++ b/src/app/notifications/qa/topics/quality-assurance-topics.effects.ts @@ -6,35 +6,35 @@ import { catchError, map, switchMap, tap, withLatestFrom } from 'rxjs/operators' import { of as observableOf } from 'rxjs'; import { AddTopicsAction, - NotificationsBrokerTopicActionTypes, + QualityAssuranceTopicActionTypes, RetrieveAllTopicsAction, RetrieveAllTopicsErrorAction, -} from './notifications-broker-topics.actions'; +} from './quality-assurance-topics.actions'; -import { NotificationsBrokerTopicObject } from '../../../core/notifications/broker/models/notifications-broker-topic.model'; +import { QualityAssuranceTopicObject } from '../../../core/notifications/qa/models/quality-assurance-topic.model'; import { PaginatedList } from '../../../core/data/paginated-list.model'; -import { NotificationsBrokerTopicsService } from './notifications-broker-topics.service'; +import { QualityAssuranceTopicsService } from './quality-assurance-topics.service'; import { NotificationsService } from '../../../shared/notifications/notifications.service'; -import { NotificationsBrokerTopicRestService } from '../../../core/notifications/broker/topics/notifications-broker-topic-rest.service'; +import { QualityAssuranceTopicRestService } from '../../../core/notifications/qa/topics/quality-assurance-topic-rest.service'; /** - * Provides effect methods for the Notifications Broker topics actions. + * Provides effect methods for the Quality Assurance topics actions. */ @Injectable() -export class NotificationsBrokerTopicsEffects { +export class QualityAssuranceTopicsEffects { /** - * Retrieve all Notifications Broker topics managing pagination and errors. + * Retrieve all Quality Assurance topics managing pagination and errors. */ @Effect() retrieveAllTopics$ = this.actions$.pipe( - ofType(NotificationsBrokerTopicActionTypes.RETRIEVE_ALL_TOPICS), + ofType(QualityAssuranceTopicActionTypes.RETRIEVE_ALL_TOPICS), withLatestFrom(this.store$), switchMap(([action, currentState]: [RetrieveAllTopicsAction, any]) => { - return this.notificationsBrokerTopicService.getTopics( + return this.qualityAssuranceTopicService.getTopics( action.payload.elementsPerPage, action.payload.currentPage ).pipe( - map((topics: PaginatedList) => + map((topics: PaginatedList) => new AddTopicsAction(topics.page, topics.totalPages, topics.currentPage, topics.totalElements) ), catchError((error: Error) => { @@ -51,7 +51,7 @@ export class NotificationsBrokerTopicsEffects { * Show a notification on error. */ @Effect({ dispatch: false }) retrieveAllTopicsErrorAction$ = this.actions$.pipe( - ofType(NotificationsBrokerTopicActionTypes.RETRIEVE_ALL_TOPICS_ERROR), + ofType(QualityAssuranceTopicActionTypes.RETRIEVE_ALL_TOPICS_ERROR), tap(() => { this.notificationsService.error(null, this.translate.get('notifications.broker.topic.error.service.retrieve')); }) @@ -61,9 +61,9 @@ export class NotificationsBrokerTopicsEffects { * Clear find all topics requests from cache. */ @Effect({ dispatch: false }) addTopicsAction$ = this.actions$.pipe( - ofType(NotificationsBrokerTopicActionTypes.ADD_TOPICS), + ofType(QualityAssuranceTopicActionTypes.ADD_TOPICS), tap(() => { - this.notificationsBrokerTopicDataService.clearFindAllTopicsRequests(); + this.qualityAssuranceTopicDataService.clearFindAllTopicsRequests(); }) ); @@ -73,15 +73,15 @@ export class NotificationsBrokerTopicsEffects { * @param {Store} store$ * @param {TranslateService} translate * @param {NotificationsService} notificationsService - * @param {NotificationsBrokerTopicsService} notificationsBrokerTopicService - * @param {NotificationsBrokerTopicRestService} notificationsBrokerTopicDataService + * @param {QualityAssuranceTopicsService} qualityAssuranceTopicService + * @param {QualityAssuranceTopicRestService} qualityAssuranceTopicDataService */ constructor( private actions$: Actions, private store$: Store, private translate: TranslateService, private notificationsService: NotificationsService, - private notificationsBrokerTopicService: NotificationsBrokerTopicsService, - private notificationsBrokerTopicDataService: NotificationsBrokerTopicRestService + private qualityAssuranceTopicService: QualityAssuranceTopicsService, + private qualityAssuranceTopicDataService: QualityAssuranceTopicRestService ) { } } diff --git a/src/app/notifications/broker/topics/notifications-broker-topics.reducer.spec.ts b/src/app/notifications/qa/topics/quality-assurance-topics.reducer.spec.ts similarity index 51% rename from src/app/notifications/broker/topics/notifications-broker-topics.reducer.spec.ts rename to src/app/notifications/qa/topics/quality-assurance-topics.reducer.spec.ts index 523fac9550..a1c002d3f2 100644 --- a/src/app/notifications/broker/topics/notifications-broker-topics.reducer.spec.ts +++ b/src/app/notifications/qa/topics/quality-assurance-topics.reducer.spec.ts @@ -2,20 +2,20 @@ import { AddTopicsAction, RetrieveAllTopicsAction, RetrieveAllTopicsErrorAction -} from './notifications-broker-topics.actions'; -import { notificationsBrokerTopicsReducer, NotificationsBrokerTopicState } from './notifications-broker-topics.reducer'; +} from './quality-assurance-topics.actions'; +import { qualityAssuranceTopicsReducer, QualityAssuranceTopicState } from './quality-assurance-topics.reducer'; import { - notificationsBrokerTopicObjectMoreAbstract, - notificationsBrokerTopicObjectMorePid + qualityAssuranceTopicObjectMoreAbstract, + qualityAssuranceTopicObjectMorePid } from '../../../shared/mocks/notifications.mock'; -describe('notificationsBrokerTopicsReducer test suite', () => { - let notificationsBrokerTopicInitialState: NotificationsBrokerTopicState; +describe('qualityAssuranceTopicsReducer test suite', () => { + let qualityAssuranceTopicInitialState: QualityAssuranceTopicState; const elementPerPage = 3; const currentPage = 0; beforeEach(() => { - notificationsBrokerTopicInitialState = { + qualityAssuranceTopicInitialState = { topics: [], processing: false, loaded: false, @@ -26,30 +26,30 @@ describe('notificationsBrokerTopicsReducer test suite', () => { }); it('Action RETRIEVE_ALL_TOPICS should set the State property "processing" to TRUE', () => { - const expectedState = notificationsBrokerTopicInitialState; + const expectedState = qualityAssuranceTopicInitialState; expectedState.processing = true; const action = new RetrieveAllTopicsAction(elementPerPage, currentPage); - const newState = notificationsBrokerTopicsReducer(notificationsBrokerTopicInitialState, action); + const newState = qualityAssuranceTopicsReducer(qualityAssuranceTopicInitialState, action); expect(newState).toEqual(expectedState); }); it('Action RETRIEVE_ALL_TOPICS_ERROR should change the State to initial State but processing, loaded, and currentPage', () => { - const expectedState = notificationsBrokerTopicInitialState; + const expectedState = qualityAssuranceTopicInitialState; expectedState.processing = false; expectedState.loaded = true; expectedState.currentPage = 0; const action = new RetrieveAllTopicsErrorAction(); - const newState = notificationsBrokerTopicsReducer(notificationsBrokerTopicInitialState, action); + const newState = qualityAssuranceTopicsReducer(qualityAssuranceTopicInitialState, action); expect(newState).toEqual(expectedState); }); - it('Action ADD_TOPICS should populate the State with Notifications Broker topics', () => { + it('Action ADD_TOPICS should populate the State with Quality Assurance topics', () => { const expectedState = { - topics: [ notificationsBrokerTopicObjectMorePid, notificationsBrokerTopicObjectMoreAbstract ], + topics: [ qualityAssuranceTopicObjectMorePid, qualityAssuranceTopicObjectMoreAbstract ], processing: false, loaded: true, totalPages: 1, @@ -58,10 +58,10 @@ describe('notificationsBrokerTopicsReducer test suite', () => { }; const action = new AddTopicsAction( - [ notificationsBrokerTopicObjectMorePid, notificationsBrokerTopicObjectMoreAbstract ], + [ qualityAssuranceTopicObjectMorePid, qualityAssuranceTopicObjectMoreAbstract ], 1, 0, 2 ); - const newState = notificationsBrokerTopicsReducer(notificationsBrokerTopicInitialState, action); + const newState = qualityAssuranceTopicsReducer(qualityAssuranceTopicInitialState, action); expect(newState).toEqual(expectedState); }); diff --git a/src/app/notifications/qa/topics/quality-assurance-topics.reducer.ts b/src/app/notifications/qa/topics/quality-assurance-topics.reducer.ts new file mode 100644 index 0000000000..ff94f1b8bb --- /dev/null +++ b/src/app/notifications/qa/topics/quality-assurance-topics.reducer.ts @@ -0,0 +1,72 @@ +import { QualityAssuranceTopicObject } from '../../../core/notifications/qa/models/quality-assurance-topic.model'; +import { QualityAssuranceTopicActionTypes, QualityAssuranceTopicsActions } from './quality-assurance-topics.actions'; + +/** + * The interface representing the Quality Assurance topic state. + */ +export interface QualityAssuranceTopicState { + topics: QualityAssuranceTopicObject[]; + processing: boolean; + loaded: boolean; + totalPages: number; + currentPage: number; + totalElements: number; +} + +/** + * Used for the Quality Assurance topic state initialization. + */ +const qualityAssuranceTopicInitialState: QualityAssuranceTopicState = { + topics: [], + processing: false, + loaded: false, + totalPages: 0, + currentPage: 0, + totalElements: 0 +}; + +/** + * The Quality Assurance Topic Reducer + * + * @param state + * the current state initialized with qualityAssuranceTopicInitialState + * @param action + * the action to perform on the state + * @return QualityAssuranceTopicState + * the new state + */ +export function qualityAssuranceTopicsReducer(state = qualityAssuranceTopicInitialState, action: QualityAssuranceTopicsActions): QualityAssuranceTopicState { + switch (action.type) { + case QualityAssuranceTopicActionTypes.RETRIEVE_ALL_TOPICS: { + return Object.assign({}, state, { + topics: [], + processing: true + }); + } + + case QualityAssuranceTopicActionTypes.ADD_TOPICS: { + return Object.assign({}, state, { + topics: action.payload.topics, + processing: false, + loaded: true, + totalPages: action.payload.totalPages, + currentPage: state.currentPage, + totalElements: action.payload.totalElements + }); + } + + case QualityAssuranceTopicActionTypes.RETRIEVE_ALL_TOPICS_ERROR: { + return Object.assign({}, state, { + processing: false, + loaded: true, + totalPages: 0, + currentPage: 0, + totalElements: 0 + }); + } + + default: { + return state; + } + } +} diff --git a/src/app/notifications/broker/topics/notifications-broker-topics.service.spec.ts b/src/app/notifications/qa/topics/quality-assurance-topics.service.spec.ts similarity index 58% rename from src/app/notifications/broker/topics/notifications-broker-topics.service.spec.ts rename to src/app/notifications/qa/topics/quality-assurance-topics.service.spec.ts index e5616df320..6d945446b2 100644 --- a/src/app/notifications/broker/topics/notifications-broker-topics.service.spec.ts +++ b/src/app/notifications/qa/topics/quality-assurance-topics.service.spec.ts @@ -1,28 +1,28 @@ import { TestBed } from '@angular/core/testing'; import { of as observableOf } from 'rxjs'; -import { NotificationsBrokerTopicsService } from './notifications-broker-topics.service'; +import { QualityAssuranceTopicsService } from './quality-assurance-topics.service'; import { SortDirection, SortOptions } from '../../../core/cache/models/sort-options.model'; -import { NotificationsBrokerTopicRestService } from '../../../core/notifications/broker/topics/notifications-broker-topic-rest.service'; +import { QualityAssuranceTopicRestService } from '../../../core/notifications/qa/topics/quality-assurance-topic-rest.service'; import { PageInfo } from '../../../core/shared/page-info.model'; -import { FindListOptions } from '../../../core/data/request.models'; import { - getMockNotificationsBrokerTopicRestService, - notificationsBrokerTopicObjectMoreAbstract, - notificationsBrokerTopicObjectMorePid + getMockQualityAssuranceTopicRestService, + qualityAssuranceTopicObjectMoreAbstract, + qualityAssuranceTopicObjectMorePid } from '../../../shared/mocks/notifications.mock'; import { createSuccessfulRemoteDataObject } from '../../../shared/remote-data.utils'; import { cold } from 'jasmine-marbles'; import { buildPaginatedList } from '../../../core/data/paginated-list.model'; import { RequestParam } from '../../../core/cache/models/request-param.model'; +import {FindListOptions} from '../../../core/data/find-list-options.model'; -describe('NotificationsBrokerTopicsService', () => { - let service: NotificationsBrokerTopicsService; - let restService: NotificationsBrokerTopicRestService; +describe('QualityAssuranceTopicsService', () => { + let service: QualityAssuranceTopicsService; + let restService: QualityAssuranceTopicRestService; let serviceAsAny: any; let restServiceAsAny: any; const pageInfo = new PageInfo(); - const array = [ notificationsBrokerTopicObjectMorePid, notificationsBrokerTopicObjectMoreAbstract ]; + const array = [ qualityAssuranceTopicObjectMorePid, qualityAssuranceTopicObjectMoreAbstract ]; const paginatedList = buildPaginatedList(pageInfo, array); const paginatedListRD = createSuccessfulRemoteDataObject(paginatedList); const elementsPerPage = 3; @@ -31,22 +31,22 @@ describe('NotificationsBrokerTopicsService', () => { beforeEach(async () => { TestBed.configureTestingModule({ providers: [ - { provide: NotificationsBrokerTopicRestService, useClass: getMockNotificationsBrokerTopicRestService }, - { provide: NotificationsBrokerTopicsService, useValue: service } + { provide: QualityAssuranceTopicRestService, useClass: getMockQualityAssuranceTopicRestService }, + { provide: QualityAssuranceTopicsService, useValue: service } ] }).compileComponents(); }); beforeEach(() => { - restService = TestBed.get(NotificationsBrokerTopicRestService); + restService = TestBed.get(QualityAssuranceTopicRestService); restServiceAsAny = restService; restServiceAsAny.getTopics.and.returnValue(observableOf(paginatedListRD)); - service = new NotificationsBrokerTopicsService(restService); + service = new QualityAssuranceTopicsService(restService); serviceAsAny = service; }); describe('getTopics', () => { - it('Should proxy the call to notificationsBrokerTopicRestService.getTopics', () => { + it('Should proxy the call to qualityAssuranceTopicRestService.getTopics', () => { const sortOptions = new SortOptions('name', SortDirection.ASC); const findListOptions: FindListOptions = { elementsPerPage: elementsPerPage, @@ -56,10 +56,10 @@ describe('NotificationsBrokerTopicsService', () => { }; service.setSourceId('ENRICH!MORE!ABSTRACT'); const result = service.getTopics(elementsPerPage, currentPage); - expect((service as any).notificationsBrokerTopicRestService.getTopics).toHaveBeenCalledWith(findListOptions); + expect((service as any).qualityAssuranceTopicRestService.getTopics).toHaveBeenCalledWith(findListOptions); }); - it('Should return a paginated list of Notifications Broker topics', () => { + it('Should return a paginated list of Quality Assurance topics', () => { const expected = cold('(a|)', { a: paginatedList }); diff --git a/src/app/notifications/broker/topics/notifications-broker-topics.service.ts b/src/app/notifications/qa/topics/quality-assurance-topics.service.ts similarity index 51% rename from src/app/notifications/broker/topics/notifications-broker-topics.service.ts rename to src/app/notifications/qa/topics/quality-assurance-topics.service.ts index 80c52a70a9..c09a0750e0 100644 --- a/src/app/notifications/broker/topics/notifications-broker-topics.service.ts +++ b/src/app/notifications/qa/topics/quality-assurance-topics.service.ts @@ -1,26 +1,26 @@ import { Injectable } from '@angular/core'; import { Observable } from 'rxjs'; import { find, map } from 'rxjs/operators'; -import { NotificationsBrokerTopicRestService } from '../../../core/notifications/broker/topics/notifications-broker-topic-rest.service'; +import { QualityAssuranceTopicRestService } from '../../../core/notifications/qa/topics/quality-assurance-topic-rest.service'; import { SortDirection, SortOptions } from '../../../core/cache/models/sort-options.model'; -import { FindListOptions } from '../../../core/data/request.models'; import { RemoteData } from '../../../core/data/remote-data'; import { PaginatedList } from '../../../core/data/paginated-list.model'; -import { NotificationsBrokerTopicObject } from '../../../core/notifications/broker/models/notifications-broker-topic.model'; +import { QualityAssuranceTopicObject } from '../../../core/notifications/qa/models/quality-assurance-topic.model'; import { RequestParam } from '../../../core/cache/models/request-param.model'; +import {FindListOptions} from '../../../core/data/find-list-options.model'; /** - * The service handling all Notifications Broker topic requests to the REST service. + * The service handling all Quality Assurance topic requests to the REST service. */ @Injectable() -export class NotificationsBrokerTopicsService { +export class QualityAssuranceTopicsService { /** * Initialize the service variables. - * @param {NotificationsBrokerTopicRestService} notificationsBrokerTopicRestService + * @param {QualityAssuranceTopicRestService} qualityAssuranceTopicRestService */ constructor( - private notificationsBrokerTopicRestService: NotificationsBrokerTopicRestService + private qualityAssuranceTopicRestService: QualityAssuranceTopicRestService ) { } /** @@ -29,16 +29,16 @@ export class NotificationsBrokerTopicsService { sourceId: string; /** - * Return the list of Notifications Broker topics managing pagination and errors. + * Return the list of Quality Assurance topics managing pagination and errors. * * @param elementsPerPage * The number of the topics per page * @param currentPage * The page number to retrieve - * @return Observable> - * The list of Notifications Broker topics. + * @return Observable> + * The list of Quality Assurance topics. */ - public getTopics(elementsPerPage, currentPage): Observable> { + public getTopics(elementsPerPage, currentPage): Observable> { const sortOptions = new SortOptions('name', SortDirection.ASC); const findListOptions: FindListOptions = { @@ -48,13 +48,13 @@ export class NotificationsBrokerTopicsService { searchParams: [new RequestParam('source', this.sourceId)] }; - return this.notificationsBrokerTopicRestService.getTopics(findListOptions).pipe( - find((rd: RemoteData>) => !rd.isResponsePending), - map((rd: RemoteData>) => { + return this.qualityAssuranceTopicRestService.getTopics(findListOptions).pipe( + find((rd: RemoteData>) => !rd.isResponsePending), + map((rd: RemoteData>) => { if (rd.hasSucceeded) { return rd.payload; } else { - throw new Error('Can\'t retrieve Notifications Broker topics from the Broker topics REST service'); + throw new Error('Can\'t retrieve Quality Assurance topics from the Broker topics REST service'); } }) ); diff --git a/src/app/notifications/selectors.ts b/src/app/notifications/selectors.ts index 0436a35eb3..3ab769aa95 100644 --- a/src/app/notifications/selectors.ts +++ b/src/app/notifications/selectors.ts @@ -1,10 +1,10 @@ import { createSelector, MemoizedSelector } from '@ngrx/store'; import { subStateSelector } from '../shared/selector.util'; import { notificationsSelector, NotificationsState } from './notifications.reducer'; -import { NotificationsBrokerTopicObject } from '../core/notifications/broker/models/notifications-broker-topic.model'; -import { NotificationsBrokerTopicState } from './broker/topics/notifications-broker-topics.reducer'; -import { NotificationsBrokerSourceState } from './broker/source/notifications-broker-source.reducer'; -import { NotificationsBrokerSourceObject } from '../core/notifications/broker/models/notifications-broker-source.model'; +import { QualityAssuranceTopicObject } from '../core/notifications/qa/models/quality-assurance-topic.model'; +import { QualityAssuranceTopicState } from './qa/topics/quality-assurance-topics.reducer'; +import { QualityAssuranceSourceState } from './qa/source/quality-assurance-source.reducer'; +import { QualityAssuranceSourceObject } from '../core/notifications/qa/models/quality-assurance-source.model'; /** * Returns the Notifications state. @@ -14,33 +14,33 @@ import { NotificationsBrokerSourceObject } from '../core/notifications/broker/mo */ const _getNotificationsState = (state: any) => state.notifications; -// Notifications Broker topics +// Quality Assurance topics // ---------------------------------------------------------------------------- /** - * Returns the Notifications Broker topics State. - * @function notificationsBrokerTopicsStateSelector - * @return {NotificationsBrokerTopicState} + * Returns the Quality Assurance topics State. + * @function qualityAssuranceTopicsStateSelector + * @return {QualityAssuranceTopicState} */ -export function notificationsBrokerTopicsStateSelector(): MemoizedSelector { - return subStateSelector(notificationsSelector, 'brokerTopic'); +export function qualityAssuranceTopicsStateSelector(): MemoizedSelector { + return subStateSelector(notificationsSelector, 'brokerTopic'); } /** - * Returns the Notifications Broker topics list. - * @function notificationsBrokerTopicsObjectSelector - * @return {NotificationsBrokerTopicObject[]} + * Returns the Quality Assurance topics list. + * @function qualityAssuranceTopicsObjectSelector + * @return {QualityAssuranceTopicObject[]} */ -export function notificationsBrokerTopicsObjectSelector(): MemoizedSelector { - return subStateSelector(notificationsBrokerTopicsStateSelector(), 'topics'); +export function qualityAssuranceTopicsObjectSelector(): MemoizedSelector { + return subStateSelector(qualityAssuranceTopicsStateSelector(), 'topics'); } /** - * Returns true if the Notifications Broker topics are loaded. - * @function isNotificationsBrokerTopicsLoadedSelector + * Returns true if the Quality Assurance topics are loaded. + * @function isQualityAssuranceTopicsLoadedSelector * @return {boolean} */ -export const isNotificationsBrokerTopicsLoadedSelector = createSelector(_getNotificationsState, +export const isQualityAssuranceTopicsLoadedSelector = createSelector(_getNotificationsState, (state: NotificationsState) => state.brokerTopic.loaded ); @@ -49,64 +49,64 @@ export const isNotificationsBrokerTopicsLoadedSelector = createSelector(_getNoti * @function isDeduplicationSetsProcessingSelector * @return {boolean} */ -export const isNotificationsBrokerTopicsProcessingSelector = createSelector(_getNotificationsState, +export const isQualityAssuranceTopicsProcessingSelector = createSelector(_getNotificationsState, (state: NotificationsState) => state.brokerTopic.processing ); /** - * Returns the total available pages of Notifications Broker topics. - * @function getNotificationsBrokerTopicsTotalPagesSelector + * Returns the total available pages of Quality Assurance topics. + * @function getQualityAssuranceTopicsTotalPagesSelector * @return {number} */ -export const getNotificationsBrokerTopicsTotalPagesSelector = createSelector(_getNotificationsState, +export const getQualityAssuranceTopicsTotalPagesSelector = createSelector(_getNotificationsState, (state: NotificationsState) => state.brokerTopic.totalPages ); /** - * Returns the current page of Notifications Broker topics. - * @function getNotificationsBrokerTopicsCurrentPageSelector + * Returns the current page of Quality Assurance topics. + * @function getQualityAssuranceTopicsCurrentPageSelector * @return {number} */ -export const getNotificationsBrokerTopicsCurrentPageSelector = createSelector(_getNotificationsState, +export const getQualityAssuranceTopicsCurrentPageSelector = createSelector(_getNotificationsState, (state: NotificationsState) => state.brokerTopic.currentPage ); /** - * Returns the total number of Notifications Broker topics. - * @function getNotificationsBrokerTopicsTotalsSelector + * Returns the total number of Quality Assurance topics. + * @function getQualityAssuranceTopicsTotalsSelector * @return {number} */ -export const getNotificationsBrokerTopicsTotalsSelector = createSelector(_getNotificationsState, +export const getQualityAssuranceTopicsTotalsSelector = createSelector(_getNotificationsState, (state: NotificationsState) => state.brokerTopic.totalElements ); -// Notifications Broker source +// Quality Assurance source // ---------------------------------------------------------------------------- /** - * Returns the Notifications Broker source State. - * @function notificationsBrokerSourceStateSelector - * @return {NotificationsBrokerSourceState} + * Returns the Quality Assurance source State. + * @function qualityAssuranceSourceStateSelector + * @return {QualityAssuranceSourceState} */ - export function notificationsBrokerSourceStateSelector(): MemoizedSelector { - return subStateSelector(notificationsSelector, 'brokerSource'); + export function qualityAssuranceSourceStateSelector(): MemoizedSelector { + return subStateSelector(notificationsSelector, 'brokerSource'); } /** - * Returns the Notifications Broker source list. - * @function notificationsBrokerSourceObjectSelector - * @return {NotificationsBrokerSourceObject[]} + * Returns the Quality Assurance source list. + * @function qualityAssuranceSourceObjectSelector + * @return {QualityAssuranceSourceObject[]} */ -export function notificationsBrokerSourceObjectSelector(): MemoizedSelector { - return subStateSelector(notificationsBrokerSourceStateSelector(), 'source'); +export function qualityAssuranceSourceObjectSelector(): MemoizedSelector { + return subStateSelector(qualityAssuranceSourceStateSelector(), 'source'); } /** - * Returns true if the Notifications Broker source are loaded. - * @function isNotificationsBrokerSourceLoadedSelector + * Returns true if the Quality Assurance source are loaded. + * @function isQualityAssuranceSourceLoadedSelector * @return {boolean} */ -export const isNotificationsBrokerSourceLoadedSelector = createSelector(_getNotificationsState, +export const isQualityAssuranceSourceLoadedSelector = createSelector(_getNotificationsState, (state: NotificationsState) => state.brokerSource.loaded ); @@ -115,33 +115,33 @@ export const isNotificationsBrokerSourceLoadedSelector = createSelector(_getNoti * @function isDeduplicationSetsProcessingSelector * @return {boolean} */ -export const isNotificationsBrokerSourceProcessingSelector = createSelector(_getNotificationsState, +export const isQualityAssuranceSourceProcessingSelector = createSelector(_getNotificationsState, (state: NotificationsState) => state.brokerSource.processing ); /** - * Returns the total available pages of Notifications Broker source. - * @function getNotificationsBrokerSourceTotalPagesSelector + * Returns the total available pages of Quality Assurance source. + * @function getQualityAssuranceSourceTotalPagesSelector * @return {number} */ -export const getNotificationsBrokerSourceTotalPagesSelector = createSelector(_getNotificationsState, +export const getQualityAssuranceSourceTotalPagesSelector = createSelector(_getNotificationsState, (state: NotificationsState) => state.brokerSource.totalPages ); /** - * Returns the current page of Notifications Broker source. - * @function getNotificationsBrokerSourceCurrentPageSelector + * Returns the current page of Quality Assurance source. + * @function getQualityAssuranceSourceCurrentPageSelector * @return {number} */ -export const getNotificationsBrokerSourceCurrentPageSelector = createSelector(_getNotificationsState, +export const getQualityAssuranceSourceCurrentPageSelector = createSelector(_getNotificationsState, (state: NotificationsState) => state.brokerSource.currentPage ); /** - * Returns the total number of Notifications Broker source. - * @function getNotificationsBrokerSourceTotalsSelector + * Returns the total number of Quality Assurance source. + * @function getQualityAssuranceSourceTotalsSelector * @return {number} */ -export const getNotificationsBrokerSourceTotalsSelector = createSelector(_getNotificationsState, +export const getQualityAssuranceSourceTotalsSelector = createSelector(_getNotificationsState, (state: NotificationsState) => state.brokerSource.totalElements ); diff --git a/src/app/shared/mocks/notifications.mock.ts b/src/app/shared/mocks/notifications.mock.ts index 8af034ea32..845c13a4ce 100644 --- a/src/app/shared/mocks/notifications.mock.ts +++ b/src/app/shared/mocks/notifications.mock.ts @@ -1,9 +1,9 @@ import { of as observableOf } from 'rxjs'; import { ResourceType } from '../../core/shared/resource-type'; -import { NotificationsBrokerTopicObject } from '../../core/notifications/broker/models/notifications-broker-topic.model'; -import { NotificationsBrokerEventObject } from '../../core/notifications/broker/models/notifications-broker-event.model'; -import { NotificationsBrokerTopicRestService } from '../../core/notifications/broker/topics/notifications-broker-topic-rest.service'; -import { NotificationsBrokerEventRestService } from '../../core/notifications/broker/events/notifications-broker-event-rest.service'; +import { QualityAssuranceTopicObject } from '../../core/notifications/qa/models/quality-assurance-topic.model'; +import { QualityAssuranceEventObject } from '../../core/notifications/qa/models/quality-assurance-event.model'; +import { QualityAssuranceTopicRestService } from '../../core/notifications/qa/topics/quality-assurance-topic-rest.service'; +import { QualityAssuranceEventRestService } from '../../core/notifications/qa/events/quality-assurance-event-rest.service'; import { DSpaceObject } from '../../core/shared/dspace-object.model'; import { NotificationsStateService } from '../../notifications/notifications-state.service'; import { Item } from '../../core/shared/item.model'; @@ -13,7 +13,7 @@ import { createSuccessfulRemoteDataObject$ } from '../remote-data.utils'; import { SearchResult } from '../search/models/search-result.model'; -import { NotificationsBrokerSourceObject } from '../../core/notifications/broker/models/notifications-broker-source.model'; +import { QualityAssuranceSourceObject } from '../../core/notifications/qa/models/quality-assurance-source.model'; // REST Mock --------------------------------------------------------------------- // ------------------------------------------------------------------------------- @@ -1333,7 +1333,7 @@ export const NotificationsMockDspaceObject: SearchResult = Object. // Sources // ------------------------------------------------------------------------------- -export const notificationsBrokerSourceObjectMorePid: NotificationsBrokerSourceObject = { +export const qualityAssuranceSourceObjectMorePid: QualityAssuranceSourceObject = { type: new ResourceType('nbsource'), id: 'ENRICH!MORE!PID', lastEvent: '2020/10/09 10:11 UTC', @@ -1345,7 +1345,7 @@ export const notificationsBrokerSourceObjectMorePid: NotificationsBrokerSourceOb } }; -export const notificationsBrokerSourceObjectMoreAbstract: NotificationsBrokerSourceObject = { +export const qualityAssuranceSourceObjectMoreAbstract: QualityAssuranceSourceObject = { type: new ResourceType('nbsource'), id: 'ENRICH!MORE!ABSTRACT', lastEvent: '2020/09/08 21:14 UTC', @@ -1357,7 +1357,7 @@ export const notificationsBrokerSourceObjectMoreAbstract: NotificationsBrokerSou } }; -export const notificationsBrokerSourceObjectMissingPid: NotificationsBrokerSourceObject = { +export const qualityAssuranceSourceObjectMissingPid: QualityAssuranceSourceObject = { type: new ResourceType('nbsource'), id: 'ENRICH!MISSING!PID', lastEvent: '2020/10/01 07:36 UTC', @@ -1372,7 +1372,7 @@ export const notificationsBrokerSourceObjectMissingPid: NotificationsBrokerSourc // Topics // ------------------------------------------------------------------------------- -export const notificationsBrokerTopicObjectMorePid: NotificationsBrokerTopicObject = { +export const qualityAssuranceTopicObjectMorePid: QualityAssuranceTopicObject = { type: new ResourceType('nbtopic'), id: 'ENRICH!MORE!PID', name: 'ENRICH/MORE/PID', @@ -1385,7 +1385,7 @@ export const notificationsBrokerTopicObjectMorePid: NotificationsBrokerTopicObje } }; -export const notificationsBrokerTopicObjectMoreAbstract: NotificationsBrokerTopicObject = { +export const qualityAssuranceTopicObjectMoreAbstract: QualityAssuranceTopicObject = { type: new ResourceType('nbtopic'), id: 'ENRICH!MORE!ABSTRACT', name: 'ENRICH/MORE/ABSTRACT', @@ -1398,7 +1398,7 @@ export const notificationsBrokerTopicObjectMoreAbstract: NotificationsBrokerTopi } }; -export const notificationsBrokerTopicObjectMissingPid: NotificationsBrokerTopicObject = { +export const qualityAssuranceTopicObjectMissingPid: QualityAssuranceTopicObject = { type: new ResourceType('nbtopic'), id: 'ENRICH!MISSING!PID', name: 'ENRICH/MISSING/PID', @@ -1411,7 +1411,7 @@ export const notificationsBrokerTopicObjectMissingPid: NotificationsBrokerTopicO } }; -export const notificationsBrokerTopicObjectMissingAbstract: NotificationsBrokerTopicObject = { +export const qualityAssuranceTopicObjectMissingAbstract: QualityAssuranceTopicObject = { type: new ResourceType('nbtopic'), id: 'ENRICH!MISSING!ABSTRACT', name: 'ENRICH/MISSING/ABSTRACT', @@ -1424,7 +1424,7 @@ export const notificationsBrokerTopicObjectMissingAbstract: NotificationsBrokerT } }; -export const notificationsBrokerTopicObjectMissingAcm: NotificationsBrokerTopicObject = { +export const qualityAssuranceTopicObjectMissingAcm: QualityAssuranceTopicObject = { type: new ResourceType('nbtopic'), id: 'ENRICH!MISSING!SUBJECT!ACM', name: 'ENRICH/MISSING/SUBJECT/ACM', @@ -1437,7 +1437,7 @@ export const notificationsBrokerTopicObjectMissingAcm: NotificationsBrokerTopicO } }; -export const notificationsBrokerTopicObjectMissingProject: NotificationsBrokerTopicObject = { +export const qualityAssuranceTopicObjectMissingProject: QualityAssuranceTopicObject = { type: new ResourceType('nbtopic'), id: 'ENRICH!MISSING!PROJECT', name: 'ENRICH/MISSING/PROJECT', @@ -1453,7 +1453,7 @@ export const notificationsBrokerTopicObjectMissingProject: NotificationsBrokerTo // Events // ------------------------------------------------------------------------------- -export const notificationsBrokerEventObjectMissingPid: NotificationsBrokerEventObject = { +export const qualityAssuranceEventObjectMissingPid: QualityAssuranceEventObject = { id: '123e4567-e89b-12d3-a456-426614174001', uuid: '123e4567-e89b-12d3-a456-426614174001', type: new ResourceType('nbevent'), @@ -1489,10 +1489,10 @@ export const notificationsBrokerEventObjectMissingPid: NotificationsBrokerEventO related: observableOf(createSuccessfulRemoteDataObject(ItemMockPid10)) }; -export const notificationsBrokerEventObjectMissingPid2: NotificationsBrokerEventObject = { +export const qualityAssuranceEventObjectMissingPid2: QualityAssuranceEventObject = { id: '123e4567-e89b-12d3-a456-426614174004', uuid: '123e4567-e89b-12d3-a456-426614174004', - type: new ResourceType('notificationsBrokerEvent'), + type: new ResourceType('qualityAssuranceEvent'), originalId: 'oai:www.openstarts.units.it:10077/21486', title: 'UNA NUOVA RILETTURA DELL\u0027 ARISTOTELE DI FRANZ BRENTANO ALLA LUCE DI ALCUNI INEDITI', trust: 1.0, @@ -1525,10 +1525,10 @@ export const notificationsBrokerEventObjectMissingPid2: NotificationsBrokerEvent related: observableOf(createSuccessfulRemoteDataObject(ItemMockPid10)) }; -export const notificationsBrokerEventObjectMissingPid3: NotificationsBrokerEventObject = { +export const qualityAssuranceEventObjectMissingPid3: QualityAssuranceEventObject = { id: '123e4567-e89b-12d3-a456-426614174005', uuid: '123e4567-e89b-12d3-a456-426614174005', - type: new ResourceType('notificationsBrokerEvent'), + type: new ResourceType('qualityAssuranceEvent'), originalId: 'oai:www.openstarts.units.it:10077/554', title: 'Sustainable development', trust: 0.375, @@ -1561,10 +1561,10 @@ export const notificationsBrokerEventObjectMissingPid3: NotificationsBrokerEvent related: observableOf(createSuccessfulRemoteDataObject(ItemMockPid10)) }; -export const notificationsBrokerEventObjectMissingPid4: NotificationsBrokerEventObject = { +export const qualityAssuranceEventObjectMissingPid4: QualityAssuranceEventObject = { id: '123e4567-e89b-12d3-a456-426614174006', uuid: '123e4567-e89b-12d3-a456-426614174006', - type: new ResourceType('notificationsBrokerEvent'), + type: new ResourceType('qualityAssuranceEvent'), originalId: 'oai:www.openstarts.units.it:10077/10787', title: 'Reply to Critics', trust: 1.0, @@ -1597,10 +1597,10 @@ export const notificationsBrokerEventObjectMissingPid4: NotificationsBrokerEvent related: observableOf(createSuccessfulRemoteDataObject(ItemMockPid10)) }; -export const notificationsBrokerEventObjectMissingPid5: NotificationsBrokerEventObject = { +export const qualityAssuranceEventObjectMissingPid5: QualityAssuranceEventObject = { id: '123e4567-e89b-12d3-a456-426614174007', uuid: '123e4567-e89b-12d3-a456-426614174007', - type: new ResourceType('notificationsBrokerEvent'), + type: new ResourceType('qualityAssuranceEvent'), originalId: 'oai:www.openstarts.units.it:10077/11339', title: 'PROGETTAZIONE, SINTESI E VALUTAZIONE DELL\u0027ATTIVITA\u0027 ANTIMICOBATTERICA ED ANTIFUNGINA DI NUOVI DERIVATI ETEROCICLICI', trust: 0.375, @@ -1633,10 +1633,10 @@ export const notificationsBrokerEventObjectMissingPid5: NotificationsBrokerEvent related: observableOf(createSuccessfulRemoteDataObject(ItemMockPid10)) }; -export const notificationsBrokerEventObjectMissingPid6: NotificationsBrokerEventObject = { +export const qualityAssuranceEventObjectMissingPid6: QualityAssuranceEventObject = { id: '123e4567-e89b-12d3-a456-426614174008', uuid: '123e4567-e89b-12d3-a456-426614174008', - type: new ResourceType('notificationsBrokerEvent'), + type: new ResourceType('qualityAssuranceEvent'), originalId: 'oai:www.openstarts.units.it:10077/29860', title: 'Donald Davidson', trust: 0.375, @@ -1669,10 +1669,10 @@ export const notificationsBrokerEventObjectMissingPid6: NotificationsBrokerEvent related: observableOf(createSuccessfulRemoteDataObject(ItemMockPid10)) }; -export const notificationsBrokerEventObjectMissingAbstract: NotificationsBrokerEventObject = { +export const qualityAssuranceEventObjectMissingAbstract: QualityAssuranceEventObject = { id: '123e4567-e89b-12d3-a456-426614174009', uuid: '123e4567-e89b-12d3-a456-426614174009', - type: new ResourceType('notificationsBrokerEvent'), + type: new ResourceType('qualityAssuranceEvent'), originalId: 'oai:www.openstarts.units.it:10077/21110', title: 'Missing abstract article', trust: 0.751, @@ -1705,10 +1705,10 @@ export const notificationsBrokerEventObjectMissingAbstract: NotificationsBrokerE related: observableOf(createSuccessfulRemoteDataObject(ItemMockPid10)) }; -export const notificationsBrokerEventObjectMissingProjectFound: NotificationsBrokerEventObject = { +export const qualityAssuranceEventObjectMissingProjectFound: QualityAssuranceEventObject = { id: '123e4567-e89b-12d3-a456-426614174002', uuid: '123e4567-e89b-12d3-a456-426614174002', - type: new ResourceType('notificationsBrokerEvent'), + type: new ResourceType('qualityAssuranceEvent'), originalId: 'oai:www.openstarts.units.it:10077/21838', title: 'Egypt, crossroad of translations and literary interweavings (3rd-6th centuries). A reconsideration of earlier Coptic literature', trust: 1.0, @@ -1741,10 +1741,10 @@ export const notificationsBrokerEventObjectMissingProjectFound: NotificationsBro related: createSuccessfulRemoteDataObject$(ItemMockPid10) }; -export const notificationsBrokerEventObjectMissingProjectNotFound: NotificationsBrokerEventObject = { +export const qualityAssuranceEventObjectMissingProjectNotFound: QualityAssuranceEventObject = { id: '123e4567-e89b-12d3-a456-426614174003', uuid: '123e4567-e89b-12d3-a456-426614174003', - type: new ResourceType('notificationsBrokerEvent'), + type: new ResourceType('qualityAssuranceEvent'), originalId: 'oai:www.openstarts.units.it:10077/21838', title: 'Morocco, crossroad of translations and literary interweavings (3rd-6th centuries). A reconsideration of earlier Coptic literature', trust: 1.0, @@ -1785,51 +1785,51 @@ export const notificationsBrokerEventObjectMissingProjectNotFound: Notifications */ export function getMockNotificationsStateService(): any { return jasmine.createSpyObj('NotificationsStateService', { - getNotificationsBrokerTopics: jasmine.createSpy('getNotificationsBrokerTopics'), - isNotificationsBrokerTopicsLoading: jasmine.createSpy('isNotificationsBrokerTopicsLoading'), - isNotificationsBrokerTopicsLoaded: jasmine.createSpy('isNotificationsBrokerTopicsLoaded'), - isNotificationsBrokerTopicsProcessing: jasmine.createSpy('isNotificationsBrokerTopicsProcessing'), - getNotificationsBrokerTopicsTotalPages: jasmine.createSpy('getNotificationsBrokerTopicsTotalPages'), - getNotificationsBrokerTopicsCurrentPage: jasmine.createSpy('getNotificationsBrokerTopicsCurrentPage'), - getNotificationsBrokerTopicsTotals: jasmine.createSpy('getNotificationsBrokerTopicsTotals'), - dispatchRetrieveNotificationsBrokerTopics: jasmine.createSpy('dispatchRetrieveNotificationsBrokerTopics'), - getNotificationsBrokerSource: jasmine.createSpy('getNotificationsBrokerSource'), - isNotificationsBrokerSourceLoading: jasmine.createSpy('isNotificationsBrokerSourceLoading'), - isNotificationsBrokerSourceLoaded: jasmine.createSpy('isNotificationsBrokerSourceLoaded'), - isNotificationsBrokerSourceProcessing: jasmine.createSpy('isNotificationsBrokerSourceProcessing'), - getNotificationsBrokerSourceTotalPages: jasmine.createSpy('getNotificationsBrokerSourceTotalPages'), - getNotificationsBrokerSourceCurrentPage: jasmine.createSpy('getNotificationsBrokerSourceCurrentPage'), - getNotificationsBrokerSourceTotals: jasmine.createSpy('getNotificationsBrokerSourceTotals'), - dispatchRetrieveNotificationsBrokerSource: jasmine.createSpy('dispatchRetrieveNotificationsBrokerSource'), + getQualityAssuranceTopics: jasmine.createSpy('getQualityAssuranceTopics'), + isQualityAssuranceTopicsLoading: jasmine.createSpy('isQualityAssuranceTopicsLoading'), + isQualityAssuranceTopicsLoaded: jasmine.createSpy('isQualityAssuranceTopicsLoaded'), + isQualityAssuranceTopicsProcessing: jasmine.createSpy('isQualityAssuranceTopicsProcessing'), + getQualityAssuranceTopicsTotalPages: jasmine.createSpy('getQualityAssuranceTopicsTotalPages'), + getQualityAssuranceTopicsCurrentPage: jasmine.createSpy('getQualityAssuranceTopicsCurrentPage'), + getQualityAssuranceTopicsTotals: jasmine.createSpy('getQualityAssuranceTopicsTotals'), + dispatchRetrieveQualityAssuranceTopics: jasmine.createSpy('dispatchRetrieveQualityAssuranceTopics'), + getQualityAssuranceSource: jasmine.createSpy('getQualityAssuranceSource'), + isQualityAssuranceSourceLoading: jasmine.createSpy('isQualityAssuranceSourceLoading'), + isQualityAssuranceSourceLoaded: jasmine.createSpy('isQualityAssuranceSourceLoaded'), + isQualityAssuranceSourceProcessing: jasmine.createSpy('isQualityAssuranceSourceProcessing'), + getQualityAssuranceSourceTotalPages: jasmine.createSpy('getQualityAssuranceSourceTotalPages'), + getQualityAssuranceSourceCurrentPage: jasmine.createSpy('getQualityAssuranceSourceCurrentPage'), + getQualityAssuranceSourceTotals: jasmine.createSpy('getQualityAssuranceSourceTotals'), + dispatchRetrieveQualityAssuranceSource: jasmine.createSpy('dispatchRetrieveQualityAssuranceSource'), dispatchMarkUserSuggestionsAsVisitedAction: jasmine.createSpy('dispatchMarkUserSuggestionsAsVisitedAction') }); } /** - * Mock for [[NotificationsBrokerSourceRestService]] + * Mock for [[QualityAssuranceSourceRestService]] */ - export function getMockNotificationsBrokerSourceRestService(): NotificationsBrokerTopicRestService { - return jasmine.createSpyObj('NotificationsBrokerSourceRestService', { + export function getMockQualityAssuranceSourceRestService(): QualityAssuranceTopicRestService { + return jasmine.createSpyObj('QualityAssuranceSourceRestService', { getSources: jasmine.createSpy('getSources'), getSource: jasmine.createSpy('getSource'), }); } /** - * Mock for [[NotificationsBrokerTopicRestService]] + * Mock for [[QualityAssuranceTopicRestService]] */ -export function getMockNotificationsBrokerTopicRestService(): NotificationsBrokerTopicRestService { - return jasmine.createSpyObj('NotificationsBrokerTopicRestService', { +export function getMockQualityAssuranceTopicRestService(): QualityAssuranceTopicRestService { + return jasmine.createSpyObj('QualityAssuranceTopicRestService', { getTopics: jasmine.createSpy('getTopics'), getTopic: jasmine.createSpy('getTopic'), }); } /** - * Mock for [[NotificationsBrokerEventRestService]] + * Mock for [[QualityAssuranceEventRestService]] */ -export function getMockNotificationsBrokerEventRestService(): NotificationsBrokerEventRestService { - return jasmine.createSpyObj('NotificationsBrokerEventRestService', { +export function getMockQualityAssuranceEventRestService(): QualityAssuranceEventRestService { + return jasmine.createSpyObj('QualityAssuranceEventRestService', { getEventsByTopic: jasmine.createSpy('getEventsByTopic'), getEvent: jasmine.createSpy('getEvent'), patchEvent: jasmine.createSpy('patchEvent'), @@ -1840,7 +1840,7 @@ export function getMockNotificationsBrokerEventRestService(): NotificationsBroke } /** - * Mock for [[NotificationsBrokerEventRestService]] + * Mock for [[QualityAssuranceEventRestService]] */ export function getMockSuggestionsService(): any { return jasmine.createSpyObj('SuggestionsService', { diff --git a/src/assets/i18n/en.json5 b/src/assets/i18n/en.json5 index d092e4f2c8..0f5db4eb5b 100644 --- a/src/assets/i18n/en.json5 +++ b/src/assets/i18n/en.json5 @@ -499,13 +499,13 @@ "admin.access-control.groups.form.return": "Back", - "admin.notifications.broker.breadcrumbs": "Notifications Broker", + "admin.notifications.broker.breadcrumbs": "Quality Assurance", "admin.notifications.event.breadcrumbs": "Broker Suggestions", "admin.notifications.event.page.title": "Broker Suggestions", - "admin.notifications.broker.page.title": "Notifications Broker", + "admin.notifications.broker.page.title": "Quality Assurance", "admin.notifications.source.breadcrumbs": "Notifications Source", @@ -2687,7 +2687,7 @@ "menu.section.notifications": "Notifications", - "menu.section.notifications_broker": "Notifications Broker", + "menu.section.notifications_broker": "Quality Assurance", "menu.section.notifications_reciter": "Publication Claim", @@ -2889,9 +2889,9 @@ "notifications.events.title": "Broker Suggestions", - "notifications.broker.topic.error.service.retrieve": "An error occurred while loading the Notifications Broker topics", + "notifications.broker.topic.error.service.retrieve": "An error occurred while loading the Quality Assurance topics", - "notifications.broker.source.error.service.retrieve": "An error occurred while loading the Notifications Broker source", + "notifications.broker.source.error.service.retrieve": "An error occurred while loading the Quality Assurance source", "notifications.broker.events.description": "Below the list of all the suggestions for the selected topic.", From a355a154599a1b7b1860197626301bbb40006a31 Mon Sep 17 00:00:00 2001 From: Giuseppe Digilio Date: Tue, 5 Jul 2022 17:28:14 +0200 Subject: [PATCH 011/409] [CST-5249] Fix deprecated selector creation --- src/app/notifications/selectors.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/app/notifications/selectors.ts b/src/app/notifications/selectors.ts index 3ab769aa95..2b78b947f8 100644 --- a/src/app/notifications/selectors.ts +++ b/src/app/notifications/selectors.ts @@ -1,4 +1,4 @@ -import { createSelector, MemoizedSelector } from '@ngrx/store'; +import { createFeatureSelector, createSelector, MemoizedSelector } from '@ngrx/store'; import { subStateSelector } from '../shared/selector.util'; import { notificationsSelector, NotificationsState } from './notifications.reducer'; import { QualityAssuranceTopicObject } from '../core/notifications/qa/models/quality-assurance-topic.model'; @@ -12,7 +12,7 @@ import { QualityAssuranceSourceObject } from '../core/notifications/qa/models/qu * @param {AppState} state Top level state. * @return {NotificationsState} */ -const _getNotificationsState = (state: any) => state.notifications; +const _getNotificationsState = createFeatureSelector('notifications'); // Quality Assurance topics // ---------------------------------------------------------------------------- From a7d2278d993212d60cb8c43fdfe1da000d6f3e5c Mon Sep 17 00:00:00 2001 From: Luca Giamminonni Date: Wed, 6 Jul 2022 17:14:12 +0200 Subject: [PATCH 012/409] [CST-5249] Renamed nbevent and nbtopics --- .../admin-notifications-routing.module.ts | 10 +- ...quality-assurance-topics-page.component.ts | 2 +- ...ality-assurance-event-rest.service.spec.ts | 18 +-- .../quality-assurance-event-rest.service.ts | 2 +- ...ty-assurance-event-object.resource-type.ts | 2 +- .../models/quality-assurance-event.model.ts | 20 +-- ...y-assurance-source-object.resource-type.ts | 2 +- ...ty-assurance-topic-object.resource-type.ts | 2 +- ...lity-assurance-source-rest.service.spec.ts | 8 +- .../quality-assurance-source-rest.service.ts | 8 +- ...ality-assurance-topic-rest.service.spec.ts | 8 +- .../quality-assurance-topic-rest.service.ts | 8 +- src/app/menu.resolver.ts | 23 +++ .../notifications-state.service.spec.ts | 8 +- .../notifications/notifications.reducer.ts | 8 +- .../quality-assurance-events.component.html | 86 +++++------ .../quality-assurance-events.component.ts | 20 +-- .../project-entry-import-modal.component.ts | 6 +- .../quality-assurance-source.component.html | 20 +-- .../quality-assurance-source.effects.ts | 2 +- .../quality-assurance-topics.component.html | 20 +-- .../quality-assurance-topics.effects.ts | 2 +- src/app/notifications/selectors.ts | 24 +-- src/app/shared/mocks/notifications.mock.ts | 92 ++++++------ src/app/shared/selector.util.ts | 4 +- src/assets/i18n/en.json5 | 142 +++++++++--------- 26 files changed, 285 insertions(+), 262 deletions(-) diff --git a/src/app/admin/admin-notifications/admin-notifications-routing.module.ts b/src/app/admin/admin-notifications/admin-notifications-routing.module.ts index c9cca6d8d8..dc0d82c1d9 100644 --- a/src/app/admin/admin-notifications/admin-notifications-routing.module.ts +++ b/src/app/admin/admin-notifications/admin-notifications-routing.module.ts @@ -23,11 +23,11 @@ import { SourceDataResolver } from './admin-quality-assurance-source-page-compon pathMatch: 'full', resolve: { breadcrumb: I18nBreadcrumbResolver, - openaireBrokerTopicsParams: AdminQualityAssuranceTopicsPageResolver + openaireQualityAssuranceTopicsParams: AdminQualityAssuranceTopicsPageResolver }, data: { - title: 'admin.notifications.broker.page.title', - breadcrumbKey: 'admin.notifications.broker', + title: 'admin.quality-assurance.page.title', + breadcrumbKey: 'admin.quality-assurance', showBreadcrumbsFluid: false } }, @@ -38,7 +38,7 @@ import { SourceDataResolver } from './admin-quality-assurance-source-page-compon pathMatch: 'full', resolve: { breadcrumb: I18nBreadcrumbResolver, - openaireBrokerSourceParams: AdminQualityAssuranceSourcePageResolver, + openaireQualityAssuranceSourceParams: AdminQualityAssuranceSourcePageResolver, sourceData: SourceDataResolver }, data: { @@ -54,7 +54,7 @@ import { SourceDataResolver } from './admin-quality-assurance-source-page-compon pathMatch: 'full', resolve: { breadcrumb: I18nBreadcrumbResolver, - openaireBrokerEventsParams: AdminQualityAssuranceEventsPageResolver + openaireQualityAssuranceEventsParams: AdminQualityAssuranceEventsPageResolver }, data: { title: 'admin.notifications.event.page.title', diff --git a/src/app/admin/admin-notifications/admin-quality-assurance-topics-page/admin-quality-assurance-topics-page.component.ts b/src/app/admin/admin-notifications/admin-quality-assurance-topics-page/admin-quality-assurance-topics-page.component.ts index 53f951ba54..1b4f1d70aa 100644 --- a/src/app/admin/admin-notifications/admin-quality-assurance-topics-page/admin-quality-assurance-topics-page.component.ts +++ b/src/app/admin/admin-notifications/admin-quality-assurance-topics-page/admin-quality-assurance-topics-page.component.ts @@ -1,7 +1,7 @@ import { Component } from '@angular/core'; @Component({ - selector: 'ds-notification-broker-page', + selector: 'ds-notification-qa-page', templateUrl: './admin-quality-assurance-topics-page.component.html' }) export class AdminQualityAssuranceTopicsPageComponent { diff --git a/src/app/core/notifications/qa/events/quality-assurance-event-rest.service.spec.ts b/src/app/core/notifications/qa/events/quality-assurance-event-rest.service.spec.ts index 556665adbd..3734ae0dd2 100644 --- a/src/app/core/notifications/qa/events/quality-assurance-event-rest.service.spec.ts +++ b/src/app/core/notifications/qa/events/quality-assurance-event-rest.service.spec.ts @@ -38,15 +38,15 @@ describe('QualityAssuranceEventRestService', () => { let http: HttpClient; let comparator: any; - const endpointURL = 'https://rest.api/rest/api/integration/nbtopics'; + const endpointURL = 'https://rest.api/rest/api/integration/qatopics'; const requestUUID = '8b3c913a-5a4b-438b-9181-be1a5b4a1c8a'; const topic = 'ENRICH!MORE!PID'; const pageInfo = new PageInfo(); const array = [ qualityAssuranceEventObjectMissingPid, qualityAssuranceEventObjectMissingPid2 ]; const paginatedList = buildPaginatedList(pageInfo, array); - const brokerEventObjectRD = createSuccessfulRemoteDataObject(qualityAssuranceEventObjectMissingPid); - const brokerEventObjectMissingProjectRD = createSuccessfulRemoteDataObject(qualityAssuranceEventObjectMissingProjectFound); + const qaEventObjectRD = createSuccessfulRemoteDataObject(qualityAssuranceEventObjectMissingPid); + const qaEventObjectMissingProjectRD = createSuccessfulRemoteDataObject(qualityAssuranceEventObjectMissingProjectFound); const paginatedListRD = createSuccessfulRemoteDataObject(paginatedList); const status = 'ACCEPTED'; @@ -82,7 +82,7 @@ describe('QualityAssuranceEventRestService', () => { rdbService = jasmine.createSpyObj('rdbService', { buildSingle: cold('(a)', { - a: brokerEventObjectRD + a: qaEventObjectRD }), buildList: cold('(a)', { a: paginatedListRD @@ -122,7 +122,7 @@ describe('QualityAssuranceEventRestService', () => { beforeEach(() => { serviceASAny.requestService.getByHref.and.returnValue(observableOf(responseCacheEntry)); serviceASAny.requestService.getByUUID.and.returnValue(observableOf(responseCacheEntry)); - serviceASAny.rdbService.buildFromRequestUUID.and.returnValue(observableOf(brokerEventObjectRD)); + serviceASAny.rdbService.buildFromRequestUUID.and.returnValue(observableOf(qaEventObjectRD)); }); it('should proxy the call to dataservice.searchBy', () => { @@ -151,7 +151,7 @@ describe('QualityAssuranceEventRestService', () => { beforeEach(() => { serviceASAny.requestService.getByHref.and.returnValue(observableOf(responseCacheEntry)); serviceASAny.requestService.getByUUID.and.returnValue(observableOf(responseCacheEntry)); - serviceASAny.rdbService.buildFromRequestUUID.and.returnValue(observableOf(brokerEventObjectRD)); + serviceASAny.rdbService.buildFromRequestUUID.and.returnValue(observableOf(qaEventObjectRD)); }); it('should proxy the call to dataservice.findById', () => { @@ -165,7 +165,7 @@ describe('QualityAssuranceEventRestService', () => { it('should return a RemoteData for the object with the given URL', () => { const result = service.getEvent(qualityAssuranceEventObjectMissingPid.id); const expected = cold('(a)', { - a: brokerEventObjectRD + a: qaEventObjectRD }); expect(result).toBeObservable(expected); }); @@ -175,7 +175,7 @@ describe('QualityAssuranceEventRestService', () => { beforeEach(() => { serviceASAny.requestService.getByHref.and.returnValue(observableOf(responseCacheEntry)); serviceASAny.requestService.getByUUID.and.returnValue(observableOf(responseCacheEntry)); - serviceASAny.rdbService.buildFromRequestUUID.and.returnValue(observableOf(brokerEventObjectRD)); + serviceASAny.rdbService.buildFromRequestUUID.and.returnValue(observableOf(qaEventObjectRD)); }); it('should proxy the call to dataservice.patch', () => { @@ -199,7 +199,7 @@ describe('QualityAssuranceEventRestService', () => { beforeEach(() => { serviceASAny.requestService.getByHref.and.returnValue(observableOf(responseCacheEntryB)); serviceASAny.requestService.getByUUID.and.returnValue(observableOf(responseCacheEntryB)); - serviceASAny.rdbService.buildFromRequestUUID.and.returnValue(observableOf(brokerEventObjectMissingProjectRD)); + serviceASAny.rdbService.buildFromRequestUUID.and.returnValue(observableOf(qaEventObjectMissingProjectRD)); }); it('should proxy the call to dataservice.postOnRelated', () => { diff --git a/src/app/core/notifications/qa/events/quality-assurance-event-rest.service.ts b/src/app/core/notifications/qa/events/quality-assurance-event-rest.service.ts index 59f6c31e05..67863cad74 100644 --- a/src/app/core/notifications/qa/events/quality-assurance-event-rest.service.ts +++ b/src/app/core/notifications/qa/events/quality-assurance-event-rest.service.ts @@ -33,7 +33,7 @@ class DataServiceImpl extends DataService { /** * The REST endpoint. */ - protected linkPath = 'nbevents'; + protected linkPath = 'qaevents'; /** * Initialize service variables diff --git a/src/app/core/notifications/qa/models/quality-assurance-event-object.resource-type.ts b/src/app/core/notifications/qa/models/quality-assurance-event-object.resource-type.ts index 33c7b338ed..2dedc84d08 100644 --- a/src/app/core/notifications/qa/models/quality-assurance-event-object.resource-type.ts +++ b/src/app/core/notifications/qa/models/quality-assurance-event-object.resource-type.ts @@ -6,4 +6,4 @@ import { ResourceType } from '../../../shared/resource-type'; * Needs to be in a separate file to prevent circular * dependencies in webpack. */ -export const QUALITY_ASSURANCE_EVENT_OBJECT = new ResourceType('nbevent'); +export const QUALITY_ASSURANCE_EVENT_OBJECT = new ResourceType('qaevent'); diff --git a/src/app/core/notifications/qa/models/quality-assurance-event.model.ts b/src/app/core/notifications/qa/models/quality-assurance-event.model.ts index 15fbae7821..f070e7303a 100644 --- a/src/app/core/notifications/qa/models/quality-assurance-event.model.ts +++ b/src/app/core/notifications/qa/models/quality-assurance-event.model.ts @@ -11,16 +11,16 @@ import { RemoteData } from '../../../data/remote-data'; import {CacheableObject} from '../../../cache/cacheable-object.model'; /** - * The interface representing the Notifications Broker event message + * The interface representing the Quality Assurance event message */ export interface QualityAssuranceEventMessageObject { } /** - * The interface representing the Notifications Broker event message + * The interface representing the Quality Assurance event message */ -export interface OpenaireBrokerEventMessageObject { +export interface OpenaireQualityAssuranceEventMessageObject { /** * The type of 'value' */ @@ -74,7 +74,7 @@ export interface OpenaireBrokerEventMessageObject { } /** - * The interface representing the Notifications Broker event model + * The interface representing the Quality Assurance event model */ @typedObject export class QualityAssuranceEventObject implements CacheableObject { @@ -84,19 +84,19 @@ export class QualityAssuranceEventObject implements CacheableObject { static type = QUALITY_ASSURANCE_EVENT_OBJECT; /** - * The Notifications Broker event uuid inside DSpace + * The Quality Assurance event uuid inside DSpace */ @autoserialize id: string; /** - * The universally unique identifier of this Notifications Broker event + * The universally unique identifier of this Quality Assurance event */ @autoserializeAs(String, 'id') uuid: string; /** - * The Notifications Broker event original id (ex.: the source archive OAI-PMH identifier) + * The Quality Assurance event original id (ex.: the source archive OAI-PMH identifier) */ @autoserialize originalId: string; @@ -114,13 +114,13 @@ export class QualityAssuranceEventObject implements CacheableObject { trust: number; /** - * The timestamp Notifications Broker event was saved in DSpace + * The timestamp Quality Assurance event was saved in DSpace */ @autoserialize eventDate: string; /** - * The Notifications Broker event status (ACCEPTED, REJECTED, DISCARDED, PENDING) + * The Quality Assurance event status (ACCEPTED, REJECTED, DISCARDED, PENDING) */ @autoserialize status: string; @@ -129,7 +129,7 @@ export class QualityAssuranceEventObject implements CacheableObject { * The suggestion data. Data may vary depending on the source */ @autoserialize - message: OpenaireBrokerEventMessageObject; + message: OpenaireQualityAssuranceEventMessageObject; /** * The type of this ConfigObject diff --git a/src/app/core/notifications/qa/models/quality-assurance-source-object.resource-type.ts b/src/app/core/notifications/qa/models/quality-assurance-source-object.resource-type.ts index 585216c34f..5f4c8dd954 100644 --- a/src/app/core/notifications/qa/models/quality-assurance-source-object.resource-type.ts +++ b/src/app/core/notifications/qa/models/quality-assurance-source-object.resource-type.ts @@ -6,4 +6,4 @@ import { ResourceType } from '../../../shared/resource-type'; * Needs to be in a separate file to prevent circular * dependencies in webpack. */ -export const QUALITY_ASSURANCE_SOURCE_OBJECT = new ResourceType('nbsource'); +export const QUALITY_ASSURANCE_SOURCE_OBJECT = new ResourceType('qasource'); diff --git a/src/app/core/notifications/qa/models/quality-assurance-topic-object.resource-type.ts b/src/app/core/notifications/qa/models/quality-assurance-topic-object.resource-type.ts index 8cd5bec61b..7e12dd9ca8 100644 --- a/src/app/core/notifications/qa/models/quality-assurance-topic-object.resource-type.ts +++ b/src/app/core/notifications/qa/models/quality-assurance-topic-object.resource-type.ts @@ -6,4 +6,4 @@ import { ResourceType } from '../../../shared/resource-type'; * Needs to be in a separate file to prevent circular * dependencies in webpack. */ -export const QUALITY_ASSURANCE_TOPIC_OBJECT = new ResourceType('nbtopic'); +export const QUALITY_ASSURANCE_TOPIC_OBJECT = new ResourceType('qatopic'); diff --git a/src/app/core/notifications/qa/source/quality-assurance-source-rest.service.spec.ts b/src/app/core/notifications/qa/source/quality-assurance-source-rest.service.spec.ts index dff604b0c4..d574b36802 100644 --- a/src/app/core/notifications/qa/source/quality-assurance-source-rest.service.spec.ts +++ b/src/app/core/notifications/qa/source/quality-assurance-source-rest.service.spec.ts @@ -32,13 +32,13 @@ describe('QualityAssuranceSourceRestService', () => { let http: HttpClient; let comparator: any; - const endpointURL = 'https://rest.api/rest/api/integration/nbsources'; + const endpointURL = 'https://rest.api/rest/api/integration/qasources'; const requestUUID = '8b3c913a-5a4b-438b-9181-be1a5b4a1c8a'; const pageInfo = new PageInfo(); const array = [ qualityAssuranceSourceObjectMorePid, qualityAssuranceSourceObjectMoreAbstract ]; const paginatedList = buildPaginatedList(pageInfo, array); - const brokerSourceObjectRD = createSuccessfulRemoteDataObject(qualityAssuranceSourceObjectMorePid); + const qaSourceObjectRD = createSuccessfulRemoteDataObject(qualityAssuranceSourceObjectMorePid); const paginatedListRD = createSuccessfulRemoteDataObject(paginatedList); beforeEach(() => { @@ -56,7 +56,7 @@ describe('QualityAssuranceSourceRestService', () => { rdbService = jasmine.createSpyObj('rdbService', { buildSingle: cold('(a)', { - a: brokerSourceObjectRD + a: qaSourceObjectRD }), buildList: cold('(a)', { a: paginatedListRD @@ -118,7 +118,7 @@ describe('QualityAssuranceSourceRestService', () => { it('should return a RemoteData for the object with the given URL', () => { const result = service.getSource(qualityAssuranceSourceObjectMorePid.id); const expected = cold('(a)', { - a: brokerSourceObjectRD + a: qaSourceObjectRD }); expect(result).toBeObservable(expected); }); diff --git a/src/app/core/notifications/qa/source/quality-assurance-source-rest.service.ts b/src/app/core/notifications/qa/source/quality-assurance-source-rest.service.ts index 85045aebcd..10bcfbe896 100644 --- a/src/app/core/notifications/qa/source/quality-assurance-source-rest.service.ts +++ b/src/app/core/notifications/qa/source/quality-assurance-source-rest.service.ts @@ -31,7 +31,7 @@ class DataServiceImpl extends DataService { /** * The REST endpoint. */ - protected linkPath = 'nbsources'; + protected linkPath = 'qasources'; /** * Initialize service variables @@ -100,7 +100,7 @@ export class QualityAssuranceSourceRestService { * The list of Quality Assurance source. */ public getSources(options: FindListOptions = {}, ...linksToFollow: FollowLinkConfig[]): Observable>> { - return this.dataService.getBrowseEndpoint(options, 'nbsources').pipe( + return this.dataService.getBrowseEndpoint(options, 'qasources').pipe( take(1), mergeMap((href: string) => this.dataService.findAllByHref(href, options, true, true, ...linksToFollow)), ); @@ -110,7 +110,7 @@ export class QualityAssuranceSourceRestService { * Clear FindAll source requests from cache */ public clearFindAllSourceRequests() { - this.requestService.setStaleByHrefSubstring('nbsources'); + this.requestService.setStaleByHrefSubstring('qasources'); } /** @@ -125,7 +125,7 @@ export class QualityAssuranceSourceRestService { */ public getSource(id: string, ...linksToFollow: FollowLinkConfig[]): Observable> { const options = {}; - return this.dataService.getBrowseEndpoint(options, 'nbsources').pipe( + return this.dataService.getBrowseEndpoint(options, 'qasources').pipe( take(1), mergeMap((href: string) => this.dataService.findByHref(href + '/' + id, true, true, ...linksToFollow)) ); diff --git a/src/app/core/notifications/qa/topics/quality-assurance-topic-rest.service.spec.ts b/src/app/core/notifications/qa/topics/quality-assurance-topic-rest.service.spec.ts index cb828141a6..458bc4957d 100644 --- a/src/app/core/notifications/qa/topics/quality-assurance-topic-rest.service.spec.ts +++ b/src/app/core/notifications/qa/topics/quality-assurance-topic-rest.service.spec.ts @@ -32,13 +32,13 @@ describe('QualityAssuranceTopicRestService', () => { let http: HttpClient; let comparator: any; - const endpointURL = 'https://rest.api/rest/api/integration/nbtopics'; + const endpointURL = 'https://rest.api/rest/api/integration/qatopics'; const requestUUID = '8b3c913a-5a4b-438b-9181-be1a5b4a1c8a'; const pageInfo = new PageInfo(); const array = [ qualityAssuranceTopicObjectMorePid, qualityAssuranceTopicObjectMoreAbstract ]; const paginatedList = buildPaginatedList(pageInfo, array); - const brokerTopicObjectRD = createSuccessfulRemoteDataObject(qualityAssuranceTopicObjectMorePid); + const qaTopicObjectRD = createSuccessfulRemoteDataObject(qualityAssuranceTopicObjectMorePid); const paginatedListRD = createSuccessfulRemoteDataObject(paginatedList); beforeEach(() => { @@ -56,7 +56,7 @@ describe('QualityAssuranceTopicRestService', () => { rdbService = jasmine.createSpyObj('rdbService', { buildSingle: cold('(a)', { - a: brokerTopicObjectRD + a: qaTopicObjectRD }), buildList: cold('(a)', { a: paginatedListRD @@ -118,7 +118,7 @@ describe('QualityAssuranceTopicRestService', () => { it('should return a RemoteData for the object with the given URL', () => { const result = service.getTopic(qualityAssuranceTopicObjectMorePid.id); const expected = cold('(a)', { - a: brokerTopicObjectRD + a: qaTopicObjectRD }); expect(result).toBeObservable(expected); }); diff --git a/src/app/core/notifications/qa/topics/quality-assurance-topic-rest.service.ts b/src/app/core/notifications/qa/topics/quality-assurance-topic-rest.service.ts index da90126709..da9d95d290 100644 --- a/src/app/core/notifications/qa/topics/quality-assurance-topic-rest.service.ts +++ b/src/app/core/notifications/qa/topics/quality-assurance-topic-rest.service.ts @@ -31,7 +31,7 @@ class DataServiceImpl extends DataService { /** * The REST endpoint. */ - protected linkPath = 'nbtopics'; + protected linkPath = 'qatopics'; /** * Initialize service variables @@ -100,7 +100,7 @@ export class QualityAssuranceTopicRestService { * The list of Quality Assurance topics. */ public getTopics(options: FindListOptions = {}, ...linksToFollow: FollowLinkConfig[]): Observable>> { - return this.dataService.getBrowseEndpoint(options, 'nbtopics').pipe( + return this.dataService.getBrowseEndpoint(options, 'qatopics').pipe( take(1), mergeMap((href: string) => this.dataService.findAllByHref(href, options, true, true, ...linksToFollow)), ); @@ -110,7 +110,7 @@ export class QualityAssuranceTopicRestService { * Clear FindAll topics requests from cache */ public clearFindAllTopicsRequests() { - this.requestService.setStaleByHrefSubstring('nbtopics'); + this.requestService.setStaleByHrefSubstring('qatopics'); } /** @@ -125,7 +125,7 @@ export class QualityAssuranceTopicRestService { */ public getTopic(id: string, ...linksToFollow: FollowLinkConfig[]): Observable> { const options = {}; - return this.dataService.getBrowseEndpoint(options, 'nbtopics').pipe( + return this.dataService.getBrowseEndpoint(options, 'qatopics').pipe( take(1), mergeMap((href: string) => this.dataService.findByHref(href + '/' + id, true, true, ...linksToFollow)) ); diff --git a/src/app/menu.resolver.ts b/src/app/menu.resolver.ts index 4c97d3d1b3..e4eba11622 100644 --- a/src/app/menu.resolver.ts +++ b/src/app/menu.resolver.ts @@ -507,6 +507,29 @@ export class MenuResolver implements Resolve { createSiteAdministratorMenuSections() { this.authorizationService.isAuthorized(FeatureID.AdministratorOf).subscribe((authorized) => { const menuList = [ + /* Notifications */ + { + id: 'notifications', + active: false, + visible: authorized, + model: { + type: MenuItemType.TEXT, + text: 'menu.section.notifications' + } as TextMenuItemModel, + icon: 'bell', + index: 4 + }, + { + id: 'notifications_quality-assurance', + parentID: 'notifications', + active: false, + visible: authorized, + model: { + type: MenuItemType.LINK, + text: 'menu.section.quality-assurance', + link: '/admin/notifications/quality-assurance' + } as LinkMenuItemModel, + }, /* Admin Search */ { id: 'admin_search', diff --git a/src/app/notifications/notifications-state.service.spec.ts b/src/app/notifications/notifications-state.service.spec.ts index cabda48ec5..8c191415b7 100644 --- a/src/app/notifications/notifications-state.service.spec.ts +++ b/src/app/notifications/notifications-state.service.spec.ts @@ -26,7 +26,7 @@ describe('NotificationsStateService', () => { if (mode === 'empty') { initialState = { notifications: { - brokerTopic: { + qaTopic: { topics: [], processing: false, loaded: false, @@ -40,7 +40,7 @@ describe('NotificationsStateService', () => { } else { initialState = { notifications: { - brokerTopic: { + qaTopic: { topics: [ qualityAssuranceTopicObjectMorePid, qualityAssuranceTopicObjectMoreAbstract, @@ -284,7 +284,7 @@ describe('NotificationsStateService', () => { if (mode === 'empty') { initialState = { notifications: { - brokerSource: { + qaSource: { source: [], processing: false, loaded: false, @@ -298,7 +298,7 @@ describe('NotificationsStateService', () => { } else { initialState = { notifications: { - brokerSource: { + qaSource: { source: [ qualityAssuranceSourceObjectMorePid, qualityAssuranceSourceObjectMoreAbstract, diff --git a/src/app/notifications/notifications.reducer.ts b/src/app/notifications/notifications.reducer.ts index 5800788c42..4cce554f95 100644 --- a/src/app/notifications/notifications.reducer.ts +++ b/src/app/notifications/notifications.reducer.ts @@ -6,13 +6,13 @@ import { qualityAssuranceTopicsReducer, QualityAssuranceTopicState, } from './qa * The OpenAIRE State */ export interface NotificationsState { - 'brokerTopic': QualityAssuranceTopicState; - 'brokerSource': QualityAssuranceSourceState; + 'qaTopic': QualityAssuranceTopicState; + 'qaSource': QualityAssuranceSourceState; } export const notificationsReducers: ActionReducerMap = { - brokerTopic: qualityAssuranceTopicsReducer, - brokerSource: qualityAssuranceSourceReducer + qaTopic: qualityAssuranceTopicsReducer, + qaSource: qualityAssuranceSourceReducer }; export const notificationsSelector = createFeatureSelector('notifications'); diff --git a/src/app/notifications/qa/events/quality-assurance-events.component.html b/src/app/notifications/qa/events/quality-assurance-events.component.html index 40fa75943f..d7f6129b3b 100644 --- a/src/app/notifications/qa/events/quality-assurance-events.component.html +++ b/src/app/notifications/qa/events/quality-assurance-events.component.html @@ -2,11 +2,11 @@

{{'notifications.events.title'| translate}}

-

{{'notifications.broker.events.description'| translate}}

+

{{'quality-assurance.events.description'| translate}}

- {{'notifications.broker.events.back' | translate}} + {{'quality-assurance.events.back' | translate}}

@@ -14,10 +14,10 @@

- {{'notifications.broker.events.topic' | translate}} {{this.showTopic}} + {{'quality-assurance.events.topic' | translate}} {{this.showTopic}}

- + - +
- - - - - + + + + + @@ -51,8 +51,8 @@ {{eventElement.title}} @@ -142,7 +142,7 @@ @@ -150,58 +150,58 @@ diff --git a/src/app/notifications/qa/events/quality-assurance-events.component.ts b/src/app/notifications/qa/events/quality-assurance-events.component.ts index aa47bfc590..6e3dd8d010 100644 --- a/src/app/notifications/qa/events/quality-assurance-events.component.ts +++ b/src/app/notifications/qa/events/quality-assurance-events.component.ts @@ -11,7 +11,7 @@ import { PaginatedList } from '../../../core/data/paginated-list.model'; import { RemoteData } from '../../../core/data/remote-data'; import { QualityAssuranceEventObject, - OpenaireBrokerEventMessageObject + OpenaireQualityAssuranceEventMessageObject } from '../../../core/notifications/qa/models/quality-assurance-event.model'; import { QualityAssuranceEventRestService } from '../../../core/notifications/qa/events/quality-assurance-event-rest.service'; import { PaginationComponentOptions } from '../../../shared/pagination/pagination-component-options.model'; @@ -242,12 +242,12 @@ export class QualityAssuranceEventsComponent implements OnInit { .subscribe((rd: RemoteData) => { if (rd.isSuccess && rd.statusCode === 200) { this.notificationsService.success( - this.translateService.instant('notifications.broker.event.action.saved') + this.translateService.instant('quality-assurance.event.action.saved') ); this.getQualityAssuranceEvents(); } else { this.notificationsService.error( - this.translateService.instant('notifications.broker.event.action.error') + this.translateService.instant('quality-assurance.event.action.error') ); } eventData.isRunning = false; @@ -274,7 +274,7 @@ export class QualityAssuranceEventsComponent implements OnInit { .subscribe((rd: RemoteData) => { if (rd.isSuccess) { this.notificationsService.success( - this.translateService.instant('notifications.broker.event.project.bounded') + this.translateService.instant('quality-assurance.event.project.bounded') ); eventData.hasProject = true; eventData.projectTitle = projectTitle; @@ -282,7 +282,7 @@ export class QualityAssuranceEventsComponent implements OnInit { eventData.projectId = projectId; } else { this.notificationsService.error( - this.translateService.instant('notifications.broker.event.project.error') + this.translateService.instant('quality-assurance.event.project.error') ); } eventData.isRunning = false; @@ -303,7 +303,7 @@ export class QualityAssuranceEventsComponent implements OnInit { .subscribe((rd: RemoteData) => { if (rd.isSuccess) { this.notificationsService.success( - this.translateService.instant('notifications.broker.event.project.removed') + this.translateService.instant('quality-assurance.event.project.removed') ); eventData.hasProject = false; eventData.projectTitle = null; @@ -311,7 +311,7 @@ export class QualityAssuranceEventsComponent implements OnInit { eventData.projectId = null; } else { this.notificationsService.error( - this.translateService.instant('notifications.broker.event.project.error') + this.translateService.instant('quality-assurance.event.project.error') ); } eventData.isRunning = false; @@ -323,7 +323,7 @@ export class QualityAssuranceEventsComponent implements OnInit { * Check if the event has a valid href. * @param event */ - public hasPIDHref(event: OpenaireBrokerEventMessageObject): boolean { + public hasPIDHref(event: OpenaireQualityAssuranceEventMessageObject): boolean { return this.getPIDHref(event) !== null; } @@ -331,7 +331,7 @@ export class QualityAssuranceEventsComponent implements OnInit { * Get the event pid href. * @param event */ - public getPIDHref(event: OpenaireBrokerEventMessageObject): string { + public getPIDHref(event: OpenaireQualityAssuranceEventMessageObject): string { return this.computePIDHref(event); } @@ -419,7 +419,7 @@ export class QualityAssuranceEventsComponent implements OnInit { ); } - protected computePIDHref(event: OpenaireBrokerEventMessageObject) { + protected computePIDHref(event: OpenaireQualityAssuranceEventMessageObject) { const type = event.type.toLowerCase(); const pid = event.value; let prefix = null; diff --git a/src/app/notifications/qa/project-entry-import-modal/project-entry-import-modal.component.ts b/src/app/notifications/qa/project-entry-import-modal/project-entry-import-modal.component.ts index 64a5f6908f..64a2df30ba 100644 --- a/src/app/notifications/qa/project-entry-import-modal/project-entry-import-modal.component.ts +++ b/src/app/notifications/qa/project-entry-import-modal/project-entry-import-modal.component.ts @@ -15,7 +15,7 @@ import { DSpaceObject } from '../../../core/shared/dspace-object.model'; import { QualityAssuranceEventObject, QualityAssuranceEventMessageObject, - OpenaireBrokerEventMessageObject, + OpenaireQualityAssuranceEventMessageObject, } from '../../../core/notifications/qa/models/quality-assurance-event.model'; import { hasValue, isNotEmpty } from '../../../shared/empty.util'; import { Item } from '../../../core/shared/item.model'; @@ -98,7 +98,7 @@ export class ProjectEntryImportModalComponent implements OnInit { /** * The prefix for every i18n key within this modal */ - labelPrefix = 'notifications.broker.event.modal.'; + labelPrefix = 'quality-assurance.event.modal.'; /** * The search configuration to retrieve project */ @@ -181,7 +181,7 @@ export class ProjectEntryImportModalComponent implements OnInit { public ngOnInit(): void { this.pagination = Object.assign(new PaginationComponentOptions(), { id: 'notifications-project-bound', pageSize: this.pageSize }); this.projectTitle = (this.externalSourceEntry.projectTitle !== null) ? this.externalSourceEntry.projectTitle - : (this.externalSourceEntry.event.message as OpenaireBrokerEventMessageObject).title; + : (this.externalSourceEntry.event.message as OpenaireQualityAssuranceEventMessageObject).title; this.searchOptions = Object.assign(new PaginatedSearchOptions( { configuration: this.configuration, diff --git a/src/app/notifications/qa/source/quality-assurance-source.component.html b/src/app/notifications/qa/source/quality-assurance-source.component.html index 5309098c55..20f4d4394a 100644 --- a/src/app/notifications/qa/source/quality-assurance-source.component.html +++ b/src/app/notifications/qa/source/quality-assurance-source.component.html @@ -1,15 +1,15 @@
-

{{'notifications.broker.title'| translate}}

-

{{'notifications.broker.source.description'| translate}}

+

{{'quality-assurance.title'| translate}}

+

{{'quality-assurance.source.description'| translate}}

-

{{'notifications.broker.source'| translate}}

+

{{'quality-assurance.source'| translate}}

- + - +
{{'notifications.broker.event.table.trust' | translate}}{{'notifications.broker.event.table.publication' | translate}}{{'notifications.broker.event.table.details' | translate}}{{'notifications.broker.event.table.project-details' | translate}}{{'notifications.broker.event.table.actions' | translate}}{{'quality-assurance.event.table.trust' | translate}}{{'quality-assurance.event.table.publication' | translate}}{{'quality-assurance.event.table.details' | translate}}{{'quality-assurance.event.table.project-details' | translate}}{{'quality-assurance.event.table.actions' | translate}}
-

{{'notifications.broker.event.table.pidtype' | translate}} {{eventElement.event.message.type}}

-

{{'notifications.broker.event.table.pidvalue' | translate}}
+

{{'quality-assurance.event.table.pidtype' | translate}} {{eventElement.event.message.type}}

+

{{'quality-assurance.event.table.pidvalue' | translate}}
{{eventElement.event.message.value}} @@ -60,37 +60,37 @@

-

{{'notifications.broker.event.table.subjectValue' | translate}}
{{eventElement.event.message.value}}

+

{{'quality-assurance.event.table.subjectValue' | translate}}
{{eventElement.event.message.value}}

- {{'notifications.broker.event.table.abstract' | translate}}
+ {{'quality-assurance.event.table.abstract' | translate}}
{{eventElement.event.message.abstract}}

- {{'notifications.broker.event.table.suggestedProject' | translate}} + {{'quality-assurance.event.table.suggestedProject' | translate}}

- {{'notifications.broker.event.table.project' | translate}}
+ {{'quality-assurance.event.table.project' | translate}}
{{eventElement.event.message.title}}

- {{'notifications.broker.event.table.acronym' | translate}} {{eventElement.event.message.acronym}}
- {{'notifications.broker.event.table.code' | translate}} {{eventElement.event.message.code}}
- {{'notifications.broker.event.table.funder' | translate}} {{eventElement.event.message.funder}}
- {{'notifications.broker.event.table.fundingProgram' | translate}} {{eventElement.event.message.fundingProgram}}
- {{'notifications.broker.event.table.jurisdiction' | translate}} {{eventElement.event.message.jurisdiction}} + {{'quality-assurance.event.table.acronym' | translate}} {{eventElement.event.message.acronym}}
+ {{'quality-assurance.event.table.code' | translate}} {{eventElement.event.message.code}}
+ {{'quality-assurance.event.table.funder' | translate}} {{eventElement.event.message.funder}}
+ {{'quality-assurance.event.table.fundingProgram' | translate}} {{eventElement.event.message.fundingProgram}}
+ {{'quality-assurance.event.table.jurisdiction' | translate}} {{eventElement.event.message.jurisdiction}}


- {{(eventElement.hasProject ? 'notifications.broker.event.project.found' : 'notifications.broker.event.project.notFound') | translate}} + {{(eventElement.hasProject ? 'quality-assurance.event.project.found' : 'quality-assurance.event.project.notFound') | translate}} {{eventElement.handle}}
- - - + + + @@ -39,7 +39,7 @@
{{'notifications.broker.table.source' | translate}}{{'notifications.broker.table.last-event' | translate}}{{'notifications.broker.table.actions' | translate}}{{'quality-assurance.table.source' | translate}}{{'quality-assurance.table.last-event' | translate}}{{'quality-assurance.table.actions' | translate}}
- - - + + + @@ -39,7 +39,7 @@
@@ -155,13 +166,13 @@ @@ -172,16 +183,13 @@ @@ -192,16 +200,13 @@ From bb357df738ce12c35064434f5663de2932f53546 Mon Sep 17 00:00:00 2001 From: Luca Giamminonni Date: Fri, 8 Jul 2022 18:04:42 +0200 Subject: [PATCH 020/409] [CST-5337] Added missing typedocs --- .../admin-quality-assurance-events-page.component.ts | 3 +++ .../admin-quality-assurance-source-page.component.ts | 3 +++ .../admin-quality-assurance-topics-page.component.ts | 3 +++ ...scomponent.scss => quality-assurance-events.component.scss} | 0 .../qa/source/quality-assurance-source.component.ts | 3 +++ 5 files changed, 12 insertions(+) rename src/app/suggestion-notifications/qa/events/{quality-assurance-events.scomponent.scss => quality-assurance-events.component.scss} (100%) diff --git a/src/app/admin/admin-notifications/admin-quality-assurance-events-page/admin-quality-assurance-events-page.component.ts b/src/app/admin/admin-notifications/admin-quality-assurance-events-page/admin-quality-assurance-events-page.component.ts index a1e15d5bdb..bd3470f301 100644 --- a/src/app/admin/admin-notifications/admin-quality-assurance-events-page/admin-quality-assurance-events-page.component.ts +++ b/src/app/admin/admin-notifications/admin-quality-assurance-events-page/admin-quality-assurance-events-page.component.ts @@ -1,5 +1,8 @@ import { Component } from '@angular/core'; +/** + * Component for the page that show the QA events related to a specific topic. + */ @Component({ selector: 'ds-quality-assurance-events-page', templateUrl: './admin-quality-assurance-events-page.component.html' diff --git a/src/app/admin/admin-notifications/admin-quality-assurance-source-page-component/admin-quality-assurance-source-page.component.ts b/src/app/admin/admin-notifications/admin-quality-assurance-source-page-component/admin-quality-assurance-source-page.component.ts index 624e71f281..20d0356d5f 100644 --- a/src/app/admin/admin-notifications/admin-quality-assurance-source-page-component/admin-quality-assurance-source-page.component.ts +++ b/src/app/admin/admin-notifications/admin-quality-assurance-source-page-component/admin-quality-assurance-source-page.component.ts @@ -1,5 +1,8 @@ import { Component, OnInit } from '@angular/core'; +/** + * Component for the page that show the QA sources. + */ @Component({ selector: 'ds-admin-quality-assurance-source-page-component', templateUrl: './admin-quality-assurance-source-page.component.html', diff --git a/src/app/admin/admin-notifications/admin-quality-assurance-topics-page/admin-quality-assurance-topics-page.component.ts b/src/app/admin/admin-notifications/admin-quality-assurance-topics-page/admin-quality-assurance-topics-page.component.ts index 1b4f1d70aa..f17d3448d5 100644 --- a/src/app/admin/admin-notifications/admin-quality-assurance-topics-page/admin-quality-assurance-topics-page.component.ts +++ b/src/app/admin/admin-notifications/admin-quality-assurance-topics-page/admin-quality-assurance-topics-page.component.ts @@ -1,5 +1,8 @@ import { Component } from '@angular/core'; +/** + * Component for the page that show the QA topics related to a specific source. + */ @Component({ selector: 'ds-notification-qa-page', templateUrl: './admin-quality-assurance-topics-page.component.html' diff --git a/src/app/suggestion-notifications/qa/events/quality-assurance-events.scomponent.scss b/src/app/suggestion-notifications/qa/events/quality-assurance-events.component.scss similarity index 100% rename from src/app/suggestion-notifications/qa/events/quality-assurance-events.scomponent.scss rename to src/app/suggestion-notifications/qa/events/quality-assurance-events.component.scss diff --git a/src/app/suggestion-notifications/qa/source/quality-assurance-source.component.ts b/src/app/suggestion-notifications/qa/source/quality-assurance-source.component.ts index 372dc654ff..f6f02d9ab9 100644 --- a/src/app/suggestion-notifications/qa/source/quality-assurance-source.component.ts +++ b/src/app/suggestion-notifications/qa/source/quality-assurance-source.component.ts @@ -9,6 +9,9 @@ import { SuggestionNotificationsStateService } from '../../suggestion-notificati import { AdminQualityAssuranceSourcePageParams } from '../../../admin/admin-notifications/admin-quality-assurance-source-page-component/admin-quality-assurance-source-page-resolver.service'; import { hasValue } from '../../../shared/empty.util'; +/** + * Component to display the Quality Assurance source list. + */ @Component({ selector: 'ds-quality-assurance-source', templateUrl: './quality-assurance-source.component.html', From 7808f85a2dea85b347c6bf64531577c5fdce0851 Mon Sep 17 00:00:00 2001 From: Luca Giamminonni Date: Fri, 8 Jul 2022 18:20:38 +0200 Subject: [PATCH 021/409] [CST-5337] Moved compute PID href on rest side --- .../models/quality-assurance-event.model.ts | 5 ++ src/app/shared/mocks/notifications.mock.ts | 9 ++++ .../quality-assurance-events.component.ts | 47 +------------------ 3 files changed, 16 insertions(+), 45 deletions(-) diff --git a/src/app/core/suggestion-notifications/qa/models/quality-assurance-event.model.ts b/src/app/core/suggestion-notifications/qa/models/quality-assurance-event.model.ts index c9395bd528..7517148def 100644 --- a/src/app/core/suggestion-notifications/qa/models/quality-assurance-event.model.ts +++ b/src/app/core/suggestion-notifications/qa/models/quality-assurance-event.model.ts @@ -73,6 +73,11 @@ export interface OpenaireQualityAssuranceEventMessageObject { */ openaireId: string; + /** + * The PID href. + */ + pidHref: string; + } /** diff --git a/src/app/shared/mocks/notifications.mock.ts b/src/app/shared/mocks/notifications.mock.ts index ef6d99e9ea..bbdf60c083 100644 --- a/src/app/shared/mocks/notifications.mock.ts +++ b/src/app/shared/mocks/notifications.mock.ts @@ -1464,6 +1464,7 @@ export const qualityAssuranceEventObjectMissingPid: QualityAssuranceEventObject message: { type: 'doi', value: '10.18848/1447-9494/cgp/v15i09/45934', + pidHref: 'https://doi.org/10.18848/1447-9494/cgp/v15i09/45934', abstract: null, openaireId: null, acronym: null, @@ -1500,6 +1501,7 @@ export const qualityAssuranceEventObjectMissingPid2: QualityAssuranceEventObject message: { type: 'urn', value: 'http://thesis2.sba.units.it/store/handle/item/12238', + pidHref:'http://thesis2.sba.units.it/store/handle/item/12238', abstract: null, openaireId: null, acronym: null, @@ -1536,6 +1538,7 @@ export const qualityAssuranceEventObjectMissingPid3: QualityAssuranceEventObject message: { type: 'doi', value: '10.4324/9780203408889', + pidHref: 'https://doi.org/10.4324/9780203408889', abstract: null, openaireId: null, acronym: null, @@ -1572,6 +1575,7 @@ export const qualityAssuranceEventObjectMissingPid4: QualityAssuranceEventObject message: { type: 'doi', value: '10.1080/13698230.2018.1430104', + pidHref: 'https://doi.org/10.1080/13698230.2018.1430104', abstract: null, openaireId: null, acronym: null, @@ -1608,6 +1612,7 @@ export const qualityAssuranceEventObjectMissingPid5: QualityAssuranceEventObject message: { type: 'urn', value: 'http://thesis2.sba.units.it/store/handle/item/12477', + pidHref:'http://thesis2.sba.units.it/store/handle/item/12477', abstract: null, openaireId: null, acronym: null, @@ -1644,6 +1649,7 @@ export const qualityAssuranceEventObjectMissingPid6: QualityAssuranceEventObject message: { type: 'doi', value: '10.1111/j.1475-4975.2004.00098.x', + pidHref: 'https://doi.org/10.1111/j.1475-4975.2004.00098.x', abstract: null, openaireId: null, acronym: null, @@ -1680,6 +1686,7 @@ export const qualityAssuranceEventObjectMissingAbstract: QualityAssuranceEventOb message: { type: null, value: null, + pidHref: null, abstract: 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla scelerisque vestibulum tellus sed lacinia. Aenean vitae sapien a quam congue ultrices. Sed vehicula sollicitudin ligula, vitae lacinia velit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla scelerisque vestibulum tellus sed lacinia. Aenean vitae sapien a quam congue ultrices. Sed vehicula sollicitudin ligula, vitae lacinia velit.', openaireId: null, acronym: null, @@ -1716,6 +1723,7 @@ export const qualityAssuranceEventObjectMissingProjectFound: QualityAssuranceEve message: { type: null, value: null, + pidHref: null, abstract: null, openaireId: null, acronym: 'PAThs', @@ -1752,6 +1760,7 @@ export const qualityAssuranceEventObjectMissingProjectNotFound: QualityAssurance message: { type: null, value: null, + pidHref: null, abstract: null, openaireId: null, acronym: 'PAThs', diff --git a/src/app/suggestion-notifications/qa/events/quality-assurance-events.component.ts b/src/app/suggestion-notifications/qa/events/quality-assurance-events.component.ts index 0f71123d22..9f33a02225 100644 --- a/src/app/suggestion-notifications/qa/events/quality-assurance-events.component.ts +++ b/src/app/suggestion-notifications/qa/events/quality-assurance-events.component.ts @@ -38,7 +38,7 @@ import { FindListOptions } from '../../../core/data/find-list-options.model'; @Component({ selector: 'ds-quality-assurance-events', templateUrl: './quality-assurance-events.component.html', - styleUrls: ['./quality-assurance-events.scomponent.scss'], + styleUrls: ['./quality-assurance-events.component.scss'], }) export class QualityAssuranceEventsComponent implements OnInit, OnDestroy { /** @@ -334,7 +334,7 @@ export class QualityAssuranceEventsComponent implements OnInit, OnDestroy { * @param event */ public getPIDHref(event: OpenaireQualityAssuranceEventMessageObject): string { - return this.computePIDHref(event); + return event.pidHref; } @@ -423,47 +423,4 @@ export class QualityAssuranceEventsComponent implements OnInit, OnDestroy { ); } } - - protected computePIDHref(event: OpenaireQualityAssuranceEventMessageObject) { - const type = event.type.toLowerCase(); - const pid = event.value; - let prefix = null; - switch (type) { - case 'arxiv': { - prefix = 'https://arxiv.org/abs/'; - break; - } - case 'handle': { - prefix = 'https://hdl.handle.net/'; - break; - } - case 'urn': { - prefix = ''; - break; - } - case 'doi': { - prefix = 'https://doi.org/'; - break; - } - case 'pmc': { - prefix = 'https://www.ncbi.nlm.nih.gov/pmc/articles/'; - break; - } - case 'pmid': { - prefix = 'https://pubmed.ncbi.nlm.nih.gov/'; - break; - } - case 'ncid': { - prefix = 'https://ci.nii.ac.jp/ncid/'; - break; - } - default: { - break; - } - } - if (prefix === null) { - return null; - } - return prefix + pid; - } } From 3a70b880cbc41b32521d4251e7e912e9bb27b6d8 Mon Sep 17 00:00:00 2001 From: Luca Giamminonni Date: Wed, 9 Nov 2022 15:13:09 +0100 Subject: [PATCH 022/409] [CST-5337] Renamed qa endpoints --- .../events/quality-assurance-event-rest.service.spec.ts | 2 +- .../qa/events/quality-assurance-event-rest.service.ts | 3 +-- .../quality-assurance-source-object.resource-type.ts | 2 +- .../quality-assurance-topic-object.resource-type.ts | 2 +- .../source/quality-assurance-source-rest.service.spec.ts | 2 +- .../qa/source/quality-assurance-source-rest.service.ts | 8 ++++---- .../topics/quality-assurance-topic-rest.service.spec.ts | 2 +- .../qa/topics/quality-assurance-topic-rest.service.ts | 8 ++++---- 8 files changed, 14 insertions(+), 15 deletions(-) diff --git a/src/app/core/suggestion-notifications/qa/events/quality-assurance-event-rest.service.spec.ts b/src/app/core/suggestion-notifications/qa/events/quality-assurance-event-rest.service.spec.ts index 3734ae0dd2..55b2788c8b 100644 --- a/src/app/core/suggestion-notifications/qa/events/quality-assurance-event-rest.service.spec.ts +++ b/src/app/core/suggestion-notifications/qa/events/quality-assurance-event-rest.service.spec.ts @@ -38,7 +38,7 @@ describe('QualityAssuranceEventRestService', () => { let http: HttpClient; let comparator: any; - const endpointURL = 'https://rest.api/rest/api/integration/qatopics'; + const endpointURL = 'https://rest.api/rest/api/integration/qualityassurancetopics'; const requestUUID = '8b3c913a-5a4b-438b-9181-be1a5b4a1c8a'; const topic = 'ENRICH!MORE!PID'; diff --git a/src/app/core/suggestion-notifications/qa/events/quality-assurance-event-rest.service.ts b/src/app/core/suggestion-notifications/qa/events/quality-assurance-event-rest.service.ts index a7cdd9e786..e4d13670a1 100644 --- a/src/app/core/suggestion-notifications/qa/events/quality-assurance-event-rest.service.ts +++ b/src/app/core/suggestion-notifications/qa/events/quality-assurance-event-rest.service.ts @@ -12,7 +12,6 @@ import { RestResponse } from '../../../cache/response.models'; import { ObjectCacheService } from '../../../cache/object-cache.service'; import { dataService } from '../../../cache/builders/build-decorators'; import { RequestService } from '../../../data/request.service'; -import { DataService } from '../../../data/data.service'; import { ChangeAnalyzer } from '../../../data/change-analyzer'; import { DefaultChangeAnalyzer } from '../../../data/default-change-analyzer.service'; import { RemoteData } from '../../../data/remote-data'; @@ -33,7 +32,7 @@ class DataServiceImpl extends DataService { /** * The REST endpoint. */ - protected linkPath = 'qaevents'; + protected linkPath = 'qualityassuranceevents'; /** * Initialize service variables diff --git a/src/app/core/suggestion-notifications/qa/models/quality-assurance-source-object.resource-type.ts b/src/app/core/suggestion-notifications/qa/models/quality-assurance-source-object.resource-type.ts index 5f4c8dd954..b4f64b24d1 100644 --- a/src/app/core/suggestion-notifications/qa/models/quality-assurance-source-object.resource-type.ts +++ b/src/app/core/suggestion-notifications/qa/models/quality-assurance-source-object.resource-type.ts @@ -6,4 +6,4 @@ import { ResourceType } from '../../../shared/resource-type'; * Needs to be in a separate file to prevent circular * dependencies in webpack. */ -export const QUALITY_ASSURANCE_SOURCE_OBJECT = new ResourceType('qasource'); +export const QUALITY_ASSURANCE_SOURCE_OBJECT = new ResourceType('qualityassurancesource'); diff --git a/src/app/core/suggestion-notifications/qa/models/quality-assurance-topic-object.resource-type.ts b/src/app/core/suggestion-notifications/qa/models/quality-assurance-topic-object.resource-type.ts index 7e12dd9ca8..e9fc57a307 100644 --- a/src/app/core/suggestion-notifications/qa/models/quality-assurance-topic-object.resource-type.ts +++ b/src/app/core/suggestion-notifications/qa/models/quality-assurance-topic-object.resource-type.ts @@ -6,4 +6,4 @@ import { ResourceType } from '../../../shared/resource-type'; * Needs to be in a separate file to prevent circular * dependencies in webpack. */ -export const QUALITY_ASSURANCE_TOPIC_OBJECT = new ResourceType('qatopic'); +export const QUALITY_ASSURANCE_TOPIC_OBJECT = new ResourceType('qualityassurancetopic'); diff --git a/src/app/core/suggestion-notifications/qa/source/quality-assurance-source-rest.service.spec.ts b/src/app/core/suggestion-notifications/qa/source/quality-assurance-source-rest.service.spec.ts index d574b36802..dc90b581cb 100644 --- a/src/app/core/suggestion-notifications/qa/source/quality-assurance-source-rest.service.spec.ts +++ b/src/app/core/suggestion-notifications/qa/source/quality-assurance-source-rest.service.spec.ts @@ -32,7 +32,7 @@ describe('QualityAssuranceSourceRestService', () => { let http: HttpClient; let comparator: any; - const endpointURL = 'https://rest.api/rest/api/integration/qasources'; + const endpointURL = 'https://rest.api/rest/api/integration/qualityassurancesources'; const requestUUID = '8b3c913a-5a4b-438b-9181-be1a5b4a1c8a'; const pageInfo = new PageInfo(); diff --git a/src/app/core/suggestion-notifications/qa/source/quality-assurance-source-rest.service.ts b/src/app/core/suggestion-notifications/qa/source/quality-assurance-source-rest.service.ts index 6b5ca806ff..05d2ba4ae6 100644 --- a/src/app/core/suggestion-notifications/qa/source/quality-assurance-source-rest.service.ts +++ b/src/app/core/suggestion-notifications/qa/source/quality-assurance-source-rest.service.ts @@ -30,7 +30,7 @@ class DataServiceImpl extends DataService { /** * The REST endpoint. */ - protected linkPath = 'qasources'; + protected linkPath = 'qualityassurancesources'; /** * Initialize service variables @@ -99,7 +99,7 @@ export class QualityAssuranceSourceRestService { * The list of Quality Assurance source. */ public getSources(options: FindListOptions = {}, ...linksToFollow: FollowLinkConfig[]): Observable>> { - return this.dataService.getBrowseEndpoint(options, 'qasources').pipe( + return this.dataService.getBrowseEndpoint(options, 'qualityassurancesources').pipe( take(1), mergeMap((href: string) => this.dataService.findAllByHref(href, options, true, true, ...linksToFollow)), ); @@ -109,7 +109,7 @@ export class QualityAssuranceSourceRestService { * Clear FindAll source requests from cache */ public clearFindAllSourceRequests() { - this.requestService.setStaleByHrefSubstring('qasources'); + this.requestService.setStaleByHrefSubstring('qualityassurancesources'); } /** @@ -124,7 +124,7 @@ export class QualityAssuranceSourceRestService { */ public getSource(id: string, ...linksToFollow: FollowLinkConfig[]): Observable> { const options = {}; - return this.dataService.getBrowseEndpoint(options, 'qasources').pipe( + return this.dataService.getBrowseEndpoint(options, 'qualityassurancesources').pipe( take(1), mergeMap((href: string) => this.dataService.findByHref(href + '/' + id, true, true, ...linksToFollow)) ); diff --git a/src/app/core/suggestion-notifications/qa/topics/quality-assurance-topic-rest.service.spec.ts b/src/app/core/suggestion-notifications/qa/topics/quality-assurance-topic-rest.service.spec.ts index 458bc4957d..babc9d83b3 100644 --- a/src/app/core/suggestion-notifications/qa/topics/quality-assurance-topic-rest.service.spec.ts +++ b/src/app/core/suggestion-notifications/qa/topics/quality-assurance-topic-rest.service.spec.ts @@ -32,7 +32,7 @@ describe('QualityAssuranceTopicRestService', () => { let http: HttpClient; let comparator: any; - const endpointURL = 'https://rest.api/rest/api/integration/qatopics'; + const endpointURL = 'https://rest.api/rest/api/integration/qualityassurancetopics'; const requestUUID = '8b3c913a-5a4b-438b-9181-be1a5b4a1c8a'; const pageInfo = new PageInfo(); diff --git a/src/app/core/suggestion-notifications/qa/topics/quality-assurance-topic-rest.service.ts b/src/app/core/suggestion-notifications/qa/topics/quality-assurance-topic-rest.service.ts index a2f2498fca..86942a7b5b 100644 --- a/src/app/core/suggestion-notifications/qa/topics/quality-assurance-topic-rest.service.ts +++ b/src/app/core/suggestion-notifications/qa/topics/quality-assurance-topic-rest.service.ts @@ -30,7 +30,7 @@ class DataServiceImpl extends DataService { /** * The REST endpoint. */ - protected linkPath = 'qatopics'; + protected linkPath = 'qualityassurancetopics'; /** * Initialize service variables @@ -99,7 +99,7 @@ export class QualityAssuranceTopicRestService { * The list of Quality Assurance topics. */ public getTopics(options: FindListOptions = {}, ...linksToFollow: FollowLinkConfig[]): Observable>> { - return this.dataService.getBrowseEndpoint(options, 'qatopics').pipe( + return this.dataService.getBrowseEndpoint(options, 'qualityassurancetopics').pipe( take(1), mergeMap((href: string) => this.dataService.findAllByHref(href, options, true, true, ...linksToFollow)), ); @@ -109,7 +109,7 @@ export class QualityAssuranceTopicRestService { * Clear FindAll topics requests from cache */ public clearFindAllTopicsRequests() { - this.requestService.setStaleByHrefSubstring('qatopics'); + this.requestService.setStaleByHrefSubstring('qualityassurancetopics'); } /** @@ -124,7 +124,7 @@ export class QualityAssuranceTopicRestService { */ public getTopic(id: string, ...linksToFollow: FollowLinkConfig[]): Observable> { const options = {}; - return this.dataService.getBrowseEndpoint(options, 'qatopics').pipe( + return this.dataService.getBrowseEndpoint(options, 'qualityassurancetopics').pipe( take(1), mergeMap((href: string) => this.dataService.findByHref(href + '/' + id, true, true, ...linksToFollow)) ); From 5efe3296c613be48d25251bfbfdd24e3d448556c Mon Sep 17 00:00:00 2001 From: Giuseppe Digilio Date: Wed, 9 Nov 2022 19:05:20 +0100 Subject: [PATCH 023/409] [CST-5337] Refactoring in order to comply with new data service --- ...ality-assurance-event-rest.service.spec.ts | 47 +++--- .../quality-assurance-event-rest.service.ts | 137 ++++++++++-------- ...lity-assurance-source-rest.service.spec.ts | 24 ++- .../quality-assurance-source-rest.service.ts | 67 ++------- ...ality-assurance-topic-rest.service.spec.ts | 22 ++- .../quality-assurance-topic-rest.service.ts | 70 ++------- 6 files changed, 146 insertions(+), 221 deletions(-) diff --git a/src/app/core/suggestion-notifications/qa/events/quality-assurance-event-rest.service.spec.ts b/src/app/core/suggestion-notifications/qa/events/quality-assurance-event-rest.service.spec.ts index 55b2788c8b..731c70d624 100644 --- a/src/app/core/suggestion-notifications/qa/events/quality-assurance-event-rest.service.spec.ts +++ b/src/app/core/suggestion-notifications/qa/events/quality-assurance-event-rest.service.spec.ts @@ -20,8 +20,8 @@ import { qualityAssuranceEventObjectMissingProjectFound } from '../../../../shared/mocks/notifications.mock'; import { ReplaceOperation } from 'fast-json-patch'; -import {RequestEntry} from '../../../data/request-entry.model'; -import {FindListOptions} from '../../../data/find-list-options.model'; +import { RequestEntry } from '../../../data/request-entry.model'; +import { FindListOptions } from '../../../data/find-list-options.model'; describe('QualityAssuranceEventRestService', () => { let scheduler: TestScheduler; @@ -43,7 +43,7 @@ describe('QualityAssuranceEventRestService', () => { const topic = 'ENRICH!MORE!PID'; const pageInfo = new PageInfo(); - const array = [ qualityAssuranceEventObjectMissingPid, qualityAssuranceEventObjectMissingPid2 ]; + const array = [qualityAssuranceEventObjectMissingPid, qualityAssuranceEventObjectMissingPid2]; const paginatedList = buildPaginatedList(pageInfo, array); const qaEventObjectRD = createSuccessfulRemoteDataObject(qualityAssuranceEventObjectMissingPid); const qaEventObjectMissingProjectRD = createSuccessfulRemoteDataObject(qualityAssuranceEventObjectMissingProjectFound); @@ -87,12 +87,13 @@ describe('QualityAssuranceEventRestService', () => { buildList: cold('(a)', { a: paginatedListRD }), - buildFromRequestUUID: jasmine.createSpy('buildFromRequestUUID') + buildFromRequestUUID: jasmine.createSpy('buildFromRequestUUID'), + buildFromRequestUUIDAndAwait: jasmine.createSpy('buildFromRequestUUIDAndAwait') }); objectCache = {} as ObjectCacheService; halService = jasmine.createSpyObj('halService', { - getEndpoint: cold('a|', { a: endpointURL }) + getEndpoint: cold('a|', { a: endpointURL }) }); notificationsService = {} as NotificationsService; @@ -105,17 +106,16 @@ describe('QualityAssuranceEventRestService', () => { objectCache, halService, notificationsService, - http, comparator ); serviceASAny = service; - spyOn(serviceASAny.dataService, 'searchBy').and.callThrough(); - spyOn(serviceASAny.dataService, 'findById').and.callThrough(); - spyOn(serviceASAny.dataService, 'patch').and.callThrough(); - spyOn(serviceASAny.dataService, 'postOnRelated').and.callThrough(); - spyOn(serviceASAny.dataService, 'deleteOnRelated').and.callThrough(); + spyOn(serviceASAny.searchData, 'searchBy').and.callThrough(); + spyOn(serviceASAny, 'findById').and.callThrough(); + spyOn(serviceASAny.patchData, 'patch').and.callThrough(); + spyOn(serviceASAny, 'postOnRelated').and.callThrough(); + spyOn(serviceASAny, 'deleteOnRelated').and.callThrough(); }); describe('getEventsByTopic', () => { @@ -125,7 +125,7 @@ describe('QualityAssuranceEventRestService', () => { serviceASAny.rdbService.buildFromRequestUUID.and.returnValue(observableOf(qaEventObjectRD)); }); - it('should proxy the call to dataservice.searchBy', () => { + it('should proxy the call to searchData.searchBy', () => { const options: FindListOptions = { searchParams: [ { @@ -135,13 +135,13 @@ describe('QualityAssuranceEventRestService', () => { ] }; service.getEventsByTopic(topic); - expect(serviceASAny.dataService.searchBy).toHaveBeenCalledWith('findByTopic', options, true, true); + expect(serviceASAny.searchData.searchBy).toHaveBeenCalledWith('findByTopic', options, true, true); }); it('should return a RemoteData> for the object with the given Topic', () => { const result = service.getEventsByTopic(topic); const expected = cold('(a)', { - a: paginatedListRD + a: paginatedListRD }); expect(result).toBeObservable(expected); }); @@ -154,15 +154,15 @@ describe('QualityAssuranceEventRestService', () => { serviceASAny.rdbService.buildFromRequestUUID.and.returnValue(observableOf(qaEventObjectRD)); }); - it('should proxy the call to dataservice.findById', () => { + it('should call findById', () => { service.getEvent(qualityAssuranceEventObjectMissingPid.id).subscribe( (res) => { - expect(serviceASAny.dataService.findById).toHaveBeenCalledWith(qualityAssuranceEventObjectMissingPid.id, true, true); + expect(serviceASAny.findById).toHaveBeenCalledWith(qualityAssuranceEventObjectMissingPid.id, true, true); } ); }); - it('should return a RemoteData for the object with the given URL', () => { + it('should return a RemoteData for the object with the given URL', () => { const result = service.getEvent(qualityAssuranceEventObjectMissingPid.id); const expected = cold('(a)', { a: qaEventObjectRD @@ -176,12 +176,13 @@ describe('QualityAssuranceEventRestService', () => { serviceASAny.requestService.getByHref.and.returnValue(observableOf(responseCacheEntry)); serviceASAny.requestService.getByUUID.and.returnValue(observableOf(responseCacheEntry)); serviceASAny.rdbService.buildFromRequestUUID.and.returnValue(observableOf(qaEventObjectRD)); + serviceASAny.rdbService.buildFromRequestUUIDAndAwait.and.returnValue(observableOf(qaEventObjectRD)); }); - it('should proxy the call to dataservice.patch', () => { + it('should proxy the call to patchData.patch', () => { service.patchEvent(status, qualityAssuranceEventObjectMissingPid).subscribe( (res) => { - expect(serviceASAny.dataService.patch).toHaveBeenCalledWith(qualityAssuranceEventObjectMissingPid, operation); + expect(serviceASAny.patchData.patch).toHaveBeenCalledWith(qualityAssuranceEventObjectMissingPid, operation); } ); }); @@ -202,10 +203,10 @@ describe('QualityAssuranceEventRestService', () => { serviceASAny.rdbService.buildFromRequestUUID.and.returnValue(observableOf(qaEventObjectMissingProjectRD)); }); - it('should proxy the call to dataservice.postOnRelated', () => { + it('should call postOnRelated', () => { service.boundProject(qualityAssuranceEventObjectMissingProjectFound.id, requestUUID).subscribe( (res) => { - expect(serviceASAny.dataService.postOnRelated).toHaveBeenCalledWith(qualityAssuranceEventObjectMissingProjectFound.id, requestUUID); + expect(serviceASAny.postOnRelated).toHaveBeenCalledWith(qualityAssuranceEventObjectMissingProjectFound.id, requestUUID); } ); }); @@ -226,10 +227,10 @@ describe('QualityAssuranceEventRestService', () => { serviceASAny.rdbService.buildFromRequestUUID.and.returnValue(observableOf(createSuccessfulRemoteDataObject({}))); }); - it('should proxy the call to dataservice.deleteOnRelated', () => { + it('should call deleteOnRelated', () => { service.removeProject(qualityAssuranceEventObjectMissingProjectFound.id).subscribe( (res) => { - expect(serviceASAny.dataService.deleteOnRelated).toHaveBeenCalledWith(qualityAssuranceEventObjectMissingProjectFound.id); + expect(serviceASAny.deleteOnRelated).toHaveBeenCalledWith(qualityAssuranceEventObjectMissingProjectFound.id); } ); }); diff --git a/src/app/core/suggestion-notifications/qa/events/quality-assurance-event-rest.service.ts b/src/app/core/suggestion-notifications/qa/events/quality-assurance-event-rest.service.ts index e4d13670a1..e83c9a8b43 100644 --- a/src/app/core/suggestion-notifications/qa/events/quality-assurance-event-rest.service.ts +++ b/src/app/core/suggestion-notifications/qa/events/quality-assurance-event-rest.service.ts @@ -1,73 +1,42 @@ -/* eslint-disable max-classes-per-file */ import { Injectable } from '@angular/core'; -import { HttpClient } from '@angular/common/http'; -import { Store } from '@ngrx/store'; import { Observable } from 'rxjs'; +import { find, take } from 'rxjs/operators'; +import { ReplaceOperation } from 'fast-json-patch'; import { HALEndpointService } from '../../../shared/hal-endpoint.service'; import { NotificationsService } from '../../../../shared/notifications/notifications.service'; import { RemoteDataBuildService } from '../../../cache/builders/remote-data-build.service'; -import { RestResponse } from '../../../cache/response.models'; import { ObjectCacheService } from '../../../cache/object-cache.service'; -import { dataService } from '../../../cache/builders/build-decorators'; +import { dataService } from '../../../data/base/data-service.decorator'; import { RequestService } from '../../../data/request.service'; -import { ChangeAnalyzer } from '../../../data/change-analyzer'; -import { DefaultChangeAnalyzer } from '../../../data/default-change-analyzer.service'; import { RemoteData } from '../../../data/remote-data'; import { QualityAssuranceEventObject } from '../models/quality-assurance-event.model'; import { QUALITY_ASSURANCE_EVENT_OBJECT } from '../models/quality-assurance-event-object.resource-type'; import { FollowLinkConfig } from '../../../../shared/utils/follow-link-config.model'; import { PaginatedList } from '../../../data/paginated-list.model'; -import { ReplaceOperation } from 'fast-json-patch'; import { NoContent } from '../../../shared/NoContent.model'; -import {CoreState} from '../../../core-state.model'; -import {FindListOptions} from '../../../data/find-list-options.model'; - - -/** - * A private DataService implementation to delegate specific methods to. - */ -class DataServiceImpl extends DataService { - /** - * The REST endpoint. - */ - protected linkPath = 'qualityassuranceevents'; - - /** - * Initialize service variables - * @param {RequestService} requestService - * @param {RemoteDataBuildService} rdbService - * @param {Store} store - * @param {ObjectCacheService} objectCache - * @param {HALEndpointService} halService - * @param {NotificationsService} notificationsService - * @param {HttpClient} http - * @param {ChangeAnalyzer} comparator - */ - constructor( - protected requestService: RequestService, - protected rdbService: RemoteDataBuildService, - protected store: Store, - protected objectCache: ObjectCacheService, - protected halService: HALEndpointService, - protected notificationsService: NotificationsService, - protected http: HttpClient, - protected comparator: ChangeAnalyzer) { - super(); - } -} +import { FindListOptions } from '../../../data/find-list-options.model'; +import { IdentifiableDataService } from '../../../data/base/identifiable-data.service'; +import { CreateData, CreateDataImpl } from '../../../data/base/create-data'; +import { PatchData, PatchDataImpl } from '../../../data/base/patch-data'; +import { DeleteData, DeleteDataImpl } from '../../../data/base/delete-data'; +import { SearchData, SearchDataImpl } from '../../../data/base/search-data'; +import { DefaultChangeAnalyzer } from '../../../data/default-change-analyzer.service'; +import { hasValue } from '../../../../shared/empty.util'; +import { DeleteByIDRequest, PostRequest } from '../../../data/request.models'; /** * The service handling all Quality Assurance topic REST requests. */ @Injectable() @dataService(QUALITY_ASSURANCE_EVENT_OBJECT) -export class QualityAssuranceEventRestService { - /** - * A private DataService implementation to delegate specific methods to. - */ - private dataService: DataServiceImpl; +export class QualityAssuranceEventRestService extends IdentifiableDataService { + + private createData: CreateData; + private searchData: SearchData; + private patchData: PatchData; + private deleteData: DeleteData; /** * Initialize service variables @@ -76,7 +45,6 @@ export class QualityAssuranceEventRestService { * @param {ObjectCacheService} objectCache * @param {HALEndpointService} halService * @param {NotificationsService} notificationsService - * @param {HttpClient} http * @param {DefaultChangeAnalyzer} comparator */ constructor( @@ -85,9 +53,13 @@ export class QualityAssuranceEventRestService { protected objectCache: ObjectCacheService, protected halService: HALEndpointService, protected notificationsService: NotificationsService, - protected http: HttpClient, - protected comparator: DefaultChangeAnalyzer) { - this.dataService = new DataServiceImpl(requestService, rdbService, null, objectCache, halService, notificationsService, http, comparator); + protected comparator: DefaultChangeAnalyzer + ) { + super('qualityassuranceevents', requestService, rdbService, objectCache, halService); + this.createData = new CreateDataImpl(this.linkPath, requestService, rdbService, objectCache, halService, notificationsService, this.responseMsToLive); + this.deleteData = new DeleteDataImpl(this.linkPath, requestService, rdbService, objectCache, halService, notificationsService, this.responseMsToLive, this.constructIdEndpoint); + this.patchData = new PatchDataImpl(this.linkPath, requestService, rdbService, objectCache, halService, comparator, this.responseMsToLive, this.constructIdEndpoint); + this.searchData = new SearchDataImpl(this.linkPath, requestService, rdbService, objectCache, halService, this.responseMsToLive); } /** @@ -109,14 +81,14 @@ export class QualityAssuranceEventRestService { fieldValue: topic } ]; - return this.dataService.searchBy('findByTopic', options, true, true, ...linksToFollow); + return this.searchData.searchBy('findByTopic', options, true, true, ...linksToFollow); } /** * Clear findByTopic requests from cache */ public clearFindByTopicRequests() { - this.requestService.removeByHrefSubstring('findByTopic'); + this.requestService.setStaleByHrefSubstring('findByTopic'); } /** @@ -130,7 +102,7 @@ export class QualityAssuranceEventRestService { * The Quality Assurance event. */ public getEvent(id: string, ...linksToFollow: FollowLinkConfig[]): Observable> { - return this.dataService.findById(id, true, true, ...linksToFollow); + return this.findById(id, true, true, ...linksToFollow); } /** @@ -153,7 +125,7 @@ export class QualityAssuranceEventRestService { value: status } ]; - return this.dataService.patch(dso, operation); + return this.patchData.patch(dso, operation); } /** @@ -167,7 +139,7 @@ export class QualityAssuranceEventRestService { * The REST response. */ public boundProject(itemId: string, projectId: string): Observable> { - return this.dataService.postOnRelated(itemId, projectId); + return this.postOnRelated(itemId, projectId); } /** @@ -179,6 +151,53 @@ export class QualityAssuranceEventRestService { * The REST response. */ public removeProject(itemId: string): Observable> { - return this.dataService.deleteOnRelated(itemId); + return this.deleteOnRelated(itemId); + } + + /** + * Perform a delete operation on an endpoint related item. Ex.: endpoint//related + * @param objectId The item id + * @return the RestResponse as an Observable + */ + private deleteOnRelated(objectId: string): Observable> { + const requestId = this.requestService.generateRequestId(); + + const hrefObs = this.getIDHrefObs(objectId); + + hrefObs.pipe( + find((href: string) => hasValue(href)), + ).subscribe((href: string) => { + const request = new DeleteByIDRequest(requestId, href + '/related', objectId); + if (hasValue(this.responseMsToLive)) { + request.responseMsToLive = this.responseMsToLive; + } + this.requestService.send(request); + }); + + return this.rdbService.buildFromRequestUUID(requestId); + } + + /** + * Perform a post on an endpoint related item with ID. Ex.: endpoint//related?item= + * @param objectId The item id + * @param relatedItemId The related item Id + * @param body The optional POST body + * @return the RestResponse as an Observable + */ + private postOnRelated(objectId: string, relatedItemId: string, body?: any) { + const requestId = this.requestService.generateRequestId(); + const hrefObs = this.getIDHrefObs(objectId); + + hrefObs.pipe( + take(1) + ).subscribe((href: string) => { + const request = new PostRequest(requestId, href + '/related?item=' + relatedItemId, body); + if (hasValue(this.responseMsToLive)) { + request.responseMsToLive = this.responseMsToLive; + } + this.requestService.send(request); + }); + + return this.rdbService.buildFromRequestUUID(requestId); } } diff --git a/src/app/core/suggestion-notifications/qa/source/quality-assurance-source-rest.service.spec.ts b/src/app/core/suggestion-notifications/qa/source/quality-assurance-source-rest.service.spec.ts index dc90b581cb..f4a2d81b36 100644 --- a/src/app/core/suggestion-notifications/qa/source/quality-assurance-source-rest.service.spec.ts +++ b/src/app/core/suggestion-notifications/qa/source/quality-assurance-source-rest.service.spec.ts @@ -17,8 +17,8 @@ import { qualityAssuranceSourceObjectMoreAbstract, qualityAssuranceSourceObjectMorePid } from '../../../../shared/mocks/notifications.mock'; -import {RequestEntry} from '../../../data/request-entry.model'; -import {QualityAssuranceSourceRestService} from './quality-assurance-source-rest.service'; +import { RequestEntry } from '../../../data/request-entry.model'; +import { QualityAssuranceSourceRestService } from './quality-assurance-source-rest.service'; describe('QualityAssuranceSourceRestService', () => { let scheduler: TestScheduler; @@ -36,7 +36,7 @@ describe('QualityAssuranceSourceRestService', () => { const requestUUID = '8b3c913a-5a4b-438b-9181-be1a5b4a1c8a'; const pageInfo = new PageInfo(); - const array = [ qualityAssuranceSourceObjectMorePid, qualityAssuranceSourceObjectMoreAbstract ]; + const array = [qualityAssuranceSourceObjectMorePid, qualityAssuranceSourceObjectMoreAbstract]; const paginatedList = buildPaginatedList(pageInfo, array); const qaSourceObjectRD = createSuccessfulRemoteDataObject(qualityAssuranceSourceObjectMorePid); const paginatedListRD = createSuccessfulRemoteDataObject(paginatedList); @@ -65,7 +65,7 @@ describe('QualityAssuranceSourceRestService', () => { objectCache = {} as ObjectCacheService; halService = jasmine.createSpyObj('halService', { - getEndpoint: cold('a|', { a: endpointURL }) + getEndpoint: cold('a|', { a: endpointURL }) }); notificationsService = {} as NotificationsService; @@ -77,20 +77,18 @@ describe('QualityAssuranceSourceRestService', () => { rdbService, objectCache, halService, - notificationsService, - http, - comparator + notificationsService ); - spyOn((service as any).dataService, 'findAllByHref').and.callThrough(); - spyOn((service as any).dataService, 'findByHref').and.callThrough(); + spyOn((service as any), 'findListByHref').and.callThrough(); + spyOn((service as any), 'findByHref').and.callThrough(); }); describe('getSources', () => { - it('should proxy the call to dataservice.findAllByHref', (done) => { + it('should call findListByHref', (done) => { service.getSources().subscribe( (res) => { - expect((service as any).dataService.findAllByHref).toHaveBeenCalledWith(endpointURL, {}, true, true); + expect((service as any).findListByHref).toHaveBeenCalledWith(endpointURL, {}, true, true); } ); done(); @@ -106,10 +104,10 @@ describe('QualityAssuranceSourceRestService', () => { }); describe('getSource', () => { - it('should proxy the call to dataservice.findByHref', (done) => { + it('should call findByHref', (done) => { service.getSource(qualityAssuranceSourceObjectMorePid.id).subscribe( (res) => { - expect((service as any).dataService.findByHref).toHaveBeenCalledWith(endpointURL + '/' + qualityAssuranceSourceObjectMorePid.id, true, true); + expect((service as any).findByHref).toHaveBeenCalledWith(endpointURL + '/' + qualityAssuranceSourceObjectMorePid.id, true, true); } ); done(); diff --git a/src/app/core/suggestion-notifications/qa/source/quality-assurance-source-rest.service.ts b/src/app/core/suggestion-notifications/qa/source/quality-assurance-source-rest.service.ts index 05d2ba4ae6..8f16347b25 100644 --- a/src/app/core/suggestion-notifications/qa/source/quality-assurance-source-rest.service.ts +++ b/src/app/core/suggestion-notifications/qa/source/quality-assurance-source-rest.service.ts @@ -1,7 +1,5 @@ /* eslint-disable max-classes-per-file */ import { Injectable } from '@angular/core'; -import { HttpClient } from '@angular/common/http'; -import { Store } from '@ngrx/store'; import { Observable } from 'rxjs'; import { mergeMap, take } from 'rxjs/operators'; @@ -10,62 +8,22 @@ import { HALEndpointService } from '../../../shared/hal-endpoint.service'; import { NotificationsService } from '../../../../shared/notifications/notifications.service'; import { RemoteDataBuildService } from '../../../cache/builders/remote-data-build.service'; import { ObjectCacheService } from '../../../cache/object-cache.service'; -import { dataService } from '../../../cache/builders/build-decorators'; +import { dataService } from '../../../data/base/data-service.decorator'; import { RequestService } from '../../../data/request.service'; -import { DataService } from '../../../data/data.service'; -import { ChangeAnalyzer } from '../../../data/change-analyzer'; -import { DefaultChangeAnalyzer } from '../../../data/default-change-analyzer.service'; import { RemoteData } from '../../../data/remote-data'; import { QualityAssuranceSourceObject } from '../models/quality-assurance-source.model'; import { QUALITY_ASSURANCE_SOURCE_OBJECT } from '../models/quality-assurance-source-object.resource-type'; import { FollowLinkConfig } from '../../../../shared/utils/follow-link-config.model'; import { PaginatedList } from '../../../data/paginated-list.model'; -import {CoreState} from '../../../core-state.model'; -import {FindListOptions} from '../../../data/find-list-options.model'; - -/** - * A private DataService implementation to delegate specific methods to. - */ -class DataServiceImpl extends DataService { - /** - * The REST endpoint. - */ - protected linkPath = 'qualityassurancesources'; - - /** - * Initialize service variables - * @param {RequestService} requestService - * @param {RemoteDataBuildService} rdbService - * @param {Store} store - * @param {ObjectCacheService} objectCache - * @param {HALEndpointService} halService - * @param {NotificationsService} notificationsService - * @param {HttpClient} http - * @param {ChangeAnalyzer} comparator - */ - constructor( - protected requestService: RequestService, - protected rdbService: RemoteDataBuildService, - protected store: Store, - protected objectCache: ObjectCacheService, - protected halService: HALEndpointService, - protected notificationsService: NotificationsService, - protected http: HttpClient, - protected comparator: ChangeAnalyzer) { - super(); - } -} +import { FindListOptions } from '../../../data/find-list-options.model'; +import { IdentifiableDataService } from '../../../data/base/identifiable-data.service'; /** * The service handling all Quality Assurance source REST requests. */ @Injectable() @dataService(QUALITY_ASSURANCE_SOURCE_OBJECT) -export class QualityAssuranceSourceRestService { - /** - * A private DataService implementation to delegate specific methods to. - */ - private dataService: DataServiceImpl; +export class QualityAssuranceSourceRestService extends IdentifiableDataService { /** * Initialize service variables @@ -74,18 +32,15 @@ export class QualityAssuranceSourceRestService { * @param {ObjectCacheService} objectCache * @param {HALEndpointService} halService * @param {NotificationsService} notificationsService - * @param {HttpClient} http - * @param {DefaultChangeAnalyzer} comparator */ constructor( protected requestService: RequestService, protected rdbService: RemoteDataBuildService, protected objectCache: ObjectCacheService, protected halService: HALEndpointService, - protected notificationsService: NotificationsService, - protected http: HttpClient, - protected comparator: DefaultChangeAnalyzer) { - this.dataService = new DataServiceImpl(requestService, rdbService, null, objectCache, halService, notificationsService, http, comparator); + protected notificationsService: NotificationsService + ) { + super('qualityassurancesources', requestService, rdbService, objectCache, halService); } /** @@ -99,9 +54,9 @@ export class QualityAssuranceSourceRestService { * The list of Quality Assurance source. */ public getSources(options: FindListOptions = {}, ...linksToFollow: FollowLinkConfig[]): Observable>> { - return this.dataService.getBrowseEndpoint(options, 'qualityassurancesources').pipe( + return this.getBrowseEndpoint(options).pipe( take(1), - mergeMap((href: string) => this.dataService.findAllByHref(href, options, true, true, ...linksToFollow)), + mergeMap((href: string) => this.findListByHref(href, options, true, true, ...linksToFollow)), ); } @@ -124,9 +79,9 @@ export class QualityAssuranceSourceRestService { */ public getSource(id: string, ...linksToFollow: FollowLinkConfig[]): Observable> { const options = {}; - return this.dataService.getBrowseEndpoint(options, 'qualityassurancesources').pipe( + return this.getBrowseEndpoint(options, 'qualityassurancesources').pipe( take(1), - mergeMap((href: string) => this.dataService.findByHref(href + '/' + id, true, true, ...linksToFollow)) + mergeMap((href: string) => this.findByHref(href + '/' + id, true, true, ...linksToFollow)) ); } } diff --git a/src/app/core/suggestion-notifications/qa/topics/quality-assurance-topic-rest.service.spec.ts b/src/app/core/suggestion-notifications/qa/topics/quality-assurance-topic-rest.service.spec.ts index babc9d83b3..d16ccbdb00 100644 --- a/src/app/core/suggestion-notifications/qa/topics/quality-assurance-topic-rest.service.spec.ts +++ b/src/app/core/suggestion-notifications/qa/topics/quality-assurance-topic-rest.service.spec.ts @@ -18,7 +18,7 @@ import { qualityAssuranceTopicObjectMoreAbstract, qualityAssuranceTopicObjectMorePid } from '../../../../shared/mocks/notifications.mock'; -import {RequestEntry} from '../../../data/request-entry.model'; +import { RequestEntry } from '../../../data/request-entry.model'; describe('QualityAssuranceTopicRestService', () => { let scheduler: TestScheduler; @@ -36,7 +36,7 @@ describe('QualityAssuranceTopicRestService', () => { const requestUUID = '8b3c913a-5a4b-438b-9181-be1a5b4a1c8a'; const pageInfo = new PageInfo(); - const array = [ qualityAssuranceTopicObjectMorePid, qualityAssuranceTopicObjectMoreAbstract ]; + const array = [qualityAssuranceTopicObjectMorePid, qualityAssuranceTopicObjectMoreAbstract]; const paginatedList = buildPaginatedList(pageInfo, array); const qaTopicObjectRD = createSuccessfulRemoteDataObject(qualityAssuranceTopicObjectMorePid); const paginatedListRD = createSuccessfulRemoteDataObject(paginatedList); @@ -65,7 +65,7 @@ describe('QualityAssuranceTopicRestService', () => { objectCache = {} as ObjectCacheService; halService = jasmine.createSpyObj('halService', { - getEndpoint: cold('a|', { a: endpointURL }) + getEndpoint: cold('a|', { a: endpointURL }) }); notificationsService = {} as NotificationsService; @@ -77,20 +77,18 @@ describe('QualityAssuranceTopicRestService', () => { rdbService, objectCache, halService, - notificationsService, - http, - comparator + notificationsService ); - spyOn((service as any).dataService, 'findAllByHref').and.callThrough(); - spyOn((service as any).dataService, 'findByHref').and.callThrough(); + spyOn((service as any), 'findListByHref').and.callThrough(); + spyOn((service as any), 'findByHref').and.callThrough(); }); describe('getTopics', () => { - it('should proxy the call to dataservice.findAllByHref', (done) => { + it('should call findListByHref', (done) => { service.getTopics().subscribe( (res) => { - expect((service as any).dataService.findAllByHref).toHaveBeenCalledWith(endpointURL, {}, true, true); + expect((service as any).findListByHref).toHaveBeenCalledWith(endpointURL, {}, true, true); } ); done(); @@ -106,10 +104,10 @@ describe('QualityAssuranceTopicRestService', () => { }); describe('getTopic', () => { - it('should proxy the call to dataservice.findByHref', (done) => { + it('should call findByHref', (done) => { service.getTopic(qualityAssuranceTopicObjectMorePid.id).subscribe( (res) => { - expect((service as any).dataService.findByHref).toHaveBeenCalledWith(endpointURL + '/' + qualityAssuranceTopicObjectMorePid.id, true, true); + expect((service as any).findByHref).toHaveBeenCalledWith(endpointURL + '/' + qualityAssuranceTopicObjectMorePid.id, true, true); } ); done(); diff --git a/src/app/core/suggestion-notifications/qa/topics/quality-assurance-topic-rest.service.ts b/src/app/core/suggestion-notifications/qa/topics/quality-assurance-topic-rest.service.ts index 86942a7b5b..2ab715bbbe 100644 --- a/src/app/core/suggestion-notifications/qa/topics/quality-assurance-topic-rest.service.ts +++ b/src/app/core/suggestion-notifications/qa/topics/quality-assurance-topic-rest.service.ts @@ -1,7 +1,4 @@ -/* eslint-disable max-classes-per-file */ import { Injectable } from '@angular/core'; -import { HttpClient } from '@angular/common/http'; -import { Store } from '@ngrx/store'; import { Observable } from 'rxjs'; import { mergeMap, take } from 'rxjs/operators'; @@ -10,62 +7,22 @@ import { HALEndpointService } from '../../../shared/hal-endpoint.service'; import { NotificationsService } from '../../../../shared/notifications/notifications.service'; import { RemoteDataBuildService } from '../../../cache/builders/remote-data-build.service'; import { ObjectCacheService } from '../../../cache/object-cache.service'; -import { dataService } from '../../../cache/builders/build-decorators'; import { RequestService } from '../../../data/request.service'; -import { DataService } from '../../../data/data.service'; -import { ChangeAnalyzer } from '../../../data/change-analyzer'; -import { DefaultChangeAnalyzer } from '../../../data/default-change-analyzer.service'; import { RemoteData } from '../../../data/remote-data'; import { QualityAssuranceTopicObject } from '../models/quality-assurance-topic.model'; -import { QUALITY_ASSURANCE_TOPIC_OBJECT } from '../models/quality-assurance-topic-object.resource-type'; import { FollowLinkConfig } from '../../../../shared/utils/follow-link-config.model'; import { PaginatedList } from '../../../data/paginated-list.model'; -import {CoreState} from '../../../core-state.model'; -import {FindListOptions} from '../../../data/find-list-options.model'; - -/** - * A private DataService implementation to delegate specific methods to. - */ -class DataServiceImpl extends DataService { - /** - * The REST endpoint. - */ - protected linkPath = 'qualityassurancetopics'; - - /** - * Initialize service variables - * @param {RequestService} requestService - * @param {RemoteDataBuildService} rdbService - * @param {Store} store - * @param {ObjectCacheService} objectCache - * @param {HALEndpointService} halService - * @param {NotificationsService} notificationsService - * @param {HttpClient} http - * @param {ChangeAnalyzer} comparator - */ - constructor( - protected requestService: RequestService, - protected rdbService: RemoteDataBuildService, - protected store: Store, - protected objectCache: ObjectCacheService, - protected halService: HALEndpointService, - protected notificationsService: NotificationsService, - protected http: HttpClient, - protected comparator: ChangeAnalyzer) { - super(); - } -} +import { FindListOptions } from '../../../data/find-list-options.model'; +import { IdentifiableDataService } from '../../../data/base/identifiable-data.service'; +import { dataService } from '../../../data/base/data-service.decorator'; +import { QUALITY_ASSURANCE_TOPIC_OBJECT } from '../models/quality-assurance-topic-object.resource-type'; /** * The service handling all Quality Assurance topic REST requests. */ @Injectable() @dataService(QUALITY_ASSURANCE_TOPIC_OBJECT) -export class QualityAssuranceTopicRestService { - /** - * A private DataService implementation to delegate specific methods to. - */ - private dataService: DataServiceImpl; +export class QualityAssuranceTopicRestService extends IdentifiableDataService { /** * Initialize service variables @@ -74,18 +31,15 @@ export class QualityAssuranceTopicRestService { * @param {ObjectCacheService} objectCache * @param {HALEndpointService} halService * @param {NotificationsService} notificationsService - * @param {HttpClient} http - * @param {DefaultChangeAnalyzer} comparator */ constructor( protected requestService: RequestService, protected rdbService: RemoteDataBuildService, protected objectCache: ObjectCacheService, protected halService: HALEndpointService, - protected notificationsService: NotificationsService, - protected http: HttpClient, - protected comparator: DefaultChangeAnalyzer) { - this.dataService = new DataServiceImpl(requestService, rdbService, null, objectCache, halService, notificationsService, http, comparator); + protected notificationsService: NotificationsService + ) { + super('qualityassurancetopics', requestService, rdbService, objectCache, halService); } /** @@ -99,9 +53,9 @@ export class QualityAssuranceTopicRestService { * The list of Quality Assurance topics. */ public getTopics(options: FindListOptions = {}, ...linksToFollow: FollowLinkConfig[]): Observable>> { - return this.dataService.getBrowseEndpoint(options, 'qualityassurancetopics').pipe( + return this.getBrowseEndpoint(options).pipe( take(1), - mergeMap((href: string) => this.dataService.findAllByHref(href, options, true, true, ...linksToFollow)), + mergeMap((href: string) => this.findListByHref(href, options, true, true, ...linksToFollow)), ); } @@ -124,9 +78,9 @@ export class QualityAssuranceTopicRestService { */ public getTopic(id: string, ...linksToFollow: FollowLinkConfig[]): Observable> { const options = {}; - return this.dataService.getBrowseEndpoint(options, 'qualityassurancetopics').pipe( + return this.getBrowseEndpoint(options).pipe( take(1), - mergeMap((href: string) => this.dataService.findByHref(href + '/' + id, true, true, ...linksToFollow)) + mergeMap((href: string) => this.findByHref(href + '/' + id, true, true, ...linksToFollow)) ); } } From 58db3c7b0efed5aee9e1ec5940a2c306927d71cd Mon Sep 17 00:00:00 2001 From: Giuseppe Digilio Date: Thu, 10 Nov 2022 18:28:10 +0100 Subject: [PATCH 024/409] [CST-5337] remove deprecated @Effect decorators --- .../quality-assurance-source.effects.ts | 38 +++++++++++-------- .../quality-assurance-topics.effects.ts | 25 +++++++----- 2 files changed, 37 insertions(+), 26 deletions(-) diff --git a/src/app/suggestion-notifications/qa/source/quality-assurance-source.effects.ts b/src/app/suggestion-notifications/qa/source/quality-assurance-source.effects.ts index 2d758d2625..b1514171aa 100644 --- a/src/app/suggestion-notifications/qa/source/quality-assurance-source.effects.ts +++ b/src/app/suggestion-notifications/qa/source/quality-assurance-source.effects.ts @@ -1,21 +1,26 @@ import { Injectable } from '@angular/core'; + import { Store } from '@ngrx/store'; -import { Actions, Effect, ofType } from '@ngrx/effects'; +import { Actions, createEffect, ofType } from '@ngrx/effects'; import { TranslateService } from '@ngx-translate/core'; import { catchError, map, switchMap, tap, withLatestFrom } from 'rxjs/operators'; import { of as observableOf } from 'rxjs'; -import { - AddSourceAction, - QualityAssuranceSourceActionTypes, - RetrieveAllSourceAction, - RetrieveAllSourceErrorAction, -} from './quality-assurance-source.actions'; -import { QualityAssuranceSourceObject } from '../../../core/suggestion-notifications/qa/models/quality-assurance-source.model'; +import { + AddSourceAction, + QualityAssuranceSourceActionTypes, + RetrieveAllSourceAction, + RetrieveAllSourceErrorAction, +} from './quality-assurance-source.actions'; +import { + QualityAssuranceSourceObject +} from '../../../core/suggestion-notifications/qa/models/quality-assurance-source.model'; import { PaginatedList } from '../../../core/data/paginated-list.model'; import { QualityAssuranceSourceService } from './quality-assurance-source.service'; import { NotificationsService } from '../../../shared/notifications/notifications.service'; -import { QualityAssuranceSourceRestService } from '../../../core/suggestion-notifications/qa/source/quality-assurance-source-rest.service'; +import { + QualityAssuranceSourceRestService +} from '../../../core/suggestion-notifications/qa/source/quality-assurance-source-rest.service'; /** * Provides effect methods for the Quality Assurance source actions. @@ -26,7 +31,7 @@ export class QualityAssuranceSourceEffects { /** * Retrieve all Quality Assurance source managing pagination and errors. */ - @Effect() retrieveAllSource$ = this.actions$.pipe( + retrieveAllSource$ = createEffect(() => this.actions$.pipe( ofType(QualityAssuranceSourceActionTypes.RETRIEVE_ALL_SOURCE), withLatestFrom(this.store$), switchMap(([action, currentState]: [RetrieveAllSourceAction, any]) => { @@ -45,27 +50,27 @@ export class QualityAssuranceSourceEffects { }) ); }) - ); + )); /** * Show a notification on error. */ - @Effect({ dispatch: false }) retrieveAllSourceErrorAction$ = this.actions$.pipe( + retrieveAllSourceErrorAction$ = createEffect(() => this.actions$.pipe( ofType(QualityAssuranceSourceActionTypes.RETRIEVE_ALL_SOURCE_ERROR), tap(() => { this.notificationsService.error(null, this.translate.get('quality-assurance.source.error.service.retrieve')); }) - ); + ), { dispatch: false }); /** * Clear find all source requests from cache. */ - @Effect({ dispatch: false }) addSourceAction$ = this.actions$.pipe( + addSourceAction$ = createEffect(() => this.actions$.pipe( ofType(QualityAssuranceSourceActionTypes.ADD_SOURCE), tap(() => { this.qualityAssuranceSourceDataService.clearFindAllSourceRequests(); }) - ); + ), { dispatch: false }); /** * Initialize the effect class variables. @@ -83,5 +88,6 @@ export class QualityAssuranceSourceEffects { private notificationsService: NotificationsService, private qualityAssuranceSourceService: QualityAssuranceSourceService, private qualityAssuranceSourceDataService: QualityAssuranceSourceRestService - ) { } + ) { + } } diff --git a/src/app/suggestion-notifications/qa/topics/quality-assurance-topics.effects.ts b/src/app/suggestion-notifications/qa/topics/quality-assurance-topics.effects.ts index 880a2d2318..11d7e11555 100644 --- a/src/app/suggestion-notifications/qa/topics/quality-assurance-topics.effects.ts +++ b/src/app/suggestion-notifications/qa/topics/quality-assurance-topics.effects.ts @@ -1,21 +1,26 @@ import { Injectable } from '@angular/core'; + import { Store } from '@ngrx/store'; -import { Actions, Effect, ofType } from '@ngrx/effects'; +import { Actions, createEffect, ofType } from '@ngrx/effects'; import { TranslateService } from '@ngx-translate/core'; import { catchError, map, switchMap, tap, withLatestFrom } from 'rxjs/operators'; import { of as observableOf } from 'rxjs'; + import { AddTopicsAction, QualityAssuranceTopicActionTypes, RetrieveAllTopicsAction, RetrieveAllTopicsErrorAction, } from './quality-assurance-topics.actions'; - -import { QualityAssuranceTopicObject } from '../../../core/suggestion-notifications/qa/models/quality-assurance-topic.model'; +import { + QualityAssuranceTopicObject +} from '../../../core/suggestion-notifications/qa/models/quality-assurance-topic.model'; import { PaginatedList } from '../../../core/data/paginated-list.model'; import { QualityAssuranceTopicsService } from './quality-assurance-topics.service'; import { NotificationsService } from '../../../shared/notifications/notifications.service'; -import { QualityAssuranceTopicRestService } from '../../../core/suggestion-notifications/qa/topics/quality-assurance-topic-rest.service'; +import { + QualityAssuranceTopicRestService +} from '../../../core/suggestion-notifications/qa/topics/quality-assurance-topic-rest.service'; /** * Provides effect methods for the Quality Assurance topics actions. @@ -26,7 +31,7 @@ export class QualityAssuranceTopicsEffects { /** * Retrieve all Quality Assurance topics managing pagination and errors. */ - @Effect() retrieveAllTopics$ = this.actions$.pipe( + retrieveAllTopics$ = createEffect(() => this.actions$.pipe( ofType(QualityAssuranceTopicActionTypes.RETRIEVE_ALL_TOPICS), withLatestFrom(this.store$), switchMap(([action, currentState]: [RetrieveAllTopicsAction, any]) => { @@ -45,27 +50,27 @@ export class QualityAssuranceTopicsEffects { }) ); }) - ); + )); /** * Show a notification on error. */ - @Effect({ dispatch: false }) retrieveAllTopicsErrorAction$ = this.actions$.pipe( + retrieveAllTopicsErrorAction$ = createEffect(() => this.actions$.pipe( ofType(QualityAssuranceTopicActionTypes.RETRIEVE_ALL_TOPICS_ERROR), tap(() => { this.notificationsService.error(null, this.translate.get('quality-assurance.topic.error.service.retrieve')); }) - ); + ), { dispatch: false }); /** * Clear find all topics requests from cache. */ - @Effect({ dispatch: false }) addTopicsAction$ = this.actions$.pipe( + addTopicsAction$ = createEffect(() => this.actions$.pipe( ofType(QualityAssuranceTopicActionTypes.ADD_TOPICS), tap(() => { this.qualityAssuranceTopicDataService.clearFindAllTopicsRequests(); }) - ); + ), { dispatch: false }); /** * Initialize the effect class variables. From 3188374800c46978f530cf2c5aa141c33e393475 Mon Sep 17 00:00:00 2001 From: Giuseppe Digilio Date: Fri, 11 Nov 2022 12:56:57 +0100 Subject: [PATCH 025/409] [CST-5537] Fix issues and refactoring in order to remove nested subscriptions --- ...ty-assurance-event-object.resource-type.ts | 2 +- .../quality-assurance-events.component.html | 56 +++--- .../quality-assurance-events.component.scss | 11 +- ...quality-assurance-events.component.spec.ts | 54 +++--- .../quality-assurance-events.component.ts | 168 +++++++++--------- .../quality-assurance-source.component.html | 4 +- .../quality-assurance-source.service.ts | 20 ++- .../quality-assurance-topics.component.html | 4 +- .../quality-assurance-topics.component.ts | 12 +- .../quality-assurance-topics.service.ts | 15 +- .../suggestion-notifications.module.ts | 4 +- 11 files changed, 196 insertions(+), 154 deletions(-) diff --git a/src/app/core/suggestion-notifications/qa/models/quality-assurance-event-object.resource-type.ts b/src/app/core/suggestion-notifications/qa/models/quality-assurance-event-object.resource-type.ts index 2dedc84d08..84aff6ba2c 100644 --- a/src/app/core/suggestion-notifications/qa/models/quality-assurance-event-object.resource-type.ts +++ b/src/app/core/suggestion-notifications/qa/models/quality-assurance-event-object.resource-type.ts @@ -6,4 +6,4 @@ import { ResourceType } from '../../../shared/resource-type'; * Needs to be in a separate file to prevent circular * dependencies in webpack. */ -export const QUALITY_ASSURANCE_EVENT_OBJECT = new ResourceType('qaevent'); +export const QUALITY_ASSURANCE_EVENT_OBJECT = new ResourceType('qualityassuranceevent'); diff --git a/src/app/suggestion-notifications/qa/events/quality-assurance-events.component.html b/src/app/suggestion-notifications/qa/events/quality-assurance-events.component.html index 209b2cde27..7f1b166d24 100644 --- a/src/app/suggestion-notifications/qa/events/quality-assurance-events.component.html +++ b/src/app/suggestion-notifications/qa/events/quality-assurance-events.component.html @@ -1,21 +1,23 @@
-

{{'notifications.events.title'| translate}}

-

{{'quality-assurance.events.description'| translate}}

-

- - - {{'quality-assurance.events.back' | translate}} - -

+

+
+ {{'notifications.events.title'| translate}} + + + {{'quality-assurance.events.back' | translate}} + +
+

+
-

+

{{'quality-assurance.events.topic' | translate}} {{this.showTopic}} -

+ @@ -25,8 +27,7 @@ [sortOptions]="paginationSortConfig" (paginationChange)="getQualityAssuranceEvents()"> - - + @@ -34,11 +35,15 @@
{{'notifications.broker.table.topic' | translate}}{{'notifications.broker.table.last-event' | translate}}{{'notifications.broker.table.actions' | translate}}{{'quality-assurance.table.topic' | translate}}{{'quality-assurance.table.last-event' | translate}}{{'quality-assurance.table.actions' | translate}}
-
+
- - -
- - - - - + + + + + @@ -51,7 +56,7 @@ {{eventElement.title}} - + - - + +
{{'quality-assurance.event.table.trust' | translate}}{{'quality-assurance.event.table.publication' | translate}}{{'quality-assurance.event.table.details' | translate}}{{'quality-assurance.event.table.project-details' | translate}}{{'quality-assurance.event.table.actions' | translate}}{{'quality-assurance.event.table.trust' | translate}}{{'quality-assurance.event.table.publication' | translate}} + {{'quality-assurance.event.table.details' | translate}} + + {{'quality-assurance.event.table.project-details' | translate}} + {{'quality-assurance.event.table.actions' | translate}}
-

{{'quality-assurance.event.table.pidtype' | translate}} {{eventElement.event.message.type}}

+

{{'quality-assurance.event.table.pidtype' | translate}} {{eventElement.event.message.type}}

{{'quality-assurance.event.table.pidvalue' | translate}}
{{eventElement.event.message.value}} @@ -82,18 +87,19 @@ {{eventElement.event.message.title}}

- {{'quality-assurance.event.table.acronym' | translate}} {{eventElement.event.message.acronym}}
- {{'quality-assurance.event.table.code' | translate}} {{eventElement.event.message.code}}
- {{'quality-assurance.event.table.funder' | translate}} {{eventElement.event.message.funder}}
- {{'quality-assurance.event.table.fundingProgram' | translate}} {{eventElement.event.message.fundingProgram}}
- {{'quality-assurance.event.table.jurisdiction' | translate}} {{eventElement.event.message.jurisdiction}} + {{'quality-assurance.event.table.acronym' | translate}} {{eventElement.event.message.acronym}}
+ {{'quality-assurance.event.table.code' | translate}} {{eventElement.event.message.code}}
+ {{'quality-assurance.event.table.funder' | translate}} {{eventElement.event.message.funder}}
+ {{'quality-assurance.event.table.fundingProgram' | translate}} {{eventElement.event.message.fundingProgram}}
+ {{'quality-assurance.event.table.jurisdiction' | translate}} {{eventElement.event.message.jurisdiction}}


{{(eventElement.hasProject ? 'quality-assurance.event.project.found' : 'quality-assurance.event.project.notFound') | translate}} {{eventElement.handle}}
-
-
+
diff --git a/src/app/suggestion-notifications/qa/events/quality-assurance-events.component.scss b/src/app/suggestion-notifications/qa/events/quality-assurance-events.component.scss index b38da70f37..29c16328c3 100644 --- a/src/app/suggestion-notifications/qa/events/quality-assurance-events.component.scss +++ b/src/app/suggestion-notifications/qa/events/quality-assurance-events.component.scss @@ -1,5 +1,12 @@ -.button-rows { - min-width: 200px; +.button-col, .trust-col { + width: 15%; +} + +.title-col { + width: 30%; +} +.content-col { + width: 40%; } .button-width { diff --git a/src/app/suggestion-notifications/qa/events/quality-assurance-events.component.spec.ts b/src/app/suggestion-notifications/qa/events/quality-assurance-events.component.spec.ts index 41358b20a5..f0109f5f66 100644 --- a/src/app/suggestion-notifications/qa/events/quality-assurance-events.component.spec.ts +++ b/src/app/suggestion-notifications/qa/events/quality-assurance-events.component.spec.ts @@ -5,16 +5,18 @@ import { ComponentFixture, inject, TestBed, waitForAsync } from '@angular/core/t import { TranslateModule, TranslateService } from '@ngx-translate/core'; import { NgbModal } from '@ng-bootstrap/ng-bootstrap'; import { of as observableOf } from 'rxjs'; -import { QualityAssuranceEventRestService } from '../../../core/suggestion-notifications/qa/events/quality-assurance-event-rest.service'; +import { + QualityAssuranceEventRestService +} from '../../../core/suggestion-notifications/qa/events/quality-assurance-event-rest.service'; import { QualityAssuranceEventsComponent } from './quality-assurance-events.component'; import { getMockQualityAssuranceEventRestService, ItemMockPid10, ItemMockPid8, ItemMockPid9, + NotificationsMockDspaceObject, qualityAssuranceEventObjectMissingProjectFound, - qualityAssuranceEventObjectMissingProjectNotFound, - NotificationsMockDspaceObject + qualityAssuranceEventObjectMissingProjectNotFound } from '../../../shared/mocks/notifications.mock'; import { NotificationsServiceStub } from '../../../shared/testing/notifications-service.stub'; import { NotificationsService } from '../../../shared/notifications/notifications.service'; @@ -22,10 +24,12 @@ import { getMockTranslateService } from '../../../shared/mocks/translate.service import { createTestComponent } from '../../../shared/testing/utils.test'; import { ActivatedRouteStub } from '../../../shared/testing/active-router.stub'; import { PaginationComponentOptions } from '../../../shared/pagination/pagination-component-options.model'; -import { QualityAssuranceEventObject } from '../../../core/suggestion-notifications/qa/models/quality-assurance-event.model'; +import { + QualityAssuranceEventObject +} from '../../../core/suggestion-notifications/qa/models/quality-assurance-event.model'; import { QualityAssuranceEventData } from '../project-entry-import-modal/project-entry-import-modal.component'; import { TestScheduler } from 'rxjs/testing'; -import { getTestScheduler } from 'jasmine-marbles'; +import { cold, getTestScheduler } from 'jasmine-marbles'; import { followLink } from '../../../shared/utils/follow-link-config.model'; import { PageInfo } from '../../../core/shared/page-info.model'; import { buildPaginatedList } from '../../../core/data/paginated-list.model'; @@ -37,7 +41,7 @@ import { import { SortDirection, SortOptions } from '../../../core/cache/models/sort-options.model'; import { PaginationService } from '../../../core/pagination/pagination.service'; import { PaginationServiceStub } from '../../../shared/testing/pagination-service.stub'; -import {FindListOptions} from '../../../core/data/find-list-options.model'; +import { FindListOptions } from '../../../core/data/find-list-options.model'; describe('QualityAssuranceEventsComponent test suite', () => { let fixture: ComponentFixture; @@ -156,18 +160,16 @@ describe('QualityAssuranceEventsComponent test suite', () => { compAsAny = null; }); - describe('setEventUpdated', () => { - it('should update events', () => { - const expected = [ - getQualityAssuranceEventData1(), - getQualityAssuranceEventData2() - ]; - scheduler.schedule(() => { - compAsAny.setEventUpdated(events); + describe('fetchEvents', () => { + it('should fetch events', () => { + const result = compAsAny.fetchEvents(events); + const expected = cold('(a|)', { + a: [ + getQualityAssuranceEventData1(), + getQualityAssuranceEventData2() + ] }); - scheduler.flush(); - - expect(comp.eventsUpdated$.value).toEqual(expected); + expect(result).toBeObservable(expected); }); }); @@ -229,7 +231,10 @@ describe('QualityAssuranceEventsComponent test suite', () => { describe('executeAction', () => { it('should call getQualityAssuranceEvents on 200 response from REST', () => { const action = 'ACCEPTED'; - spyOn(compAsAny, 'getQualityAssuranceEvents'); + spyOn(compAsAny, 'getQualityAssuranceEvents').and.returnValue(observableOf([ + getQualityAssuranceEventData1(), + getQualityAssuranceEventData2() + ])); qualityAssuranceEventRestServiceStub.patchEvent.and.returnValue(createSuccessfulRemoteDataObject$({})); scheduler.schedule(() => { @@ -279,7 +284,7 @@ describe('QualityAssuranceEventsComponent test suite', () => { }); describe('getQualityAssuranceEvents', () => { - it('should call the "qualityAssuranceEventRestService.getEventsByTopic" to take data and "setEventUpdated" to populate eventData', () => { + it('should call the "qualityAssuranceEventRestService.getEventsByTopic" to take data and "fetchEvents" to populate eventData', () => { comp.paginationConfig = new PaginationComponentOptions(); comp.paginationConfig.currentPage = 1; comp.paginationConfig.pageSize = 20; @@ -292,7 +297,7 @@ describe('QualityAssuranceEventsComponent test suite', () => { const pageInfo = new PageInfo({ elementsPerPage: comp.paginationConfig.pageSize, - totalElements: 0, + totalElements: 2, totalPages: 1, currentPage: comp.paginationConfig.currentPage }); @@ -303,10 +308,13 @@ describe('QualityAssuranceEventsComponent test suite', () => { const paginatedList = buildPaginatedList(pageInfo, array); const paginatedListRD = createSuccessfulRemoteDataObject(paginatedList); qualityAssuranceEventRestServiceStub.getEventsByTopic.and.returnValue(observableOf(paginatedListRD)); - spyOn(compAsAny, 'setEventUpdated'); + spyOn(compAsAny, 'fetchEvents').and.returnValue(observableOf([ + getQualityAssuranceEventData1(), + getQualityAssuranceEventData2() + ])); scheduler.schedule(() => { - compAsAny.getQualityAssuranceEvents(); + compAsAny.getQualityAssuranceEvents().subscribe(); }); scheduler.flush(); @@ -315,7 +323,7 @@ describe('QualityAssuranceEventsComponent test suite', () => { options, followLink('target'),followLink('related') ); - expect(compAsAny.setEventUpdated).toHaveBeenCalled(); + expect(compAsAny.fetchEvents).toHaveBeenCalled(); }); }); diff --git a/src/app/suggestion-notifications/qa/events/quality-assurance-events.component.ts b/src/app/suggestion-notifications/qa/events/quality-assurance-events.component.ts index 9f33a02225..f78798ac25 100644 --- a/src/app/suggestion-notifications/qa/events/quality-assurance-events.component.ts +++ b/src/app/suggestion-notifications/qa/events/quality-assurance-events.component.ts @@ -3,8 +3,8 @@ import { ActivatedRoute } from '@angular/router'; import { NgbModal } from '@ng-bootstrap/ng-bootstrap'; import { TranslateService } from '@ngx-translate/core'; -import { BehaviorSubject, from, Observable, of as observableOf, Subscription } from 'rxjs'; -import { distinctUntilChanged, map, mergeMap, scan, switchMap, take } from 'rxjs/operators'; +import { BehaviorSubject, combineLatest, from, Observable, of, Subscription } from 'rxjs'; +import { distinctUntilChanged, last, map, mergeMap, scan, switchMap, take, tap } from 'rxjs/operators'; import { SortDirection, SortOptions } from '../../../core/cache/models/sort-options.model'; import { PaginatedList } from '../../../core/data/paginated-list.model'; @@ -19,7 +19,7 @@ import { import { PaginationComponentOptions } from '../../../shared/pagination/pagination-component-options.model'; import { Metadata } from '../../../core/shared/metadata.utils'; import { followLink } from '../../../shared/utils/follow-link-config.model'; -import { hasValue, isEmpty } from '../../../shared/empty.util'; +import { hasValue } from '../../../shared/empty.util'; import { ItemSearchResult } from '../../../shared/object-collection/shared/item-search-result.model'; import { NotificationsService } from '../../../shared/notifications/notifications.service'; import { @@ -28,7 +28,6 @@ import { } from '../project-entry-import-modal/project-entry-import-modal.component'; import { getFirstCompletedRemoteData } from '../../../core/shared/operators'; import { PaginationService } from '../../../core/pagination/pagination.service'; -import { combineLatest } from 'rxjs/internal/observable/combineLatest'; import { Item } from '../../../core/shared/item.model'; import { FindListOptions } from '../../../core/data/find-list-options.model'; @@ -65,7 +64,7 @@ export class QualityAssuranceEventsComponent implements OnInit, OnDestroy { * The total number of Quality Assurance events. * @type {Observable} */ - public totalElements$: Observable; + public totalElements$: BehaviorSubject = new BehaviorSubject(null); /** * The topic of the Quality Assurance events; suitable for displaying. * @type {string} @@ -86,11 +85,6 @@ export class QualityAssuranceEventsComponent implements OnInit, OnDestroy { * @type {Observable} */ public isEventPageLoading: BehaviorSubject = new BehaviorSubject(false); - /** - * Contains the information about the loading status of the events inside the pagination component. - * @type {Observable} - */ - public isEventLoading: BehaviorSubject = new BehaviorSubject(false); /** * The modal reference. * @type {any} @@ -104,7 +98,7 @@ export class QualityAssuranceEventsComponent implements OnInit, OnDestroy { /** * The FindListOptions object */ - protected defaultConfig: FindListOptions = Object.assign(new FindListOptions(), {sort: this.paginationSortConfig}); + protected defaultConfig: FindListOptions = Object.assign(new FindListOptions(), { sort: this.paginationSortConfig }); /** * Array to track all the component subscriptions. Useful to unsubscribe them with 'onDestroy'. * @type {Array} @@ -138,13 +132,17 @@ export class QualityAssuranceEventsComponent implements OnInit, OnDestroy { this.activatedRoute.paramMap.pipe( map((params) => params.get('topicId')), - take(1) - ).subscribe((id: string) => { - const regEx = /!/g; - this.showTopic = id.replace(regEx, '/'); - this.topic = id; + take(1), + switchMap((id: string) => { + const regEx = /!/g; + this.showTopic = id.replace(regEx, '/'); + this.topic = id; + return this.getQualityAssuranceEvents(); + }) + ).subscribe((events: QualityAssuranceEventData[]) => { + console.log(events); + this.eventsUpdated$.next(events); this.isEventPageLoading.next(false); - this.getQualityAssuranceEvents(); }); } @@ -240,20 +238,25 @@ export class QualityAssuranceEventsComponent implements OnInit, OnDestroy { public executeAction(action: string, eventData: QualityAssuranceEventData): void { eventData.isRunning = true; this.subs.push( - this.qualityAssuranceEventRestService.patchEvent(action, eventData.event, eventData.reason).pipe(getFirstCompletedRemoteData()) - .subscribe((rd: RemoteData) => { - if (rd.isSuccess && rd.statusCode === 200) { + this.qualityAssuranceEventRestService.patchEvent(action, eventData.event, eventData.reason).pipe( + getFirstCompletedRemoteData(), + switchMap((rd: RemoteData) => { + if (rd.hasSucceeded) { this.notificationsService.success( this.translateService.instant('quality-assurance.event.action.saved') ); - this.getQualityAssuranceEvents(); + return this.getQualityAssuranceEvents(); } else { this.notificationsService.error( this.translateService.instant('quality-assurance.event.action.error') ); + return of(this.eventsUpdated$.value); } - eventData.isRunning = false; }) + ).subscribe((events: QualityAssuranceEventData[]) => { + this.eventsUpdated$.next(events); + eventData.isRunning = false; + }) ); } @@ -274,7 +277,7 @@ export class QualityAssuranceEventsComponent implements OnInit, OnDestroy { this.subs.push( this.qualityAssuranceEventRestService.boundProject(eventData.id, projectId).pipe(getFirstCompletedRemoteData()) .subscribe((rd: RemoteData) => { - if (rd.isSuccess) { + if (rd.hasSucceeded) { this.notificationsService.success( this.translateService.instant('quality-assurance.event.project.bounded') ); @@ -303,7 +306,7 @@ export class QualityAssuranceEventsComponent implements OnInit, OnDestroy { this.subs.push( this.qualityAssuranceEventRestService.removeProject(eventData.id).pipe(getFirstCompletedRemoteData()) .subscribe((rd: RemoteData) => { - if (rd.isSuccess) { + if (rd.hasSucceeded) { this.notificationsService.success( this.translateService.instant('quality-assurance.event.project.removed') ); @@ -337,12 +340,11 @@ export class QualityAssuranceEventsComponent implements OnInit, OnDestroy { return event.pidHref; } - /** * Dispatch the Quality Assurance events retrival. */ - public getQualityAssuranceEvents(): void { - this.paginationService.getFindListOptions(this.paginationConfig.id, this.defaultConfig).pipe( + public getQualityAssuranceEvents(): Observable { + return this.paginationService.getFindListOptions(this.paginationConfig.id, this.defaultConfig).pipe( distinctUntilChanged(), switchMap((options: FindListOptions) => this.qualityAssuranceEventRestService.getEventsByTopic( this.topic, @@ -350,16 +352,24 @@ export class QualityAssuranceEventsComponent implements OnInit, OnDestroy { followLink('target'), followLink('related') )), getFirstCompletedRemoteData(), - ).subscribe((rd: RemoteData>) => { - if (rd.hasSucceeded) { - this.isEventLoading.next(false); - this.totalElements$ = observableOf(rd.payload.totalElements); - this.setEventUpdated(rd.payload.page); - } else { - throw new Error('Can\'t retrieve Quality Assurance events from the Broker events REST service'); - } - this.qualityAssuranceEventRestService.clearFindByTopicRequests(); - }); + switchMap((rd: RemoteData>) => { + if (rd.hasSucceeded) { + this.totalElements$.next(rd.payload.totalElements); + if (rd.payload.totalElements > 0) { + console.log(rd.payload.page); + return this.fetchEvents(rd.payload.page); + } else { + return of([]); + } + } else { + throw new Error('Can\'t retrieve Quality Assurance events from the Broker events REST service'); + } + }), + take(1), + tap(() => { + this.qualityAssuranceEventRestService.clearFindByTopicRequests(); + }) + ); } /** @@ -372,55 +382,47 @@ export class QualityAssuranceEventsComponent implements OnInit, OnDestroy { } /** - * Set the project status for the Quality Assurance events. + * Fetch Quality Assurance events in order to build proper QualityAssuranceEventData object. * * @param {QualityAssuranceEventObject[]} events * the Quality Assurance event item + * @return array of QualityAssuranceEventData */ - protected setEventUpdated(events: QualityAssuranceEventObject[]): void { - if (isEmpty(events)) { - this.eventsUpdated$.next([]); - } else { - this.subs.push( - from(events).pipe( - mergeMap((event: QualityAssuranceEventObject) => { - const related$ = event.related.pipe( - getFirstCompletedRemoteData(), - ); - const target$ = event.target.pipe( - getFirstCompletedRemoteData() - ); - return combineLatest([related$, target$]).pipe( - map(([relatedItemRD, targetItemRD]: [RemoteData, RemoteData]) => { - const data: QualityAssuranceEventData = { - event: event, - id: event.id, - title: event.title, - hasProject: false, - projectTitle: null, - projectId: null, - handle: null, - reason: null, - isRunning: false, - target: (targetItemRD?.hasSucceeded) ? targetItemRD.payload : null, - }; - if (relatedItemRD?.hasSucceeded && relatedItemRD?.payload?.id) { - data.hasProject = true; - data.projectTitle = event.message.title; - data.projectId = relatedItemRD?.payload?.id; - data.handle = relatedItemRD?.payload?.handle; - } - return data; - }) - ); - }), - scan((acc: any, value: any) => [...acc, value], []), - take(events.length) - ).subscribe((eventsReduced) => { - this.eventsUpdated$.next(eventsReduced); - } - ) - ); - } + protected fetchEvents(events: QualityAssuranceEventObject[]): Observable { + return from(events).pipe( + mergeMap((event: QualityAssuranceEventObject) => { + const related$ = event.related.pipe( + getFirstCompletedRemoteData(), + ); + const target$ = event.target.pipe( + getFirstCompletedRemoteData() + ); + return combineLatest([related$, target$]).pipe( + map(([relatedItemRD, targetItemRD]: [RemoteData, RemoteData]) => { + const data: QualityAssuranceEventData = { + event: event, + id: event.id, + title: event.title, + hasProject: false, + projectTitle: null, + projectId: null, + handle: null, + reason: null, + isRunning: false, + target: (targetItemRD?.hasSucceeded) ? targetItemRD.payload : null, + }; + if (relatedItemRD?.hasSucceeded && relatedItemRD?.payload?.id) { + data.hasProject = true; + data.projectTitle = event.message.title; + data.projectId = relatedItemRD?.payload?.id; + data.handle = relatedItemRD?.payload?.handle; + } + return data; + }) + ); + }), + scan((acc: any, value: any) => [...acc, value], []), + last() + ); } } diff --git a/src/app/suggestion-notifications/qa/source/quality-assurance-source.component.html b/src/app/suggestion-notifications/qa/source/quality-assurance-source.component.html index 20f4d4394a..0f6cf18402 100644 --- a/src/app/suggestion-notifications/qa/source/quality-assurance-source.component.html +++ b/src/app/suggestion-notifications/qa/source/quality-assurance-source.component.html @@ -2,12 +2,12 @@

{{'quality-assurance.title'| translate}}

-

{{'quality-assurance.source.description'| translate}}

+
-

{{'quality-assurance.source'| translate}}

+

{{'quality-assurance.source'| translate}}

>) => !rd.isResponsePending), + getFirstCompletedRemoteData(), map((rd: RemoteData>) => { if (rd.hasSucceeded) { return rd.payload; diff --git a/src/app/suggestion-notifications/qa/topics/quality-assurance-topics.component.html b/src/app/suggestion-notifications/qa/topics/quality-assurance-topics.component.html index fdc7d554a2..db8586f264 100644 --- a/src/app/suggestion-notifications/qa/topics/quality-assurance-topics.component.html +++ b/src/app/suggestion-notifications/qa/topics/quality-assurance-topics.component.html @@ -2,12 +2,12 @@

{{'quality-assurance.title'| translate}}

-

{{'quality-assurance.topics.description'| translate:{source: sourceId} }}

+ {{'quality-assurance.topics.description'| translate:{source: sourceId} }}
-

{{'quality-assurance.topics'| translate}}

+

{{'quality-assurance.topics'| translate}}

>) => !rd.isResponsePending), + getFirstCompletedRemoteData(), map((rd: RemoteData>) => { if (rd.hasSucceeded) { return rd.payload; diff --git a/src/app/suggestion-notifications/suggestion-notifications.module.ts b/src/app/suggestion-notifications/suggestion-notifications.module.ts index 90e73eb0be..e7e2272fff 100644 --- a/src/app/suggestion-notifications/suggestion-notifications.module.ts +++ b/src/app/suggestion-notifications/suggestion-notifications.module.ts @@ -30,6 +30,7 @@ import { const MODULES = [ CommonModule, SharedModule, + SearchModule, CoreModule.forRoot(), StoreModule.forFeature('suggestionNotifications', suggestionNotificationsReducers, storeModuleConfig as StoreConfig), EffectsModule.forFeature(suggestionNotificationsEffects), @@ -59,8 +60,7 @@ const PROVIDERS = [ @NgModule({ imports: [ - ...MODULES, - SearchModule + ...MODULES ], declarations: [ ...COMPONENTS, From 9fd4a1feee5a13fbe1c2909445c8cc61548f9b3e Mon Sep 17 00:00:00 2001 From: Giuseppe Digilio Date: Fri, 11 Nov 2022 13:07:21 +0100 Subject: [PATCH 026/409] [CST-5537] Add flag to hide the export button from search results when needed --- .../search-results.component.html | 2 +- .../search-results.component.ts | 5 +++++ .../themed-search-results.component.ts | 4 +++- src/app/shared/search/search.component.html | 21 ++++++++++--------- src/app/shared/search/search.component.ts | 5 +++++ .../shared/search/themed-search.component.ts | 4 +++- 6 files changed, 28 insertions(+), 13 deletions(-) diff --git a/src/app/shared/search/search-results/search-results.component.html b/src/app/shared/search/search-results/search-results.component.html index 44498c3cab..dcb3465be4 100644 --- a/src/app/shared/search/search-results/search-results.component.html +++ b/src/app/shared/search/search-results/search-results.component.html @@ -1,6 +1,6 @@

{{ (configuration ? configuration + '.search.results.head' : 'search.results.head') | translate }}

- +
{ - protected inAndOutputNames: (keyof SearchResultsComponent & keyof this)[] = ['linkType', 'searchResults', 'searchConfig', 'sortConfig', 'viewMode', 'configuration', 'disableHeader', 'selectable', 'context', 'hidePaginationDetail', 'selectionConfig', 'contentChange', 'deselectObject', 'selectObject']; + protected inAndOutputNames: (keyof SearchResultsComponent & keyof this)[] = ['linkType', 'searchResults', 'searchConfig', 'showExport', 'sortConfig', 'viewMode', 'configuration', 'disableHeader', 'selectable', 'context', 'hidePaginationDetail', 'selectionConfig', 'contentChange', 'deselectObject', 'selectObject']; @Input() linkType: CollectionElementLinkType; @@ -29,6 +29,8 @@ export class ThemedSearchResultsComponent extends ThemedComponent
+ [searchConfig]="searchOptions$ | async" + [configuration]="(currentConfiguration$ | async)" + [disableHeader]="!searchEnabled" + [linkType]="linkType" + [context]="(currentContext$ | async)" + [selectable]="selectable" + [selectionConfig]="selectionConfig" + [showExport]="showExport" + (contentChange)="onContentChange($event)" + (deselectObject)="deselectObject.emit($event)" + (selectObject)="selectObject.emit($event)">
diff --git a/src/app/shared/search/search.component.ts b/src/app/shared/search/search.component.ts index c094e37ef2..b08b9a4b2a 100644 --- a/src/app/shared/search/search.component.ts +++ b/src/app/shared/search/search.component.ts @@ -117,6 +117,11 @@ export class SearchComponent implements OnInit { */ @Input() selectionConfig: SelectionConfig; + /** + * A boolean representing if show export button + */ + @Input() showExport = true; + /** * A boolean representing if show search sidebar button */ diff --git a/src/app/shared/search/themed-search.component.ts b/src/app/shared/search/themed-search.component.ts index 64a2befeb2..095357d74b 100644 --- a/src/app/shared/search/themed-search.component.ts +++ b/src/app/shared/search/themed-search.component.ts @@ -19,7 +19,7 @@ import { ListableObject } from '../object-collection/shared/listable-object.mode templateUrl: '../theme-support/themed.component.html', }) export class ThemedSearchComponent extends ThemedComponent { - protected inAndOutputNames: (keyof SearchComponent & keyof this)[] = ['configurationList', 'context', 'configuration', 'fixedFilterQuery', 'useCachedVersionIfAvailable', 'inPlaceSearch', 'linkType', 'paginationId', 'searchEnabled', 'sideBarWidth', 'searchFormPlaceholder', 'selectable', 'selectionConfig', 'showSidebar', 'showViewModes', 'useUniquePageId', 'viewModeList', 'showScopeSelector', 'resultFound', 'deselectObject', 'selectObject', 'trackStatistics']; + protected inAndOutputNames: (keyof SearchComponent & keyof this)[] = ['configurationList', 'context', 'configuration', 'fixedFilterQuery', 'useCachedVersionIfAvailable', 'inPlaceSearch', 'linkType', 'paginationId', 'searchEnabled', 'sideBarWidth', 'searchFormPlaceholder', 'selectable', 'selectionConfig', 'showExport', 'showSidebar', 'showViewModes', 'useUniquePageId', 'viewModeList', 'showScopeSelector', 'resultFound', 'deselectObject', 'selectObject', 'trackStatistics']; @Input() configurationList: SearchConfigurationOption[] = []; @@ -47,6 +47,8 @@ export class ThemedSearchComponent extends ThemedComponent { @Input() selectionConfig: SelectionConfig; + @Input() showExport = true; + @Input() showSidebar = true; @Input() showViewModes = true; From 79cd69fb9421d818b9e33731fc8eb2e47f49f3c7 Mon Sep 17 00:00:00 2001 From: Giuseppe Digilio Date: Fri, 11 Nov 2022 13:07:52 +0100 Subject: [PATCH 027/409] [CST-5537] hide the export button from project search --- .../project-entry-import-modal.component.html | 27 ++++++++++--------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/src/app/suggestion-notifications/qa/project-entry-import-modal/project-entry-import-modal.component.html b/src/app/suggestion-notifications/qa/project-entry-import-modal/project-entry-import-modal.component.html index 1090fd22fc..35b4b396a7 100644 --- a/src/app/suggestion-notifications/qa/project-entry-import-modal/project-entry-import-modal.component.html +++ b/src/app/suggestion-notifications/qa/project-entry-import-modal/project-entry-import-modal.component.html @@ -38,19 +38,20 @@
- - + +
From b8880091e6da2f5168255b8de8a55723cbcb0f94 Mon Sep 17 00:00:00 2001 From: Giuseppe Digilio Date: Fri, 11 Nov 2022 14:41:50 +0100 Subject: [PATCH 028/409] [CST-5537] Fix lint --- .../admin-quality-assurance-source-page.component.ts | 2 +- src/app/shared/selector.util.ts | 2 +- .../project-entry-import-modal.component.ts | 3 +-- .../qa/source/quality-assurance-source.service.spec.ts | 7 ++++--- .../qa/topics/quality-assurance-topics.component.spec.ts | 4 ++-- 5 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/app/admin/admin-notifications/admin-quality-assurance-source-page-component/admin-quality-assurance-source-page.component.ts b/src/app/admin/admin-notifications/admin-quality-assurance-source-page-component/admin-quality-assurance-source-page.component.ts index 20d0356d5f..447e5a2e55 100644 --- a/src/app/admin/admin-notifications/admin-quality-assurance-source-page-component/admin-quality-assurance-source-page.component.ts +++ b/src/app/admin/admin-notifications/admin-quality-assurance-source-page-component/admin-quality-assurance-source-page.component.ts @@ -1,4 +1,4 @@ -import { Component, OnInit } from '@angular/core'; +import { Component } from '@angular/core'; /** * Component for the page that show the QA sources. diff --git a/src/app/shared/selector.util.ts b/src/app/shared/selector.util.ts index 97ddb9af7d..7ea73347b7 100644 --- a/src/app/shared/selector.util.ts +++ b/src/app/shared/selector.util.ts @@ -1,4 +1,4 @@ -import { createSelector, MemoizedSelector, Selector } from '@ngrx/store'; +import { createSelector, MemoizedSelector } from '@ngrx/store'; import { hasValue } from './empty.util'; /** diff --git a/src/app/suggestion-notifications/qa/project-entry-import-modal/project-entry-import-modal.component.ts b/src/app/suggestion-notifications/qa/project-entry-import-modal/project-entry-import-modal.component.ts index bde97f364c..1a43f59a1f 100644 --- a/src/app/suggestion-notifications/qa/project-entry-import-modal/project-entry-import-modal.component.ts +++ b/src/app/suggestion-notifications/qa/project-entry-import-modal/project-entry-import-modal.component.ts @@ -13,9 +13,8 @@ import { PaginationComponentOptions } from '../../../shared/pagination/paginatio import { SearchService } from '../../../core/shared/search/search.service'; import { DSpaceObject } from '../../../core/shared/dspace-object.model'; import { - QualityAssuranceEventObject, - QualityAssuranceEventMessageObject, OpenaireQualityAssuranceEventMessageObject, + QualityAssuranceEventObject, } from '../../../core/suggestion-notifications/qa/models/quality-assurance-event.model'; import { hasValue, isNotEmpty } from '../../../shared/empty.util'; import { Item } from '../../../core/shared/item.model'; diff --git a/src/app/suggestion-notifications/qa/source/quality-assurance-source.service.spec.ts b/src/app/suggestion-notifications/qa/source/quality-assurance-source.service.spec.ts index 208e45e387..355de6e616 100644 --- a/src/app/suggestion-notifications/qa/source/quality-assurance-source.service.spec.ts +++ b/src/app/suggestion-notifications/qa/source/quality-assurance-source.service.spec.ts @@ -11,9 +11,10 @@ import { import { createSuccessfulRemoteDataObject } from '../../../shared/remote-data.utils'; import { cold } from 'jasmine-marbles'; import { buildPaginatedList } from '../../../core/data/paginated-list.model'; -import { QualityAssuranceSourceRestService } from '../../../core/suggestion-notifications/qa/source/quality-assurance-source-rest.service'; -import { RequestParam } from '../../../core/cache/models/request-param.model'; -import {FindListOptions} from '../../../core/data/find-list-options.model'; +import { + QualityAssuranceSourceRestService +} from '../../../core/suggestion-notifications/qa/source/quality-assurance-source-rest.service'; +import { FindListOptions } from '../../../core/data/find-list-options.model'; describe('QualityAssuranceSourceService', () => { let service: QualityAssuranceSourceService; diff --git a/src/app/suggestion-notifications/qa/topics/quality-assurance-topics.component.spec.ts b/src/app/suggestion-notifications/qa/topics/quality-assurance-topics.component.spec.ts index 6e933a0e80..c80d2bce20 100644 --- a/src/app/suggestion-notifications/qa/topics/quality-assurance-topics.component.spec.ts +++ b/src/app/suggestion-notifications/qa/topics/quality-assurance-topics.component.spec.ts @@ -1,9 +1,9 @@ /* eslint-disable no-empty, @typescript-eslint/no-empty-function */ import { CommonModule } from '@angular/common'; import { Component, NO_ERRORS_SCHEMA } from '@angular/core'; -import { ActivatedRoute, Router } from '@angular/router'; +import { ActivatedRoute } from '@angular/router'; import { TranslateModule } from '@ngx-translate/core'; -import { of as observableOf, of } from 'rxjs'; +import { of as observableOf } from 'rxjs'; import { ComponentFixture, inject, TestBed, waitForAsync } from '@angular/core/testing'; import { createTestComponent } from '../../../shared/testing/utils.test'; import { From 625409cbb016c16d894826a915ee337ccdeabb29 Mon Sep 17 00:00:00 2001 From: Giuseppe Digilio Date: Thu, 17 Nov 2022 11:45:59 +0100 Subject: [PATCH 029/409] [CST-5537] Rename rest services to data services --- ...lity-assurance-event-data.service.spec.ts} | 8 ++-- ...> quality-assurance-event-data.service.ts} | 2 +- ...ity-assurance-source-data.service.spec.ts} | 20 ++++---- ... quality-assurance-source-data.service.ts} | 48 +++++++++---------- ...lity-assurance-topic-data.service.spec.ts} | 16 +++---- ...> quality-assurance-topic-data.service.ts} | 44 +++++++++-------- src/app/shared/mocks/notifications.mock.ts | 40 ++++++++++------ ...quality-assurance-events.component.spec.ts | 6 +-- .../quality-assurance-events.component.ts | 8 ++-- .../quality-assurance-source.effects.ts | 8 ++-- .../quality-assurance-source.service.spec.ts | 10 ++-- .../quality-assurance-source.service.ts | 8 ++-- .../quality-assurance-topics.effects.ts | 8 ++-- .../quality-assurance-topics.service.spec.ts | 12 +++-- .../quality-assurance-topics.service.ts | 8 ++-- .../suggestion-notifications.module.ts | 18 +++---- 16 files changed, 139 insertions(+), 125 deletions(-) rename src/app/core/suggestion-notifications/qa/events/{quality-assurance-event-rest.service.spec.ts => quality-assurance-event-data.service.spec.ts} (97%) rename src/app/core/suggestion-notifications/qa/events/{quality-assurance-event-rest.service.ts => quality-assurance-event-data.service.ts} (99%) rename src/app/core/suggestion-notifications/qa/source/{quality-assurance-source-rest.service.spec.ts => quality-assurance-source-data.service.spec.ts} (84%) rename src/app/core/suggestion-notifications/qa/source/{quality-assurance-source-rest.service.ts => quality-assurance-source-data.service.ts} (52%) rename src/app/core/suggestion-notifications/qa/topics/{quality-assurance-topic-rest.service.spec.ts => quality-assurance-topic-data.service.spec.ts} (86%) rename src/app/core/suggestion-notifications/qa/topics/{quality-assurance-topic-rest.service.ts => quality-assurance-topic-data.service.ts} (53%) diff --git a/src/app/core/suggestion-notifications/qa/events/quality-assurance-event-rest.service.spec.ts b/src/app/core/suggestion-notifications/qa/events/quality-assurance-event-data.service.spec.ts similarity index 97% rename from src/app/core/suggestion-notifications/qa/events/quality-assurance-event-rest.service.spec.ts rename to src/app/core/suggestion-notifications/qa/events/quality-assurance-event-data.service.spec.ts index 731c70d624..50d0e43a99 100644 --- a/src/app/core/suggestion-notifications/qa/events/quality-assurance-event-rest.service.spec.ts +++ b/src/app/core/suggestion-notifications/qa/events/quality-assurance-event-data.service.spec.ts @@ -13,7 +13,7 @@ import { PageInfo } from '../../../shared/page-info.model'; import { HALEndpointService } from '../../../shared/hal-endpoint.service'; import { NotificationsService } from '../../../../shared/notifications/notifications.service'; import { createSuccessfulRemoteDataObject } from '../../../../shared/remote-data.utils'; -import { QualityAssuranceEventRestService } from './quality-assurance-event-rest.service'; +import { QualityAssuranceEventDataService } from './quality-assurance-event-data.service'; import { qualityAssuranceEventObjectMissingPid, qualityAssuranceEventObjectMissingPid2, @@ -23,9 +23,9 @@ import { ReplaceOperation } from 'fast-json-patch'; import { RequestEntry } from '../../../data/request-entry.model'; import { FindListOptions } from '../../../data/find-list-options.model'; -describe('QualityAssuranceEventRestService', () => { +describe('QualityAssuranceEventDataService', () => { let scheduler: TestScheduler; - let service: QualityAssuranceEventRestService; + let service: QualityAssuranceEventDataService; let serviceASAny: any; let responseCacheEntry: RequestEntry; let responseCacheEntryB: RequestEntry; @@ -100,7 +100,7 @@ describe('QualityAssuranceEventRestService', () => { http = {} as HttpClient; comparator = {} as any; - service = new QualityAssuranceEventRestService( + service = new QualityAssuranceEventDataService( requestService, rdbService, objectCache, diff --git a/src/app/core/suggestion-notifications/qa/events/quality-assurance-event-rest.service.ts b/src/app/core/suggestion-notifications/qa/events/quality-assurance-event-data.service.ts similarity index 99% rename from src/app/core/suggestion-notifications/qa/events/quality-assurance-event-rest.service.ts rename to src/app/core/suggestion-notifications/qa/events/quality-assurance-event-data.service.ts index e83c9a8b43..7f7e68afaa 100644 --- a/src/app/core/suggestion-notifications/qa/events/quality-assurance-event-rest.service.ts +++ b/src/app/core/suggestion-notifications/qa/events/quality-assurance-event-data.service.ts @@ -31,7 +31,7 @@ import { DeleteByIDRequest, PostRequest } from '../../../data/request.models'; */ @Injectable() @dataService(QUALITY_ASSURANCE_EVENT_OBJECT) -export class QualityAssuranceEventRestService extends IdentifiableDataService { +export class QualityAssuranceEventDataService extends IdentifiableDataService { private createData: CreateData; private searchData: SearchData; diff --git a/src/app/core/suggestion-notifications/qa/source/quality-assurance-source-rest.service.spec.ts b/src/app/core/suggestion-notifications/qa/source/quality-assurance-source-data.service.spec.ts similarity index 84% rename from src/app/core/suggestion-notifications/qa/source/quality-assurance-source-rest.service.spec.ts rename to src/app/core/suggestion-notifications/qa/source/quality-assurance-source-data.service.spec.ts index f4a2d81b36..50d9251bb8 100644 --- a/src/app/core/suggestion-notifications/qa/source/quality-assurance-source-rest.service.spec.ts +++ b/src/app/core/suggestion-notifications/qa/source/quality-assurance-source-data.service.spec.ts @@ -18,11 +18,11 @@ import { qualityAssuranceSourceObjectMorePid } from '../../../../shared/mocks/notifications.mock'; import { RequestEntry } from '../../../data/request-entry.model'; -import { QualityAssuranceSourceRestService } from './quality-assurance-source-rest.service'; +import { QualityAssuranceSourceDataService } from './quality-assurance-source-data.service'; -describe('QualityAssuranceSourceRestService', () => { +describe('QualityAssuranceSourceDataService', () => { let scheduler: TestScheduler; - let service: QualityAssuranceSourceRestService; + let service: QualityAssuranceSourceDataService; let responseCacheEntry: RequestEntry; let requestService: RequestService; let rdbService: RemoteDataBuildService; @@ -72,7 +72,7 @@ describe('QualityAssuranceSourceRestService', () => { http = {} as HttpClient; comparator = {} as any; - service = new QualityAssuranceSourceRestService( + service = new QualityAssuranceSourceDataService( requestService, rdbService, objectCache, @@ -80,15 +80,15 @@ describe('QualityAssuranceSourceRestService', () => { notificationsService ); - spyOn((service as any), 'findListByHref').and.callThrough(); - spyOn((service as any), 'findByHref').and.callThrough(); + spyOn((service as any).findAllData, 'findAll').and.callThrough(); + spyOn((service as any), 'findById').and.callThrough(); }); describe('getSources', () => { - it('should call findListByHref', (done) => { + it('should call findAll', (done) => { service.getSources().subscribe( (res) => { - expect((service as any).findListByHref).toHaveBeenCalledWith(endpointURL, {}, true, true); + expect((service as any).findAllData.findAll).toHaveBeenCalledWith({}, true, true); } ); done(); @@ -104,10 +104,10 @@ describe('QualityAssuranceSourceRestService', () => { }); describe('getSource', () => { - it('should call findByHref', (done) => { + it('should call findById', (done) => { service.getSource(qualityAssuranceSourceObjectMorePid.id).subscribe( (res) => { - expect((service as any).findByHref).toHaveBeenCalledWith(endpointURL + '/' + qualityAssuranceSourceObjectMorePid.id, true, true); + expect((service as any).findById).toHaveBeenCalledWith(qualityAssuranceSourceObjectMorePid.id, true, true); } ); done(); diff --git a/src/app/core/suggestion-notifications/qa/source/quality-assurance-source-rest.service.ts b/src/app/core/suggestion-notifications/qa/source/quality-assurance-source-data.service.ts similarity index 52% rename from src/app/core/suggestion-notifications/qa/source/quality-assurance-source-rest.service.ts rename to src/app/core/suggestion-notifications/qa/source/quality-assurance-source-data.service.ts index 8f16347b25..03a5da2e8c 100644 --- a/src/app/core/suggestion-notifications/qa/source/quality-assurance-source-rest.service.ts +++ b/src/app/core/suggestion-notifications/qa/source/quality-assurance-source-data.service.ts @@ -1,8 +1,6 @@ -/* eslint-disable max-classes-per-file */ import { Injectable } from '@angular/core'; import { Observable } from 'rxjs'; -import { mergeMap, take } from 'rxjs/operators'; import { HALEndpointService } from '../../../shared/hal-endpoint.service'; import { NotificationsService } from '../../../../shared/notifications/notifications.service'; @@ -17,13 +15,16 @@ import { FollowLinkConfig } from '../../../../shared/utils/follow-link-config.mo import { PaginatedList } from '../../../data/paginated-list.model'; import { FindListOptions } from '../../../data/find-list-options.model'; import { IdentifiableDataService } from '../../../data/base/identifiable-data.service'; +import { FindAllData, FindAllDataImpl } from '../../../data/base/find-all-data'; /** * The service handling all Quality Assurance source REST requests. */ @Injectable() @dataService(QUALITY_ASSURANCE_SOURCE_OBJECT) -export class QualityAssuranceSourceRestService extends IdentifiableDataService { +export class QualityAssuranceSourceDataService extends IdentifiableDataService { + + private findAllData: FindAllData; /** * Initialize service variables @@ -41,23 +42,24 @@ export class QualityAssuranceSourceRestService extends IdentifiableDataService>> * The list of Quality Assurance source. */ - public getSources(options: FindListOptions = {}, ...linksToFollow: FollowLinkConfig[]): Observable>> { - return this.getBrowseEndpoint(options).pipe( - take(1), - mergeMap((href: string) => this.findListByHref(href, options, true, true, ...linksToFollow)), - ); + public getSources(options: FindListOptions = {}, useCachedVersionIfAvailable = true, reRequestOnStale = true, ...linksToFollow: FollowLinkConfig[]): Observable>> { + return this.findAllData.findAll(options, useCachedVersionIfAvailable, reRequestOnStale, ...linksToFollow); } /** @@ -70,18 +72,16 @@ export class QualityAssuranceSourceRestService extends IdentifiableDataService> - * The Quality Assurance source. + * @param id The Quality Assurance source id + * @param useCachedVersionIfAvailable If this is true, the request will only be sent if there's + * no valid cached version. Defaults to true + * @param reRequestOnStale Whether or not the request should automatically be re- + * requested after the response becomes stale + * @param linksToFollow List of {@link FollowLinkConfig} that indicate which {@link HALLink}s should be automatically resolved. + * + * @return Observable> The Quality Assurance source. */ - public getSource(id: string, ...linksToFollow: FollowLinkConfig[]): Observable> { - const options = {}; - return this.getBrowseEndpoint(options, 'qualityassurancesources').pipe( - take(1), - mergeMap((href: string) => this.findByHref(href + '/' + id, true, true, ...linksToFollow)) - ); + public getSource(id: string, useCachedVersionIfAvailable = true, reRequestOnStale = true, ...linksToFollow: FollowLinkConfig[]): Observable> { + return this.findById(id, useCachedVersionIfAvailable, reRequestOnStale, ...linksToFollow); } } diff --git a/src/app/core/suggestion-notifications/qa/topics/quality-assurance-topic-rest.service.spec.ts b/src/app/core/suggestion-notifications/qa/topics/quality-assurance-topic-data.service.spec.ts similarity index 86% rename from src/app/core/suggestion-notifications/qa/topics/quality-assurance-topic-rest.service.spec.ts rename to src/app/core/suggestion-notifications/qa/topics/quality-assurance-topic-data.service.spec.ts index d16ccbdb00..638ee3fa62 100644 --- a/src/app/core/suggestion-notifications/qa/topics/quality-assurance-topic-rest.service.spec.ts +++ b/src/app/core/suggestion-notifications/qa/topics/quality-assurance-topic-data.service.spec.ts @@ -13,16 +13,16 @@ import { PageInfo } from '../../../shared/page-info.model'; import { HALEndpointService } from '../../../shared/hal-endpoint.service'; import { NotificationsService } from '../../../../shared/notifications/notifications.service'; import { createSuccessfulRemoteDataObject } from '../../../../shared/remote-data.utils'; -import { QualityAssuranceTopicRestService } from './quality-assurance-topic-rest.service'; +import { QualityAssuranceTopicDataService } from './quality-assurance-topic-data.service'; import { qualityAssuranceTopicObjectMoreAbstract, qualityAssuranceTopicObjectMorePid } from '../../../../shared/mocks/notifications.mock'; import { RequestEntry } from '../../../data/request-entry.model'; -describe('QualityAssuranceTopicRestService', () => { +describe('QualityAssuranceTopicDataService', () => { let scheduler: TestScheduler; - let service: QualityAssuranceTopicRestService; + let service: QualityAssuranceTopicDataService; let responseCacheEntry: RequestEntry; let requestService: RequestService; let rdbService: RemoteDataBuildService; @@ -72,7 +72,7 @@ describe('QualityAssuranceTopicRestService', () => { http = {} as HttpClient; comparator = {} as any; - service = new QualityAssuranceTopicRestService( + service = new QualityAssuranceTopicDataService( requestService, rdbService, objectCache, @@ -80,15 +80,15 @@ describe('QualityAssuranceTopicRestService', () => { notificationsService ); - spyOn((service as any), 'findListByHref').and.callThrough(); - spyOn((service as any), 'findByHref').and.callThrough(); + spyOn((service as any).findAllData, 'findAll').and.callThrough(); + spyOn((service as any), 'findById').and.callThrough(); }); describe('getTopics', () => { it('should call findListByHref', (done) => { service.getTopics().subscribe( (res) => { - expect((service as any).findListByHref).toHaveBeenCalledWith(endpointURL, {}, true, true); + expect((service as any).findAllData.findAll).toHaveBeenCalledWith({}, true, true); } ); done(); @@ -107,7 +107,7 @@ describe('QualityAssuranceTopicRestService', () => { it('should call findByHref', (done) => { service.getTopic(qualityAssuranceTopicObjectMorePid.id).subscribe( (res) => { - expect((service as any).findByHref).toHaveBeenCalledWith(endpointURL + '/' + qualityAssuranceTopicObjectMorePid.id, true, true); + expect((service as any).findById).toHaveBeenCalledWith(qualityAssuranceTopicObjectMorePid.id, true, true); } ); done(); diff --git a/src/app/core/suggestion-notifications/qa/topics/quality-assurance-topic-rest.service.ts b/src/app/core/suggestion-notifications/qa/topics/quality-assurance-topic-data.service.ts similarity index 53% rename from src/app/core/suggestion-notifications/qa/topics/quality-assurance-topic-rest.service.ts rename to src/app/core/suggestion-notifications/qa/topics/quality-assurance-topic-data.service.ts index 2ab715bbbe..2bf5195bf1 100644 --- a/src/app/core/suggestion-notifications/qa/topics/quality-assurance-topic-rest.service.ts +++ b/src/app/core/suggestion-notifications/qa/topics/quality-assurance-topic-data.service.ts @@ -1,7 +1,6 @@ import { Injectable } from '@angular/core'; import { Observable } from 'rxjs'; -import { mergeMap, take } from 'rxjs/operators'; import { HALEndpointService } from '../../../shared/hal-endpoint.service'; import { NotificationsService } from '../../../../shared/notifications/notifications.service'; @@ -16,13 +15,16 @@ import { FindListOptions } from '../../../data/find-list-options.model'; import { IdentifiableDataService } from '../../../data/base/identifiable-data.service'; import { dataService } from '../../../data/base/data-service.decorator'; import { QUALITY_ASSURANCE_TOPIC_OBJECT } from '../models/quality-assurance-topic-object.resource-type'; +import { FindAllData, FindAllDataImpl } from '../../../data/base/find-all-data'; /** * The service handling all Quality Assurance topic REST requests. */ @Injectable() @dataService(QUALITY_ASSURANCE_TOPIC_OBJECT) -export class QualityAssuranceTopicRestService extends IdentifiableDataService { +export class QualityAssuranceTopicDataService extends IdentifiableDataService { + + private findAllData: FindAllData; /** * Initialize service variables @@ -40,23 +42,24 @@ export class QualityAssuranceTopicRestService extends IdentifiableDataService>> * The list of Quality Assurance topics. */ - public getTopics(options: FindListOptions = {}, ...linksToFollow: FollowLinkConfig[]): Observable>> { - return this.getBrowseEndpoint(options).pipe( - take(1), - mergeMap((href: string) => this.findListByHref(href, options, true, true, ...linksToFollow)), - ); + public getTopics(options: FindListOptions = {}, useCachedVersionIfAvailable = true, reRequestOnStale = true, ...linksToFollow: FollowLinkConfig[]): Observable>> { + return this.findAllData.findAll(options, useCachedVersionIfAvailable, reRequestOnStale, ...linksToFollow); } /** @@ -69,18 +72,17 @@ export class QualityAssuranceTopicRestService extends IdentifiableDataService> * The Quality Assurance topic. */ - public getTopic(id: string, ...linksToFollow: FollowLinkConfig[]): Observable> { - const options = {}; - return this.getBrowseEndpoint(options).pipe( - take(1), - mergeMap((href: string) => this.findByHref(href + '/' + id, true, true, ...linksToFollow)) - ); + public getTopic(id: string, useCachedVersionIfAvailable = true, reRequestOnStale = true, ...linksToFollow: FollowLinkConfig[]): Observable> { + return this.findById(id, useCachedVersionIfAvailable, reRequestOnStale, ...linksToFollow); } } diff --git a/src/app/shared/mocks/notifications.mock.ts b/src/app/shared/mocks/notifications.mock.ts index bbdf60c083..dc1c98c7b9 100644 --- a/src/app/shared/mocks/notifications.mock.ts +++ b/src/app/shared/mocks/notifications.mock.ts @@ -1,9 +1,17 @@ import { of as observableOf } from 'rxjs'; import { ResourceType } from '../../core/shared/resource-type'; -import { QualityAssuranceTopicObject } from '../../core/suggestion-notifications/qa/models/quality-assurance-topic.model'; -import { QualityAssuranceEventObject } from '../../core/suggestion-notifications/qa/models/quality-assurance-event.model'; -import { QualityAssuranceTopicRestService } from '../../core/suggestion-notifications/qa/topics/quality-assurance-topic-rest.service'; -import { QualityAssuranceEventRestService } from '../../core/suggestion-notifications/qa/events/quality-assurance-event-rest.service'; +import { + QualityAssuranceTopicObject +} from '../../core/suggestion-notifications/qa/models/quality-assurance-topic.model'; +import { + QualityAssuranceEventObject +} from '../../core/suggestion-notifications/qa/models/quality-assurance-event.model'; +import { + QualityAssuranceTopicDataService +} from '../../core/suggestion-notifications/qa/topics/quality-assurance-topic-data.service'; +import { + QualityAssuranceEventDataService +} from '../../core/suggestion-notifications/qa/events/quality-assurance-event-data.service'; import { DSpaceObject } from '../../core/shared/dspace-object.model'; import { Item } from '../../core/shared/item.model'; import { @@ -12,7 +20,9 @@ import { createSuccessfulRemoteDataObject$ } from '../remote-data.utils'; import { SearchResult } from '../search/models/search-result.model'; -import { QualityAssuranceSourceObject } from '../../core/suggestion-notifications/qa/models/quality-assurance-source.model'; +import { + QualityAssuranceSourceObject +} from '../../core/suggestion-notifications/qa/models/quality-assurance-source.model'; // REST Mock --------------------------------------------------------------------- // ------------------------------------------------------------------------------- @@ -1814,30 +1824,30 @@ export function getMockNotificationsStateService(): any { } /** - * Mock for [[QualityAssuranceSourceRestService]] + * Mock for [[QualityAssuranceSourceDataService]] */ - export function getMockQualityAssuranceSourceRestService(): QualityAssuranceTopicRestService { - return jasmine.createSpyObj('QualityAssuranceSourceRestService', { + export function getMockQualityAssuranceSourceRestService(): QualityAssuranceTopicDataService { + return jasmine.createSpyObj('QualityAssuranceSourceDataService', { getSources: jasmine.createSpy('getSources'), getSource: jasmine.createSpy('getSource'), }); } /** - * Mock for [[QualityAssuranceTopicRestService]] + * Mock for [[QualityAssuranceTopicDataService]] */ -export function getMockQualityAssuranceTopicRestService(): QualityAssuranceTopicRestService { - return jasmine.createSpyObj('QualityAssuranceTopicRestService', { +export function getMockQualityAssuranceTopicRestService(): QualityAssuranceTopicDataService { + return jasmine.createSpyObj('QualityAssuranceTopicDataService', { getTopics: jasmine.createSpy('getTopics'), getTopic: jasmine.createSpy('getTopic'), }); } /** - * Mock for [[QualityAssuranceEventRestService]] + * Mock for [[QualityAssuranceEventDataService]] */ -export function getMockQualityAssuranceEventRestService(): QualityAssuranceEventRestService { - return jasmine.createSpyObj('QualityAssuranceEventRestService', { +export function getMockQualityAssuranceEventRestService(): QualityAssuranceEventDataService { + return jasmine.createSpyObj('QualityAssuranceEventDataService', { getEventsByTopic: jasmine.createSpy('getEventsByTopic'), getEvent: jasmine.createSpy('getEvent'), patchEvent: jasmine.createSpy('patchEvent'), @@ -1848,7 +1858,7 @@ export function getMockQualityAssuranceEventRestService(): QualityAssuranceEvent } /** - * Mock for [[QualityAssuranceEventRestService]] + * Mock for [[QualityAssuranceEventDataService]] */ export function getMockSuggestionsService(): any { return jasmine.createSpyObj('SuggestionsService', { diff --git a/src/app/suggestion-notifications/qa/events/quality-assurance-events.component.spec.ts b/src/app/suggestion-notifications/qa/events/quality-assurance-events.component.spec.ts index f0109f5f66..04ece87fbb 100644 --- a/src/app/suggestion-notifications/qa/events/quality-assurance-events.component.spec.ts +++ b/src/app/suggestion-notifications/qa/events/quality-assurance-events.component.spec.ts @@ -6,8 +6,8 @@ import { TranslateModule, TranslateService } from '@ngx-translate/core'; import { NgbModal } from '@ng-bootstrap/ng-bootstrap'; import { of as observableOf } from 'rxjs'; import { - QualityAssuranceEventRestService -} from '../../../core/suggestion-notifications/qa/events/quality-assurance-event-rest.service'; + QualityAssuranceEventDataService +} from '../../../core/suggestion-notifications/qa/events/quality-assurance-event-data.service'; import { QualityAssuranceEventsComponent } from './quality-assurance-events.component'; import { getMockQualityAssuranceEventRestService, @@ -113,7 +113,7 @@ describe('QualityAssuranceEventsComponent test suite', () => { ], providers: [ { provide: ActivatedRoute, useValue: new ActivatedRouteStub(activatedRouteParamsMap, activatedRouteParams) }, - { provide: QualityAssuranceEventRestService, useValue: qualityAssuranceEventRestServiceStub }, + { provide: QualityAssuranceEventDataService, useValue: qualityAssuranceEventRestServiceStub }, { provide: NgbModal, useValue: modalStub }, { provide: NotificationsService, useValue: new NotificationsServiceStub() }, { provide: TranslateService, useValue: getMockTranslateService() }, diff --git a/src/app/suggestion-notifications/qa/events/quality-assurance-events.component.ts b/src/app/suggestion-notifications/qa/events/quality-assurance-events.component.ts index f78798ac25..e34c121f35 100644 --- a/src/app/suggestion-notifications/qa/events/quality-assurance-events.component.ts +++ b/src/app/suggestion-notifications/qa/events/quality-assurance-events.component.ts @@ -14,8 +14,8 @@ import { QualityAssuranceEventObject } from '../../../core/suggestion-notifications/qa/models/quality-assurance-event.model'; import { - QualityAssuranceEventRestService -} from '../../../core/suggestion-notifications/qa/events/quality-assurance-event-rest.service'; + QualityAssuranceEventDataService +} from '../../../core/suggestion-notifications/qa/events/quality-assurance-event-data.service'; import { PaginationComponentOptions } from '../../../shared/pagination/pagination-component-options.model'; import { Metadata } from '../../../core/shared/metadata.utils'; import { followLink } from '../../../shared/utils/follow-link-config.model'; @@ -110,7 +110,7 @@ export class QualityAssuranceEventsComponent implements OnInit, OnDestroy { * @param {ActivatedRoute} activatedRoute * @param {NgbModal} modalService * @param {NotificationsService} notificationsService - * @param {QualityAssuranceEventRestService} qualityAssuranceEventRestService + * @param {QualityAssuranceEventDataService} qualityAssuranceEventRestService * @param {PaginationService} paginationService * @param {TranslateService} translateService */ @@ -118,7 +118,7 @@ export class QualityAssuranceEventsComponent implements OnInit, OnDestroy { private activatedRoute: ActivatedRoute, private modalService: NgbModal, private notificationsService: NotificationsService, - private qualityAssuranceEventRestService: QualityAssuranceEventRestService, + private qualityAssuranceEventRestService: QualityAssuranceEventDataService, private paginationService: PaginationService, private translateService: TranslateService ) { diff --git a/src/app/suggestion-notifications/qa/source/quality-assurance-source.effects.ts b/src/app/suggestion-notifications/qa/source/quality-assurance-source.effects.ts index b1514171aa..fd78911ab4 100644 --- a/src/app/suggestion-notifications/qa/source/quality-assurance-source.effects.ts +++ b/src/app/suggestion-notifications/qa/source/quality-assurance-source.effects.ts @@ -19,8 +19,8 @@ import { PaginatedList } from '../../../core/data/paginated-list.model'; import { QualityAssuranceSourceService } from './quality-assurance-source.service'; import { NotificationsService } from '../../../shared/notifications/notifications.service'; import { - QualityAssuranceSourceRestService -} from '../../../core/suggestion-notifications/qa/source/quality-assurance-source-rest.service'; + QualityAssuranceSourceDataService +} from '../../../core/suggestion-notifications/qa/source/quality-assurance-source-data.service'; /** * Provides effect methods for the Quality Assurance source actions. @@ -79,7 +79,7 @@ export class QualityAssuranceSourceEffects { * @param {TranslateService} translate * @param {NotificationsService} notificationsService * @param {QualityAssuranceSourceService} qualityAssuranceSourceService - * @param {QualityAssuranceSourceRestService} qualityAssuranceSourceDataService + * @param {QualityAssuranceSourceDataService} qualityAssuranceSourceDataService */ constructor( private actions$: Actions, @@ -87,7 +87,7 @@ export class QualityAssuranceSourceEffects { private translate: TranslateService, private notificationsService: NotificationsService, private qualityAssuranceSourceService: QualityAssuranceSourceService, - private qualityAssuranceSourceDataService: QualityAssuranceSourceRestService + private qualityAssuranceSourceDataService: QualityAssuranceSourceDataService ) { } } diff --git a/src/app/suggestion-notifications/qa/source/quality-assurance-source.service.spec.ts b/src/app/suggestion-notifications/qa/source/quality-assurance-source.service.spec.ts index 355de6e616..745a2baef7 100644 --- a/src/app/suggestion-notifications/qa/source/quality-assurance-source.service.spec.ts +++ b/src/app/suggestion-notifications/qa/source/quality-assurance-source.service.spec.ts @@ -12,13 +12,13 @@ import { createSuccessfulRemoteDataObject } from '../../../shared/remote-data.ut import { cold } from 'jasmine-marbles'; import { buildPaginatedList } from '../../../core/data/paginated-list.model'; import { - QualityAssuranceSourceRestService -} from '../../../core/suggestion-notifications/qa/source/quality-assurance-source-rest.service'; + QualityAssuranceSourceDataService +} from '../../../core/suggestion-notifications/qa/source/quality-assurance-source-data.service'; import { FindListOptions } from '../../../core/data/find-list-options.model'; describe('QualityAssuranceSourceService', () => { let service: QualityAssuranceSourceService; - let restService: QualityAssuranceSourceRestService; + let restService: QualityAssuranceSourceDataService; let serviceAsAny: any; let restServiceAsAny: any; @@ -32,14 +32,14 @@ describe('QualityAssuranceSourceService', () => { beforeEach(async () => { TestBed.configureTestingModule({ providers: [ - { provide: QualityAssuranceSourceRestService, useClass: getMockQualityAssuranceSourceRestService }, + { provide: QualityAssuranceSourceDataService, useClass: getMockQualityAssuranceSourceRestService }, { provide: QualityAssuranceSourceService, useValue: service } ] }).compileComponents(); }); beforeEach(() => { - restService = TestBed.get(QualityAssuranceSourceRestService); + restService = TestBed.inject(QualityAssuranceSourceDataService); restServiceAsAny = restService; restServiceAsAny.getSources.and.returnValue(observableOf(paginatedListRD)); service = new QualityAssuranceSourceService(restService); diff --git a/src/app/suggestion-notifications/qa/source/quality-assurance-source.service.ts b/src/app/suggestion-notifications/qa/source/quality-assurance-source.service.ts index a0556ece8c..5c16fb1a03 100644 --- a/src/app/suggestion-notifications/qa/source/quality-assurance-source.service.ts +++ b/src/app/suggestion-notifications/qa/source/quality-assurance-source.service.ts @@ -4,8 +4,8 @@ import { Observable } from 'rxjs'; import { map } from 'rxjs/operators'; import { - QualityAssuranceSourceRestService -} from '../../../core/suggestion-notifications/qa/source/quality-assurance-source-rest.service'; + QualityAssuranceSourceDataService +} from '../../../core/suggestion-notifications/qa/source/quality-assurance-source-data.service'; import { SortDirection, SortOptions } from '../../../core/cache/models/sort-options.model'; import { RemoteData } from '../../../core/data/remote-data'; import { PaginatedList } from '../../../core/data/paginated-list.model'; @@ -23,10 +23,10 @@ export class QualityAssuranceSourceService { /** * Initialize the service variables. - * @param {QualityAssuranceSourceRestService} qualityAssuranceSourceRestService + * @param {QualityAssuranceSourceDataService} qualityAssuranceSourceRestService */ constructor( - private qualityAssuranceSourceRestService: QualityAssuranceSourceRestService + private qualityAssuranceSourceRestService: QualityAssuranceSourceDataService ) { } diff --git a/src/app/suggestion-notifications/qa/topics/quality-assurance-topics.effects.ts b/src/app/suggestion-notifications/qa/topics/quality-assurance-topics.effects.ts index 11d7e11555..13e3670000 100644 --- a/src/app/suggestion-notifications/qa/topics/quality-assurance-topics.effects.ts +++ b/src/app/suggestion-notifications/qa/topics/quality-assurance-topics.effects.ts @@ -19,8 +19,8 @@ import { PaginatedList } from '../../../core/data/paginated-list.model'; import { QualityAssuranceTopicsService } from './quality-assurance-topics.service'; import { NotificationsService } from '../../../shared/notifications/notifications.service'; import { - QualityAssuranceTopicRestService -} from '../../../core/suggestion-notifications/qa/topics/quality-assurance-topic-rest.service'; + QualityAssuranceTopicDataService +} from '../../../core/suggestion-notifications/qa/topics/quality-assurance-topic-data.service'; /** * Provides effect methods for the Quality Assurance topics actions. @@ -79,7 +79,7 @@ export class QualityAssuranceTopicsEffects { * @param {TranslateService} translate * @param {NotificationsService} notificationsService * @param {QualityAssuranceTopicsService} qualityAssuranceTopicService - * @param {QualityAssuranceTopicRestService} qualityAssuranceTopicDataService + * @param {QualityAssuranceTopicDataService} qualityAssuranceTopicDataService */ constructor( private actions$: Actions, @@ -87,6 +87,6 @@ export class QualityAssuranceTopicsEffects { private translate: TranslateService, private notificationsService: NotificationsService, private qualityAssuranceTopicService: QualityAssuranceTopicsService, - private qualityAssuranceTopicDataService: QualityAssuranceTopicRestService + private qualityAssuranceTopicDataService: QualityAssuranceTopicDataService ) { } } diff --git a/src/app/suggestion-notifications/qa/topics/quality-assurance-topics.service.spec.ts b/src/app/suggestion-notifications/qa/topics/quality-assurance-topics.service.spec.ts index ba1399fcd4..1e4e3fcffd 100644 --- a/src/app/suggestion-notifications/qa/topics/quality-assurance-topics.service.spec.ts +++ b/src/app/suggestion-notifications/qa/topics/quality-assurance-topics.service.spec.ts @@ -2,7 +2,9 @@ import { TestBed } from '@angular/core/testing'; import { of as observableOf } from 'rxjs'; import { QualityAssuranceTopicsService } from './quality-assurance-topics.service'; import { SortDirection, SortOptions } from '../../../core/cache/models/sort-options.model'; -import { QualityAssuranceTopicRestService } from '../../../core/suggestion-notifications/qa/topics/quality-assurance-topic-rest.service'; +import { + QualityAssuranceTopicDataService +} from '../../../core/suggestion-notifications/qa/topics/quality-assurance-topic-data.service'; import { PageInfo } from '../../../core/shared/page-info.model'; import { getMockQualityAssuranceTopicRestService, @@ -13,11 +15,11 @@ import { createSuccessfulRemoteDataObject } from '../../../shared/remote-data.ut import { cold } from 'jasmine-marbles'; import { buildPaginatedList } from '../../../core/data/paginated-list.model'; import { RequestParam } from '../../../core/cache/models/request-param.model'; -import {FindListOptions} from '../../../core/data/find-list-options.model'; +import { FindListOptions } from '../../../core/data/find-list-options.model'; describe('QualityAssuranceTopicsService', () => { let service: QualityAssuranceTopicsService; - let restService: QualityAssuranceTopicRestService; + let restService: QualityAssuranceTopicDataService; let serviceAsAny: any; let restServiceAsAny: any; @@ -31,14 +33,14 @@ describe('QualityAssuranceTopicsService', () => { beforeEach(async () => { TestBed.configureTestingModule({ providers: [ - { provide: QualityAssuranceTopicRestService, useClass: getMockQualityAssuranceTopicRestService }, + { provide: QualityAssuranceTopicDataService, useClass: getMockQualityAssuranceTopicRestService }, { provide: QualityAssuranceTopicsService, useValue: service } ] }).compileComponents(); }); beforeEach(() => { - restService = TestBed.get(QualityAssuranceTopicRestService); + restService = TestBed.inject(QualityAssuranceTopicDataService); restServiceAsAny = restService; restServiceAsAny.getTopics.and.returnValue(observableOf(paginatedListRD)); service = new QualityAssuranceTopicsService(restService); diff --git a/src/app/suggestion-notifications/qa/topics/quality-assurance-topics.service.ts b/src/app/suggestion-notifications/qa/topics/quality-assurance-topics.service.ts index 968e21fb95..6820791dff 100644 --- a/src/app/suggestion-notifications/qa/topics/quality-assurance-topics.service.ts +++ b/src/app/suggestion-notifications/qa/topics/quality-assurance-topics.service.ts @@ -2,8 +2,8 @@ import { Injectable } from '@angular/core'; import { Observable } from 'rxjs'; import { map } from 'rxjs/operators'; import { - QualityAssuranceTopicRestService -} from '../../../core/suggestion-notifications/qa/topics/quality-assurance-topic-rest.service'; + QualityAssuranceTopicDataService +} from '../../../core/suggestion-notifications/qa/topics/quality-assurance-topic-data.service'; import { SortDirection, SortOptions } from '../../../core/cache/models/sort-options.model'; import { RemoteData } from '../../../core/data/remote-data'; import { PaginatedList } from '../../../core/data/paginated-list.model'; @@ -22,10 +22,10 @@ export class QualityAssuranceTopicsService { /** * Initialize the service variables. - * @param {QualityAssuranceTopicRestService} qualityAssuranceTopicRestService + * @param {QualityAssuranceTopicDataService} qualityAssuranceTopicRestService */ constructor( - private qualityAssuranceTopicRestService: QualityAssuranceTopicRestService + private qualityAssuranceTopicRestService: QualityAssuranceTopicDataService ) { } /** diff --git a/src/app/suggestion-notifications/suggestion-notifications.module.ts b/src/app/suggestion-notifications/suggestion-notifications.module.ts index e7e2272fff..eac527d672 100644 --- a/src/app/suggestion-notifications/suggestion-notifications.module.ts +++ b/src/app/suggestion-notifications/suggestion-notifications.module.ts @@ -13,19 +13,19 @@ import { suggestionNotificationsReducers, SuggestionNotificationsState } from '. import { suggestionNotificationsEffects } from './suggestion-notifications-effects'; import { QualityAssuranceTopicsService } from './qa/topics/quality-assurance-topics.service'; import { - QualityAssuranceTopicRestService -} from '../core/suggestion-notifications/qa/topics/quality-assurance-topic-rest.service'; + QualityAssuranceTopicDataService +} from '../core/suggestion-notifications/qa/topics/quality-assurance-topic-data.service'; import { - QualityAssuranceEventRestService -} from '../core/suggestion-notifications/qa/events/quality-assurance-event-rest.service'; + QualityAssuranceEventDataService +} from '../core/suggestion-notifications/qa/events/quality-assurance-event-data.service'; import { ProjectEntryImportModalComponent } from './qa/project-entry-import-modal/project-entry-import-modal.component'; import { TranslateModule } from '@ngx-translate/core'; import { SearchModule } from '../shared/search/search.module'; import { QualityAssuranceSourceComponent } from './qa/source/quality-assurance-source.component'; import { QualityAssuranceSourceService } from './qa/source/quality-assurance-source.service'; import { - QualityAssuranceSourceRestService -} from '../core/suggestion-notifications/qa/source/quality-assurance-source-rest.service'; + QualityAssuranceSourceDataService +} from '../core/suggestion-notifications/qa/source/quality-assurance-source-data.service'; const MODULES = [ CommonModule, @@ -53,9 +53,9 @@ const PROVIDERS = [ SuggestionNotificationsStateService, QualityAssuranceTopicsService, QualityAssuranceSourceService, - QualityAssuranceTopicRestService, - QualityAssuranceSourceRestService, - QualityAssuranceEventRestService + QualityAssuranceTopicDataService, + QualityAssuranceSourceDataService, + QualityAssuranceEventDataService ]; @NgModule({ From cceea734b3f13ec94b6ee21d0da8550f68557d16 Mon Sep 17 00:00:00 2001 From: Yana De Pauw Date: Mon, 12 Dec 2022 11:43:56 +0100 Subject: [PATCH 030/409] 97248: Remove hardcoded 'default' configuration --- src/app/shared/search/search.component.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/shared/search/search.component.ts b/src/app/shared/search/search.component.ts index c017a5065b..bc6b10dc8d 100644 --- a/src/app/shared/search/search.component.ts +++ b/src/app/shared/search/search.component.ts @@ -60,7 +60,7 @@ export class SearchComponent implements OnInit { * The configuration to use for the search options * If empty, 'default' is used */ - @Input() configuration = 'default'; + @Input() configuration; /** * The actual query for the fixed filter. From 9979d8664d4562e5f79c4cabec711ff66f8f02e0 Mon Sep 17 00:00:00 2001 From: lotte Date: Wed, 11 Jan 2023 10:27:30 +0100 Subject: [PATCH 031/409] Made SearchFiltersComponent themeable --- .../themed-search-filters.component.ts | 35 +++++++++++++++++++ .../search-sidebar.component.html | 4 +-- src/app/shared/search/search.module.ts | 4 ++- .../search-filters.component.html | 1 + .../search-filters.component.scss | 0 .../search-filters.component.ts | 32 +++++++++++++++++ src/themes/custom/theme.module.ts | 4 ++- 7 files changed, 76 insertions(+), 4 deletions(-) create mode 100644 src/app/shared/search/search-filters/themed-search-filters.component.ts create mode 100644 src/themes/custom/app/shared/search/search-filters/search-filters.component.html create mode 100644 src/themes/custom/app/shared/search/search-filters/search-filters.component.scss create mode 100644 src/themes/custom/app/shared/search/search-filters/search-filters.component.ts diff --git a/src/app/shared/search/search-filters/themed-search-filters.component.ts b/src/app/shared/search/search-filters/themed-search-filters.component.ts new file mode 100644 index 0000000000..7bf2d3d0ac --- /dev/null +++ b/src/app/shared/search/search-filters/themed-search-filters.component.ts @@ -0,0 +1,35 @@ +import { Component, Input } from '@angular/core'; +import { ThemedComponent } from '../../theme-support/themed.component'; +import { SearchFiltersComponent } from './search-filters.component'; +import { Observable } from 'rxjs/internal/Observable'; + +/** + * Themed wrapper for SearchFiltersComponent + */ +@Component({ + selector: 'ds-themed-search-filters', + styleUrls: [], + templateUrl: '../../theme-support/themed.component.html', +}) +export class ThemedSearchFiltersComponent extends ThemedComponent { + + @Input() currentConfiguration; + @Input() currentScope: string; + @Input() inPlaceSearch; + @Input() refreshFilters: Observable; + + protected inAndOutputNames: (keyof SearchFiltersComponent & keyof this)[] = [ + 'currentConfiguration', 'currentScope', 'inPlaceSearch', 'refreshFilters']; + + protected getComponentName(): string { + return 'SearchFiltersComponent'; + } + + protected importThemedComponent(themeName: string): Promise { + return import(`../../../../themes/${themeName}/app/shared/search/search-filters/search-filters.component`); + } + + protected importUnthemedComponent(): Promise { + return import('./search-filters.component'); + } +} diff --git a/src/app/shared/search/search-sidebar/search-sidebar.component.html b/src/app/shared/search/search-sidebar/search-sidebar.component.html index e17fe941ba..de89001999 100644 --- a/src/app/shared/search/search-sidebar/search-sidebar.component.html +++ b/src/app/shared/search/search-sidebar/search-sidebar.component.html @@ -17,10 +17,10 @@ [defaultConfiguration]="configuration" [inPlaceSearch]="inPlaceSearch" (changeConfiguration)="changeConfiguration.emit($event)"> - + [inPlaceSearch]="inPlaceSearch">
diff --git a/src/app/shared/search/search.module.ts b/src/app/shared/search/search.module.ts index 797d35d88f..6bbe4baab1 100644 --- a/src/app/shared/search/search.module.ts +++ b/src/app/shared/search/search.module.ts @@ -29,6 +29,7 @@ import { SharedModule } from '../shared.module'; import { SearchResultsComponent } from './search-results/search-results.component'; import { SearchComponent } from './search.component'; import { ThemedSearchComponent } from './themed-search.component'; +import { ThemedSearchFiltersComponent } from './search-filters/themed-search-filters.component'; const COMPONENTS = [ SearchComponent, @@ -52,7 +53,8 @@ const COMPONENTS = [ SearchAuthorityFilterComponent, SearchSwitchConfigurationComponent, ConfigurationSearchPageComponent, - ThemedConfigurationSearchPageComponent + ThemedConfigurationSearchPageComponent, + ThemedSearchFiltersComponent, ]; const ENTRY_COMPONENTS = [ diff --git a/src/themes/custom/app/shared/search/search-filters/search-filters.component.html b/src/themes/custom/app/shared/search/search-filters/search-filters.component.html new file mode 100644 index 0000000000..2a02d41ce2 --- /dev/null +++ b/src/themes/custom/app/shared/search/search-filters/search-filters.component.html @@ -0,0 +1 @@ +TEST diff --git a/src/themes/custom/app/shared/search/search-filters/search-filters.component.scss b/src/themes/custom/app/shared/search/search-filters/search-filters.component.scss new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/themes/custom/app/shared/search/search-filters/search-filters.component.ts b/src/themes/custom/app/shared/search/search-filters/search-filters.component.ts new file mode 100644 index 0000000000..ad3ec93383 --- /dev/null +++ b/src/themes/custom/app/shared/search/search-filters/search-filters.component.ts @@ -0,0 +1,32 @@ +/** + * The contents of this file are subject to the license and copyright + * detailed in the LICENSE_ATMIRE and NOTICE_ATMIRE files at the root of the source + * tree and available online at + * + * https://www.atmire.com/software-license/ + */ +import { Component } from '@angular/core'; +import { + SearchFiltersComponent as BaseComponent, +} from '../../../../../../app/shared/search/search-filters/search-filters.component'; +import { SEARCH_CONFIG_SERVICE } from '../../../../../../app/my-dspace-page/my-dspace-page.component'; +import { SearchConfigurationService } from '../../../../../../app/core/shared/search/search-configuration.service'; + + +@Component({ + selector: 'ds-search-filters', + // styleUrls: ['./search-filters.component.scss'], + styleUrls: ['../../../../../../app/shared/search/search-filters/search-filters.component.scss'], + // templateUrl: './search-filters.component.html', + templateUrl: '../../../../../../app/shared/search/search-filters/search-filters.component.html', + providers: [ + { + provide: SEARCH_CONFIG_SERVICE, + useClass: SearchConfigurationService + } + ] + +}) + +export class SearchFiltersComponent extends BaseComponent { +} diff --git a/src/themes/custom/theme.module.ts b/src/themes/custom/theme.module.ts index e2e97b9087..fba0ce894a 100644 --- a/src/themes/custom/theme.module.ts +++ b/src/themes/custom/theme.module.ts @@ -84,6 +84,7 @@ import { SearchModule } from '../../app/shared/search/search.module'; import { ResourcePoliciesModule } from '../../app/shared/resource-policies/resource-policies.module'; import { ComcolModule } from '../../app/shared/comcol/comcol.module'; import { FeedbackComponent } from './app/info/feedback/feedback.component'; +import { SearchFiltersComponent } from './app/shared/search/search-filters/search-filters.component'; const DECLARATIONS = [ FileSectionComponent, @@ -126,7 +127,8 @@ const DECLARATIONS = [ NavbarComponent, HeaderNavbarWrapperComponent, BreadcrumbsComponent, - FeedbackComponent + FeedbackComponent, + SearchFiltersComponent, ]; @NgModule({ From 9fdac08c678b5f19e0521ffc6f55ccc26091c504 Mon Sep 17 00:00:00 2001 From: lotte Date: Wed, 11 Jan 2023 10:53:32 +0100 Subject: [PATCH 032/409] removed unnecessary text in html file --- .../shared/search/search-filters/search-filters.component.html | 1 - 1 file changed, 1 deletion(-) diff --git a/src/themes/custom/app/shared/search/search-filters/search-filters.component.html b/src/themes/custom/app/shared/search/search-filters/search-filters.component.html index 2a02d41ce2..e69de29bb2 100644 --- a/src/themes/custom/app/shared/search/search-filters/search-filters.component.html +++ b/src/themes/custom/app/shared/search/search-filters/search-filters.component.html @@ -1 +0,0 @@ -TEST From 7926277acdf4389244b0447dc7348a7d668ab772 Mon Sep 17 00:00:00 2001 From: lotte Date: Wed, 11 Jan 2023 11:24:42 +0100 Subject: [PATCH 033/409] added new input to ThemedSearchFiltersComponent --- .../search/search-filters/themed-search-filters.component.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/app/shared/search/search-filters/themed-search-filters.component.ts b/src/app/shared/search/search-filters/themed-search-filters.component.ts index 7bf2d3d0ac..a9a9c10e51 100644 --- a/src/app/shared/search/search-filters/themed-search-filters.component.ts +++ b/src/app/shared/search/search-filters/themed-search-filters.component.ts @@ -2,6 +2,8 @@ import { Component, Input } from '@angular/core'; import { ThemedComponent } from '../../theme-support/themed.component'; import { SearchFiltersComponent } from './search-filters.component'; import { Observable } from 'rxjs/internal/Observable'; +import { RemoteData } from '../../../core/data/remote-data'; +import { SearchFilterConfig } from '../models/search-filter-config.model'; /** * Themed wrapper for SearchFiltersComponent @@ -17,9 +19,10 @@ export class ThemedSearchFiltersComponent extends ThemedComponent; + @Input() filters: Observable>; protected inAndOutputNames: (keyof SearchFiltersComponent & keyof this)[] = [ - 'currentConfiguration', 'currentScope', 'inPlaceSearch', 'refreshFilters']; + 'filters', 'currentConfiguration', 'currentScope', 'inPlaceSearch', 'refreshFilters']; protected getComponentName(): string { return 'SearchFiltersComponent'; From c3d71cbdd615ff707482852fd3d76f688950e1f1 Mon Sep 17 00:00:00 2001 From: Kristof De Langhe Date: Wed, 11 Jan 2023 14:18:20 +0100 Subject: [PATCH 034/409] 98422: Themed ItemStatusComponent and EditBitstreamPageComponent --- .../bitstream-page-routing.module.ts | 4 ++-- .../bitstream-page/bitstream-page.module.ts | 4 +++- .../themed-edit-bitstream-page.component.ts | 22 ++++++++++++++++++ .../edit-item-page/edit-item-page.module.ts | 2 ++ .../edit-item-page.routing.module.ts | 4 ++-- .../themed-item-status.component.ts | 23 +++++++++++++++++++ .../edit-bitstream-page.component.html | 0 .../edit-bitstream-page.component.scss | 0 .../edit-bitstream-page.component.ts | 13 +++++++++++ .../item-status/item-status.component.html | 0 .../item-status/item-status.component.ts | 16 +++++++++++++ src/themes/custom/theme.module.ts | 6 ++++- 12 files changed, 88 insertions(+), 6 deletions(-) create mode 100644 src/app/bitstream-page/edit-bitstream-page/themed-edit-bitstream-page.component.ts create mode 100644 src/app/item-page/edit-item-page/item-status/themed-item-status.component.ts create mode 100644 src/themes/custom/app/bitstream-page/edit-bitstream-page/edit-bitstream-page.component.html create mode 100644 src/themes/custom/app/bitstream-page/edit-bitstream-page/edit-bitstream-page.component.scss create mode 100644 src/themes/custom/app/bitstream-page/edit-bitstream-page/edit-bitstream-page.component.ts create mode 100644 src/themes/custom/app/item-page/edit-item-page/item-status/item-status.component.html create mode 100644 src/themes/custom/app/item-page/edit-item-page/item-status/item-status.component.ts diff --git a/src/app/bitstream-page/bitstream-page-routing.module.ts b/src/app/bitstream-page/bitstream-page-routing.module.ts index 27b9db9a05..bab5e91467 100644 --- a/src/app/bitstream-page/bitstream-page-routing.module.ts +++ b/src/app/bitstream-page/bitstream-page-routing.module.ts @@ -1,6 +1,5 @@ import { NgModule } from '@angular/core'; import { RouterModule } from '@angular/router'; -import { EditBitstreamPageComponent } from './edit-bitstream-page/edit-bitstream-page.component'; import { AuthenticatedGuard } from '../core/auth/authenticated.guard'; import { BitstreamPageResolver } from './bitstream-page.resolver'; import { BitstreamDownloadPageComponent } from '../shared/bitstream-download-page/bitstream-download-page.component'; @@ -10,6 +9,7 @@ import { ResourcePolicyResolver } from '../shared/resource-policies/resolvers/re import { ResourcePolicyEditComponent } from '../shared/resource-policies/edit/resource-policy-edit.component'; import { BitstreamAuthorizationsComponent } from './bitstream-authorizations/bitstream-authorizations.component'; import { LegacyBitstreamUrlResolver } from './legacy-bitstream-url.resolver'; +import { ThemedEditBitstreamPageComponent } from './edit-bitstream-page/themed-edit-bitstream-page.component'; const EDIT_BITSTREAM_PATH = ':id/edit'; const EDIT_BITSTREAM_AUTHORIZATIONS_PATH = ':id/authorizations'; @@ -46,7 +46,7 @@ const EDIT_BITSTREAM_AUTHORIZATIONS_PATH = ':id/authorizations'; }, { path: EDIT_BITSTREAM_PATH, - component: EditBitstreamPageComponent, + component: ThemedEditBitstreamPageComponent, resolve: { bitstream: BitstreamPageResolver }, diff --git a/src/app/bitstream-page/bitstream-page.module.ts b/src/app/bitstream-page/bitstream-page.module.ts index d168a06db2..ea8ed510e1 100644 --- a/src/app/bitstream-page/bitstream-page.module.ts +++ b/src/app/bitstream-page/bitstream-page.module.ts @@ -6,6 +6,7 @@ import { BitstreamPageRoutingModule } from './bitstream-page-routing.module'; import { BitstreamAuthorizationsComponent } from './bitstream-authorizations/bitstream-authorizations.component'; import { FormModule } from '../shared/form/form.module'; import { ResourcePoliciesModule } from '../shared/resource-policies/resource-policies.module'; +import { ThemedEditBitstreamPageComponent } from './edit-bitstream-page/themed-edit-bitstream-page.component'; /** * This module handles all components that are necessary for Bitstream related pages @@ -20,7 +21,8 @@ import { ResourcePoliciesModule } from '../shared/resource-policies/resource-pol ], declarations: [ BitstreamAuthorizationsComponent, - EditBitstreamPageComponent + EditBitstreamPageComponent, + ThemedEditBitstreamPageComponent, ] }) export class BitstreamPageModule { diff --git a/src/app/bitstream-page/edit-bitstream-page/themed-edit-bitstream-page.component.ts b/src/app/bitstream-page/edit-bitstream-page/themed-edit-bitstream-page.component.ts new file mode 100644 index 0000000000..dcca28a495 --- /dev/null +++ b/src/app/bitstream-page/edit-bitstream-page/themed-edit-bitstream-page.component.ts @@ -0,0 +1,22 @@ +import { Component } from '@angular/core'; +import { EditBitstreamPageComponent } from './edit-bitstream-page.component'; +import { ThemedComponent } from '../../shared/theme-support/themed.component'; + +@Component({ + selector: 'ds-themed-edit-bitstream-page', + styleUrls: [], + templateUrl: '../../shared/theme-support/themed.component.html', +}) +export class ThemedEditBitstreamPageComponent extends ThemedComponent { + protected getComponentName(): string { + return 'EditBitstreamPageComponent'; + } + + protected importThemedComponent(themeName: string): Promise { + return import(`../../../themes/${themeName}/app/bitstream-page/edit-bitstream-page/edit-bitstream-page.component`); + } + + protected importUnthemedComponent(): Promise { + return import('./edit-bitstream-page.component'); + } +} diff --git a/src/app/item-page/edit-item-page/edit-item-page.module.ts b/src/app/item-page/edit-item-page/edit-item-page.module.ts index 97901bd7c8..e033919dba 100644 --- a/src/app/item-page/edit-item-page/edit-item-page.module.ts +++ b/src/app/item-page/edit-item-page/edit-item-page.module.ts @@ -35,6 +35,7 @@ import { ItemVersionHistoryComponent } from './item-version-history/item-version import { ItemAuthorizationsComponent } from './item-authorizations/item-authorizations.component'; import { ObjectValuesPipe } from '../../shared/utils/object-values-pipe'; import { ResourcePoliciesModule } from '../../shared/resource-policies/resource-policies.module'; +import { ThemedItemStatusComponent } from './item-status/themed-item-status.component'; /** @@ -61,6 +62,7 @@ import { ResourcePoliciesModule } from '../../shared/resource-policies/resource- ItemPublicComponent, ItemDeleteComponent, ItemStatusComponent, + ThemedItemStatusComponent, ItemMetadataComponent, ItemRelationshipsComponent, ItemBitstreamsComponent, diff --git a/src/app/item-page/edit-item-page/edit-item-page.routing.module.ts b/src/app/item-page/edit-item-page/edit-item-page.routing.module.ts index 2535e42216..6deffe47a8 100644 --- a/src/app/item-page/edit-item-page/edit-item-page.routing.module.ts +++ b/src/app/item-page/edit-item-page/edit-item-page.routing.module.ts @@ -6,7 +6,6 @@ import { ItemReinstateComponent } from './item-reinstate/item-reinstate.componen import { ItemPrivateComponent } from './item-private/item-private.component'; import { ItemPublicComponent } from './item-public/item-public.component'; import { ItemDeleteComponent } from './item-delete/item-delete.component'; -import { ItemStatusComponent } from './item-status/item-status.component'; import { ItemMetadataComponent } from './item-metadata/item-metadata.component'; import { ItemBitstreamsComponent } from './item-bitstreams/item-bitstreams.component'; import { ItemCollectionMapperComponent } from './item-collection-mapper/item-collection-mapper.component'; @@ -38,6 +37,7 @@ import { ItemPageBitstreamsGuard } from './item-page-bitstreams.guard'; import { ItemPageRelationshipsGuard } from './item-page-relationships.guard'; import { ItemPageVersionHistoryGuard } from './item-page-version-history.guard'; import { ItemPageCollectionMapperGuard } from './item-page-collection-mapper.guard'; +import { ThemedItemPageComponent } from '../simple/themed-item-page.component'; /** * Routing module that handles the routing for the Edit Item page administrator functionality @@ -63,7 +63,7 @@ import { ItemPageCollectionMapperGuard } from './item-page-collection-mapper.gua }, { path: 'status', - component: ItemStatusComponent, + component: ThemedItemPageComponent, data: { title: 'item.edit.tabs.status.title', showBreadcrumbs: true }, canActivate: [ItemPageStatusGuard] }, diff --git a/src/app/item-page/edit-item-page/item-status/themed-item-status.component.ts b/src/app/item-page/edit-item-page/item-status/themed-item-status.component.ts new file mode 100644 index 0000000000..eac5a53702 --- /dev/null +++ b/src/app/item-page/edit-item-page/item-status/themed-item-status.component.ts @@ -0,0 +1,23 @@ +import { Component } from '@angular/core'; +import { ThemedComponent } from '../../../shared/theme-support/themed.component'; +import { ItemStatusComponent } from './item-status.component'; + +@Component({ + selector: 'ds-themed-item-status', + styleUrls: [], + templateUrl: '../../../shared/theme-support/themed.component.html', +}) +export class ThemedItemStatusComponent extends ThemedComponent { + protected getComponentName(): string { + return 'ItemStatusComponent'; + } + + protected importThemedComponent(themeName: string): Promise { + return import(`../../../../themes/${themeName}/app/item-page/edit-item-page/item-status/item-status.component`); + } + + protected importUnthemedComponent(): Promise { + return import('./item-status.component'); + } + +} diff --git a/src/themes/custom/app/bitstream-page/edit-bitstream-page/edit-bitstream-page.component.html b/src/themes/custom/app/bitstream-page/edit-bitstream-page/edit-bitstream-page.component.html new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/themes/custom/app/bitstream-page/edit-bitstream-page/edit-bitstream-page.component.scss b/src/themes/custom/app/bitstream-page/edit-bitstream-page/edit-bitstream-page.component.scss new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/themes/custom/app/bitstream-page/edit-bitstream-page/edit-bitstream-page.component.ts b/src/themes/custom/app/bitstream-page/edit-bitstream-page/edit-bitstream-page.component.ts new file mode 100644 index 0000000000..f8ca14addb --- /dev/null +++ b/src/themes/custom/app/bitstream-page/edit-bitstream-page/edit-bitstream-page.component.ts @@ -0,0 +1,13 @@ +import { EditBitstreamPageComponent as BaseComponent } from '../../../../../app/bitstream-page/edit-bitstream-page/edit-bitstream-page.component'; +import { ChangeDetectionStrategy, Component } from '@angular/core'; + +@Component({ + selector: 'ds-edit-bitstream-page', + // styleUrls: ['./edit-bitstream-page.component.scss'], + styleUrls: ['../../../../../app/bitstream-page/edit-bitstream-page/edit-bitstream-page.component.scss'], + // templateUrl: './edit-bitstream-page.component.html', + templateUrl: '../../../../../app/bitstream-page/edit-bitstream-page/edit-bitstream-page.component.html', + changeDetection: ChangeDetectionStrategy.OnPush +}) +export class EditBitstreamPageComponent extends BaseComponent { +} diff --git a/src/themes/custom/app/item-page/edit-item-page/item-status/item-status.component.html b/src/themes/custom/app/item-page/edit-item-page/item-status/item-status.component.html new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/themes/custom/app/item-page/edit-item-page/item-status/item-status.component.ts b/src/themes/custom/app/item-page/edit-item-page/item-status/item-status.component.ts new file mode 100644 index 0000000000..95acec2275 --- /dev/null +++ b/src/themes/custom/app/item-page/edit-item-page/item-status/item-status.component.ts @@ -0,0 +1,16 @@ +import { ChangeDetectionStrategy, Component } from '@angular/core'; +import { fadeIn, fadeInOut } from '../../../../../../app/shared/animations/fade'; +import { ItemStatusComponent as BaseComponent } from '../../../../../../app/item-page/edit-item-page/item-status/item-status.component'; + +@Component({ + selector: 'ds-item-status', + // templateUrl: './item-status.component.html', + templateUrl: '../../../../../../app/item-page/edit-item-page/item-status/item-status.component.html', + changeDetection: ChangeDetectionStrategy.Default, + animations: [ + fadeIn, + fadeInOut + ] +}) +export class ItemStatusComponent extends BaseComponent { +} diff --git a/src/themes/custom/theme.module.ts b/src/themes/custom/theme.module.ts index e2e97b9087..ab69e86a8e 100644 --- a/src/themes/custom/theme.module.ts +++ b/src/themes/custom/theme.module.ts @@ -84,6 +84,8 @@ import { SearchModule } from '../../app/shared/search/search.module'; import { ResourcePoliciesModule } from '../../app/shared/resource-policies/resource-policies.module'; import { ComcolModule } from '../../app/shared/comcol/comcol.module'; import { FeedbackComponent } from './app/info/feedback/feedback.component'; +import { ItemStatusComponent } from './app/item-page/edit-item-page/item-status/item-status.component'; +import { EditBitstreamPageComponent } from './app/bitstream-page/edit-bitstream-page/edit-bitstream-page.component'; const DECLARATIONS = [ FileSectionComponent, @@ -126,7 +128,9 @@ const DECLARATIONS = [ NavbarComponent, HeaderNavbarWrapperComponent, BreadcrumbsComponent, - FeedbackComponent + FeedbackComponent, + ItemStatusComponent, + EditBitstreamPageComponent, ]; @NgModule({ From cb982d6552adbb676a7653984e82d4b2e928b1c8 Mon Sep 17 00:00:00 2001 From: lotte Date: Wed, 11 Jan 2023 14:46:37 +0100 Subject: [PATCH 035/409] Made SearchSidebarComponent themeable --- .../themed-search-sidebar.component.ts | 51 +++++++++++++++++++ src/app/shared/search/search.module.ts | 2 + .../search-sidebar.component.html | 0 .../search-sidebar.component.scss | 0 .../search-sidebar.component.ts | 32 ++++++++++++ src/themes/custom/theme.module.ts | 2 + 6 files changed, 87 insertions(+) create mode 100644 src/app/shared/search/search-sidebar/themed-search-sidebar.component.ts create mode 100644 src/themes/custom/app/shared/search/search-sidebar/search-sidebar.component.html create mode 100644 src/themes/custom/app/shared/search/search-sidebar/search-sidebar.component.scss create mode 100644 src/themes/custom/app/shared/search/search-sidebar/search-sidebar.component.ts diff --git a/src/app/shared/search/search-sidebar/themed-search-sidebar.component.ts b/src/app/shared/search/search-sidebar/themed-search-sidebar.component.ts new file mode 100644 index 0000000000..470c947162 --- /dev/null +++ b/src/app/shared/search/search-sidebar/themed-search-sidebar.component.ts @@ -0,0 +1,51 @@ +import { Component, EventEmitter, Input, Output } from '@angular/core'; +import { ThemedComponent } from '../../theme-support/themed.component'; +import { SearchSidebarComponent } from './search-sidebar.component'; +import { SearchConfigurationOption } from '../search-switch-configuration/search-configuration-option.model'; +import { SortOptions } from '../../../core/cache/models/sort-options.model'; +import { ViewMode } from '../../../core/shared/view-mode.model'; +import { PaginatedSearchOptions } from '../models/paginated-search-options.model'; +import { Observable } from 'rxjs'; + +/** + * Themed wrapper for SearchSidebarComponent + */ +@Component({ + selector: 'ds-themed-search-sidebar', + styleUrls: [], + templateUrl: '../../theme-support/themed.component.html', +}) +export class ThemedSearchSidebarComponent extends ThemedComponent { + + @Input() configuration; + @Input() configurationList: SearchConfigurationOption[]; + @Input() currentScope: string; + @Input() currentSortOption: SortOptions; + @Input() resultCount; + @Input() viewModeList: ViewMode[]; + @Input() showViewModes = true; + @Input() inPlaceSearch; + @Input() searchOptions: PaginatedSearchOptions; + @Input() sortOptionsList: SortOptions[]; + @Input() refreshFilters: Observable; + @Output() toggleSidebar = new EventEmitter(); + @Output() changeConfiguration: EventEmitter = new EventEmitter(); + @Output() changeViewMode: EventEmitter = new EventEmitter(); + + protected inAndOutputNames: (keyof SearchSidebarComponent & keyof this)[] = [ + 'configuration', 'configurationList', 'currentScope', 'currentSortOption', + 'resultCount', 'viewModeList', 'showViewModes', 'inPlaceSearch', + 'searchOptions', 'sortOptionsList', 'refreshFilters', 'toggleSidebar', 'changeConfiguration', 'changeViewMode']; + + protected getComponentName(): string { + return 'SearchSidebarComponent'; + } + + protected importThemedComponent(themeName: string): Promise { + return import(`../../../../themes/${themeName}/app/shared/search/search-sidebar/search-sidebar.component`); + } + + protected importUnthemedComponent(): Promise { + return import('./search-sidebar.component'); + } +} diff --git a/src/app/shared/search/search.module.ts b/src/app/shared/search/search.module.ts index 6bbe4baab1..be7fb0b044 100644 --- a/src/app/shared/search/search.module.ts +++ b/src/app/shared/search/search.module.ts @@ -30,6 +30,7 @@ import { SearchResultsComponent } from './search-results/search-results.componen import { SearchComponent } from './search.component'; import { ThemedSearchComponent } from './themed-search.component'; import { ThemedSearchFiltersComponent } from './search-filters/themed-search-filters.component'; +import { ThemedSearchSidebarComponent } from './search-sidebar/themed-search-sidebar.component'; const COMPONENTS = [ SearchComponent, @@ -55,6 +56,7 @@ const COMPONENTS = [ ConfigurationSearchPageComponent, ThemedConfigurationSearchPageComponent, ThemedSearchFiltersComponent, + ThemedSearchSidebarComponent, ]; const ENTRY_COMPONENTS = [ diff --git a/src/themes/custom/app/shared/search/search-sidebar/search-sidebar.component.html b/src/themes/custom/app/shared/search/search-sidebar/search-sidebar.component.html new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/themes/custom/app/shared/search/search-sidebar/search-sidebar.component.scss b/src/themes/custom/app/shared/search/search-sidebar/search-sidebar.component.scss new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/themes/custom/app/shared/search/search-sidebar/search-sidebar.component.ts b/src/themes/custom/app/shared/search/search-sidebar/search-sidebar.component.ts new file mode 100644 index 0000000000..aed31b91e2 --- /dev/null +++ b/src/themes/custom/app/shared/search/search-sidebar/search-sidebar.component.ts @@ -0,0 +1,32 @@ +/** + * The contents of this file are subject to the license and copyright + * detailed in the LICENSE_ATMIRE and NOTICE_ATMIRE files at the root of the source + * tree and available online at + * + * https://www.atmire.com/software-license/ + */ +import { Component } from '@angular/core'; +import { + SearchSidebarComponent as BaseComponent, +} from '../../../../../../app/shared/search/search-sidebar/search-sidebar.component'; +import { SEARCH_CONFIG_SERVICE } from '../../../../../../app/my-dspace-page/my-dspace-page.component'; +import { SearchConfigurationService } from '../../../../../../app/core/shared/search/search-configuration.service'; + + +@Component({ + selector: 'ds-search-sidebar', + // styleUrls: ['./search-sidebar.component.scss'], + styleUrls: ['../../../../../../app/shared/search/search-sidebar/search-sidebar.component.scss'], + // templateUrl: './search-sidebar.component.html', + templateUrl: '../../../../../../app/shared/search/search-sidebar/search-sidebar.component.html', + providers: [ + { + provide: SEARCH_CONFIG_SERVICE, + useClass: SearchConfigurationService + } + ] + +}) + +export class SearchSidebarComponent extends BaseComponent { +} diff --git a/src/themes/custom/theme.module.ts b/src/themes/custom/theme.module.ts index fba0ce894a..1ab61cbc42 100644 --- a/src/themes/custom/theme.module.ts +++ b/src/themes/custom/theme.module.ts @@ -85,6 +85,7 @@ import { ResourcePoliciesModule } from '../../app/shared/resource-policies/resou import { ComcolModule } from '../../app/shared/comcol/comcol.module'; import { FeedbackComponent } from './app/info/feedback/feedback.component'; import { SearchFiltersComponent } from './app/shared/search/search-filters/search-filters.component'; +import { SearchSidebarComponent } from './app/shared/search/search-sidebar/search-sidebar.component'; const DECLARATIONS = [ FileSectionComponent, @@ -129,6 +130,7 @@ const DECLARATIONS = [ BreadcrumbsComponent, FeedbackComponent, SearchFiltersComponent, + SearchSidebarComponent, ]; @NgModule({ From de7fcb30da5711b73bd9d88c37923de913aacdc6 Mon Sep 17 00:00:00 2001 From: Kristof De Langhe Date: Wed, 11 Jan 2023 14:49:21 +0100 Subject: [PATCH 036/409] 98422: Themed component import fixes --- src/app/item-page/edit-item-page/edit-item-page.module.ts | 3 ++- .../item-page/edit-item-page/edit-item-page.routing.module.ts | 3 ++- src/themes/custom/theme.module.ts | 4 +++- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/src/app/item-page/edit-item-page/edit-item-page.module.ts b/src/app/item-page/edit-item-page/edit-item-page.module.ts index e033919dba..8ef9c9f82f 100644 --- a/src/app/item-page/edit-item-page/edit-item-page.module.ts +++ b/src/app/item-page/edit-item-page/edit-item-page.module.ts @@ -85,7 +85,8 @@ import { ThemedItemStatusComponent } from './item-status/themed-item-status.comp ObjectValuesPipe ], exports: [ - ItemMetadataComponent + ItemMetadataComponent, + ItemOperationComponent, ] }) export class EditItemPageModule { diff --git a/src/app/item-page/edit-item-page/edit-item-page.routing.module.ts b/src/app/item-page/edit-item-page/edit-item-page.routing.module.ts index 6deffe47a8..0221043d55 100644 --- a/src/app/item-page/edit-item-page/edit-item-page.routing.module.ts +++ b/src/app/item-page/edit-item-page/edit-item-page.routing.module.ts @@ -38,6 +38,7 @@ import { ItemPageRelationshipsGuard } from './item-page-relationships.guard'; import { ItemPageVersionHistoryGuard } from './item-page-version-history.guard'; import { ItemPageCollectionMapperGuard } from './item-page-collection-mapper.guard'; import { ThemedItemPageComponent } from '../simple/themed-item-page.component'; +import { ThemedItemStatusComponent } from './item-status/themed-item-status.component'; /** * Routing module that handles the routing for the Edit Item page administrator functionality @@ -63,7 +64,7 @@ import { ThemedItemPageComponent } from '../simple/themed-item-page.component'; }, { path: 'status', - component: ThemedItemPageComponent, + component: ThemedItemStatusComponent, data: { title: 'item.edit.tabs.status.title', showBreadcrumbs: true }, canActivate: [ItemPageStatusGuard] }, diff --git a/src/themes/custom/theme.module.ts b/src/themes/custom/theme.module.ts index ab69e86a8e..964909b3c1 100644 --- a/src/themes/custom/theme.module.ts +++ b/src/themes/custom/theme.module.ts @@ -86,6 +86,7 @@ import { ComcolModule } from '../../app/shared/comcol/comcol.module'; import { FeedbackComponent } from './app/info/feedback/feedback.component'; import { ItemStatusComponent } from './app/item-page/edit-item-page/item-status/item-status.component'; import { EditBitstreamPageComponent } from './app/bitstream-page/edit-bitstream-page/edit-bitstream-page.component'; +import { FormModule } from '../../app/shared/form/form.module'; const DECLARATIONS = [ FileSectionComponent, @@ -180,7 +181,8 @@ const DECLARATIONS = [ SearchModule, FormsModule, ResourcePoliciesModule, - ComcolModule + ComcolModule, + FormModule, ], declarations: DECLARATIONS }) From 4ba64fdfcc5b2a7ac6c291b712f14b3623d104d8 Mon Sep 17 00:00:00 2001 From: Kristof De Langhe Date: Wed, 11 Jan 2023 14:55:16 +0100 Subject: [PATCH 037/409] 98422: Remove unused import --- .../item-page/edit-item-page/edit-item-page.routing.module.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/app/item-page/edit-item-page/edit-item-page.routing.module.ts b/src/app/item-page/edit-item-page/edit-item-page.routing.module.ts index 0221043d55..bc8b614643 100644 --- a/src/app/item-page/edit-item-page/edit-item-page.routing.module.ts +++ b/src/app/item-page/edit-item-page/edit-item-page.routing.module.ts @@ -37,7 +37,6 @@ import { ItemPageBitstreamsGuard } from './item-page-bitstreams.guard'; import { ItemPageRelationshipsGuard } from './item-page-relationships.guard'; import { ItemPageVersionHistoryGuard } from './item-page-version-history.guard'; import { ItemPageCollectionMapperGuard } from './item-page-collection-mapper.guard'; -import { ThemedItemPageComponent } from '../simple/themed-item-page.component'; import { ThemedItemStatusComponent } from './item-status/themed-item-status.component'; /** From bcb27f666aa6994eac44be286b10b2d4834603f5 Mon Sep 17 00:00:00 2001 From: lotte Date: Wed, 11 Jan 2023 15:14:19 +0100 Subject: [PATCH 038/409] replace ds-search-sidebar with ds-themed-search-sidebar --- src/app/shared/search/search.component.html | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/app/shared/search/search.component.html b/src/app/shared/search/search.component.html index c292c94c44..ce37f054eb 100644 --- a/src/app/shared/search/search.component.html +++ b/src/app/shared/search/search.component.html @@ -44,7 +44,7 @@ - - + - + From 6114337660de2c8154402de7185d3064d9c3192f Mon Sep 17 00:00:00 2001 From: lotte Date: Mon, 23 Jan 2023 12:16:05 +0100 Subject: [PATCH 039/409] Split up process module to be importable --- .../process-page-shared.module.ts | 49 +++++++++++++++++++ src/app/process-page/process-page.module.ts | 18 +------ 2 files changed, 51 insertions(+), 16 deletions(-) create mode 100644 src/app/process-page/process-page-shared.module.ts diff --git a/src/app/process-page/process-page-shared.module.ts b/src/app/process-page/process-page-shared.module.ts new file mode 100644 index 0000000000..efa154f26b --- /dev/null +++ b/src/app/process-page/process-page-shared.module.ts @@ -0,0 +1,49 @@ +import { NgModule } from '@angular/core'; +import { SharedModule } from '../shared/shared.module'; +import { ProcessPageRoutingModule } from './process-page-routing.module'; +import { NewProcessComponent } from './new/new-process.component'; +import { ScriptsSelectComponent } from './form/scripts-select/scripts-select.component'; +import { ScriptHelpComponent } from './form/script-help/script-help.component'; +import { ParameterSelectComponent } from './form/process-parameters/parameter-select/parameter-select.component'; +import { ProcessParametersComponent } from './form/process-parameters/process-parameters.component'; +import { StringValueInputComponent } from './form/process-parameters/parameter-value-input/string-value-input/string-value-input.component'; +import { ParameterValueInputComponent } from './form/process-parameters/parameter-value-input/parameter-value-input.component'; +import { FileValueInputComponent } from './form/process-parameters/parameter-value-input/file-value-input/file-value-input.component'; +import { BooleanValueInputComponent } from './form/process-parameters/parameter-value-input/boolean-value-input/boolean-value-input.component'; +import { DateValueInputComponent } from './form/process-parameters/parameter-value-input/date-value-input/date-value-input.component'; +import { ProcessOverviewComponent } from './overview/process-overview.component'; +import { ProcessDetailComponent } from './detail/process-detail.component'; +import { ProcessDetailFieldComponent } from './detail/process-detail-field/process-detail-field.component'; +import { ProcessBreadcrumbsService } from './process-breadcrumbs.service'; +import { ProcessBreadcrumbResolver } from './process-breadcrumb.resolver'; +import { ProcessFormComponent } from './form/process-form.component'; + +@NgModule({ + imports: [ + SharedModule, + ], + declarations: [ + NewProcessComponent, + ScriptsSelectComponent, + ScriptHelpComponent, + ParameterSelectComponent, + ProcessParametersComponent, + StringValueInputComponent, + ParameterValueInputComponent, + FileValueInputComponent, + BooleanValueInputComponent, + DateValueInputComponent, + ProcessOverviewComponent, + ProcessDetailComponent, + ProcessDetailFieldComponent, + ProcessFormComponent + ], + providers: [ + ProcessBreadcrumbResolver, + ProcessBreadcrumbsService + ] +}) + +export class ProcessPageSharedModule { + +} diff --git a/src/app/process-page/process-page.module.ts b/src/app/process-page/process-page.module.ts index ebe03e4537..471b55cf46 100644 --- a/src/app/process-page/process-page.module.ts +++ b/src/app/process-page/process-page.module.ts @@ -17,31 +17,17 @@ import { ProcessDetailFieldComponent } from './detail/process-detail-field/proce import { ProcessBreadcrumbsService } from './process-breadcrumbs.service'; import { ProcessBreadcrumbResolver } from './process-breadcrumb.resolver'; import { ProcessFormComponent } from './form/process-form.component'; +import { ProcessPageSharedModule } from './process-page-shared.module'; @NgModule({ imports: [ ProcessPageRoutingModule, SharedModule, + ProcessPageSharedModule, ], declarations: [ - NewProcessComponent, - ScriptsSelectComponent, - ScriptHelpComponent, - ParameterSelectComponent, - ProcessParametersComponent, - StringValueInputComponent, - ParameterValueInputComponent, - FileValueInputComponent, - BooleanValueInputComponent, - DateValueInputComponent, - ProcessOverviewComponent, - ProcessDetailComponent, - ProcessDetailFieldComponent, - ProcessFormComponent ], providers: [ - ProcessBreadcrumbResolver, - ProcessBreadcrumbsService ] }) From a4679ca7e54f1f2e4383f2e610713259d55095db Mon Sep 17 00:00:00 2001 From: lotte Date: Mon, 23 Jan 2023 12:33:01 +0100 Subject: [PATCH 040/409] Made ListableObjectComponentLoaderComponent themeable --- ...-search-result-list-element.component.html | 4 +- ...admin-workflow-list-element.component.html | 4 +- .../item-delete/item-delete.component.html | 8 ++-- .../edit-relationship.component.html | 4 +- .../virtual-metadata.component.html | 4 +- .../item-page/simple/item-page.component.html | 2 +- .../related-items.component.html | 4 +- .../related-items.component.spec.ts | 2 +- .../shared/browse-by/browse-by.component.html | 2 +- .../dso-selector/dso-selector.component.html | 4 +- ...sting-relation-list-element.component.html | 2 +- .../dso-input-suggestions.component.html | 2 +- ...table-object-component-loader.component.ts | 43 +++++++++++++++++++ .../object-detail.component.html | 2 +- .../object-grid/object-grid.component.html | 2 +- .../item-metadata-list-element.component.html | 2 +- ...em-metadata-list-element.component.spec.ts | 2 +- .../object-list/object-list.component.html | 4 +- src/app/shared/shared.module.ts | 2 + ...ble-object-component-loader.component.html | 0 ...ble-object-component-loader.component.scss | 0 ...table-object-component-loader.component.ts | 13 ++++++ src/themes/custom/theme.module.ts | 2 + 23 files changed, 87 insertions(+), 27 deletions(-) create mode 100644 src/app/shared/object-collection/shared/listable-object/themed-listable-object-component-loader.component.ts create mode 100644 src/themes/custom/app/shared/object-collection/shared/listable-object/listable-object-component-loader.component.html create mode 100644 src/themes/custom/app/shared/object-collection/shared/listable-object/listable-object-component-loader.component.scss create mode 100644 src/themes/custom/app/shared/object-collection/shared/listable-object/listable-object-component-loader.component.ts diff --git a/src/app/admin/admin-search-page/admin-search-results/admin-search-result-list-element/item-search-result/item-admin-search-result-list-element.component.html b/src/app/admin/admin-search-page/admin-search-results/admin-search-result-list-element/item-search-result/item-admin-search-result-list-element.component.html index 259512552c..b34868f736 100644 --- a/src/app/admin/admin-search-page/admin-search-results/admin-search-result-list-element/item-search-result/item-admin-search-result-list-element.component.html +++ b/src/app/admin/admin-search-page/admin-search-results/admin-search-result-list-element/item-search-result/item-admin-search-result-list-element.component.html @@ -1,7 +1,7 @@ - + [hideBadges]="true"> diff --git a/src/app/admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-list-element/workflow-item/workflow-item-search-result-admin-workflow-list-element.component.html b/src/app/admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-list-element/workflow-item/workflow-item-search-result-admin-workflow-list-element.component.html index 192cc751f2..909882361a 100644 --- a/src/app/admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-list-element/workflow-item/workflow-item-search-result-admin-workflow-list-element.component.html +++ b/src/app/admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-list-element/workflow-item/workflow-item-search-result-admin-workflow-list-element.component.html @@ -1,10 +1,10 @@
{{ "admin.workflow.item.workflow" | translate }}
- + [listID]="listID"> diff --git a/src/app/item-page/edit-item-page/item-delete/item-delete.component.html b/src/app/item-page/edit-item-page/item-delete/item-delete.component.html index df50e13b48..fb8acb61f3 100644 --- a/src/app/item-page/edit-item-page/item-delete/item-delete.component.html +++ b/src/app/item-page/edit-item-page/item-delete/item-delete.component.html @@ -31,11 +31,11 @@ class="d-flex flex-row"> - - +
- +

{{dso.name}}

From d2871ea8a0724e90cdc15e565c4b1f807f261c4a Mon Sep 17 00:00:00 2001 From: lotte Date: Thu, 23 Feb 2023 14:39:34 +0100 Subject: [PATCH 059/409] Solved test issues --- .../dso-edit-metadata-value.component.spec.ts | 4 ++-- ...ned-task-search-result-list-element.component.spec.ts | 5 ----- .../subscription-view.component.spec.ts | 9 ++++----- 3 files changed, 6 insertions(+), 12 deletions(-) diff --git a/src/app/dso-shared/dso-edit-metadata/dso-edit-metadata-value/dso-edit-metadata-value.component.spec.ts b/src/app/dso-shared/dso-edit-metadata/dso-edit-metadata-value/dso-edit-metadata-value.component.spec.ts index 10b3016a52..67a6f98ac0 100644 --- a/src/app/dso-shared/dso-edit-metadata/dso-edit-metadata-value/dso-edit-metadata-value.component.spec.ts +++ b/src/app/dso-shared/dso-edit-metadata/dso-edit-metadata-value/dso-edit-metadata-value.component.spec.ts @@ -68,7 +68,7 @@ describe('DsoEditMetadataValueComponent', () => { }); it('should not show a badge', () => { - expect(fixture.debugElement.query(By.css('ds-type-badge'))).toBeNull(); + expect(fixture.debugElement.query(By.css('ds-themed-type-badge'))).toBeNull(); }); describe('when no changes have been made', () => { @@ -134,7 +134,7 @@ describe('DsoEditMetadataValueComponent', () => { }); it('should show a badge', () => { - expect(fixture.debugElement.query(By.css('ds-type-badge'))).toBeTruthy(); + expect(fixture.debugElement.query(By.css('ds-themed-type-badge'))).toBeTruthy(); }); assertButton(EDIT_BTN, true, true); diff --git a/src/app/shared/object-list/my-dspace-result-list-element/claimed-search-result/claimed-declined-task-search-result/claimed-declined-task-search-result-list-element.component.spec.ts b/src/app/shared/object-list/my-dspace-result-list-element/claimed-search-result/claimed-declined-task-search-result/claimed-declined-task-search-result-list-element.component.spec.ts index 1b23def2e4..5e082ef4cf 100644 --- a/src/app/shared/object-list/my-dspace-result-list-element/claimed-search-result/claimed-declined-task-search-result/claimed-declined-task-search-result-list-element.component.spec.ts +++ b/src/app/shared/object-list/my-dspace-result-list-element/claimed-search-result/claimed-declined-task-search-result/claimed-declined-task-search-result-list-element.component.spec.ts @@ -12,7 +12,6 @@ import { getMockLinkService } from '../../../../mocks/link-service.mock'; import { VarDirective } from '../../../../utils/var.directive'; import { TruncatableService } from '../../../../truncatable/truncatable.service'; import { LinkService } from '../../../../../core/cache/builders/link.service'; -import { MyDspaceItemStatusType } from '../../../../object-collection/shared/mydspace-item-status/my-dspace-item-status-type'; import { DSONameService } from '../../../../../core/breadcrumbs/dso-name.service'; import { DSONameServiceMock } from '../../../../mocks/dso-name.service.mock'; import { APP_CONFIG } from '../../../../../../config/app-config.interface'; @@ -102,8 +101,4 @@ describe('ClaimedDeclinedTaskSearchResultListElementComponent', () => { }); }); - it('should have properly status', () => { - expect(component.status).toEqual(MyDspaceItemStatusType.DECLINED_TASk); - }); - }); diff --git a/src/app/shared/subscriptions/subscription-view/subscription-view.component.spec.ts b/src/app/shared/subscriptions/subscription-view/subscription-view.component.spec.ts index aa40f2bf43..aefdb5772b 100644 --- a/src/app/shared/subscriptions/subscription-view/subscription-view.component.spec.ts +++ b/src/app/shared/subscriptions/subscription-view/subscription-view.component.spec.ts @@ -6,8 +6,7 @@ import { ReactiveFormsModule } from '@angular/forms'; import { BrowserModule, By } from '@angular/platform-browser'; import { NgbModule } from '@ng-bootstrap/ng-bootstrap'; import { TranslateLoader, TranslateModule } from '@ngx-translate/core'; -import { SharedModule } from '../../shared.module'; -import { DebugElement } from '@angular/core'; +import { DebugElement, NO_ERRORS_SCHEMA } from '@angular/core'; import { RouterTestingModule } from '@angular/router/testing'; import { SubscriptionViewComponent } from './subscription-view.component'; @@ -61,7 +60,6 @@ describe('SubscriptionViewComponent', () => { ReactiveFormsModule, BrowserModule, RouterTestingModule, - SharedModule, TranslateModule.forRoot({ loader: { provide: TranslateLoader, @@ -74,7 +72,8 @@ describe('SubscriptionViewComponent', () => { { provide: ComponentFixtureAutoDetect, useValue: true }, { provide: NotificationsService, useValue: NotificationsServiceStub }, { provide: SubscriptionsDataService, useValue: subscriptionServiceStub }, - ] + ], + schemas: [NO_ERRORS_SCHEMA] }) .compileComponents(); }); @@ -94,7 +93,7 @@ describe('SubscriptionViewComponent', () => { }); it('should have dso object info', () => { - expect(de.query(By.css('.dso-info > ds-type-badge'))).toBeTruthy(); + expect(de.query(By.css('.dso-info > ds-themed-type-badge'))).toBeTruthy(); expect(de.query(By.css('.dso-info > p > a'))).toBeTruthy(); }); From 2513f91a1acc6d7f8470902021317ae8f3f5151e Mon Sep 17 00:00:00 2001 From: Alexandre Vryghem Date: Sun, 26 Feb 2023 17:10:25 +0100 Subject: [PATCH 060/409] Use DSONameService to display DSpaceObjects names --- .../epeople-registry.component.html | 6 +-- .../epeople-registry.component.ts | 11 ++++-- .../eperson-form/eperson-form.component.html | 10 +++-- .../eperson-form/eperson-form.component.ts | 18 +++++---- .../group-form/group-form.component.html | 2 +- .../group-form/group-form.component.spec.ts | 15 ++++--- .../group-form/group-form.component.ts | 18 +++++---- .../members-list/members-list.component.html | 22 +++++++---- .../members-list.component.spec.ts | 5 ++- .../members-list/members-list.component.ts | 17 +++++--- .../subgroups-list.component.html | 26 ++++++++----- .../subgroups-list.component.spec.ts | 3 ++ .../subgroup-list/subgroups-list.component.ts | 9 +++-- .../groups-registry.component.html | 8 ++-- .../groups-registry.component.spec.ts | 9 +++-- .../groups-registry.component.ts | 9 +++-- ...in-search-result-grid-element.component.ts | 13 ++++--- ...t-admin-workflow-grid-element.component.ts | 4 +- ...t-admin-workflow-list-element.component.ts | 2 +- .../edit-bitstream-page.component.html | 2 +- .../edit-bitstream-page.component.ts | 2 +- .../browse-by-date-page.component.ts | 7 +++- src/app/browse-by/browse-by-guard.spec.ts | 5 ++- src/app/browse-by/browse-by-guard.ts | 20 ++++++---- .../browse-by-metadata-page.component.html | 6 +-- .../browse-by-metadata-page.component.ts | 5 ++- .../browse-by-title-page.component.ts | 7 +++- .../collection-item-mapper.component.ts | 2 +- .../collection-page.component.html | 2 +- .../collection-page.component.ts | 2 + .../create-collection-page.component.html | 2 +- .../create-collection-page.component.spec.ts | 5 ++- .../create-collection-page.component.ts | 4 +- .../delete-collection-page.component.html | 2 +- .../delete-collection-page.component.spec.ts | 3 ++ .../delete-collection-page.component.ts | 4 +- .../collection-roles.component.spec.ts | 3 ++ .../edit-item-template-page.component.html | 2 +- .../edit-item-template-page.component.ts | 8 +++- .../item-template-page.resolver.spec.ts | 6 ++- .../item-template-page.resolver.ts | 6 ++- .../community-list.component.html | 11 +++--- .../community-list.component.ts | 6 ++- .../community-page.component.html | 2 +- .../community-page.component.ts | 4 +- .../create-community-page.component.html | 2 +- .../create-community-page.component.ts | 4 +- .../delete-community-page.component.html | 2 +- .../delete-community-page.component.spec.ts | 3 ++ .../delete-community-page.component.ts | 4 +- .../community-roles.component.spec.ts | 3 ++ src/app/core/breadcrumbs/dso-name.service.ts | 39 +++++++++++++------ src/app/core/eperson/models/eperson.model.ts | 6 +++ ...urnal-issue-grid-element.component.spec.ts | 3 ++ ...rnal-volume-grid-element.component.spec.ts | 3 ++ .../journal-grid-element.component.spec.ts | 3 ++ ...urnal-issue-list-element.component.spec.ts | 3 ++ ...rnal-volume-list-element.component.spec.ts | 3 ++ .../journal-list-element.component.spec.ts | 4 ++ .../org-unit-grid-element.component.spec.ts | 3 ++ .../person-grid-element.component.spec.ts | 3 ++ .../project-grid-element.component.spec.ts | 3 ++ .../org-unit-list-element.component.spec.ts | 3 ++ .../person-list-element.component.spec.ts | 3 ++ .../project-list-element.component.spec.ts | 3 ++ ...on-search-result-list-element.component.ts | 2 +- ...n-sidebar-search-list-element.component.ts | 2 +- ...esult-list-submission-element.component.ts | 2 +- ...esult-list-submission-element.component.ts | 2 +- .../import-external-page.component.html | 2 +- .../upload/upload-bitstream.component.html | 6 +-- .../upload/upload-bitstream.component.ts | 5 ++- .../item-collection-mapper.component.html | 2 +- .../item-move/item-move.component.html | 5 ++- .../item-move/item-move.component.ts | 4 +- .../collections/collections.component.html | 2 +- .../collections/collections.component.spec.ts | 3 ++ .../collections/collections.component.ts | 11 ++++-- .../full-file-section.component.html | 7 ++-- .../full-file-section.component.ts | 10 +++-- .../media-viewer-video.component.html | 2 +- .../media-viewer-video.component.ts | 6 +++ .../file-section/file-section.component.html | 2 +- .../file-section/file-section.component.ts | 4 +- .../overview/process-overview.component.ts | 4 +- .../profile-claim-item-modal.component.html | 2 +- .../profile-claim-item-modal.component.ts | 5 ++- .../profile-page/profile-page.component.html | 6 ++- .../profile-page/profile-page.component.ts | 5 ++- .../deny-request-copy.component.spec.ts | 9 ++--- .../deny-request-copy.component.ts | 6 +-- .../grant-request-copy.component.spec.ts | 9 ++--- .../grant-request-copy.component.ts | 6 +-- .../user-menu/user-menu.component.html | 2 +- .../user-menu/user-menu.component.ts | 8 +++- .../bitstream-download-page.component.html | 2 +- .../bitstream-download-page.component.ts | 2 + .../collection-dropdown.component.ts | 12 +++--- .../create-comcol-page.component.ts | 2 + .../delete-comcol-page.component.ts | 2 + .../comcol-role/comcol-role.component.html | 2 +- .../comcol-role/comcol-role.component.spec.ts | 3 ++ .../comcol-role/comcol-role.component.ts | 2 + .../confirmation-modal.component.html | 8 ++-- .../confirmation-modal.component.ts | 6 ++- .../dso-input-suggestions.component.ts | 11 +++++- .../item-versions/item-versions.component.ts | 4 +- src/app/shared/mocks/dso-name.service.mock.ts | 4 +- .../item-submitter.component.html | 5 ++- .../item-submitter.component.ts | 7 +++- .../abstract-listable-element.component.ts | 7 ++++ ...ch-result-detail-element.component.spec.ts | 3 ++ ...-search-result-detail-element.component.ts | 9 ++++- .../item-detail-preview.component.html | 4 +- .../item-detail-preview.component.ts | 17 ++++---- ...ch-result-detail-element.component.spec.ts | 5 +++ ...ch-result-detail-element.component.spec.ts | 3 ++ ...-search-result-detail-element.component.ts | 9 ++++- ...-search-result-detail-element.component.ts | 4 +- ...-search-result-detail-element.component.ts | 4 +- .../collection-grid-element.component.html | 2 +- .../collection-grid-element.component.ts | 8 +++- .../community-grid-element.component.html | 2 +- .../community-grid-element.component.ts | 8 +++- .../item/item-grid-element.component.spec.ts | 3 ++ ...-search-result-grid-element.component.html | 2 +- ...on-search-result-grid-element.component.ts | 4 +- ...-search-result-grid-element.component.html | 2 +- ...ty-search-result-grid-element.component.ts | 4 +- ...em-search-result-grid-element.component.ts | 4 +- .../search-result-grid-element.component.ts | 4 +- ...rowse-entry-list-element.component.spec.ts | 3 ++ .../browse-entry-list-element.component.ts | 9 ++++- .../bundle-list-element.component.html | 2 +- .../collection-list-element.component.html | 4 +- .../collection-list-element.component.spec.ts | 3 ++ .../community-list-element.component.html | 4 +- .../community-list-element.component.spec.ts | 3 ++ .../community-list-element.component.ts | 11 +++++- .../item/item-list-element.component.spec.ts | 3 ++ ...ed-search-result-list-element.component.ts | 2 +- ...ed-search-result-list-element.component.ts | 2 +- ...ed-search-result-list-element.component.ts | 2 +- .../item-list-preview.component.ts | 2 +- ...ol-search-result-list-element.component.ts | 2 +- ...em-search-result-list-element.component.ts | 2 +- ...em-search-result-list-element.component.ts | 2 +- .../search-result-list-element.component.ts | 4 +- .../sidebar-search-list-element.component.ts | 2 +- .../collection-select.component.html | 2 +- .../collection-select.component.scss | 3 ++ .../collection-select.component.ts | 11 ++++-- .../item-select/item-select.component.html | 6 ++- .../item-select/item-select.component.ts | 8 +++- .../search-form/search-form.component.html | 2 +- .../search-form/search-form.component.ts | 4 +- ...bmission-form-collection.component.spec.ts | 3 ++ .../submission-form-collection.component.ts | 19 +++------ ...tion-upload-access-conditions.component.ts | 16 ++++---- .../upload/section-upload.component.ts | 4 +- 160 files changed, 608 insertions(+), 288 deletions(-) create mode 100644 src/app/shared/object-select/collection-select/collection-select.component.scss diff --git a/src/app/access-control/epeople-registry/epeople-registry.component.html b/src/app/access-control/epeople-registry/epeople-registry.component.html index 2d87f21d26..3af443e391 100644 --- a/src/app/access-control/epeople-registry/epeople-registry.component.html +++ b/src/app/access-control/epeople-registry/epeople-registry.component.html @@ -68,18 +68,18 @@
{{epersonDto.eperson.id}}{{epersonDto.eperson.name}}{{ dsoNameService.getName(epersonDto.eperson) }} {{epersonDto.eperson.email}}
diff --git a/src/app/access-control/epeople-registry/epeople-registry.component.ts b/src/app/access-control/epeople-registry/epeople-registry.component.ts index 55233d8173..c7b9907b82 100644 --- a/src/app/access-control/epeople-registry/epeople-registry.component.ts +++ b/src/app/access-control/epeople-registry/epeople-registry.component.ts @@ -21,6 +21,7 @@ import { RequestService } from '../../core/data/request.service'; import { PageInfo } from '../../core/shared/page-info.model'; import { NoContent } from '../../core/shared/NoContent.model'; import { PaginationService } from '../../core/pagination/pagination.service'; +import { DSONameService } from '../../core/breadcrumbs/dso-name.service'; @Component({ selector: 'ds-epeople-registry', @@ -93,7 +94,9 @@ export class EPeopleRegistryComponent implements OnInit, OnDestroy { private router: Router, private modalService: NgbModal, private paginationService: PaginationService, - public requestService: RequestService) { + public requestService: RequestService, + public dsoNameService: DSONameService, + ) { this.currentSearchQuery = ''; this.currentSearchScope = 'metadata'; this.searchForm = this.formBuilder.group(({ @@ -121,7 +124,7 @@ export class EPeopleRegistryComponent implements OnInit, OnDestroy { this.subs.push(this.ePeople$.pipe( switchMap((epeople: PaginatedList) => { if (epeople.pageInfo.totalElements > 0) { - return combineLatest(...epeople.page.map((eperson) => { + return combineLatest([...epeople.page.map((eperson: EPerson) => { return this.authorizationService.isAuthorized(FeatureID.CanDelete, hasValue(eperson) ? eperson.self : undefined).pipe( map((authorized) => { const epersonDtoModel: EpersonDtoModel = new EpersonDtoModel(); @@ -130,7 +133,7 @@ export class EPeopleRegistryComponent implements OnInit, OnDestroy { return epersonDtoModel; }) ); - })).pipe(map((dtos: EpersonDtoModel[]) => { + })]).pipe(map((dtos: EpersonDtoModel[]) => { return buildPaginatedList(epeople.pageInfo, dtos); })); } else { @@ -237,7 +240,7 @@ export class EPeopleRegistryComponent implements OnInit, OnDestroy { if (hasValue(ePerson.id)) { this.epersonService.deleteEPerson(ePerson).pipe(getFirstCompletedRemoteData()).subscribe((restResponse: RemoteData) => { if (restResponse.hasSucceeded) { - this.notificationsService.success(this.translateService.get(this.labelPrefix + 'notification.deleted.success', {name: ePerson.name})); + this.notificationsService.success(this.translateService.get(this.labelPrefix + 'notification.deleted.success', {name: this.dsoNameService.getName(ePerson)})); } else { this.notificationsService.error('Error occured when trying to delete EPerson with id: ' + ePerson.id + ' with code: ' + restResponse.statusCode + ' and message: ' + restResponse.errorMessage); } diff --git a/src/app/access-control/epeople-registry/eperson-form/eperson-form.component.html b/src/app/access-control/epeople-registry/eperson-form/eperson-form.component.html index e9cc48aee3..249bcc7edf 100644 --- a/src/app/access-control/epeople-registry/eperson-form/eperson-form.component.html +++ b/src/app/access-control/epeople-registry/eperson-form/eperson-form.component.html @@ -64,9 +64,13 @@
{{group.id}}{{group.name}}{{(group.object | async)?.payload?.name}} + + {{ dsoNameService.getName(group) }} + + {{ dsoNameService.getName(undefined) }}
diff --git a/src/app/access-control/epeople-registry/eperson-form/eperson-form.component.ts b/src/app/access-control/epeople-registry/eperson-form/eperson-form.component.ts index 7d607647e3..ce30062a69 100644 --- a/src/app/access-control/epeople-registry/eperson-form/eperson-form.component.ts +++ b/src/app/access-control/epeople-registry/eperson-form/eperson-form.component.ts @@ -36,6 +36,7 @@ import { followLink } from '../../../shared/utils/follow-link-config.model'; import { ValidateEmailNotTaken } from './validators/email-taken.validator'; import { Registration } from '../../../core/shared/registration.model'; import { EpersonRegistrationService } from '../../../core/data/eperson-registration.service'; +import { DSONameService } from '../../../core/breadcrumbs/dso-name.service'; @Component({ selector: 'ds-eperson-form', @@ -182,6 +183,7 @@ export class EPersonFormComponent implements OnInit, OnDestroy { private paginationService: PaginationService, public requestService: RequestService, private epersonRegistrationService: EpersonRegistrationService, + public dsoNameService: DSONameService, ) { this.subs.push(this.epersonService.getActiveEPerson().subscribe((eperson: EPerson) => { this.epersonInitial = eperson; @@ -200,14 +202,14 @@ export class EPersonFormComponent implements OnInit, OnDestroy { */ initialisePage() { - observableCombineLatest( + observableCombineLatest([ this.translateService.get(`${this.messagePrefix}.firstName`), this.translateService.get(`${this.messagePrefix}.lastName`), this.translateService.get(`${this.messagePrefix}.email`), this.translateService.get(`${this.messagePrefix}.canLogIn`), this.translateService.get(`${this.messagePrefix}.requireCertificate`), this.translateService.get(`${this.messagePrefix}.emailHint`), - ).subscribe(([firstName, lastName, email, canLogIn, requireCertificate, emailHint]) => { + ]).subscribe(([firstName, lastName, email, canLogIn, requireCertificate, emailHint]) => { this.firstName = new DynamicInputModel({ id: 'firstName', label: firstName, @@ -374,10 +376,10 @@ export class EPersonFormComponent implements OnInit, OnDestroy { getFirstCompletedRemoteData() ).subscribe((rd: RemoteData) => { if (rd.hasSucceeded) { - this.notificationsService.success(this.translateService.get(this.labelPrefix + 'notification.created.success', { name: ePersonToCreate.name })); + this.notificationsService.success(this.translateService.get(this.labelPrefix + 'notification.created.success', { name: this.dsoNameService.getName(ePersonToCreate) })); this.submitForm.emit(ePersonToCreate); } else { - this.notificationsService.error(this.translateService.get(this.labelPrefix + 'notification.created.failure', { name: ePersonToCreate.name })); + this.notificationsService.error(this.translateService.get(this.labelPrefix + 'notification.created.failure', { name: this.dsoNameService.getName(ePersonToCreate) })); this.cancelForm.emit(); } }); @@ -413,10 +415,10 @@ export class EPersonFormComponent implements OnInit, OnDestroy { const response = this.epersonService.updateEPerson(editedEperson); response.pipe(getFirstCompletedRemoteData()).subscribe((rd: RemoteData) => { if (rd.hasSucceeded) { - this.notificationsService.success(this.translateService.get(this.labelPrefix + 'notification.edited.success', { name: editedEperson.name })); + this.notificationsService.success(this.translateService.get(this.labelPrefix + 'notification.edited.success', { name: this.dsoNameService.getName(editedEperson) })); this.submitForm.emit(editedEperson); } else { - this.notificationsService.error(this.translateService.get(this.labelPrefix + 'notification.edited.failure', { name: editedEperson.name })); + this.notificationsService.error(this.translateService.get(this.labelPrefix + 'notification.edited.failure', { name: this.dsoNameService.getName(editedEperson) })); this.cancelForm.emit(); } }); @@ -464,7 +466,7 @@ export class EPersonFormComponent implements OnInit, OnDestroy { if (hasValue(eperson.id)) { this.epersonService.deleteEPerson(eperson).pipe(getFirstCompletedRemoteData()).subscribe((restResponse: RemoteData) => { if (restResponse.hasSucceeded) { - this.notificationsService.success(this.translateService.get(this.labelPrefix + 'notification.deleted.success', { name: eperson.name })); + this.notificationsService.success(this.translateService.get(this.labelPrefix + 'notification.deleted.success', { name: this.dsoNameService.getName(eperson) })); this.submitForm.emit(); } else { this.notificationsService.error('Error occured when trying to delete EPerson with id: ' + eperson.id + ' with code: ' + restResponse.statusCode + ' and message: ' + restResponse.errorMessage); @@ -542,7 +544,7 @@ export class EPersonFormComponent implements OnInit, OnDestroy { .subscribe((list: PaginatedList) => { if (list.totalElements > 0) { this.notificationsService.error(this.translateService.get(this.labelPrefix + 'notification.' + notificationSection + '.failure.emailInUse', { - name: ePerson.name, + name: this.dsoNameService.getName(ePerson), email: ePerson.email })); } diff --git a/src/app/access-control/group-registry/group-form/group-form.component.html b/src/app/access-control/group-registry/group-form/group-form.component.html index 0fc5a574b7..409a46629a 100644 --- a/src/app/access-control/group-registry/group-form/group-form.component.html +++ b/src/app/access-control/group-registry/group-form/group-form.component.html @@ -15,7 +15,7 @@ + [content]="(messagePrefix + '.alert.workflowGroup' | translate:{ name: dsoNameService.getName((getLinkedDSO(groupBeingEdited) | async)?.payload), comcol: (getLinkedDSO(groupBeingEdited) | async)?.payload?.type, comcolEditRolesRoute: (getLinkedEditRolesRoute(groupBeingEdited) | async) })"> { let component: GroupFormComponent; @@ -188,7 +190,7 @@ describe('GroupFormComponent', () => { translateService = getMockTranslateService(); router = new RouterMock(); notificationService = new NotificationsServiceStub(); - TestBed.configureTestingModule({ + return TestBed.configureTestingModule({ imports: [CommonModule, NgbModule, FormsModule, ReactiveFormsModule, BrowserModule, TranslateModule.forRoot({ loader: { @@ -198,7 +200,8 @@ describe('GroupFormComponent', () => { }), ], declarations: [GroupFormComponent], - providers: [GroupFormComponent, + providers: [ + { provide: DSONameService, useValue: new DSONameServiceMock() }, { provide: EPersonDataService, useValue: ePersonDataServiceStub }, { provide: GroupDataService, useValue: groupsDataServiceStub }, { provide: DSpaceObjectDataService, useValue: dsoDataServiceStub }, @@ -240,8 +243,8 @@ describe('GroupFormComponent', () => { fixture.detectChanges(); }); - it('should emit a new group using the correct values', waitForAsync(() => { - fixture.whenStable().then(() => { + it('should emit a new group using the correct values', (async () => { + await fixture.whenStable().then(() => { expect(component.submitForm.emit).toHaveBeenCalledWith(expected); }); })); @@ -266,8 +269,8 @@ describe('GroupFormComponent', () => { fixture.detectChanges(); }); - it('should emit the existing group using the correct new values', waitForAsync(() => { - fixture.whenStable().then(() => { + it('should emit the existing group using the correct new values', (async () => { + await fixture.whenStable().then(() => { expect(component.submitForm.emit).toHaveBeenCalledWith(expected2); }); })); diff --git a/src/app/access-control/group-registry/group-form/group-form.component.ts b/src/app/access-control/group-registry/group-form/group-form.component.ts index b0178f1294..b837d80479 100644 --- a/src/app/access-control/group-registry/group-form/group-form.component.ts +++ b/src/app/access-control/group-registry/group-form/group-form.component.ts @@ -46,6 +46,7 @@ import { followLink } from '../../../shared/utils/follow-link-config.model'; import { NoContent } from '../../../core/shared/NoContent.model'; import { Operation } from 'fast-json-patch'; import { ValidateGroupExists } from './validators/group-exists.validator'; +import { DSONameService } from '../../../core/breadcrumbs/dso-name.service'; @Component({ selector: 'ds-group-form', @@ -133,7 +134,8 @@ export class GroupFormComponent implements OnInit, OnDestroy { groupNameValueChangeSubscribe: Subscription; - constructor(public groupDataService: GroupDataService, + constructor( + public groupDataService: GroupDataService, private ePersonDataService: EPersonDataService, private dSpaceObjectDataService: DSpaceObjectDataService, private formBuilderService: FormBuilderService, @@ -144,7 +146,9 @@ export class GroupFormComponent implements OnInit, OnDestroy { private authorizationService: AuthorizationDataService, private modalService: NgbModal, public requestService: RequestService, - protected changeDetectorRef: ChangeDetectorRef) { + protected changeDetectorRef: ChangeDetectorRef, + public dsoNameService: DSONameService, + ) { } ngOnInit() { @@ -329,7 +333,7 @@ export class GroupFormComponent implements OnInit, OnDestroy { .subscribe((list: PaginatedList) => { if (list.totalElements > 0) { this.notificationsService.error(this.translateService.get(this.messagePrefix + '.notification.' + notificationSection + '.failure.groupNameInUse', { - name: group.name + name: this.dsoNameService.getName(group), })); } })); @@ -362,10 +366,10 @@ export class GroupFormComponent implements OnInit, OnDestroy { getFirstCompletedRemoteData() ).subscribe((rd: RemoteData) => { if (rd.hasSucceeded) { - this.notificationsService.success(this.translateService.get(this.messagePrefix + '.notification.edited.success', { name: rd.payload.name })); + this.notificationsService.success(this.translateService.get(this.messagePrefix + '.notification.edited.success', { name: this.dsoNameService.getName(rd.payload) })); this.submitForm.emit(rd.payload); } else { - this.notificationsService.error(this.translateService.get(this.messagePrefix + '.notification.edited.failure', { name: group.name })); + this.notificationsService.error(this.translateService.get(this.messagePrefix + '.notification.edited.failure', { name: this.dsoNameService.getName(group) })); this.cancelForm.emit(); } }); @@ -425,11 +429,11 @@ export class GroupFormComponent implements OnInit, OnDestroy { this.groupDataService.delete(group.id).pipe(getFirstCompletedRemoteData()) .subscribe((rd: RemoteData) => { if (rd.hasSucceeded) { - this.notificationsService.success(this.translateService.get(this.messagePrefix + '.notification.deleted.success', { name: group.name })); + this.notificationsService.success(this.translateService.get(this.messagePrefix + '.notification.deleted.success', { name: this.dsoNameService.getName(group) })); this.onCancel(); } else { this.notificationsService.error( - this.translateService.get(this.messagePrefix + '.notification.deleted.failure.title', { name: group.name }), + this.translateService.get(this.messagePrefix + '.notification.deleted.failure.title', { name: this.dsoNameService.getName(group) }), this.translateService.get(this.messagePrefix + '.notification.deleted.failure.content', { cause: rd.errorMessage })); } }); diff --git a/src/app/access-control/group-registry/group-form/members-list/members-list.component.html b/src/app/access-control/group-registry/group-form/members-list/members-list.component.html index e5932edf05..43eff9beae 100644 --- a/src/app/access-control/group-registry/group-form/members-list/members-list.component.html +++ b/src/app/access-control/group-registry/group-form/members-list/members-list.component.html @@ -47,8 +47,12 @@ {{ePerson.eperson.id}} - {{ePerson.eperson.name}} + + + {{ dsoNameService.getName(ePerson.eperson) }} + + {{messagePrefix + '.table.email' | translate}}: {{ ePerson.eperson.email ? ePerson.eperson.email : '-' }}
{{messagePrefix + '.table.netid' | translate}}: {{ ePerson.eperson.netid ? ePerson.eperson.netid : '-' }} @@ -58,14 +62,14 @@
@@ -105,8 +109,12 @@ {{ePerson.eperson.id}} - {{ePerson.eperson.name}} + + + {{ dsoNameService.getName(ePerson.eperson) }} + + {{messagePrefix + '.table.email' | translate}}: {{ ePerson.eperson.email ? ePerson.eperson.email : '-' }}
{{messagePrefix + '.table.netid' | translate}}: {{ ePerson.eperson.netid ? ePerson.eperson.netid : '-' }} @@ -115,7 +123,7 @@
diff --git a/src/app/access-control/group-registry/group-form/members-list/members-list.component.spec.ts b/src/app/access-control/group-registry/group-form/members-list/members-list.component.spec.ts index 8d0ddf0a85..0375ec0d94 100644 --- a/src/app/access-control/group-registry/group-form/members-list/members-list.component.spec.ts +++ b/src/app/access-control/group-registry/group-form/members-list/members-list.component.spec.ts @@ -28,6 +28,8 @@ import { NotificationsServiceStub } from '../../../../shared/testing/notificatio import { RouterMock } from '../../../../shared/mocks/router.mock'; import { PaginationService } from '../../../../core/pagination/pagination.service'; import { PaginationServiceStub } from '../../../../shared/testing/pagination-service.stub'; +import { DSONameService } from '../../../../core/breadcrumbs/dso-name.service'; +import { DSONameServiceMock } from '../../../../shared/mocks/dso-name.service.mock'; describe('MembersListComponent', () => { let component: MembersListComponent; @@ -118,7 +120,7 @@ describe('MembersListComponent', () => { translateService = getMockTranslateService(); paginationService = new PaginationServiceStub(); - TestBed.configureTestingModule({ + return TestBed.configureTestingModule({ imports: [CommonModule, NgbModule, FormsModule, ReactiveFormsModule, BrowserModule, TranslateModule.forRoot({ loader: { @@ -135,6 +137,7 @@ describe('MembersListComponent', () => { { provide: FormBuilderService, useValue: builderService }, { provide: Router, useValue: new RouterMock() }, { provide: PaginationService, useValue: paginationService }, + { provide: DSONameService, useValue: new DSONameServiceMock() }, ], schemas: [NO_ERRORS_SCHEMA] }).compileComponents(); diff --git a/src/app/access-control/group-registry/group-form/members-list/members-list.component.ts b/src/app/access-control/group-registry/group-form/members-list/members-list.component.ts index 169d009d63..89c3bd4486 100644 --- a/src/app/access-control/group-registry/group-form/members-list/members-list.component.ts +++ b/src/app/access-control/group-registry/group-form/members-list/members-list.component.ts @@ -11,7 +11,7 @@ import { ObservedValueOf, } from 'rxjs'; import { defaultIfEmpty, map, mergeMap, switchMap, take } from 'rxjs/operators'; -import {buildPaginatedList, PaginatedList} from '../../../../core/data/paginated-list.model'; +import { buildPaginatedList, PaginatedList } from '../../../../core/data/paginated-list.model'; import { RemoteData } from '../../../../core/data/remote-data'; import { EPersonDataService } from '../../../../core/eperson/eperson-data.service'; import { GroupDataService } from '../../../../core/eperson/group-data.service'; @@ -19,12 +19,15 @@ import { EPerson } from '../../../../core/eperson/models/eperson.model'; import { Group } from '../../../../core/eperson/models/group.model'; import { getFirstSucceededRemoteData, - getFirstCompletedRemoteData, getAllCompletedRemoteData, getRemoteDataPayload + getFirstCompletedRemoteData, + getAllCompletedRemoteData, + getRemoteDataPayload } from '../../../../core/shared/operators'; import { NotificationsService } from '../../../../shared/notifications/notifications.service'; import { PaginationComponentOptions } from '../../../../shared/pagination/pagination-component-options.model'; -import {EpersonDtoModel} from '../../../../core/eperson/models/eperson-dto.model'; +import { EpersonDtoModel } from '../../../../core/eperson/models/eperson-dto.model'; import { PaginationService } from '../../../../core/pagination/pagination.service'; +import { DSONameService } from '../../../../core/breadcrumbs/dso-name.service'; /** * Keys to keep track of specific subscriptions @@ -100,7 +103,9 @@ export class MembersListComponent implements OnInit, OnDestroy { private notificationsService: NotificationsService, private formBuilder: FormBuilder, private paginationService: PaginationService, - private router: Router) { + private router: Router, + public dsoNameService: DSONameService, + ) { this.currentSearchQuery = ''; this.currentSearchScope = 'metadata'; } @@ -208,7 +213,7 @@ export class MembersListComponent implements OnInit, OnDestroy { this.groupDataService.getActiveGroup().pipe(take(1)).subscribe((activeGroup: Group) => { if (activeGroup != null) { const response = this.groupDataService.deleteMemberFromGroup(activeGroup, ePerson.eperson); - this.showNotifications('deleteMember', response, ePerson.eperson.name, activeGroup); + this.showNotifications('deleteMember', response, this.dsoNameService.getName(ePerson.eperson), activeGroup); } else { this.notificationsService.error(this.translateService.get(this.messagePrefix + '.notification.failure.noActiveGroup')); } @@ -224,7 +229,7 @@ export class MembersListComponent implements OnInit, OnDestroy { this.groupDataService.getActiveGroup().pipe(take(1)).subscribe((activeGroup: Group) => { if (activeGroup != null) { const response = this.groupDataService.addMemberToGroup(activeGroup, ePerson.eperson); - this.showNotifications('addMember', response, ePerson.eperson.name, activeGroup); + this.showNotifications('addMember', response, this.dsoNameService.getName(ePerson.eperson), activeGroup); } else { this.notificationsService.error(this.translateService.get(this.messagePrefix + '.notification.failure.noActiveGroup')); } diff --git a/src/app/access-control/group-registry/group-form/subgroup-list/subgroups-list.component.html b/src/app/access-control/group-registry/group-form/subgroup-list/subgroups-list.component.html index e68612c317..14a78c26b3 100644 --- a/src/app/access-control/group-registry/group-form/subgroup-list/subgroups-list.component.html +++ b/src/app/access-control/group-registry/group-form/subgroup-list/subgroups-list.component.html @@ -44,15 +44,19 @@ {{group.id}} - {{group.name}} - {{(group.object | async)?.payload?.name}} + + + {{ dsoNameService.getName(group) }} + + + {{ dsoNameService.getName((group.object | async)?.payload) }}
@@ -61,7 +65,7 @@
@@ -99,14 +103,18 @@ {{group.id}} - {{group.name}} - {{(group.object | async)?.payload?.name}} + + + {{ dsoNameService.getName(group) }} + + + {{ dsoNameService.getName((group.object | async)?.payload)}}
diff --git a/src/app/access-control/group-registry/group-form/subgroup-list/subgroups-list.component.spec.ts b/src/app/access-control/group-registry/group-form/subgroup-list/subgroups-list.component.spec.ts index 1ca6c88c5f..39f4c2c794 100644 --- a/src/app/access-control/group-registry/group-form/subgroup-list/subgroups-list.component.spec.ts +++ b/src/app/access-control/group-registry/group-form/subgroup-list/subgroups-list.component.spec.ts @@ -37,6 +37,8 @@ import { NotificationsServiceStub } from '../../../../shared/testing/notificatio import { map } from 'rxjs/operators'; import { PaginationService } from '../../../../core/pagination/pagination.service'; import { PaginationServiceStub } from '../../../../shared/testing/pagination-service.stub'; +import { DSONameService } from '../../../../core/breadcrumbs/dso-name.service'; +import { DSONameServiceMock } from '../../../../shared/mocks/dso-name.service.mock'; describe('SubgroupsListComponent', () => { let component: SubgroupsListComponent; @@ -116,6 +118,7 @@ describe('SubgroupsListComponent', () => { ], declarations: [SubgroupsListComponent], providers: [SubgroupsListComponent, + { provide: DSONameService, useValue: new DSONameServiceMock() }, { provide: GroupDataService, useValue: groupsDataServiceStub }, { provide: NotificationsService, useValue: new NotificationsServiceStub() }, { provide: FormBuilderService, useValue: builderService }, diff --git a/src/app/access-control/group-registry/group-form/subgroup-list/subgroups-list.component.ts b/src/app/access-control/group-registry/group-form/subgroup-list/subgroups-list.component.ts index 5f1700e07d..aa963ff65e 100644 --- a/src/app/access-control/group-registry/group-form/subgroup-list/subgroups-list.component.ts +++ b/src/app/access-control/group-registry/group-form/subgroup-list/subgroups-list.component.ts @@ -18,6 +18,7 @@ import { PaginationComponentOptions } from '../../../../shared/pagination/pagina import { NoContent } from '../../../../core/shared/NoContent.model'; import { PaginationService } from '../../../../core/pagination/pagination.service'; import { followLink } from '../../../../shared/utils/follow-link-config.model'; +import { DSONameService } from '../../../../core/breadcrumbs/dso-name.service'; /** * Keys to keep track of specific subscriptions @@ -88,7 +89,9 @@ export class SubgroupsListComponent implements OnInit, OnDestroy { private notificationsService: NotificationsService, private formBuilder: FormBuilder, private paginationService: PaginationService, - private router: Router) { + private router: Router, + public dsoNameService: DSONameService, + ) { this.currentSearchQuery = ''; } @@ -177,7 +180,7 @@ export class SubgroupsListComponent implements OnInit, OnDestroy { this.groupDataService.getActiveGroup().pipe(take(1)).subscribe((activeGroup: Group) => { if (activeGroup != null) { const response = this.groupDataService.deleteSubGroupFromGroup(activeGroup, subgroup); - this.showNotifications('deleteSubgroup', response, subgroup.name, activeGroup); + this.showNotifications('deleteSubgroup', response, this.dsoNameService.getName(subgroup), activeGroup); } else { this.notificationsService.error(this.translateService.get(this.messagePrefix + '.notification.failure.noActiveGroup')); } @@ -193,7 +196,7 @@ export class SubgroupsListComponent implements OnInit, OnDestroy { if (activeGroup != null) { if (activeGroup.uuid !== subgroup.uuid) { const response = this.groupDataService.addSubGroupToGroup(activeGroup, subgroup); - this.showNotifications('addSubgroup', response, subgroup.name, activeGroup); + this.showNotifications('addSubgroup', response, this.dsoNameService.getName(subgroup), activeGroup); } else { this.notificationsService.error(this.translateService.get(this.messagePrefix + '.notification.failure.subgroupToAddIsActiveGroup')); } diff --git a/src/app/access-control/group-registry/groups-registry.component.html b/src/app/access-control/group-registry/groups-registry.component.html index ebbd223599..4309304d28 100644 --- a/src/app/access-control/group-registry/groups-registry.component.html +++ b/src/app/access-control/group-registry/groups-registry.component.html @@ -56,8 +56,8 @@ {{groupDto.group.id}} - {{groupDto.group.name}} - {{(groupDto.group.object | async)?.payload?.name}} + {{ dsoNameService.getName(groupDto.group) }} + {{ dsoNameService.getName((groupDto.group.object | async)?.payload) }} {{groupDto.epersons?.totalElements + groupDto.subgroups?.totalElements}}
@@ -65,7 +65,7 @@ @@ -80,7 +80,7 @@
diff --git a/src/app/access-control/group-registry/groups-registry.component.spec.ts b/src/app/access-control/group-registry/groups-registry.component.spec.ts index 239939e70d..635ba727c2 100644 --- a/src/app/access-control/group-registry/groups-registry.component.spec.ts +++ b/src/app/access-control/group-registry/groups-registry.component.spec.ts @@ -32,8 +32,10 @@ import { PaginationService } from '../../core/pagination/pagination.service'; import { PaginationServiceStub } from '../../shared/testing/pagination-service.stub'; import { FeatureID } from '../../core/data/feature-authorization/feature-id'; import { NoContent } from '../../core/shared/NoContent.model'; +import { DSONameService } from '../../core/breadcrumbs/dso-name.service'; +import { DSONameServiceMock, UNDEFINED_NAME } from '../../shared/mocks/dso-name.service.mock'; -describe('GroupRegistryComponent', () => { +describe('GroupsRegistryComponent', () => { let component: GroupsRegistryComponent; let fixture: ComponentFixture; let ePersonDataServiceStub: any; @@ -160,7 +162,7 @@ describe('GroupRegistryComponent', () => { authorizationService = jasmine.createSpyObj('authorizationService', ['isAuthorized']); setIsAuthorized(true, true); paginationService = new PaginationServiceStub(); - TestBed.configureTestingModule({ + return TestBed.configureTestingModule({ imports: [CommonModule, NgbModule, FormsModule, ReactiveFormsModule, BrowserModule, TranslateModule.forRoot({ loader: { @@ -171,6 +173,7 @@ describe('GroupRegistryComponent', () => { ], declarations: [GroupsRegistryComponent], providers: [GroupsRegistryComponent, + { provide: DSONameService, useValue: new DSONameServiceMock() }, { provide: EPersonDataService, useValue: ePersonDataServiceStub }, { provide: GroupDataService, useValue: groupsDataServiceStub }, { provide: DSpaceObjectDataService, useValue: dsoDataServiceStub }, @@ -208,7 +211,7 @@ describe('GroupRegistryComponent', () => { it('should display community/collection name if present', () => { const collectionNamesFound = fixture.debugElement.queryAll(By.css('#groups tr td:nth-child(3)')); expect(collectionNamesFound.length).toEqual(2); - expect(collectionNamesFound[0].nativeElement.textContent).toEqual(''); + expect(collectionNamesFound[0].nativeElement.textContent).toEqual(UNDEFINED_NAME); expect(collectionNamesFound[1].nativeElement.textContent).toEqual('testgroupid2objectName'); }); diff --git a/src/app/access-control/group-registry/groups-registry.component.ts b/src/app/access-control/group-registry/groups-registry.component.ts index 70c9b22852..2eae6f3d12 100644 --- a/src/app/access-control/group-registry/groups-registry.component.ts +++ b/src/app/access-control/group-registry/groups-registry.component.ts @@ -37,6 +37,7 @@ import { PaginationComponentOptions } from '../../shared/pagination/pagination-c import { NoContent } from '../../core/shared/NoContent.model'; import { PaginationService } from '../../core/pagination/pagination.service'; import { followLink } from '../../shared/utils/follow-link-config.model'; +import { DSONameService } from '../../core/breadcrumbs/dso-name.service'; @Component({ selector: 'ds-groups-registry', @@ -104,7 +105,9 @@ export class GroupsRegistryComponent implements OnInit, OnDestroy { private router: Router, private authorizationService: AuthorizationDataService, private paginationService: PaginationService, - public requestService: RequestService) { + public requestService: RequestService, + public dsoNameService: DSONameService, + ) { this.currentSearchQuery = ''; this.searchForm = this.formBuilder.group(({ query: this.currentSearchQuery, @@ -201,10 +204,10 @@ export class GroupsRegistryComponent implements OnInit, OnDestroy { .subscribe((rd: RemoteData) => { if (rd.hasSucceeded) { this.deletedGroupsIds = [...this.deletedGroupsIds, group.group.id]; - this.notificationsService.success(this.translateService.get(this.messagePrefix + 'notification.deleted.success', { name: group.group.name })); + this.notificationsService.success(this.translateService.get(this.messagePrefix + 'notification.deleted.success', { name: this.dsoNameService.getName(group.group) })); } else { this.notificationsService.error( - this.translateService.get(this.messagePrefix + 'notification.deleted.failure.title', { name: group.group.name }), + this.translateService.get(this.messagePrefix + 'notification.deleted.failure.title', { name: this.dsoNameService.getName(group.group) }), this.translateService.get(this.messagePrefix + 'notification.deleted.failure.content', { cause: rd.errorMessage })); } }); diff --git a/src/app/admin/admin-search-page/admin-search-results/admin-search-result-grid-element/item-search-result/item-admin-search-result-grid-element.component.ts b/src/app/admin/admin-search-page/admin-search-results/admin-search-result-grid-element/item-search-result/item-admin-search-result-grid-element.component.ts index 1ab8fee8c2..dab6694f36 100644 --- a/src/app/admin/admin-search-page/admin-search-results/admin-search-result-grid-element/item-search-result/item-admin-search-result-grid-element.component.ts +++ b/src/app/admin/admin-search-page/admin-search-results/admin-search-result-grid-element/item-search-result/item-admin-search-result-grid-element.component.ts @@ -13,6 +13,7 @@ import { BitstreamDataService } from '../../../../../core/data/bitstream-data.se import { GenericConstructor } from '../../../../../core/shared/generic-constructor'; import { ListableObjectDirective } from '../../../../../shared/object-collection/shared/listable-object/listable-object.directive'; import { ThemeService } from '../../../../../shared/theme-support/theme.service'; +import { DSONameService } from '../../../../../core/breadcrumbs/dso-name.service'; @listableObjectComponent(ItemSearchResult, ViewMode.GridElement, Context.AdminSearch) @Component({ @@ -28,12 +29,14 @@ export class ItemAdminSearchResultGridElementComponent extends SearchResultGridE @ViewChild('badges', { static: true }) badges: ElementRef; @ViewChild('buttons', { static: true }) buttons: ElementRef; - constructor(protected truncatableService: TruncatableService, - protected bitstreamDataService: BitstreamDataService, - private themeService: ThemeService, - private componentFactoryResolver: ComponentFactoryResolver + constructor( + public dsoNameService: DSONameService, + protected truncatableService: TruncatableService, + protected bitstreamDataService: BitstreamDataService, + private themeService: ThemeService, + private componentFactoryResolver: ComponentFactoryResolver, ) { - super(truncatableService, bitstreamDataService); + super(dsoNameService, truncatableService, bitstreamDataService); } /** diff --git a/src/app/admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-grid-element/workflow-item/workflow-item-search-result-admin-workflow-grid-element.component.ts b/src/app/admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-grid-element/workflow-item/workflow-item-search-result-admin-workflow-grid-element.component.ts index 68f10916d5..fd9d21e227 100644 --- a/src/app/admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-grid-element/workflow-item/workflow-item-search-result-admin-workflow-grid-element.component.ts +++ b/src/app/admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-grid-element/workflow-item/workflow-item-search-result-admin-workflow-grid-element.component.ts @@ -23,6 +23,7 @@ import { import { take } from 'rxjs/operators'; import { WorkflowItemSearchResult } from '../../../../../shared/object-collection/shared/workflow-item-search-result.model'; import { ThemeService } from '../../../../../shared/theme-support/theme.service'; +import { DSONameService } from '../../../../../core/breadcrumbs/dso-name.service'; @listableObjectComponent(WorkflowItemSearchResult, ViewMode.GridElement, Context.AdminWorkflowSearch) @Component({ @@ -55,13 +56,14 @@ export class WorkflowItemSearchResultAdminWorkflowGridElementComponent extends S public item$: Observable; constructor( + public dsoNameService: DSONameService, private componentFactoryResolver: ComponentFactoryResolver, private linkService: LinkService, protected truncatableService: TruncatableService, private themeService: ThemeService, protected bitstreamDataService: BitstreamDataService ) { - super(truncatableService, bitstreamDataService); + super(dsoNameService, truncatableService, bitstreamDataService); } /** diff --git a/src/app/admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-list-element/workflow-item/workflow-item-search-result-admin-workflow-list-element.component.ts b/src/app/admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-list-element/workflow-item/workflow-item-search-result-admin-workflow-list-element.component.ts index 3bc75de415..86ae8cf9ac 100644 --- a/src/app/admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-list-element/workflow-item/workflow-item-search-result-admin-workflow-list-element.component.ts +++ b/src/app/admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-list-element/workflow-item/workflow-item-search-result-admin-workflow-list-element.component.ts @@ -33,7 +33,7 @@ export class WorkflowItemSearchResultAdminWorkflowListElementComponent extends S constructor(private linkService: LinkService, protected truncatableService: TruncatableService, - protected dsoNameService: DSONameService, + public dsoNameService: DSONameService, @Inject(APP_CONFIG) protected appConfig: AppConfig ) { super(truncatableService, dsoNameService, appConfig); diff --git a/src/app/bitstream-page/edit-bitstream-page/edit-bitstream-page.component.html b/src/app/bitstream-page/edit-bitstream-page/edit-bitstream-page.component.html index 6454198340..65e293e282 100644 --- a/src/app/bitstream-page/edit-bitstream-page/edit-bitstream-page.component.html +++ b/src/app/bitstream-page/edit-bitstream-page/edit-bitstream-page.component.html @@ -8,7 +8,7 @@
-

{{bitstreamRD?.payload?.name}} ({{bitstreamRD?.payload?.sizeBytes | dsFileSize}})

+

{{dsoNameService.getName(bitstreamRD?.payload)}} ({{bitstreamRD?.payload?.sizeBytes | dsFileSize}})

diff --git a/src/app/bitstream-page/edit-bitstream-page/edit-bitstream-page.component.ts b/src/app/bitstream-page/edit-bitstream-page/edit-bitstream-page.component.ts index 9a59df4b95..a79ff68b9e 100644 --- a/src/app/bitstream-page/edit-bitstream-page/edit-bitstream-page.component.ts +++ b/src/app/bitstream-page/edit-bitstream-page/edit-bitstream-page.component.ts @@ -395,7 +395,7 @@ export class EditBitstreamPageComponent implements OnInit, OnDestroy { private formService: DynamicFormService, private translate: TranslateService, private bitstreamService: BitstreamDataService, - private dsoNameService: DSONameService, + public dsoNameService: DSONameService, private notificationsService: NotificationsService, private bitstreamFormatService: BitstreamFormatDataService) { } diff --git a/src/app/browse-by/browse-by-date-page/browse-by-date-page.component.ts b/src/app/browse-by/browse-by-date-page/browse-by-date-page.component.ts index c4a67349a5..e6717ceb67 100644 --- a/src/app/browse-by/browse-by-date-page/browse-by-date-page.component.ts +++ b/src/app/browse-by/browse-by-date-page/browse-by-date-page.component.ts @@ -17,6 +17,7 @@ import { PaginationComponentOptions } from '../../shared/pagination/pagination-c import { SortDirection, SortOptions } from '../../core/cache/models/sort-options.model'; import { isValidDate } from '../../shared/date.util'; import { AppConfig, APP_CONFIG } from '../../../config/app-config.interface'; +import { DSONameService } from '../../core/breadcrumbs/dso-name.service'; @Component({ selector: 'ds-browse-by-date-page', @@ -41,8 +42,10 @@ export class BrowseByDatePageComponent extends BrowseByMetadataPageComponent { protected router: Router, protected paginationService: PaginationService, protected cdRef: ChangeDetectorRef, - @Inject(APP_CONFIG) public appConfig: AppConfig) { - super(route, browseService, dsoService, paginationService, router, appConfig); + @Inject(APP_CONFIG) public appConfig: AppConfig, + public dsoNameService: DSONameService, + ) { + super(route, browseService, dsoService, paginationService, router, appConfig, dsoNameService); } ngOnInit(): void { diff --git a/src/app/browse-by/browse-by-guard.spec.ts b/src/app/browse-by/browse-by-guard.spec.ts index fc483d87e2..671e098762 100644 --- a/src/app/browse-by/browse-by-guard.spec.ts +++ b/src/app/browse-by/browse-by-guard.spec.ts @@ -1,10 +1,11 @@ import { first } from 'rxjs/operators'; import { BrowseByGuard } from './browse-by-guard'; import { of as observableOf } from 'rxjs'; -import { BrowseDefinitionDataService } from '../core/browse/browse-definition-data.service'; import { createSuccessfulRemoteDataObject$ } from '../shared/remote-data.utils'; import { BrowseDefinition } from '../core/shared/browse-definition.model'; import { BrowseByDataType } from './browse-by-switcher/browse-by-decorator'; +import { DSONameServiceMock } from '../shared/mocks/dso-name.service.mock'; +import { DSONameService } from '../core/breadcrumbs/dso-name.service'; describe('BrowseByGuard', () => { describe('canActivate', () => { @@ -34,7 +35,7 @@ describe('BrowseByGuard', () => { findById: () => createSuccessfulRemoteDataObject$(browseDefinition) }; - guard = new BrowseByGuard(dsoService, translateService, browseDefinitionService); + guard = new BrowseByGuard(dsoService, translateService, browseDefinitionService, new DSONameServiceMock() as DSONameService); }); it('should return true, and sets up the data correctly, with a scope and value', () => { diff --git a/src/app/browse-by/browse-by-guard.ts b/src/app/browse-by/browse-by-guard.ts index e4582cb77a..bf78a3c39f 100644 --- a/src/app/browse-by/browse-by-guard.ts +++ b/src/app/browse-by/browse-by-guard.ts @@ -3,11 +3,13 @@ import { Injectable } from '@angular/core'; import { DSpaceObjectDataService } from '../core/data/dspace-object-data.service'; import { hasNoValue, hasValue } from '../shared/empty.util'; import { map, switchMap } from 'rxjs/operators'; -import { getFirstSucceededRemoteData, getFirstSucceededRemoteDataPayload } from '../core/shared/operators'; +import { getFirstSucceededRemoteDataPayload } from '../core/shared/operators'; import { TranslateService } from '@ngx-translate/core'; import { Observable, of as observableOf } from 'rxjs'; import { BrowseDefinitionDataService } from '../core/browse/browse-definition-data.service'; import { BrowseDefinition } from '../core/shared/browse-definition.model'; +import { DSONameService } from '../core/breadcrumbs/dso-name.service'; +import { DSpaceObject } from '../core/shared/dspace-object.model'; @Injectable() /** @@ -17,7 +19,9 @@ export class BrowseByGuard implements CanActivate { constructor(protected dsoService: DSpaceObjectDataService, protected translate: TranslateService, - protected browseDefinitionService: BrowseDefinitionDataService) { + protected browseDefinitionService: BrowseDefinitionDataService, + protected dsoNameService: DSONameService, + ) { } canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) { @@ -31,14 +35,14 @@ export class BrowseByGuard implements CanActivate { } const scope = route.queryParams.scope; const value = route.queryParams.value; - const metadataTranslated = this.translate.instant('browse.metadata.' + id); + const metadataTranslated = this.translate.instant(`browse.metadata.${id}`); return browseDefinition$.pipe( - switchMap((browseDefinition) => { + switchMap((browseDefinition: BrowseDefinition) => { if (hasValue(scope)) { - const dsoAndMetadata$ = this.dsoService.findById(scope).pipe(getFirstSucceededRemoteData()); - return dsoAndMetadata$.pipe( - map((dsoRD) => { - const name = dsoRD.payload.name; + const dso$: Observable = this.dsoService.findById(scope).pipe(getFirstSucceededRemoteDataPayload()); + return dso$.pipe( + map((dso: DSpaceObject) => { + const name = this.dsoNameService.getName(dso); route.data = this.createData(title, id, browseDefinition, name, metadataTranslated, value, route); return true; }) diff --git a/src/app/browse-by/browse-by-metadata-page/browse-by-metadata-page.component.html b/src/app/browse-by/browse-by-metadata-page/browse-by-metadata-page.component.html index 227fa8aa78..6b56900b6a 100644 --- a/src/app/browse-by/browse-by-metadata-page/browse-by-metadata-page.component.html +++ b/src/app/browse-by/browse-by-metadata-page/browse-by-metadata-page.component.html @@ -3,7 +3,7 @@
- + + [name]="dsoNameService.getName(collection)">
-

{{'collection.create.sub-head' | translate:{ parent: (parentRD$| async)?.payload.name } }}

+

{{'collection.create.sub-head' | translate:{ parent: dsoNameService.getName((parentRD$| async)?.payload) } }}

{ let comp: CreateCollectionPageComponent; let fixture: ComponentFixture; beforeEach(waitForAsync(() => { - TestBed.configureTestingModule({ + return TestBed.configureTestingModule({ imports: [TranslateModule.forRoot(), SharedModule, CommonModule, RouterTestingModule], declarations: [CreateCollectionPageComponent], providers: [ + { provide: DSONameService, useValue: new DSONameServiceMock() }, { provide: CollectionDataService, useValue: {} }, { provide: CommunityDataService, diff --git a/src/app/collection-page/create-collection-page/create-collection-page.component.ts b/src/app/collection-page/create-collection-page/create-collection-page.component.ts index a938b37ce1..a8cf594c3b 100644 --- a/src/app/collection-page/create-collection-page/create-collection-page.component.ts +++ b/src/app/collection-page/create-collection-page/create-collection-page.component.ts @@ -8,6 +8,7 @@ import { CollectionDataService } from '../../core/data/collection-data.service'; import { NotificationsService } from '../../shared/notifications/notifications.service'; import { TranslateService } from '@ngx-translate/core'; import { RequestService } from '../../core/data/request.service'; +import { DSONameService } from '../../core/breadcrumbs/dso-name.service'; /** * Component that represents the page where a user can create a new Collection @@ -22,6 +23,7 @@ export class CreateCollectionPageComponent extends CreateComColPageComponent
-

{{ 'collection.delete.text' | translate:{ dso: dso.name } }}

+

{{ 'collection.delete.text' | translate:{ dso: dsoNameService.getName(dso) } }}

diff --git a/src/app/collection-page/edit-item-template-page/edit-item-template-page.component.ts b/src/app/collection-page/edit-item-template-page/edit-item-template-page.component.ts index 5d29eb7f73..6425996fd2 100644 --- a/src/app/collection-page/edit-item-template-page/edit-item-template-page.component.ts +++ b/src/app/collection-page/edit-item-template-page/edit-item-template-page.component.ts @@ -9,6 +9,7 @@ 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 { DSONameService } from '../../core/breadcrumbs/dso-name.service'; @Component({ selector: 'ds-edit-item-template-page', @@ -35,8 +36,11 @@ export class EditItemTemplatePageComponent implements OnInit { */ AlertTypeEnum = AlertType; - constructor(protected route: ActivatedRoute, - public itemTemplateService: ItemTemplateDataService) { + constructor( + protected route: ActivatedRoute, + public itemTemplateService: ItemTemplateDataService, + public dsoNameService: DSONameService, + ) { } ngOnInit(): void { diff --git a/src/app/collection-page/edit-item-template-page/item-template-page.resolver.spec.ts b/src/app/collection-page/edit-item-template-page/item-template-page.resolver.spec.ts index 2712a194c0..95f0d888e4 100644 --- a/src/app/collection-page/edit-item-template-page/item-template-page.resolver.spec.ts +++ b/src/app/collection-page/edit-item-template-page/item-template-page.resolver.spec.ts @@ -2,18 +2,22 @@ import { first } from 'rxjs/operators'; import { ItemTemplatePageResolver } from './item-template-page.resolver'; import { createSuccessfulRemoteDataObject$ } from '../../shared/remote-data.utils'; +import { DSONameService } from '../../core/breadcrumbs/dso-name.service'; +import { DSONameServiceMock } from '../../shared/mocks/dso-name.service.mock'; describe('ItemTemplatePageResolver', () => { describe('resolve', () => { let resolver: ItemTemplatePageResolver; let itemTemplateService: any; + let dsoNameService: DSONameServiceMock; const uuid = '1234-65487-12354-1235'; beforeEach(() => { itemTemplateService = { findByCollectionID: (id: string) => createSuccessfulRemoteDataObject$({ id }) }; - resolver = new ItemTemplatePageResolver(itemTemplateService); + dsoNameService = new DSONameServiceMock(); + resolver = new ItemTemplatePageResolver(dsoNameService as DSONameService, itemTemplateService); }); it('should resolve an item template with the correct id', (done) => { diff --git a/src/app/collection-page/edit-item-template-page/item-template-page.resolver.ts b/src/app/collection-page/edit-item-template-page/item-template-page.resolver.ts index 719a04196f..586617c44c 100644 --- a/src/app/collection-page/edit-item-template-page/item-template-page.resolver.ts +++ b/src/app/collection-page/edit-item-template-page/item-template-page.resolver.ts @@ -6,13 +6,17 @@ import { ItemTemplateDataService } from '../../core/data/item-template-data.serv import { Observable } from 'rxjs'; import { followLink } from '../../shared/utils/follow-link-config.model'; import { getFirstCompletedRemoteData } from '../../core/shared/operators'; +import { DSONameService } from '../../core/breadcrumbs/dso-name.service'; /** * This class represents a resolver that requests a specific collection's item template before the route is activated */ @Injectable() export class ItemTemplatePageResolver implements Resolve> { - constructor(private itemTemplateService: ItemTemplateDataService) { + constructor( + public dsoNameService: DSONameService, + private itemTemplateService: ItemTemplateDataService, + ) { } /** diff --git a/src/app/community-list-page/community-list/community-list.component.html b/src/app/community-list-page/community-list/community-list.component.html index 821cb58473..611d44ac99 100644 --- a/src/app/community-list-page/community-list/community-list.component.html +++ b/src/app/community-list-page/community-list/community-list.component.html @@ -25,8 +25,8 @@ class="example-tree-node expandable-node"> @@ -65,12 +65,11 @@ class="example-tree-node childless-node"> diff --git a/src/app/community-list-page/community-list/community-list.component.ts b/src/app/community-list-page/community-list/community-list.component.ts index 556387da25..5b2f930813 100644 --- a/src/app/community-list-page/community-list/community-list.component.ts +++ b/src/app/community-list-page/community-list/community-list.component.ts @@ -7,6 +7,7 @@ import { FlatTreeControl } from '@angular/cdk/tree'; import { isEmpty } from '../../shared/empty.util'; import { FlatNode } from '../flat-node.model'; import { FindListOptions } from '../../core/data/find-list-options.model'; +import { DSONameService } from '../../core/breadcrumbs/dso-name.service'; /** * A tree-structured list of nodes representing the communities, their subCommunities and collections. @@ -32,7 +33,10 @@ export class CommunityListComponent implements OnInit, OnDestroy { paginationConfig: FindListOptions; - constructor(private communityListService: CommunityListService) { + constructor( + protected communityListService: CommunityListService, + public dsoNameService: DSONameService, + ) { this.paginationConfig = new FindListOptions(); this.paginationConfig.elementsPerPage = 2; this.paginationConfig.currentPage = 1; diff --git a/src/app/community-page/community-page.component.html b/src/app/community-page/community-page.component.html index 368fec08a5..a7e73c9a0a 100644 --- a/src/app/community-page/community-page.component.html +++ b/src/app/community-page/community-page.component.html @@ -5,7 +5,7 @@
- + diff --git a/src/app/community-page/community-page.component.ts b/src/app/community-page/community-page.component.ts index b1a0cfc946..a5bbff3cee 100644 --- a/src/app/community-page/community-page.component.ts +++ b/src/app/community-page/community-page.component.ts @@ -19,6 +19,7 @@ import { AuthorizationDataService } from '../core/data/feature-authorization/aut import { FeatureID } from '../core/data/feature-authorization/feature-id'; import { getCommunityPageRoute } from './community-page-routing-paths'; import { redirectOn4xx } from '../core/shared/authorized.operators'; +import { DSONameService } from '../core/breadcrumbs/dso-name.service'; @Component({ selector: 'ds-community-page', @@ -57,7 +58,8 @@ export class CommunityPageComponent implements OnInit { private route: ActivatedRoute, private router: Router, private authService: AuthService, - private authorizationDataService: AuthorizationDataService + private authorizationDataService: AuthorizationDataService, + public dsoNameService: DSONameService, ) { } diff --git a/src/app/community-page/create-community-page/create-community-page.component.html b/src/app/community-page/create-community-page/create-community-page.component.html index 71a580b0aa..57039040c2 100644 --- a/src/app/community-page/create-community-page/create-community-page.component.html +++ b/src/app/community-page/create-community-page/create-community-page.component.html @@ -3,7 +3,7 @@
-

{{ 'community.create.sub-head' | translate:{ parent: parent.name } }}

+

{{ 'community.create.sub-head' | translate:{ parent: dsoNameService.getName(parent) } }}

diff --git a/src/app/community-page/create-community-page/create-community-page.component.ts b/src/app/community-page/create-community-page/create-community-page.component.ts index b332fad100..eea0908388 100644 --- a/src/app/community-page/create-community-page/create-community-page.component.ts +++ b/src/app/community-page/create-community-page/create-community-page.component.ts @@ -7,6 +7,7 @@ import { CreateComColPageComponent } from '../../shared/comcol/comcol-forms/crea import { NotificationsService } from '../../shared/notifications/notifications.service'; import { TranslateService } from '@ngx-translate/core'; import { RequestService } from '../../core/data/request.service'; +import { DSONameService } from '../../core/breadcrumbs/dso-name.service'; /** * Component that represents the page where a user can create a new Community @@ -22,12 +23,13 @@ export class CreateCommunityPageComponent extends CreateComColPageComponent
-

{{ 'community.delete.text' | translate:{ dso: dso.name } }}

+

{{ 'community.delete.text' | translate:{ dso: dsoNameService.getName(dso) } }}

+

{{'item.edit.item-mapper.head' | translate}}

diff --git a/src/app/item-page/edit-item-page/item-move/item-move.component.html b/src/app/item-page/edit-item-page/item-move/item-move.component.html index 8cb8d1c1c4..589aac655f 100644 --- a/src/app/item-page/edit-item-page/item-move/item-move.component.html +++ b/src/app/item-page/edit-item-page/item-move/item-move.component.html @@ -20,9 +20,10 @@

+

{{'item.edit.move.inheritpolicies.description' | translate}} diff --git a/src/app/item-page/edit-item-page/item-move/item-move.component.ts b/src/app/item-page/edit-item-page/item-move/item-move.component.ts index b7ab761fe5..df2b24ea7c 100644 --- a/src/app/item-page/edit-item-page/item-move/item-move.component.ts +++ b/src/app/item-page/edit-item-page/item-move/item-move.component.ts @@ -16,6 +16,7 @@ import { SearchService } from '../../../core/shared/search/search.service'; import { getItemEditRoute, getItemPageRoute } from '../../item-page-routing-paths'; import { followLink } from '../../../shared/utils/follow-link-config.model'; import { RequestService } from '../../../core/data/request.service'; +import { DSONameService } from '../../../core/breadcrumbs/dso-name.service'; @Component({ selector: 'ds-item-move', @@ -57,6 +58,7 @@ export class ItemMoveComponent implements OnInit { private searchService: SearchService, private translateService: TranslateService, private requestService: RequestService, + protected dsoNameService: DSONameService, ) {} ngOnInit(): void { @@ -88,7 +90,7 @@ export class ItemMoveComponent implements OnInit { */ selectDso(data: any): void { this.selectedCollection = data; - this.selectedCollectionName = data.name; + this.selectedCollectionName = this.dsoNameService.getName(data); this.canSubmit = true; } diff --git a/src/app/item-page/field-components/collections/collections.component.html b/src/app/item-page/field-components/collections/collections.component.html index ac68ae1c31..27ebb41d61 100644 --- a/src/app/item-page/field-components/collections/collections.component.html +++ b/src/app/item-page/field-components/collections/collections.component.html @@ -1,7 +1,7 @@

diff --git a/src/app/item-page/field-components/collections/collections.component.spec.ts b/src/app/item-page/field-components/collections/collections.component.spec.ts index c293109ba6..8ea5219308 100644 --- a/src/app/item-page/field-components/collections/collections.component.spec.ts +++ b/src/app/item-page/field-components/collections/collections.component.spec.ts @@ -12,6 +12,8 @@ import { CollectionsComponent } from './collections.component'; import { buildPaginatedList, PaginatedList } from '../../../core/data/paginated-list.model'; import { PageInfo } from '../../../core/shared/page-info.model'; import { FindListOptions } from '../../../core/data/find-list-options.model'; +import { DSONameService } from '../../../core/breadcrumbs/dso-name.service'; +import { DSONameServiceMock } from '../../../shared/mocks/dso-name.service.mock'; const createMockCollection = (id: string) => Object.assign(new Collection(), { id: id, @@ -46,6 +48,7 @@ describe('CollectionsComponent', () => { imports: [TranslateModule.forRoot()], declarations: [ CollectionsComponent ], providers: [ + { provide: DSONameService, useValue: new DSONameServiceMock() }, { provide: RemoteDataBuildService, useValue: getMockRemoteDataBuildService()}, { provide: CollectionDataService, useValue: collectionDataService }, ], diff --git a/src/app/item-page/field-components/collections/collections.component.ts b/src/app/item-page/field-components/collections/collections.component.ts index 6c7053b25d..78d7c985a3 100644 --- a/src/app/item-page/field-components/collections/collections.component.ts +++ b/src/app/item-page/field-components/collections/collections.component.ts @@ -1,4 +1,4 @@ -import { Component, Input, OnInit } from '@angular/core'; +import { Component, Input, OnInit, ChangeDetectorRef } from '@angular/core'; import { BehaviorSubject, combineLatest, Observable } from 'rxjs'; import {map, scan, startWith, switchMap, tap, withLatestFrom} from 'rxjs/operators'; import { CollectionDataService } from '../../../core/data/collection-data.service'; @@ -14,6 +14,7 @@ import { getPaginatedListPayload, } from '../../../core/shared/operators'; import { FindListOptions } from '../../../core/data/find-list-options.model'; +import { DSONameService } from '../../../core/breadcrumbs/dso-name.service'; /** * This component renders the parent collections section of the item @@ -65,8 +66,11 @@ export class CollectionsComponent implements OnInit { */ collections$: Observable; - constructor(private cds: CollectionDataService) { - + constructor( + private cds: CollectionDataService, + public dsoNameService: DSONameService, + protected cdr: ChangeDetectorRef, + ) { } ngOnInit(): void { @@ -114,6 +118,7 @@ export class CollectionsComponent implements OnInit { return [owningCollection, ...mappedCollections].filter(collection => hasValue(collection)); }), ); + this.cdr.detectChanges(); } handleLoadMore() { diff --git a/src/app/item-page/full/field-components/file-section/full-file-section.component.html b/src/app/item-page/full/field-components/file-section/full-file-section.component.html index 33acd6650b..3290cd638e 100644 --- a/src/app/item-page/full/field-components/file-section/full-file-section.component.html +++ b/src/app/item-page/full/field-components/file-section/full-file-section.component.html @@ -18,7 +18,7 @@
{{"item.page.filesection.name" | translate}}
-
{{file.name}}
+
{{ dsoNameService.getName(file) }}
{{"item.page.filesection.size" | translate}}
{{(file.sizeBytes) | dsFileSize }}
@@ -27,9 +27,10 @@
{{"item.page.filesection.format" | translate}}
{{(file.format | async)?.payload?.description}}
- +
{{"item.page.filesection.description" | translate}}
{{file.firstMetadataValue("dc.description")}}
+
@@ -60,7 +61,7 @@
{{"item.page.filesection.name" | translate}}
-
{{file.name}}
+
{{ dsoNameService.getName(file) }}
{{"item.page.filesection.size" | translate}}
{{(file.sizeBytes) | dsFileSize }}
diff --git a/src/app/item-page/full/field-components/file-section/full-file-section.component.ts b/src/app/item-page/full/field-components/file-section/full-file-section.component.ts index e21c1a32eb..7ef23cf823 100644 --- a/src/app/item-page/full/field-components/file-section/full-file-section.component.ts +++ b/src/app/item-page/full/field-components/file-section/full-file-section.component.ts @@ -1,4 +1,4 @@ -import { Component, Input, OnInit } from '@angular/core'; +import { Component, Input, OnDestroy, OnInit } from '@angular/core'; import { Observable } from 'rxjs'; import { BitstreamDataService } from '../../../../core/data/bitstream-data.service'; @@ -14,6 +14,7 @@ import { NotificationsService } from '../../../../shared/notifications/notificat import { TranslateService } from '@ngx-translate/core'; import { hasValue, isEmpty } from '../../../../shared/empty.util'; import { PaginationService } from '../../../../core/pagination/pagination.service'; +import { DSONameService } from '../../../../core/breadcrumbs/dso-name.service'; /** * This component renders the file section of the item @@ -25,7 +26,7 @@ import { PaginationService } from '../../../../core/pagination/pagination.servic styleUrls: ['./full-file-section.component.scss'], templateUrl: './full-file-section.component.html' }) -export class FullFileSectionComponent extends FileSectionComponent implements OnInit { +export class FullFileSectionComponent extends FileSectionComponent implements OnDestroy, OnInit { @Input() item: Item; @@ -51,9 +52,10 @@ export class FullFileSectionComponent extends FileSectionComponent implements On bitstreamDataService: BitstreamDataService, protected notificationsService: NotificationsService, protected translateService: TranslateService, - protected paginationService: PaginationService + protected paginationService: PaginationService, + public dsoNameService: DSONameService, ) { - super(bitstreamDataService, notificationsService, translateService); + super(bitstreamDataService, notificationsService, translateService, dsoNameService); } ngOnInit(): void { diff --git a/src/app/item-page/media-viewer/media-viewer-video/media-viewer-video.component.html b/src/app/item-page/media-viewer/media-viewer-video/media-viewer-video.component.html index a4493e36fc..7e5e67c327 100644 --- a/src/app/item-page/media-viewer/media-viewer-video/media-viewer-video.component.html +++ b/src/app/item-page/media-viewer/media-viewer-video/media-viewer-video.component.html @@ -40,7 +40,7 @@ class="list-element" (click)="selectedMedia(indexOfelement)" > - {{ item.bitstream.name }} + {{ dsoNameService.getName(item.bitstream) }}
diff --git a/src/app/item-page/media-viewer/media-viewer-video/media-viewer-video.component.ts b/src/app/item-page/media-viewer/media-viewer-video/media-viewer-video.component.ts index 4c578a51bb..243afa31fb 100644 --- a/src/app/item-page/media-viewer/media-viewer-video/media-viewer-video.component.ts +++ b/src/app/item-page/media-viewer/media-viewer-video/media-viewer-video.component.ts @@ -1,5 +1,6 @@ import { Component, Input, OnInit } from '@angular/core'; import { MediaViewerItem } from '../../../core/shared/media-viewer-item.model'; +import { DSONameService } from '../../../core/breadcrumbs/dso-name.service'; /** * This componenet renders a video viewer and playlist for the media viewer @@ -24,6 +25,11 @@ export class MediaViewerVideoComponent implements OnInit { replacementThumbnail: string; + constructor( + public dsoNameService: DSONameService, + ) { + } + ngOnInit() { this.isCollapsed = false; this.filteredMedias = this.medias.filter( diff --git a/src/app/item-page/simple/field-components/file-section/file-section.component.html b/src/app/item-page/simple/field-components/file-section/file-section.component.html index 9d61b0a0e0..eb0ee616fe 100644 --- a/src/app/item-page/simple/field-components/file-section/file-section.component.html +++ b/src/app/item-page/simple/field-components/file-section/file-section.component.html @@ -2,7 +2,7 @@
- {{file?.name}} + {{ dsoNameService.getName(file) }} ({{(file?.sizeBytes) | dsFileSize }}) diff --git a/src/app/item-page/simple/field-components/file-section/file-section.component.ts b/src/app/item-page/simple/field-components/file-section/file-section.component.ts index d28b579996..7dd75d3bca 100644 --- a/src/app/item-page/simple/field-components/file-section/file-section.component.ts +++ b/src/app/item-page/simple/field-components/file-section/file-section.component.ts @@ -10,6 +10,7 @@ import { PaginatedList } from '../../../../core/data/paginated-list.model'; import { NotificationsService } from '../../../../shared/notifications/notifications.service'; import { TranslateService } from '@ngx-translate/core'; import { getFirstCompletedRemoteData } from '../../../../core/shared/operators'; +import { DSONameService } from '../../../../core/breadcrumbs/dso-name.service'; /** * This component renders the file section of the item @@ -40,7 +41,8 @@ export class FileSectionComponent implements OnInit { constructor( protected bitstreamDataService: BitstreamDataService, protected notificationsService: NotificationsService, - protected translateService: TranslateService + protected translateService: TranslateService, + public dsoNameService: DSONameService, ) { } diff --git a/src/app/process-page/overview/process-overview.component.ts b/src/app/process-page/overview/process-overview.component.ts index 1ca29693cb..7fa3b12dac 100644 --- a/src/app/process-page/overview/process-overview.component.ts +++ b/src/app/process-page/overview/process-overview.component.ts @@ -14,6 +14,7 @@ import { FindListOptions } from '../../core/data/find-list-options.model'; import { ProcessBulkDeleteService } from './process-bulk-delete.service'; import { NgbModal } from '@ng-bootstrap/ng-bootstrap'; import { hasValue } from '../../shared/empty.util'; +import { DSONameService } from '../../core/breadcrumbs/dso-name.service'; @Component({ selector: 'ds-process-overview', @@ -59,6 +60,7 @@ export class ProcessOverviewComponent implements OnInit, OnDestroy { protected ePersonService: EPersonDataService, protected modalService: NgbModal, public processBulkDeleteService: ProcessBulkDeleteService, + protected dsoNameService: DSONameService, ) { } @@ -83,7 +85,7 @@ export class ProcessOverviewComponent implements OnInit, OnDestroy { getEpersonName(id: string): Observable { return this.ePersonService.findById(id).pipe( getFirstSucceededRemoteDataPayload(), - map((eperson: EPerson) => eperson.name) + map((eperson: EPerson) => this.dsoNameService.getName(eperson)), ); } diff --git a/src/app/profile-page/profile-claim-item-modal/profile-claim-item-modal.component.html b/src/app/profile-page/profile-claim-item-modal/profile-claim-item-modal.component.html index eec9f437f1..a5bbb38d02 100644 --- a/src/app/profile-page/profile-claim-item-modal/profile-claim-item-modal.component.html +++ b/src/app/profile-page/profile-claim-item-modal/profile-claim-item-modal.component.html @@ -12,7 +12,7 @@
- {{group.name}} + {{ dsoNameService.getName(group) }}
diff --git a/src/app/shared/comcol/comcol-forms/edit-comcol-page/comcol-role/comcol-role.component.spec.ts b/src/app/shared/comcol/comcol-forms/edit-comcol-page/comcol-role/comcol-role.component.spec.ts index 59fc95b67f..00efc3ccaa 100644 --- a/src/app/shared/comcol/comcol-forms/edit-comcol-page/comcol-role/comcol-role.component.spec.ts +++ b/src/app/shared/comcol/comcol-forms/edit-comcol-page/comcol-role/comcol-role.component.spec.ts @@ -12,6 +12,8 @@ import { NoopAnimationsModule } from '@angular/platform-browser/animations'; import { ComcolModule } from '../../../comcol.module'; import { NotificationsService } from '../../../../notifications/notifications.service'; import { NotificationsServiceStub } from '../../../../testing/notifications-service.stub'; +import { DSONameService } from '../../../../../core/breadcrumbs/dso-name.service'; +import { DSONameServiceMock } from '../../../../mocks/dso-name.service.mock'; describe('ComcolRoleComponent', () => { @@ -41,6 +43,7 @@ describe('ComcolRoleComponent', () => { NoopAnimationsModule ], providers: [ + { provide: DSONameService, useValue: new DSONameServiceMock() }, { provide: GroupDataService, useValue: groupService }, { provide: RequestService, useValue: requestService }, { provide: NotificationsService, useClass: NotificationsServiceStub } diff --git a/src/app/shared/comcol/comcol-forms/edit-comcol-page/comcol-role/comcol-role.component.ts b/src/app/shared/comcol/comcol-forms/edit-comcol-page/comcol-role/comcol-role.component.ts index 3091dd0cf0..5ae22d754e 100644 --- a/src/app/shared/comcol/comcol-forms/edit-comcol-page/comcol-role/comcol-role.component.ts +++ b/src/app/shared/comcol/comcol-forms/edit-comcol-page/comcol-role/comcol-role.component.ts @@ -14,6 +14,7 @@ import { hasNoValue, hasValue } from '../../../../empty.util'; import { NoContent } from '../../../../../core/shared/NoContent.model'; import { NotificationsService } from '../../../../notifications/notifications.service'; import { TranslateService } from '@ngx-translate/core'; +import { DSONameService } from '../../../../../core/breadcrumbs/dso-name.service'; /** * Component for managing a community or collection role. @@ -76,6 +77,7 @@ export class ComcolRoleComponent implements OnInit { protected groupService: GroupDataService, protected notificationsService: NotificationsService, protected translateService: TranslateService, + public dsoNameService: DSONameService, ) { } diff --git a/src/app/shared/confirmation-modal/confirmation-modal.component.html b/src/app/shared/confirmation-modal/confirmation-modal.component.html index 82c70b662b..02434b1fa1 100644 --- a/src/app/shared/confirmation-modal/confirmation-modal.component.html +++ b/src/app/shared/confirmation-modal/confirmation-modal.component.html @@ -1,18 +1,18 @@
- diff --git a/src/app/shared/confirmation-modal/confirmation-modal.component.ts b/src/app/shared/confirmation-modal/confirmation-modal.component.ts index 4fa4858600..46eb4cedc5 100644 --- a/src/app/shared/confirmation-modal/confirmation-modal.component.ts +++ b/src/app/shared/confirmation-modal/confirmation-modal.component.ts @@ -1,6 +1,7 @@ import { Component, EventEmitter, Input, Output } from '@angular/core'; import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap'; import { DSpaceObject } from '../../core/shared/dspace-object.model'; +import { DSONameService } from '../../core/breadcrumbs/dso-name.service'; @Component({ selector: 'ds-confirmation-modal', @@ -25,7 +26,10 @@ export class ConfirmationModalComponent { @Output() response = new EventEmitter(); - constructor(protected activeModal: NgbActiveModal) { + constructor( + protected activeModal: NgbActiveModal, + public dsoNameService: DSONameService, + ) { } /** diff --git a/src/app/shared/input-suggestions/dso-input-suggestions/dso-input-suggestions.component.ts b/src/app/shared/input-suggestions/dso-input-suggestions/dso-input-suggestions.component.ts index e7ca432476..26c7d91b41 100644 --- a/src/app/shared/input-suggestions/dso-input-suggestions/dso-input-suggestions.component.ts +++ b/src/app/shared/input-suggestions/dso-input-suggestions/dso-input-suggestions.component.ts @@ -5,6 +5,7 @@ import { DSpaceObject } from '../../../core/shared/dspace-object.model'; import { ViewMode } from '../../../core/shared/view-mode.model'; import { CollectionElementLinkType } from '../../object-collection/collection-element-link.type'; import { hasValue } from '../../empty.util'; +import { DSONameService } from '../../../core/breadcrumbs/dso-name.service'; @Component({ selector: 'ds-dso-input-suggestions', @@ -42,16 +43,22 @@ export class DsoInputSuggestionsComponent extends InputSuggestionsComponent { currentObject: DSpaceObject; + constructor( + protected dsoNameService: DSONameService, + ) { + super(); + } + onSubmit(data: DSpaceObject) { if (hasValue(data)) { - this.value = data.name; + this.value = this.dsoNameService.getName(data); this.currentObject = data; this.submitSuggestion.emit(data); } } onClickSuggestion(data: DSpaceObject) { - this.value = data.name; + this.value = this.dsoNameService.getName(data); this.currentObject = data; this.clickSuggestion.emit(data); this.close(); diff --git a/src/app/shared/item/item-versions/item-versions.component.ts b/src/app/shared/item/item-versions/item-versions.component.ts index b7b8182658..f2eaec87cb 100644 --- a/src/app/shared/item/item-versions/item-versions.component.ts +++ b/src/app/shared/item/item-versions/item-versions.component.ts @@ -1,4 +1,4 @@ -import { Component, Input, OnInit } from '@angular/core'; +import { Component, Input, OnDestroy, OnInit } from '@angular/core'; import { Item } from '../../../core/shared/item.model'; import { Version } from '../../../core/shared/version.model'; import { RemoteData } from '../../../core/data/remote-data'; @@ -58,7 +58,7 @@ import { ConfigurationDataService } from '../../../core/data/configuration-data. /** * Component listing all available versions of the history the provided item is a part of */ -export class ItemVersionsComponent implements OnInit { +export class ItemVersionsComponent implements OnDestroy, OnInit { /** * The item to display a version history for diff --git a/src/app/shared/mocks/dso-name.service.mock.ts b/src/app/shared/mocks/dso-name.service.mock.ts index f4947cc860..e496e78c2e 100644 --- a/src/app/shared/mocks/dso-name.service.mock.ts +++ b/src/app/shared/mocks/dso-name.service.mock.ts @@ -3,7 +3,7 @@ import { DSpaceObject } from '../../core/shared/dspace-object.model'; export const UNDEFINED_NAME = 'Undefined'; export class DSONameServiceMock { - public getName(dso: DSpaceObject) { - return UNDEFINED_NAME; + public getName(dso: DSpaceObject | undefined) { + return dso?.name || UNDEFINED_NAME; } } diff --git a/src/app/shared/object-collection/shared/mydspace-item-submitter/item-submitter.component.html b/src/app/shared/object-collection/shared/mydspace-item-submitter/item-submitter.component.html index 0f7ae433fa..f259fed7e9 100644 --- a/src/app/shared/object-collection/shared/mydspace-item-submitter/item-submitter.component.html +++ b/src/app/shared/object-collection/shared/mydspace-item-submitter/item-submitter.component.html @@ -1,3 +1,6 @@
- {{'submission.workflow.tasks.generic.submitter' | translate}} : {{(submitter$ | async)?.name}} + + {{'submission.workflow.tasks.generic.submitter' | translate}}: + {{ dsoNameService.getName(submitter$ | async)}} +
diff --git a/src/app/shared/object-collection/shared/mydspace-item-submitter/item-submitter.component.ts b/src/app/shared/object-collection/shared/mydspace-item-submitter/item-submitter.component.ts index fb644017db..990aa9906b 100644 --- a/src/app/shared/object-collection/shared/mydspace-item-submitter/item-submitter.component.ts +++ b/src/app/shared/object-collection/shared/mydspace-item-submitter/item-submitter.component.ts @@ -10,6 +10,7 @@ import { WorkflowItem } from '../../../../core/submission/models/workflowitem.mo import { getFirstCompletedRemoteData } from '../../../../core/shared/operators'; import { LinkService } from '../../../../core/cache/builders/link.service'; import { followLink } from '../../../utils/follow-link-config.model'; +import { DSONameService } from '../../../../core/breadcrumbs/dso-name.service'; /** * This component represents a badge with submitter information. @@ -31,8 +32,10 @@ export class ItemSubmitterComponent implements OnInit { */ submitter$: Observable; - public constructor(protected linkService: LinkService) { - + public constructor( + public dsoNameService: DSONameService, + protected linkService: LinkService, + ) { } /** diff --git a/src/app/shared/object-collection/shared/object-collection-element/abstract-listable-element.component.ts b/src/app/shared/object-collection/shared/object-collection-element/abstract-listable-element.component.ts index 7d4e107b2b..6b9aff069f 100644 --- a/src/app/shared/object-collection/shared/object-collection-element/abstract-listable-element.component.ts +++ b/src/app/shared/object-collection/shared/object-collection-element/abstract-listable-element.component.ts @@ -4,6 +4,7 @@ import { CollectionElementLinkType } from '../../collection-element-link.type'; import { Context } from '../../../../core/shared/context.model'; import { ViewMode } from '../../../../core/shared/view-mode.model'; import { DSpaceObject } from '../../../../core/shared/dspace-object.model'; +import { DSONameService } from '../../../../core/breadcrumbs/dso-name.service'; @Component({ selector: 'ds-abstract-object-element', @@ -70,4 +71,10 @@ export class AbstractListableElementComponent { * The available contexts */ contexts = Context; + + constructor( + public dsoNameService: DSONameService, + ) { + } + } diff --git a/src/app/shared/object-detail/my-dspace-result-detail-element/claimed-task-search-result/claimed-task-search-result-detail-element.component.spec.ts b/src/app/shared/object-detail/my-dspace-result-detail-element/claimed-task-search-result/claimed-task-search-result-detail-element.component.spec.ts index b2bbb69ef4..556194c4d7 100644 --- a/src/app/shared/object-detail/my-dspace-result-detail-element/claimed-task-search-result/claimed-task-search-result-detail-element.component.spec.ts +++ b/src/app/shared/object-detail/my-dspace-result-detail-element/claimed-task-search-result/claimed-task-search-result-detail-element.component.spec.ts @@ -18,6 +18,8 @@ import { LinkService } from '../../../../core/cache/builders/link.service'; import { getMockLinkService } from '../../../mocks/link-service.mock'; import { By } from '@angular/platform-browser'; import { ObjectCacheService } from '../../../../core/cache/object-cache.service'; +import { DSONameService } from '../../../../core/breadcrumbs/dso-name.service'; +import { DSONameServiceMock } from '../../../mocks/dso-name.service.mock'; let component: ClaimedTaskSearchResultDetailElementComponent; let fixture: ComponentFixture; @@ -71,6 +73,7 @@ describe('ClaimedTaskSearchResultDetailElementComponent', () => { imports: [NoopAnimationsModule], declarations: [ClaimedTaskSearchResultDetailElementComponent, VarDirective], providers: [ + { provide: DSONameService, useValue: new DSONameServiceMock() }, { provide: LinkService, useValue: linkService }, { provide: ObjectCacheService, useValue: objectCacheServiceMock } ], diff --git a/src/app/shared/object-detail/my-dspace-result-detail-element/claimed-task-search-result/claimed-task-search-result-detail-element.component.ts b/src/app/shared/object-detail/my-dspace-result-detail-element/claimed-task-search-result/claimed-task-search-result-detail-element.component.ts index 2ee661ef38..d9cb8014af 100644 --- a/src/app/shared/object-detail/my-dspace-result-detail-element/claimed-task-search-result/claimed-task-search-result-detail-element.component.ts +++ b/src/app/shared/object-detail/my-dspace-result-detail-element/claimed-task-search-result/claimed-task-search-result-detail-element.component.ts @@ -19,6 +19,7 @@ import { Item } from '../../../../core/shared/item.model'; import { getFirstCompletedRemoteData } from '../../../../core/shared/operators'; import { isNotEmpty } from '../../../empty.util'; import { ObjectCacheService } from '../../../../core/cache/object-cache.service'; +import { DSONameService } from '../../../../core/breadcrumbs/dso-name.service'; /** * This component renders claimed task object for the search result in the detail view. @@ -52,8 +53,12 @@ export class ClaimedTaskSearchResultDetailElementComponent extends SearchResultD */ public workflowitem$: BehaviorSubject = new BehaviorSubject(null); - constructor(protected linkService: LinkService, protected objectCache: ObjectCacheService) { - super(); + constructor( + public dsoNameService: DSONameService, + protected linkService: LinkService, + protected objectCache: ObjectCacheService, + ) { + super(dsoNameService); } /** diff --git a/src/app/shared/object-detail/my-dspace-result-detail-element/item-detail-preview/item-detail-preview.component.html b/src/app/shared/object-detail/my-dspace-result-detail-element/item-detail-preview/item-detail-preview.component.html index c9c2da5c2e..0e0637e941 100644 --- a/src/app/shared/object-detail/my-dspace-result-detail-element/item-detail-preview/item-detail-preview.component.html +++ b/src/app/shared/object-detail/my-dspace-result-detail-element/item-detail-preview/item-detail-preview.component.html @@ -14,8 +14,8 @@
diff --git a/src/app/shared/object-detail/my-dspace-result-detail-element/item-detail-preview/item-detail-preview.component.ts b/src/app/shared/object-detail/my-dspace-result-detail-element/item-detail-preview/item-detail-preview.component.ts index 778e455004..bcb518bb89 100644 --- a/src/app/shared/object-detail/my-dspace-result-detail-element/item-detail-preview/item-detail-preview.component.ts +++ b/src/app/shared/object-detail/my-dspace-result-detail-element/item-detail-preview/item-detail-preview.component.ts @@ -12,6 +12,7 @@ import { Bitstream } from '../../../../core/shared/bitstream.model'; import { FileService } from '../../../../core/shared/file.service'; import { HALEndpointService } from '../../../../core/shared/hal-endpoint.service'; import { SearchResult } from '../../../search/models/search-result.model'; +import { DSONameService } from '../../../../core/breadcrumbs/dso-name.service'; /** * This component show metadata for the given item object in the detail view. @@ -54,16 +55,12 @@ export class ItemDetailPreviewComponent { */ public separator = ', '; - /** - * Initialize instance variables - * - * @param {FileService} fileService - * @param {HALEndpointService} halService - * @param {BitstreamDataService} bitstreamDataService - */ - constructor(private fileService: FileService, - private halService: HALEndpointService, - private bitstreamDataService: BitstreamDataService) { + constructor( + protected fileService: FileService, + protected halService: HALEndpointService, + protected bitstreamDataService: BitstreamDataService, + public dsoNameService: DSONameService, + ) { } /** diff --git a/src/app/shared/object-detail/my-dspace-result-detail-element/item-search-result/item-search-result-detail-element.component.spec.ts b/src/app/shared/object-detail/my-dspace-result-detail-element/item-search-result/item-search-result-detail-element.component.spec.ts index 8d602d5eb2..78e619fcb5 100644 --- a/src/app/shared/object-detail/my-dspace-result-detail-element/item-search-result/item-search-result-detail-element.component.spec.ts +++ b/src/app/shared/object-detail/my-dspace-result-detail-element/item-search-result/item-search-result-detail-element.component.spec.ts @@ -8,6 +8,8 @@ import { Item } from '../../../../core/shared/item.model'; import { ItemSearchResultDetailElementComponent } from './item-search-result-detail-element.component'; import { MyDspaceItemStatusType } from '../../../object-collection/shared/mydspace-item-status/my-dspace-item-status-type'; import { ItemSearchResult } from '../../../object-collection/shared/item-search-result.model'; +import { DSONameService } from '../../../../core/breadcrumbs/dso-name.service'; +import { DSONameServiceMock } from '../../../mocks/dso-name.service.mock'; let component: ItemSearchResultDetailElementComponent; let fixture: ComponentFixture; @@ -52,6 +54,9 @@ describe('ItemSearchResultDetailElementComponent', () => { TestBed.configureTestingModule({ imports: [NoopAnimationsModule], declarations: [ItemSearchResultDetailElementComponent], + providers: [ + { provide: DSONameService, useValue: new DSONameServiceMock() }, + ], schemas: [NO_ERRORS_SCHEMA] }).overrideComponent(ItemSearchResultDetailElementComponent, { set: { changeDetection: ChangeDetectionStrategy.Default } diff --git a/src/app/shared/object-detail/my-dspace-result-detail-element/pool-search-result/pool-search-result-detail-element.component.spec.ts b/src/app/shared/object-detail/my-dspace-result-detail-element/pool-search-result/pool-search-result-detail-element.component.spec.ts index 59725233ba..96b0a49c20 100644 --- a/src/app/shared/object-detail/my-dspace-result-detail-element/pool-search-result/pool-search-result-detail-element.component.spec.ts +++ b/src/app/shared/object-detail/my-dspace-result-detail-element/pool-search-result/pool-search-result-detail-element.component.spec.ts @@ -18,6 +18,8 @@ import { LinkService } from '../../../../core/cache/builders/link.service'; import { getMockLinkService } from '../../../mocks/link-service.mock'; import { By } from '@angular/platform-browser'; import { ObjectCacheService } from '../../../../core/cache/object-cache.service'; +import { DSONameService } from '../../../../core/breadcrumbs/dso-name.service'; +import { DSONameServiceMock } from '../../../mocks/dso-name.service.mock'; let component: PoolSearchResultDetailElementComponent; let fixture: ComponentFixture; @@ -71,6 +73,7 @@ describe('PoolSearchResultDetailElementComponent', () => { imports: [NoopAnimationsModule], declarations: [PoolSearchResultDetailElementComponent, VarDirective], providers: [ + { provide: DSONameService, useValue: new DSONameServiceMock() }, { provide: 'objectElementProvider', useValue: (mockResultObject) }, { provide: 'indexElementProvider', useValue: (compIndex) }, { provide: LinkService, useValue: linkService }, diff --git a/src/app/shared/object-detail/my-dspace-result-detail-element/pool-search-result/pool-search-result-detail-element.component.ts b/src/app/shared/object-detail/my-dspace-result-detail-element/pool-search-result/pool-search-result-detail-element.component.ts index 6dec14f9cb..c1123ee732 100644 --- a/src/app/shared/object-detail/my-dspace-result-detail-element/pool-search-result/pool-search-result-detail-element.component.ts +++ b/src/app/shared/object-detail/my-dspace-result-detail-element/pool-search-result/pool-search-result-detail-element.component.ts @@ -19,6 +19,7 @@ import { Item } from '../../../../core/shared/item.model'; import { getFirstCompletedRemoteData } from '../../../../core/shared/operators'; import { isNotEmpty } from '../../../empty.util'; import { ObjectCacheService } from '../../../../core/cache/object-cache.service'; +import { DSONameService } from '../../../../core/breadcrumbs/dso-name.service'; /** * This component renders pool task object for the search result in the detail view. @@ -52,8 +53,12 @@ export class PoolSearchResultDetailElementComponent extends SearchResultDetailEl */ public workflowitem$: BehaviorSubject = new BehaviorSubject(null); - constructor(protected linkService: LinkService, protected objectCache: ObjectCacheService) { - super(); + constructor( + public dsoNameService: DSONameService, + protected linkService: LinkService, + protected objectCache: ObjectCacheService, + ) { + super(dsoNameService); } /** diff --git a/src/app/shared/object-detail/my-dspace-result-detail-element/workflow-item-search-result/workflow-item-search-result-detail-element.component.ts b/src/app/shared/object-detail/my-dspace-result-detail-element/workflow-item-search-result/workflow-item-search-result-detail-element.component.ts index 8dc510d2aa..814e5d0bc9 100644 --- a/src/app/shared/object-detail/my-dspace-result-detail-element/workflow-item-search-result/workflow-item-search-result-detail-element.component.ts +++ b/src/app/shared/object-detail/my-dspace-result-detail-element/workflow-item-search-result/workflow-item-search-result-detail-element.component.ts @@ -13,6 +13,7 @@ import { listableObjectComponent } from '../../../object-collection/shared/lista import { WorkflowItemSearchResult } from '../../../object-collection/shared/workflow-item-search-result.model'; import { LinkService } from '../../../../core/cache/builders/link.service'; import { followLink } from '../../../utils/follow-link-config.model'; +import { DSONameService } from '../../../../core/breadcrumbs/dso-name.service'; /** * This component renders workflowitem object for the search result in the detail view. @@ -37,9 +38,10 @@ export class WorkflowItemSearchResultDetailElementComponent extends SearchResult public status = MyDspaceItemStatusType.WORKFLOW; constructor( + public dsoNameService: DSONameService, protected linkService: LinkService ) { - super(); + super(dsoNameService); } /** diff --git a/src/app/shared/object-detail/my-dspace-result-detail-element/workspace-item-search-result/workspace-item-search-result-detail-element.component.ts b/src/app/shared/object-detail/my-dspace-result-detail-element/workspace-item-search-result/workspace-item-search-result-detail-element.component.ts index e4781fe0b2..e35a1e734e 100644 --- a/src/app/shared/object-detail/my-dspace-result-detail-element/workspace-item-search-result/workspace-item-search-result-detail-element.component.ts +++ b/src/app/shared/object-detail/my-dspace-result-detail-element/workspace-item-search-result/workspace-item-search-result-detail-element.component.ts @@ -14,6 +14,7 @@ import { listableObjectComponent } from '../../../object-collection/shared/lista import { WorkspaceItemSearchResult } from '../../../object-collection/shared/workspace-item-search-result.model'; import { followLink } from '../../../utils/follow-link-config.model'; import { LinkService } from '../../../../core/cache/builders/link.service'; +import { DSONameService } from '../../../../core/breadcrumbs/dso-name.service'; /** * This component renders workspace item object for the search result in the detail view. @@ -38,9 +39,10 @@ export class WorkspaceItemSearchResultDetailElementComponent extends SearchResul status = MyDspaceItemStatusType.WORKSPACE; constructor( + public dsoNameService: DSONameService, protected linkService: LinkService ) { - super(); + super(dsoNameService); } /** diff --git a/src/app/shared/object-grid/collection-grid-element/collection-grid-element.component.html b/src/app/shared/object-grid/collection-grid-element/collection-grid-element.component.html index 4d6d5cb1c3..beeaadf481 100644 --- a/src/app/shared/object-grid/collection-grid-element/collection-grid-element.component.html +++ b/src/app/shared/object-grid/collection-grid-element/collection-grid-element.component.html @@ -8,7 +8,7 @@
-

{{object.name}}

+

{{ dsoNameService.getName(object) }}

{{object.shortDescription}}

{{ 'search.results.view-result' | translate}} diff --git a/src/app/shared/object-grid/collection-grid-element/collection-grid-element.component.ts b/src/app/shared/object-grid/collection-grid-element/collection-grid-element.component.ts index b6a7cc056b..e2ecf7b1ae 100644 --- a/src/app/shared/object-grid/collection-grid-element/collection-grid-element.component.ts +++ b/src/app/shared/object-grid/collection-grid-element/collection-grid-element.component.ts @@ -6,6 +6,7 @@ import { listableObjectComponent } from '../../object-collection/shared/listable import { hasNoValue, hasValue } from '../../empty.util'; import { followLink } from '../../utils/follow-link-config.model'; import { LinkService } from '../../../core/cache/builders/link.service'; +import { DSONameService } from '../../../core/breadcrumbs/dso-name.service'; /** * Component representing a grid element for collection @@ -21,8 +22,11 @@ export class CollectionGridElementComponent extends AbstractListableElementCompo > { private _object: Collection; - constructor(private linkService: LinkService) { - super(); + constructor( + public dsoNameService: DSONameService, + private linkService: LinkService, + ) { + super(dsoNameService); } // @ts-ignore diff --git a/src/app/shared/object-grid/community-grid-element/community-grid-element.component.html b/src/app/shared/object-grid/community-grid-element/community-grid-element.component.html index c9833b8829..2700f12c1f 100644 --- a/src/app/shared/object-grid/community-grid-element/community-grid-element.component.html +++ b/src/app/shared/object-grid/community-grid-element/community-grid-element.component.html @@ -8,7 +8,7 @@
-

{{object.name}}

+

{{ dsoNameService.getName(object) }}

{{object.shortDescription}}

{{ 'search.results.view-result' | translate}} diff --git a/src/app/shared/object-grid/community-grid-element/community-grid-element.component.ts b/src/app/shared/object-grid/community-grid-element/community-grid-element.component.ts index 001c3e3080..59ac0693eb 100644 --- a/src/app/shared/object-grid/community-grid-element/community-grid-element.component.ts +++ b/src/app/shared/object-grid/community-grid-element/community-grid-element.component.ts @@ -6,6 +6,7 @@ import { listableObjectComponent } from '../../object-collection/shared/listable import { followLink } from '../../utils/follow-link-config.model'; import { LinkService } from '../../../core/cache/builders/link.service'; import { hasNoValue, hasValue } from '../../empty.util'; +import { DSONameService } from '../../../core/breadcrumbs/dso-name.service'; /** * Component representing a grid element for a community @@ -20,8 +21,11 @@ import { hasNoValue, hasValue } from '../../empty.util'; export class CommunityGridElementComponent extends AbstractListableElementComponent { private _object: Community; - constructor( private linkService: LinkService) { - super(); + constructor( + public dsoNameService: DSONameService, + private linkService: LinkService, + ) { + super(dsoNameService); } // @ts-ignore diff --git a/src/app/shared/object-grid/item-grid-element/item-types/item/item-grid-element.component.spec.ts b/src/app/shared/object-grid/item-grid-element/item-types/item/item-grid-element.component.spec.ts index 645897ebbf..b137c2e708 100644 --- a/src/app/shared/object-grid/item-grid-element/item-types/item/item-grid-element.component.spec.ts +++ b/src/app/shared/object-grid/item-grid-element/item-types/item/item-grid-element.component.spec.ts @@ -10,6 +10,8 @@ import { Item } from '../../../../../core/shared/item.model'; import { createSuccessfulRemoteDataObject$ } from '../../../../remote-data.utils'; import { buildPaginatedList } from '../../../../../core/data/paginated-list.model'; import { PageInfo } from '../../../../../core/shared/page-info.model'; +import { DSONameService } from '../../../../../core/breadcrumbs/dso-name.service'; +import { DSONameServiceMock } from '../../../../mocks/dso-name.service.mock'; const mockItem = Object.assign(new Item(), { bundles: createSuccessfulRemoteDataObject$(buildPaginatedList(new PageInfo(), [])), @@ -54,6 +56,7 @@ describe('ItemGridElementComponent', () => { imports: [NoopAnimationsModule], declarations: [ItemGridElementComponent, TruncatePipe], providers: [ + { provide: DSONameService, useValue: new DSONameServiceMock() }, { provide: TruncatableService, useValue: truncatableServiceStub }, ], schemas: [NO_ERRORS_SCHEMA] diff --git a/src/app/shared/object-grid/search-result-grid-element/collection-search-result/collection-search-result-grid-element.component.html b/src/app/shared/object-grid/search-result-grid-element/collection-search-result/collection-search-result-grid-element.component.html index b05bb4f7ba..6d943cd914 100644 --- a/src/app/shared/object-grid/search-result-grid-element/collection-search-result/collection-search-result-grid-element.component.html +++ b/src/app/shared/object-grid/search-result-grid-element/collection-search-result/collection-search-result-grid-element.component.html @@ -9,7 +9,7 @@
-

{{dso.name}}

+

{{ dsoNameService.getName(dso) }}

{{dso.shortDescription}}

{{ 'search.results.view-result' | translate}} diff --git a/src/app/shared/object-grid/search-result-grid-element/collection-search-result/collection-search-result-grid-element.component.ts b/src/app/shared/object-grid/search-result-grid-element/collection-search-result/collection-search-result-grid-element.component.ts index 9f715b0e79..e4ea2e48f5 100644 --- a/src/app/shared/object-grid/search-result-grid-element/collection-search-result/collection-search-result-grid-element.component.ts +++ b/src/app/shared/object-grid/search-result-grid-element/collection-search-result/collection-search-result-grid-element.component.ts @@ -9,6 +9,7 @@ import { followLink } from '../../../utils/follow-link-config.model'; import { LinkService } from '../../../../core/cache/builders/link.service'; import { TruncatableService } from '../../../truncatable/truncatable.service'; import { BitstreamDataService } from '../../../../core/data/bitstream-data.service'; +import { DSONameService } from '../../../../core/breadcrumbs/dso-name.service'; @Component({ selector: 'ds-collection-search-result-grid-element', @@ -23,11 +24,12 @@ export class CollectionSearchResultGridElementComponent extends SearchResultGrid private _dso: Collection; constructor( + public dsoNameService: DSONameService, private linkService: LinkService, protected truncatableService: TruncatableService, protected bitstreamDataService: BitstreamDataService ) { - super(truncatableService, bitstreamDataService); + super(dsoNameService, truncatableService, bitstreamDataService); } // @ts-ignore diff --git a/src/app/shared/object-grid/search-result-grid-element/community-search-result/community-search-result-grid-element.component.html b/src/app/shared/object-grid/search-result-grid-element/community-search-result/community-search-result-grid-element.component.html index d915cdb7a4..a8d4831b55 100644 --- a/src/app/shared/object-grid/search-result-grid-element/community-search-result/community-search-result-grid-element.component.html +++ b/src/app/shared/object-grid/search-result-grid-element/community-search-result/community-search-result-grid-element.component.html @@ -9,7 +9,7 @@
-

{{dso.name}}

+

{{ dsoNameService.getName(dso) }}

{{dso.shortDescription}}

{{ 'search.results.view-result' | translate}} diff --git a/src/app/shared/object-grid/search-result-grid-element/community-search-result/community-search-result-grid-element.component.ts b/src/app/shared/object-grid/search-result-grid-element/community-search-result/community-search-result-grid-element.component.ts index 18994e2cd7..039b01c567 100644 --- a/src/app/shared/object-grid/search-result-grid-element/community-search-result/community-search-result-grid-element.component.ts +++ b/src/app/shared/object-grid/search-result-grid-element/community-search-result/community-search-result-grid-element.component.ts @@ -9,6 +9,7 @@ import { TruncatableService } from '../../../truncatable/truncatable.service'; import { BitstreamDataService } from '../../../../core/data/bitstream-data.service'; import { hasNoValue, hasValue } from '../../../empty.util'; import { followLink } from '../../../utils/follow-link-config.model'; +import { DSONameService } from '../../../../core/breadcrumbs/dso-name.service'; @Component({ selector: 'ds-community-search-result-grid-element', @@ -26,11 +27,12 @@ export class CommunitySearchResultGridElementComponent extends SearchResultGridE private _dso: Community; constructor( + public dsoNameService: DSONameService, private linkService: LinkService, protected truncatableService: TruncatableService, protected bitstreamDataService: BitstreamDataService ) { - super(truncatableService, bitstreamDataService); + super(dsoNameService, truncatableService, bitstreamDataService); } // @ts-ignore diff --git a/src/app/shared/object-grid/search-result-grid-element/item-search-result/item/item-search-result-grid-element.component.ts b/src/app/shared/object-grid/search-result-grid-element/item-search-result/item/item-search-result-grid-element.component.ts index b5f9c016e4..8fe3638440 100644 --- a/src/app/shared/object-grid/search-result-grid-element/item-search-result/item/item-search-result-grid-element.component.ts +++ b/src/app/shared/object-grid/search-result-grid-element/item-search-result/item/item-search-result-grid-element.component.ts @@ -32,11 +32,11 @@ export class ItemSearchResultGridElementComponent extends SearchResultGridElemen dsoTitle: string; constructor( + public dsoNameService: DSONameService, protected truncatableService: TruncatableService, protected bitstreamDataService: BitstreamDataService, - private dsoNameService: DSONameService, ) { - super(truncatableService, bitstreamDataService); + super(dsoNameService, truncatableService, bitstreamDataService); } ngOnInit(): void { diff --git a/src/app/shared/object-grid/search-result-grid-element/search-result-grid-element.component.ts b/src/app/shared/object-grid/search-result-grid-element/search-result-grid-element.component.ts index 6e72eaa942..4c3431bb55 100644 --- a/src/app/shared/object-grid/search-result-grid-element/search-result-grid-element.component.ts +++ b/src/app/shared/object-grid/search-result-grid-element/search-result-grid-element.component.ts @@ -8,6 +8,7 @@ import { Metadata } from '../../../core/shared/metadata.utils'; import { hasValue } from '../../empty.util'; import { AbstractListableElementComponent } from '../../object-collection/shared/object-collection-element/abstract-listable-element.component'; import { TruncatableService } from '../../truncatable/truncatable.service'; +import { DSONameService } from '../../../core/breadcrumbs/dso-name.service'; @Component({ selector: 'ds-search-result-grid-element', @@ -25,10 +26,11 @@ export class SearchResultGridElementComponent, K exten isCollapsed$: Observable; public constructor( + public dsoNameService: DSONameService, protected truncatableService: TruncatableService, protected bitstreamDataService: BitstreamDataService ) { - super(); + super(dsoNameService); } /** diff --git a/src/app/shared/object-list/browse-entry-list-element/browse-entry-list-element.component.spec.ts b/src/app/shared/object-list/browse-entry-list-element/browse-entry-list-element.component.spec.ts index a4490bd951..15d1d9df39 100644 --- a/src/app/shared/object-list/browse-entry-list-element/browse-entry-list-element.component.spec.ts +++ b/src/app/shared/object-list/browse-entry-list-element/browse-entry-list-element.component.spec.ts @@ -7,6 +7,8 @@ import { BrowseEntry } from '../../../core/shared/browse-entry.model'; import { PaginationService } from '../../../core/pagination/pagination.service'; import { RouteService } from '../../../core/services/route.service'; import { of as observableOf } from 'rxjs'; +import { DSONameService } from '../../../core/breadcrumbs/dso-name.service'; +import { DSONameServiceMock } from '../../mocks/dso-name.service.mock'; let browseEntryListElementComponent: BrowseEntryListElementComponent; let fixture: ComponentFixture; @@ -34,6 +36,7 @@ describe('BrowseEntryListElementComponent', () => { TestBed.configureTestingModule({ declarations: [BrowseEntryListElementComponent, TruncatePipe], providers: [ + { provide: DSONameService, useValue: new DSONameServiceMock() }, { provide: 'objectElementProvider', useValue: { mockValue } }, {provide: PaginationService, useValue: paginationService}, {provide: RouteService, useValue: routeService}, diff --git a/src/app/shared/object-list/browse-entry-list-element/browse-entry-list-element.component.ts b/src/app/shared/object-list/browse-entry-list-element/browse-entry-list-element.component.ts index 667da726ed..e67dd4489e 100644 --- a/src/app/shared/object-list/browse-entry-list-element/browse-entry-list-element.component.ts +++ b/src/app/shared/object-list/browse-entry-list-element/browse-entry-list-element.component.ts @@ -10,6 +10,7 @@ import { BBM_PAGINATION_ID } from '../../../browse-by/browse-by-metadata-page/br import { RouteService } from 'src/app/core/services/route.service'; import { Observable } from 'rxjs'; import { map } from 'rxjs/operators'; +import { DSONameService } from '../../../core/breadcrumbs/dso-name.service'; @Component({ selector: 'ds-browse-entry-list-element', @@ -27,8 +28,12 @@ export class BrowseEntryListElementComponent extends AbstractListableElementComp */ queryParams$: Observable; - constructor(private paginationService: PaginationService, private routeService: RouteService) { - super(); + constructor( + public dsoNameService: DSONameService, + protected paginationService: PaginationService, + protected routeService: RouteService, + ) { + super(dsoNameService); } ngOnInit() { diff --git a/src/app/shared/object-list/bundle-list-element/bundle-list-element.component.html b/src/app/shared/object-list/bundle-list-element/bundle-list-element.component.html index dfe08144a8..77ed1e3b21 100644 --- a/src/app/shared/object-list/bundle-list-element/bundle-list-element.component.html +++ b/src/app/shared/object-list/bundle-list-element/bundle-list-element.component.html @@ -1 +1 @@ -
{{object.name}}
+
{{ dsoNameService.getName(object) }}
diff --git a/src/app/shared/object-list/collection-list-element/collection-list-element.component.html b/src/app/shared/object-list/collection-list-element/collection-list-element.component.html index c61adf5dad..6c2cff5215 100644 --- a/src/app/shared/object-list/collection-list-element/collection-list-element.component.html +++ b/src/app/shared/object-list/collection-list-element/collection-list-element.component.html @@ -1,8 +1,8 @@ - {{object.name}} + {{ dsoNameService.getName(object) }} - {{object.name}} + {{ dsoNameService.getName(object) }}
{{object.shortDescription}} diff --git a/src/app/shared/object-list/collection-list-element/collection-list-element.component.spec.ts b/src/app/shared/object-list/collection-list-element/collection-list-element.component.spec.ts index c41d5a7314..04715983c9 100644 --- a/src/app/shared/object-list/collection-list-element/collection-list-element.component.spec.ts +++ b/src/app/shared/object-list/collection-list-element/collection-list-element.component.spec.ts @@ -3,6 +3,8 @@ import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; import { ChangeDetectionStrategy, NO_ERRORS_SCHEMA } from '@angular/core'; import { By } from '@angular/platform-browser'; import { Collection } from '../../../core/shared/collection.model'; +import { DSONameService } from '../../../core/breadcrumbs/dso-name.service'; +import { DSONameServiceMock } from '../../mocks/dso-name.service.mock'; let collectionListElementComponent: CollectionListElementComponent; let fixture: ComponentFixture; @@ -34,6 +36,7 @@ describe('CollectionListElementComponent', () => { TestBed.configureTestingModule({ declarations: [CollectionListElementComponent], providers: [ + { provide: DSONameService, useValue: new DSONameServiceMock() }, { provide: 'objectElementProvider', useValue: (mockCollectionWithAbstract) } ], diff --git a/src/app/shared/object-list/community-list-element/community-list-element.component.html b/src/app/shared/object-list/community-list-element/community-list-element.component.html index af01999ca7..462db7be91 100644 --- a/src/app/shared/object-list/community-list-element/community-list-element.component.html +++ b/src/app/shared/object-list/community-list-element/community-list-element.component.html @@ -1,8 +1,8 @@ - {{object.name}} + {{ dsoNameService.getName(object) }} - {{object.name}} + {{ dsoNameService.getName(object) }}
{{object.shortDescription}} diff --git a/src/app/shared/object-list/community-list-element/community-list-element.component.spec.ts b/src/app/shared/object-list/community-list-element/community-list-element.component.spec.ts index cd212e0399..8f7350d860 100644 --- a/src/app/shared/object-list/community-list-element/community-list-element.component.spec.ts +++ b/src/app/shared/object-list/community-list-element/community-list-element.component.spec.ts @@ -3,6 +3,8 @@ import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; import { ChangeDetectionStrategy, NO_ERRORS_SCHEMA } from '@angular/core'; import { By } from '@angular/platform-browser'; import { Community } from '../../../core/shared/community.model'; +import { DSONameService } from '../../../core/breadcrumbs/dso-name.service'; +import { DSONameServiceMock } from '../../mocks/dso-name.service.mock'; let communityListElementComponent: CommunityListElementComponent; let fixture: ComponentFixture; @@ -34,6 +36,7 @@ describe('CommunityListElementComponent', () => { TestBed.configureTestingModule({ declarations: [CommunityListElementComponent], providers: [ + { provide: DSONameService, useValue: new DSONameServiceMock() }, { provide: 'objectElementProvider', useValue: (mockCommunityWithAbstract) } ], diff --git a/src/app/shared/object-list/community-list-element/community-list-element.component.ts b/src/app/shared/object-list/community-list-element/community-list-element.component.ts index b41cd78107..4a83fd2834 100644 --- a/src/app/shared/object-list/community-list-element/community-list-element.component.ts +++ b/src/app/shared/object-list/community-list-element/community-list-element.component.ts @@ -4,6 +4,7 @@ import { Community } from '../../../core/shared/community.model'; import { AbstractListableElementComponent } from '../../object-collection/shared/object-collection-element/abstract-listable-element.component'; import { ViewMode } from '../../../core/shared/view-mode.model'; import { listableObjectComponent } from '../../object-collection/shared/listable-object/listable-object.decorator'; +import { DSONameService } from '../../../core/breadcrumbs/dso-name.service'; @Component({ selector: 'ds-community-list-element', @@ -14,4 +15,12 @@ import { listableObjectComponent } from '../../object-collection/shared/listable * Component representing a list element for a community */ @listableObjectComponent(Community, ViewMode.ListElement) -export class CommunityListElementComponent extends AbstractListableElementComponent {} +export class CommunityListElementComponent extends AbstractListableElementComponent { + + constructor( + public dsoNameService: DSONameService, + ) { + super(dsoNameService); + } + +} diff --git a/src/app/shared/object-list/item-list-element/item-types/item/item-list-element.component.spec.ts b/src/app/shared/object-list/item-list-element/item-types/item/item-list-element.component.spec.ts index de30c23216..d75576e8eb 100644 --- a/src/app/shared/object-list/item-list-element/item-types/item/item-list-element.component.spec.ts +++ b/src/app/shared/object-list/item-list-element/item-types/item/item-list-element.component.spec.ts @@ -6,6 +6,8 @@ import { Item } from '../../../../../core/shared/item.model'; import { TruncatePipe } from '../../../../utils/truncate.pipe'; import { TruncatableService } from '../../../../truncatable/truncatable.service'; import { of as observableOf } from 'rxjs'; +import { DSONameService } from '../../../../../core/breadcrumbs/dso-name.service'; +import { DSONameServiceMock } from '../../../../mocks/dso-name.service.mock'; const mockItem: Item = Object.assign(new Item(), { bundles: observableOf({}), @@ -55,6 +57,7 @@ describe('ItemListElementComponent', () => { TestBed.configureTestingModule({ declarations: [ItemListElementComponent, TruncatePipe], providers: [ + { provide: DSONameService, useValue: new DSONameServiceMock() }, { provide: TruncatableService, useValue: truncatableServiceStub }, ], schemas: [NO_ERRORS_SCHEMA] diff --git a/src/app/shared/object-list/my-dspace-result-list-element/claimed-search-result/claimed-approved-search-result/claimed-approved-search-result-list-element.component.ts b/src/app/shared/object-list/my-dspace-result-list-element/claimed-search-result/claimed-approved-search-result/claimed-approved-search-result-list-element.component.ts index 5dda0e44ea..660bd8ab7f 100644 --- a/src/app/shared/object-list/my-dspace-result-list-element/claimed-search-result/claimed-approved-search-result/claimed-approved-search-result-list-element.component.ts +++ b/src/app/shared/object-list/my-dspace-result-list-element/claimed-search-result/claimed-approved-search-result/claimed-approved-search-result-list-element.component.ts @@ -44,7 +44,7 @@ export class ClaimedApprovedSearchResultListElementComponent extends SearchResul public constructor( protected linkService: LinkService, protected truncatableService: TruncatableService, - protected dsoNameService: DSONameService, + public dsoNameService: DSONameService, @Inject(APP_CONFIG) protected appConfig: AppConfig ) { super(truncatableService, dsoNameService, appConfig); diff --git a/src/app/shared/object-list/my-dspace-result-list-element/claimed-search-result/claimed-declined-search-result/claimed-declined-search-result-list-element.component.ts b/src/app/shared/object-list/my-dspace-result-list-element/claimed-search-result/claimed-declined-search-result/claimed-declined-search-result-list-element.component.ts index 90f523a7fb..179c158848 100644 --- a/src/app/shared/object-list/my-dspace-result-list-element/claimed-search-result/claimed-declined-search-result/claimed-declined-search-result-list-element.component.ts +++ b/src/app/shared/object-list/my-dspace-result-list-element/claimed-search-result/claimed-declined-search-result/claimed-declined-search-result-list-element.component.ts @@ -45,7 +45,7 @@ export class ClaimedDeclinedSearchResultListElementComponent extends SearchResul public constructor( protected linkService: LinkService, protected truncatableService: TruncatableService, - protected dsoNameService: DSONameService, + public dsoNameService: DSONameService, @Inject(APP_CONFIG) protected appConfig: AppConfig ) { super(truncatableService, dsoNameService, appConfig); diff --git a/src/app/shared/object-list/my-dspace-result-list-element/claimed-search-result/claimed-search-result-list-element.component.ts b/src/app/shared/object-list/my-dspace-result-list-element/claimed-search-result/claimed-search-result-list-element.component.ts index 237a5f516e..6f79a9f710 100644 --- a/src/app/shared/object-list/my-dspace-result-list-element/claimed-search-result/claimed-search-result-list-element.component.ts +++ b/src/app/shared/object-list/my-dspace-result-list-element/claimed-search-result/claimed-search-result-list-element.component.ts @@ -60,7 +60,7 @@ export class ClaimedSearchResultListElementComponent extends SearchResultListEle public constructor( protected linkService: LinkService, protected truncatableService: TruncatableService, - protected dsoNameService: DSONameService, + public dsoNameService: DSONameService, protected objectCache: ObjectCacheService, @Inject(APP_CONFIG) protected appConfig: AppConfig ) { diff --git a/src/app/shared/object-list/my-dspace-result-list-element/item-list-preview/item-list-preview.component.ts b/src/app/shared/object-list/my-dspace-result-list-element/item-list-preview/item-list-preview.component.ts index 04f1e24d7b..111ef33d00 100644 --- a/src/app/shared/object-list/my-dspace-result-list-element/item-list-preview/item-list-preview.component.ts +++ b/src/app/shared/object-list/my-dspace-result-list-element/item-list-preview/item-list-preview.component.ts @@ -49,7 +49,7 @@ export class ItemListPreviewComponent implements OnInit { constructor( @Inject(APP_CONFIG) protected appConfig: AppConfig, - private dsoNameService: DSONameService, + public dsoNameService: DSONameService, ) { } diff --git a/src/app/shared/object-list/my-dspace-result-list-element/pool-search-result/pool-search-result-list-element.component.ts b/src/app/shared/object-list/my-dspace-result-list-element/pool-search-result/pool-search-result-list-element.component.ts index cb924af40f..a993d9e080 100644 --- a/src/app/shared/object-list/my-dspace-result-list-element/pool-search-result/pool-search-result-list-element.component.ts +++ b/src/app/shared/object-list/my-dspace-result-list-element/pool-search-result/pool-search-result-list-element.component.ts @@ -70,7 +70,7 @@ export class PoolSearchResultListElementComponent extends SearchResultListElemen constructor( protected linkService: LinkService, protected truncatableService: TruncatableService, - protected dsoNameService: DSONameService, + public dsoNameService: DSONameService, protected objectCache: ObjectCacheService, @Inject(APP_CONFIG) protected appConfig: AppConfig ) { diff --git a/src/app/shared/object-list/my-dspace-result-list-element/workflow-item-search-result/workflow-item-search-result-list-element.component.ts b/src/app/shared/object-list/my-dspace-result-list-element/workflow-item-search-result/workflow-item-search-result-list-element.component.ts index 11d4e18137..fe28f82621 100644 --- a/src/app/shared/object-list/my-dspace-result-list-element/workflow-item-search-result/workflow-item-search-result-list-element.component.ts +++ b/src/app/shared/object-list/my-dspace-result-list-element/workflow-item-search-result/workflow-item-search-result-list-element.component.ts @@ -52,7 +52,7 @@ export class WorkflowItemSearchResultListElementComponent extends SearchResultLi constructor( protected truncatableService: TruncatableService, protected linkService: LinkService, - protected dsoNameService: DSONameService, + public dsoNameService: DSONameService, @Inject(APP_CONFIG) protected appConfig: AppConfig ) { super(truncatableService, dsoNameService, appConfig); diff --git a/src/app/shared/object-list/my-dspace-result-list-element/workspace-item-search-result/workspace-item-search-result-list-element.component.ts b/src/app/shared/object-list/my-dspace-result-list-element/workspace-item-search-result/workspace-item-search-result-list-element.component.ts index 08ac896035..3d382f8c69 100644 --- a/src/app/shared/object-list/my-dspace-result-list-element/workspace-item-search-result/workspace-item-search-result-list-element.component.ts +++ b/src/app/shared/object-list/my-dspace-result-list-element/workspace-item-search-result/workspace-item-search-result-list-element.component.ts @@ -52,7 +52,7 @@ export class WorkspaceItemSearchResultListElementComponent extends SearchResult constructor( protected truncatableService: TruncatableService, protected linkService: LinkService, - protected dsoNameService: DSONameService, + public dsoNameService: DSONameService, @Inject(APP_CONFIG) protected appConfig: AppConfig ) { super(truncatableService, dsoNameService, appConfig); diff --git a/src/app/shared/object-list/search-result-list-element/search-result-list-element.component.ts b/src/app/shared/object-list/search-result-list-element/search-result-list-element.component.ts index 72120a6b68..d51b769191 100644 --- a/src/app/shared/object-list/search-result-list-element/search-result-list-element.component.ts +++ b/src/app/shared/object-list/search-result-list-element/search-result-list-element.component.ts @@ -22,9 +22,9 @@ export class SearchResultListElementComponent, K exten dsoTitle: string; public constructor(protected truncatableService: TruncatableService, - protected dsoNameService: DSONameService, + public dsoNameService: DSONameService, @Inject(APP_CONFIG) protected appConfig?: AppConfig) { - super(); + super(dsoNameService); } /** diff --git a/src/app/shared/object-list/sidebar-search-list-element/sidebar-search-list-element.component.ts b/src/app/shared/object-list/sidebar-search-list-element/sidebar-search-list-element.component.ts index c87559e11d..0ffe2d58b4 100644 --- a/src/app/shared/object-list/sidebar-search-list-element/sidebar-search-list-element.component.ts +++ b/src/app/shared/object-list/sidebar-search-list-element/sidebar-search-list-element.component.ts @@ -35,7 +35,7 @@ export class SidebarSearchListElementComponent, K exte public constructor(protected truncatableService: TruncatableService, protected linkService: LinkService, - protected dsoNameService: DSONameService + public dsoNameService: DSONameService, ) { super(truncatableService, dsoNameService, null); } diff --git a/src/app/shared/object-select/collection-select/collection-select.component.html b/src/app/shared/object-select/collection-select/collection-select.component.html index 84577f645e..9b87f69c04 100644 --- a/src/app/shared/object-select/collection-select/collection-select.component.html +++ b/src/app/shared/object-select/collection-select/collection-select.component.html @@ -18,7 +18,7 @@ - {{collection.name}} + {{ dsoNameService.getName(collection) }} diff --git a/src/app/shared/object-select/collection-select/collection-select.component.scss b/src/app/shared/object-select/collection-select/collection-select.component.scss new file mode 100644 index 0000000000..b505f2895d --- /dev/null +++ b/src/app/shared/object-select/collection-select/collection-select.component.scss @@ -0,0 +1,3 @@ +table tr th:first-of-type, table tr td:first-of-type, { + width: 1rem !important; +} diff --git a/src/app/shared/object-select/collection-select/collection-select.component.ts b/src/app/shared/object-select/collection-select/collection-select.component.ts index a02305f116..2d36f80274 100644 --- a/src/app/shared/object-select/collection-select/collection-select.component.ts +++ b/src/app/shared/object-select/collection-select/collection-select.component.ts @@ -4,10 +4,12 @@ import { ObjectSelectComponent } from '../object-select/object-select.component' import { isNotEmpty } from '../../empty.util'; import { ObjectSelectService } from '../object-select.service'; import { AuthorizationDataService } from '../../../core/data/feature-authorization/authorization-data.service'; +import { DSONameService } from '../../../core/breadcrumbs/dso-name.service'; @Component({ selector: 'ds-collection-select', - templateUrl: './collection-select.component.html' + templateUrl: './collection-select.component.html', + styleUrls: ['./collection-select.component.scss'], }) /** @@ -15,8 +17,11 @@ import { AuthorizationDataService } from '../../../core/data/feature-authorizati */ export class CollectionSelectComponent extends ObjectSelectComponent { - constructor(protected objectSelectService: ObjectSelectService, - protected authorizationService: AuthorizationDataService) { + constructor( + protected objectSelectService: ObjectSelectService, + protected authorizationService: AuthorizationDataService, + public dsoNameService: DSONameService, + ) { super(objectSelectService, authorizationService); } diff --git a/src/app/shared/object-select/item-select/item-select.component.html b/src/app/shared/object-select/item-select/item-select.component.html index b7fce78289..7f8ff943a3 100644 --- a/src/app/shared/object-select/item-select/item-select.component.html +++ b/src/app/shared/object-select/item-select/item-select.component.html @@ -22,11 +22,13 @@ - {{collection?.name}} + + {{ dsoNameService.getName(collection) }} + {{item.firstMetadataValue(['dc.contributor.author', 'dc.creator', 'dc.contributor.*'])}} - {{item.firstMetadataValue("dc.title")}} + {{ dsoNameService.getName(item) }} diff --git a/src/app/shared/object-select/item-select/item-select.component.ts b/src/app/shared/object-select/item-select/item-select.component.ts index 5cf32c2953..dd0266ff83 100644 --- a/src/app/shared/object-select/item-select/item-select.component.ts +++ b/src/app/shared/object-select/item-select/item-select.component.ts @@ -8,6 +8,7 @@ import { getAllSucceededRemoteDataPayload } from '../../../core/shared/operators import { map } from 'rxjs/operators'; import { getItemPageRoute } from '../../../item-page/item-page-routing-paths'; import { AuthorizationDataService } from '../../../core/data/feature-authorization/authorization-data.service'; +import { DSONameService } from '../../../core/breadcrumbs/dso-name.service'; @Component({ selector: 'ds-item-select', @@ -34,8 +35,11 @@ export class ItemSelectComponent extends ObjectSelectComponent { [itemId: string]: string }>; - constructor(protected objectSelectService: ObjectSelectService, - protected authorizationService: AuthorizationDataService ) { + constructor( + protected objectSelectService: ObjectSelectService, + protected authorizationService: AuthorizationDataService, + public dsoNameService: DSONameService, + ) { super(objectSelectService, authorizationService); } diff --git a/src/app/shared/search-form/search-form.component.html b/src/app/shared/search-form/search-form.component.html index 226962cc61..b6b4395c2f 100644 --- a/src/app/shared/search-form/search-form.component.html +++ b/src/app/shared/search-form/search-form.component.html @@ -2,7 +2,7 @@
- +
diff --git a/src/app/shared/search-form/search-form.component.ts b/src/app/shared/search-form/search-form.component.ts index 7ea51e4c1e..8a1b69887a 100644 --- a/src/app/shared/search-form/search-form.component.ts +++ b/src/app/shared/search-form/search-form.component.ts @@ -12,6 +12,7 @@ import { take } from 'rxjs/operators'; import { BehaviorSubject } from 'rxjs'; import { DSpaceObjectDataService } from '../../core/data/dspace-object-data.service'; import { getFirstSucceededRemoteDataPayload } from '../../core/shared/operators'; +import { DSONameService } from '../../core/breadcrumbs/dso-name.service'; /** * This component renders a simple item page. @@ -79,7 +80,8 @@ export class SearchFormComponent implements OnInit { private paginationService: PaginationService, private searchConfig: SearchConfigurationService, private modalService: NgbModal, - private dsoService: DSpaceObjectDataService + private dsoService: DSpaceObjectDataService, + public dsoNameService: DSONameService, ) { } diff --git a/src/app/submission/form/collection/submission-form-collection.component.spec.ts b/src/app/submission/form/collection/submission-form-collection.component.spec.ts index 5b9946e1a4..c4ac4eff76 100644 --- a/src/app/submission/form/collection/submission-form-collection.component.spec.ts +++ b/src/app/submission/form/collection/submission-form-collection.component.spec.ts @@ -23,6 +23,8 @@ import { CollectionDataService } from '../../../core/data/collection-data.servic import { SectionsService } from '../../sections/sections.service'; import { Collection } from '../../../core/shared/collection.model'; import { createSuccessfulRemoteDataObject$ } from '../../../shared/remote-data.utils'; +import { DSONameService } from '../../../core/breadcrumbs/dso-name.service'; +import { DSONameServiceMock } from '../../../shared/mocks/dso-name.service.mock'; describe('SubmissionFormCollectionComponent Component', () => { @@ -136,6 +138,7 @@ describe('SubmissionFormCollectionComponent Component', () => { TestComponent ], providers: [ + { provide: DSONameService, useValue: new DSONameServiceMock() }, { provide: CollectionDataService, useValue: collectionDataService }, { provide: SubmissionJsonPatchOperationsService, useClass: SubmissionJsonPatchOperationsServiceStub }, { provide: SubmissionService, useClass: SubmissionServiceStub }, diff --git a/src/app/submission/form/collection/submission-form-collection.component.ts b/src/app/submission/form/collection/submission-form-collection.component.ts index f90814f185..6cdd95a5de 100644 --- a/src/app/submission/form/collection/submission-form-collection.component.ts +++ b/src/app/submission/form/collection/submission-form-collection.component.ts @@ -29,6 +29,7 @@ import { CollectionDropdownComponent } from '../../../shared/collection-dropdown import { SectionsService } from '../../sections/sections.service'; import { getFirstSucceededRemoteDataPayload } from '../../../core/shared/operators'; import { SectionsType } from '../../sections/sections-type'; +import { DSONameService } from '../../../core/breadcrumbs/dso-name.service'; /** * This component allows to show the current collection the submission belonging to and to change it. @@ -105,22 +106,14 @@ export class SubmissionFormCollectionComponent implements OnChanges, OnInit { */ available$: Observable; - /** - * Initialize instance variables - * - * @param {ChangeDetectorRef} cdr - * @param {CollectionDataService} collectionDataService - * @param {JsonPatchOperationsBuilder} operationsBuilder - * @param {SubmissionJsonPatchOperationsService} operationsService - * @param {SubmissionService} submissionService - * @param {SectionsService} sectionsService - */ constructor(protected cdr: ChangeDetectorRef, private collectionDataService: CollectionDataService, private operationsBuilder: JsonPatchOperationsBuilder, private operationsService: SubmissionJsonPatchOperationsService, private submissionService: SubmissionService, - private sectionsService: SectionsService) { + private sectionsService: SectionsService, + public dsoNameService: DSONameService, + ) { } /** @@ -133,7 +126,7 @@ export class SubmissionFormCollectionComponent implements OnChanges, OnInit { this.selectedCollectionName$ = this.collectionDataService.findById(this.currentCollectionId).pipe( find((collectionRD: RemoteData) => isNotEmpty(collectionRD.payload)), - map((collectionRD: RemoteData) => collectionRD.payload.name) + map((collectionRD: RemoteData) => this.dsoNameService.getName(collectionRD.payload)) ); } } @@ -175,7 +168,7 @@ export class SubmissionFormCollectionComponent implements OnChanges, OnInit { }) ).subscribe((submissionObject: SubmissionObject) => { this.selectedCollectionId = event.collection.id; - this.selectedCollectionName$ = observableOf(event.collection.name); + this.selectedCollectionName$ = observableOf(this.dsoNameService.getName(event.collection)); this.collectionChange.emit(submissionObject); this.submissionService.changeSubmissionCollection(this.submissionId, event.collection.id); this.processingChange$.next(false); diff --git a/src/app/submission/sections/upload/accessConditions/submission-section-upload-access-conditions.component.ts b/src/app/submission/sections/upload/accessConditions/submission-section-upload-access-conditions.component.ts index 22654e5688..1a6a05e7b6 100644 --- a/src/app/submission/sections/upload/accessConditions/submission-section-upload-access-conditions.component.ts +++ b/src/app/submission/sections/upload/accessConditions/submission-section-upload-access-conditions.component.ts @@ -7,6 +7,7 @@ import { ResourcePolicy } from '../../../../core/resource-policy/models/resource import { isEmpty } from '../../../../shared/empty.util'; import { Group } from '../../../../core/eperson/models/group.model'; import { RemoteData } from '../../../../core/data/remote-data'; +import { DSONameService } from '../../../../core/breadcrumbs/dso-name.service'; /** * This component represents a badge that describe an access condition @@ -27,14 +28,13 @@ export class SubmissionSectionUploadAccessConditionsComponent implements OnInit * The list of access conditions * @type {Array} */ - public accessConditionsList = []; + public accessConditionsList: ResourcePolicy[] = []; - /** - * Initialize instance variables - * - * @param {GroupDataService} groupService - */ - constructor(private groupService: GroupDataService) {} + constructor( + public dsoNameService: DSONameService, + protected groupService: GroupDataService, + ) { + } /** * Retrieve access conditions list @@ -47,7 +47,7 @@ export class SubmissionSectionUploadAccessConditionsComponent implements OnInit .subscribe((rd: RemoteData) => { const group: Group = rd.payload; const accessConditionEntry = Object.assign({}, accessCondition); - accessConditionEntry.name = group.name; + accessConditionEntry.name = this.dsoNameService.getName(group); this.accessConditionsList.push(accessConditionEntry); }); } else { diff --git a/src/app/submission/sections/upload/section-upload.component.ts b/src/app/submission/sections/upload/section-upload.component.ts index 5b89806134..eefed8a36b 100644 --- a/src/app/submission/sections/upload/section-upload.component.ts +++ b/src/app/submission/sections/upload/section-upload.component.ts @@ -30,6 +30,7 @@ import { Collection } from '../../../core/shared/collection.model'; import { AccessConditionOption } from '../../../core/config/models/config-access-condition-option.model'; import { followLink } from '../../../shared/utils/follow-link-config.model'; import { getFirstSucceededRemoteData } from '../../../core/shared/operators'; +import { DSONameService } from '../../../core/breadcrumbs/dso-name.service'; export const POLICY_DEFAULT_NO_LIST = 1; // Banner1 export const POLICY_DEFAULT_WITH_LIST = 2; // Banner2 @@ -138,6 +139,7 @@ export class SubmissionSectionUploadComponent extends SectionModelComponent { protected sectionService: SectionsService, private submissionService: SubmissionService, private uploadsConfigService: SubmissionUploadsConfigDataService, + public dsoNameService: DSONameService, @Inject('sectionDataProvider') public injectedSectionData: SectionDataObject, @Inject('submissionIdProvider') public injectedSubmissionId: string) { super(undefined, injectedSectionData, injectedSubmissionId); @@ -167,7 +169,7 @@ export class SubmissionSectionUploadComponent extends SectionModelComponent { tap((submissionObject: SubmissionObjectEntry) => this.collectionId = submissionObject.collection), mergeMap((submissionObject: SubmissionObjectEntry) => this.collectionDataService.findById(submissionObject.collection)), filter((rd: RemoteData) => isNotUndefined((rd.payload))), - tap((collectionRemoteData: RemoteData) => this.collectionName = collectionRemoteData.payload.name), + tap((collectionRemoteData: RemoteData) => this.collectionName = this.dsoNameService.getName(collectionRemoteData.payload)), // TODO review this part when https://github.com/DSpace/dspace-angular/issues/575 is resolved /* mergeMap((collectionRemoteData: RemoteData) => { return this.resourcePolicyService.findByHref( From 1e7ede015b59350d24058b57f425b912c7645ecf Mon Sep 17 00:00:00 2001 From: "Mark H. Wood" Date: Mon, 6 Mar 2023 11:19:49 -0500 Subject: [PATCH 061/409] Don't allow the date picker to exceed the maximum start or end date for an access option. --- .../section-upload-file-edit.component.ts | 27 ++++++++++++++++--- 1 file changed, 23 insertions(+), 4 deletions(-) diff --git a/src/app/submission/sections/upload/file/edit/section-upload-file-edit.component.ts b/src/app/submission/sections/upload/file/edit/section-upload-file-edit.component.ts index 195d291530..5ad9b21172 100644 --- a/src/app/submission/sections/upload/file/edit/section-upload-file-edit.component.ts +++ b/src/app/submission/sections/upload/file/edit/section-upload-file-edit.component.ts @@ -1,4 +1,4 @@ -import { ChangeDetectorRef, Component, OnInit, ViewChild } from '@angular/core'; +import { ChangeDetectorRef, Component, OnDestroy, OnInit, ViewChild } from '@angular/core'; import { FormControl } from '@angular/forms'; import { @@ -66,7 +66,8 @@ import { DynamicDateControlValue } from '@ng-dynamic-forms/core/lib/model/dynami styleUrls: ['./section-upload-file-edit.component.scss'], templateUrl: './section-upload-file-edit.component.html', }) -export class SubmissionSectionUploadFileEditComponent implements OnInit { +export class SubmissionSectionUploadFileEditComponent + implements OnInit, OnDestroy { /** * The FormComponent reference @@ -435,13 +436,31 @@ export class SubmissionSectionUploadFileEditComponent implements OnInit { delete currentAccessCondition.startDate; } else if (accessCondition.startDate) { const startDate = this.retrieveValueFromField(accessCondition.startDate); - currentAccessCondition.startDate = dateToISOFormat(startDate); + // Clamp the start date to the maximum, if any, since the + // datepicker sometimes exceeds it. + let startDateDate = new Date(startDate); + if (accessConditionOpt.maxStartDate) { + const maxStartDateDate = new Date(accessConditionOpt.maxStartDate); + if (startDateDate > maxStartDateDate) { + startDateDate = maxStartDateDate; + } + } + currentAccessCondition.startDate = dateToISOFormat(startDateDate); } if (!accessConditionOpt.hasEndDate) { delete currentAccessCondition.endDate; } else if (accessCondition.endDate) { const endDate = this.retrieveValueFromField(accessCondition.endDate); - currentAccessCondition.endDate = dateToISOFormat(endDate); + // Clamp the end date to the maximum, if any, since the + // datepicker sometimes exceeds it. + let endDateDate = new Date(endDate); + if (accessConditionOpt.maxEndDate) { + const maxEndDateDate = new Date(accessConditionOpt.maxEndDate); + if (endDateDate > maxEndDateDate) { + endDateDate = maxEndDateDate; + } + } + currentAccessCondition.endDate = dateToISOFormat(endDateDate); } accessConditionsToSave.push(currentAccessCondition); } From 2030b29ddcedfe119b994173579480425af37044 Mon Sep 17 00:00:00 2001 From: Alexandre Vryghem Date: Thu, 16 Mar 2023 00:26:11 +0100 Subject: [PATCH 062/409] Fix scope name not being displayed after a page refresh & code cleanup --- .../search-form/search-form.component.html | 9 ++++-- .../search-form/search-form.component.spec.ts | 29 ++----------------- .../search-form/search-form.component.ts | 22 +++----------- 3 files changed, 14 insertions(+), 46 deletions(-) diff --git a/src/app/shared/search-form/search-form.component.html b/src/app/shared/search-form/search-form.component.html index b6b4395c2f..f916785804 100644 --- a/src/app/shared/search-form/search-form.component.html +++ b/src/app/shared/search-form/search-form.component.html @@ -2,9 +2,14 @@
- +
- diff --git a/src/app/shared/search-form/search-form.component.spec.ts b/src/app/shared/search-form/search-form.component.spec.ts index 4b5844f660..584b7c5584 100644 --- a/src/app/shared/search-form/search-form.component.spec.ts +++ b/src/app/shared/search-form/search-form.component.spec.ts @@ -33,7 +33,7 @@ describe('SearchFormComponent', () => { }; beforeEach(waitForAsync(() => { - TestBed.configureTestingModule({ + return TestBed.configureTestingModule({ imports: [FormsModule, RouterTestingModule, TranslateModule.forRoot()], providers: [ { provide: Router, useValue: router }, @@ -96,7 +96,7 @@ describe('SearchFormComponent', () => { tick(); const scopeSelect = de.query(By.css('.scope-button')).nativeElement; - expect(scopeSelect.textContent).toBe(testCommunity.name); + expect(scopeSelect.textContent).toContain('Sample Community'); })); describe('updateSearch', () => { @@ -172,32 +172,9 @@ describe('SearchFormComponent', () => { expect(comp.updateSearch).toHaveBeenCalledWith(searchQuery); }); }); - - // it('should call updateSearch when clicking the submit button with correct parameters', fakeAsync(() => { - // comp.query = 'Test String' - // fixture.detectChanges(); - // spyOn(comp, 'updateSearch').and.callThrough(); - // fixture.detectChanges(); - // - // const submit = de.query(By.css('button.search-button')).nativeElement; - // const scope = '123456'; - // const query = 'test'; - // const select = de.query(By.css('select')).nativeElement; - // const input = de.query(By.css('input')).nativeElement; - // - // tick(); - // select.value = scope; - // input.value = query; - // - // fixture.detectChanges(); - // - // submit.click(); - // - // expect(comp.updateSearch).toHaveBeenCalledWith({ scope: scope, query: query }); - // })); }); -export const objects: DSpaceObject[] = [ +const objects: DSpaceObject[] = [ Object.assign(new Community(), { logo: { self: { diff --git a/src/app/shared/search-form/search-form.component.ts b/src/app/shared/search-form/search-form.component.ts index 8a1b69887a..fbab550a94 100644 --- a/src/app/shared/search-form/search-form.component.ts +++ b/src/app/shared/search-form/search-form.component.ts @@ -1,4 +1,4 @@ -import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core'; +import { Component, EventEmitter, Input, Output, OnChanges } from '@angular/core'; import { DSpaceObject } from '../../core/shared/dspace-object.model'; import { Router } from '@angular/router'; import { isNotEmpty } from '../empty.util'; @@ -14,22 +14,15 @@ import { DSpaceObjectDataService } from '../../core/data/dspace-object-data.serv import { getFirstSucceededRemoteDataPayload } from '../../core/shared/operators'; import { DSONameService } from '../../core/breadcrumbs/dso-name.service'; -/** - * This component renders a simple item page. - * The route parameter 'id' is used to request the item it represents. - * All fields of the item that should be displayed, are defined in its template. - */ - @Component({ selector: 'ds-search-form', styleUrls: ['./search-form.component.scss'], templateUrl: './search-form.component.html' }) - /** * Component that represents the search form */ -export class SearchFormComponent implements OnInit { +export class SearchFormComponent implements OnChanges { /** * The search query */ @@ -88,7 +81,7 @@ export class SearchFormComponent implements OnInit { /** * Retrieve the scope object from the URL so we can show its name */ - ngOnInit(): void { + ngOnChanges(): void { if (isNotEmpty(this.scope)) { this.dsoService.findById(this.scope).pipe(getFirstSucceededRemoteDataPayload()) .subscribe((scope: DSpaceObject) => this.selectedScope.next(scope)); @@ -122,19 +115,12 @@ export class SearchFormComponent implements OnInit { updateSearch(data: any) { const queryParams = Object.assign({}, data); - this.router.navigate(this.getSearchLinkParts(), { + void this.router.navigate(this.getSearchLinkParts(), { queryParams: queryParams, queryParamsHandling: 'merge' }); } - /** - * For usage of the isNotEmpty function in the template - */ - isNotEmpty(object: any) { - return isNotEmpty(object); - } - /** * @returns {string} The base path to the search page, or the current page when inPlaceSearch is true */ From b31fdf0be6c138f4d114eaa66abfb095cd8863e0 Mon Sep 17 00:00:00 2001 From: Enea Jahollari Date: Thu, 23 Mar 2023 11:59:50 +0100 Subject: [PATCH 063/409] [CST-7216] Imported UploadModule in AdminModule to fix build error --- src/app/admin/admin.module.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/app/admin/admin.module.ts b/src/app/admin/admin.module.ts index 768e3120df..3dc0036854 100644 --- a/src/app/admin/admin.module.ts +++ b/src/app/admin/admin.module.ts @@ -11,6 +11,7 @@ import { AdminSidebarSectionComponent } from './admin-sidebar/admin-sidebar-sect import { ExpandableAdminSidebarSectionComponent } from './admin-sidebar/expandable-admin-sidebar-section/expandable-admin-sidebar-section.component'; import { BatchImportPageComponent } from './admin-import-batch-page/batch-import-page.component'; import { UiSwitchModule } from 'ngx-ui-switch'; +import { UploadModule } from '../shared/upload/upload.module'; const ENTRY_COMPONENTS = [ // put only entry components that use custom decorator @@ -27,7 +28,8 @@ const ENTRY_COMPONENTS = [ AdminSearchModule.withEntryComponents(), AdminWorkflowModuleModule.withEntryComponents(), SharedModule, - UiSwitchModule + UiSwitchModule, + UploadModule, ], declarations: [ AdminCurationTasksComponent, From af9b4a292e4c289c50fcd96eeabcc49cf3e3045e Mon Sep 17 00:00:00 2001 From: Enea Jahollari Date: Thu, 30 Mar 2023 12:28:48 +0200 Subject: [PATCH 064/409] Fix error message when updating ORCID settings --- .../orcid-sync-settings/orcid-sync-settings.component.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/app/item-page/orcid-page/orcid-sync-settings/orcid-sync-settings.component.ts b/src/app/item-page/orcid-page/orcid-sync-settings/orcid-sync-settings.component.ts index 494075c0f0..1ed8e95616 100644 --- a/src/app/item-page/orcid-page/orcid-sync-settings/orcid-sync-settings.component.ts +++ b/src/app/item-page/orcid-page/orcid-sync-settings/orcid-sync-settings.component.ts @@ -156,7 +156,8 @@ export class OrcidSyncSettingsComponent implements OnInit { } }), ).subscribe((remoteData: RemoteData) => { - if (remoteData.isSuccess) { + // hasSucceeded is true if the response is success or successStale + if (remoteData.hasSucceeded) { this.notificationsService.success(this.translateService.get(this.messagePrefix + '.synchronization-settings-update.success')); this.settingsUpdated.emit(); } else { From b00a0f5be9b28a4e44d35514503b4cf7acc22ec9 Mon Sep 17 00:00:00 2001 From: Alexandre Vryghem Date: Wed, 29 Mar 2023 17:56:48 +0200 Subject: [PATCH 065/409] 100553: Added extra regex validation to prevent users from adding namespaces, elements and qualifiers with spaces Minor fixes: - Metadata Registry's name field was not being emptied after successful submission - The first input from both forms both had the red error border after clearing the fields --- .../metadata-schema-form.component.spec.ts | 4 +++- .../metadata-schema-form.component.ts | 11 ++++++++--- .../metadata-field-form.component.spec.ts | 4 +++- .../metadata-field-form.component.ts | 15 +++++++++++++-- src/assets/i18n/en.json5 | 6 ++++++ 5 files changed, 33 insertions(+), 7 deletions(-) diff --git a/src/app/admin/admin-registries/metadata-registry/metadata-schema-form/metadata-schema-form.component.spec.ts b/src/app/admin/admin-registries/metadata-registry/metadata-schema-form/metadata-schema-form.component.spec.ts index 8d416c2df8..98e98a6646 100644 --- a/src/app/admin/admin-registries/metadata-registry/metadata-schema-form/metadata-schema-form.component.spec.ts +++ b/src/app/admin/admin-registries/metadata-registry/metadata-schema-form/metadata-schema-form.component.spec.ts @@ -29,7 +29,9 @@ describe('MetadataSchemaFormComponent', () => { createFormGroup: () => { return { patchValue: () => { - } + }, + markAsUntouched(opts?: any) { + }, }; } }; diff --git a/src/app/admin/admin-registries/metadata-registry/metadata-schema-form/metadata-schema-form.component.ts b/src/app/admin/admin-registries/metadata-registry/metadata-schema-form/metadata-schema-form.component.ts index 5c6885ae72..adb649696c 100644 --- a/src/app/admin/admin-registries/metadata-registry/metadata-schema-form/metadata-schema-form.component.ts +++ b/src/app/admin/admin-registries/metadata-registry/metadata-schema-form/metadata-schema-form.component.ts @@ -77,10 +77,10 @@ export class MetadataSchemaFormComponent implements OnInit, OnDestroy { } ngOnInit() { - combineLatest( + combineLatest([ this.translateService.get(`${this.messagePrefix}.name`), this.translateService.get(`${this.messagePrefix}.namespace`) - ).subscribe(([name, namespace]) => { + ]).subscribe(([name, namespace]) => { this.name = new DynamicInputModel({ id: 'name', label: name, @@ -97,8 +97,12 @@ export class MetadataSchemaFormComponent implements OnInit, OnDestroy { name: 'namespace', validators: { required: null, + pattern: '^[^.]*$', }, required: true, + errorMessages: { + pattern: 'error.validation.metadata.namespace.invalid-pattern', + }, }); this.formModel = [ new DynamicFormGroupModel( @@ -163,9 +167,10 @@ export class MetadataSchemaFormComponent implements OnInit, OnDestroy { * Reset all input-fields to be empty */ clearFields() { + this.formGroup.markAsUntouched(); this.formGroup.patchValue({ metadatadataschemagroup:{ - prefix: '', + name: '', namespace: '' } }); diff --git a/src/app/admin/admin-registries/metadata-schema/metadata-field-form/metadata-field-form.component.spec.ts b/src/app/admin/admin-registries/metadata-schema/metadata-field-form/metadata-field-form.component.spec.ts index e13180d633..fcd8dd395d 100644 --- a/src/app/admin/admin-registries/metadata-schema/metadata-field-form/metadata-field-form.component.spec.ts +++ b/src/app/admin/admin-registries/metadata-schema/metadata-field-form/metadata-field-form.component.spec.ts @@ -39,7 +39,9 @@ describe('MetadataFieldFormComponent', () => { createFormGroup: () => { return { patchValue: () => { - } + }, + markAsUntouched(opts?: any) { + }, }; } }; diff --git a/src/app/admin/admin-registries/metadata-schema/metadata-field-form/metadata-field-form.component.ts b/src/app/admin/admin-registries/metadata-schema/metadata-field-form/metadata-field-form.component.ts index 1c000c3c76..14013f3cb7 100644 --- a/src/app/admin/admin-registries/metadata-schema/metadata-field-form/metadata-field-form.component.ts +++ b/src/app/admin/admin-registries/metadata-schema/metadata-field-form/metadata-field-form.component.ts @@ -98,25 +98,35 @@ export class MetadataFieldFormComponent implements OnInit, OnDestroy { * Initialize the component, setting up the necessary Models for the dynamic form */ ngOnInit() { - combineLatest( + combineLatest([ this.translateService.get(`${this.messagePrefix}.element`), this.translateService.get(`${this.messagePrefix}.qualifier`), this.translateService.get(`${this.messagePrefix}.scopenote`) - ).subscribe(([element, qualifier, scopenote]) => { + ]).subscribe(([element, qualifier, scopenote]) => { this.element = new DynamicInputModel({ id: 'element', label: element, name: 'element', validators: { required: null, + pattern: '^[^.]*$', }, required: true, + errorMessages: { + pattern: 'error.validation.metadata.element.invalid-pattern', + }, }); this.qualifier = new DynamicInputModel({ id: 'qualifier', label: qualifier, name: 'qualifier', + validators: { + pattern: '^[^.]*$', + }, required: false, + errorMessages: { + pattern: 'error.validation.metadata.qualifier.invalid-pattern', + }, }); this.scopeNote = new DynamicInputModel({ id: 'scopeNote', @@ -189,6 +199,7 @@ export class MetadataFieldFormComponent implements OnInit, OnDestroy { * Reset all input-fields to be empty */ clearFields() { + this.formGroup.markAsUntouched(); this.formGroup.patchValue({ metadatadatafieldgroup: { element: '', diff --git a/src/assets/i18n/en.json5 b/src/assets/i18n/en.json5 index 597f226cc7..c0edb83a3b 100644 --- a/src/assets/i18n/en.json5 +++ b/src/assets/i18n/en.json5 @@ -1478,6 +1478,12 @@ "error.validation.groupExists": "This group already exists", + "error.validation.metadata.namespace.invalid-pattern": "This field cannot contain dots, please use the Element & Qualifier fields instead", + + "error.validation.metadata.element.invalid-pattern": "This field cannot contain dots, please use the Qualifier field instead", + + "error.validation.metadata.qualifier.invalid-pattern": "This field cannot contain dots", + "feed.description": "Syndication feed", From 792a614631dcc6e915ea0301355f06b387a3db4f Mon Sep 17 00:00:00 2001 From: Alexandre Vryghem Date: Thu, 30 Mar 2023 17:09:50 +0200 Subject: [PATCH 066/409] 100553: Set the maximum amount of metadata fields shown on EditInPlaceFieldComponent back to 10 --- .../edit-in-place-field/edit-in-place-field.component.html | 2 +- .../edit-in-place-field.component.spec.ts | 2 +- .../edit-in-place-field/edit-in-place-field.component.ts | 6 ++++-- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/app/item-page/edit-item-page/item-metadata/edit-in-place-field/edit-in-place-field.component.html b/src/app/item-page/edit-item-page/item-metadata/edit-in-place-field/edit-in-place-field.component.html index 46299c1b08..64e863b8bf 100644 --- a/src/app/item-page/edit-item-page/item-metadata/edit-in-place-field/edit-in-place-field.component.html +++ b/src/app/item-page/edit-item-page/item-metadata/edit-in-place-field/edit-in-place-field.component.html @@ -12,7 +12,7 @@ (clickSuggestion)="update(suggestionControl)" (typeSuggestion)="update(suggestionControl)" (dsClickOutside)="checkValidity(suggestionControl)" - (findSuggestions)="findMetadataFieldSuggestions($event)" + (findSuggestions)="findMetadataFieldSuggestions($event, { elementsPerPage: 10 })" #suggestionControl="ngModel" [valid]="(valid | async) !== false" dsAutoFocus autoFocusSelector=".suggestion_input" diff --git a/src/app/item-page/edit-item-page/item-metadata/edit-in-place-field/edit-in-place-field.component.spec.ts b/src/app/item-page/edit-item-page/item-metadata/edit-in-place-field/edit-in-place-field.component.spec.ts index 121ab4580e..2a2ca7ffaa 100644 --- a/src/app/item-page/edit-item-page/item-metadata/edit-in-place-field/edit-in-place-field.component.spec.ts +++ b/src/app/item-page/edit-item-page/item-metadata/edit-in-place-field/edit-in-place-field.component.spec.ts @@ -228,7 +228,7 @@ describe('EditInPlaceFieldComponent', () => { })); it('it should call queryMetadataFields on the metadataFieldService with the correct query', () => { - expect(metadataFieldService.queryMetadataFields).toHaveBeenCalledWith(query, null, true, false, followLink('schema')); + expect(metadataFieldService.queryMetadataFields).toHaveBeenCalledWith(query, {}, true, false, followLink('schema')); }); it('it should set metadataFieldSuggestions to the right value', () => { diff --git a/src/app/item-page/edit-item-page/item-metadata/edit-in-place-field/edit-in-place-field.component.ts b/src/app/item-page/edit-item-page/item-metadata/edit-in-place-field/edit-in-place-field.component.ts index f1ebecb84f..6ed057bc6a 100644 --- a/src/app/item-page/edit-item-page/item-metadata/edit-in-place-field/edit-in-place-field.component.ts +++ b/src/app/item-page/edit-item-page/item-metadata/edit-in-place-field/edit-in-place-field.component.ts @@ -15,6 +15,7 @@ import { InputSuggestion } from '../../../../shared/input-suggestions/input-sugg import { followLink } from '../../../../shared/utils/follow-link-config.model'; import { FieldUpdate } from '../../../../core/data/object-updates/field-update.model'; import { FieldChangeType } from '../../../../core/data/object-updates/field-change-type.model'; +import { FindListOptions } from '../../../../core/data/find-list-options.model'; @Component({ // eslint-disable-next-line @angular-eslint/component-selector @@ -124,10 +125,11 @@ export class EditInPlaceFieldComponent implements OnInit, OnChanges { * Then sets all found metadata fields as metadataFieldSuggestions * Ignores fields from metadata schemas "relation" and "relationship" * @param query The query to look for + * @param options The options that need to be given to the backend */ - findMetadataFieldSuggestions(query: string) { + findMetadataFieldSuggestions(query: string, options: FindListOptions = {}) { if (isNotEmpty(query)) { - return this.registryService.queryMetadataFields(query, null, true, false, followLink('schema')).pipe( + return this.registryService.queryMetadataFields(query, options, true, false, followLink('schema')).pipe( getFirstSucceededRemoteData(), metadataFieldsToString(), ).subscribe((fieldNames: string[]) => { From 24e6cdd3ecbc30b9941f28564f9613be56a37928 Mon Sep 17 00:00:00 2001 From: Alexandre Vryghem Date: Mon, 3 Apr 2023 14:13:06 +0200 Subject: [PATCH 067/409] 100553: Removed possibility to updated schema name, element and qualifier --- .../metadata-schema-form.component.spec.ts | 27 ++++----- .../metadata-schema-form.component.ts | 49 ++++++++-------- .../metadata-field-form.component.spec.ts | 22 ++++--- .../metadata-field-form.component.ts | 58 +++++++++---------- 4 files changed, 75 insertions(+), 81 deletions(-) diff --git a/src/app/admin/admin-registries/metadata-registry/metadata-schema-form/metadata-schema-form.component.spec.ts b/src/app/admin/admin-registries/metadata-registry/metadata-schema-form/metadata-schema-form.component.spec.ts index 98e98a6646..b758767ddb 100644 --- a/src/app/admin/admin-registries/metadata-registry/metadata-schema-form/metadata-schema-form.component.spec.ts +++ b/src/app/admin/admin-registries/metadata-registry/metadata-schema-form/metadata-schema-form.component.spec.ts @@ -1,5 +1,4 @@ import { ComponentFixture, inject, TestBed, waitForAsync } from '@angular/core/testing'; - import { MetadataSchemaFormComponent } from './metadata-schema-form.component'; import { NO_ERRORS_SCHEMA } from '@angular/core'; import { CommonModule } from '@angular/common'; @@ -30,7 +29,7 @@ describe('MetadataSchemaFormComponent', () => { return { patchValue: () => { }, - markAsUntouched(opts?: any) { + reset(_value?: any, _options?: { onlySelf?: boolean; emitEvent?: boolean; }): void { }, }; } @@ -38,7 +37,7 @@ describe('MetadataSchemaFormComponent', () => { /* eslint-enable no-empty, @typescript-eslint/no-empty-function */ beforeEach(waitForAsync(() => { - TestBed.configureTestingModule({ + return TestBed.configureTestingModule({ imports: [CommonModule, RouterTestingModule.withRoutes([]), TranslateModule.forRoot(), NgbModule], declarations: [MetadataSchemaFormComponent, EnumKeysPipe], providers: [ @@ -66,7 +65,7 @@ describe('MetadataSchemaFormComponent', () => { const expected = Object.assign(new MetadataSchema(), { namespace: namespace, prefix: prefix - }); + } as MetadataSchema); beforeEach(() => { spyOn(component.submitForm, 'emit'); @@ -81,11 +80,10 @@ describe('MetadataSchemaFormComponent', () => { fixture.detectChanges(); }); - it('should emit a new schema using the correct values', waitForAsync(() => { - fixture.whenStable().then(() => { - expect(component.submitForm.emit).toHaveBeenCalledWith(expected); - }); - })); + it('should emit a new schema using the correct values', async () => { + await fixture.whenStable(); + expect(component.submitForm.emit).toHaveBeenCalledWith(expected); + }); }); describe('with an active schema', () => { @@ -93,7 +91,7 @@ describe('MetadataSchemaFormComponent', () => { id: 1, namespace: namespace, prefix: prefix - }); + } as MetadataSchema); beforeEach(() => { spyOn(registryService, 'getActiveMetadataSchema').and.returnValue(observableOf(expectedWithId)); @@ -101,11 +99,10 @@ describe('MetadataSchemaFormComponent', () => { fixture.detectChanges(); }); - it('should edit the existing schema using the correct values', waitForAsync(() => { - fixture.whenStable().then(() => { - expect(component.submitForm.emit).toHaveBeenCalledWith(expectedWithId); - }); - })); + it('should edit the existing schema using the correct values', async () => { + await fixture.whenStable(); + expect(component.submitForm.emit).toHaveBeenCalledWith(expectedWithId); + }); }); }); }); diff --git a/src/app/admin/admin-registries/metadata-registry/metadata-schema-form/metadata-schema-form.component.ts b/src/app/admin/admin-registries/metadata-registry/metadata-schema-form/metadata-schema-form.component.ts index adb649696c..b7c16bc83f 100644 --- a/src/app/admin/admin-registries/metadata-registry/metadata-schema-form/metadata-schema-form.component.ts +++ b/src/app/admin/admin-registries/metadata-registry/metadata-schema-form/metadata-schema-form.component.ts @@ -87,9 +87,12 @@ export class MetadataSchemaFormComponent implements OnInit, OnDestroy { name: 'name', validators: { required: null, - pattern: '^[^ ,_]{1,32}$' + pattern: '^[^. ,_]{1,32}$', }, required: true, + errorMessages: { + pattern: 'error.validation.metadata.namespace.invalid-pattern', + }, }); this.namespace = new DynamicInputModel({ id: 'namespace', @@ -97,12 +100,8 @@ export class MetadataSchemaFormComponent implements OnInit, OnDestroy { name: 'namespace', validators: { required: null, - pattern: '^[^.]*$', }, required: true, - errorMessages: { - pattern: 'error.validation.metadata.namespace.invalid-pattern', - }, }); this.formModel = [ new DynamicFormGroupModel( @@ -112,13 +111,18 @@ export class MetadataSchemaFormComponent implements OnInit, OnDestroy { }) ]; this.formGroup = this.formBuilderService.createFormGroup(this.formModel); - this.registryService.getActiveMetadataSchema().subscribe((schema) => { - this.formGroup.patchValue({ - metadatadataschemagroup:{ - name: schema != null ? schema.prefix : '', - namespace: schema != null ? schema.namespace : '' - } - }); + this.registryService.getActiveMetadataSchema().subscribe((schema: MetadataSchema) => { + if (schema == null) { + this.clearFields(); + } else { + this.formGroup.patchValue({ + metadatadataschemagroup: { + name: schema.prefix, + namespace: schema.namespace, + }, + }); + this.name.disabled = true; + } }); }); } @@ -136,10 +140,10 @@ export class MetadataSchemaFormComponent implements OnInit, OnDestroy { * When the schema has no id attached -> Create new schema * Emit the updated/created schema using the EventEmitter submitForm */ - onSubmit() { + onSubmit(): void { this.registryService.clearMetadataSchemaRequests().subscribe(); this.registryService.getActiveMetadataSchema().pipe(take(1)).subscribe( - (schema) => { + (schema: MetadataSchema) => { const values = { prefix: this.name.value, namespace: this.namespace.value @@ -151,9 +155,9 @@ export class MetadataSchemaFormComponent implements OnInit, OnDestroy { } else { this.registryService.createOrUpdateMetadataSchema(Object.assign(new MetadataSchema(), schema, { id: schema.id, - prefix: (values.prefix ? values.prefix : schema.prefix), - namespace: (values.namespace ? values.namespace : schema.namespace) - })).subscribe((updatedSchema) => { + prefix: schema.prefix, + namespace: values.namespace, + })).subscribe((updatedSchema: MetadataSchema) => { this.submitForm.emit(updatedSchema); }); } @@ -166,14 +170,9 @@ export class MetadataSchemaFormComponent implements OnInit, OnDestroy { /** * Reset all input-fields to be empty */ - clearFields() { - this.formGroup.markAsUntouched(); - this.formGroup.patchValue({ - metadatadataschemagroup:{ - name: '', - namespace: '' - } - }); + clearFields(): void { + this.formGroup.reset('metadatadataschemagroup'); + this.name.disabled = false; } /** diff --git a/src/app/admin/admin-registries/metadata-schema/metadata-field-form/metadata-field-form.component.spec.ts b/src/app/admin/admin-registries/metadata-schema/metadata-field-form/metadata-field-form.component.spec.ts index fcd8dd395d..ad7b54945d 100644 --- a/src/app/admin/admin-registries/metadata-schema/metadata-field-form/metadata-field-form.component.spec.ts +++ b/src/app/admin/admin-registries/metadata-schema/metadata-field-form/metadata-field-form.component.spec.ts @@ -40,7 +40,7 @@ describe('MetadataFieldFormComponent', () => { return { patchValue: () => { }, - markAsUntouched(opts?: any) { + reset(_value?: any, _options?: { onlySelf?: boolean; emitEvent?: boolean; }): void { }, }; } @@ -48,7 +48,7 @@ describe('MetadataFieldFormComponent', () => { /* eslint-enable no-empty, @typescript-eslint/no-empty-function */ beforeEach(waitForAsync(() => { - TestBed.configureTestingModule({ + return TestBed.configureTestingModule({ imports: [CommonModule, RouterTestingModule.withRoutes([]), TranslateModule.forRoot(), NgbModule], declarations: [MetadataFieldFormComponent, EnumKeysPipe], providers: [ @@ -100,11 +100,10 @@ describe('MetadataFieldFormComponent', () => { fixture.detectChanges(); }); - it('should emit a new field using the correct values', waitForAsync(() => { - fixture.whenStable().then(() => { - expect(component.submitForm.emit).toHaveBeenCalledWith(expected); - }); - })); + it('should emit a new field using the correct values', async () => { + await fixture.whenStable(); + expect(component.submitForm.emit).toHaveBeenCalledWith(expected); + }); }); describe('with an active field', () => { @@ -122,11 +121,10 @@ describe('MetadataFieldFormComponent', () => { fixture.detectChanges(); }); - it('should edit the existing field using the correct values', waitForAsync(() => { - fixture.whenStable().then(() => { - expect(component.submitForm.emit).toHaveBeenCalledWith(expectedWithId); - }); - })); + it('should edit the existing field using the correct values', async () => { + await fixture.whenStable(); + expect(component.submitForm.emit).toHaveBeenCalledWith(expectedWithId); + }); }); }); }); diff --git a/src/app/admin/admin-registries/metadata-schema/metadata-field-form/metadata-field-form.component.ts b/src/app/admin/admin-registries/metadata-schema/metadata-field-form/metadata-field-form.component.ts index 14013f3cb7..55950a8773 100644 --- a/src/app/admin/admin-registries/metadata-schema/metadata-field-form/metadata-field-form.component.ts +++ b/src/app/admin/admin-registries/metadata-schema/metadata-field-form/metadata-field-form.component.ts @@ -142,14 +142,20 @@ export class MetadataFieldFormComponent implements OnInit, OnDestroy { }) ]; this.formGroup = this.formBuilderService.createFormGroup(this.formModel); - this.registryService.getActiveMetadataField().subscribe((field) => { - this.formGroup.patchValue({ - metadatadatafieldgroup: { - element: field != null ? field.element : '', - qualifier: field != null ? field.qualifier : '', - scopeNote: field != null ? field.scopeNote : '' - } - }); + this.registryService.getActiveMetadataField().subscribe((field: MetadataField): void => { + if (field == null) { + this.clearFields(); + } else { + this.formGroup.patchValue({ + metadatadatafieldgroup: { + element: field.element, + qualifier: field.qualifier, + scopeNote: field.scopeNote, + }, + }); + this.element.disabled = true; + this.qualifier.disabled = true; + } }); }); } @@ -167,25 +173,24 @@ export class MetadataFieldFormComponent implements OnInit, OnDestroy { * When the field has no id attached -> Create new field * Emit the updated/created field using the EventEmitter submitForm */ - onSubmit() { + onSubmit(): void { this.registryService.getActiveMetadataField().pipe(take(1)).subscribe( - (field) => { - const values = { - element: this.element.value, - qualifier: this.qualifier.value, - scopeNote: this.scopeNote.value - }; + (field: MetadataField) => { if (field == null) { - this.registryService.createMetadataField(Object.assign(new MetadataField(), values), this.metadataSchema).subscribe((newField) => { + this.registryService.createMetadataField(Object.assign(new MetadataField(), { + element: this.element.value, + qualifier: this.qualifier.value, + scopeNote: this.scopeNote.value, + }), this.metadataSchema).subscribe((newField: MetadataField) => { this.submitForm.emit(newField); }); } else { this.registryService.updateMetadataField(Object.assign(new MetadataField(), field, { id: field.id, - element: (values.element ? values.element : field.element), - qualifier: (values.qualifier ? values.qualifier : field.qualifier), - scopeNote: (values.scopeNote ? values.scopeNote : field.scopeNote) - })).subscribe((updatedField) => { + element: field.element, + qualifier: field.qualifier, + scopeNote: this.scopeNote.value, + })).subscribe((updatedField: MetadataField) => { this.submitForm.emit(updatedField); }); } @@ -198,15 +203,10 @@ export class MetadataFieldFormComponent implements OnInit, OnDestroy { /** * Reset all input-fields to be empty */ - clearFields() { - this.formGroup.markAsUntouched(); - this.formGroup.patchValue({ - metadatadatafieldgroup: { - element: '', - qualifier: '', - scopeNote: '' - } - }); + clearFields(): void { + this.formGroup.reset('metadatadatafieldgroup'); + this.element.disabled = false; + this.qualifier.disabled = false; } /** From b829335ba5fdbcfbbdd684e1127ef4c557126dd3 Mon Sep 17 00:00:00 2001 From: Kristof De Langhe Date: Wed, 5 Apr 2023 17:49:29 +0200 Subject: [PATCH 068/409] 100414: Missing search_result statistics fix --- .../search-page/search-tracker.component.ts | 143 ++++++++++++++---- .../statistics/angulartics/dspace-provider.ts | 3 +- src/app/statistics/statistics.service.ts | 7 +- 3 files changed, 120 insertions(+), 33 deletions(-) diff --git a/src/app/search-page/search-tracker.component.ts b/src/app/search-page/search-tracker.component.ts index e7f59a2f23..eb7ac6fcc3 100644 --- a/src/app/search-page/search-tracker.component.ts +++ b/src/app/search-page/search-tracker.component.ts @@ -1,6 +1,6 @@ -import { Component, Inject, OnInit } from '@angular/core'; +import { Component, Inject, OnDestroy, OnInit } from '@angular/core'; import { Angulartics2 } from 'angulartics2'; -import { map, switchMap } from 'rxjs/operators'; +import { filter, map, switchMap, take } from 'rxjs/operators'; import { SearchComponent } from './search.component'; import { SidebarService } from '../shared/sidebar/sidebar.service'; import { HostWindowService } from '../shared/host-window.service'; @@ -10,10 +10,17 @@ import { SearchConfigurationService } from '../core/shared/search/search-configu import { SearchService } from '../core/shared/search/search.service'; import { PaginatedSearchOptions } from '../shared/search/paginated-search-options.model'; import { SearchObjects } from '../shared/search/search-objects.model'; -import { Router } from '@angular/router'; +import { NavigationStart, Router } from '@angular/router'; import { RemoteData } from '../core/data/remote-data'; import { DSpaceObject } from '../core/shared/dspace-object.model'; import { getFirstSucceededRemoteData } from '../core/shared/operators'; +import { inspect } from 'util'; +import { hasValue, hasValueOperator, isNotEmpty } from '../shared/empty.util'; +import { Subscription } from 'rxjs/internal/Subscription'; +import { Observable } from 'rxjs/internal/Observable'; +import { ITEM_MODULE_PATH } from '../item-page/item-page-routing-paths'; +import { COLLECTION_MODULE_PATH } from '../collection-page/collection-page-routing-paths'; +import { COMMUNITY_MODULE_PATH } from '../community-page/community-page-routing-paths'; /** * This component triggers a page view statistic @@ -29,7 +36,17 @@ import { getFirstSucceededRemoteData } from '../core/shared/operators'; } ] }) -export class SearchTrackerComponent extends SearchComponent implements OnInit { +export class SearchTrackerComponent extends SearchComponent implements OnInit, OnDestroy { + /** + * Regex to match UUIDs + */ + uuidRegex = /\b[0-9a-f]{8}\b-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-\b[0-9a-f]{12}\b/g; + + /** + * Array to track all subscriptions and unsubscribe them onDestroy + * @type {Array} + */ + subs: Subscription[] = []; constructor( protected service: SearchService, @@ -44,8 +61,33 @@ export class SearchTrackerComponent extends SearchComponent implements OnInit { } ngOnInit(): void { - // super.ngOnInit(); - this.getSearchOptions().pipe( + this.subs.push( + this.getSearchOptionsAndObjects().subscribe((options) => { + this.trackEvent(this.transformOptionsToEventProperties(options)); + }), + this.router.events.pipe( + filter((event) => event instanceof NavigationStart), + map((event: NavigationStart) => this.getDsoUUIDFromUrl(event.url)), + hasValueOperator(), + switchMap((uuid) => + this.getSearchOptionsAndObjects().pipe( + take(1), + map((options) => this.transformOptionsToEventProperties(Object.assign({}, options, { + object: uuid, + }))) + ) + ), + ).subscribe((options) => { + this.trackEvent(options); + }), + ); + } + + /** + * Get a combination of the currently applied search options and search query response + */ + getSearchOptionsAndObjects(): Observable<{ config: PaginatedSearchOptions, searchQueryResponse: SearchObjects }> { + return this.getSearchOptions().pipe( switchMap((options: PaginatedSearchOptions) => this.service.searchEntries(options).pipe( getFirstSucceededRemoteData(), @@ -53,31 +95,70 @@ export class SearchTrackerComponent extends SearchComponent implements OnInit { config: options, searchQueryResponse: rd.payload })) - )), - ).subscribe(({ config, searchQueryResponse }) => { - const filters: { filter: string, operator: string, value: string, label: string; }[] = []; - const appliedFilters = searchQueryResponse.appliedFilters || []; - for (let i = 0, filtersLength = appliedFilters.length; i < filtersLength; i++) { - const appliedFilter = appliedFilters[i]; - filters.push(appliedFilter); + ) + ), + ); + } + + /** + * Transform the given options containing search-options, query-response and optional object UUID into properties + * that can be sent to Angularitics for triggering a search event + * @param options + */ + transformOptionsToEventProperties(options: { config: PaginatedSearchOptions, searchQueryResponse: SearchObjects, object?: string }): any { + const filters: { filter: string, operator: string, value: string, label: string; }[] = []; + const appliedFilters = options.searchQueryResponse.appliedFilters || []; + for (let i = 0, filtersLength = appliedFilters.length; i < filtersLength; i++) { + const appliedFilter = appliedFilters[i]; + filters.push(appliedFilter); + } + return { + action: 'search', + properties: { + searchOptions: options.config, + page: { + size: options.config.pagination.size, // same as searchQueryResponse.page.elementsPerPage + totalElements: options.searchQueryResponse.pageInfo.totalElements, + totalPages: options.searchQueryResponse.pageInfo.totalPages, + number: options.config.pagination.currentPage, // same as searchQueryResponse.page.currentPage + }, + sort: { + by: options.config.sort.field, + order: options.config.sort.direction + }, + filters: filters, + object: options.object, + }, + }; + } + + /** + * Track an event with given properties + * @param properties + */ + trackEvent(properties: any) { + this.angulartics2.eventTrack.next(properties); + } + + /** + * Get the UUID from a DSO url + * Return null if the url isn't a community, collection or item page or the UUID couldn't be found + * @param url + */ + getDsoUUIDFromUrl(url: string): string { + if (isNotEmpty(url)) { + if (url.startsWith(`/${ITEM_MODULE_PATH}`) || url.startsWith(`/${COLLECTION_MODULE_PATH}`) || url.startsWith(`/${COMMUNITY_MODULE_PATH}`)) { + const uuid = url.substring(url.lastIndexOf('/') + 1); + if (uuid.match(this.uuidRegex)) { + return uuid; } - this.angulartics2.eventTrack.next({ - action: 'search', - properties: { - searchOptions: config, - page: { - size: config.pagination.size, // same as searchQueryResponse.page.elementsPerPage - totalElements: searchQueryResponse.pageInfo.totalElements, - totalPages: searchQueryResponse.pageInfo.totalPages, - number: config.pagination.currentPage, // same as searchQueryResponse.page.currentPage - }, - sort: { - by: config.sort.field, - order: config.sort.direction - }, - filters: filters, - }, - }); - }); + } + } + return null; + } + + ngOnDestroy() { + super.ngOnDestroy(); + this.subs.filter((sub) => hasValue(sub)).forEach((sub) => sub.unsubscribe()); } } diff --git a/src/app/statistics/angulartics/dspace-provider.ts b/src/app/statistics/angulartics/dspace-provider.ts index cd1aab94bd..30a56ad505 100644 --- a/src/app/statistics/angulartics/dspace-provider.ts +++ b/src/app/statistics/angulartics/dspace-provider.ts @@ -31,7 +31,8 @@ export class Angulartics2DSpace { event.properties.searchOptions, event.properties.page, event.properties.sort, - event.properties.filters + event.properties.filters, + event.properties.object, ); } } diff --git a/src/app/statistics/statistics.service.ts b/src/app/statistics/statistics.service.ts index 9e12e627b5..b9d078ad22 100644 --- a/src/app/statistics/statistics.service.ts +++ b/src/app/statistics/statistics.service.ts @@ -45,12 +45,14 @@ export class StatisticsService { * @param page: An object that describes the pagination status * @param sort: An object that describes the sort status * @param filters: An array of search filters used to filter the result set + * @param object: Object clicked */ trackSearchEvent( searchOptions: SearchOptions, page: { size: number, totalElements: number, totalPages: number, number: number }, sort: { by: string, order: string }, - filters?: { filter: string, operator: string, value: string, label: string }[] + filters?: { filter: string, operator: string, value: string, label: string }[], + object?: string, ) { const body = { query: searchOptions.query, @@ -87,6 +89,9 @@ export class StatisticsService { } Object.assign(body, { appliedFilters: bodyFilters }); } + if (hasValue(object)) { + Object.assign(body, { object }); + } this.sendEvent('/statistics/searchevents', body); } From d21ce380118240134d7b8838a27bde80cfb95107 Mon Sep 17 00:00:00 2001 From: Kristof De Langhe Date: Tue, 11 Apr 2023 16:18:20 +0200 Subject: [PATCH 069/409] 101108: Automatic ng update @angular/core@14 --- package.json | 28 +- .../epeople-registry.component.ts | 4 +- .../eperson-form.component.spec.ts | 6 +- .../eperson-form/eperson-form.component.ts | 4 +- .../group-form/group-form.component.spec.ts | 6 +- .../group-form/group-form.component.ts | 4 +- .../members-list/members-list.component.ts | 4 +- .../subgroup-list/subgroups-list.component.ts | 4 +- .../groups-registry.component.ts | 4 +- .../metadata-schema-form.component.ts | 4 +- .../metadata-field-form.component.ts | 4 +- .../edit-bitstream-page.component.spec.ts | 6 +- .../edit-bitstream-page.component.ts | 4 +- .../collection-source.component.spec.ts | 6 +- .../collection-source.component.ts | 4 +- .../curation-form/curation-form.component.ts | 10 +- .../metadata-field-selector.component.ts | 4 +- .../forgot-password-form.component.spec.ts | 4 +- .../feedback-form.component.spec.ts | 4 +- .../feedback-form/feedback-form.component.ts | 4 +- ...bitstream-request-a-copy-page.component.ts | 14 +- .../orcid-sync-settings.component.spec.ts | 16 +- .../orcid-sync-settings.component.ts | 4 +- .../versions/item-versions.component.spec.ts | 4 +- .../versions/item-versions.component.ts | 4 +- .../profile-page-metadata-form.component.ts | 4 +- .../profile-page-security-form.component.ts | 8 +- .../register-email-form.component.spec.ts | 4 +- .../register-email-form.component.ts | 8 +- .../confirmed.validator.spec.ts | 8 +- .../create-profile/confirmed.validator.ts | 4 +- .../create-profile.component.spec.ts | 4 +- .../create-profile.component.ts | 14 +- .../search-navbar/search-navbar.component.ts | 4 +- .../collection-dropdown.component.ts | 4 +- .../comcol-form/comcol-form.component.spec.ts | 6 +- .../comcol-form/comcol-form.component.ts | 4 +- .../dso-selector/dso-selector.component.ts | 4 +- .../eperson-search-box.component.spec.ts | 8 +- .../eperson-search-box.component.ts | 4 +- .../group-search-box.component.spec.ts | 8 +- .../group-search-box.component.ts | 4 +- ...c-form-control-container.component.spec.ts | 8 +- ...ynamic-form-control-container.component.ts | 8 +- .../ds-dynamic-form.component.ts | 4 +- ...dynamic-type-bind-relation.service.spec.ts | 8 +- .../ds-dynamic-type-bind-relation.service.ts | 4 +- ...xisting-metadata-list-element.component.ts | 4 +- .../dynamic-form-array.component.ts | 4 +- .../custom-switch.component.spec.ts | 6 +- .../custom-switch/custom-switch.component.ts | 4 +- ...namic-date-picker-inline.component.spec.ts | 8 +- .../dynamic-date-picker-inline.component.ts | 4 +- .../date-picker/date-picker.component.spec.ts | 6 +- .../date-picker/date-picker.component.ts | 4 +- .../dynamic-disabled.component.spec.ts | 6 +- .../disabled/dynamic-disabled.component.ts | 4 +- .../models/dynamic-vocabulary.component.ts | 4 +- .../dynamic-form-group.component.ts | 4 +- .../list/dynamic-list.component.spec.ts | 32 +- .../models/list/dynamic-list.component.ts | 6 +- .../lookup/dynamic-lookup.component.spec.ts | 16 +- .../models/lookup/dynamic-lookup.component.ts | 4 +- .../onebox/dynamic-onebox.component.spec.ts | 8 +- .../models/onebox/dynamic-onebox.component.ts | 4 +- .../dynamic-relation-group.component.spec.ts | 16 +- .../dynamic-relation-group.components.ts | 4 +- ...amic-scrollable-dropdown.component.spec.ts | 8 +- .../dynamic-scrollable-dropdown.component.ts | 4 +- .../models/tag/dynamic-tag.component.spec.ts | 8 +- .../models/tag/dynamic-tag.component.ts | 4 +- .../form/builder/form-builder.service.spec.ts | 64 +- .../form/builder/form-builder.service.ts | 12 +- src/app/shared/form/form.component.ts | 26 +- src/app/shared/form/form.service.spec.ts | 22 +- src/app/shared/form/form.service.ts | 20 +- .../number-picker/number-picker.component.ts | 4 +- .../validation-suggestions.component.ts | 8 +- .../log-in-password.component.spec.ts | 4 +- .../password/log-in-password.component.ts | 6 +- .../shared/mocks/form-builder-service.mock.ts | 6 +- ...imed-task-actions-reject.component.spec.ts | 10 +- .../claimed-task-actions-reject.component.ts | 6 +- .../starts-with-abstract.component.ts | 8 +- .../subscription-modal.component.spec.ts | 26 +- .../subscription-modal.component.ts | 28 +- src/app/shared/testing/form-event.stub.ts | 10 +- .../utils/in-list-validator.directive.ts | 4 +- .../shared/utils/require-file.validator.ts | 6 +- .../accesses/section-accesses.component.ts | 6 +- .../section-upload-file-edit.component.ts | 8 +- .../system-wide-alert-form.component.ts | 10 +- ...vanced-workflow-action-rating.component.ts | 10 +- .../reviewers-list.component.ts | 4 +- yarn.lock | 6771 +++++++++-------- 95 files changed, 3842 insertions(+), 3701 deletions(-) diff --git a/package.json b/package.json index aceda4090b..4360d49bf3 100644 --- a/package.json +++ b/package.json @@ -55,17 +55,17 @@ "ts-node": "10.2.1" }, "dependencies": { - "@angular/animations": "~13.3.12", + "@angular/animations": "~14.3.0", "@angular/cdk": "^13.2.6", - "@angular/common": "~13.3.12", - "@angular/compiler": "~13.3.12", - "@angular/core": "~13.3.12", - "@angular/forms": "~13.3.12", - "@angular/localize": "13.3.12", - "@angular/platform-browser": "~13.3.12", - "@angular/platform-browser-dynamic": "~13.3.12", - "@angular/platform-server": "~13.3.12", - "@angular/router": "~13.3.12", + "@angular/common": "~14.3.0", + "@angular/compiler": "~14.3.0", + "@angular/core": "~14.3.0", + "@angular/forms": "~14.3.0", + "@angular/localize": "14.3.0", + "@angular/platform-browser": "~14.3.0", + "@angular/platform-browser-dynamic": "~14.3.0", + "@angular/platform-server": "~14.3.0", + "@angular/router": "~14.3.0", "@babel/runtime": "7.17.2", "@kolkov/ngx-gallery": "^2.0.1", "@material-ui/core": "^4.11.0", @@ -142,8 +142,8 @@ "@angular-eslint/schematics": "13.1.0", "@angular-eslint/template-parser": "13.1.0", "@angular/cli": "~13.3.10", - "@angular/compiler-cli": "~13.3.12", - "@angular/language-service": "~13.3.12", + "@angular/compiler-cli": "~14.3.0", + "@angular/language-service": "~14.3.0", "@cypress/schematic": "^1.5.0", "@fortawesome/fontawesome-free": "^6.2.1", "@ngrx/store-devtools": "^13.0.2", @@ -197,10 +197,10 @@ "sass-loader": "^12.6.0", "sass-resources-loader": "^2.1.1", "ts-node": "^8.10.2", - "typescript": "~4.5.5", + "typescript": "~4.8.4", "webpack": "^5.76.0", "webpack-bundle-analyzer": "^4.4.0", "webpack-cli": "^4.2.0", "webpack-dev-server": "^4.5.0" } -} +} \ No newline at end of file diff --git a/src/app/access-control/epeople-registry/epeople-registry.component.ts b/src/app/access-control/epeople-registry/epeople-registry.component.ts index 55233d8173..eeeb10c7b3 100644 --- a/src/app/access-control/epeople-registry/epeople-registry.component.ts +++ b/src/app/access-control/epeople-registry/epeople-registry.component.ts @@ -1,5 +1,5 @@ import { Component, OnDestroy, OnInit } from '@angular/core'; -import { FormBuilder } from '@angular/forms'; +import { UntypedFormBuilder } from '@angular/forms'; import { Router } from '@angular/router'; import { TranslateService } from '@ngx-translate/core'; import { BehaviorSubject, combineLatest, Observable, Subscription } from 'rxjs'; @@ -89,7 +89,7 @@ export class EPeopleRegistryComponent implements OnInit, OnDestroy { private translateService: TranslateService, private notificationsService: NotificationsService, private authorizationService: AuthorizationDataService, - private formBuilder: FormBuilder, + private formBuilder: UntypedFormBuilder, private router: Router, private modalService: NgbModal, private paginationService: PaginationService, diff --git a/src/app/access-control/epeople-registry/eperson-form/eperson-form.component.spec.ts b/src/app/access-control/epeople-registry/eperson-form/eperson-form.component.spec.ts index bf03e1defb..fb911e709c 100644 --- a/src/app/access-control/epeople-registry/eperson-form/eperson-form.component.spec.ts +++ b/src/app/access-control/epeople-registry/eperson-form/eperson-form.component.spec.ts @@ -2,7 +2,7 @@ import { Observable, of as observableOf } from 'rxjs'; import { CommonModule } from '@angular/common'; import { NO_ERRORS_SCHEMA } from '@angular/core'; import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; -import { FormControl, FormGroup, FormsModule, ReactiveFormsModule, Validators } from '@angular/forms'; +import { UntypedFormControl, UntypedFormGroup, FormsModule, ReactiveFormsModule, Validators } from '@angular/forms'; import { BrowserModule, By } from '@angular/platform-browser'; import { NgbModule } from '@ng-bootstrap/ng-bootstrap'; import { TranslateLoader, TranslateModule } from '@ngx-translate/core'; @@ -116,9 +116,9 @@ describe('EPersonFormComponent', () => { const controlModel = model; const controlState = { value: controlModel.value, disabled: controlModel.disabled }; const controlOptions = this.createAbstractControlOptions(controlModel.validators, controlModel.asyncValidators, controlModel.updateOn); - controls[model.id] = new FormControl(controlState, controlOptions); + controls[model.id] = new UntypedFormControl(controlState, controlOptions); }); - return new FormGroup(controls, options); + return new UntypedFormGroup(controls, options); }, createAbstractControlOptions(validatorsConfig = null, asyncValidatorsConfig = null, updateOn = null) { return { diff --git a/src/app/access-control/epeople-registry/eperson-form/eperson-form.component.ts b/src/app/access-control/epeople-registry/eperson-form/eperson-form.component.ts index 5a7ab735ca..8dbc9e92a4 100644 --- a/src/app/access-control/epeople-registry/eperson-form/eperson-form.component.ts +++ b/src/app/access-control/epeople-registry/eperson-form/eperson-form.component.ts @@ -1,5 +1,5 @@ import { ChangeDetectorRef, Component, EventEmitter, OnDestroy, OnInit, Output } from '@angular/core'; -import { FormGroup } from '@angular/forms'; +import { UntypedFormGroup } from '@angular/forms'; import { DynamicCheckboxModel, DynamicFormControlModel, @@ -108,7 +108,7 @@ export class EPersonFormComponent implements OnInit, OnDestroy { /** * A FormGroup that combines all inputs */ - formGroup: FormGroup; + formGroup: UntypedFormGroup; /** * An EventEmitter that's fired whenever the form is being submitted diff --git a/src/app/access-control/group-registry/group-form/group-form.component.spec.ts b/src/app/access-control/group-registry/group-form/group-form.component.spec.ts index a7a7cb5be4..d845550b55 100644 --- a/src/app/access-control/group-registry/group-form/group-form.component.spec.ts +++ b/src/app/access-control/group-registry/group-form/group-form.component.spec.ts @@ -2,7 +2,7 @@ import { CommonModule } from '@angular/common'; import { HttpClient } from '@angular/common/http'; import { NO_ERRORS_SCHEMA } from '@angular/core'; import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; -import { FormControl, FormGroup, FormsModule, ReactiveFormsModule, Validators } from '@angular/forms'; +import { UntypedFormControl, UntypedFormGroup, FormsModule, ReactiveFormsModule, Validators } from '@angular/forms'; import { BrowserModule, By } from '@angular/platform-browser'; import { ActivatedRoute, Router } from '@angular/router'; import { NgbModule } from '@ng-bootstrap/ng-bootstrap'; @@ -130,9 +130,9 @@ describe('GroupFormComponent', () => { const controlModel = model; const controlState = { value: controlModel.value, disabled: controlModel.disabled }; const controlOptions = this.createAbstractControlOptions(controlModel.validators, controlModel.asyncValidators, controlModel.updateOn); - controls[model.id] = new FormControl(controlState, controlOptions); + controls[model.id] = new UntypedFormControl(controlState, controlOptions); }); - return new FormGroup(controls, options); + return new UntypedFormGroup(controls, options); }, createAbstractControlOptions(validatorsConfig = null, asyncValidatorsConfig = null, updateOn = null) { return { diff --git a/src/app/access-control/group-registry/group-form/group-form.component.ts b/src/app/access-control/group-registry/group-form/group-form.component.ts index 4302d126ea..72e34c1838 100644 --- a/src/app/access-control/group-registry/group-form/group-form.component.ts +++ b/src/app/access-control/group-registry/group-form/group-form.component.ts @@ -1,5 +1,5 @@ import { Component, EventEmitter, HostListener, OnDestroy, OnInit, Output, ChangeDetectorRef } from '@angular/core'; -import { FormGroup } from '@angular/forms'; +import { UntypedFormGroup } from '@angular/forms'; import { ActivatedRoute, Router } from '@angular/router'; import { NgbModal } from '@ng-bootstrap/ng-bootstrap'; import { @@ -95,7 +95,7 @@ export class GroupFormComponent implements OnInit, OnDestroy { /** * A FormGroup that combines all inputs */ - formGroup: FormGroup; + formGroup: UntypedFormGroup; /** * An EventEmitter that's fired whenever the form is being submitted diff --git a/src/app/access-control/group-registry/group-form/members-list/members-list.component.ts b/src/app/access-control/group-registry/group-form/members-list/members-list.component.ts index d0fc046093..56ab2f1540 100644 --- a/src/app/access-control/group-registry/group-form/members-list/members-list.component.ts +++ b/src/app/access-control/group-registry/group-form/members-list/members-list.component.ts @@ -1,5 +1,5 @@ import { Component, Input, OnDestroy, OnInit } from '@angular/core'; -import { FormBuilder } from '@angular/forms'; +import { UntypedFormBuilder } from '@angular/forms'; import { Router } from '@angular/router'; import { TranslateService } from '@ngx-translate/core'; import { @@ -141,7 +141,7 @@ export class MembersListComponent implements OnInit, OnDestroy { public ePersonDataService: EPersonDataService, protected translateService: TranslateService, protected notificationsService: NotificationsService, - protected formBuilder: FormBuilder, + protected formBuilder: UntypedFormBuilder, protected paginationService: PaginationService, private router: Router ) { diff --git a/src/app/access-control/group-registry/group-form/subgroup-list/subgroups-list.component.ts b/src/app/access-control/group-registry/group-form/subgroup-list/subgroups-list.component.ts index 5f1700e07d..ba65026533 100644 --- a/src/app/access-control/group-registry/group-form/subgroup-list/subgroups-list.component.ts +++ b/src/app/access-control/group-registry/group-form/subgroup-list/subgroups-list.component.ts @@ -1,5 +1,5 @@ import { Component, Input, OnDestroy, OnInit } from '@angular/core'; -import { FormBuilder } from '@angular/forms'; +import { UntypedFormBuilder } from '@angular/forms'; import { Router } from '@angular/router'; import { TranslateService } from '@ngx-translate/core'; import { BehaviorSubject, Observable, of as observableOf, Subscription } from 'rxjs'; @@ -86,7 +86,7 @@ export class SubgroupsListComponent implements OnInit, OnDestroy { constructor(public groupDataService: GroupDataService, private translateService: TranslateService, private notificationsService: NotificationsService, - private formBuilder: FormBuilder, + private formBuilder: UntypedFormBuilder, private paginationService: PaginationService, private router: Router) { this.currentSearchQuery = ''; diff --git a/src/app/access-control/group-registry/groups-registry.component.ts b/src/app/access-control/group-registry/groups-registry.component.ts index 70c9b22852..e4c624e3f6 100644 --- a/src/app/access-control/group-registry/groups-registry.component.ts +++ b/src/app/access-control/group-registry/groups-registry.component.ts @@ -1,5 +1,5 @@ import { Component, OnDestroy, OnInit } from '@angular/core'; -import { FormBuilder } from '@angular/forms'; +import { UntypedFormBuilder } from '@angular/forms'; import { Router } from '@angular/router'; import { TranslateService } from '@ngx-translate/core'; import { @@ -99,7 +99,7 @@ export class GroupsRegistryComponent implements OnInit, OnDestroy { private dSpaceObjectDataService: DSpaceObjectDataService, private translateService: TranslateService, private notificationsService: NotificationsService, - private formBuilder: FormBuilder, + private formBuilder: UntypedFormBuilder, protected routeService: RouteService, private router: Router, private authorizationService: AuthorizationDataService, diff --git a/src/app/admin/admin-registries/metadata-registry/metadata-schema-form/metadata-schema-form.component.ts b/src/app/admin/admin-registries/metadata-registry/metadata-schema-form/metadata-schema-form.component.ts index 5c6885ae72..6d3138987a 100644 --- a/src/app/admin/admin-registries/metadata-registry/metadata-schema-form/metadata-schema-form.component.ts +++ b/src/app/admin/admin-registries/metadata-registry/metadata-schema-form/metadata-schema-form.component.ts @@ -5,7 +5,7 @@ import { DynamicFormLayout, DynamicInputModel } from '@ng-dynamic-forms/core'; -import { FormGroup } from '@angular/forms'; +import { UntypedFormGroup } from '@angular/forms'; import { RegistryService } from '../../../../core/registry/registry.service'; import { FormBuilderService } from '../../../../shared/form/builder/form-builder.service'; import { take } from 'rxjs/operators'; @@ -66,7 +66,7 @@ export class MetadataSchemaFormComponent implements OnInit, OnDestroy { /** * A FormGroup that combines all inputs */ - formGroup: FormGroup; + formGroup: UntypedFormGroup; /** * An EventEmitter that's fired whenever the form is being submitted diff --git a/src/app/admin/admin-registries/metadata-schema/metadata-field-form/metadata-field-form.component.ts b/src/app/admin/admin-registries/metadata-schema/metadata-field-form/metadata-field-form.component.ts index 1c000c3c76..0beb306d6c 100644 --- a/src/app/admin/admin-registries/metadata-schema/metadata-field-form/metadata-field-form.component.ts +++ b/src/app/admin/admin-registries/metadata-schema/metadata-field-form/metadata-field-form.component.ts @@ -5,7 +5,7 @@ import { DynamicFormLayout, DynamicInputModel } from '@ng-dynamic-forms/core'; -import { FormGroup } from '@angular/forms'; +import { UntypedFormGroup } from '@angular/forms'; import { RegistryService } from '../../../../core/registry/registry.service'; import { FormBuilderService } from '../../../../shared/form/builder/form-builder.service'; import { take } from 'rxjs/operators'; @@ -82,7 +82,7 @@ export class MetadataFieldFormComponent implements OnInit, OnDestroy { /** * A FormGroup that combines all inputs */ - formGroup: FormGroup; + formGroup: UntypedFormGroup; /** * An EventEmitter that's fired whenever the form is being submitted diff --git a/src/app/bitstream-page/edit-bitstream-page/edit-bitstream-page.component.spec.ts b/src/app/bitstream-page/edit-bitstream-page/edit-bitstream-page.component.spec.ts index 44e48182fd..6081a076c0 100644 --- a/src/app/bitstream-page/edit-bitstream-page/edit-bitstream-page.component.spec.ts +++ b/src/app/bitstream-page/edit-bitstream-page/edit-bitstream-page.component.spec.ts @@ -15,7 +15,7 @@ import { INotification, Notification } from '../../shared/notifications/models/n import { BitstreamFormat } from '../../core/shared/bitstream-format.model'; import { BitstreamFormatSupportLevel } from '../../core/shared/bitstream-format-support-level'; import { hasValue } from '../../shared/empty.util'; -import { FormControl, FormGroup } from '@angular/forms'; +import { UntypedFormControl, UntypedFormGroup } from '@angular/forms'; import { FileSizePipe } from '../../shared/utils/file-size-pipe'; import { VarDirective } from '../../shared/utils/var.directive'; import { createSuccessfulRemoteDataObject, createSuccessfulRemoteDataObject$ } from '../../shared/remote-data.utils'; @@ -84,9 +84,9 @@ describe('EditBitstreamPageComponent', () => { const controls = {}; if (hasValue(fModel)) { fModel.forEach((controlModel) => { - controls[controlModel.id] = new FormControl((controlModel as any).value); + controls[controlModel.id] = new UntypedFormControl((controlModel as any).value); }); - return new FormGroup(controls); + return new UntypedFormGroup(controls); } return undefined; } diff --git a/src/app/bitstream-page/edit-bitstream-page/edit-bitstream-page.component.ts b/src/app/bitstream-page/edit-bitstream-page/edit-bitstream-page.component.ts index 8e63ec939f..1a3048097e 100644 --- a/src/app/bitstream-page/edit-bitstream-page/edit-bitstream-page.component.ts +++ b/src/app/bitstream-page/edit-bitstream-page/edit-bitstream-page.component.ts @@ -23,7 +23,7 @@ import { DynamicInputModel, DynamicSelectModel } from '@ng-dynamic-forms/core'; -import { FormGroup } from '@angular/forms'; +import { UntypedFormGroup } from '@angular/forms'; import { TranslateService } from '@ngx-translate/core'; import { DynamicCustomSwitchModel } from '../../shared/form/builder/ds-dynamic-form-ui/models/custom-switch/custom-switch.model'; import cloneDeep from 'lodash/cloneDeep'; @@ -359,7 +359,7 @@ export class EditBitstreamPageComponent implements OnInit, OnDestroy { /** * The form group of this form */ - formGroup: FormGroup; + formGroup: UntypedFormGroup; /** * The ID of the item the bitstream originates from diff --git a/src/app/collection-page/edit-collection-page/collection-source/collection-source.component.spec.ts b/src/app/collection-page/edit-collection-page/collection-source/collection-source.component.spec.ts index fbaac87ed6..e7e98d9523 100644 --- a/src/app/collection-page/edit-collection-page/collection-source/collection-source.component.spec.ts +++ b/src/app/collection-page/edit-collection-page/collection-source/collection-source.component.spec.ts @@ -12,7 +12,7 @@ import { NotificationType } from '../../../shared/notifications/models/notificat import { NotificationsService } from '../../../shared/notifications/notifications.service'; import { DynamicFormControlModel, DynamicFormService } from '@ng-dynamic-forms/core'; import { hasValue } from '../../../shared/empty.util'; -import { FormControl, FormGroup } from '@angular/forms'; +import { UntypedFormControl, UntypedFormGroup } from '@angular/forms'; import { RouterStub } from '../../../shared/testing/router.stub'; import { By } from '@angular/platform-browser'; import { Collection } from '../../../core/shared/collection.model'; @@ -98,9 +98,9 @@ describe('CollectionSourceComponent', () => { const controls = {}; if (hasValue(fModel)) { fModel.forEach((controlModel) => { - controls[controlModel.id] = new FormControl((controlModel as any).value); + controls[controlModel.id] = new UntypedFormControl((controlModel as any).value); }); - return new FormGroup(controls); + return new UntypedFormGroup(controls); } return undefined; } diff --git a/src/app/collection-page/edit-collection-page/collection-source/collection-source.component.ts b/src/app/collection-page/edit-collection-page/collection-source/collection-source.component.ts index 512faa5311..2d1308cc83 100644 --- a/src/app/collection-page/edit-collection-page/collection-source/collection-source.component.ts +++ b/src/app/collection-page/edit-collection-page/collection-source/collection-source.component.ts @@ -14,7 +14,7 @@ import { Location } from '@angular/common'; import { TranslateService } from '@ngx-translate/core'; import { ObjectUpdatesService } from '../../../core/data/object-updates/object-updates.service'; import { NotificationsService } from '../../../shared/notifications/notifications.service'; -import { FormGroup } from '@angular/forms'; +import { UntypedFormGroup } from '@angular/forms'; import { hasNoValue, hasValue, isNotEmpty } from '../../../shared/empty.util'; import { ContentSource, ContentSourceHarvestType } from '../../../core/shared/content-source.model'; import { Observable, Subscription } from 'rxjs'; @@ -202,7 +202,7 @@ export class CollectionSourceComponent extends AbstractTrackableComponent implem /** * The form group of this form */ - formGroup: FormGroup; + formGroup: UntypedFormGroup; /** * Subscription to update the current form diff --git a/src/app/curation-form/curation-form.component.ts b/src/app/curation-form/curation-form.component.ts index 4b67580e77..464dd9673f 100644 --- a/src/app/curation-form/curation-form.component.ts +++ b/src/app/curation-form/curation-form.component.ts @@ -1,6 +1,6 @@ import { Component, Input, OnInit } from '@angular/core'; import { ScriptDataService } from '../core/data/processes/script-data.service'; -import { FormControl, FormGroup } from '@angular/forms'; +import { UntypedFormControl, UntypedFormGroup } from '@angular/forms'; import { getFirstCompletedRemoteData } from '../core/shared/operators'; import { find, map } from 'rxjs/operators'; import { NotificationsService } from '../shared/notifications/notifications.service'; @@ -28,7 +28,7 @@ export class CurationFormComponent implements OnInit { config: Observable>; tasks: string[]; - form: FormGroup; + form: UntypedFormGroup; @Input() dsoHandle: string; @@ -45,9 +45,9 @@ export class CurationFormComponent implements OnInit { } ngOnInit(): void { - this.form = new FormGroup({ - task: new FormControl(''), - handle: new FormControl('') + this.form = new UntypedFormGroup({ + task: new UntypedFormControl(''), + handle: new UntypedFormControl('') }); this.config = this.configurationDataService.findByPropertyName(CURATION_CFG); diff --git a/src/app/dso-shared/dso-edit-metadata/metadata-field-selector/metadata-field-selector.component.ts b/src/app/dso-shared/dso-edit-metadata/metadata-field-selector/metadata-field-selector.component.ts index 5053a4b83d..5f76d87265 100644 --- a/src/app/dso-shared/dso-edit-metadata/metadata-field-selector/metadata-field-selector.component.ts +++ b/src/app/dso-shared/dso-edit-metadata/metadata-field-selector/metadata-field-selector.component.ts @@ -17,7 +17,7 @@ import { } from '../../../core/shared/operators'; import { Observable } from 'rxjs/internal/Observable'; import { RegistryService } from '../../../core/registry/registry.service'; -import { FormControl } from '@angular/forms'; +import { UntypedFormControl } from '@angular/forms'; import { BehaviorSubject } from 'rxjs/internal/BehaviorSubject'; import { hasValue } from '../../../shared/empty.util'; import { Subscription } from 'rxjs/internal/Subscription'; @@ -70,7 +70,7 @@ export class MetadataFieldSelectorComponent implements OnInit, OnDestroy, AfterV /** * FormControl for the input */ - public input: FormControl = new FormControl(); + public input: UntypedFormControl = new UntypedFormControl(); /** * The current query to update mdFieldOptions$ for diff --git a/src/app/forgot-password/forgot-password-form/forgot-password-form.component.spec.ts b/src/app/forgot-password/forgot-password-form/forgot-password-form.component.spec.ts index 68566efaec..92d72d83df 100644 --- a/src/app/forgot-password/forgot-password-form/forgot-password-form.component.spec.ts +++ b/src/app/forgot-password/forgot-password-form/forgot-password-form.component.spec.ts @@ -5,7 +5,7 @@ import { NotificationsServiceStub } from '../../shared/testing/notifications-ser import { CommonModule } from '@angular/common'; import { RouterTestingModule } from '@angular/router/testing'; import { TranslateModule } from '@ngx-translate/core'; -import { FormBuilder, ReactiveFormsModule } from '@angular/forms'; +import { UntypedFormBuilder, ReactiveFormsModule } from '@angular/forms'; import { ActivatedRoute, Router } from '@angular/router'; import { Store } from '@ngrx/store'; import { EPersonDataService } from '../../core/eperson/eperson-data.service'; @@ -60,7 +60,7 @@ describe('ForgotPasswordFormComponent', () => { {provide: ActivatedRoute, useValue: route}, {provide: Store, useValue: store}, {provide: EPersonDataService, useValue: ePersonDataService}, - {provide: FormBuilder, useValue: new FormBuilder()}, + {provide: UntypedFormBuilder, useValue: new UntypedFormBuilder()}, {provide: NotificationsService, useValue: notificationsService}, ], schemas: [CUSTOM_ELEMENTS_SCHEMA] diff --git a/src/app/info/feedback/feedback-form/feedback-form.component.spec.ts b/src/app/info/feedback/feedback-form/feedback-form.component.spec.ts index d6bedc46cf..c3d38a2876 100644 --- a/src/app/info/feedback/feedback-form/feedback-form.component.spec.ts +++ b/src/app/info/feedback/feedback-form/feedback-form.component.spec.ts @@ -7,7 +7,7 @@ import { DebugElement, NO_ERRORS_SCHEMA } from '@angular/core'; import { By } from '@angular/platform-browser'; import { RouteService } from '../../../core/services/route.service'; import { routeServiceStub } from '../../../shared/testing/route-service.stub'; -import { FormBuilder } from '@angular/forms'; +import { UntypedFormBuilder } from '@angular/forms'; import { NotificationsService } from '../../../shared/notifications/notifications.service'; import { NotificationsServiceStub } from '../../../shared/testing/notifications-service.stub'; import { AuthService } from '../../../core/auth/auth.service'; @@ -41,7 +41,7 @@ describe('FeedbackFormComponent', () => { declarations: [FeedbackFormComponent], providers: [ { provide: RouteService, useValue: routeServiceStub }, - { provide: FormBuilder, useValue: new FormBuilder() }, + { provide: UntypedFormBuilder, useValue: new UntypedFormBuilder() }, { provide: NotificationsService, useValue: notificationService }, { provide: FeedbackDataService, useValue: feedbackDataServiceStub }, { provide: AuthService, useValue: authService }, diff --git a/src/app/info/feedback/feedback-form/feedback-form.component.ts b/src/app/info/feedback/feedback-form/feedback-form.component.ts index 35cdd69cfc..684f974701 100644 --- a/src/app/info/feedback/feedback-form/feedback-form.component.ts +++ b/src/app/info/feedback/feedback-form/feedback-form.component.ts @@ -3,7 +3,7 @@ import { NoContent } from '../../../core/shared/NoContent.model'; import { FeedbackDataService } from '../../../core/feedback/feedback-data.service'; import { Component, Inject, OnInit } from '@angular/core'; import { RouteService } from '../../../core/services/route.service'; -import { FormBuilder, Validators } from '@angular/forms'; +import { UntypedFormBuilder, Validators } from '@angular/forms'; import { NotificationsService } from '../../../shared/notifications/notifications.service'; import { TranslateService } from '@ngx-translate/core'; import { AuthService } from '../../../core/auth/auth.service'; @@ -37,7 +37,7 @@ export class FeedbackFormComponent implements OnInit { constructor( @Inject(NativeWindowService) protected _window: NativeWindowRef, public routeService: RouteService, - private fb: FormBuilder, + private fb: UntypedFormBuilder, protected notificationsService: NotificationsService, protected translate: TranslateService, private feedbackDataService: FeedbackDataService, diff --git a/src/app/item-page/bitstreams/request-a-copy/bitstream-request-a-copy-page.component.ts b/src/app/item-page/bitstreams/request-a-copy/bitstream-request-a-copy-page.component.ts index 59819a4a66..77e1049d87 100644 --- a/src/app/item-page/bitstreams/request-a-copy/bitstream-request-a-copy-page.component.ts +++ b/src/app/item-page/bitstreams/request-a-copy/bitstream-request-a-copy-page.component.ts @@ -11,7 +11,7 @@ import { combineLatest as observableCombineLatest, Observable, of as observableO import { getBitstreamDownloadRoute, getForbiddenRoute } from '../../../app-routing-paths'; import { TranslateService } from '@ngx-translate/core'; import { EPerson } from '../../../core/eperson/models/eperson.model'; -import { FormBuilder, FormControl, FormGroup, Validators } from '@angular/forms'; +import { UntypedFormBuilder, UntypedFormControl, UntypedFormGroup, Validators } from '@angular/forms'; import { ItemRequestDataService } from '../../../core/data/item-request-data.service'; import { ItemRequest } from '../../../core/shared/item-request.model'; import { Item } from '../../../core/shared/item.model'; @@ -34,7 +34,7 @@ export class BitstreamRequestACopyPageComponent implements OnInit, OnDestroy { canDownload$: Observable; private subs: Subscription[] = []; - requestCopyForm: FormGroup; + requestCopyForm: UntypedFormGroup; item: Item; itemName: string; @@ -49,7 +49,7 @@ export class BitstreamRequestACopyPageComponent implements OnInit, OnDestroy { protected router: Router, private authorizationService: AuthorizationDataService, private auth: AuthService, - private formBuilder: FormBuilder, + private formBuilder: UntypedFormBuilder, private itemRequestDataService: ItemRequestDataService, private notificationsService: NotificationsService, private dsoNameService: DSONameService, @@ -59,15 +59,15 @@ export class BitstreamRequestACopyPageComponent implements OnInit, OnDestroy { ngOnInit(): void { this.requestCopyForm = this.formBuilder.group({ - name: new FormControl('', { + name: new UntypedFormControl('', { validators: [Validators.required], }), - email: new FormControl('', { + email: new UntypedFormControl('', { validators: [Validators.required, Validators.pattern('^[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,4}$')] }), - allfiles: new FormControl(''), - message: new FormControl(''), + allfiles: new UntypedFormControl(''), + message: new UntypedFormControl(''), }); diff --git a/src/app/item-page/orcid-page/orcid-sync-settings/orcid-sync-settings.component.spec.ts b/src/app/item-page/orcid-page/orcid-sync-settings/orcid-sync-settings.component.spec.ts index cd466ae4a4..f2fa9d2440 100644 --- a/src/app/item-page/orcid-page/orcid-sync-settings/orcid-sync-settings.component.spec.ts +++ b/src/app/item-page/orcid-page/orcid-sync-settings/orcid-sync-settings.component.spec.ts @@ -1,6 +1,6 @@ import { ChangeDetectionStrategy, NO_ERRORS_SCHEMA } from '@angular/core'; import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; -import { FormControl, FormGroup, FormsModule, ReactiveFormsModule } from '@angular/forms'; +import { UntypedFormControl, UntypedFormGroup, FormsModule, ReactiveFormsModule } from '@angular/forms'; import { RouterTestingModule } from '@angular/router/testing'; import { By } from '@angular/platform-browser'; @@ -26,7 +26,7 @@ describe('OrcidSyncSettingsComponent test suite', () => { let scheduler: TestScheduler; let researcherProfileService: jasmine.SpyObj; let notificationsService; - let formGroup: FormGroup; + let formGroup: UntypedFormGroup; const mockResearcherProfile: ResearcherProfile = Object.assign(new ResearcherProfile(), { id: 'test-id', @@ -186,12 +186,12 @@ describe('OrcidSyncSettingsComponent test suite', () => { beforeEach(() => { scheduler = getTestScheduler(); notificationsService = (comp as any).notificationsService; - formGroup = new FormGroup({ - syncMode: new FormControl('MANUAL'), - syncFundings: new FormControl('ALL'), - syncPublications: new FormControl('ALL'), - syncProfile_BIOGRAPHICAL: new FormControl(true), - syncProfile_IDENTIFIERS: new FormControl(true), + formGroup = new UntypedFormGroup({ + syncMode: new UntypedFormControl('MANUAL'), + syncFundings: new UntypedFormControl('ALL'), + syncPublications: new UntypedFormControl('ALL'), + syncProfile_BIOGRAPHICAL: new UntypedFormControl(true), + syncProfile_IDENTIFIERS: new UntypedFormControl(true), }); spyOn(comp.settingsUpdated, 'emit'); }); diff --git a/src/app/item-page/orcid-page/orcid-sync-settings/orcid-sync-settings.component.ts b/src/app/item-page/orcid-page/orcid-sync-settings/orcid-sync-settings.component.ts index 494075c0f0..0bcbc295ac 100644 --- a/src/app/item-page/orcid-page/orcid-sync-settings/orcid-sync-settings.component.ts +++ b/src/app/item-page/orcid-page/orcid-sync-settings/orcid-sync-settings.component.ts @@ -1,5 +1,5 @@ import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core'; -import { FormGroup } from '@angular/forms'; +import { UntypedFormGroup } from '@angular/forms'; import { TranslateService } from '@ngx-translate/core'; import { Operation } from 'fast-json-patch'; @@ -127,7 +127,7 @@ export class OrcidSyncSettingsComponent implements OnInit { * * @param form The form group */ - onSubmit(form: FormGroup): void { + onSubmit(form: UntypedFormGroup): void { const operations: Operation[] = []; this.fillOperationsFor(operations, '/orcid/mode', form.value.syncMode); this.fillOperationsFor(operations, '/orcid/publications', form.value.syncPublications); diff --git a/src/app/item-page/versions/item-versions.component.spec.ts b/src/app/item-page/versions/item-versions.component.spec.ts index 999176d996..e46f1585d7 100644 --- a/src/app/item-page/versions/item-versions.component.spec.ts +++ b/src/app/item-page/versions/item-versions.component.spec.ts @@ -18,7 +18,7 @@ import { PaginationServiceStub } from '../../shared/testing/pagination-service.s import { AuthService } from '../../core/auth/auth.service'; import { VersionDataService } from '../../core/data/version-data.service'; import { ItemDataService } from '../../core/data/item-data.service'; -import { FormBuilder, FormsModule, ReactiveFormsModule } from '@angular/forms'; +import { UntypedFormBuilder, FormsModule, ReactiveFormsModule } from '@angular/forms'; import { NotificationsService } from '../../shared/notifications/notifications.service'; import { NotificationsServiceStub } from '../../shared/testing/notifications-service.stub'; import { AuthorizationDataService } from '../../core/data/feature-authorization/authorization-data.service'; @@ -140,7 +140,7 @@ describe('ItemVersionsComponent', () => { imports: [TranslateModule.forRoot(), CommonModule, FormsModule, ReactiveFormsModule, BrowserModule, ItemSharedModule], providers: [ {provide: PaginationService, useValue: new PaginationServiceStub()}, - {provide: FormBuilder, useValue: new FormBuilder()}, + {provide: UntypedFormBuilder, useValue: new UntypedFormBuilder()}, {provide: NotificationsService, useValue: new NotificationsServiceStub()}, {provide: AuthService, useValue: authenticationServiceSpy}, {provide: AuthorizationDataService, useValue: authorizationServiceSpy}, diff --git a/src/app/item-page/versions/item-versions.component.ts b/src/app/item-page/versions/item-versions.component.ts index e0fc623f49..092f4fd222 100644 --- a/src/app/item-page/versions/item-versions.component.ts +++ b/src/app/item-page/versions/item-versions.component.ts @@ -32,7 +32,7 @@ import { getItemPageRoute, getItemVersionRoute } from '../item-page-routing-paths'; -import { FormBuilder } from '@angular/forms'; +import { UntypedFormBuilder } from '@angular/forms'; import { NgbModal } from '@ng-bootstrap/ng-bootstrap'; import { ItemVersionsSummaryModalComponent } from './item-versions-summary-modal/item-versions-summary-modal.component'; import { NotificationsService } from '../../shared/notifications/notifications.service'; @@ -171,7 +171,7 @@ export class ItemVersionsComponent implements OnInit { private versionService: VersionDataService, private itemService: ItemDataService, private paginationService: PaginationService, - private formBuilder: FormBuilder, + private formBuilder: UntypedFormBuilder, private modalService: NgbModal, private notificationsService: NotificationsService, private translateService: TranslateService, diff --git a/src/app/profile-page/profile-page-metadata-form/profile-page-metadata-form.component.ts b/src/app/profile-page/profile-page-metadata-form/profile-page-metadata-form.component.ts index 474e6fb025..c4e164a7e8 100644 --- a/src/app/profile-page/profile-page-metadata-form/profile-page-metadata-form.component.ts +++ b/src/app/profile-page/profile-page-metadata-form/profile-page-metadata-form.component.ts @@ -5,7 +5,7 @@ import { DynamicInputModel, DynamicSelectModel } from '@ng-dynamic-forms/core'; -import { FormGroup } from '@angular/forms'; +import { UntypedFormGroup } from '@angular/forms'; import { EPerson } from '../../core/eperson/models/eperson.model'; import { TranslateService } from '@ngx-translate/core'; import { hasValue, isNotEmpty } from '../../shared/empty.util'; @@ -80,7 +80,7 @@ export class ProfilePageMetadataFormComponent implements OnInit { /** * The form group of this form */ - formGroup: FormGroup; + formGroup: UntypedFormGroup; /** * Prefix for the form's label messages of this component diff --git a/src/app/profile-page/profile-page-security-form/profile-page-security-form.component.ts b/src/app/profile-page/profile-page-security-form/profile-page-security-form.component.ts index 29bcffe4e4..04292ea96e 100644 --- a/src/app/profile-page/profile-page-security-form/profile-page-security-form.component.ts +++ b/src/app/profile-page/profile-page-security-form/profile-page-security-form.component.ts @@ -1,7 +1,7 @@ import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core'; import { DynamicFormControlModel, DynamicFormService, DynamicInputModel } from '@ng-dynamic-forms/core'; import { TranslateService } from '@ngx-translate/core'; -import { FormGroup } from '@angular/forms'; +import { UntypedFormGroup } from '@angular/forms'; import { hasValue, isEmpty } from '../../shared/empty.util'; import { EPersonDataService } from '../../core/eperson/eperson-data.service'; import { NotificationsService } from '../../shared/notifications/notifications.service'; @@ -51,7 +51,7 @@ export class ProfilePageSecurityFormComponent implements OnInit { /** * The form group of this form */ - formGroup: FormGroup; + formGroup: UntypedFormGroup; /** * Indicates whether the "checkPasswordEmpty" needs to be added or not @@ -127,7 +127,7 @@ export class ProfilePageSecurityFormComponent implements OnInit { * Check if both password fields are filled in and equal * @param group The FormGroup to validate */ - checkPasswordsEqual(group: FormGroup) { + checkPasswordsEqual(group: UntypedFormGroup) { const pass = group.get('password').value; const repeatPass = group.get('passwordrepeat').value; @@ -138,7 +138,7 @@ export class ProfilePageSecurityFormComponent implements OnInit { * Checks if the password is empty * @param group The FormGroup to validate */ - checkPasswordEmpty(group: FormGroup) { + checkPasswordEmpty(group: UntypedFormGroup) { const pass = group.get('password').value; return isEmpty(pass) ? { emptyPassword: true } : null; } diff --git a/src/app/register-email-form/register-email-form.component.spec.ts b/src/app/register-email-form/register-email-form.component.spec.ts index 6136db4aec..9e852d9491 100644 --- a/src/app/register-email-form/register-email-form.component.spec.ts +++ b/src/app/register-email-form/register-email-form.component.spec.ts @@ -4,7 +4,7 @@ import { RestResponse } from '../core/cache/response.models'; import { CommonModule } from '@angular/common'; import { RouterTestingModule } from '@angular/router/testing'; import { TranslateModule } from '@ngx-translate/core'; -import { FormBuilder, ReactiveFormsModule } from '@angular/forms'; +import { UntypedFormBuilder, ReactiveFormsModule } from '@angular/forms'; import { Router } from '@angular/router'; import { NotificationsService } from '../shared/notifications/notifications.service'; import { CUSTOM_ELEMENTS_SCHEMA } from '@angular/core'; @@ -67,7 +67,7 @@ describe('RegisterEmailFormComponent', () => { {provide: Router, useValue: router}, {provide: EpersonRegistrationService, useValue: epersonRegistrationService}, {provide: ConfigurationDataService, useValue: configurationDataService}, - {provide: FormBuilder, useValue: new FormBuilder()}, + {provide: UntypedFormBuilder, useValue: new UntypedFormBuilder()}, {provide: NotificationsService, useValue: notificationsService}, {provide: CookieService, useValue: new CookieServiceMock()}, {provide: GoogleRecaptchaService, useValue: googleRecaptchaService}, diff --git a/src/app/register-email-form/register-email-form.component.ts b/src/app/register-email-form/register-email-form.component.ts index 9f0b186d39..ddb77b669c 100644 --- a/src/app/register-email-form/register-email-form.component.ts +++ b/src/app/register-email-form/register-email-form.component.ts @@ -3,7 +3,7 @@ import {EpersonRegistrationService} from '../core/data/eperson-registration.serv import {NotificationsService} from '../shared/notifications/notifications.service'; import {TranslateService} from '@ngx-translate/core'; import {Router} from '@angular/router'; -import { FormBuilder, FormControl, FormGroup, Validators, ValidatorFn } from '@angular/forms'; +import { UntypedFormBuilder, UntypedFormControl, UntypedFormGroup, Validators, ValidatorFn } from '@angular/forms'; import {Registration} from '../core/shared/registration.model'; import {RemoteData} from '../core/data/remote-data'; import {ConfigurationDataService} from '../core/data/configuration-data.service'; @@ -33,7 +33,7 @@ export class RegisterEmailFormComponent implements OnDestroy, OnInit { /** * The form containing the mail address */ - form: FormGroup; + form: UntypedFormGroup; /** * The message prefix @@ -79,7 +79,7 @@ export class RegisterEmailFormComponent implements OnDestroy, OnInit { private notificationService: NotificationsService, private translateService: TranslateService, private router: Router, - private formBuilder: FormBuilder, + private formBuilder: UntypedFormBuilder, private configService: ConfigurationDataService, public googleRecaptchaService: GoogleRecaptchaService, public cookieService: CookieService, @@ -102,7 +102,7 @@ export class RegisterEmailFormComponent implements OnDestroy, OnInit { Validators.pattern('^[a-zA-Z0-9.!#$%&\'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$') ]; this.form = this.formBuilder.group({ - email: new FormControl('', { + email: new UntypedFormControl('', { validators: validators, }) }); diff --git a/src/app/register-page/create-profile/confirmed.validator.spec.ts b/src/app/register-page/create-profile/confirmed.validator.spec.ts index 1be6aaf58f..b4d305fcf0 100644 --- a/src/app/register-page/create-profile/confirmed.validator.spec.ts +++ b/src/app/register-page/create-profile/confirmed.validator.spec.ts @@ -1,4 +1,4 @@ -import { FormBuilder, FormControl } from '@angular/forms'; +import { UntypedFormBuilder, UntypedFormControl } from '@angular/forms'; import { fakeAsync, waitForAsync } from '@angular/core/testing'; import { ConfirmedValidator } from './confirmed.validator'; @@ -7,9 +7,9 @@ describe('ConfirmedValidator', () => { beforeEach(waitForAsync(() => { - passwordForm = (new FormBuilder()).group({ - password: new FormControl('', {}), - confirmPassword: new FormControl('', {}) + passwordForm = (new UntypedFormBuilder()).group({ + password: new UntypedFormControl('', {}), + confirmPassword: new UntypedFormControl('', {}) }, { validator: ConfirmedValidator('password', 'confirmPassword') }); diff --git a/src/app/register-page/create-profile/confirmed.validator.ts b/src/app/register-page/create-profile/confirmed.validator.ts index 30f4f01701..914d50b540 100644 --- a/src/app/register-page/create-profile/confirmed.validator.ts +++ b/src/app/register-page/create-profile/confirmed.validator.ts @@ -1,10 +1,10 @@ -import { FormGroup } from '@angular/forms'; +import { UntypedFormGroup } from '@angular/forms'; /** * Validator used to confirm that the password and confirmed password value are the same */ export function ConfirmedValidator(controlName: string, matchingControlName: string) { - return (formGroup: FormGroup) => { + return (formGroup: UntypedFormGroup) => { const control = formGroup.controls[controlName]; const matchingControl = formGroup.controls[matchingControlName]; if (matchingControl.errors && !matchingControl.errors.confirmedValidator) { diff --git a/src/app/register-page/create-profile/create-profile.component.spec.ts b/src/app/register-page/create-profile/create-profile.component.spec.ts index 026785e59b..d5a1fea8b2 100644 --- a/src/app/register-page/create-profile/create-profile.component.spec.ts +++ b/src/app/register-page/create-profile/create-profile.component.spec.ts @@ -7,7 +7,7 @@ import { TranslateModule } from '@ngx-translate/core'; import { ActivatedRoute, Router } from '@angular/router'; import { CUSTOM_ELEMENTS_SCHEMA } from '@angular/core'; import { Store } from '@ngrx/store'; -import { FormBuilder, ReactiveFormsModule } from '@angular/forms'; +import { UntypedFormBuilder, ReactiveFormsModule } from '@angular/forms'; import { EPersonDataService } from '../../core/eperson/eperson-data.service'; import { NotificationsService } from '../../shared/notifications/notifications.service'; import { of as observableOf } from 'rxjs'; @@ -135,7 +135,7 @@ describe('CreateProfileComponent', () => { {provide: ActivatedRoute, useValue: route}, {provide: Store, useValue: store}, {provide: EPersonDataService, useValue: ePersonDataService}, - {provide: FormBuilder, useValue: new FormBuilder()}, + {provide: UntypedFormBuilder, useValue: new UntypedFormBuilder()}, {provide: NotificationsService, useValue: notificationsService}, {provide: EndUserAgreementService, useValue: endUserAgreementService}, ], diff --git a/src/app/register-page/create-profile/create-profile.component.ts b/src/app/register-page/create-profile/create-profile.component.ts index 0e8e0e8742..eaaa983a43 100644 --- a/src/app/register-page/create-profile/create-profile.component.ts +++ b/src/app/register-page/create-profile/create-profile.component.ts @@ -3,7 +3,7 @@ import { ActivatedRoute, Router } from '@angular/router'; import { map } from 'rxjs/operators'; import { Registration } from '../../core/shared/registration.model'; import { Observable } from 'rxjs'; -import { FormBuilder, FormControl, FormGroup, Validators } from '@angular/forms'; +import { UntypedFormBuilder, UntypedFormControl, UntypedFormGroup, Validators } from '@angular/forms'; import { TranslateService } from '@ngx-translate/core'; import { EPersonDataService } from '../../core/eperson/eperson-data.service'; import { EPerson } from '../../core/eperson/models/eperson.model'; @@ -38,7 +38,7 @@ export class CreateProfileComponent implements OnInit { isInValidPassword = true; password: string; - userInfoForm: FormGroup; + userInfoForm: UntypedFormGroup; activeLangs: LangConfig[]; /** @@ -52,7 +52,7 @@ export class CreateProfileComponent implements OnInit { private store: Store, private router: Router, private route: ActivatedRoute, - private formBuilder: FormBuilder, + private formBuilder: UntypedFormBuilder, private notificationsService: NotificationsService, private endUserAgreementService: EndUserAgreementService ) { @@ -71,14 +71,14 @@ export class CreateProfileComponent implements OnInit { this.activeLangs = environment.languages.filter((MyLangConfig) => MyLangConfig.active === true); this.userInfoForm = this.formBuilder.group({ - firstName: new FormControl('', { + firstName: new UntypedFormControl('', { validators: [Validators.required], }), - lastName: new FormControl('', { + lastName: new UntypedFormControl('', { validators: [Validators.required], }), - contactPhone: new FormControl(''), - language: new FormControl(''), + contactPhone: new UntypedFormControl(''), + language: new UntypedFormControl(''), }); } diff --git a/src/app/search-navbar/search-navbar.component.ts b/src/app/search-navbar/search-navbar.component.ts index ccdaa27861..98e64f6e10 100644 --- a/src/app/search-navbar/search-navbar.component.ts +++ b/src/app/search-navbar/search-navbar.component.ts @@ -1,5 +1,5 @@ import { Component, ElementRef, ViewChild } from '@angular/core'; -import { FormBuilder } from '@angular/forms'; +import { UntypedFormBuilder } from '@angular/forms'; import { Router } from '@angular/router'; import { SearchService } from '../core/shared/search/search.service'; import { expandSearchInput } from '../shared/animations/slide'; @@ -24,7 +24,7 @@ export class SearchNavbarComponent { // Search input field @ViewChild('searchInput') searchField: ElementRef; - constructor(private formBuilder: FormBuilder, private router: Router, private searchService: SearchService) { + constructor(private formBuilder: UntypedFormBuilder, private router: Router, private searchService: SearchService) { this.searchForm = this.formBuilder.group(({ query: '', })); diff --git a/src/app/shared/collection-dropdown/collection-dropdown.component.ts b/src/app/shared/collection-dropdown/collection-dropdown.component.ts index 10a673c7f2..575c2769b0 100644 --- a/src/app/shared/collection-dropdown/collection-dropdown.component.ts +++ b/src/app/shared/collection-dropdown/collection-dropdown.component.ts @@ -9,7 +9,7 @@ import { OnInit, Output } from '@angular/core'; -import { FormControl } from '@angular/forms'; +import { UntypedFormControl } from '@angular/forms'; import { BehaviorSubject, from as observableFrom, Observable, of as observableOf, Subscription } from 'rxjs'; import { debounceTime, distinctUntilChanged, map, mergeMap, reduce, startWith, switchMap, take } from 'rxjs/operators'; @@ -54,7 +54,7 @@ export class CollectionDropdownComponent implements OnInit, OnDestroy { * The search form control * @type {FormControl} */ - public searchField: FormControl = new FormControl(); + public searchField: UntypedFormControl = new UntypedFormControl(); /** * The collection list obtained from a search diff --git a/src/app/shared/comcol/comcol-forms/comcol-form/comcol-form.component.spec.ts b/src/app/shared/comcol/comcol-forms/comcol-form/comcol-form.component.spec.ts index 054c161da6..3f74f05118 100644 --- a/src/app/shared/comcol/comcol-forms/comcol-form/comcol-form.component.spec.ts +++ b/src/app/shared/comcol/comcol-forms/comcol-form/comcol-form.component.spec.ts @@ -1,7 +1,7 @@ import { Location } from '@angular/common'; import { NO_ERRORS_SCHEMA } from '@angular/core'; import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; -import { FormControl, FormGroup } from '@angular/forms'; +import { UntypedFormControl, UntypedFormGroup } from '@angular/forms'; import { By } from '@angular/platform-browser'; import { RouterTestingModule } from '@angular/router/testing'; import { DynamicFormControlModel, DynamicFormService, DynamicInputModel } from '@ng-dynamic-forms/core'; @@ -30,9 +30,9 @@ describe('ComColFormComponent', () => { const controls = {}; if (hasValue(fModel)) { fModel.forEach((controlModel) => { - controls[controlModel.id] = new FormControl((controlModel as any).value); + controls[controlModel.id] = new UntypedFormControl((controlModel as any).value); }); - return new FormGroup(controls); + return new UntypedFormGroup(controls); } return undefined; } diff --git a/src/app/shared/comcol/comcol-forms/comcol-form/comcol-form.component.ts b/src/app/shared/comcol/comcol-forms/comcol-form/comcol-form.component.ts index 23dfca8616..bbd8b01257 100644 --- a/src/app/shared/comcol/comcol-forms/comcol-form/comcol-form.component.ts +++ b/src/app/shared/comcol/comcol-forms/comcol-form/comcol-form.component.ts @@ -1,5 +1,5 @@ import { Component, EventEmitter, Input, OnDestroy, OnInit, Output, ViewChild } from '@angular/core'; -import { FormGroup } from '@angular/forms'; +import { UntypedFormGroup } from '@angular/forms'; import { DynamicFormControlModel, DynamicFormService, DynamicInputModel } from '@ng-dynamic-forms/core'; import { TranslateService } from '@ngx-translate/core'; import { FileUploader } from 'ng2-file-upload'; @@ -66,7 +66,7 @@ export class ComColFormComponent implements On /** * The form group of this form */ - formGroup: FormGroup; + formGroup: UntypedFormGroup; /** * The uploader configuration options diff --git a/src/app/shared/dso-selector/dso-selector/dso-selector.component.ts b/src/app/shared/dso-selector/dso-selector/dso-selector.component.ts index fe64c0a41e..503e4c4412 100644 --- a/src/app/shared/dso-selector/dso-selector/dso-selector.component.ts +++ b/src/app/shared/dso-selector/dso-selector/dso-selector.component.ts @@ -9,7 +9,7 @@ import { QueryList, ViewChildren } from '@angular/core'; -import { FormControl } from '@angular/forms'; +import { UntypedFormControl } from '@angular/forms'; import { BehaviorSubject, @@ -86,7 +86,7 @@ export class DSOSelectorComponent implements OnInit, OnDestroy { /** * Input form control to query the list */ - public input: FormControl = new FormControl(); + public input: UntypedFormControl = new UntypedFormControl(); /** * Default pagination for this feature diff --git a/src/app/shared/eperson-group-list/eperson-search-box/eperson-search-box.component.spec.ts b/src/app/shared/eperson-group-list/eperson-search-box/eperson-search-box.component.spec.ts index 5a9e74055a..e88f08a131 100644 --- a/src/app/shared/eperson-group-list/eperson-search-box/eperson-search-box.component.spec.ts +++ b/src/app/shared/eperson-group-list/eperson-search-box/eperson-search-box.component.spec.ts @@ -1,6 +1,6 @@ import { ComponentFixture, inject, TestBed, waitForAsync } from '@angular/core/testing'; import { Component, NO_ERRORS_SCHEMA } from '@angular/core'; -import { FormBuilder, FormsModule, ReactiveFormsModule } from '@angular/forms'; +import { UntypedFormBuilder, FormsModule, ReactiveFormsModule } from '@angular/forms'; import { TranslateModule } from '@ngx-translate/core'; @@ -13,7 +13,7 @@ describe('EpersonSearchBoxComponent test suite', () => { let compAsAny: any; let fixture: ComponentFixture; let de; - let formBuilder: FormBuilder; + let formBuilder: UntypedFormBuilder; beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ @@ -27,7 +27,7 @@ describe('EpersonSearchBoxComponent test suite', () => { TestComponent ], providers: [ - FormBuilder, + UntypedFormBuilder, EpersonSearchBoxComponent ], schemas: [ @@ -64,7 +64,7 @@ describe('EpersonSearchBoxComponent test suite', () => { beforeEach(() => { // initTestScheduler(); fixture = TestBed.createComponent(EpersonSearchBoxComponent); - formBuilder = TestBed.inject(FormBuilder); + formBuilder = TestBed.inject(UntypedFormBuilder); comp = fixture.componentInstance; compAsAny = fixture.componentInstance; }); diff --git a/src/app/shared/eperson-group-list/eperson-search-box/eperson-search-box.component.ts b/src/app/shared/eperson-group-list/eperson-search-box/eperson-search-box.component.ts index 2aa4891c03..4689d29a8c 100644 --- a/src/app/shared/eperson-group-list/eperson-search-box/eperson-search-box.component.ts +++ b/src/app/shared/eperson-group-list/eperson-search-box/eperson-search-box.component.ts @@ -1,5 +1,5 @@ import { Component, EventEmitter, Output } from '@angular/core'; -import { FormBuilder } from '@angular/forms'; +import { UntypedFormBuilder } from '@angular/forms'; import { Subscription } from 'rxjs'; @@ -33,7 +33,7 @@ export class EpersonSearchBoxComponent { */ @Output() search: EventEmitter = new EventEmitter(); - constructor(private formBuilder: FormBuilder) { + constructor(private formBuilder: UntypedFormBuilder) { this.searchForm = this.formBuilder.group(({ scope: 'metadata', query: '', diff --git a/src/app/shared/eperson-group-list/group-search-box/group-search-box.component.spec.ts b/src/app/shared/eperson-group-list/group-search-box/group-search-box.component.spec.ts index d28a144245..b4c663902d 100644 --- a/src/app/shared/eperson-group-list/group-search-box/group-search-box.component.spec.ts +++ b/src/app/shared/eperson-group-list/group-search-box/group-search-box.component.spec.ts @@ -1,6 +1,6 @@ import { ComponentFixture, inject, TestBed, waitForAsync } from '@angular/core/testing'; import { Component, NO_ERRORS_SCHEMA } from '@angular/core'; -import { FormBuilder, FormsModule, ReactiveFormsModule } from '@angular/forms'; +import { UntypedFormBuilder, FormsModule, ReactiveFormsModule } from '@angular/forms'; import { TranslateModule } from '@ngx-translate/core'; @@ -13,7 +13,7 @@ describe('GroupSearchBoxComponent test suite', () => { let compAsAny: any; let fixture: ComponentFixture; let de; - let formBuilder: FormBuilder; + let formBuilder: UntypedFormBuilder; beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ @@ -27,7 +27,7 @@ describe('GroupSearchBoxComponent test suite', () => { TestComponent ], providers: [ - FormBuilder, + UntypedFormBuilder, GroupSearchBoxComponent ], schemas: [ @@ -64,7 +64,7 @@ describe('GroupSearchBoxComponent test suite', () => { beforeEach(() => { // initTestScheduler(); fixture = TestBed.createComponent(GroupSearchBoxComponent); - formBuilder = TestBed.inject(FormBuilder); + formBuilder = TestBed.inject(UntypedFormBuilder); comp = fixture.componentInstance; compAsAny = fixture.componentInstance; }); diff --git a/src/app/shared/eperson-group-list/group-search-box/group-search-box.component.ts b/src/app/shared/eperson-group-list/group-search-box/group-search-box.component.ts index 3e45bb0336..154bee2d07 100644 --- a/src/app/shared/eperson-group-list/group-search-box/group-search-box.component.ts +++ b/src/app/shared/eperson-group-list/group-search-box/group-search-box.component.ts @@ -1,5 +1,5 @@ import { Component, EventEmitter, Output } from '@angular/core'; -import { FormBuilder } from '@angular/forms'; +import { UntypedFormBuilder } from '@angular/forms'; import { Subscription } from 'rxjs'; @@ -33,7 +33,7 @@ export class GroupSearchBoxComponent { */ @Output() search: EventEmitter = new EventEmitter(); - constructor(private formBuilder: FormBuilder) { + constructor(private formBuilder: UntypedFormBuilder) { this.searchForm = this.formBuilder.group(({ query: '', })); diff --git a/src/app/shared/form/builder/ds-dynamic-form-ui/ds-dynamic-form-control-container.component.spec.ts b/src/app/shared/form/builder/ds-dynamic-form-ui/ds-dynamic-form-control-container.component.spec.ts index 08966f0f78..b77ee9950c 100644 --- a/src/app/shared/form/builder/ds-dynamic-form-ui/ds-dynamic-form-control-container.component.spec.ts +++ b/src/app/shared/form/builder/ds-dynamic-form-ui/ds-dynamic-form-control-container.component.spec.ts @@ -1,6 +1,6 @@ import { ComponentFixture, inject, TestBed, waitForAsync } from '@angular/core/testing'; import { CUSTOM_ELEMENTS_SCHEMA, DebugElement, NgZone, SimpleChange } from '@angular/core'; -import { FormControl, FormGroup, FormsModule, ReactiveFormsModule } from '@angular/forms'; +import { UntypedFormControl, UntypedFormGroup, FormsModule, ReactiveFormsModule } from '@angular/forms'; import { BrowserDynamicTestingModule } from '@angular/platform-browser-dynamic/testing'; import { By } from '@angular/platform-browser'; @@ -187,7 +187,7 @@ describe('DsDynamicFormControlContainerComponent test suite', () => { new DynamicQualdropModel({ id: 'combobox', readOnly: false, required: false }) ]; const testModel = formModel[8]; - let formGroup: FormGroup; + let formGroup: UntypedFormGroup; let fixture: ComponentFixture; let component: DsDynamicFormControlContainerComponent; let debugElement: DebugElement; @@ -270,8 +270,8 @@ describe('DsDynamicFormControlContainerComponent test suite', () => { it('should initialize correctly', () => { expect(component.context).toBeNull(); - expect(component.control instanceof FormControl).toBe(true); - expect(component.group instanceof FormGroup).toBe(true); + expect(component.control instanceof UntypedFormControl).toBe(true); + expect(component.group instanceof UntypedFormGroup).toBe(true); expect(component.model instanceof DynamicFormControlModel).toBe(true); expect(component.hasErrorMessaging).toBe(false); diff --git a/src/app/shared/form/builder/ds-dynamic-form-ui/ds-dynamic-form-control-container.component.ts b/src/app/shared/form/builder/ds-dynamic-form-ui/ds-dynamic-form-control-container.component.ts index 5eee8f932d..ff5a119b6f 100644 --- a/src/app/shared/form/builder/ds-dynamic-form-ui/ds-dynamic-form-control-container.component.ts +++ b/src/app/shared/form/builder/ds-dynamic-form-ui/ds-dynamic-form-control-container.component.ts @@ -17,7 +17,7 @@ import { ViewChild, ViewContainerRef } from '@angular/core'; -import { FormArray, FormGroup } from '@angular/forms'; +import { UntypedFormArray, UntypedFormGroup } from '@angular/forms'; import { DYNAMIC_FORM_CONTROL_TYPE_ARRAY, @@ -199,12 +199,12 @@ export class DsDynamicFormControlContainerComponent extends DynamicFormControlCo @Input('templates') inputTemplateList: QueryList; @Input() hasMetadataModel: any; @Input() formId: string; - @Input() formGroup: FormGroup; + @Input() formGroup: UntypedFormGroup; @Input() formModel: DynamicFormControlModel[]; @Input() asBootstrapFormGroup = false; @Input() bindId = true; @Input() context: any | null = null; - @Input() group: FormGroup; + @Input() group: UntypedFormGroup; @Input() hostClass: string[]; @Input() hasErrorMessaging = false; @Input() layout = null as DynamicFormLayout; @@ -475,7 +475,7 @@ export class DsDynamicFormControlContainerComponent extends DynamicFormControlCo onRemove(): void { const arrayContext: DynamicFormArrayModel = (this.context as DynamicFormArrayGroupModel).context; const path = this.formBuilderService.getPath(arrayContext); - const formArrayControl = this.group.root.get(path) as FormArray; + const formArrayControl = this.group.root.get(path) as UntypedFormArray; this.formBuilderService.removeFormArrayGroup(this.context.index, formArrayControl, arrayContext); if (this.model.parent.context.groups.length === 0) { this.formBuilderService.addFormArrayGroup(formArrayControl, arrayContext); diff --git a/src/app/shared/form/builder/ds-dynamic-form-ui/ds-dynamic-form.component.ts b/src/app/shared/form/builder/ds-dynamic-form-ui/ds-dynamic-form.component.ts index 537a1f0f52..45511d6941 100644 --- a/src/app/shared/form/builder/ds-dynamic-form-ui/ds-dynamic-form.component.ts +++ b/src/app/shared/form/builder/ds-dynamic-form-ui/ds-dynamic-form.component.ts @@ -8,7 +8,7 @@ import { QueryList, ViewChildren } from '@angular/core'; -import { FormGroup } from '@angular/forms'; +import { UntypedFormGroup } from '@angular/forms'; import { DynamicFormComponent, DynamicFormControlContainerComponent, @@ -27,7 +27,7 @@ import { DsDynamicFormControlContainerComponent } from './ds-dynamic-form-contro export class DsDynamicFormComponent extends DynamicFormComponent { @Input() formId: string; - @Input() formGroup: FormGroup; + @Input() formGroup: UntypedFormGroup; @Input() formModel: DynamicFormControlModel[]; @Input() formLayout: DynamicFormLayout; diff --git a/src/app/shared/form/builder/ds-dynamic-form-ui/ds-dynamic-type-bind-relation.service.spec.ts b/src/app/shared/form/builder/ds-dynamic-form-ui/ds-dynamic-type-bind-relation.service.spec.ts index 7f0c7e2e35..12b2409bf2 100644 --- a/src/app/shared/form/builder/ds-dynamic-form-ui/ds-dynamic-type-bind-relation.service.spec.ts +++ b/src/app/shared/form/builder/ds-dynamic-form-ui/ds-dynamic-type-bind-relation.service.spec.ts @@ -14,7 +14,7 @@ import { } from '../../../mocks/form-models.mock'; import {DsDynamicTypeBindRelationService} from './ds-dynamic-type-bind-relation.service'; import {FormFieldMetadataValueObject} from '../models/form-field-metadata-value.model'; -import {FormControl, ReactiveFormsModule} from '@angular/forms'; +import {UntypedFormControl, ReactiveFormsModule} from '@angular/forms'; import {FormBuilderService} from '../form-builder.service'; import {getMockFormBuilderService} from '../../../mocks/form-builder-service.mock'; import {Injector} from '@angular/core'; @@ -87,7 +87,7 @@ describe('DSDynamicTypeBindRelationService test suite', () => { it('Should receive one subscription to dc.type type binding"', () => { const testModel = mockInputWithTypeBindModel; testModel.typeBindRelations = getTypeBindRelations(['boundType']); - const dcTypeControl = new FormControl(); + const dcTypeControl = new UntypedFormControl(); dcTypeControl.setValue('boundType'); let subscriptions = service.subscribeRelations(testModel, dcTypeControl); expect(subscriptions).toHaveSize(1); @@ -96,7 +96,7 @@ describe('DSDynamicTypeBindRelationService test suite', () => { it('Expect hasMatch to be true (ie. this should be hidden)', () => { const testModel = mockInputWithTypeBindModel; testModel.typeBindRelations = getTypeBindRelations(['boundType']); - const dcTypeControl = new FormControl(); + const dcTypeControl = new UntypedFormControl(); dcTypeControl.setValue('boundType'); testModel.typeBindRelations[0].when[0].value = 'anotherType'; const relation = dynamicFormRelationService.findRelationByMatcher((testModel as any).typeBindRelations, HIDDEN_MATCHER); @@ -111,7 +111,7 @@ describe('DSDynamicTypeBindRelationService test suite', () => { it('Expect hasMatch to be false (ie. this should NOT be hidden)', () => { const testModel = mockInputWithTypeBindModel; testModel.typeBindRelations = getTypeBindRelations(['boundType']); - const dcTypeControl = new FormControl(); + const dcTypeControl = new UntypedFormControl(); dcTypeControl.setValue('boundType'); testModel.typeBindRelations[0].when[0].value = 'boundType'; const relation = dynamicFormRelationService.findRelationByMatcher((testModel as any).typeBindRelations, HIDDEN_MATCHER); diff --git a/src/app/shared/form/builder/ds-dynamic-form-ui/ds-dynamic-type-bind-relation.service.ts b/src/app/shared/form/builder/ds-dynamic-form-ui/ds-dynamic-type-bind-relation.service.ts index 5dd4a6627d..d5e735ed1a 100644 --- a/src/app/shared/form/builder/ds-dynamic-form-ui/ds-dynamic-type-bind-relation.service.ts +++ b/src/app/shared/form/builder/ds-dynamic-form-ui/ds-dynamic-type-bind-relation.service.ts @@ -1,5 +1,5 @@ import { Inject, Injectable, Injector, Optional } from '@angular/core'; -import { FormControl } from '@angular/forms'; +import { UntypedFormControl } from '@angular/forms'; import { Subscription } from 'rxjs'; import { startWith } from 'rxjs/operators'; @@ -172,7 +172,7 @@ export class DsDynamicTypeBindRelationService { * @param model * @param control */ - subscribeRelations(model: DynamicFormControlModel, control: FormControl): Subscription[] { + subscribeRelations(model: DynamicFormControlModel, control: UntypedFormControl): Subscription[] { const relatedModels = this.getRelatedFormModel(model); const subscriptions: Subscription[] = []; diff --git a/src/app/shared/form/builder/ds-dynamic-form-ui/existing-metadata-list-element/existing-metadata-list-element.component.ts b/src/app/shared/form/builder/ds-dynamic-form-ui/existing-metadata-list-element/existing-metadata-list-element.component.ts index 3160bccb41..aa50133e8a 100644 --- a/src/app/shared/form/builder/ds-dynamic-form-ui/existing-metadata-list-element/existing-metadata-list-element.component.ts +++ b/src/app/shared/form/builder/ds-dynamic-form-ui/existing-metadata-list-element/existing-metadata-list-element.component.ts @@ -1,6 +1,6 @@ /* eslint-disable max-classes-per-file */ import { Component, EventEmitter, Input, OnChanges, OnDestroy, OnInit, Output } from '@angular/core'; -import { FormControl } from '@angular/forms'; +import { UntypedFormControl } from '@angular/forms'; import { DynamicFormArrayGroupModel } from '@ng-dynamic-forms/core'; import { Store } from '@ngrx/store'; import { BehaviorSubject, Subscription } from 'rxjs'; @@ -64,7 +64,7 @@ export class ReorderableFormFieldMetadataValue extends Reorderable { constructor( public metadataValue: FormFieldMetadataValueObject, public model: DynamicConcatModel, - public control: FormControl, + public control: UntypedFormControl, public group: DynamicFormArrayGroupModel, oldIndex?: number, newIndex?: number diff --git a/src/app/shared/form/builder/ds-dynamic-form-ui/models/array-group/dynamic-form-array.component.ts b/src/app/shared/form/builder/ds-dynamic-form-ui/models/array-group/dynamic-form-array.component.ts index 01bba74cc8..9d48bdac21 100644 --- a/src/app/shared/form/builder/ds-dynamic-form-ui/models/array-group/dynamic-form-array.component.ts +++ b/src/app/shared/form/builder/ds-dynamic-form-ui/models/array-group/dynamic-form-array.component.ts @@ -1,6 +1,6 @@ import { CdkDragDrop } from '@angular/cdk/drag-drop'; import { Component, EventEmitter, Input, Output, QueryList } from '@angular/core'; -import { FormGroup } from '@angular/forms'; +import { UntypedFormGroup } from '@angular/forms'; import { DynamicFormArrayComponent, DynamicFormControlCustomEvent, @@ -26,7 +26,7 @@ export class DsDynamicFormArrayComponent extends DynamicFormArrayComponent { @Input() bindId = true; @Input() formModel: DynamicFormControlModel[]; @Input() formLayout: DynamicFormLayout; - @Input() group: FormGroup; + @Input() group: UntypedFormGroup; @Input() layout: DynamicFormControlLayout; @Input() model: DynamicRowArrayModel;// DynamicRow? @Input() templates: QueryList | undefined; diff --git a/src/app/shared/form/builder/ds-dynamic-form-ui/models/custom-switch/custom-switch.component.spec.ts b/src/app/shared/form/builder/ds-dynamic-form-ui/models/custom-switch/custom-switch.component.spec.ts index 9f85ccc013..ceb498fe56 100644 --- a/src/app/shared/form/builder/ds-dynamic-form-ui/models/custom-switch/custom-switch.component.spec.ts +++ b/src/app/shared/form/builder/ds-dynamic-form-ui/models/custom-switch/custom-switch.component.spec.ts @@ -1,5 +1,5 @@ import { DynamicFormsCoreModule, DynamicFormService } from '@ng-dynamic-forms/core'; -import { FormGroup, ReactiveFormsModule } from '@angular/forms'; +import { UntypedFormGroup, ReactiveFormsModule } from '@angular/forms'; import { ComponentFixture, inject, TestBed, waitForAsync } from '@angular/core/testing'; import { DebugElement } from '@angular/core'; import { NoopAnimationsModule } from '@angular/platform-browser/animations'; @@ -11,7 +11,7 @@ describe('CustomSwitchComponent', () => { const testModel = new DynamicCustomSwitchModel({ id: 'switch' }); const formModel = [testModel]; - let formGroup: FormGroup; + let formGroup: UntypedFormGroup; let fixture: ComponentFixture; let component: CustomSwitchComponent; let debugElement: DebugElement; @@ -47,7 +47,7 @@ describe('CustomSwitchComponent', () => { it('should initialize correctly', () => { expect(component.bindId).toBe(true); - expect(component.group instanceof FormGroup).toBe(true); + expect(component.group instanceof UntypedFormGroup).toBe(true); expect(component.model instanceof DynamicCustomSwitchModel).toBe(true); expect(component.blur).toBeDefined(); diff --git a/src/app/shared/form/builder/ds-dynamic-form-ui/models/custom-switch/custom-switch.component.ts b/src/app/shared/form/builder/ds-dynamic-form-ui/models/custom-switch/custom-switch.component.ts index 5b3f1e89e4..47780e66f6 100644 --- a/src/app/shared/form/builder/ds-dynamic-form-ui/models/custom-switch/custom-switch.component.ts +++ b/src/app/shared/form/builder/ds-dynamic-form-ui/models/custom-switch/custom-switch.component.ts @@ -1,5 +1,5 @@ import { Component, EventEmitter, Input, Output } from '@angular/core'; -import { FormGroup } from '@angular/forms'; +import { UntypedFormGroup } from '@angular/forms'; import { DynamicNGBootstrapCheckboxComponent } from '@ng-dynamic-forms/ui-ng-bootstrap'; import { DynamicFormLayoutService, DynamicFormValidationService } from '@ng-dynamic-forms/core'; @@ -24,7 +24,7 @@ export class CustomSwitchComponent extends DynamicNGBootstrapCheckboxComponent { /** * The formgroup containing this component */ - @Input() group: FormGroup; + @Input() group: UntypedFormGroup; /** * The model used for displaying the switch diff --git a/src/app/shared/form/builder/ds-dynamic-form-ui/models/date-picker-inline/dynamic-date-picker-inline.component.spec.ts b/src/app/shared/form/builder/ds-dynamic-form-ui/models/date-picker-inline/dynamic-date-picker-inline.component.spec.ts index 0756e48a8d..c0d1c83bf9 100644 --- a/src/app/shared/form/builder/ds-dynamic-form-ui/models/date-picker-inline/dynamic-date-picker-inline.component.spec.ts +++ b/src/app/shared/form/builder/ds-dynamic-form-ui/models/date-picker-inline/dynamic-date-picker-inline.component.spec.ts @@ -1,6 +1,6 @@ import { ComponentFixture, inject, TestBed, waitForAsync } from '@angular/core/testing'; import { DebugElement } from '@angular/core'; -import { FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms'; +import { UntypedFormControl, UntypedFormGroup, ReactiveFormsModule } from '@angular/forms'; import { NoopAnimationsModule } from '@angular/platform-browser/animations'; import { By } from '@angular/platform-browser'; import { NgbDatepickerModule } from '@ng-bootstrap/ng-bootstrap'; @@ -11,7 +11,7 @@ describe('DsDatePickerInlineComponent test suite', () => { const testModel = new DynamicDatePickerModel({ id: 'datepicker' }); const formModel = [testModel]; - let formGroup: FormGroup; + let formGroup: UntypedFormGroup; let fixture: ComponentFixture; let component: DsDatePickerInlineComponent; let debugElement: DebugElement; @@ -53,8 +53,8 @@ describe('DsDatePickerInlineComponent test suite', () => { it('should initialize correctly', () => { expect(component.bindId).toBe(true); - expect(component.control instanceof FormControl).toBe(true); - expect(component.group instanceof FormGroup).toBe(true); + expect(component.control instanceof UntypedFormControl).toBe(true); + expect(component.group instanceof UntypedFormGroup).toBe(true); expect(component.model instanceof DynamicDatePickerModel).toBe(true); expect(component.blur).toBeDefined(); diff --git a/src/app/shared/form/builder/ds-dynamic-form-ui/models/date-picker-inline/dynamic-date-picker-inline.component.ts b/src/app/shared/form/builder/ds-dynamic-form-ui/models/date-picker-inline/dynamic-date-picker-inline.component.ts index f23b6c1e7b..2eb6e9291c 100644 --- a/src/app/shared/form/builder/ds-dynamic-form-ui/models/date-picker-inline/dynamic-date-picker-inline.component.ts +++ b/src/app/shared/form/builder/ds-dynamic-form-ui/models/date-picker-inline/dynamic-date-picker-inline.component.ts @@ -1,5 +1,5 @@ import { Component, EventEmitter, Input, Output, ViewChild } from '@angular/core'; -import { FormGroup } from '@angular/forms'; +import { UntypedFormGroup } from '@angular/forms'; import { NgbDatepicker, NgbDatepickerConfig } from '@ng-bootstrap/ng-bootstrap'; import { DynamicDatePickerModel, @@ -16,7 +16,7 @@ import { export class DsDatePickerInlineComponent extends DynamicFormControlComponent { @Input() bindId = true; - @Input() group: FormGroup; + @Input() group: UntypedFormGroup; @Input() layout: DynamicFormControlLayout; @Input() model: DynamicDatePickerModel; diff --git a/src/app/shared/form/builder/ds-dynamic-form-ui/models/date-picker/date-picker.component.spec.ts b/src/app/shared/form/builder/ds-dynamic-form-ui/models/date-picker/date-picker.component.spec.ts index 4989dab93a..ffc36008c6 100644 --- a/src/app/shared/form/builder/ds-dynamic-form-ui/models/date-picker/date-picker.component.spec.ts +++ b/src/app/shared/form/builder/ds-dynamic-form-ui/models/date-picker/date-picker.component.spec.ts @@ -1,7 +1,7 @@ // Load the implementations that should be tested import { ChangeDetectorRef, Component, CUSTOM_ELEMENTS_SCHEMA } from '@angular/core'; import { ComponentFixture, inject, TestBed, waitForAsync, } from '@angular/core/testing'; -import { FormControl, FormGroup } from '@angular/forms'; +import { UntypedFormControl, UntypedFormGroup } from '@angular/forms'; import { NgbModule } from '@ng-bootstrap/ng-bootstrap'; import { DynamicFormLayoutService, DynamicFormValidationService } from '@ng-dynamic-forms/core'; @@ -15,8 +15,8 @@ import { } from '../../../../../testing/dynamic-form-mock-services'; -export const DATE_TEST_GROUP = new FormGroup({ - date: new FormControl() +export const DATE_TEST_GROUP = new UntypedFormGroup({ + date: new UntypedFormControl() }); export const DATE_TEST_MODEL_CONFIG = { diff --git a/src/app/shared/form/builder/ds-dynamic-form-ui/models/date-picker/date-picker.component.ts b/src/app/shared/form/builder/ds-dynamic-form-ui/models/date-picker/date-picker.component.ts index 78f9935829..8d5ce5b48e 100644 --- a/src/app/shared/form/builder/ds-dynamic-form-ui/models/date-picker/date-picker.component.ts +++ b/src/app/shared/form/builder/ds-dynamic-form-ui/models/date-picker/date-picker.component.ts @@ -1,5 +1,5 @@ import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core'; -import { FormGroup } from '@angular/forms'; +import { UntypedFormGroup } from '@angular/forms'; import { DynamicDsDatePickerModel } from './date-picker.model'; import { hasValue } from '../../../../../empty.util'; import { @@ -18,7 +18,7 @@ export const DS_DATE_PICKER_SEPARATOR = '-'; export class DsDatePickerComponent extends DynamicFormControlComponent implements OnInit { @Input() bindId = true; - @Input() group: FormGroup; + @Input() group: UntypedFormGroup; @Input() model: DynamicDsDatePickerModel; @Input() legend: string; diff --git a/src/app/shared/form/builder/ds-dynamic-form-ui/models/disabled/dynamic-disabled.component.spec.ts b/src/app/shared/form/builder/ds-dynamic-form-ui/models/disabled/dynamic-disabled.component.spec.ts index 8cfa5c818a..a25ad4d231 100644 --- a/src/app/shared/form/builder/ds-dynamic-form-ui/models/disabled/dynamic-disabled.component.spec.ts +++ b/src/app/shared/form/builder/ds-dynamic-form-ui/models/disabled/dynamic-disabled.component.spec.ts @@ -1,6 +1,6 @@ import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; import { DebugElement, NO_ERRORS_SCHEMA } from '@angular/core'; -import { FormControl, FormGroup, FormsModule } from '@angular/forms'; +import { UntypedFormControl, UntypedFormGroup, FormsModule } from '@angular/forms'; import { By } from '@angular/platform-browser'; import { TranslateModule } from '@ngx-translate/core'; @@ -31,8 +31,8 @@ describe('DsDynamicDisabledComponent', () => { name: 'disabledInput', hasSelectableMetadata: false }); - group = new FormGroup({ - disabledInput: new FormControl(), + group = new UntypedFormGroup({ + disabledInput: new UntypedFormControl(), }); } diff --git a/src/app/shared/form/builder/ds-dynamic-form-ui/models/disabled/dynamic-disabled.component.ts b/src/app/shared/form/builder/ds-dynamic-form-ui/models/disabled/dynamic-disabled.component.ts index 974858b1cc..222ad51049 100644 --- a/src/app/shared/form/builder/ds-dynamic-form-ui/models/disabled/dynamic-disabled.component.ts +++ b/src/app/shared/form/builder/ds-dynamic-form-ui/models/disabled/dynamic-disabled.component.ts @@ -1,5 +1,5 @@ import { Component, EventEmitter, Input, Output } from '@angular/core'; -import { FormGroup } from '@angular/forms'; +import { UntypedFormGroup } from '@angular/forms'; import { DynamicFormControlComponent, DynamicFormLayoutService, DynamicFormValidationService } from '@ng-dynamic-forms/core'; @@ -18,7 +18,7 @@ import { DynamicDisabledModel } from './dynamic-disabled.model'; export class DsDynamicDisabledComponent extends DynamicFormControlComponent { @Input() formId: string; - @Input() group: FormGroup; + @Input() group: UntypedFormGroup; @Input() model: DynamicDisabledModel; modelValuesString = ''; diff --git a/src/app/shared/form/builder/ds-dynamic-form-ui/models/dynamic-vocabulary.component.ts b/src/app/shared/form/builder/ds-dynamic-form-ui/models/dynamic-vocabulary.component.ts index 4c24443633..c8a5ed98ad 100644 --- a/src/app/shared/form/builder/ds-dynamic-form-ui/models/dynamic-vocabulary.component.ts +++ b/src/app/shared/form/builder/ds-dynamic-form-ui/models/dynamic-vocabulary.component.ts @@ -1,5 +1,5 @@ import { Component, EventEmitter, Input, Output } from '@angular/core'; -import { FormGroup } from '@angular/forms'; +import { UntypedFormGroup } from '@angular/forms'; import { DynamicFormControlComponent, @@ -25,7 +25,7 @@ import { PageInfo } from '../../../../../core/shared/page-info.model'; }) export abstract class DsDynamicVocabularyComponent extends DynamicFormControlComponent { - @Input() abstract group: FormGroup; + @Input() abstract group: UntypedFormGroup; @Input() abstract model: DsDynamicInputModel; @Output() abstract blur: EventEmitter; diff --git a/src/app/shared/form/builder/ds-dynamic-form-ui/models/form-group/dynamic-form-group.component.ts b/src/app/shared/form/builder/ds-dynamic-form-ui/models/form-group/dynamic-form-group.component.ts index 9d8d73eab5..cfd1bc293c 100644 --- a/src/app/shared/form/builder/ds-dynamic-form-ui/models/form-group/dynamic-form-group.component.ts +++ b/src/app/shared/form/builder/ds-dynamic-form-ui/models/form-group/dynamic-form-group.component.ts @@ -1,5 +1,5 @@ import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output, QueryList } from '@angular/core'; -import { FormGroup } from '@angular/forms'; +import { UntypedFormGroup } from '@angular/forms'; import { DynamicFormControlComponent, DynamicFormControlCustomEvent, @@ -22,7 +22,7 @@ export class DsDynamicFormGroupComponent extends DynamicFormControlComponent { @Input() formModel: DynamicFormControlModel[]; @Input() formLayout: DynamicFormLayout; - @Input() group: FormGroup; + @Input() group: UntypedFormGroup; @Input() layout: DynamicFormControlLayout; @Input() model: DynamicFormGroupModel; @Input() templates: QueryList | DynamicTemplateDirective[] | undefined; diff --git a/src/app/shared/form/builder/ds-dynamic-form-ui/models/list/dynamic-list.component.spec.ts b/src/app/shared/form/builder/ds-dynamic-form-ui/models/list/dynamic-list.component.spec.ts index b4a02457dc..51ce584bb1 100644 --- a/src/app/shared/form/builder/ds-dynamic-form-ui/models/list/dynamic-list.component.spec.ts +++ b/src/app/shared/form/builder/ds-dynamic-form-ui/models/list/dynamic-list.component.spec.ts @@ -1,6 +1,6 @@ // Load the implementations that should be tested import { ChangeDetectorRef, Component, CUSTOM_ELEMENTS_SCHEMA } from '@angular/core'; -import { FormGroup, FormsModule, ReactiveFormsModule } from '@angular/forms'; +import { UntypedFormGroup, FormsModule, ReactiveFormsModule } from '@angular/forms'; import { ComponentFixture, inject, TestBed, waitForAsync, } from '@angular/core/testing'; import { By } from '@angular/platform-browser'; @@ -136,9 +136,9 @@ describe('DsDynamicListComponent test suite', () => { listFixture = TestBed.createComponent(DsDynamicListComponent); listComp = listFixture.componentInstance; // FormComponent test instance - listComp.group = new FormGroup({ - listCheckbox: new FormGroup({}), - listRadio: new FormGroup({}) + listComp.group = new UntypedFormGroup({ + listCheckbox: new UntypedFormGroup({}), + listRadio: new UntypedFormGroup({}) }); listComp.model = new DynamicListCheckboxGroupModel(LIST_CHECKBOX_TEST_MODEL_CONFIG, LAYOUT_TEST); listFixture.detectChanges(); @@ -184,9 +184,9 @@ describe('DsDynamicListComponent test suite', () => { listFixture = TestBed.createComponent(DsDynamicListComponent); listComp = listFixture.componentInstance; // FormComponent test instance - listComp.group = new FormGroup({ - listCheckbox: new FormGroup({}), - listRadio: new FormGroup({}) + listComp.group = new UntypedFormGroup({ + listCheckbox: new UntypedFormGroup({}), + listRadio: new UntypedFormGroup({}) }); listComp.model = new DynamicListCheckboxGroupModel(LIST_CHECKBOX_TEST_MODEL_CONFIG, LAYOUT_TEST); modelValue = [Object.assign(new VocabularyEntry(), { authority: 1, display: 'one', value: 1 })]; @@ -224,9 +224,9 @@ describe('DsDynamicListComponent test suite', () => { listFixture = TestBed.createComponent(DsDynamicListComponent); listComp = listFixture.componentInstance; // FormComponent test instance - listComp.group = new FormGroup({ - listCheckbox: new FormGroup({}), - listRadio: new FormGroup({}) + listComp.group = new UntypedFormGroup({ + listCheckbox: new UntypedFormGroup({}), + listRadio: new UntypedFormGroup({}) }); listComp.model = new DynamicListRadioGroupModel(LIST_RADIO_TEST_MODEL_CONFIG, LAYOUT_TEST); listFixture.detectChanges(); @@ -260,9 +260,9 @@ describe('DsDynamicListComponent test suite', () => { listFixture = TestBed.createComponent(DsDynamicListComponent); listComp = listFixture.componentInstance; // FormComponent test instance - listComp.group = new FormGroup({ - listCheckbox: new FormGroup({}), - listRadio: new FormGroup({}) + listComp.group = new UntypedFormGroup({ + listCheckbox: new UntypedFormGroup({}), + listRadio: new UntypedFormGroup({}) }); listComp.model = new DynamicListRadioGroupModel(LIST_RADIO_TEST_MODEL_CONFIG, LAYOUT_TEST); modelValue = Object.assign(new VocabularyEntry(), { authority: 1, display: 'one', value: 1 }); @@ -291,9 +291,9 @@ describe('DsDynamicListComponent test suite', () => { }) class TestComponent { - group: FormGroup = new FormGroup({ - listCheckbox: new FormGroup({}), - listRadio: new FormGroup({}) + group: UntypedFormGroup = new UntypedFormGroup({ + listCheckbox: new UntypedFormGroup({}), + listRadio: new UntypedFormGroup({}) }); model = new DynamicListCheckboxGroupModel(LIST_CHECKBOX_TEST_MODEL_CONFIG, LAYOUT_TEST); diff --git a/src/app/shared/form/builder/ds-dynamic-form-ui/models/list/dynamic-list.component.ts b/src/app/shared/form/builder/ds-dynamic-form-ui/models/list/dynamic-list.component.ts index 88158f9414..aa62e5b40d 100644 --- a/src/app/shared/form/builder/ds-dynamic-form-ui/models/list/dynamic-list.component.ts +++ b/src/app/shared/form/builder/ds-dynamic-form-ui/models/list/dynamic-list.component.ts @@ -1,5 +1,5 @@ import { ChangeDetectorRef, Component, EventEmitter, Input, OnInit, Output } from '@angular/core'; -import { FormGroup, ValidatorFn, ValidationErrors, AbstractControl } from '@angular/forms'; +import { UntypedFormGroup, ValidatorFn, ValidationErrors, AbstractControl } from '@angular/forms'; import { DynamicCheckboxModel, DynamicFormControlComponent, @@ -35,7 +35,7 @@ export interface ListItem { }) export class DsDynamicListComponent extends DynamicFormControlComponent implements OnInit { - @Input() group: FormGroup; + @Input() group: UntypedFormGroup; @Input() model: any; @Output() blur: EventEmitter = new EventEmitter(); @@ -108,7 +108,7 @@ 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; + const listGroup = this.group.controls[this.model.id] as UntypedFormGroup; if (this.model.repeatable && this.model.required) { listGroup.addValidators(this.hasAtLeastOneVocabularyEntry()); } diff --git a/src/app/shared/form/builder/ds-dynamic-form-ui/models/lookup/dynamic-lookup.component.spec.ts b/src/app/shared/form/builder/ds-dynamic-form-ui/models/lookup/dynamic-lookup.component.spec.ts index 27029ff2be..2fea4fc985 100644 --- a/src/app/shared/form/builder/ds-dynamic-form-ui/models/lookup/dynamic-lookup.component.spec.ts +++ b/src/app/shared/form/builder/ds-dynamic-form-ui/models/lookup/dynamic-lookup.component.spec.ts @@ -1,6 +1,6 @@ // Load the implementations that should be tested import { ChangeDetectorRef, Component, CUSTOM_ELEMENTS_SCHEMA } from '@angular/core'; -import { FormControl, FormGroup, FormsModule, ReactiveFormsModule } from '@angular/forms'; +import { UntypedFormControl, UntypedFormGroup, FormsModule, ReactiveFormsModule } from '@angular/forms'; import { ComponentFixture, fakeAsync, inject, TestBed, tick, waitForAsync, } from '@angular/core/testing'; import { By } from '@angular/platform-browser'; @@ -71,9 +71,9 @@ let LOOKUP_NAME_TEST_MODEL_CONFIG = { hasSelectableMetadata: false }; -let LOOKUP_TEST_GROUP = new FormGroup({ - lookup: new FormControl(), - lookupName: new FormControl() +let LOOKUP_TEST_GROUP = new UntypedFormGroup({ + lookup: new UntypedFormControl(), + lookupName: new UntypedFormControl() }); describe('Dynamic Lookup component', () => { @@ -122,9 +122,9 @@ describe('Dynamic Lookup component', () => { hasSelectableMetadata: false }; - LOOKUP_TEST_GROUP = new FormGroup({ - lookup: new FormControl(), - lookupName: new FormControl() + LOOKUP_TEST_GROUP = new UntypedFormGroup({ + lookup: new UntypedFormControl(), + lookupName: new UntypedFormControl() }); } @@ -564,7 +564,7 @@ describe('Dynamic Lookup component', () => { }) class TestComponent { - group: FormGroup = LOOKUP_TEST_GROUP; + group: UntypedFormGroup = LOOKUP_TEST_GROUP; inputLookupModelConfig = LOOKUP_TEST_MODEL_CONFIG; diff --git a/src/app/shared/form/builder/ds-dynamic-form-ui/models/lookup/dynamic-lookup.component.ts b/src/app/shared/form/builder/ds-dynamic-form-ui/models/lookup/dynamic-lookup.component.ts index 3993704895..63545f45d2 100644 --- a/src/app/shared/form/builder/ds-dynamic-form-ui/models/lookup/dynamic-lookup.component.ts +++ b/src/app/shared/form/builder/ds-dynamic-form-ui/models/lookup/dynamic-lookup.component.ts @@ -1,5 +1,5 @@ import { ChangeDetectorRef, Component, EventEmitter, Input, OnDestroy, OnInit, Output } from '@angular/core'; -import { FormGroup } from '@angular/forms'; +import { UntypedFormGroup } from '@angular/forms'; import { of as observableOf, Subscription } from 'rxjs'; import { catchError, distinctUntilChanged } from 'rxjs/operators'; @@ -30,7 +30,7 @@ import { DsDynamicVocabularyComponent } from '../dynamic-vocabulary.component'; }) export class DsDynamicLookupComponent extends DsDynamicVocabularyComponent implements OnDestroy, OnInit { - @Input() group: FormGroup; + @Input() group: UntypedFormGroup; @Input() model: any; @Output() blur: EventEmitter = new EventEmitter(); diff --git a/src/app/shared/form/builder/ds-dynamic-form-ui/models/onebox/dynamic-onebox.component.spec.ts b/src/app/shared/form/builder/ds-dynamic-form-ui/models/onebox/dynamic-onebox.component.spec.ts index cf417145a7..69520aba63 100644 --- a/src/app/shared/form/builder/ds-dynamic-form-ui/models/onebox/dynamic-onebox.component.spec.ts +++ b/src/app/shared/form/builder/ds-dynamic-form-ui/models/onebox/dynamic-onebox.component.spec.ts @@ -1,7 +1,7 @@ /* eslint-disable max-classes-per-file */ // Load the implementations that should be tested import { ChangeDetectorRef, Component, CUSTOM_ELEMENTS_SCHEMA } from '@angular/core'; -import { FormControl, FormGroup, FormsModule, ReactiveFormsModule } from '@angular/forms'; +import { UntypedFormControl, UntypedFormGroup, FormsModule, ReactiveFormsModule } from '@angular/forms'; import { ComponentFixture, fakeAsync, inject, TestBed, tick, } from '@angular/core/testing'; import { By } from '@angular/platform-browser'; import { CdkTreeModule } from '@angular/cdk/tree'; @@ -47,8 +47,8 @@ export class MockNgbModalRef { } function init() { - ONEBOX_TEST_GROUP = new FormGroup({ - onebox: new FormControl(), + ONEBOX_TEST_GROUP = new UntypedFormGroup({ + onebox: new UntypedFormControl(), }); ONEBOX_TEST_MODEL_CONFIG = { @@ -457,7 +457,7 @@ describe('DsDynamicOneboxComponent test suite', () => { }) class TestComponent { - group: FormGroup = ONEBOX_TEST_GROUP; + group: UntypedFormGroup = ONEBOX_TEST_GROUP; model = new DynamicOneboxModel(ONEBOX_TEST_MODEL_CONFIG); diff --git a/src/app/shared/form/builder/ds-dynamic-form-ui/models/onebox/dynamic-onebox.component.ts b/src/app/shared/form/builder/ds-dynamic-form-ui/models/onebox/dynamic-onebox.component.ts index 008328bf73..251ff36a68 100644 --- a/src/app/shared/form/builder/ds-dynamic-form-ui/models/onebox/dynamic-onebox.component.ts +++ b/src/app/shared/form/builder/ds-dynamic-form-ui/models/onebox/dynamic-onebox.component.ts @@ -1,5 +1,5 @@ import { ChangeDetectorRef, Component, EventEmitter, Input, OnInit, Output, ViewChild } from '@angular/core'; -import { FormGroup } from '@angular/forms'; +import { UntypedFormGroup } from '@angular/forms'; import { DynamicFormLayoutService, DynamicFormValidationService } from '@ng-dynamic-forms/core'; import { @@ -44,7 +44,7 @@ import { VocabularyEntryDetail } from '../../../../../../core/submission/vocabul }) export class DsDynamicOneboxComponent extends DsDynamicVocabularyComponent implements OnInit { - @Input() group: FormGroup; + @Input() group: UntypedFormGroup; @Input() model: DynamicOneboxModel; @Output() blur: EventEmitter = new EventEmitter(); diff --git a/src/app/shared/form/builder/ds-dynamic-form-ui/models/relation-group/dynamic-relation-group.component.spec.ts b/src/app/shared/form/builder/ds-dynamic-form-ui/models/relation-group/dynamic-relation-group.component.spec.ts index 733758fd27..feca7f95c6 100644 --- a/src/app/shared/form/builder/ds-dynamic-form-ui/models/relation-group/dynamic-relation-group.component.spec.ts +++ b/src/app/shared/form/builder/ds-dynamic-form-ui/models/relation-group/dynamic-relation-group.component.spec.ts @@ -1,7 +1,7 @@ // Load the implementations that should be tested import { ChangeDetectorRef, Component, CUSTOM_ELEMENTS_SCHEMA } from '@angular/core'; import { ComponentFixture, inject, TestBed, waitForAsync, } from '@angular/core/testing'; -import { FormControl, FormGroup, FormsModule, ReactiveFormsModule } from '@angular/forms'; +import { UntypedFormControl, UntypedFormGroup, FormsModule, ReactiveFormsModule } from '@angular/forms'; import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; import { Store, StoreModule } from '@ngrx/store'; @@ -83,8 +83,8 @@ function init() { hasSelectableMetadata: false } as DynamicRelationGroupModelConfig; - FORM_GROUP_TEST_GROUP = new FormGroup({ - dc_contributor_author: new FormControl(), + FORM_GROUP_TEST_GROUP = new UntypedFormGroup({ + dc_contributor_author: new UntypedFormControl(), }); } @@ -96,9 +96,9 @@ describe('DsDynamicRelationGroupComponent test suite', () => { let groupFixture: ComponentFixture; let modelValue: any; let html; - let control1: FormControl; + let control1: UntypedFormControl; let model1: DsDynamicInputModel; - let control2: FormControl; + let control2: UntypedFormControl; let model2: DsDynamicInputModel; // waitForAsync beforeEach @@ -170,9 +170,9 @@ describe('DsDynamicRelationGroupComponent test suite', () => { groupComp.group = FORM_GROUP_TEST_GROUP; groupComp.model = new DynamicRelationGroupModel(FORM_GROUP_TEST_MODEL_CONFIG); groupFixture.detectChanges(); - control1 = service.getFormControlById('dc_contributor_author', (groupComp as any).formRef.formGroup, groupComp.formModel) as FormControl; + control1 = service.getFormControlById('dc_contributor_author', (groupComp as any).formRef.formGroup, groupComp.formModel) as UntypedFormControl; model1 = service.findById('dc_contributor_author', groupComp.formModel) as DsDynamicInputModel; - control2 = service.getFormControlById('local_contributor_affiliation', (groupComp as any).formRef.formGroup, groupComp.formModel) as FormControl; + control2 = service.getFormControlById('local_contributor_affiliation', (groupComp as any).formRef.formGroup, groupComp.formModel) as UntypedFormControl; model2 = service.findById('local_contributor_affiliation', groupComp.formModel) as DsDynamicInputModel; // spyOn(store, 'dispatch'); @@ -272,7 +272,7 @@ describe('DsDynamicRelationGroupComponent test suite', () => { groupComp.onChipSelected(0); groupFixture.detectChanges(); - control1 = service.getFormControlById('dc_contributor_author', (groupComp as any).formRef.formGroup, groupComp.formModel) as FormControl; + control1 = service.getFormControlById('dc_contributor_author', (groupComp as any).formRef.formGroup, groupComp.formModel) as UntypedFormControl; model1 = service.findById('dc_contributor_author', groupComp.formModel) as DsDynamicInputModel; control1.setValue('test author modify'); diff --git a/src/app/shared/form/builder/ds-dynamic-form-ui/models/relation-group/dynamic-relation-group.components.ts b/src/app/shared/form/builder/ds-dynamic-form-ui/models/relation-group/dynamic-relation-group.components.ts index fd111e44c2..7fdfb61b74 100644 --- a/src/app/shared/form/builder/ds-dynamic-form-ui/models/relation-group/dynamic-relation-group.components.ts +++ b/src/app/shared/form/builder/ds-dynamic-form-ui/models/relation-group/dynamic-relation-group.components.ts @@ -1,5 +1,5 @@ import { ChangeDetectorRef, Component, EventEmitter, Input, OnDestroy, OnInit, Output, ViewChild } from '@angular/core'; -import { FormGroup } from '@angular/forms'; +import { UntypedFormGroup } from '@angular/forms'; import { combineLatest, Observable, of as observableOf, Subscription } from 'rxjs'; import { filter, map, mergeMap, scan } from 'rxjs/operators'; @@ -43,7 +43,7 @@ import { VocabularyEntryDetail } from '../../../../../../core/submission/vocabul export class DsDynamicRelationGroupComponent extends DynamicFormControlComponent implements OnDestroy, OnInit { @Input() formId: string; - @Input() group: FormGroup; + @Input() group: UntypedFormGroup; @Input() model: DynamicRelationGroupModel; @Output() blur: EventEmitter = new EventEmitter(); diff --git a/src/app/shared/form/builder/ds-dynamic-form-ui/models/scrollable-dropdown/dynamic-scrollable-dropdown.component.spec.ts b/src/app/shared/form/builder/ds-dynamic-form-ui/models/scrollable-dropdown/dynamic-scrollable-dropdown.component.spec.ts index e8e971e488..0fe617e231 100644 --- a/src/app/shared/form/builder/ds-dynamic-form-ui/models/scrollable-dropdown/dynamic-scrollable-dropdown.component.spec.ts +++ b/src/app/shared/form/builder/ds-dynamic-form-ui/models/scrollable-dropdown/dynamic-scrollable-dropdown.component.spec.ts @@ -1,6 +1,6 @@ // Load the implementations that should be tested import { ChangeDetectorRef, Component, CUSTOM_ELEMENTS_SCHEMA } from '@angular/core'; -import { FormControl, FormGroup, FormsModule, ReactiveFormsModule } from '@angular/forms'; +import { UntypedFormControl, UntypedFormGroup, FormsModule, ReactiveFormsModule } from '@angular/forms'; import { ComponentFixture, fakeAsync, inject, TestBed, tick, waitForAsync, } from '@angular/core/testing'; import { By } from '@angular/platform-browser'; import { NgbModule } from '@ng-bootstrap/ng-bootstrap'; @@ -21,8 +21,8 @@ import { mockDynamicFormValidationService } from '../../../../../testing/dynamic-form-mock-services'; -export const SD_TEST_GROUP = new FormGroup({ - dropdown: new FormControl(), +export const SD_TEST_GROUP = new UntypedFormGroup({ + dropdown: new UntypedFormControl(), }); export const SD_TEST_MODEL_CONFIG = { @@ -219,7 +219,7 @@ describe('Dynamic Dynamic Scrollable Dropdown component', () => { }) class TestComponent { - group: FormGroup = SD_TEST_GROUP; + group: UntypedFormGroup = SD_TEST_GROUP; model = new DynamicScrollableDropdownModel(SD_TEST_MODEL_CONFIG); diff --git a/src/app/shared/form/builder/ds-dynamic-form-ui/models/scrollable-dropdown/dynamic-scrollable-dropdown.component.ts b/src/app/shared/form/builder/ds-dynamic-form-ui/models/scrollable-dropdown/dynamic-scrollable-dropdown.component.ts index 5e35df5ef7..43b785b21f 100644 --- a/src/app/shared/form/builder/ds-dynamic-form-ui/models/scrollable-dropdown/dynamic-scrollable-dropdown.component.ts +++ b/src/app/shared/form/builder/ds-dynamic-form-ui/models/scrollable-dropdown/dynamic-scrollable-dropdown.component.ts @@ -1,5 +1,5 @@ import { ChangeDetectorRef, Component, EventEmitter, Input, OnInit, Output } from '@angular/core'; -import { FormGroup } from '@angular/forms'; +import { UntypedFormGroup } from '@angular/forms'; import { Observable, of as observableOf } from 'rxjs'; import { catchError, distinctUntilChanged, map, tap } from 'rxjs/operators'; @@ -29,7 +29,7 @@ import { FormFieldMetadataValueObject } from '../../../models/form-field-metadat }) export class DsDynamicScrollableDropdownComponent extends DsDynamicVocabularyComponent implements OnInit { @Input() bindId = true; - @Input() group: FormGroup; + @Input() group: UntypedFormGroup; @Input() model: DynamicScrollableDropdownModel; @Output() blur: EventEmitter = new EventEmitter(); diff --git a/src/app/shared/form/builder/ds-dynamic-form-ui/models/tag/dynamic-tag.component.spec.ts b/src/app/shared/form/builder/ds-dynamic-form-ui/models/tag/dynamic-tag.component.spec.ts index 162d9c3cec..a6a4c45170 100644 --- a/src/app/shared/form/builder/ds-dynamic-form-ui/models/tag/dynamic-tag.component.spec.ts +++ b/src/app/shared/form/builder/ds-dynamic-form-ui/models/tag/dynamic-tag.component.spec.ts @@ -1,6 +1,6 @@ // Load the implementations that should be tested import { ChangeDetectorRef, Component, CUSTOM_ELEMENTS_SCHEMA } from '@angular/core'; -import { FormControl, FormGroup, FormsModule, ReactiveFormsModule } from '@angular/forms'; +import { UntypedFormControl, UntypedFormGroup, FormsModule, ReactiveFormsModule } from '@angular/forms'; import { ComponentFixture, fakeAsync, flush, inject, TestBed, waitForAsync, } from '@angular/core/testing'; import { of as observableOf } from 'rxjs'; @@ -39,8 +39,8 @@ let TAG_TEST_GROUP; let TAG_TEST_MODEL_CONFIG; function init() { - TAG_TEST_GROUP = new FormGroup({ - tag: new FormControl(), + TAG_TEST_GROUP = new UntypedFormGroup({ + tag: new UntypedFormControl(), }); TAG_TEST_MODEL_CONFIG = { @@ -291,7 +291,7 @@ describe('DsDynamicTagComponent test suite', () => { }) class TestComponent { - group: FormGroup = TAG_TEST_GROUP; + group: UntypedFormGroup = TAG_TEST_GROUP; model = new DynamicTagModel(TAG_TEST_MODEL_CONFIG); diff --git a/src/app/shared/form/builder/ds-dynamic-form-ui/models/tag/dynamic-tag.component.ts b/src/app/shared/form/builder/ds-dynamic-form-ui/models/tag/dynamic-tag.component.ts index 1c015be747..4abb68a53b 100644 --- a/src/app/shared/form/builder/ds-dynamic-form-ui/models/tag/dynamic-tag.component.ts +++ b/src/app/shared/form/builder/ds-dynamic-form-ui/models/tag/dynamic-tag.component.ts @@ -1,5 +1,5 @@ import { ChangeDetectorRef, Component, EventEmitter, Input, OnInit, Output, ViewChild } from '@angular/core'; -import { FormGroup } from '@angular/forms'; +import { UntypedFormGroup } from '@angular/forms'; import { DynamicFormLayoutService, DynamicFormValidationService } from '@ng-dynamic-forms/core'; import { Observable, of as observableOf } from 'rxjs'; @@ -32,7 +32,7 @@ import { DsDynamicVocabularyComponent } from '../dynamic-vocabulary.component'; export class DsDynamicTagComponent extends DsDynamicVocabularyComponent implements OnInit { @Input() bindId = true; - @Input() group: FormGroup; + @Input() group: UntypedFormGroup; @Input() model: DynamicTagModel; @Output() blur: EventEmitter = new EventEmitter(); diff --git a/src/app/shared/form/builder/form-builder.service.spec.ts b/src/app/shared/form/builder/form-builder.service.spec.ts index 7d1a9a3986..fd3588e73e 100644 --- a/src/app/shared/form/builder/form-builder.service.spec.ts +++ b/src/app/shared/form/builder/form-builder.service.spec.ts @@ -1,8 +1,8 @@ import { inject, TestBed } from '@angular/core/testing'; import { - FormArray, - FormControl, - FormGroup, + UntypedFormArray, + UntypedFormControl, + UntypedFormGroup, NG_ASYNC_VALIDATORS, NG_VALIDATORS, ReactiveFormsModule @@ -683,21 +683,21 @@ describe('FormBuilderService test suite', () => { const formGroup = service.createFormGroup(testModel); - expect(formGroup instanceof FormGroup).toBe(true); + expect(formGroup instanceof UntypedFormGroup).toBe(true); - expect(formGroup.get('testCheckbox') instanceof FormControl).toBe(true); - expect(formGroup.get('testCheckboxGroup') instanceof FormGroup).toBe(true); - expect(formGroup.get('testDatepicker') instanceof FormControl).toBe(true); - expect(formGroup.get('testFormArray') instanceof FormArray).toBe(true); - expect(formGroup.get('testInput') instanceof FormControl).toBe(true); - expect(formGroup.get('testRadioGroup') instanceof FormControl).toBe(true); - expect(formGroup.get('testSelect') instanceof FormControl).toBe(true); - expect(formGroup.get('testTextArea') instanceof FormControl).toBe(true); - expect(formGroup.get('testFileUpload') instanceof FormControl).toBe(true); - expect(formGroup.get('testEditor') instanceof FormControl).toBe(true); - expect(formGroup.get('testTimePicker') instanceof FormControl).toBe(true); - expect(formGroup.get('testRating') instanceof FormControl).toBe(true); - expect(formGroup.get('testColorPicker') instanceof FormControl).toBe(true); + expect(formGroup.get('testCheckbox') instanceof UntypedFormControl).toBe(true); + expect(formGroup.get('testCheckboxGroup') instanceof UntypedFormGroup).toBe(true); + expect(formGroup.get('testDatepicker') instanceof UntypedFormControl).toBe(true); + expect(formGroup.get('testFormArray') instanceof UntypedFormArray).toBe(true); + expect(formGroup.get('testInput') instanceof UntypedFormControl).toBe(true); + expect(formGroup.get('testRadioGroup') instanceof UntypedFormControl).toBe(true); + expect(formGroup.get('testSelect') instanceof UntypedFormControl).toBe(true); + expect(formGroup.get('testTextArea') instanceof UntypedFormControl).toBe(true); + expect(formGroup.get('testFileUpload') instanceof UntypedFormControl).toBe(true); + expect(formGroup.get('testEditor') instanceof UntypedFormControl).toBe(true); + expect(formGroup.get('testTimePicker') instanceof UntypedFormControl).toBe(true); + expect(formGroup.get('testRating') instanceof UntypedFormControl).toBe(true); + expect(formGroup.get('testColorPicker') instanceof UntypedFormControl).toBe(true); }); it('should throw when unknown DynamicFormControlModel id is specified in JSON', () => { @@ -720,7 +720,7 @@ describe('FormBuilderService test suite', () => { it('should add a form control to an existing form group', () => { const formGroup = service.createFormGroup(testModel); - const nestedFormGroup = formGroup.controls.testFormGroup as FormGroup; + const nestedFormGroup = formGroup.controls.testFormGroup as UntypedFormGroup; const nestedFormGroupModel = testModel[7] as DynamicFormGroupModel; const newModel1 = new DynamicInputModel({ id: 'newInput1' }); const newModel2 = new DynamicInputModel({ id: 'newInput2' }); @@ -731,14 +731,14 @@ describe('FormBuilderService test suite', () => { expect(formGroup.controls[newModel1.id]).toBeTruthy(); expect(testModel[testModel.length - 1] === newModel1).toBe(true); - expect((formGroup.controls.testFormGroup as FormGroup).controls[newModel2.id]).toBeTruthy(); + expect((formGroup.controls.testFormGroup as UntypedFormGroup).controls[newModel2.id]).toBeTruthy(); expect(nestedFormGroupModel.get(nestedFormGroupModel.group.length - 1) === newModel2).toBe(true); }); it('should insert a form control to an existing form group', () => { const formGroup = service.createFormGroup(testModel); - const nestedFormGroup = formGroup.controls.testFormGroup as FormGroup; + const nestedFormGroup = formGroup.controls.testFormGroup as UntypedFormGroup; const nestedFormGroupModel = testModel[7] as DynamicFormGroupModel; const newModel1 = new DynamicInputModel({ id: 'newInput1' }); const newModel2 = new DynamicInputModel({ id: 'newInput2' }); @@ -750,7 +750,7 @@ describe('FormBuilderService test suite', () => { expect(testModel[4] === newModel1).toBe(true); expect(service.getPath(testModel[4])).toEqual(['newInput1']); - expect((formGroup.controls.testFormGroup as FormGroup).controls[newModel2.id]).toBeTruthy(); + expect((formGroup.controls.testFormGroup as UntypedFormGroup).controls[newModel2.id]).toBeTruthy(); expect(nestedFormGroupModel.get(0) === newModel2).toBe(true); expect(service.getPath(nestedFormGroupModel.get(0))).toEqual(['testFormGroup', 'newInput2']); }); @@ -769,14 +769,14 @@ describe('FormBuilderService test suite', () => { service.moveFormGroupControl(0, 1, nestedFormGroupModel); - expect((formGroup.controls.testFormGroup as FormGroup).controls[model2.id]).toBeTruthy(); + expect((formGroup.controls.testFormGroup as UntypedFormGroup).controls[model2.id]).toBeTruthy(); expect(nestedFormGroupModel.get(1) === model2).toBe(true); }); it('should remove a form control from an existing form group', () => { const formGroup = service.createFormGroup(testModel); - const nestedFormGroup = formGroup.controls.testFormGroup as FormGroup; + const nestedFormGroup = formGroup.controls.testFormGroup as UntypedFormGroup; const nestedFormGroupModel = testModel[7] as DynamicFormGroupModel; const length = testModel.length; const size = nestedFormGroupModel.size(); @@ -810,7 +810,7 @@ describe('FormBuilderService test suite', () => { formArray = service.createFormArray(model); - expect(formArray instanceof FormArray).toBe(true); + expect(formArray instanceof UntypedFormArray).toBe(true); expect(formArray.length).toBe(model.initialCount); }); @@ -841,8 +841,8 @@ describe('FormBuilderService test suite', () => { const index = 3; const step = 1; - (formArray.at(index) as FormGroup).controls.testFormArrayGroupInput.setValue('next test value 1'); - (formArray.at(index + step) as FormGroup).controls.testFormArrayGroupInput.setValue('next test value 2'); + (formArray.at(index) as UntypedFormGroup).controls.testFormArrayGroupInput.setValue('next test value 1'); + (formArray.at(index + step) as UntypedFormGroup).controls.testFormArrayGroupInput.setValue('next test value 2'); (model.get(index).get(0) as DynamicFormValueControlModel).value = 'next test value 1'; (model.get(index + step).get(0) as DynamicFormValueControlModel).value = 'next test value 2'; @@ -851,8 +851,8 @@ describe('FormBuilderService test suite', () => { expect(formArray.length).toBe(model.initialCount); - expect((formArray.at(index) as FormGroup).controls.testFormArrayGroupInput.value).toEqual('next test value 2'); - expect((formArray.at(index + step) as FormGroup).controls.testFormArrayGroupInput.value).toEqual('next test value 1'); + expect((formArray.at(index) as UntypedFormGroup).controls.testFormArrayGroupInput.value).toEqual('next test value 2'); + expect((formArray.at(index + step) as UntypedFormGroup).controls.testFormArrayGroupInput.value).toEqual('next test value 1'); expect((model.get(index).get(0) as DynamicFormValueControlModel).value).toEqual('next test value 2'); expect((model.get(index + step).get(0) as DynamicFormValueControlModel).value).toEqual('next test value 1'); @@ -865,8 +865,8 @@ describe('FormBuilderService test suite', () => { const index = 3; const step = -1; - (formArray.at(index) as FormGroup).controls.testFormArrayGroupInput.setValue('next test value 1'); - (formArray.at(index + step) as FormGroup).controls.testFormArrayGroupInput.setValue('next test value 2'); + (formArray.at(index) as UntypedFormGroup).controls.testFormArrayGroupInput.setValue('next test value 1'); + (formArray.at(index + step) as UntypedFormGroup).controls.testFormArrayGroupInput.setValue('next test value 2'); (model.get(index).get(0) as DynamicFormValueControlModel).value = 'next test value 1'; (model.get(index + step).get(0) as DynamicFormValueControlModel).value = 'next test value 2'; @@ -875,8 +875,8 @@ describe('FormBuilderService test suite', () => { expect(formArray.length).toBe(model.initialCount); - expect((formArray.at(index) as FormGroup).controls.testFormArrayGroupInput.value).toEqual('next test value 2'); - expect((formArray.at(index + step) as FormGroup).controls.testFormArrayGroupInput.value).toEqual('next test value 1'); + expect((formArray.at(index) as UntypedFormGroup).controls.testFormArrayGroupInput.value).toEqual('next test value 2'); + expect((formArray.at(index + step) as UntypedFormGroup).controls.testFormArrayGroupInput.value).toEqual('next test value 1'); expect((model.get(index).get(0) as DynamicFormValueControlModel).value).toEqual('next test value 2'); expect((model.get(index + step).get(0) as DynamicFormValueControlModel).value).toEqual('next test value 1'); diff --git a/src/app/shared/form/builder/form-builder.service.ts b/src/app/shared/form/builder/form-builder.service.ts index b3a78d4669..cf6f38bf7b 100644 --- a/src/app/shared/form/builder/form-builder.service.ts +++ b/src/app/shared/form/builder/form-builder.service.ts @@ -1,5 +1,5 @@ import {Injectable, Optional} from '@angular/core'; -import { AbstractControl, FormControl, FormGroup } from '@angular/forms'; +import { AbstractControl, UntypedFormControl, UntypedFormGroup } from '@angular/forms'; import { DYNAMIC_FORM_CONTROL_TYPE_ARRAY, @@ -59,7 +59,7 @@ export class FormBuilderService extends DynamicFormService { /** * This map contains the active forms control groups */ - private formGroups: Map; + private formGroups: Map; /** * This is the field to use for type binding @@ -83,7 +83,7 @@ export class FormBuilderService extends DynamicFormService { } - createDynamicFormControlEvent(control: FormControl, group: FormGroup, model: DynamicFormControlModel, type: string): DynamicFormControlEvent { + createDynamicFormControlEvent(control: UntypedFormControl, group: UntypedFormGroup, model: DynamicFormControlModel, type: string): DynamicFormControlEvent { const $event = { value: (model as any).value, autoSave: false @@ -369,12 +369,12 @@ export class FormBuilderService extends DynamicFormService { return model.type === DYNAMIC_FORM_CONTROL_TYPE_INPUT; } - getFormControlById(id: string, formGroup: FormGroup, groupModel: DynamicFormControlModel[], index = 0): AbstractControl { + getFormControlById(id: string, formGroup: UntypedFormGroup, groupModel: DynamicFormControlModel[], index = 0): AbstractControl { const fieldModel = this.findById(id, groupModel, index); return isNotEmpty(fieldModel) ? formGroup.get(this.getPath(fieldModel)) : null; } - getFormControlByModel(formGroup: FormGroup, fieldModel: DynamicFormControlModel): AbstractControl { + getFormControlByModel(formGroup: UntypedFormGroup, fieldModel: DynamicFormControlModel): AbstractControl { return isNotEmpty(fieldModel) ? formGroup.get(this.getPath(fieldModel)) : null; } @@ -412,7 +412,7 @@ export class FormBuilderService extends DynamicFormService { * @param id id of model * @param formGroup FormGroup */ - addFormGroups(id: string, formGroup: FormGroup): void { + addFormGroups(id: string, formGroup: UntypedFormGroup): void { this.formGroups.set(id, formGroup); } diff --git a/src/app/shared/form/form.component.ts b/src/app/shared/form/form.component.ts index 086b5e1fd8..79cf8ad2c7 100644 --- a/src/app/shared/form/form.component.ts +++ b/src/app/shared/form/form.component.ts @@ -1,6 +1,6 @@ import { distinctUntilChanged, filter, map } from 'rxjs/operators'; import { ChangeDetectorRef, Component, EventEmitter, Input, OnDestroy, OnInit, Output } from '@angular/core'; -import { AbstractControl, FormArray, FormControl, FormGroup } from '@angular/forms'; +import { AbstractControl, UntypedFormArray, UntypedFormControl, UntypedFormGroup } from '@angular/forms'; import { Observable, Subscription } from 'rxjs'; import { @@ -68,7 +68,7 @@ export class FormComponent implements OnDestroy, OnInit { */ @Input() formModel: DynamicFormControlModel[]; @Input() parentFormModel: DynamicFormGroupModel | DynamicFormGroupModel[]; - @Input() formGroup: FormGroup; + @Input() formGroup: UntypedFormGroup; @Input() formLayout = null as DynamicFormLayout; /* eslint-disable @angular-eslint/no-output-rename */ @@ -122,9 +122,9 @@ export class FormComponent implements OnDestroy, OnInit { })); }*/ - private getFormGroup(): FormGroup { + private getFormGroup(): UntypedFormGroup { if (!!this.parentFormModel) { - return this.formGroup.parent as FormGroup; + return this.formGroup.parent as UntypedFormGroup; } return this.formGroup; @@ -184,7 +184,7 @@ export class FormComponent implements OnDestroy, OnInit { const { fieldIndex } = error; let field: AbstractControl; if (!!this.parentFormModel) { - field = this.formBuilderService.getFormControlById(fieldId, formGroup.parent as FormGroup, formModel, fieldIndex); + field = this.formBuilderService.getFormControlById(fieldId, formGroup.parent as UntypedFormGroup, formModel, fieldIndex); } else { field = this.formBuilderService.getFormControlById(fieldId, formGroup, formModel, fieldIndex); } @@ -207,7 +207,7 @@ export class FormComponent implements OnDestroy, OnInit { const { fieldIndex } = error; let field: AbstractControl; if (!!this.parentFormModel) { - field = this.formBuilderService.getFormControlById(fieldId, formGroup.parent as FormGroup, formModel, fieldIndex); + field = this.formBuilderService.getFormControlById(fieldId, formGroup.parent as UntypedFormGroup, formModel, fieldIndex); } else { field = this.formBuilderService.getFormControlById(fieldId, formGroup, formModel, fieldIndex); } @@ -254,7 +254,7 @@ export class FormComponent implements OnDestroy, OnInit { onBlur(event: DynamicFormControlEvent): void { this.blur.emit(event); - const control: FormControl = event.control; + const control: UntypedFormControl = event.control; const fieldIndex: number = (event.context && event.context.index) ? event.context.index : 0; if (control.valid) { this.formService.removeError(this.formId, event.model.name, fieldIndex); @@ -280,7 +280,7 @@ export class FormComponent implements OnDestroy, OnInit { this.change.emit(event); } - const control: FormControl = event.control; + const control: UntypedFormControl = event.control; const fieldIndex: number = (event.context && event.context.index) ? event.context.index : 0; if (control.valid) { this.formService.removeError(this.formId, event.model.id, fieldIndex); @@ -314,7 +314,7 @@ export class FormComponent implements OnDestroy, OnInit { } removeItem($event, arrayContext: DynamicFormArrayModel, index: number): void { - const formArrayControl = this.formGroup.get(this.formBuilderService.getPath(arrayContext)) as FormArray; + const formArrayControl = this.formGroup.get(this.formBuilderService.getPath(arrayContext)) as UntypedFormArray; const event = this.getEvent($event, arrayContext, index, 'remove'); if (this.formBuilderService.isQualdropGroup(event.model as DynamicFormControlModel)) { // In case of qualdrop value remove event must be dispatched before removing the control from array @@ -329,7 +329,7 @@ export class FormComponent implements OnDestroy, OnInit { } insertItem($event, arrayContext: DynamicFormArrayModel, index: number): void { - const formArrayControl = this.formGroup.get(this.formBuilderService.getPath(arrayContext)) as FormArray; + const formArrayControl = this.formGroup.get(this.formBuilderService.getPath(arrayContext)) as UntypedFormArray; this.formBuilderService.insertFormArrayGroup(index, formArrayControl, arrayContext); this.addArrayItem.emit(this.getEvent($event, arrayContext, index, 'add')); this.formService.changeForm(this.formId, this.formModel); @@ -344,17 +344,17 @@ export class FormComponent implements OnDestroy, OnInit { protected getEvent($event: any, arrayContext: DynamicFormArrayModel, index: number, type: string): DynamicFormControlEvent { const context = arrayContext.groups[index]; const itemGroupModel = context.context; - let group = this.formGroup.get(itemGroupModel.id) as FormGroup; + let group = this.formGroup.get(itemGroupModel.id) as UntypedFormGroup; if (isNull(group)) { for (const key of Object.keys(this.formGroup.controls)) { - group = this.formGroup.controls[key].get(itemGroupModel.id) as FormGroup; + group = this.formGroup.controls[key].get(itemGroupModel.id) as UntypedFormGroup; if (isNotNull(group)) { break; } } } const model = context.group[0] as DynamicFormControlModel; - const control = group.controls[index] as FormControl; + const control = group.controls[index] as UntypedFormControl; return { $event, context, control, group, model, type }; } } diff --git a/src/app/shared/form/form.service.spec.ts b/src/app/shared/form/form.service.spec.ts index e565c8f219..57880ffc14 100644 --- a/src/app/shared/form/form.service.spec.ts +++ b/src/app/shared/form/form.service.spec.ts @@ -1,6 +1,6 @@ import { Store, StoreModule } from '@ngrx/store'; import { inject, TestBed, waitForAsync } from '@angular/core/testing'; -import { AbstractControl, FormControl, FormGroup, Validators } from '@angular/forms'; +import { AbstractControl, UntypedFormControl, UntypedFormGroup, Validators } from '@angular/forms'; import { DynamicFormControlModel, DynamicFormGroupModel, DynamicInputModel } from '@ng-dynamic-forms/core'; @@ -22,7 +22,7 @@ describe('FormService test suite', () => { const formId = 'testForm'; let service: FormService; let builderService: FormBuilderService; - let formGroup: FormGroup; + let formGroup: UntypedFormGroup; const formModel: DynamicFormControlModel[] = [ new DynamicInputModel({ id: 'author', value: 'test' }), @@ -104,18 +104,18 @@ describe('FormService test suite', () => { .subscribe((state) => { state.forms = formState; }); - const author: AbstractControl = new FormControl('test'); - const title: AbstractControl = new FormControl(undefined, Validators.required); - const date: AbstractControl = new FormControl(undefined); - const description: AbstractControl = new FormControl(undefined); + const author: AbstractControl = new UntypedFormControl('test'); + const title: AbstractControl = new UntypedFormControl(undefined, Validators.required); + const date: AbstractControl = new UntypedFormControl(undefined); + const description: AbstractControl = new UntypedFormControl(undefined); - const addressLocation: FormGroup = new FormGroup({ - zipCode: new FormControl(undefined), - state: new FormControl(undefined), - city: new FormControl(undefined), + const addressLocation: UntypedFormGroup = new UntypedFormGroup({ + zipCode: new UntypedFormControl(undefined), + state: new UntypedFormControl(undefined), + city: new UntypedFormControl(undefined), }); - formGroup = new FormGroup({ author, title, date, description, addressLocation }); + formGroup = new UntypedFormGroup({ author, title, date, description, addressLocation }); controls = { author, title, date, description , addressLocation }; service = new FormService(builderService, store); }) diff --git a/src/app/shared/form/form.service.ts b/src/app/shared/form/form.service.ts index 2dbf78f565..bf316daaed 100644 --- a/src/app/shared/form/form.service.ts +++ b/src/app/shared/form/form.service.ts @@ -1,6 +1,6 @@ import { distinctUntilChanged, filter, map } from 'rxjs/operators'; import { Injectable } from '@angular/core'; -import { AbstractControl, FormArray, FormControl, FormGroup } from '@angular/forms'; +import { AbstractControl, UntypedFormArray, UntypedFormControl, UntypedFormGroup } from '@angular/forms'; import { Observable } from 'rxjs'; import { select, Store } from '@ngrx/store'; @@ -96,13 +96,13 @@ export class FormService { /** * Method to validate form's fields */ - public validateAllFormFields(formGroup: FormGroup | FormArray) { + public validateAllFormFields(formGroup: UntypedFormGroup | UntypedFormArray) { Object.keys(formGroup.controls).forEach((field) => { const control = formGroup.get(field); - if (control instanceof FormControl) { + if (control instanceof UntypedFormControl) { control.markAsTouched({ onlySelf: true }); control.markAsDirty({ onlySelf: true }); - } else if (control instanceof FormGroup || control instanceof FormArray) { + } else if (control instanceof UntypedFormGroup || control instanceof UntypedFormArray) { this.validateAllFormFields(control); } }); @@ -112,14 +112,14 @@ export class FormService { * Check if form group has an invalid form control * @param formGroup The form group to check */ - public hasValidationErrors(formGroup: FormGroup | FormArray): boolean { + public hasValidationErrors(formGroup: UntypedFormGroup | UntypedFormArray): boolean { let hasErrors = false; const fields: string[] = Object.keys(formGroup.controls); for (const field of fields) { const control = formGroup.get(field); - if (control instanceof FormControl) { + if (control instanceof UntypedFormControl) { hasErrors = !control.valid && control.touched; - } else if (control instanceof FormGroup || control instanceof FormArray) { + } else if (control instanceof UntypedFormGroup || control instanceof UntypedFormArray) { hasErrors = this.hasValidationErrors(control); } if (hasErrors) { @@ -162,7 +162,7 @@ export class FormService { } // if the field in question is a concat group, pass down the error to its fields - if (field instanceof FormGroup && model instanceof DynamicFormGroupModel && this.formBuilderService.isConcatGroup(model)) { + if (field instanceof UntypedFormGroup && model instanceof DynamicFormGroupModel && this.formBuilderService.isConcatGroup(model)) { model.group.forEach((subModel) => { const subField = field.controls[subModel.id]; @@ -183,7 +183,7 @@ export class FormService { } // if the field in question is a concat group, clear the error from its fields - if (field instanceof FormGroup && model instanceof DynamicFormGroupModel && this.formBuilderService.isConcatGroup(model)) { + if (field instanceof UntypedFormGroup && model instanceof DynamicFormGroupModel && this.formBuilderService.isConcatGroup(model)) { model.group.forEach((subModel) => { const subField = field.controls[subModel.id]; @@ -194,7 +194,7 @@ export class FormService { field.markAsUntouched(); } - public resetForm(formGroup: FormGroup, groupModel: DynamicFormControlModel[], formId: string) { + public resetForm(formGroup: UntypedFormGroup, groupModel: DynamicFormControlModel[], formId: string) { this.formBuilderService.clearAllModelsValue(groupModel); formGroup.reset(); this.store.dispatch(new FormChangeAction(formId, formGroup.value)); diff --git a/src/app/shared/form/number-picker/number-picker.component.ts b/src/app/shared/form/number-picker/number-picker.component.ts index 0df1e050cd..82240c41d1 100644 --- a/src/app/shared/form/number-picker/number-picker.component.ts +++ b/src/app/shared/form/number-picker/number-picker.component.ts @@ -1,5 +1,5 @@ import { ChangeDetectorRef, Component, EventEmitter, Input, OnInit, Output, SimpleChanges, } from '@angular/core'; -import { ControlValueAccessor, FormBuilder, NG_VALUE_ACCESSOR } from '@angular/forms'; +import { ControlValueAccessor, UntypedFormBuilder, NG_VALUE_ACCESSOR } from '@angular/forms'; import { isEmpty } from '../../empty.util'; @Component({ @@ -31,7 +31,7 @@ export class NumberPickerComponent implements OnInit, ControlValueAccessor { startValue: number; - constructor(private fb: FormBuilder, private cd: ChangeDetectorRef) { + constructor(private fb: UntypedFormBuilder, private cd: ChangeDetectorRef) { } ngOnInit() { diff --git a/src/app/shared/input-suggestions/validation-suggestions/validation-suggestions.component.ts b/src/app/shared/input-suggestions/validation-suggestions/validation-suggestions.component.ts index d845df0555..050b3296c5 100644 --- a/src/app/shared/input-suggestions/validation-suggestions/validation-suggestions.component.ts +++ b/src/app/shared/input-suggestions/validation-suggestions/validation-suggestions.component.ts @@ -1,5 +1,5 @@ import { Component, forwardRef, Input, OnInit } from '@angular/core'; -import { FormControl, FormGroup, NG_VALUE_ACCESSOR, Validators } from '@angular/forms'; +import { UntypedFormControl, UntypedFormGroup, NG_VALUE_ACCESSOR, Validators } from '@angular/forms'; import { ObjectUpdatesService } from '../../../core/data/object-updates/object-updates.service'; import { MetadatumViewModel } from '../../../core/shared/metadata.models'; import { MetadataFieldValidator } from '../../utils/metadatafield-validator.directive'; @@ -26,7 +26,7 @@ import { InputSuggestion } from '../input-suggestions.model'; */ export class ValidationSuggestionsComponent extends InputSuggestionsComponent implements OnInit { - form: FormGroup; + form: UntypedFormGroup; /** * The current url of this page @@ -52,8 +52,8 @@ export class ValidationSuggestionsComponent extends InputSuggestionsComponent im } ngOnInit() { - this.form = new FormGroup({ - metadataNameField: new FormControl(this._value, { + this.form = new UntypedFormGroup({ + metadataNameField: new UntypedFormControl(this._value, { asyncValidators: [this.metadataFieldValidator.validate.bind(this.metadataFieldValidator)], validators: [Validators.required] }) diff --git a/src/app/shared/log-in/methods/password/log-in-password.component.spec.ts b/src/app/shared/log-in/methods/password/log-in-password.component.spec.ts index 5238482770..5d9370f204 100644 --- a/src/app/shared/log-in/methods/password/log-in-password.component.spec.ts +++ b/src/app/shared/log-in/methods/password/log-in-password.component.spec.ts @@ -1,6 +1,6 @@ import { CUSTOM_ELEMENTS_SCHEMA } from '@angular/core'; import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; -import { FormGroup, FormsModule, ReactiveFormsModule } from '@angular/forms'; +import { UntypedFormGroup, FormsModule, ReactiveFormsModule } from '@angular/forms'; import { By } from '@angular/platform-browser'; import { provideMockStore } from '@ngrx/store/testing'; @@ -95,7 +95,7 @@ describe('LogInPasswordComponent', () => { it('should create a FormGroup comprised of FormControls', () => { fixture.detectChanges(); - expect(component.form instanceof FormGroup).toBe(true); + expect(component.form instanceof UntypedFormGroup).toBe(true); }); it('should authenticate', () => { diff --git a/src/app/shared/log-in/methods/password/log-in-password.component.ts b/src/app/shared/log-in/methods/password/log-in-password.component.ts index e4a92ded29..22b3b13130 100644 --- a/src/app/shared/log-in/methods/password/log-in-password.component.ts +++ b/src/app/shared/log-in/methods/password/log-in-password.component.ts @@ -1,6 +1,6 @@ import { map } from 'rxjs/operators'; import { Component, Inject, OnInit } from '@angular/core'; -import { FormBuilder, FormGroup, Validators } from '@angular/forms'; +import { UntypedFormBuilder, UntypedFormGroup, Validators } from '@angular/forms'; import { select, Store } from '@ngrx/store'; import { Observable } from 'rxjs'; @@ -63,7 +63,7 @@ export class LogInPasswordComponent implements OnInit { * The authentication form. * @type {FormGroup} */ - public form: FormGroup; + public form: UntypedFormGroup; /** * @constructor @@ -79,7 +79,7 @@ export class LogInPasswordComponent implements OnInit { @Inject('isStandalonePage') public isStandalonePage: boolean, private authService: AuthService, private hardRedirectService: HardRedirectService, - private formBuilder: FormBuilder, + private formBuilder: UntypedFormBuilder, private store: Store ) { this.authMethod = injectedAuthMethodModel; diff --git a/src/app/shared/mocks/form-builder-service.mock.ts b/src/app/shared/mocks/form-builder-service.mock.ts index f9d9dffdcb..eaaeb60829 100644 --- a/src/app/shared/mocks/form-builder-service.mock.ts +++ b/src/app/shared/mocks/form-builder-service.mock.ts @@ -1,14 +1,14 @@ import { FormBuilderService } from '../form/builder/form-builder.service'; -import { FormControl, FormGroup } from '@angular/forms'; +import { UntypedFormControl, UntypedFormGroup } from '@angular/forms'; import {DsDynamicInputModel} from '../form/builder/ds-dynamic-form-ui/models/ds-dynamic-input.model'; export function getMockFormBuilderService(): FormBuilderService { return jasmine.createSpyObj('FormBuilderService', { modelFromConfiguration: [], - createFormGroup: new FormGroup({}), + createFormGroup: new UntypedFormGroup({}), getValueFromModel: {}, - getFormControlById: new FormControl(), + getFormControlById: new UntypedFormControl(), hasMappedGroupValue: false, findById: {}, getPath: ['test', 'path'], diff --git a/src/app/shared/mydspace-actions/claimed-task/reject/claimed-task-actions-reject.component.spec.ts b/src/app/shared/mydspace-actions/claimed-task/reject/claimed-task-actions-reject.component.spec.ts index b3ea5e1258..2d369ae014 100644 --- a/src/app/shared/mydspace-actions/claimed-task/reject/claimed-task-actions-reject.component.spec.ts +++ b/src/app/shared/mydspace-actions/claimed-task/reject/claimed-task-actions-reject.component.spec.ts @@ -1,6 +1,6 @@ import { ChangeDetectionStrategy, Injector, NO_ERRORS_SCHEMA } from '@angular/core'; import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; -import { FormBuilder, FormGroup, ReactiveFormsModule } from '@angular/forms'; +import { UntypedFormBuilder, UntypedFormGroup, ReactiveFormsModule } from '@angular/forms'; import { By } from '@angular/platform-browser'; import { NgbModal, NgbModule } from '@ng-bootstrap/ng-bootstrap'; @@ -25,7 +25,7 @@ import { ClaimedDeclinedTaskSearchResult } from '../../../object-collection/shar let component: ClaimedTaskActionsRejectComponent; let fixture: ComponentFixture; -let formBuilder: FormBuilder; +let formBuilder: UntypedFormBuilder; let modalService: NgbModal; const searchService = getMockSearchService(); @@ -63,7 +63,7 @@ describe('ClaimedTaskActionsRejectComponent', () => { { provide: SearchService, useValue: searchService }, { provide: RequestService, useValue: requestService }, { provide: PoolTaskDataService, useValue: mockPoolTaskDataService }, - FormBuilder, + UntypedFormBuilder, NgbModal, ], schemas: [NO_ERRORS_SCHEMA] @@ -72,7 +72,7 @@ describe('ClaimedTaskActionsRejectComponent', () => { }).compileComponents(); fixture = TestBed.createComponent(ClaimedTaskActionsRejectComponent); component = fixture.componentInstance; - formBuilder = TestBed.inject(FormBuilder); + formBuilder = TestBed.inject(UntypedFormBuilder); modalService = TestBed.inject(NgbModal); component.object = object; component.modalRef = modalService.open('ok'); @@ -82,7 +82,7 @@ describe('ClaimedTaskActionsRejectComponent', () => { it('should init reject form properly', () => { expect(component.rejectForm).toBeDefined(); - expect(component.rejectForm instanceof FormGroup).toBeTruthy(); + expect(component.rejectForm instanceof UntypedFormGroup).toBeTruthy(); expect(component.rejectForm.controls.reason).toBeDefined(); }); diff --git a/src/app/shared/mydspace-actions/claimed-task/reject/claimed-task-actions-reject.component.ts b/src/app/shared/mydspace-actions/claimed-task/reject/claimed-task-actions-reject.component.ts index 31514613ce..7d68af1b8f 100644 --- a/src/app/shared/mydspace-actions/claimed-task/reject/claimed-task-actions-reject.component.ts +++ b/src/app/shared/mydspace-actions/claimed-task/reject/claimed-task-actions-reject.component.ts @@ -1,5 +1,5 @@ import { Component, Injector, OnInit } from '@angular/core'; -import { FormBuilder, FormGroup, Validators } from '@angular/forms'; +import { UntypedFormBuilder, UntypedFormGroup, Validators } from '@angular/forms'; import { NgbModal, NgbModalRef } from '@ng-bootstrap/ng-bootstrap'; import { ClaimedTaskActionsAbstractComponent } from '../abstract/claimed-task-actions-abstract.component'; @@ -34,7 +34,7 @@ export class ClaimedTaskActionsRejectComponent extends ClaimedTaskActionsAbstrac /** * The reject form group */ - public rejectForm: FormGroup; + public rejectForm: UntypedFormGroup; /** * Reference to NgbModal @@ -47,7 +47,7 @@ export class ClaimedTaskActionsRejectComponent extends ClaimedTaskActionsAbstrac protected translate: TranslateService, protected searchService: SearchService, protected requestService: RequestService, - private formBuilder: FormBuilder, + private formBuilder: UntypedFormBuilder, private modalService: NgbModal) { super(injector, router, notificationsService, translate, searchService, requestService); } diff --git a/src/app/shared/starts-with/starts-with-abstract.component.ts b/src/app/shared/starts-with/starts-with-abstract.component.ts index 3b35a11269..26140dcc6d 100644 --- a/src/app/shared/starts-with/starts-with-abstract.component.ts +++ b/src/app/shared/starts-with/starts-with-abstract.component.ts @@ -1,7 +1,7 @@ import { Component, Inject, OnDestroy, OnInit } from '@angular/core'; import { ActivatedRoute, Router } from '@angular/router'; import { Subscription } from 'rxjs'; -import { FormControl, FormGroup } from '@angular/forms'; +import { UntypedFormControl, UntypedFormGroup } from '@angular/forms'; import { hasValue } from '../empty.util'; import { PaginationService } from '../../core/pagination/pagination.service'; @@ -21,7 +21,7 @@ export abstract class StartsWithAbstractComponent implements OnInit, OnDestroy { /** * The formdata controlling the StartsWith input */ - formData: FormGroup; + formData: UntypedFormGroup; /** * List of subscriptions @@ -43,8 +43,8 @@ export abstract class StartsWithAbstractComponent implements OnInit, OnDestroy { } }) ); - this.formData = new FormGroup({ - startsWith: new FormControl() + this.formData = new UntypedFormGroup({ + startsWith: new UntypedFormControl() }); } diff --git a/src/app/shared/subscriptions/subscription-modal/subscription-modal.component.spec.ts b/src/app/shared/subscriptions/subscription-modal/subscription-modal.component.spec.ts index 90f2e51e63..992e0de18d 100644 --- a/src/app/shared/subscriptions/subscription-modal/subscription-modal.component.spec.ts +++ b/src/app/shared/subscriptions/subscription-modal/subscription-modal.component.spec.ts @@ -1,6 +1,6 @@ import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; import { CommonModule } from '@angular/common'; -import { FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms'; +import { UntypedFormControl, UntypedFormGroup, ReactiveFormsModule } from '@angular/forms'; import { DebugElement, NO_ERRORS_SCHEMA } from '@angular/core'; import { NgbActiveModal, NgbModalModule } from '@ng-bootstrap/ng-bootstrap'; import { TranslateLoader, TranslateModule } from '@ngx-translate/core'; @@ -120,13 +120,13 @@ describe('SubscriptionModalComponent', () => { }); it('should edit an existing subscription', () => { - component.subscriptionForm = new FormGroup({}); + component.subscriptionForm = new UntypedFormGroup({}); for (let t of testTypes) { - const formGroup = new FormGroup({ - subscriptionId: new FormControl(testSubscriptionId), - frequencies: new FormGroup({ - f: new FormControl(false), - g: new FormControl(true), + const formGroup = new UntypedFormGroup({ + subscriptionId: new UntypedFormControl(testSubscriptionId), + frequencies: new UntypedFormGroup({ + f: new UntypedFormControl(false), + g: new UntypedFormControl(true), }) }); component.subscriptionForm.addControl(t, formGroup); @@ -143,13 +143,13 @@ describe('SubscriptionModalComponent', () => { }); it('should create a new subscription', () => { - component.subscriptionForm = new FormGroup({}); + component.subscriptionForm = new UntypedFormGroup({}); for (let t of testTypes) { - const formGroup = new FormGroup({ - subscriptionId: new FormControl(undefined), - frequencies: new FormGroup({ - f: new FormControl(false), - g: new FormControl(true), + const formGroup = new UntypedFormGroup({ + subscriptionId: new UntypedFormControl(undefined), + frequencies: new UntypedFormGroup({ + f: new UntypedFormControl(false), + g: new UntypedFormControl(true), }) }); component.subscriptionForm.addControl(t, formGroup); diff --git a/src/app/shared/subscriptions/subscription-modal/subscription-modal.component.ts b/src/app/shared/subscriptions/subscription-modal/subscription-modal.component.ts index cd37a2bb02..f2fb66887f 100644 --- a/src/app/shared/subscriptions/subscription-modal/subscription-modal.component.ts +++ b/src/app/shared/subscriptions/subscription-modal/subscription-modal.component.ts @@ -1,6 +1,6 @@ import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core'; -import { FormBuilder, FormGroup, Validators } from '@angular/forms'; +import { UntypedFormBuilder, UntypedFormGroup, Validators } from '@angular/forms'; import { BehaviorSubject, combineLatest, from, shareReplay } from 'rxjs'; import { map, mergeMap, take, tap } from 'rxjs/operators'; @@ -57,7 +57,7 @@ export class SubscriptionModalComponent implements OnInit { /** * Reactive form group that will be used to add/edit subscriptions */ - subscriptionForm: FormGroup; + subscriptionForm: UntypedFormGroup; /** * Used to show validation errors when user submits @@ -84,7 +84,7 @@ export class SubscriptionModalComponent implements OnInit { @Output() updateSubscription: EventEmitter = new EventEmitter(); constructor( - private formBuilder: FormBuilder, + private formBuilder: UntypedFormBuilder, private modalService: NgbModal, private notificationsService: NotificationsService, private subscriptionService: SubscriptionsDataService, @@ -121,13 +121,13 @@ export class SubscriptionModalComponent implements OnInit { } initFormByAllSubscriptions(): void { - this.subscriptionForm = new FormGroup({}); + this.subscriptionForm = new UntypedFormGroup({}); for (let t of this.subscriptionDefaultTypes) { - const formGroup = new FormGroup({}); + const formGroup = new UntypedFormGroup({}); formGroup.addControl('subscriptionId', this.formBuilder.control('')); formGroup.addControl('frequencies', this.formBuilder.group({})); for (let f of this.frequencyDefaultValues) { - (formGroup.controls.frequencies as FormGroup).addControl(f, this.formBuilder.control(false)); + (formGroup.controls.frequencies as UntypedFormGroup).addControl(f, this.formBuilder.control(false)); } this.subscriptionForm.addControl(t, formGroup); } @@ -139,13 +139,13 @@ export class SubscriptionModalComponent implements OnInit { * If the subscription is passed start the form with the information of subscription */ initFormByGivenSubscription(): void { - const formGroup = new FormGroup({}); + const formGroup = new UntypedFormGroup({}); formGroup.addControl('subscriptionId', this.formBuilder.control(this.subscription.id)); formGroup.addControl('frequencies', this.formBuilder.group({})); - (formGroup.get('frequencies') as FormGroup).addValidators(Validators.required); + (formGroup.get('frequencies') as UntypedFormGroup).addValidators(Validators.required); for (let f of this.frequencyDefaultValues) { const value = findIndex(this.subscription.subscriptionParameterList, ['value', f]) !== -1; - (formGroup.controls.frequencies as FormGroup).addControl(f, this.formBuilder.control(value)); + (formGroup.controls.frequencies as UntypedFormGroup).addControl(f, this.formBuilder.control(value)); } this.subscriptionForm = this.formBuilder.group({ @@ -167,11 +167,11 @@ export class SubscriptionModalComponent implements OnInit { this.showDeleteInfo$.next(true); for (let subscription of res.page) { const type = subscription.subscriptionType; - const subscriptionGroup: FormGroup = this.subscriptionForm.get(type) as FormGroup; + const subscriptionGroup: UntypedFormGroup = this.subscriptionForm.get(type) as UntypedFormGroup; if (isNotEmpty(subscriptionGroup)) { subscriptionGroup.controls.subscriptionId.setValue(subscription.id); for (let parameter of subscription.subscriptionParameterList.filter((p) => p.name === 'frequency')) { - (subscriptionGroup.controls.frequencies as FormGroup).controls[parameter.value]?.setValue(true); + (subscriptionGroup.controls.frequencies as UntypedFormGroup).controls[parameter.value]?.setValue(true); } } } @@ -194,12 +194,12 @@ export class SubscriptionModalComponent implements OnInit { const subscriptionsToBeUpdated = []; subscriptionTypes.forEach((subscriptionType: string) => { - const subscriptionGroup: FormGroup = this.subscriptionForm.controls[subscriptionType] as FormGroup; + const subscriptionGroup: UntypedFormGroup = this.subscriptionForm.controls[subscriptionType] as UntypedFormGroup; if (subscriptionGroup.touched && subscriptionGroup.dirty) { const body = this.createBody( subscriptionGroup.controls.subscriptionId.value, subscriptionType, - subscriptionGroup.controls.frequencies as FormGroup + subscriptionGroup.controls.frequencies as UntypedFormGroup ); if (isNotEmpty(body.id)) { @@ -257,7 +257,7 @@ export class SubscriptionModalComponent implements OnInit { } - private createBody(subscriptionId: string, subscriptionType: string, frequencies: FormGroup): Partial { + private createBody(subscriptionId: string, subscriptionType: string, frequencies: UntypedFormGroup): Partial { const body = { id: (isNotEmpty(subscriptionId) ? subscriptionId : null), subscriptionType: subscriptionType, diff --git a/src/app/shared/testing/form-event.stub.ts b/src/app/shared/testing/form-event.stub.ts index 30436a82fc..908d0df746 100644 --- a/src/app/shared/testing/form-event.stub.ts +++ b/src/app/shared/testing/form-event.stub.ts @@ -1,4 +1,4 @@ -import { FormControl, FormGroup } from '@angular/forms'; +import { UntypedFormControl, UntypedFormGroup } from '@angular/forms'; import { DynamicCheckboxModel, DynamicSelectModel } from '@ng-dynamic-forms/core'; export const accessConditionChangeEvent = { @@ -16,7 +16,7 @@ export const accessConditionChangeEvent = { type: 'change', }, context: null, - control: new FormControl({ + control: new UntypedFormControl({ errors: null, pristine: false, status: 'VALID', @@ -26,7 +26,7 @@ export const accessConditionChangeEvent = { valueChanges: { _isScalar: false, observers: [], closed: false, isStopped: false, hasError: false }, _updateOn: 'change', }), - group: new FormGroup({}), + group: new UntypedFormGroup({}), model: new DynamicSelectModel({ additional: null, asyncValidators: null, @@ -66,7 +66,7 @@ export const checkboxChangeEvent = { type: 'change', }, context: null, - control: new FormControl({ + control: new UntypedFormControl({ errors: null, pristine: false, status: 'VALID', @@ -76,7 +76,7 @@ export const checkboxChangeEvent = { valueChanges: { _isScalar: false, observers: [], closed: false, isStopped: false, hasError: false }, _updateOn: 'change', }), - group: new FormGroup({}), + group: new UntypedFormGroup({}), model: new DynamicCheckboxModel({ additional: null, asyncValidators: null, diff --git a/src/app/shared/utils/in-list-validator.directive.ts b/src/app/shared/utils/in-list-validator.directive.ts index 42ff7da1fd..fef0c2f962 100644 --- a/src/app/shared/utils/in-list-validator.directive.ts +++ b/src/app/shared/utils/in-list-validator.directive.ts @@ -1,5 +1,5 @@ import { Directive, Input } from '@angular/core'; -import { FormControl, NG_VALIDATORS, ValidationErrors, Validator } from '@angular/forms'; +import { UntypedFormControl, NG_VALIDATORS, ValidationErrors, Validator } from '@angular/forms'; import { inListValidator } from './validator.functions'; /** @@ -23,7 +23,7 @@ export class InListValidator implements Validator { * The function that checks if the form control's value is currently valid * @param c The FormControl */ - validate(c: FormControl): ValidationErrors | null { + validate(c: UntypedFormControl): ValidationErrors | null { return inListValidator(this.dsInListValidator)(c); } } diff --git a/src/app/shared/utils/require-file.validator.ts b/src/app/shared/utils/require-file.validator.ts index 7902bfec28..ef41ad4309 100644 --- a/src/app/shared/utils/require-file.validator.ts +++ b/src/app/shared/utils/require-file.validator.ts @@ -1,5 +1,5 @@ import {Directive} from '@angular/core'; -import {NG_VALIDATORS, Validator, FormControl} from '@angular/forms'; +import {NG_VALIDATORS, Validator, UntypedFormControl} from '@angular/forms'; @Directive({ // eslint-disable-next-line @angular-eslint/directive-selector @@ -12,11 +12,11 @@ import {NG_VALIDATORS, Validator, FormControl} from '@angular/forms'; * Validator directive to validate if a file is selected */ export class FileValidator implements Validator { - static validate(c: FormControl): {[key: string]: any} { + static validate(c: UntypedFormControl): {[key: string]: any} { return c.value == null || c.value.length === 0 ? { required : true } : null; } - validate(c: FormControl): {[key: string]: any} { + validate(c: UntypedFormControl): {[key: string]: any} { return FileValidator.validate(c); } } diff --git a/src/app/submission/sections/accesses/section-accesses.component.ts b/src/app/submission/sections/accesses/section-accesses.component.ts index 25106f3ba8..451fc73670 100644 --- a/src/app/submission/sections/accesses/section-accesses.component.ts +++ b/src/app/submission/sections/accesses/section-accesses.component.ts @@ -1,6 +1,6 @@ import { SectionAccessesService } from './section-accesses.service'; import { Component, Inject, ViewChild } from '@angular/core'; -import { FormControl } from '@angular/forms'; +import { UntypedFormControl } from '@angular/forms'; import { filter, map, mergeMap, take } from 'rxjs/operators'; import { combineLatest, Observable, of, Subscription } from 'rxjs'; @@ -186,8 +186,8 @@ export class SubmissionSectionAccessesComponent extends SectionModelComponent { if (event.model.id === FORM_ACCESS_CONDITION_TYPE_CONFIG.id) { // Clear previous state when switching through different access conditions - const startDateControl: FormControl = event.control.parent.get('startDate') as FormControl; - const endDateControl: FormControl = event.control.parent.get('endDate') as FormControl; + const startDateControl: UntypedFormControl = event.control.parent.get('startDate') as UntypedFormControl; + const endDateControl: UntypedFormControl = event.control.parent.get('endDate') as UntypedFormControl; startDateControl?.markAsUntouched(); endDateControl?.markAsUntouched(); diff --git a/src/app/submission/sections/upload/file/edit/section-upload-file-edit.component.ts b/src/app/submission/sections/upload/file/edit/section-upload-file-edit.component.ts index 195d291530..83cde97bcb 100644 --- a/src/app/submission/sections/upload/file/edit/section-upload-file-edit.component.ts +++ b/src/app/submission/sections/upload/file/edit/section-upload-file-edit.component.ts @@ -1,5 +1,5 @@ import { ChangeDetectorRef, Component, OnInit, ViewChild } from '@angular/core'; -import { FormControl } from '@angular/forms'; +import { UntypedFormControl } from '@angular/forms'; import { DYNAMIC_FORM_CONTROL_TYPE_DATEPICKER, @@ -240,13 +240,13 @@ export class SubmissionSectionUploadFileEditComponent implements OnInit { * @param control * The [[FormControl]] object */ - public setOptions(model: DynamicFormControlModel, control: FormControl) { + public setOptions(model: DynamicFormControlModel, control: UntypedFormControl) { let accessCondition: AccessConditionOption = null; this.availableAccessConditionOptions.filter((element) => element.name === control.value) .forEach((element) => accessCondition = element ); if (isNotEmpty(accessCondition)) { - const startDateControl: FormControl = control.parent.get('startDate') as FormControl; - const endDateControl: FormControl = control.parent.get('endDate') as FormControl; + const startDateControl: UntypedFormControl = control.parent.get('startDate') as UntypedFormControl; + const endDateControl: UntypedFormControl = control.parent.get('endDate') as UntypedFormControl; // Clear previous state startDateControl?.markAsUntouched(); diff --git a/src/app/system-wide-alert/alert-form/system-wide-alert-form.component.ts b/src/app/system-wide-alert/alert-form/system-wide-alert-form.component.ts index 23c9fb75f9..eaff12c169 100644 --- a/src/app/system-wide-alert/alert-form/system-wide-alert-form.component.ts +++ b/src/app/system-wide-alert/alert-form/system-wide-alert-form.component.ts @@ -6,7 +6,7 @@ import { PaginatedList } from '../../core/data/paginated-list.model'; import { SystemWideAlert } from '../system-wide-alert.model'; import { hasValue, isNotEmpty } from '../../shared/empty.util'; import { BehaviorSubject, Observable } from 'rxjs'; -import { FormBuilder, FormControl, FormGroup, Validators } from '@angular/forms'; +import { UntypedFormBuilder, UntypedFormControl, UntypedFormGroup, Validators } from '@angular/forms'; import { NgbDateStruct } from '@ng-bootstrap/ng-bootstrap'; import { utcToZonedTime, zonedTimeToUtc } from 'date-fns-tz'; import { RemoteData } from '../../core/data/remote-data'; @@ -39,7 +39,7 @@ export class SystemWideAlertFormComponent implements OnInit { /** * The form group representing the system-wide alert */ - alertForm: FormGroup; + alertForm: UntypedFormGroup; /** * Date object to store the countdown date part @@ -116,11 +116,11 @@ export class SystemWideAlertFormComponent implements OnInit { * Creates the form with empty values */ createForm() { - this.alertForm = new FormBuilder().group({ - formMessage: new FormControl('', { + this.alertForm = new UntypedFormBuilder().group({ + formMessage: new UntypedFormControl('', { validators: [Validators.required], }), - formActive: new FormControl(false), + formActive: new UntypedFormControl(false), } ); this.setDateTime(new Date()); diff --git a/src/app/workflowitems-edit-page/advanced-workflow-action/advanced-workflow-action-rating/advanced-workflow-action-rating.component.ts b/src/app/workflowitems-edit-page/advanced-workflow-action/advanced-workflow-action-rating/advanced-workflow-action-rating.component.ts index 8a84801fda..ebf1ead64a 100644 --- a/src/app/workflowitems-edit-page/advanced-workflow-action/advanced-workflow-action-rating/advanced-workflow-action-rating.component.ts +++ b/src/app/workflowitems-edit-page/advanced-workflow-action/advanced-workflow-action-rating/advanced-workflow-action-rating.component.ts @@ -3,7 +3,7 @@ import { rendersAdvancedWorkflowTaskOption } from '../../../shared/mydspace-actions/claimed-task/switcher/claimed-task-actions-decorator'; import { AdvancedWorkflowActionComponent } from '../advanced-workflow-action/advanced-workflow-action.component'; -import { FormGroup, FormControl, Validators } from '@angular/forms'; +import { UntypedFormGroup, UntypedFormControl, Validators } from '@angular/forms'; import { WorkflowAction } from '../../../core/tasks/models/workflow-action-object.model'; import { RatingAdvancedWorkflowInfo } from '../../../core/tasks/models/rating-advanced-workflow-info.model'; @@ -22,13 +22,13 @@ export const ADVANCED_WORKFLOW_ACTION_RATING = 'scorereviewaction'; }) export class AdvancedWorkflowActionRatingComponent extends AdvancedWorkflowActionComponent implements OnInit { - ratingForm: FormGroup; + ratingForm: UntypedFormGroup; ngOnInit(): void { super.ngOnInit(); - this.ratingForm = new FormGroup({ - review: new FormControl(''), - rating: new FormControl(0, Validators.min(1)), + this.ratingForm = new UntypedFormGroup({ + review: new UntypedFormControl(''), + rating: new UntypedFormControl(0, Validators.min(1)), }); } diff --git a/src/app/workflowitems-edit-page/advanced-workflow-action/advanced-workflow-action-select-reviewer/reviewers-list/reviewers-list.component.ts b/src/app/workflowitems-edit-page/advanced-workflow-action/advanced-workflow-action-select-reviewer/reviewers-list/reviewers-list.component.ts index 7112a30543..460f163b70 100644 --- a/src/app/workflowitems-edit-page/advanced-workflow-action/advanced-workflow-action-select-reviewer/reviewers-list/reviewers-list.component.ts +++ b/src/app/workflowitems-edit-page/advanced-workflow-action/advanced-workflow-action-select-reviewer/reviewers-list/reviewers-list.component.ts @@ -1,5 +1,5 @@ import { Component, OnDestroy, OnInit, Input, OnChanges, SimpleChanges, EventEmitter, Output } from '@angular/core'; -import { FormBuilder } from '@angular/forms'; +import { UntypedFormBuilder } from '@angular/forms'; import { Router } from '@angular/router'; import { TranslateService } from '@ngx-translate/core'; import { EPersonDataService } from '../../../../core/eperson/eperson-data.service'; @@ -55,7 +55,7 @@ export class ReviewersListComponent extends MembersListComponent implements OnIn public ePersonDataService: EPersonDataService, translateService: TranslateService, notificationsService: NotificationsService, - formBuilder: FormBuilder, + formBuilder: UntypedFormBuilder, paginationService: PaginationService, router: Router) { super(groupService, ePersonDataService, translateService, notificationsService, formBuilder, paginationService, router); diff --git a/yarn.lock b/yarn.lock index abb5e4c4d2..00dafb2c9c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,9 +2,17 @@ # yarn lockfile v1 -"@ampproject/remapping@2.2.0", "@ampproject/remapping@^2.0.0", "@ampproject/remapping@^2.1.0": +"@ampproject/remapping@^2.1.0": + version "2.2.1" + resolved "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz" + integrity sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg== + dependencies: + "@jridgewell/gen-mapping" "^0.3.0" + "@jridgewell/trace-mapping" "^0.3.9" + +"@ampproject/remapping@2.2.0": version "2.2.0" - resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.0.tgz#56c133824780de3174aed5ab6834f3026790154d" + resolved "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz" integrity sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w== dependencies: "@jridgewell/gen-mapping" "^0.1.0" @@ -12,7 +20,7 @@ "@angular-builders/custom-webpack@~13.1.0": version "13.1.0" - resolved "https://registry.yarnpkg.com/@angular-builders/custom-webpack/-/custom-webpack-13.1.0.tgz#854f1276204a6d3d52ad9bdab45c6ac362a158c8" + resolved "https://registry.npmjs.org/@angular-builders/custom-webpack/-/custom-webpack-13.1.0.tgz" integrity sha512-qhtnAv1i7agk14zeKZZfXjrckYt37OZ+3tsTBLhf3ZFbwREK8L1SNi8xhZ1j1JLGsf2Dp0GEcZrSYeFDweo0WA== dependencies: "@angular-devkit/architect" ">=0.1300.0 < 0.1400.0" @@ -23,31 +31,31 @@ tsconfig-paths "^3.9.0" webpack-merge "^5.7.3" -"@angular-devkit/architect@0.1303.10", "@angular-devkit/architect@>=0.1300.0 < 0.1400.0", "@angular-devkit/architect@^0.1303.0": - version "0.1303.10" - resolved "https://registry.yarnpkg.com/@angular-devkit/architect/-/architect-0.1303.10.tgz#a79e749e27326151c507d36dbd3c396a0f417a63" - integrity sha512-A8blp98GY9Lg5RdgZ4M/nT0DhWsFv+YikC6+ebJsUTn/L06GcQNhyZKGCwB69S4Xe/kcYJgKpI2nAYnOLDpJlQ== - dependencies: - "@angular-devkit/core" "13.3.10" - rxjs "6.6.7" - "@angular-devkit/architect@^0.1202.10": version "0.1202.18" - resolved "https://registry.yarnpkg.com/@angular-devkit/architect/-/architect-0.1202.18.tgz#64feaf5015efb688ee9d3876bd630eca340cdf14" + resolved "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1202.18.tgz" integrity sha512-C4ASKe+xBjl91MJyHDLt3z7ICPF9FU6B0CeJ1phwrlSHK9lmFG99WGxEj/Tc82+vHyPhajqS5XJ38KyVAPBGzA== dependencies: "@angular-devkit/core" "12.2.18" rxjs "6.6.7" -"@angular-devkit/build-angular@^13.0.0", "@angular-devkit/build-angular@~13.3.10": - version "13.3.10" - resolved "https://registry.yarnpkg.com/@angular-devkit/build-angular/-/build-angular-13.3.10.tgz#746be990238f6a3af08c54104a17cfc69e90593d" - integrity sha512-eKMjwr7XHlh/lYqYvdIrHZfVPM8fCxP4isKzCDiOjsJ+4fl+Ycq8RvjtOLntBN6A1U8h93rZNE+VOTEGCJcGig== +"@angular-devkit/architect@^0.1303.0", "@angular-devkit/architect@>=0.1300.0 < 0.1400.0", "@angular-devkit/architect@0.1303.11": + version "0.1303.11" + resolved "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1303.11.tgz" + integrity sha512-JwrWomNqNGjAeKlqV2pimUFlCgFxQy+Vioz9+QAPIrUkvvjbkQ1dZKOe8Ul8eosb1N3Ln282U6qzOpHKfJ4TOg== + dependencies: + "@angular-devkit/core" "13.3.11" + rxjs "6.6.7" + +"@angular-devkit/build-angular@^13.0.0", "@angular-devkit/build-angular@^13.3.4", "@angular-devkit/build-angular@~13.3.10": + version "13.3.11" + resolved "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-13.3.11.tgz" + integrity sha512-H4tpdmRu+6HSjsL+swV/8qj8v0YSDq6lpb31EYajlBB6fDj+YJQvHgaWvexSWl6eIqgDKXcujhNUjNi1enjwHw== dependencies: "@ampproject/remapping" "2.2.0" - "@angular-devkit/architect" "0.1303.10" - "@angular-devkit/build-webpack" "0.1303.10" - "@angular-devkit/core" "13.3.10" + "@angular-devkit/architect" "0.1303.11" + "@angular-devkit/build-webpack" "0.1303.11" + "@angular-devkit/core" "13.3.11" "@babel/core" "7.16.12" "@babel/generator" "7.16.8" "@babel/helper-annotate-as-pure" "7.16.7" @@ -58,7 +66,7 @@ "@babel/runtime" "7.16.7" "@babel/template" "7.16.7" "@discoveryjs/json-ext" "0.5.6" - "@ngtools/webpack" "13.3.10" + "@ngtools/webpack" "13.3.11" ansi-colors "4.1.1" babel-loader "8.2.5" babel-plugin-istanbul "6.1.1" @@ -103,7 +111,7 @@ text-table "0.2.0" tree-kill "1.2.2" tslib "2.3.1" - webpack "5.70.0" + webpack "5.76.1" webpack-dev-middleware "5.3.0" webpack-dev-server "4.7.3" webpack-merge "5.8.0" @@ -111,17 +119,17 @@ optionalDependencies: esbuild "0.14.22" -"@angular-devkit/build-webpack@0.1303.10": - version "0.1303.10" - resolved "https://registry.yarnpkg.com/@angular-devkit/build-webpack/-/build-webpack-0.1303.10.tgz#a1e06c54f60e19982ae408d0b21822b5e299472c" - integrity sha512-nthTy6r4YQQTrvOpOS3dqjoJog/SL9Hn5YLytqnEp2r2he5evYsKV2Jtqi49/VgW1ohrGzw+bI0c3dUGKweyfw== +"@angular-devkit/build-webpack@0.1303.11": + version "0.1303.11" + resolved "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1303.11.tgz" + integrity sha512-599pWAQLq7i/fmEZLb7PaNU6nmPC3EZbJk1nU/UBcpx7FWs9e0o2XQE2PCAs0buqtQxVjSgY6kMO8ex5dUmgUQ== dependencies: - "@angular-devkit/architect" "0.1303.10" + "@angular-devkit/architect" "0.1303.11" rxjs "6.6.7" -"@angular-devkit/core@12.2.18", "@angular-devkit/core@^12.2.17": +"@angular-devkit/core@^12.2.17", "@angular-devkit/core@12.2.18": version "12.2.18" - resolved "https://registry.yarnpkg.com/@angular-devkit/core/-/core-12.2.18.tgz#6c530658b59f625388986fc73e4c4f966269725a" + resolved "https://registry.npmjs.org/@angular-devkit/core/-/core-12.2.18.tgz" integrity sha512-GDLHGe9HEY5SRS+NrKr14C8aHsRCiBFkBFSSbeohgLgcgSXzZHFoU84nDWrl3KZNP8oqcUSv5lHu6dLcf2fnww== dependencies: ajv "8.6.2" @@ -131,10 +139,10 @@ rxjs "6.6.7" source-map "0.7.3" -"@angular-devkit/core@13.3.10", "@angular-devkit/core@^13.0.0", "@angular-devkit/core@^13.3.4": - version "13.3.10" - resolved "https://registry.yarnpkg.com/@angular-devkit/core/-/core-13.3.10.tgz#08d43d8d7723fb31faadac2d2d84ccaa4d3144d2" - integrity sha512-NSjyrccES+RkVL/wt1t1jNmJOV9z5H4/DtVjJQbAt/tDE5Mo0ygnhELd/QiUmjVfzfSkhr75LqQD8NtURoGBwQ== +"@angular-devkit/core@^13.0.0", "@angular-devkit/core@^13.3.4", "@angular-devkit/core@13.3.11": + version "13.3.11" + resolved "https://registry.npmjs.org/@angular-devkit/core/-/core-13.3.11.tgz" + integrity sha512-rfqoLMRYhlz0wzKlHx7FfyIyQq8dKTsmbCoIVU1cEIH0gyTMVY7PbVzwRRcO6xp5waY+0hA+0Brriujpuhkm4w== dependencies: ajv "8.9.0" ajv-formats "2.1.1" @@ -143,21 +151,21 @@ rxjs "6.6.7" source-map "0.7.3" -"@angular-devkit/schematics@12.2.18", "@angular-devkit/schematics@^12.2.17": +"@angular-devkit/schematics@^12.2.17", "@angular-devkit/schematics@12.2.18": version "12.2.18" - resolved "https://registry.yarnpkg.com/@angular-devkit/schematics/-/schematics-12.2.18.tgz#22de79ff820ed484e6edccfac30a9f6b0562842e" + resolved "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-12.2.18.tgz" integrity sha512-bZ9NS5PgoVfetRC6WeQBHCY5FqPZ9y2TKHUo12sOB2YSL3tgWgh1oXyP8PtX34gasqsLjNULxEQsAQYEsiX/qQ== dependencies: "@angular-devkit/core" "12.2.18" ora "5.4.1" rxjs "6.6.7" -"@angular-devkit/schematics@13.3.10": - version "13.3.10" - resolved "https://registry.yarnpkg.com/@angular-devkit/schematics/-/schematics-13.3.10.tgz#d182b0da728669d11ffc0b0710bed358f008de2d" - integrity sha512-/G0xInGBfFiJJQET3nKMe8V7Ny+fcxAZsXxFuOpuH2jfKqty9JMmuJw6ll5qEP0h3NnKPsF+9J1Gvq8Bmb4uDQ== +"@angular-devkit/schematics@13.3.11": + version "13.3.11" + resolved "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-13.3.11.tgz" + integrity sha512-ben+EGXpCrClnIVAAnEQmhQdKmnnqFhMp5BqMxgOslSYBAmCutLA6rBu5vsc8kZcGian1wt+lueF7G1Uk5cGBg== dependencies: - "@angular-devkit/core" "13.3.10" + "@angular-devkit/core" "13.3.11" jsonc-parser "3.0.0" magic-string "0.25.7" ora "5.4.1" @@ -165,19 +173,19 @@ "@angular-eslint/builder@13.1.0": version "13.1.0" - resolved "https://registry.yarnpkg.com/@angular-eslint/builder/-/builder-13.1.0.tgz#5351ab74dce519e5605c0cddc84e9ff1dc014eb9" + resolved "https://registry.npmjs.org/@angular-eslint/builder/-/builder-13.1.0.tgz" integrity sha512-RdyeetctnipVdCBrU/mipJ2XKiLC1yGmK1Sfbbgwu0s49CAdOArY/b+b8OU3yyy4EO1EGKQMlzs6F3wTYgiZCA== dependencies: "@nrwl/devkit" "13.1.3" "@angular-eslint/bundled-angular-compiler@13.1.0": version "13.1.0" - resolved "https://registry.yarnpkg.com/@angular-eslint/bundled-angular-compiler/-/bundled-angular-compiler-13.1.0.tgz#5806625096441050d9b39b01d176f38d7549e9bc" + resolved "https://registry.npmjs.org/@angular-eslint/bundled-angular-compiler/-/bundled-angular-compiler-13.1.0.tgz" integrity sha512-0VSAZ3zrHkKdbvogQ4GLSf+lKojtPL3LXLlvXU9xNgNsqw68+gSNwaWd595tXoQCmpwWpTerKUbyIsGnPA7EYA== "@angular-eslint/eslint-plugin-template@13.1.0": version "13.1.0" - resolved "https://registry.yarnpkg.com/@angular-eslint/eslint-plugin-template/-/eslint-plugin-template-13.1.0.tgz#b5b8cc839c5c32d5bd55ba47bb58a80c0c4c4c42" + resolved "https://registry.npmjs.org/@angular-eslint/eslint-plugin-template/-/eslint-plugin-template-13.1.0.tgz" integrity sha512-ceZAMjufE58aduOW/UwjrbCRWocYC0zOEJ2jUkPt6jlL8yzc+SC6UitO0VmMgUsCizHueav5/3gKy05xqwk/CA== dependencies: "@angular-eslint/bundled-angular-compiler" "13.1.0" @@ -187,7 +195,7 @@ "@angular-eslint/eslint-plugin@13.1.0": version "13.1.0" - resolved "https://registry.yarnpkg.com/@angular-eslint/eslint-plugin/-/eslint-plugin-13.1.0.tgz#cb3a1d4dfff5334459c7f3b4b3a124c84673b833" + resolved "https://registry.npmjs.org/@angular-eslint/eslint-plugin/-/eslint-plugin-13.1.0.tgz" integrity sha512-WiggBWPhhpSjcYVHJiawCduCsydM/RPudUE8zxv0Nmj/APuzNgvUr6E//uYTrhNv9EIJoZutRovw7R4Y/yXj4Q== dependencies: "@angular-eslint/utils" "13.1.0" @@ -195,7 +203,7 @@ "@angular-eslint/schematics@13.1.0": version "13.1.0" - resolved "https://registry.yarnpkg.com/@angular-eslint/schematics/-/schematics-13.1.0.tgz#2d53e55db0f78460f8f79c64c42579ddbc93d8a1" + resolved "https://registry.npmjs.org/@angular-eslint/schematics/-/schematics-13.1.0.tgz" integrity sha512-/gVtkRP09cGhnUF3tr0phwNA5/ml94V3cqO8X4Z4QmyAaIwxuOJ0mJvWrVN7aurURxh9WoeWD/HXOvtC5igtpQ== dependencies: "@angular-eslint/eslint-plugin" "13.1.0" @@ -206,7 +214,7 @@ "@angular-eslint/template-parser@13.1.0": version "13.1.0" - resolved "https://registry.yarnpkg.com/@angular-eslint/template-parser/-/template-parser-13.1.0.tgz#5161dc061610212b730d929de9b3d7d365de8335" + resolved "https://registry.npmjs.org/@angular-eslint/template-parser/-/template-parser-13.1.0.tgz" integrity sha512-gKV+kms+kYm1HdToH3j4HL1RrjvMHscVkhwjoV1WbJColnfDivVAZ6/5/J92/A/8r7vJptQkftsbiaGKDyg47w== dependencies: "@angular-eslint/bundled-angular-compiler" "13.1.0" @@ -214,37 +222,37 @@ "@angular-eslint/utils@13.1.0": version "13.1.0" - resolved "https://registry.yarnpkg.com/@angular-eslint/utils/-/utils-13.1.0.tgz#3023c0c66d02a5e80dbcf5b11b1c4767f5811bd2" + resolved "https://registry.npmjs.org/@angular-eslint/utils/-/utils-13.1.0.tgz" integrity sha512-iLmYMXNk+1sFMIlYXN8/Z5UcNAOno38v10lzo4bMjCpzXKkMa0O2b+4qi+469iUJAU6RAZ5weUL+S2Wtlr0ooA== dependencies: "@angular-eslint/bundled-angular-compiler" "13.1.0" "@typescript-eslint/experimental-utils" "5.11.0" -"@angular/animations@~13.3.12": - version "13.3.12" - resolved "https://registry.yarnpkg.com/@angular/animations/-/animations-13.3.12.tgz#5fbd2f5b796ed2b801df09d1b0925721d8a75ec3" - integrity sha512-dc2JDokKJuuNxzzZa9FvuQU71kYC/e0xCLjGxEgX48sGKwajHRGBuzYFb8EmvLeA24SshYGmrxN0vGG9GhLK6g== +"@angular/animations@>=13.0.0 <14", "@angular/animations@>=5.0.0 <14.0.0", "@angular/animations@~14.3.0", "@angular/animations@14.3.0": + version "14.3.0" + resolved "https://registry.npmjs.org/@angular/animations/-/animations-14.3.0.tgz" + integrity sha512-QoBcIKy1ZiU+4qJsAh5Ls20BupWiXiZzKb0s6L9/dntPt5Msr4Ao289XR2P6O1L+kTsCprH9Kt41zyGQ/bkRqg== dependencies: tslib "^2.3.0" "@angular/cdk@^13.2.6": version "13.3.9" - resolved "https://registry.yarnpkg.com/@angular/cdk/-/cdk-13.3.9.tgz#a177196e872e29be3f84d3a50f778d361c689ff7" + resolved "https://registry.npmjs.org/@angular/cdk/-/cdk-13.3.9.tgz" integrity sha512-XCuCbeuxWFyo3EYrgEYx7eHzwl76vaWcxtWXl00ka8d+WAOtMQ6Tf1D98ybYT5uwF9889fFpXAPw98mVnlo3MA== dependencies: tslib "^2.3.0" optionalDependencies: parse5 "^5.0.0" -"@angular/cli@~13.3.10": - version "13.3.10" - resolved "https://registry.yarnpkg.com/@angular/cli/-/cli-13.3.10.tgz#a3a1baf20ffcfc58794660a05e9027afec73c84e" - integrity sha512-MssGlWSFv2d8d6b0+ml0NLYWr/X+2FzIleaoEwkYnLeCTBrH07xghVkCbSk8OnTvEmuBcUcsNiPprpLFY4cGEw== +"@angular/cli@>= 13.0.0 < 14.0.0", "@angular/cli@>=12", "@angular/cli@~13.3.10": + version "13.3.11" + resolved "https://registry.npmjs.org/@angular/cli/-/cli-13.3.11.tgz" + integrity sha512-LTuQ1wC/VJiHqHx8nYJCx0EJv1Ek7R6VvP/5vmr/+M8oVvJ2zSh/aIbcPg6BTL0YEfMI6nX41mUjPBUfF0q2OA== dependencies: - "@angular-devkit/architect" "0.1303.10" - "@angular-devkit/core" "13.3.10" - "@angular-devkit/schematics" "13.3.10" - "@schematics/angular" "13.3.10" + "@angular-devkit/architect" "0.1303.11" + "@angular-devkit/core" "13.3.11" + "@angular-devkit/schematics" "13.3.11" + "@schematics/angular" "13.3.11" "@yarnpkg/lockfile" "1.1.0" ansi-colors "4.1.1" debug "4.3.3" @@ -261,17 +269,17 @@ symbol-observable "4.0.0" uuid "8.3.2" -"@angular/common@~13.3.12": - version "13.3.12" - resolved "https://registry.yarnpkg.com/@angular/common/-/common-13.3.12.tgz#6ef3187232415e69995eb590a12ebcd44e457425" - integrity sha512-Nk4zNKfda92aFe+cucHRv2keyryR7C1ZnsurwZW9WZSobpY3z2tTT81F+yy35lGoMt5BDBAIpfh1b4j9Ue/vMg== +"@angular/common@*", "@angular/common@^11.0.0", "@angular/common@^13.0.0", "@angular/common@^13.0.0 || ^14.0.0-0", "@angular/common@^13.3.4", "@angular/common@>=10.0.0", "@angular/common@>=13.0.0 <14", "@angular/common@>=13.0.0-0", "@angular/common@>=2.x", "@angular/common@>=5.0.0", "@angular/common@>=5.0.0 <14.0.0", "@angular/common@~14.3.0", "@angular/common@14.3.0", "@angular/common@5.0.0-alpha - 5 || 6.0.0-alpha - 6 || 7.0.0-alpha - 7 || 8.0.0-alpha - 8 || 9.0.0-alpha - 9 || 10.0.0-alpha - 10 || 11.0.0-alpha - 11 || 12.0.0-alpha - 12 || 13.0.0-alpha - 13 || 14.0.0-alpha - 14": + version "14.3.0" + resolved "https://registry.npmjs.org/@angular/common/-/common-14.3.0.tgz" + integrity sha512-pV9oyG3JhGWeQ+TFB0Qub6a1VZWMNZ6/7zEopvYivdqa5yDLLDSBRWb6P80RuONXyGnM1pa7l5nYopX+r/23GQ== dependencies: tslib "^2.3.0" -"@angular/compiler-cli@~13.3.12": - version "13.3.12" - resolved "https://registry.yarnpkg.com/@angular/compiler-cli/-/compiler-cli-13.3.12.tgz#34f03dc806b63af06ab47f3fda3217e24e423560" - integrity sha512-6jrdVwexPihWlyitopc3rn2ReEkhAaMI8UWR0SOTnt3NaqNYWeio4bpeWlumgNPElDyY5rmyrmJgeaY8ICa8qA== +"@angular/compiler-cli@^13.0.0", "@angular/compiler-cli@^13.0.0 || ^13.3.0-rc.0", "@angular/compiler-cli@~14.3.0", "@angular/compiler-cli@14.3.0": + version "14.3.0" + resolved "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-14.3.0.tgz" + integrity sha512-eoKpKdQ2X6axMgzcPUMZVYl3bIlTMzMeTo5V29No4BzgiUB+QoOTYGNJZkGRyqTNpwD9uSBJvmT2vG9+eC4ghQ== dependencies: "@babel/core" "^7.17.2" chokidar "^3.0.0" @@ -284,91 +292,119 @@ tslib "^2.3.0" yargs "^17.2.1" -"@angular/compiler@~13.3.12": - version "13.3.12" - resolved "https://registry.yarnpkg.com/@angular/compiler/-/compiler-13.3.12.tgz#9fa94d116310060bcdd429c24d593b70f8a082da" - integrity sha512-F5vJYrjbNvEWoVz9J/CqiT3Iod6g9bV0dGI5EeURcW4yHXHZ12ioQpfU3+bE7qXcTlnofbdDhK8cGxGx01SzBA== +"@angular/compiler@~14.3.0", "@angular/compiler@14.3.0": + version "14.3.0" + resolved "https://registry.npmjs.org/@angular/compiler/-/compiler-14.3.0.tgz" + integrity sha512-E15Rh0t3vA+bctbKnBCaDmLvc3ix+ZBt6yFZmhZalReQ+KpOlvOJv+L9oiFEgg+rYVl2QdvN7US1fvT0PqswLw== dependencies: tslib "^2.3.0" -"@angular/core@~13.3.12": - version "13.3.12" - resolved "https://registry.yarnpkg.com/@angular/core/-/core-13.3.12.tgz#6817eec14a86a76dd6200dd6d1a89ca520968b09" - integrity sha512-jx0YC+NbPMbxGr5bXECkCEQv2RdVxR8AJNnabkPk8ZjwCpDzROrbELwwS1kunrZUhffcD15IhWGBvf1EGHAYDw== +"@angular/core@*", "@angular/core@^11.0.0", "@angular/core@^13.0.0", "@angular/core@^13.0.0 || ^14.0.0-0", "@angular/core@^13.3.4", "@angular/core@>=10.0.0", "@angular/core@>=12", "@angular/core@>=13.0.0 <14", "@angular/core@>=13.0.0-0", "@angular/core@>=2.x", "@angular/core@>=5.0.0", "@angular/core@>=5.0.0 <14.0.0", "@angular/core@~14.3.0", "@angular/core@14.3.0", "@angular/core@5.0.0-alpha - 5 || 6.0.0-alpha - 6 || 7.0.0-alpha - 7 || 8.0.0-alpha - 8 || 9.0.0-alpha - 9 || 10.0.0-alpha - 10 || 11.0.0-alpha - 11 || 12.0.0-alpha - 12 || 13.0.0-alpha - 13 || 14.0.0-alpha - 14": + version "14.3.0" + resolved "https://registry.npmjs.org/@angular/core/-/core-14.3.0.tgz" + integrity sha512-wYiwItc0Uyn4FWZ/OAx/Ubp2/WrD3EgUJ476y1XI7yATGPF8n9Ld5iCXT08HOvc4eBcYlDfh90kTXR6/MfhzdQ== dependencies: tslib "^2.3.0" -"@angular/forms@~13.3.12": - version "13.3.12" - resolved "https://registry.yarnpkg.com/@angular/forms/-/forms-13.3.12.tgz#21a4a3f5d7539d42351b9f2a7cac10463b6b7c00" - integrity sha512-auow1TKZx44ha1ia8Jwg2xp2Q7BbpShG5Ft8tewL3T44aTmJY7svWOE/m+DkZ/SXHmTFnbZFobGU5aEfe0+pNw== +"@angular/core@13.4.0": + version "13.4.0" + resolved "https://registry.npmjs.org/@angular/core/-/core-13.4.0.tgz" + integrity sha512-RE9KL7pRj+3lkJjdSR2uKmqiG0gqjnoVCMbSLG93pWrmzNIhElmlkiDaK39aMHGl836dc68Usv9CEisyVnRqHQ== dependencies: tslib "^2.3.0" -"@angular/language-service@~13.3.12": - version "13.3.12" - resolved "https://registry.yarnpkg.com/@angular/language-service/-/language-service-13.3.12.tgz#1e82c5b833d5097386e4b957248bd4ba96255cbe" - integrity sha512-h4zYAmDLxR3DfqfHgOwxuiuX1WDYpYCYwVRYKmk4Mo2AtrRyNwQmkktPgpOFDK9F3gSZ35hbXniuSZbvyy53+g== - -"@angular/localize@13.3.12": - version "13.3.12" - resolved "https://registry.yarnpkg.com/@angular/localize/-/localize-13.3.12.tgz#2350da015a2c05c6f1e891644d1d3bf7cfc6dd15" - integrity sha512-2RJhOwVMg1OqunRBjbjMfIEXxYhnHtkqOFyeZPTzxWWeHLlgNzh5wZ7A9604csuWC91DRhA2BdENv5nOs+5h5Q== +"@angular/forms@^13.0.0", "@angular/forms@>=10.0.0", "@angular/forms@>=5.0.0 <14.0.0", "@angular/forms@~14.3.0", "@angular/forms@5.0.0-alpha - 5 || 6.0.0-alpha - 6 || 7.0.0-alpha - 7 || 8.0.0-alpha - 8 || 9.0.0-alpha - 9 || 10.0.0-alpha - 10 || 11.0.0-alpha - 11 || 12.0.0-alpha - 12 || 13.0.0-alpha - 13 || 14.0.0-alpha - 14": + version "14.3.0" + resolved "https://registry.npmjs.org/@angular/forms/-/forms-14.3.0.tgz" + integrity sha512-fBZZC2UFMom2AZPjGQzROPXFWO6kvCsPDKctjJwClVC8PuMrkm+RRyiYRdBbt2qxWHEqOZM2OCQo73xUyZOYHw== dependencies: - "@babel/core" "7.17.2" - glob "7.2.0" + tslib "^2.3.0" + +"@angular/language-service@~14.3.0": + version "14.3.0" + resolved "https://registry.npmjs.org/@angular/language-service/-/language-service-14.3.0.tgz" + integrity sha512-Sij3OQzj1UGs1O8H9PxVAY/o27+oqZwQRnib66rsWvtbIBTjHp4FV3dTs5iVcr62GGv4V4Mff/2I82NP10GPQg== + +"@angular/localize@^13.0.0", "@angular/localize@^13.0.0 || ^13.3.0-rc.0", "@angular/localize@14.3.0": + version "14.3.0" + resolved "https://registry.npmjs.org/@angular/localize/-/localize-14.3.0.tgz" + integrity sha512-YmwlOEGnFonfDrIcWqlxXVFFjd0Q6yXeHGZCBFBfwbtjIseiJJ4UBmkTUgFeq7qlWevSFQzHdQnraFRGZpnMig== + dependencies: + "@babel/core" "7.18.9" + glob "8.0.3" yargs "^17.2.1" -"@angular/platform-browser-dynamic@~13.3.12": - version "13.3.12" - resolved "https://registry.yarnpkg.com/@angular/platform-browser-dynamic/-/platform-browser-dynamic-13.3.12.tgz#2c27c8eb135f643e31594752b28e134eb06e52ac" - integrity sha512-/hBggov0PxK/KNJqIu3MVc5k8f0iDbygDP8Z1k/J0FcllOSRdO4LsQd1fsCfGfwIUf0YWGyD7KraSGpBBiWlFg== +"@angular/platform-browser-dynamic@~14.3.0", "@angular/platform-browser-dynamic@14.3.0": + version "14.3.0" + resolved "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-14.3.0.tgz" + integrity sha512-rneZiMrIiYRhrkQvdL40E2ErKRn4Zdo6EtjBM9pAmWeyoM8oMnOZb9gz5vhrkNWg06kVMVg0yKqluP5How7j3A== dependencies: tslib "^2.3.0" -"@angular/platform-browser@~13.3.12": - version "13.3.12" - resolved "https://registry.yarnpkg.com/@angular/platform-browser/-/platform-browser-13.3.12.tgz#913e42f5a1cc7f691a81554345a87ae4236ee14d" - integrity sha512-sfhQqU4xjTJCjkH62TQeH5/gkay/KzvNDF95J6NHi/Q6p2dbtzZdXuLJKR/sHxtF2kc505z5v9RNm6XMSXM1KA== +"@angular/platform-browser@>=5.0.0 <14.0.0", "@angular/platform-browser@~14.3.0", "@angular/platform-browser@14.3.0", "@angular/platform-browser@5.0.0-alpha - 5 || 6.0.0-alpha - 6 || 7.0.0-alpha - 7 || 8.0.0-alpha - 8 || 9.0.0-alpha - 9 || 10.0.0-alpha - 10 || 11.0.0-alpha - 11 || 12.0.0-alpha - 12 || 13.0.0-alpha - 13 || 14.0.0-alpha - 14": + version "14.3.0" + resolved "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-14.3.0.tgz" + integrity sha512-w9Y3740UmTz44T0Egvc+4QV9sEbO61L+aRHbpkLTJdlEGzHByZvxJmJyBYmdqeyTPwc/Zpy7c02frlpfAlyB7A== dependencies: tslib "^2.3.0" -"@angular/platform-server@~13.3.12": - version "13.3.12" - resolved "https://registry.yarnpkg.com/@angular/platform-server/-/platform-server-13.3.12.tgz#6a185544d9d7ef0a4eb35806f5bcabff7a1c5f1a" - integrity sha512-a7iksZTJeAe3WDjjq73/TsCPafA/aSGDeY0a0QwTkzvLM+yGIlTloQao+BpyACJXB4k9gU5qLAzDgyWXHiGhsg== +"@angular/platform-server@^13.3.4", "@angular/platform-server@~14.3.0": + version "14.3.0" + resolved "https://registry.npmjs.org/@angular/platform-server/-/platform-server-14.3.0.tgz" + integrity sha512-JGeyS5T2bpG1wiRPFpVFU6L8OeYYe1cVDQRi1B1Wzd3hZklF0BCck0BHpYIifuhQGoUpsG7t3aDiqJW2Oj9Vaw== dependencies: domino "^2.1.2" tslib "^2.3.0" xhr2 "^0.2.0" -"@angular/router@~13.3.12": - version "13.3.12" - resolved "https://registry.yarnpkg.com/@angular/router/-/router-13.3.12.tgz#5238a910a6af7a20efcd8c3235d60eb5feaa0692" - integrity sha512-X+TAxTAlqUd2gPm6drFBGVzQsbQWM5wmZ8S5D5i+86x7Ku0v2CUFICT6AUPSl9+FTPiexlL4FdmvQV2CnGTSUw== +"@angular/router@^13.0.0", "@angular/router@~14.3.0": + version "14.3.0" + resolved "https://registry.npmjs.org/@angular/router/-/router-14.3.0.tgz" + integrity sha512-uip0V7w7k7xyxxpTPbr7EuMnYLj3FzJrwkLVJSEw3TMMGHt5VU5t4BBa9veGZOta2C205XFrTAHnp8mD+XYY1w== dependencies: tslib "^2.3.0" "@assemblyscript/loader@^0.10.1": version "0.10.1" - resolved "https://registry.yarnpkg.com/@assemblyscript/loader/-/loader-0.10.1.tgz#70e45678f06c72fa2e350e8553ec4a4d72b92e06" + resolved "https://registry.npmjs.org/@assemblyscript/loader/-/loader-0.10.1.tgz" integrity sha512-H71nDOOL8Y7kWRLqf6Sums+01Q5msqBW2KhDUTemh1tvY04eSkSXrK0uj/4mmY0Xr16/3zyZmsrxN7CKuRbNRg== -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.16.7", "@babel/code-frame@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.18.6.tgz#3b25d38c89600baa2dcc219edfa88a74eb2c427a" - integrity sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q== +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.16.7", "@babel/code-frame@^7.18.6", "@babel/code-frame@^7.21.4": + version "7.21.4" + resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.21.4.tgz" + integrity sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g== dependencies: "@babel/highlight" "^7.18.6" -"@babel/compat-data@^7.16.8", "@babel/compat-data@^7.17.7", "@babel/compat-data@^7.20.0", "@babel/compat-data@^7.20.1": - version "7.20.5" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.20.5.tgz#86f172690b093373a933223b4745deeb6049e733" - integrity sha512-KZXo2t10+/jxmkhNXc7pZTqRvSOIvVv/+lJwHS+B2rErwOyjuVRh60yVpb7liQ1U5t7lLJ1bz+t8tSypUZdm0g== +"@babel/compat-data@^7.16.8", "@babel/compat-data@^7.17.7", "@babel/compat-data@^7.20.5", "@babel/compat-data@^7.21.4": + version "7.21.4" + resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.21.4.tgz" + integrity sha512-/DYyDpeCfaVinT40FPGdkkb+lYSKvsVuMjDAG7jPOWWiM1ibOaB9CXJAlc4d1QpP/U2q2P9jbrSlClKSErd55g== + +"@babel/core@^7.0.0", "@babel/core@^7.0.0-0", "@babel/core@^7.12.0", "@babel/core@^7.12.3", "@babel/core@^7.13.0", "@babel/core@^7.17.2", "@babel/core@^7.4.0-0", "@babel/core@7.18.9": + version "7.18.9" + resolved "https://registry.npmjs.org/@babel/core/-/core-7.18.9.tgz" + integrity sha512-1LIb1eL8APMy91/IMW+31ckrfBM4yCoLaVzoDhZUKSM4cu1L1nIidyxkCgzPAgrC5WEz36IPEr/eSeSF9pIn+g== + dependencies: + "@ampproject/remapping" "^2.1.0" + "@babel/code-frame" "^7.18.6" + "@babel/generator" "^7.18.9" + "@babel/helper-compilation-targets" "^7.18.9" + "@babel/helper-module-transforms" "^7.18.9" + "@babel/helpers" "^7.18.9" + "@babel/parser" "^7.18.9" + "@babel/template" "^7.18.6" + "@babel/traverse" "^7.18.9" + "@babel/types" "^7.18.9" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.2.1" + semver "^6.3.0" "@babel/core@7.16.12": version "7.16.12" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.16.12.tgz#5edc53c1b71e54881315923ae2aedea2522bb784" + resolved "https://registry.npmjs.org/@babel/core/-/core-7.16.12.tgz" integrity sha512-dK5PtG1uiN2ikk++5OzSYsitZKny4wOCD0nrO4TqnW4BVBTQ2NGS3NgilvT/TEyxTST7LNyWV/T4tXDoD3fOgg== dependencies: "@babel/code-frame" "^7.16.7" @@ -387,122 +423,83 @@ semver "^6.3.0" source-map "^0.5.0" -"@babel/core@7.17.2": - version "7.17.2" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.17.2.tgz#2c77fc430e95139d816d39b113b31bf40fb22337" - integrity sha512-R3VH5G42VSDolRHyUO4V2cfag8WHcZyxdq5Z/m8Xyb92lW/Erm/6kM+XtRFGf3Mulre3mveni2NHfEUws8wSvw== - dependencies: - "@ampproject/remapping" "^2.0.0" - "@babel/code-frame" "^7.16.7" - "@babel/generator" "^7.17.0" - "@babel/helper-compilation-targets" "^7.16.7" - "@babel/helper-module-transforms" "^7.16.7" - "@babel/helpers" "^7.17.2" - "@babel/parser" "^7.17.0" - "@babel/template" "^7.16.7" - "@babel/traverse" "^7.17.0" - "@babel/types" "^7.17.0" - convert-source-map "^1.7.0" - debug "^4.1.0" - gensync "^1.0.0-beta.2" - json5 "^2.1.2" - semver "^6.3.0" - -"@babel/core@^7.12.3", "@babel/core@^7.17.2": - version "7.20.5" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.20.5.tgz#45e2114dc6cd4ab167f81daf7820e8fa1250d113" - integrity sha512-UdOWmk4pNWTm/4DlPUl/Pt4Gz4rcEMb7CY0Y3eJl5Yz1vI8ZJGmHWaVE55LoxRjdpx0z259GE9U5STA9atUinQ== - dependencies: - "@ampproject/remapping" "^2.1.0" - "@babel/code-frame" "^7.18.6" - "@babel/generator" "^7.20.5" - "@babel/helper-compilation-targets" "^7.20.0" - "@babel/helper-module-transforms" "^7.20.2" - "@babel/helpers" "^7.20.5" - "@babel/parser" "^7.20.5" - "@babel/template" "^7.18.10" - "@babel/traverse" "^7.20.5" - "@babel/types" "^7.20.5" - convert-source-map "^1.7.0" - debug "^4.1.0" - gensync "^1.0.0-beta.2" - json5 "^2.2.1" - semver "^6.3.0" - -"@babel/generator@7.16.8": +"@babel/generator@^7.16.8", "@babel/generator@7.16.8": version "7.16.8" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.16.8.tgz#359d44d966b8cd059d543250ce79596f792f2ebe" + resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.16.8.tgz" integrity sha512-1ojZwE9+lOXzcWdWmO6TbUzDfqLD39CmEhN8+2cX9XkDo5yW1OpgfejfliysR2AWLpMamTiOiAp/mtroaymhpw== dependencies: "@babel/types" "^7.16.8" jsesc "^2.5.1" source-map "^0.5.0" -"@babel/generator@^7.16.8", "@babel/generator@^7.17.0", "@babel/generator@^7.20.5": - version "7.20.5" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.20.5.tgz#cb25abee3178adf58d6814b68517c62bdbfdda95" - integrity sha512-jl7JY2Ykn9S0yj4DQP82sYvPU+T3g0HFcWTqDLqiuA9tGRNIj9VfbtXGAYTTkyNEnQk1jkMGOdYka8aG/lulCA== +"@babel/generator@^7.18.9", "@babel/generator@^7.21.4": + version "7.21.4" + resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.21.4.tgz" + integrity sha512-NieM3pVIYW2SwGzKoqfPrQsf4xGs9M9AIG3ThppsSRmO+m7eQhmI6amajKMUeIO37wFfsvnvcxQFx6x6iqxDnA== dependencies: - "@babel/types" "^7.20.5" + "@babel/types" "^7.21.4" "@jridgewell/gen-mapping" "^0.3.2" + "@jridgewell/trace-mapping" "^0.3.17" jsesc "^2.5.1" -"@babel/helper-annotate-as-pure@7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.7.tgz#bb2339a7534a9c128e3102024c60760a3a7f3862" - integrity sha512-s6t2w/IPQVTAET1HitoowRGXooX8mCgtuP5195wD/QJPV6wYjpujCGF7JuMODVX2ZAJOf1GT6DT9MHEZvLOFSw== - dependencies: - "@babel/types" "^7.16.7" - "@babel/helper-annotate-as-pure@^7.18.6": version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz#eaa49f6f80d5a33f9a5dd2276e6d6e451be0a6bb" + resolved "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz" integrity sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA== dependencies: "@babel/types" "^7.18.6" +"@babel/helper-annotate-as-pure@7.16.7": + version "7.16.7" + resolved "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.7.tgz" + integrity sha512-s6t2w/IPQVTAET1HitoowRGXooX8mCgtuP5195wD/QJPV6wYjpujCGF7JuMODVX2ZAJOf1GT6DT9MHEZvLOFSw== + dependencies: + "@babel/types" "^7.16.7" + "@babel/helper-builder-binary-assignment-operator-visitor@^7.18.6": version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.18.9.tgz#acd4edfd7a566d1d51ea975dff38fd52906981bb" + resolved "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.18.9.tgz" integrity sha512-yFQ0YCHoIqarl8BCRwBL8ulYUaZpz3bNsA7oFepAzee+8/+ImtADXNOmO5vJvsPff3qi+hvpkY/NYBTrBQgdNw== dependencies: "@babel/helper-explode-assignable-expression" "^7.18.6" "@babel/types" "^7.18.9" -"@babel/helper-compilation-targets@^7.16.7", "@babel/helper-compilation-targets@^7.17.7", "@babel/helper-compilation-targets@^7.18.9", "@babel/helper-compilation-targets@^7.20.0": - version "7.20.0" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.0.tgz#6bf5374d424e1b3922822f1d9bdaa43b1a139d0a" - integrity sha512-0jp//vDGp9e8hZzBc6N/KwA5ZK3Wsm/pfm4CrY7vzegkVxc65SgSn6wYOnwHe9Js9HRQ1YTCKLGPzDtaS3RoLQ== +"@babel/helper-compilation-targets@^7.16.7", "@babel/helper-compilation-targets@^7.17.7", "@babel/helper-compilation-targets@^7.18.9", "@babel/helper-compilation-targets@^7.20.7": + version "7.21.4" + resolved "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.21.4.tgz" + integrity sha512-Fa0tTuOXZ1iL8IeDFUWCzjZcn+sJGd9RZdH9esYVjEejGmzf+FFYQpMi/kZUk2kPy/q1H3/GPw7np8qar/stfg== dependencies: - "@babel/compat-data" "^7.20.0" - "@babel/helper-validator-option" "^7.18.6" + "@babel/compat-data" "^7.21.4" + "@babel/helper-validator-option" "^7.21.0" browserslist "^4.21.3" + lru-cache "^5.1.1" semver "^6.3.0" -"@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.20.5": - version "7.20.5" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.20.5.tgz#327154eedfb12e977baa4ecc72e5806720a85a06" - integrity sha512-3RCdA/EmEaikrhayahwToF0fpweU/8o2p8vhc1c/1kftHOdTKuC65kik/TLc+qfbS8JKw4qqJbne4ovICDhmww== +"@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.21.0": + version "7.21.4" + resolved "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.21.4.tgz" + integrity sha512-46QrX2CQlaFRF4TkwfTt6nJD7IHq8539cCL7SDpqWSDeJKY1xylKKY5F/33mJhLZ3mFvKv2gGrVS6NkyF6qs+Q== dependencies: "@babel/helper-annotate-as-pure" "^7.18.6" "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-function-name" "^7.19.0" - "@babel/helper-member-expression-to-functions" "^7.18.9" + "@babel/helper-function-name" "^7.21.0" + "@babel/helper-member-expression-to-functions" "^7.21.0" "@babel/helper-optimise-call-expression" "^7.18.6" - "@babel/helper-replace-supers" "^7.19.1" + "@babel/helper-replace-supers" "^7.20.7" + "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" "@babel/helper-split-export-declaration" "^7.18.6" "@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.20.5": - version "7.20.5" - resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.20.5.tgz#5ea79b59962a09ec2acf20a963a01ab4d076ccca" - integrity sha512-m68B1lkg3XDGX5yCvGO0kPx3v9WIYLnzjKfPcQiwntEQa5ZeRkPmo2X/ISJc8qxWGfwUr+kvZAeEzAwLec2r2w== + version "7.21.4" + resolved "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.21.4.tgz" + integrity sha512-M00OuhU+0GyZ5iBBN9czjugzWrEq2vDpf/zCYHxxf93ul/Q5rv+a5h+/+0WnI1AebHNVtl5bFV0qsJoH23DbfA== dependencies: "@babel/helper-annotate-as-pure" "^7.18.6" - regexpu-core "^5.2.1" + regexpu-core "^5.3.1" "@babel/helper-define-polyfill-provider@^0.3.1", "@babel/helper-define-polyfill-provider@^0.3.2", "@babel/helper-define-polyfill-provider@^0.3.3": version "0.3.3" - resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.3.tgz#8612e55be5d51f0cd1f36b4a5a83924e89884b7a" + resolved "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.3.tgz" integrity sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww== dependencies: "@babel/helper-compilation-targets" "^7.17.7" @@ -514,74 +511,74 @@ "@babel/helper-environment-visitor@^7.18.9": version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz#0c0cee9b35d2ca190478756865bb3528422f51be" + resolved "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz" integrity sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg== "@babel/helper-explode-assignable-expression@^7.18.6": version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.18.6.tgz#41f8228ef0a6f1a036b8dfdfec7ce94f9a6bc096" + resolved "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.18.6.tgz" integrity sha512-eyAYAsQmB80jNfg4baAtLeWAQHfHFiR483rzFK+BhETlGZaQC9bsfrugfXDCbRHLQbIA7U5NxhhOxN7p/dWIcg== dependencies: "@babel/types" "^7.18.6" -"@babel/helper-function-name@^7.18.9", "@babel/helper-function-name@^7.19.0": - version "7.19.0" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz#941574ed5390682e872e52d3f38ce9d1bef4648c" - integrity sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w== +"@babel/helper-function-name@^7.18.9", "@babel/helper-function-name@^7.19.0", "@babel/helper-function-name@^7.21.0": + version "7.21.0" + resolved "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz" + integrity sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg== dependencies: - "@babel/template" "^7.18.10" - "@babel/types" "^7.19.0" + "@babel/template" "^7.20.7" + "@babel/types" "^7.21.0" "@babel/helper-hoist-variables@^7.18.6": version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz#d4d2c8fb4baeaa5c68b99cc8245c56554f926678" + resolved "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz" integrity sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q== dependencies: "@babel/types" "^7.18.6" -"@babel/helper-member-expression-to-functions@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.18.9.tgz#1531661e8375af843ad37ac692c132841e2fd815" - integrity sha512-RxifAh2ZoVU67PyKIO4AMi1wTenGfMR/O/ae0CCRqwgBAt5v7xjdtRw7UoSbsreKrQn5t7r89eruK/9JjYHuDg== +"@babel/helper-member-expression-to-functions@^7.20.7", "@babel/helper-member-expression-to-functions@^7.21.0": + version "7.21.0" + resolved "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.21.0.tgz" + integrity sha512-Muu8cdZwNN6mRRNG6lAYErJ5X3bRevgYR2O8wN0yn7jJSnGDu6eG59RfT29JHxGUovyfrh6Pj0XzmR7drNVL3Q== dependencies: - "@babel/types" "^7.18.9" + "@babel/types" "^7.21.0" "@babel/helper-module-imports@^7.16.7", "@babel/helper-module-imports@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz#1e3ebdbbd08aad1437b428c50204db13c5a3ca6e" - integrity sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA== + version "7.21.4" + resolved "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.21.4.tgz" + integrity sha512-orajc5T2PsRYUN3ZryCEFeMDYwyw09c/pZeaQEZPH0MpKzSvn3e0uXsDBu3k03VI+9DBiRo+l22BfKTpKwa/Wg== dependencies: - "@babel/types" "^7.18.6" + "@babel/types" "^7.21.4" -"@babel/helper-module-transforms@^7.16.7", "@babel/helper-module-transforms@^7.18.6", "@babel/helper-module-transforms@^7.19.6", "@babel/helper-module-transforms@^7.20.2": - version "7.20.2" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.20.2.tgz#ac53da669501edd37e658602a21ba14c08748712" - integrity sha512-zvBKyJXRbmK07XhMuujYoJ48B5yvvmM6+wcpv6Ivj4Yg6qO7NOZOSnvZN9CRl1zz1Z4cKf8YejmCMh8clOoOeA== +"@babel/helper-module-transforms@^7.16.7", "@babel/helper-module-transforms@^7.18.6", "@babel/helper-module-transforms@^7.18.9", "@babel/helper-module-transforms@^7.20.11", "@babel/helper-module-transforms@^7.21.2": + version "7.21.2" + resolved "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.21.2.tgz" + integrity sha512-79yj2AR4U/Oqq/WOV7Lx6hUjau1Zfo4cI+JLAVYeMV5XIlbOhmjEk5ulbTc9fMpmlojzZHkUUxAiK+UKn+hNQQ== dependencies: "@babel/helper-environment-visitor" "^7.18.9" "@babel/helper-module-imports" "^7.18.6" "@babel/helper-simple-access" "^7.20.2" "@babel/helper-split-export-declaration" "^7.18.6" "@babel/helper-validator-identifier" "^7.19.1" - "@babel/template" "^7.18.10" - "@babel/traverse" "^7.20.1" - "@babel/types" "^7.20.2" + "@babel/template" "^7.20.7" + "@babel/traverse" "^7.21.2" + "@babel/types" "^7.21.2" "@babel/helper-optimise-call-expression@^7.18.6": version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz#9369aa943ee7da47edab2cb4e838acf09d290ffe" + resolved "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz" integrity sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA== dependencies: "@babel/types" "^7.18.6" -"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.16.7", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.18.9", "@babel/helper-plugin-utils@^7.19.0", "@babel/helper-plugin-utils@^7.20.2", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.16.7", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.18.9", "@babel/helper-plugin-utils@^7.20.2", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": version "7.20.2" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz#d1b9000752b18d0877cff85a5c376ce5c3121629" + resolved "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz" integrity sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ== -"@babel/helper-remap-async-to-generator@^7.16.8", "@babel/helper-remap-async-to-generator@^7.18.6", "@babel/helper-remap-async-to-generator@^7.18.9": +"@babel/helper-remap-async-to-generator@^7.16.8": version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.9.tgz#997458a0e3357080e54e1d79ec347f8a8cd28519" + resolved "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.9.tgz" integrity sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA== dependencies: "@babel/helper-annotate-as-pure" "^7.18.6" @@ -589,56 +586,57 @@ "@babel/helper-wrap-function" "^7.18.9" "@babel/types" "^7.18.9" -"@babel/helper-replace-supers@^7.18.6", "@babel/helper-replace-supers@^7.19.1": - version "7.19.1" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.19.1.tgz#e1592a9b4b368aa6bdb8784a711e0bcbf0612b78" - integrity sha512-T7ahH7wV0Hfs46SFh5Jz3s0B6+o8g3c+7TMxu7xKfmHikg7EAZ3I2Qk9LFhjxXq8sL7UkP5JflezNwoZa8WvWw== +"@babel/helper-replace-supers@^7.18.6", "@babel/helper-replace-supers@^7.20.7": + version "7.20.7" + resolved "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.20.7.tgz" + integrity sha512-vujDMtB6LVfNW13jhlCrp48QNslK6JXi7lQG736HVbHz/mbf4Dc7tIRh1Xf5C0rF7BP8iiSxGMCmY6Ci1ven3A== dependencies: "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-member-expression-to-functions" "^7.18.9" + "@babel/helper-member-expression-to-functions" "^7.20.7" "@babel/helper-optimise-call-expression" "^7.18.6" - "@babel/traverse" "^7.19.1" - "@babel/types" "^7.19.0" + "@babel/template" "^7.20.7" + "@babel/traverse" "^7.20.7" + "@babel/types" "^7.20.7" -"@babel/helper-simple-access@^7.19.4", "@babel/helper-simple-access@^7.20.2": +"@babel/helper-simple-access@^7.20.2": version "7.20.2" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz#0ab452687fe0c2cfb1e2b9e0015de07fc2d62dd9" + resolved "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz" integrity sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA== dependencies: "@babel/types" "^7.20.2" -"@babel/helper-skip-transparent-expression-wrappers@^7.18.9": +"@babel/helper-skip-transparent-expression-wrappers@^7.20.0": version "7.20.0" - resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.20.0.tgz#fbe4c52f60518cab8140d77101f0e63a8a230684" + resolved "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.20.0.tgz" integrity sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg== dependencies: "@babel/types" "^7.20.0" "@babel/helper-split-export-declaration@^7.18.6": version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz#7367949bc75b20c6d5a5d4a97bba2824ae8ef075" + resolved "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz" integrity sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA== dependencies: "@babel/types" "^7.18.6" "@babel/helper-string-parser@^7.19.4": version "7.19.4" - resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz#38d3acb654b4701a9b77fb0615a96f775c3a9e63" + resolved "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz" integrity sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw== "@babel/helper-validator-identifier@^7.18.6", "@babel/helper-validator-identifier@^7.19.1": version "7.19.1" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz#7eea834cf32901ffdc1a7ee555e2f9c27e249ca2" + resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz" integrity sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w== -"@babel/helper-validator-option@^7.16.7", "@babel/helper-validator-option@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz#bf0d2b5a509b1f336099e4ff36e1a63aa5db4db8" - integrity sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw== +"@babel/helper-validator-option@^7.16.7", "@babel/helper-validator-option@^7.21.0": + version "7.21.0" + resolved "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.21.0.tgz" + integrity sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ== "@babel/helper-wrap-function@^7.18.9": version "7.20.5" - resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.20.5.tgz#75e2d84d499a0ab3b31c33bcfe59d6b8a45f62e3" + resolved "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.20.5.tgz" integrity sha512-bYMxIWK5mh+TgXGVqAtnu5Yn1un+v8DDZtqyzKRLUzrh70Eal2O3aZ7aPYiMADO4uKlkzOiRiZ6GX5q3qxvW9Q== dependencies: "@babel/helper-function-name" "^7.19.0" @@ -646,84 +644,74 @@ "@babel/traverse" "^7.20.5" "@babel/types" "^7.20.5" -"@babel/helpers@^7.16.7", "@babel/helpers@^7.17.2", "@babel/helpers@^7.20.5": - version "7.20.6" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.20.6.tgz#e64778046b70e04779dfbdf924e7ebb45992c763" - integrity sha512-Pf/OjgfgFRW5bApskEz5pvidpim7tEDPlFtKcNRXWmfHGn9IEI2W2flqRQXTFb7gIPTyK++N6rVHuwKut4XK6w== +"@babel/helpers@^7.16.7", "@babel/helpers@^7.18.9": + version "7.21.0" + resolved "https://registry.npmjs.org/@babel/helpers/-/helpers-7.21.0.tgz" + integrity sha512-XXve0CBtOW0pd7MRzzmoyuSj0e3SEzj8pgyFxnTT1NJZL38BD1MK7yYrm8yefRPIDvNNe14xR4FdbHwpInD4rA== dependencies: - "@babel/template" "^7.18.10" - "@babel/traverse" "^7.20.5" - "@babel/types" "^7.20.5" + "@babel/template" "^7.20.7" + "@babel/traverse" "^7.21.0" + "@babel/types" "^7.21.0" "@babel/highlight@^7.18.6": version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.18.6.tgz#81158601e93e2563795adcbfbdf5d64be3f2ecdf" + resolved "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz" integrity sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g== dependencies: "@babel/helper-validator-identifier" "^7.18.6" chalk "^2.0.0" js-tokens "^4.0.0" -"@babel/parser@^7.10.3", "@babel/parser@^7.14.7", "@babel/parser@^7.16.12", "@babel/parser@^7.16.7", "@babel/parser@^7.17.0", "@babel/parser@^7.18.10", "@babel/parser@^7.20.5": - version "7.20.5" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.20.5.tgz#7f3c7335fe417665d929f34ae5dceae4c04015e8" - integrity sha512-r27t/cy/m9uKLXQNWWebeCUHgnAZq0CpG1OwKRxzJMP1vpSU4bSIK2hq+/cp0bQxetkXx38n09rNu8jVkcK/zA== +"@babel/parser@^7.10.3", "@babel/parser@^7.14.7", "@babel/parser@^7.16.12", "@babel/parser@^7.16.7", "@babel/parser@^7.18.9", "@babel/parser@^7.20.7", "@babel/parser@^7.21.4": + version "7.21.4" + resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.21.4.tgz" + integrity sha512-alVJj7k7zIxqBZ7BTRhz0IqJFxW1VJbm6N8JbcYhQ186df9ZBPbZBmWSqAMXwHGsCJdYks7z/voa3ibiS5bCIw== "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.16.7": version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.18.6.tgz#da5b8f9a580acdfbe53494dba45ea389fb09a4d2" + resolved "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.18.6.tgz" integrity sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ== dependencies: "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.16.7": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.18.9.tgz#a11af19aa373d68d561f08e0a57242350ed0ec50" - integrity sha512-AHrP9jadvH7qlOj6PINbgSuphjQUAK7AOT7DPjBo9EHoLhQTnnK5u45e1Hd4DbSQEO9nqPWtQ89r+XEOWFScKg== + version "7.20.7" + resolved "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.20.7.tgz" + integrity sha512-sbr9+wNE5aXMBBFBICk01tt7sBf2Oc9ikRFEcem/ZORup9IMUdNhW7/wVLEbbtlWOsEubJet46mHAL2C8+2jKQ== dependencies: - "@babel/helper-plugin-utils" "^7.18.9" - "@babel/helper-skip-transparent-expression-wrappers" "^7.18.9" - "@babel/plugin-proposal-optional-chaining" "^7.18.9" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" + "@babel/plugin-proposal-optional-chaining" "^7.20.7" -"@babel/plugin-proposal-async-generator-functions@7.16.8": +"@babel/plugin-proposal-async-generator-functions@^7.16.8", "@babel/plugin-proposal-async-generator-functions@7.16.8": version "7.16.8" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.16.8.tgz#3bdd1ebbe620804ea9416706cd67d60787504bc8" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.16.8.tgz" integrity sha512-71YHIvMuiuqWJQkebWJtdhQTfd4Q4mF76q2IX37uZPkG9+olBxsX+rH1vkhFto4UeJZ9dPY2s+mDvhDm1u2BGQ== dependencies: "@babel/helper-plugin-utils" "^7.16.7" "@babel/helper-remap-async-to-generator" "^7.16.8" "@babel/plugin-syntax-async-generators" "^7.8.4" -"@babel/plugin-proposal-async-generator-functions@^7.16.8": - version "7.20.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.1.tgz#352f02baa5d69f4e7529bdac39aaa02d41146af9" - integrity sha512-Gh5rchzSwE4kC+o/6T8waD0WHEQIsDmjltY8WnWRXHUdH8axZhuH86Ov9M72YhJfDrZseQwuuWaaIT/TmePp3g== - dependencies: - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-plugin-utils" "^7.19.0" - "@babel/helper-remap-async-to-generator" "^7.18.9" - "@babel/plugin-syntax-async-generators" "^7.8.4" - "@babel/plugin-proposal-class-properties@^7.16.7": version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz#b110f59741895f7ec21a6fff696ec46265c446a3" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz" integrity sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ== dependencies: "@babel/helper-create-class-features-plugin" "^7.18.6" "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-proposal-class-static-block@^7.16.7": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.18.6.tgz#8aa81d403ab72d3962fc06c26e222dacfc9b9020" - integrity sha512-+I3oIiNxrCpup3Gi8n5IGMwj0gOCAjcJUSQEcotNnCCPMEnixawOQ+KeJPlgfjzx+FKQ1QSyZOWe7wmoJp7vhw== + version "7.21.0" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.21.0.tgz" + integrity sha512-XP5G9MWNUskFuP30IfFSEFB0Z6HzLIUcjYM4bYOPHXl7eiJ9HFv8tWj6TXTN5QODiEhDZAeI4hLok2iHFFV4hw== dependencies: - "@babel/helper-create-class-features-plugin" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-create-class-features-plugin" "^7.21.0" + "@babel/helper-plugin-utils" "^7.20.2" "@babel/plugin-syntax-class-static-block" "^7.14.5" "@babel/plugin-proposal-dynamic-import@^7.16.7": version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.18.6.tgz#72bcf8d408799f547d759298c3c27c7e7faa4d94" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.18.6.tgz" integrity sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw== dependencies: "@babel/helper-plugin-utils" "^7.18.6" @@ -731,7 +719,7 @@ "@babel/plugin-proposal-export-namespace-from@^7.16.7": version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.9.tgz#5f7313ab348cdb19d590145f9247540e94761203" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.9.tgz" integrity sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA== dependencies: "@babel/helper-plugin-utils" "^7.18.9" @@ -739,23 +727,23 @@ "@babel/plugin-proposal-json-strings@^7.16.7": version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.18.6.tgz#7e8788c1811c393aff762817e7dbf1ebd0c05f0b" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.18.6.tgz" integrity sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ== dependencies: "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-syntax-json-strings" "^7.8.3" "@babel/plugin-proposal-logical-assignment-operators@^7.16.7": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.18.9.tgz#8148cbb350483bf6220af06fa6db3690e14b2e23" - integrity sha512-128YbMpjCrP35IOExw2Fq+x55LMP42DzhOhX2aNNIdI9avSWl2PI0yuBWarr3RYpZBSPtabfadkH2yeRiMD61Q== + version "7.20.7" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.20.7.tgz" + integrity sha512-y7C7cZgpMIjWlKE5T7eJwp+tnRYM89HmRvWM5EQuB5BoHEONjmQ8lSNmBUwOyy/GFRsohJED51YBF79hE1djug== dependencies: - "@babel/helper-plugin-utils" "^7.18.9" + "@babel/helper-plugin-utils" "^7.20.2" "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" "@babel/plugin-proposal-nullish-coalescing-operator@^7.16.7": version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz#fdd940a99a740e577d6c753ab6fbb43fdb9467e1" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz" integrity sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA== dependencies: "@babel/helper-plugin-utils" "^7.18.6" @@ -763,61 +751,61 @@ "@babel/plugin-proposal-numeric-separator@^7.16.7": version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz#899b14fbafe87f053d2c5ff05b36029c62e13c75" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz" integrity sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q== dependencies: "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-syntax-numeric-separator" "^7.10.4" "@babel/plugin-proposal-object-rest-spread@^7.16.7": - version "7.20.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.2.tgz#a556f59d555f06961df1e572bb5eca864c84022d" - integrity sha512-Ks6uej9WFK+fvIMesSqbAto5dD8Dz4VuuFvGJFKgIGSkJuRGcrwGECPA1fDgQK3/DbExBJpEkTeYeB8geIFCSQ== + version "7.20.7" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz" + integrity sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg== dependencies: - "@babel/compat-data" "^7.20.1" - "@babel/helper-compilation-targets" "^7.20.0" + "@babel/compat-data" "^7.20.5" + "@babel/helper-compilation-targets" "^7.20.7" "@babel/helper-plugin-utils" "^7.20.2" "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-transform-parameters" "^7.20.1" + "@babel/plugin-transform-parameters" "^7.20.7" "@babel/plugin-proposal-optional-catch-binding@^7.16.7": version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz#f9400d0e6a3ea93ba9ef70b09e72dd6da638a2cb" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz" integrity sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw== dependencies: "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" -"@babel/plugin-proposal-optional-chaining@^7.16.7", "@babel/plugin-proposal-optional-chaining@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.18.9.tgz#e8e8fe0723f2563960e4bf5e9690933691915993" - integrity sha512-v5nwt4IqBXihxGsW2QmCWMDS3B3bzGIk/EQVZz2ei7f3NJl8NzAJVvUmpDW5q1CRNY+Beb/k58UAH1Km1N411w== +"@babel/plugin-proposal-optional-chaining@^7.16.7", "@babel/plugin-proposal-optional-chaining@^7.20.7": + version "7.21.0" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.21.0.tgz" + integrity sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA== dependencies: - "@babel/helper-plugin-utils" "^7.18.9" - "@babel/helper-skip-transparent-expression-wrappers" "^7.18.9" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" "@babel/plugin-syntax-optional-chaining" "^7.8.3" "@babel/plugin-proposal-private-methods@^7.16.11": version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz#5209de7d213457548a98436fa2882f52f4be6bea" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz" integrity sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA== dependencies: "@babel/helper-create-class-features-plugin" "^7.18.6" "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-proposal-private-property-in-object@^7.16.7": - version "7.20.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.20.5.tgz#309c7668f2263f1c711aa399b5a9a6291eef6135" - integrity sha512-Vq7b9dUA12ByzB4EjQTPo25sFhY+08pQDBSZRtUAkj7lb7jahaHR5igera16QZ+3my1nYR4dKsNdYj5IjPHilQ== + version "7.21.0" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0.tgz" + integrity sha512-ha4zfehbJjc5MmXBlHec1igel5TJXXLDDRbuJ4+XT2TJcyD9/V1919BA8gMvsdHcNMBy4WBUBiRb3nw/EQUtBw== dependencies: "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-create-class-features-plugin" "^7.20.5" + "@babel/helper-create-class-features-plugin" "^7.21.0" "@babel/helper-plugin-utils" "^7.20.2" "@babel/plugin-syntax-private-property-in-object" "^7.14.5" "@babel/plugin-proposal-unicode-property-regex@^7.16.7", "@babel/plugin-proposal-unicode-property-regex@^7.4.4": version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz#af613d2cd5e643643b65cded64207b15c85cb78e" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz" integrity sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w== dependencies: "@babel/helper-create-regexp-features-plugin" "^7.18.6" @@ -825,173 +813,165 @@ "@babel/plugin-syntax-async-generators@^7.8.4": version "7.8.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz" integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-class-properties@^7.12.13": version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz" integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== dependencies: "@babel/helper-plugin-utils" "^7.12.13" "@babel/plugin-syntax-class-static-block@^7.14.5": version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz#195df89b146b4b78b3bf897fd7a257c84659d406" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz" integrity sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw== dependencies: "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-dynamic-import@^7.8.3": version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz#62bf98b2da3cd21d626154fc96ee5b3cb68eacb3" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz" integrity sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-export-namespace-from@^7.8.3": version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz#028964a9ba80dbc094c915c487ad7c4e7a66465a" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz" integrity sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q== dependencies: "@babel/helper-plugin-utils" "^7.8.3" "@babel/plugin-syntax-json-strings@^7.8.3": version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz" integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-logical-assignment-operators@^7.10.4": version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz" integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== dependencies: "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz" integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-numeric-separator@^7.10.4": version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz" integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== dependencies: "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-object-rest-spread@^7.8.3": version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz" integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-optional-catch-binding@^7.8.3": version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz" integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-optional-chaining@^7.8.3": version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz" integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-private-property-in-object@^7.14.5": version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz#0dc6671ec0ea22b6e94a1114f857970cd39de1ad" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz" integrity sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg== dependencies: "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-top-level-await@^7.14.5": version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz" integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== dependencies: "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-transform-arrow-functions@^7.16.7": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.18.6.tgz#19063fcf8771ec7b31d742339dac62433d0611fe" - integrity sha512-9S9X9RUefzrsHZmKMbDXxweEH+YlE8JJEuat9FdvW9Qh1cw7W64jELCtWNkPBPX5En45uy28KGvA/AySqUh8CQ== + version "7.20.7" + resolved "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.20.7.tgz" + integrity sha512-3poA5E7dzDomxj9WXWwuD6A5F3kc7VXwIJO+E+J8qtDtS+pXPAhrgEyh+9GBwBgPq1Z+bB+/JD60lp5jsN7JPQ== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-plugin-utils" "^7.20.2" -"@babel/plugin-transform-async-to-generator@7.16.8": +"@babel/plugin-transform-async-to-generator@^7.16.8", "@babel/plugin-transform-async-to-generator@7.16.8": version "7.16.8" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.16.8.tgz#b83dff4b970cf41f1b819f8b49cc0cfbaa53a808" + resolved "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.16.8.tgz" integrity sha512-MtmUmTJQHCnyJVrScNzNlofQJ3dLFuobYn3mwOTKHnSCMtbNsqvF71GQmJfFjdrXSsAA7iysFmYWw4bXZ20hOg== dependencies: "@babel/helper-module-imports" "^7.16.7" "@babel/helper-plugin-utils" "^7.16.7" "@babel/helper-remap-async-to-generator" "^7.16.8" -"@babel/plugin-transform-async-to-generator@^7.16.8": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.18.6.tgz#ccda3d1ab9d5ced5265fdb13f1882d5476c71615" - integrity sha512-ARE5wZLKnTgPW7/1ftQmSi1CmkqqHo2DNmtztFhvgtOWSDfq0Cq9/9L+KnZNYSNrydBekhW3rwShduf59RoXag== - dependencies: - "@babel/helper-module-imports" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/helper-remap-async-to-generator" "^7.18.6" - "@babel/plugin-transform-block-scoped-functions@^7.16.7": version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.18.6.tgz#9187bf4ba302635b9d70d986ad70f038726216a8" + resolved "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.18.6.tgz" integrity sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ== dependencies: "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-transform-block-scoping@^7.16.7": - version "7.20.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.20.5.tgz#401215f9dc13dc5262940e2e527c9536b3d7f237" - integrity sha512-WvpEIW9Cbj9ApF3yJCjIEEf1EiNJLtXagOrL5LNWEZOo3jv8pmPoYTSNJQvqej8OavVlgOoOPw6/htGZro6IkA== + version "7.21.0" + resolved "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.21.0.tgz" + integrity sha512-Mdrbunoh9SxwFZapeHVrwFmri16+oYotcZysSzhNIVDwIAb1UV+kvnxULSYq9J3/q5MDG+4X6w8QVgD1zhBXNQ== dependencies: "@babel/helper-plugin-utils" "^7.20.2" "@babel/plugin-transform-classes@^7.16.7": - version "7.20.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.20.2.tgz#c0033cf1916ccf78202d04be4281d161f6709bb2" - integrity sha512-9rbPp0lCVVoagvtEyQKSo5L8oo0nQS/iif+lwlAz29MccX2642vWDlSZK+2T2buxbopotId2ld7zZAzRfz9j1g== + version "7.21.0" + resolved "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.21.0.tgz" + integrity sha512-RZhbYTCEUAe6ntPehC4hlslPWosNHDox+vAs4On/mCLRLfoDVHf6hVEd7kuxr1RnHwJmxFfUM3cZiZRmPxJPXQ== dependencies: "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-compilation-targets" "^7.20.0" + "@babel/helper-compilation-targets" "^7.20.7" "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-function-name" "^7.19.0" + "@babel/helper-function-name" "^7.21.0" "@babel/helper-optimise-call-expression" "^7.18.6" "@babel/helper-plugin-utils" "^7.20.2" - "@babel/helper-replace-supers" "^7.19.1" + "@babel/helper-replace-supers" "^7.20.7" "@babel/helper-split-export-declaration" "^7.18.6" globals "^11.1.0" "@babel/plugin-transform-computed-properties@^7.16.7": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.18.9.tgz#2357a8224d402dad623caf6259b611e56aec746e" - integrity sha512-+i0ZU1bCDymKakLxn5srGHrsAPRELC2WIbzwjLhHW9SIE1cPYkLCL0NlnXMZaM1vhfgA2+M7hySk42VBvrkBRw== + version "7.20.7" + resolved "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.20.7.tgz" + integrity sha512-Lz7MvBK6DTjElHAmfu6bfANzKcxpyNPeYBGEafyA6E5HtRpjpZwU+u7Qrgz/2OR0z+5TvKYbPdphfSaAcZBrYQ== dependencies: - "@babel/helper-plugin-utils" "^7.18.9" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/template" "^7.20.7" "@babel/plugin-transform-destructuring@^7.16.7": - version "7.20.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.20.2.tgz#c23741cfa44ddd35f5e53896e88c75331b8b2792" - integrity sha512-mENM+ZHrvEgxLTBXUiQ621rRXZes3KWUv6NdQlrnr1TkWVw+hUjQBZuP2X32qKlrlG2BzgR95gkuCRSkJl8vIw== + version "7.21.3" + resolved "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.21.3.tgz" + integrity sha512-bp6hwMFzuiE4HqYEyoGJ/V2LeIWn+hLVKc4pnj++E5XQptwhtcGmSayM029d/j2X1bPKGTlsyPwAubuU22KhMA== dependencies: "@babel/helper-plugin-utils" "^7.20.2" "@babel/plugin-transform-dotall-regex@^7.16.7", "@babel/plugin-transform-dotall-regex@^7.4.4": version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.18.6.tgz#b286b3e7aae6c7b861e45bed0a2fafd6b1a4fef8" + resolved "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.18.6.tgz" integrity sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg== dependencies: "@babel/helper-create-regexp-features-plugin" "^7.18.6" @@ -999,29 +979,29 @@ "@babel/plugin-transform-duplicate-keys@^7.16.7": version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.9.tgz#687f15ee3cdad6d85191eb2a372c4528eaa0ae0e" + resolved "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.9.tgz" integrity sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw== dependencies: "@babel/helper-plugin-utils" "^7.18.9" "@babel/plugin-transform-exponentiation-operator@^7.16.7": version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.18.6.tgz#421c705f4521888c65e91fdd1af951bfefd4dacd" + resolved "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.18.6.tgz" integrity sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw== dependencies: "@babel/helper-builder-binary-assignment-operator-visitor" "^7.18.6" "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-transform-for-of@^7.16.7": - version "7.18.8" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.18.8.tgz#6ef8a50b244eb6a0bdbad0c7c61877e4e30097c1" - integrity sha512-yEfTRnjuskWYo0k1mHUqrVWaZwrdq8AYbfrpqULOJOaucGSp4mNMVps+YtA8byoevxS/urwU75vyhQIxcCgiBQ== + version "7.21.0" + resolved "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.21.0.tgz" + integrity sha512-LlUYlydgDkKpIY7mcBWvyPPmMcOphEyYA27Ef4xpbh1IiDNLr0kZsos2nf92vz3IccvJI25QUwp86Eo5s6HmBQ== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-plugin-utils" "^7.20.2" "@babel/plugin-transform-function-name@^7.16.7": version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.9.tgz#cc354f8234e62968946c61a46d6365440fc764e0" + resolved "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.9.tgz" integrity sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ== dependencies: "@babel/helper-compilation-targets" "^7.18.9" @@ -1030,48 +1010,48 @@ "@babel/plugin-transform-literals@^7.16.7": version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.9.tgz#72796fdbef80e56fba3c6a699d54f0de557444bc" + resolved "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.9.tgz" integrity sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg== dependencies: "@babel/helper-plugin-utils" "^7.18.9" "@babel/plugin-transform-member-expression-literals@^7.16.7": version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.18.6.tgz#ac9fdc1a118620ac49b7e7a5d2dc177a1bfee88e" + resolved "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.18.6.tgz" integrity sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA== dependencies: "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-transform-modules-amd@^7.16.7": - version "7.19.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.19.6.tgz#aca391801ae55d19c4d8d2ebfeaa33df5f2a2cbd" - integrity sha512-uG3od2mXvAtIFQIh0xrpLH6r5fpSQN04gIVovl+ODLdUMANokxQLZnPBHcjmv3GxRjnqwLuHvppjjcelqUFZvg== + version "7.20.11" + resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.20.11.tgz" + integrity sha512-NuzCt5IIYOW0O30UvqktzHYR2ud5bOWbY0yaxWZ6G+aFzOMJvrs5YHNikrbdaT15+KNO31nPOy5Fim3ku6Zb5g== dependencies: - "@babel/helper-module-transforms" "^7.19.6" - "@babel/helper-plugin-utils" "^7.19.0" + "@babel/helper-module-transforms" "^7.20.11" + "@babel/helper-plugin-utils" "^7.20.2" "@babel/plugin-transform-modules-commonjs@^7.16.8": - version "7.19.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.19.6.tgz#25b32feef24df8038fc1ec56038917eacb0b730c" - integrity sha512-8PIa1ym4XRTKuSsOUXqDG0YaOlEuTVvHMe5JCfgBMOtHvJKw/4NGovEGN33viISshG/rZNVrACiBmPQLvWN8xQ== + version "7.21.2" + resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.21.2.tgz" + integrity sha512-Cln+Yy04Gxua7iPdj6nOV96smLGjpElir5YwzF0LBPKoPlLDNJePNlrGGaybAJkd0zKRnOVXOgizSqPYMNYkzA== dependencies: - "@babel/helper-module-transforms" "^7.19.6" - "@babel/helper-plugin-utils" "^7.19.0" - "@babel/helper-simple-access" "^7.19.4" + "@babel/helper-module-transforms" "^7.21.2" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-simple-access" "^7.20.2" "@babel/plugin-transform-modules-systemjs@^7.16.7": - version "7.19.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.19.6.tgz#59e2a84064b5736a4471b1aa7b13d4431d327e0d" - integrity sha512-fqGLBepcc3kErfR9R3DnVpURmckXP7gj7bAlrTQyBxrigFqszZCkFkcoxzCp2v32XmwXLvbw+8Yq9/b+QqksjQ== + version "7.20.11" + resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.20.11.tgz" + integrity sha512-vVu5g9BPQKSFEmvt2TA4Da5N+QVS66EX21d8uoOihC+OCpUoGvzVsXeqFdtAEfVa5BILAeFt+U7yVmLbQnAJmw== dependencies: "@babel/helper-hoist-variables" "^7.18.6" - "@babel/helper-module-transforms" "^7.19.6" - "@babel/helper-plugin-utils" "^7.19.0" + "@babel/helper-module-transforms" "^7.20.11" + "@babel/helper-plugin-utils" "^7.20.2" "@babel/helper-validator-identifier" "^7.19.1" "@babel/plugin-transform-modules-umd@^7.16.7": version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.6.tgz#81d3832d6034b75b54e62821ba58f28ed0aab4b9" + resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.6.tgz" integrity sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ== dependencies: "@babel/helper-module-transforms" "^7.18.6" @@ -1079,7 +1059,7 @@ "@babel/plugin-transform-named-capturing-groups-regex@^7.16.8": version "7.20.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.20.5.tgz#626298dd62ea51d452c3be58b285d23195ba69a8" + resolved "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.20.5.tgz" integrity sha512-mOW4tTzi5iTLnw+78iEq3gr8Aoq4WNRGpmSlrogqaiCBoR1HFhpU4JkpQFOHfeYx3ReVIFWOQJS4aZBRvuZ6mA== dependencies: "@babel/helper-create-regexp-features-plugin" "^7.20.5" @@ -1087,36 +1067,36 @@ "@babel/plugin-transform-new-target@^7.16.7": version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.18.6.tgz#d128f376ae200477f37c4ddfcc722a8a1b3246a8" + resolved "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.18.6.tgz" integrity sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw== dependencies: "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-transform-object-super@^7.16.7": version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.18.6.tgz#fb3c6ccdd15939b6ff7939944b51971ddc35912c" + resolved "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.18.6.tgz" integrity sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA== dependencies: "@babel/helper-plugin-utils" "^7.18.6" "@babel/helper-replace-supers" "^7.18.6" -"@babel/plugin-transform-parameters@^7.16.7", "@babel/plugin-transform-parameters@^7.20.1": - version "7.20.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.20.5.tgz#f8f9186c681d10c3de7620c916156d893c8a019e" - integrity sha512-h7plkOmcndIUWXZFLgpbrh2+fXAi47zcUX7IrOQuZdLD0I0KvjJ6cvo3BEcAOsDOcZhVKGJqv07mkSqK0y2isQ== +"@babel/plugin-transform-parameters@^7.16.7", "@babel/plugin-transform-parameters@^7.20.7": + version "7.21.3" + resolved "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.21.3.tgz" + integrity sha512-Wxc+TvppQG9xWFYatvCGPvZ6+SIUxQ2ZdiBP+PHYMIjnPXD+uThCshaz4NZOnODAtBjjcVQQ/3OKs9LW28purQ== dependencies: "@babel/helper-plugin-utils" "^7.20.2" "@babel/plugin-transform-property-literals@^7.16.7": version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.18.6.tgz#e22498903a483448e94e032e9bbb9c5ccbfc93a3" + resolved "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.18.6.tgz" integrity sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg== dependencies: "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-transform-regenerator@^7.16.7": version "7.20.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.20.5.tgz#57cda588c7ffb7f4f8483cc83bdcea02a907f04d" + resolved "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.20.5.tgz" integrity sha512-kW/oO7HPBtntbsahzQ0qSE3tFvkFwnbozz3NWFhLGqH75vLEg+sCGngLlhVkePlCs3Jv0dBBHDzCHxNiFAQKCQ== dependencies: "@babel/helper-plugin-utils" "^7.20.2" @@ -1124,14 +1104,14 @@ "@babel/plugin-transform-reserved-words@^7.16.7": version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.18.6.tgz#b1abd8ebf8edaa5f7fe6bbb8d2133d23b6a6f76a" + resolved "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.18.6.tgz" integrity sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA== dependencies: "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-transform-runtime@7.16.10": version "7.16.10" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.16.10.tgz#53d9fd3496daedce1dd99639097fa5d14f4c7c2c" + resolved "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.16.10.tgz" integrity sha512-9nwTiqETv2G7xI4RvXHNfpGdr8pAA+Q/YtN3yLK7OoK7n9OibVm/xymJ838a9A6E/IciOLPj82lZk0fW6O4O7w== dependencies: "@babel/helper-module-imports" "^7.16.7" @@ -1143,50 +1123,50 @@ "@babel/plugin-transform-shorthand-properties@^7.16.7": version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.18.6.tgz#6d6df7983d67b195289be24909e3f12a8f664dc9" + resolved "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.18.6.tgz" integrity sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw== dependencies: "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-transform-spread@^7.16.7": - version "7.19.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.19.0.tgz#dd60b4620c2fec806d60cfaae364ec2188d593b6" - integrity sha512-RsuMk7j6n+r752EtzyScnWkQyuJdli6LdO5Klv8Yx0OfPVTcQkIUfS8clx5e9yHXzlnhOZF3CbQ8C2uP5j074w== + version "7.20.7" + resolved "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.20.7.tgz" + integrity sha512-ewBbHQ+1U/VnH1fxltbJqDeWBU1oNLG8Dj11uIv3xVf7nrQu0bPGe5Rf716r7K5Qz+SqtAOVswoVunoiBtGhxw== dependencies: - "@babel/helper-plugin-utils" "^7.19.0" - "@babel/helper-skip-transparent-expression-wrappers" "^7.18.9" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" "@babel/plugin-transform-sticky-regex@^7.16.7": version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.18.6.tgz#c6706eb2b1524028e317720339583ad0f444adcc" + resolved "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.18.6.tgz" integrity sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q== dependencies: "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-transform-template-literals@^7.16.7": version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.9.tgz#04ec6f10acdaa81846689d63fae117dd9c243a5e" + resolved "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.9.tgz" integrity sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA== dependencies: "@babel/helper-plugin-utils" "^7.18.9" "@babel/plugin-transform-typeof-symbol@^7.16.7": version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.9.tgz#c8cea68263e45addcd6afc9091429f80925762c0" + resolved "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.9.tgz" integrity sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw== dependencies: "@babel/helper-plugin-utils" "^7.18.9" "@babel/plugin-transform-unicode-escapes@^7.16.7": version "7.18.10" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.18.10.tgz#1ecfb0eda83d09bbcb77c09970c2dd55832aa246" + resolved "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.18.10.tgz" integrity sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ== dependencies: "@babel/helper-plugin-utils" "^7.18.9" "@babel/plugin-transform-unicode-regex@^7.16.7": version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.18.6.tgz#194317225d8c201bbae103364ffe9e2cea36cdca" + resolved "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.18.6.tgz" integrity sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA== dependencies: "@babel/helper-create-regexp-features-plugin" "^7.18.6" @@ -1194,7 +1174,7 @@ "@babel/preset-env@7.16.11": version "7.16.11" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.16.11.tgz#5dd88fd885fae36f88fd7c8342475c9f0abe2982" + resolved "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.16.11.tgz" integrity sha512-qcmWG8R7ZW6WBRPZK//y+E3Cli151B20W1Rv7ln27vuPaXU/8TKms6jFdiJtF7UDTxcrb7mZd88tAeK9LjdT8g== dependencies: "@babel/compat-data" "^7.16.8" @@ -1274,7 +1254,7 @@ "@babel/preset-modules@^0.1.5": version "0.1.5" - resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.5.tgz#ef939d6e7f268827e1841638dc6ff95515e115d9" + resolved "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.5.tgz" integrity sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA== dependencies: "@babel/helper-plugin-utils" "^7.0.0" @@ -1283,73 +1263,71 @@ "@babel/types" "^7.4.4" esutils "^2.0.2" +"@babel/regjsgen@^0.8.0": + version "0.8.0" + resolved "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz" + integrity sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA== + "@babel/runtime-corejs3@^7.10.2": - version "7.20.6" - resolved "https://registry.yarnpkg.com/@babel/runtime-corejs3/-/runtime-corejs3-7.20.6.tgz#63dae945963539ab0ad578efbf3eff271e7067ae" - integrity sha512-tqeujPiuEfcH067mx+7otTQWROVMKHXEaOQcAeNV5dDdbPWvPcFA8/W9LXw2NfjNmOetqLl03dfnG2WALPlsRQ== + version "7.21.0" + resolved "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.21.0.tgz" + integrity sha512-TDD4UJzos3JJtM+tHX+w2Uc+KWj7GV+VKKFdMVd2Rx8sdA19hcc3P3AHFYd5LVOw+pYuSd5lICC3gm52B6Rwxw== dependencies: core-js-pure "^3.25.1" regenerator-runtime "^0.13.11" -"@babel/runtime@7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.16.7.tgz#03ff99f64106588c9c403c6ecb8c3bafbbdff1fa" - integrity sha512-9E9FJowqAsytyOY6LG+1KuueckRL+aQW+mKvXRXnuFGyRAyepJPmEo9vgMfXUA6O9u3IeEdv9MAkppFcaQwogQ== - dependencies: - regenerator-runtime "^0.13.4" - -"@babel/runtime@7.17.2": +"@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2", "@babel/runtime@^7.10.2", "@babel/runtime@^7.12.0", "@babel/runtime@^7.14.5", "@babel/runtime@^7.15.4", "@babel/runtime@^7.3.1", "@babel/runtime@^7.4.4", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.3", "@babel/runtime@^7.8.3", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2", "@babel/runtime@>=7", "@babel/runtime@7.17.2": version "7.17.2" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.17.2.tgz#66f68591605e59da47523c631416b18508779941" + resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.17.2.tgz" integrity sha512-hzeyJyMA1YGdJTuWU0e/j4wKXrU4OMFvY2MSlaI9B7VQb0r5cxTE3EAIS2Q7Tn2RIcDkRvTA/v2JsAEhxe99uw== dependencies: regenerator-runtime "^0.13.4" -"@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2", "@babel/runtime@^7.10.2", "@babel/runtime@^7.12.0", "@babel/runtime@^7.14.5", "@babel/runtime@^7.15.4", "@babel/runtime@^7.3.1", "@babel/runtime@^7.4.4", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.3", "@babel/runtime@^7.8.3", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2": - version "7.20.6" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.20.6.tgz#facf4879bfed9b5326326273a64220f099b0fce3" - integrity sha512-Q+8MqP7TiHMWzSfwiJwXCjyf4GYA4Dgw3emg/7xmwsdLJOZUp+nMqcOwOzzYheuM1rhDu8FSj2l0aoMygEuXuA== - dependencies: - regenerator-runtime "^0.13.11" - -"@babel/template@7.16.7": +"@babel/runtime@7.16.7": version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.16.7.tgz#8d126c8701fde4d66b264b3eba3d96f07666d155" + resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.16.7.tgz" + integrity sha512-9E9FJowqAsytyOY6LG+1KuueckRL+aQW+mKvXRXnuFGyRAyepJPmEo9vgMfXUA6O9u3IeEdv9MAkppFcaQwogQ== + dependencies: + regenerator-runtime "^0.13.4" + +"@babel/template@^7.16.7", "@babel/template@7.16.7": + version "7.16.7" + resolved "https://registry.npmjs.org/@babel/template/-/template-7.16.7.tgz" integrity sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w== dependencies: "@babel/code-frame" "^7.16.7" "@babel/parser" "^7.16.7" "@babel/types" "^7.16.7" -"@babel/template@^7.16.7", "@babel/template@^7.18.10": - version "7.18.10" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.18.10.tgz#6f9134835970d1dbf0835c0d100c9f38de0c5e71" - integrity sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA== +"@babel/template@^7.18.10", "@babel/template@^7.18.6", "@babel/template@^7.20.7": + version "7.20.7" + resolved "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz" + integrity sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw== dependencies: "@babel/code-frame" "^7.18.6" - "@babel/parser" "^7.18.10" - "@babel/types" "^7.18.10" + "@babel/parser" "^7.20.7" + "@babel/types" "^7.20.7" -"@babel/traverse@^7.10.3", "@babel/traverse@^7.16.10", "@babel/traverse@^7.17.0", "@babel/traverse@^7.19.1", "@babel/traverse@^7.20.1", "@babel/traverse@^7.20.5": - version "7.20.5" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.20.5.tgz#78eb244bea8270fdda1ef9af22a5d5e5b7e57133" - integrity sha512-WM5ZNN3JITQIq9tFZaw1ojLU3WgWdtkxnhM1AegMS+PvHjkM5IXjmYEGY7yukz5XS4sJyEf2VzWjI8uAavhxBQ== +"@babel/traverse@^7.10.3", "@babel/traverse@^7.16.10", "@babel/traverse@^7.18.9", "@babel/traverse@^7.20.5", "@babel/traverse@^7.20.7", "@babel/traverse@^7.21.0", "@babel/traverse@^7.21.2": + version "7.21.4" + resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.21.4.tgz" + integrity sha512-eyKrRHKdyZxqDm+fV1iqL9UAHMoIg0nDaGqfIOd8rKH17m5snv7Gn4qgjBoFfLz9APvjFU/ICT00NVCv1Epp8Q== dependencies: - "@babel/code-frame" "^7.18.6" - "@babel/generator" "^7.20.5" + "@babel/code-frame" "^7.21.4" + "@babel/generator" "^7.21.4" "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-function-name" "^7.19.0" + "@babel/helper-function-name" "^7.21.0" "@babel/helper-hoist-variables" "^7.18.6" "@babel/helper-split-export-declaration" "^7.18.6" - "@babel/parser" "^7.20.5" - "@babel/types" "^7.20.5" + "@babel/parser" "^7.21.4" + "@babel/types" "^7.21.4" debug "^4.1.0" globals "^11.1.0" -"@babel/types@^7.10.3", "@babel/types@^7.16.7", "@babel/types@^7.16.8", "@babel/types@^7.17.0", "@babel/types@^7.18.10", "@babel/types@^7.18.6", "@babel/types@^7.18.9", "@babel/types@^7.19.0", "@babel/types@^7.20.0", "@babel/types@^7.20.2", "@babel/types@^7.20.5", "@babel/types@^7.4.4": - version "7.20.5" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.20.5.tgz#e206ae370b5393d94dfd1d04cd687cace53efa84" - integrity sha512-c9fst/h2/dcF7H+MJKZ2T0KjEQ8hY/BNnDk/H3XY8C4Aw/eWQXWn/lWntHF9ooUBnGmEvbfGrTgLWc+um0YDUg== +"@babel/types@^7.10.3", "@babel/types@^7.16.7", "@babel/types@^7.16.8", "@babel/types@^7.18.6", "@babel/types@^7.18.9", "@babel/types@^7.20.0", "@babel/types@^7.20.2", "@babel/types@^7.20.5", "@babel/types@^7.20.7", "@babel/types@^7.21.0", "@babel/types@^7.21.2", "@babel/types@^7.21.4", "@babel/types@^7.4.4": + version "7.21.4" + resolved "https://registry.npmjs.org/@babel/types/-/types-7.21.4.tgz" + integrity sha512-rU2oY501qDxE8Pyo7i/Orqma4ziCOrby0/9mvbDUGEfvZjb279Nk9k19e2fiCxHbRRpY2ZyrgW1eq22mvmOIzA== dependencies: "@babel/helper-string-parser" "^7.19.4" "@babel/helper-validator-identifier" "^7.19.1" @@ -1357,24 +1335,19 @@ "@colors/colors@1.5.0": version "1.5.0" - resolved "https://registry.yarnpkg.com/@colors/colors/-/colors-1.5.0.tgz#bb504579c1cae923e6576a4f5da43d25f97bdbd9" + resolved "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz" integrity sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ== -"@cspotcode/source-map-consumer@0.8.0": - version "0.8.0" - resolved "https://registry.yarnpkg.com/@cspotcode/source-map-consumer/-/source-map-consumer-0.8.0.tgz#33bf4b7b39c178821606f669bbc447a6a629786b" - integrity sha512-41qniHzTU8yAGbCp04ohlmSrZf8bkf/iJsl3V0dRGsQN/5GFfx+LbCSsCpp2gqrqjTVg/K6O8ycoV35JIwAzAg== - -"@cspotcode/source-map-support@0.6.1": - version "0.6.1" - resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.6.1.tgz#118511f316e2e87ee4294761868e254d3da47960" - integrity sha512-DX3Z+T5dt1ockmPdobJS/FAsQPW4V4SrWEhD2iYQT2Cb2tQsiMnYxrcUH9By/Z3B+v0S5LMBkQtV/XOBbpLEOg== +"@cspotcode/source-map-support@^0.8.0": + version "0.8.1" + resolved "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz" + integrity sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw== dependencies: - "@cspotcode/source-map-consumer" "0.8.0" + "@jridgewell/trace-mapping" "0.3.9" "@csstools/postcss-cascade-layers@^1.1.1": version "1.1.1" - resolved "https://registry.yarnpkg.com/@csstools/postcss-cascade-layers/-/postcss-cascade-layers-1.1.1.tgz#8a997edf97d34071dd2e37ea6022447dd9e795ad" + resolved "https://registry.npmjs.org/@csstools/postcss-cascade-layers/-/postcss-cascade-layers-1.1.1.tgz" integrity sha512-+KdYrpKC5TgomQr2DlZF4lDEpHcoxnj5IGddYYfBWJAKfj1JtuHUIqMa+E1pJJ+z3kvDViWMqyqPlG4Ja7amQA== dependencies: "@csstools/selector-specificity" "^2.0.2" @@ -1382,7 +1355,7 @@ "@csstools/postcss-color-function@^1.1.1": version "1.1.1" - resolved "https://registry.yarnpkg.com/@csstools/postcss-color-function/-/postcss-color-function-1.1.1.tgz#2bd36ab34f82d0497cfacdc9b18d34b5e6f64b6b" + resolved "https://registry.npmjs.org/@csstools/postcss-color-function/-/postcss-color-function-1.1.1.tgz" integrity sha512-Bc0f62WmHdtRDjf5f3e2STwRAl89N2CLb+9iAwzrv4L2hncrbDwnQD9PCq0gtAt7pOI2leIV08HIBUd4jxD8cw== dependencies: "@csstools/postcss-progressive-custom-properties" "^1.1.0" @@ -1390,21 +1363,21 @@ "@csstools/postcss-font-format-keywords@^1.0.1": version "1.0.1" - resolved "https://registry.yarnpkg.com/@csstools/postcss-font-format-keywords/-/postcss-font-format-keywords-1.0.1.tgz#677b34e9e88ae997a67283311657973150e8b16a" + resolved "https://registry.npmjs.org/@csstools/postcss-font-format-keywords/-/postcss-font-format-keywords-1.0.1.tgz" integrity sha512-ZgrlzuUAjXIOc2JueK0X5sZDjCtgimVp/O5CEqTcs5ShWBa6smhWYbS0x5cVc/+rycTDbjjzoP0KTDnUneZGOg== dependencies: postcss-value-parser "^4.2.0" "@csstools/postcss-hwb-function@^1.0.2": version "1.0.2" - resolved "https://registry.yarnpkg.com/@csstools/postcss-hwb-function/-/postcss-hwb-function-1.0.2.tgz#ab54a9fce0ac102c754854769962f2422ae8aa8b" + resolved "https://registry.npmjs.org/@csstools/postcss-hwb-function/-/postcss-hwb-function-1.0.2.tgz" integrity sha512-YHdEru4o3Rsbjmu6vHy4UKOXZD+Rn2zmkAmLRfPet6+Jz4Ojw8cbWxe1n42VaXQhD3CQUXXTooIy8OkVbUcL+w== dependencies: postcss-value-parser "^4.2.0" "@csstools/postcss-ic-unit@^1.0.1": version "1.0.1" - resolved "https://registry.yarnpkg.com/@csstools/postcss-ic-unit/-/postcss-ic-unit-1.0.1.tgz#28237d812a124d1a16a5acc5c3832b040b303e58" + resolved "https://registry.npmjs.org/@csstools/postcss-ic-unit/-/postcss-ic-unit-1.0.1.tgz" integrity sha512-Ot1rcwRAaRHNKC9tAqoqNZhjdYBzKk1POgWfhN4uCOE47ebGcLRqXjKkApVDpjifL6u2/55ekkpnFcp+s/OZUw== dependencies: "@csstools/postcss-progressive-custom-properties" "^1.1.0" @@ -1412,7 +1385,7 @@ "@csstools/postcss-is-pseudo-class@^2.0.7": version "2.0.7" - resolved "https://registry.yarnpkg.com/@csstools/postcss-is-pseudo-class/-/postcss-is-pseudo-class-2.0.7.tgz#846ae6c0d5a1eaa878fce352c544f9c295509cd1" + resolved "https://registry.npmjs.org/@csstools/postcss-is-pseudo-class/-/postcss-is-pseudo-class-2.0.7.tgz" integrity sha512-7JPeVVZHd+jxYdULl87lvjgvWldYu+Bc62s9vD/ED6/QTGjy0jy0US/f6BG53sVMTBJ1lzKZFpYmofBN9eaRiA== dependencies: "@csstools/selector-specificity" "^2.0.0" @@ -1420,21 +1393,21 @@ "@csstools/postcss-nested-calc@^1.0.0": version "1.0.0" - resolved "https://registry.yarnpkg.com/@csstools/postcss-nested-calc/-/postcss-nested-calc-1.0.0.tgz#d7e9d1d0d3d15cf5ac891b16028af2a1044d0c26" + resolved "https://registry.npmjs.org/@csstools/postcss-nested-calc/-/postcss-nested-calc-1.0.0.tgz" integrity sha512-JCsQsw1wjYwv1bJmgjKSoZNvf7R6+wuHDAbi5f/7MbFhl2d/+v+TvBTU4BJH3G1X1H87dHl0mh6TfYogbT/dJQ== dependencies: postcss-value-parser "^4.2.0" "@csstools/postcss-normalize-display-values@^1.0.1": version "1.0.1" - resolved "https://registry.yarnpkg.com/@csstools/postcss-normalize-display-values/-/postcss-normalize-display-values-1.0.1.tgz#15da54a36e867b3ac5163ee12c1d7f82d4d612c3" + resolved "https://registry.npmjs.org/@csstools/postcss-normalize-display-values/-/postcss-normalize-display-values-1.0.1.tgz" integrity sha512-jcOanIbv55OFKQ3sYeFD/T0Ti7AMXc9nM1hZWu8m/2722gOTxFg7xYu4RDLJLeZmPUVQlGzo4jhzvTUq3x4ZUw== dependencies: postcss-value-parser "^4.2.0" "@csstools/postcss-oklab-function@^1.1.1": version "1.1.1" - resolved "https://registry.yarnpkg.com/@csstools/postcss-oklab-function/-/postcss-oklab-function-1.1.1.tgz#88cee0fbc8d6df27079ebd2fa016ee261eecf844" + resolved "https://registry.npmjs.org/@csstools/postcss-oklab-function/-/postcss-oklab-function-1.1.1.tgz" integrity sha512-nJpJgsdA3dA9y5pgyb/UfEzE7W5Ka7u0CX0/HIMVBNWzWemdcTH3XwANECU6anWv/ao4vVNLTMxhiPNZsTK6iA== dependencies: "@csstools/postcss-progressive-custom-properties" "^1.1.0" @@ -1442,45 +1415,45 @@ "@csstools/postcss-progressive-custom-properties@^1.1.0", "@csstools/postcss-progressive-custom-properties@^1.3.0": version "1.3.0" - resolved "https://registry.yarnpkg.com/@csstools/postcss-progressive-custom-properties/-/postcss-progressive-custom-properties-1.3.0.tgz#542292558384361776b45c85226b9a3a34f276fa" + resolved "https://registry.npmjs.org/@csstools/postcss-progressive-custom-properties/-/postcss-progressive-custom-properties-1.3.0.tgz" integrity sha512-ASA9W1aIy5ygskZYuWams4BzafD12ULvSypmaLJT2jvQ8G0M3I8PRQhC0h7mG0Z3LI05+agZjqSR9+K9yaQQjA== dependencies: postcss-value-parser "^4.2.0" "@csstools/postcss-stepped-value-functions@^1.0.1": version "1.0.1" - resolved "https://registry.yarnpkg.com/@csstools/postcss-stepped-value-functions/-/postcss-stepped-value-functions-1.0.1.tgz#f8772c3681cc2befed695e2b0b1d68e22f08c4f4" + resolved "https://registry.npmjs.org/@csstools/postcss-stepped-value-functions/-/postcss-stepped-value-functions-1.0.1.tgz" integrity sha512-dz0LNoo3ijpTOQqEJLY8nyaapl6umbmDcgj4AD0lgVQ572b2eqA1iGZYTTWhrcrHztWDDRAX2DGYyw2VBjvCvQ== dependencies: postcss-value-parser "^4.2.0" "@csstools/postcss-text-decoration-shorthand@^1.0.0": version "1.0.0" - resolved "https://registry.yarnpkg.com/@csstools/postcss-text-decoration-shorthand/-/postcss-text-decoration-shorthand-1.0.0.tgz#ea96cfbc87d921eca914d3ad29340d9bcc4c953f" + resolved "https://registry.npmjs.org/@csstools/postcss-text-decoration-shorthand/-/postcss-text-decoration-shorthand-1.0.0.tgz" integrity sha512-c1XwKJ2eMIWrzQenN0XbcfzckOLLJiczqy+YvfGmzoVXd7pT9FfObiSEfzs84bpE/VqfpEuAZ9tCRbZkZxxbdw== dependencies: postcss-value-parser "^4.2.0" "@csstools/postcss-trigonometric-functions@^1.0.2": version "1.0.2" - resolved "https://registry.yarnpkg.com/@csstools/postcss-trigonometric-functions/-/postcss-trigonometric-functions-1.0.2.tgz#94d3e4774c36d35dcdc88ce091336cb770d32756" + resolved "https://registry.npmjs.org/@csstools/postcss-trigonometric-functions/-/postcss-trigonometric-functions-1.0.2.tgz" integrity sha512-woKaLO///4bb+zZC2s80l+7cm07M7268MsyG3M0ActXXEFi6SuhvriQYcb58iiKGbjwwIU7n45iRLEHypB47Og== dependencies: postcss-value-parser "^4.2.0" "@csstools/postcss-unset-value@^1.0.2": version "1.0.2" - resolved "https://registry.yarnpkg.com/@csstools/postcss-unset-value/-/postcss-unset-value-1.0.2.tgz#c99bb70e2cdc7312948d1eb41df2412330b81f77" + resolved "https://registry.npmjs.org/@csstools/postcss-unset-value/-/postcss-unset-value-1.0.2.tgz" integrity sha512-c8J4roPBILnelAsdLr4XOAR/GsTm0GJi4XpcfvoWk3U6KiTCqiFYc63KhRMQQX35jYMp4Ao8Ij9+IZRgMfJp1g== "@csstools/selector-specificity@^2.0.0", "@csstools/selector-specificity@^2.0.2": - version "2.0.2" - resolved "https://registry.yarnpkg.com/@csstools/selector-specificity/-/selector-specificity-2.0.2.tgz#1bfafe4b7ed0f3e4105837e056e0a89b108ebe36" - integrity sha512-IkpVW/ehM1hWKln4fCA3NzJU8KwD+kIOvPZA4cqxoJHtE21CCzjyp+Kxbu0i5I4tBNOlXPL9mjwnWlL0VEG4Fg== + version "2.2.0" + resolved "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-2.2.0.tgz" + integrity sha512-+OJ9konv95ClSTOJCmMZqpd5+YGsB2S+x6w3E1oaM8UuR5j8nTNHYSz8c9BEPGDOCMQYIEEGlVPj/VY64iTbGw== "@cypress/request@^2.88.10": version "2.88.11" - resolved "https://registry.yarnpkg.com/@cypress/request/-/request-2.88.11.tgz#5a4c7399bc2d7e7ed56e92ce5acb620c8b187047" + resolved "https://registry.npmjs.org/@cypress/request/-/request-2.88.11.tgz" integrity sha512-M83/wfQ1EkspjkE2lNWNV5ui2Cv7UCv1swW1DqljahbzLVWltcsexQh8jYtuS/vzFXP+HySntGM83ZXA9fn17w== dependencies: aws-sign2 "~0.7.0" @@ -1504,7 +1477,7 @@ "@cypress/schematic@^1.5.0": version "1.7.0" - resolved "https://registry.yarnpkg.com/@cypress/schematic/-/schematic-1.7.0.tgz#66343138f7f94843fa24f0c492a5a83408a7a047" + resolved "https://registry.npmjs.org/@cypress/schematic/-/schematic-1.7.0.tgz" integrity sha512-CouQrVlZ+uHVVBQtmNoMYU9LyoSAmQTOLDpVjrdTdMPpJH1mWnHCL5OCMt+FZLR+43KRiWEvDUjNqSza11oGsQ== dependencies: "@angular-devkit/architect" "^0.1202.10" @@ -1516,70 +1489,87 @@ "@cypress/xvfb@^1.2.4": version "1.2.4" - resolved "https://registry.yarnpkg.com/@cypress/xvfb/-/xvfb-1.2.4.tgz#2daf42e8275b39f4aa53c14214e557bd14e7748a" + resolved "https://registry.npmjs.org/@cypress/xvfb/-/xvfb-1.2.4.tgz" integrity sha512-skbBzPggOVYCbnGgV+0dmBdW/s77ZkAOXIC1knS8NagwDjBrNC1LuXtQJeiN6l+m7lzmHtaoUw/ctJKdqkG57Q== dependencies: debug "^3.1.0" lodash.once "^4.1.1" -"@discoveryjs/json-ext@0.5.6": +"@discoveryjs/json-ext@^0.5.0", "@discoveryjs/json-ext@0.5.6": version "0.5.6" - resolved "https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-0.5.6.tgz#d5e0706cf8c6acd8c6032f8d54070af261bbbb2f" + resolved "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.6.tgz" integrity sha512-ws57AidsDvREKrZKYffXddNkyaF14iHNHm8VQnZH6t99E8gczjNN0GpvcGny0imC80yQ0tHz1xVUKk/KFQSUyA== -"@discoveryjs/json-ext@^0.5.0": +"@discoveryjs/json-ext@0.5.7": version "0.5.7" - resolved "https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz#1d572bfbbe14b7704e0ba0f39b74815b84870d70" + resolved "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz" integrity sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw== "@edsilv/http-status-codes@^1.0.3": version "1.0.3" - resolved "https://registry.yarnpkg.com/@edsilv/http-status-codes/-/http-status-codes-1.0.3.tgz#a1b767c552ac43f2983ab2b9ee20e9c73b79960b" + resolved "https://registry.npmjs.org/@edsilv/http-status-codes/-/http-status-codes-1.0.3.tgz" integrity sha512-HLK2FS5sZqxPqD53D6hhZxC6C8THTVwlyZDZ7J0iWsrB8JmMA69m/CQuNKZc1kki9WSVeck2fXna26NL0SE7cg== "@emotion/hash@^0.8.0": version "0.8.0" - resolved "https://registry.yarnpkg.com/@emotion/hash/-/hash-0.8.0.tgz#bbbff68978fefdbe68ccb533bc8cbe1d1afb5413" + resolved "https://registry.npmjs.org/@emotion/hash/-/hash-0.8.0.tgz" integrity sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow== "@es-joy/jsdoccomment@~0.36.1": version "0.36.1" - resolved "https://registry.yarnpkg.com/@es-joy/jsdoccomment/-/jsdoccomment-0.36.1.tgz#c37db40da36e4b848da5fd427a74bae3b004a30f" + resolved "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.36.1.tgz" integrity sha512-922xqFsTpHs6D0BUiG4toiyPOMc8/jafnWKxz1KWgS4XzKPy2qXf1Pe6UFuNSCQqt6tOuhAWXBNuuyUhJmw9Vg== dependencies: comment-parser "1.3.1" esquery "^1.4.0" jsdoc-type-pratt-parser "~3.1.0" -"@eslint/eslintrc@^1.3.3": - version "1.3.3" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-1.3.3.tgz#2b044ab39fdfa75b4688184f9e573ce3c5b0ff95" - integrity sha512-uj3pT6Mg+3t39fvLrj8iuCIJ38zKO9FpGtJ4BBJebJhEwjoT+KLVNCcHT5QC9NGRIEi7fZ0ZR8YRb884auB4Lg== +"@eslint-community/eslint-utils@^4.2.0": + version "4.4.0" + resolved "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz" + integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA== + dependencies: + eslint-visitor-keys "^3.3.0" + +"@eslint-community/regexpp@^4.4.0": + version "4.5.0" + resolved "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.5.0.tgz" + integrity sha512-vITaYzIcNmjn5tF5uxcZ/ft7/RXGrMUIS9HalWckEOF6ESiwXKoMzAQf2UW0aVd6rnOeExTJVd5hmWXucBKGXQ== + +"@eslint/eslintrc@^2.0.2": + version "2.0.2" + resolved "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.2.tgz" + integrity sha512-3W4f5tDUra+pA+FzgugqL2pRimUTDJWKr7BINqOpkZrC0uYI0NIc0/JFgBROCU07HR6GieA5m3/rsPIhDmCXTQ== dependencies: ajv "^6.12.4" debug "^4.3.2" - espree "^9.4.0" - globals "^13.15.0" + espree "^9.5.1" + globals "^13.19.0" ignore "^5.2.0" import-fresh "^3.2.1" js-yaml "^4.1.0" minimatch "^3.1.2" strip-json-comments "^3.1.1" +"@eslint/js@8.38.0": + version "8.38.0" + resolved "https://registry.npmjs.org/@eslint/js/-/js-8.38.0.tgz" + integrity sha512-IoD2MfUnOV58ghIHCiil01PcohxjbYR/qCxsoC+xNgUwh1EY8jOOrYmu3d3a71+tJJ23uscEV4X2HJWMsPJu4g== + "@fortawesome/fontawesome-free@^6.2.1": - version "6.2.1" - resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-free/-/fontawesome-free-6.2.1.tgz#344baf6ff9eaad7a73cff067d8c56bfc11ae5304" - integrity sha512-viouXhegu/TjkvYQoiRZK3aax69dGXxgEjpvZW81wIJdxm5Fnvp3VVIP4VHKqX4SvFw6qpmkILkD4RJWAdrt7A== + version "6.4.0" + resolved "https://registry.npmjs.org/@fortawesome/fontawesome-free/-/fontawesome-free-6.4.0.tgz" + integrity sha512-0NyytTlPJwB/BF5LtRV8rrABDbe3TdTXqNB3PdZ+UUUZAEIrdOJdmABqKjt4AXwIoJNaRVVZEXxpNrqvE1GAYQ== "@gar/promisify@^1.0.1", "@gar/promisify@^1.1.3": version "1.1.3" - resolved "https://registry.yarnpkg.com/@gar/promisify/-/promisify-1.1.3.tgz#555193ab2e3bb3b6adc3d551c9c030d9e860daf6" + resolved "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz" integrity sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw== -"@humanwhocodes/config-array@^0.11.6": - version "0.11.7" - resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.7.tgz#38aec044c6c828f6ed51d5d7ae3d9b9faf6dbb0f" - integrity sha512-kBbPWzN8oVMLb0hOUYXhmxggL/1cJE6ydvjDIGi9EnAGUyA7cLVKQg+d/Dsm+KZwx2czGHrCmMVLiyg8s5JPKw== +"@humanwhocodes/config-array@^0.11.8": + version "0.11.8" + resolved "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz" + integrity sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g== dependencies: "@humanwhocodes/object-schema" "^1.2.1" debug "^4.1.1" @@ -1587,22 +1577,22 @@ "@humanwhocodes/module-importer@^1.0.1": version "1.0.1" - resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" + resolved "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz" integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== "@humanwhocodes/object-schema@^1.2.1": version "1.2.1" - resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45" + resolved "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz" integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== "@iiif/vocabulary@^1.0.26": version "1.0.26" - resolved "https://registry.yarnpkg.com/@iiif/vocabulary/-/vocabulary-1.0.26.tgz#557fab623100ca860daeddf6e4de46a8f94aaf86" + resolved "https://registry.npmjs.org/@iiif/vocabulary/-/vocabulary-1.0.26.tgz" integrity sha512-yOsMDg5C90iMfD5HSydoTDzmOM/ki5zGiu4DbHpzRueM7D+12IcDHeai2A8QvEroS8HCJl5M1Edbju5rOlPIpg== "@istanbuljs/load-nyc-config@^1.0.0": version "1.1.0" - resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced" + resolved "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz" integrity sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ== dependencies: camelcase "^5.3.1" @@ -1613,72 +1603,85 @@ "@istanbuljs/schema@^0.1.2": version "0.1.3" - resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" + resolved "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz" integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== "@jridgewell/gen-mapping@^0.1.0": version "0.1.1" - resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz#e5d2e450306a9491e3bd77e323e38d7aff315996" + resolved "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz" integrity sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w== dependencies: "@jridgewell/set-array" "^1.0.0" "@jridgewell/sourcemap-codec" "^1.4.10" "@jridgewell/gen-mapping@^0.3.0", "@jridgewell/gen-mapping@^0.3.2": - version "0.3.2" - resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz#c1aedc61e853f2bb9f5dfe6d4442d3b565b253b9" - integrity sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A== + version "0.3.3" + resolved "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz" + integrity sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ== dependencies: "@jridgewell/set-array" "^1.0.1" "@jridgewell/sourcemap-codec" "^1.4.10" "@jridgewell/trace-mapping" "^0.3.9" -"@jridgewell/resolve-uri@3.1.0": +"@jridgewell/resolve-uri@^3.0.3", "@jridgewell/resolve-uri@3.1.0": version "3.1.0" - resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78" + resolved "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz" integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== "@jridgewell/set-array@^1.0.0", "@jridgewell/set-array@^1.0.1": version "1.1.2" - resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" + resolved "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz" integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== "@jridgewell/source-map@^0.3.2": - version "0.3.2" - resolved "https://registry.yarnpkg.com/@jridgewell/source-map/-/source-map-0.3.2.tgz#f45351aaed4527a298512ec72f81040c998580fb" - integrity sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw== + version "0.3.3" + resolved "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.3.tgz" + integrity sha512-b+fsZXeLYi9fEULmfBrhxn4IrPlINf8fiNarzTof004v3lFdntdwa9PF7vFJqm3mg7s+ScJMxXaE3Acp1irZcg== dependencies: "@jridgewell/gen-mapping" "^0.3.0" "@jridgewell/trace-mapping" "^0.3.9" -"@jridgewell/sourcemap-codec@1.4.14", "@jridgewell/sourcemap-codec@^1.4.10": +"@jridgewell/sourcemap-codec@^1.4.10": + version "1.4.15" + resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz" + integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== + +"@jridgewell/sourcemap-codec@1.4.14": version "1.4.14" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24" + resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz" integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== -"@jridgewell/trace-mapping@^0.3.14", "@jridgewell/trace-mapping@^0.3.9": - version "0.3.17" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz#793041277af9073b0951a7fe0f0d8c4c98c36985" - integrity sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g== +"@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.9": + version "0.3.18" + resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz" + integrity sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA== dependencies: "@jridgewell/resolve-uri" "3.1.0" "@jridgewell/sourcemap-codec" "1.4.14" +"@jridgewell/trace-mapping@0.3.9": + version "0.3.9" + resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz" + integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== + dependencies: + "@jridgewell/resolve-uri" "^3.0.3" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@kolkov/ngx-gallery@^2.0.1": version "2.0.1" - resolved "https://registry.yarnpkg.com/@kolkov/ngx-gallery/-/ngx-gallery-2.0.1.tgz#6c7903b4fc4719b093ef8a782aff731fe38ea320" + resolved "https://registry.npmjs.org/@kolkov/ngx-gallery/-/ngx-gallery-2.0.1.tgz" integrity sha512-mTigRy9Ha7bqCF/+GNKeW2Oe8ZILuM5GGMw+ZbvTQWq3X5hngeFFgv8GFG49Py3biX67kb0NhqCP+msLe4wbXQ== dependencies: tslib "^2.3.0" "@leichtgewicht/ip-codec@^2.0.1": version "2.0.4" - resolved "https://registry.yarnpkg.com/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz#b2ac626d6cb9c8718ab459166d4bb405b8ffa78b" + resolved "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz" integrity sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A== -"@material-ui/core@^4.11.0": +"@material-ui/core@^4.0.0", "@material-ui/core@^4.11.0", "@material-ui/core@^4.12.1", "@material-ui/core@^4.7.2": version "4.12.4" - resolved "https://registry.yarnpkg.com/@material-ui/core/-/core-4.12.4.tgz#4ac17488e8fcaf55eb6a7f5efb2a131e10138a73" + resolved "https://registry.npmjs.org/@material-ui/core/-/core-4.12.4.tgz" integrity sha512-tr7xekNlM9LjA6pagJmL8QCgZXaubWUwkJnoYcMKd4gw/t4XiyvnTkjdGrUVicyB2BsdaAv1tvow45bPM4sSwQ== dependencies: "@babel/runtime" "^7.4.4" @@ -1694,16 +1697,16 @@ react-is "^16.8.0 || ^17.0.0" react-transition-group "^4.4.0" -"@material-ui/icons@^4.9.1": +"@material-ui/icons@^4.5.1", "@material-ui/icons@^4.9.1": version "4.11.3" - resolved "https://registry.yarnpkg.com/@material-ui/icons/-/icons-4.11.3.tgz#b0693709f9b161ce9ccde276a770d968484ecff1" + resolved "https://registry.npmjs.org/@material-ui/icons/-/icons-4.11.3.tgz" integrity sha512-IKHlyx6LDh8n19vzwH5RtHIOHl9Tu90aAAxcbWME6kp4dmvODM3UvOHJeMIDzUbd4muuJKHmlNoBN+mDY4XkBA== dependencies: "@babel/runtime" "^7.4.4" "@material-ui/lab@^4.0.0-alpha.53": version "4.0.0-alpha.61" - resolved "https://registry.yarnpkg.com/@material-ui/lab/-/lab-4.0.0-alpha.61.tgz#9bf8eb389c0c26c15e40933cc114d4ad85e3d978" + resolved "https://registry.npmjs.org/@material-ui/lab/-/lab-4.0.0-alpha.61.tgz" integrity sha512-rSzm+XKiNUjKegj8bzt5+pygZeckNLOr+IjykH8sYdVk7dE9y2ZuUSofiMV2bJk3qU+JHwexmw+q0RyNZB9ugg== dependencies: "@babel/runtime" "^7.4.4" @@ -1714,7 +1717,7 @@ "@material-ui/styles@^4.11.5": version "4.11.5" - resolved "https://registry.yarnpkg.com/@material-ui/styles/-/styles-4.11.5.tgz#19f84457df3aafd956ac863dbe156b1d88e2bbfb" + resolved "https://registry.npmjs.org/@material-ui/styles/-/styles-4.11.5.tgz" integrity sha512-o/41ot5JJiUsIETME9wVLAJrmIWL3j0R0Bj2kCOLbSfqEkKf0fmaPt+5vtblUh5eXr2S+J/8J3DaCb10+CzPGA== dependencies: "@babel/runtime" "^7.4.4" @@ -1736,7 +1739,7 @@ "@material-ui/system@^4.12.2": version "4.12.2" - resolved "https://registry.yarnpkg.com/@material-ui/system/-/system-4.12.2.tgz#f5c389adf3fce4146edd489bf4082d461d86aa8b" + resolved "https://registry.npmjs.org/@material-ui/system/-/system-4.12.2.tgz" integrity sha512-6CSKu2MtmiJgcCGf6nBQpM8fLkuB9F55EKfbdTC80NND5wpTmKzwdhLYLH3zL4cLlK0gVaaltW7/wMuyTnN0Lw== dependencies: "@babel/runtime" "^7.4.4" @@ -1746,12 +1749,12 @@ "@material-ui/types@5.1.0": version "5.1.0" - resolved "https://registry.yarnpkg.com/@material-ui/types/-/types-5.1.0.tgz#efa1c7a0b0eaa4c7c87ac0390445f0f88b0d88f2" + resolved "https://registry.npmjs.org/@material-ui/types/-/types-5.1.0.tgz" integrity sha512-7cqRjrY50b8QzRSYyhSpx4WRw2YuO0KKIGQEVk5J8uoz2BanawykgZGoWEqKm7pVIbzFDN0SpPcVV4IhOFkl8A== "@material-ui/utils@^4.11.3": version "4.11.3" - resolved "https://registry.yarnpkg.com/@material-ui/utils/-/utils-4.11.3.tgz#232bd86c4ea81dab714f21edad70b7fdf0253942" + resolved "https://registry.npmjs.org/@material-ui/utils/-/utils-4.11.3.tgz" integrity sha512-ZuQPV4rBK/V1j2dIkSSEcH5uT6AaHuKWFfotADHsC0wVL1NLd2WkFCm4ZZbX33iO4ydl6V0GPngKm8HZQ2oujg== dependencies: "@babel/runtime" "^7.4.4" @@ -1760,61 +1763,61 @@ "@ng-bootstrap/ng-bootstrap@^11.0.0": version "11.0.1" - resolved "https://registry.yarnpkg.com/@ng-bootstrap/ng-bootstrap/-/ng-bootstrap-11.0.1.tgz#6113b09bfb9b722f7ebf4b97d17e6addd0fd9e2f" + resolved "https://registry.npmjs.org/@ng-bootstrap/ng-bootstrap/-/ng-bootstrap-11.0.1.tgz" integrity sha512-xpXpW2x2S9ZQhEu5kCmEAFf8WvkVD+rcKb1NLQiLuiZgAQR7GXVexXy5Y+RIvTjAQmPEVyxaSgYiJA6sWNJLNw== dependencies: tslib "^2.3.0" "@ng-dynamic-forms/core@^15.0.0": version "15.0.0" - resolved "https://registry.yarnpkg.com/@ng-dynamic-forms/core/-/core-15.0.0.tgz#674a88c253aa100b30144bf7ebf518e24b72f553" + resolved "https://registry.npmjs.org/@ng-dynamic-forms/core/-/core-15.0.0.tgz" integrity sha512-JJ0w8WdOA+wsHyt/hwitGhv/e1j95/TlRS82vvZetP/Ip3kjvD/Ge8jbg4bEssIAXZjfBqS/Gy00Hxo4h57DgQ== dependencies: tslib "^2.0.0" "@ng-dynamic-forms/ui-ng-bootstrap@^15.0.0": version "15.0.0" - resolved "https://registry.yarnpkg.com/@ng-dynamic-forms/ui-ng-bootstrap/-/ui-ng-bootstrap-15.0.0.tgz#0ab5614bc2efccc4cddbb384865b66d4740bcd3d" + resolved "https://registry.npmjs.org/@ng-dynamic-forms/ui-ng-bootstrap/-/ui-ng-bootstrap-15.0.0.tgz" integrity sha512-b/+tOJxtDRMzoFA7KLA8JRxbAnXd8d8072/P6C+2xOMaG0Ttc1UUiNQOZ5w82y78nr0bZ63oFHSR0xzSVtMXnA== dependencies: tslib "^2.0.0" "@ngrx/effects@^13.0.2": version "13.2.0" - resolved "https://registry.yarnpkg.com/@ngrx/effects/-/effects-13.2.0.tgz#36aba5af45ac034419509f799ed70acdb80228b1" + resolved "https://registry.npmjs.org/@ngrx/effects/-/effects-13.2.0.tgz" integrity sha512-HmWggpl3xGQFfUzON/uel5jSyUWsrGZsR5qR/oFLGjPRWzwKfdHrl0OcBl5IhFgFxT74cAi9F4JTICUytGRbFA== dependencies: tslib "^2.0.0" "@ngrx/router-store@^13.0.2": version "13.2.0" - resolved "https://registry.yarnpkg.com/@ngrx/router-store/-/router-store-13.2.0.tgz#ba6abfe8adfa5e5a5b981196347cf4339249612f" + resolved "https://registry.npmjs.org/@ngrx/router-store/-/router-store-13.2.0.tgz" integrity sha512-ojHxsGsHljYWiqv/OUQHFLb4ZNvmsBlF+CHGZ7vCwLYJ2d9TB2y5nOezfaZ1L46MLUp+uM3FD3fpnIFwXYsTNw== dependencies: tslib "^2.0.0" "@ngrx/store-devtools@^13.0.2": version "13.2.0" - resolved "https://registry.yarnpkg.com/@ngrx/store-devtools/-/store-devtools-13.2.0.tgz#69193e32aee141397d7d2c11c43278e3fa5191e7" + resolved "https://registry.npmjs.org/@ngrx/store-devtools/-/store-devtools-13.2.0.tgz" integrity sha512-k1NifkR/4OjbjAxauVZODCsgs2owMJXvEX2XoTWth7zscbHE8L3pLd0k1ox5pMPUEqWIptWTaJDzYqnQSoJaaw== dependencies: tslib "^2.0.0" -"@ngrx/store@^13.0.2": +"@ngrx/store@^13.0.2", "@ngrx/store@13.2.0": version "13.2.0" - resolved "https://registry.yarnpkg.com/@ngrx/store/-/store-13.2.0.tgz#43d4e9bf064808dd546ef1edbbcd08c2a8e0871a" + resolved "https://registry.npmjs.org/@ngrx/store/-/store-13.2.0.tgz" integrity sha512-3wlGMkfe0EXsiS6E6W0wCksuGapa5Z6JVFvKQMHFpXZ3XeixXKlULnemlcdMT7Yrnry+CGOtRHqkmKxLoQzhTw== dependencies: tslib "^2.0.0" -"@ngtools/webpack@13.3.10", "@ngtools/webpack@^13.2.6": - version "13.3.10" - resolved "https://registry.yarnpkg.com/@ngtools/webpack/-/webpack-13.3.10.tgz#442c0d41dc65e851816e2f5a1c6870db8e103f9e" - integrity sha512-QQ8ELLqW5PtvrEAMt99D0s982NW303k8UpZrQoQ9ODgnSVDMdbbzFPNTXq/20dg+nbp8nlOakUrkjB47TBwTNA== +"@ngtools/webpack@^13.2.6", "@ngtools/webpack@13.3.11": + version "13.3.11" + resolved "https://registry.npmjs.org/@ngtools/webpack/-/webpack-13.3.11.tgz" + integrity sha512-gB33hTbc/RJmHyIgSUYj8ErPazhYYm7yfapOnvwHdYhCjrj1TKkR1ierOlhJtpfBYUQg6FChdl2YpyIQNPjWMA== "@nguniversal/builders@^13.1.1": version "13.1.1" - resolved "https://registry.yarnpkg.com/@nguniversal/builders/-/builders-13.1.1.tgz#e0571957f443b226833c4b17fdbb3a89d324a5e2" + resolved "https://registry.npmjs.org/@nguniversal/builders/-/builders-13.1.1.tgz" integrity sha512-R73GKHr7KeTIBE/kSudhsN0V1gx+TrnM28RHdzw3eHCz2Q3msGpgdt/79+2EjLcvWjoVHOsD+aFIJ9+sx422yQ== dependencies: "@angular-devkit/architect" "^0.1303.0" @@ -1831,7 +1834,7 @@ "@nguniversal/common@13.1.1": version "13.1.1" - resolved "https://registry.yarnpkg.com/@nguniversal/common/-/common-13.1.1.tgz#5f8c144f41a5f867c8d051d2ebfa052f10ac22fd" + resolved "https://registry.npmjs.org/@nguniversal/common/-/common-13.1.1.tgz" integrity sha512-DoAPA7+kUz+qMgCTUtRPFcMGY0zz8OSkOTZnxqO5sUYntD6mCEQImHU0WF4ud88j71o0Hv+AISJD1evAAANCdw== dependencies: critters "0.0.16" @@ -1840,7 +1843,7 @@ "@nguniversal/express-engine@^13.0.2": version "13.1.1" - resolved "https://registry.yarnpkg.com/@nguniversal/express-engine/-/express-engine-13.1.1.tgz#7c84056f73701a9dd8fa08544af73db7f9eb857e" + resolved "https://registry.npmjs.org/@nguniversal/express-engine/-/express-engine-13.1.1.tgz" integrity sha512-NdiBP0IRbPrNYEMLy3a6os2mNgRNE84tsMn+mV2uF4wv1JNs3YyoXcucWvhgHdODbDtc6z4CGn8t/6KagRqmvA== dependencies: "@nguniversal/common" "13.1.1" @@ -1848,34 +1851,34 @@ "@ngx-translate/core@^13.0.0": version "13.0.0" - resolved "https://registry.yarnpkg.com/@ngx-translate/core/-/core-13.0.0.tgz#60547cb8a0845a2a0abfde6b0bf5ec6516a63fd6" + resolved "https://registry.npmjs.org/@ngx-translate/core/-/core-13.0.0.tgz" integrity sha512-+tzEp8wlqEnw0Gc7jtVRAJ6RteUjXw6JJR4O65KlnxOmJrCGPI0xjV/lKRnQeU0w4i96PQs/jtpL921Wrb7PWg== dependencies: tslib "^2.0.0" "@nicky-lenaers/ngx-scroll-to@^13.0.0": version "13.0.0" - resolved "https://registry.yarnpkg.com/@nicky-lenaers/ngx-scroll-to/-/ngx-scroll-to-13.0.0.tgz#da81253dafc872002786a26e1b82e29be1ca22a1" + resolved "https://registry.npmjs.org/@nicky-lenaers/ngx-scroll-to/-/ngx-scroll-to-13.0.0.tgz" integrity sha512-sF/F4yoHvOtEGkt58VJYbQVITbW0ivmQA+CJGzc9mnJS6XHFnc4be9rlCX3mz7mOn3FfEs+K80MnUivZ/EHfkQ== dependencies: tslib "^2.3.0" "@nodelib/fs.scandir@2.1.5": version "2.1.5" - resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" + resolved "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz" integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== dependencies: "@nodelib/fs.stat" "2.0.5" run-parallel "^1.1.9" -"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": +"@nodelib/fs.stat@^2.0.2", "@nodelib/fs.stat@2.0.5": version "2.0.5" - resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" + resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz" integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== "@nodelib/fs.walk@^1.2.3", "@nodelib/fs.walk@^1.2.8": version "1.2.8" - resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" + resolved "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz" integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== dependencies: "@nodelib/fs.scandir" "2.1.5" @@ -1883,7 +1886,7 @@ "@npmcli/fs@^1.0.0": version "1.1.1" - resolved "https://registry.yarnpkg.com/@npmcli/fs/-/fs-1.1.1.tgz#72f719fe935e687c56a4faecf3c03d06ba593257" + resolved "https://registry.npmjs.org/@npmcli/fs/-/fs-1.1.1.tgz" integrity sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ== dependencies: "@gar/promisify" "^1.0.1" @@ -1891,7 +1894,7 @@ "@npmcli/fs@^2.1.0": version "2.1.2" - resolved "https://registry.yarnpkg.com/@npmcli/fs/-/fs-2.1.2.tgz#a9e2541a4a2fec2e69c29b35e6060973da79b865" + resolved "https://registry.npmjs.org/@npmcli/fs/-/fs-2.1.2.tgz" integrity sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ== dependencies: "@gar/promisify" "^1.1.3" @@ -1899,7 +1902,7 @@ "@npmcli/git@^2.1.0": version "2.1.0" - resolved "https://registry.yarnpkg.com/@npmcli/git/-/git-2.1.0.tgz#2fbd77e147530247d37f325930d457b3ebe894f6" + resolved "https://registry.npmjs.org/@npmcli/git/-/git-2.1.0.tgz" integrity sha512-/hBFX/QG1b+N7PZBFs0bi+evgRZcK9nWBxQKZkGoXUT5hJSwl5c4d7y8/hm+NQZRPhQ67RzFaj5UM9YeyKoryw== dependencies: "@npmcli/promise-spawn" "^1.3.2" @@ -1913,7 +1916,7 @@ "@npmcli/installed-package-contents@^1.0.6": version "1.0.7" - resolved "https://registry.yarnpkg.com/@npmcli/installed-package-contents/-/installed-package-contents-1.0.7.tgz#ab7408c6147911b970a8abe261ce512232a3f4fa" + resolved "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-1.0.7.tgz" integrity sha512-9rufe0wnJusCQoLpV9ZPKIVP55itrM5BxOXs10DmdbRfgWtHy1LDyskbwRnBghuB0PrF7pNPOqREVtpz4HqzKw== dependencies: npm-bundled "^1.1.1" @@ -1921,7 +1924,7 @@ "@npmcli/move-file@^1.0.1": version "1.1.2" - resolved "https://registry.yarnpkg.com/@npmcli/move-file/-/move-file-1.1.2.tgz#1a82c3e372f7cae9253eb66d72543d6b8685c674" + resolved "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.1.2.tgz" integrity sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg== dependencies: mkdirp "^1.0.4" @@ -1929,7 +1932,7 @@ "@npmcli/move-file@^2.0.0": version "2.0.1" - resolved "https://registry.yarnpkg.com/@npmcli/move-file/-/move-file-2.0.1.tgz#26f6bdc379d87f75e55739bab89db525b06100e4" + resolved "https://registry.npmjs.org/@npmcli/move-file/-/move-file-2.0.1.tgz" integrity sha512-mJd2Z5TjYWq/ttPLLGqArdtnC74J6bOzg4rMDnN+p1xTacZ2yPRCk2y0oSWQtygLR9YVQXgOcONrwtnk3JupxQ== dependencies: mkdirp "^1.0.4" @@ -1937,19 +1940,19 @@ "@npmcli/node-gyp@^1.0.2": version "1.0.3" - resolved "https://registry.yarnpkg.com/@npmcli/node-gyp/-/node-gyp-1.0.3.tgz#a912e637418ffc5f2db375e93b85837691a43a33" + resolved "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-1.0.3.tgz" integrity sha512-fnkhw+fmX65kiLqk6E3BFLXNC26rUhK90zVwe2yncPliVT/Qos3xjhTLE59Df8KnPlcwIERXKVlU1bXoUQ+liA== "@npmcli/promise-spawn@^1.2.0", "@npmcli/promise-spawn@^1.3.2": version "1.3.2" - resolved "https://registry.yarnpkg.com/@npmcli/promise-spawn/-/promise-spawn-1.3.2.tgz#42d4e56a8e9274fba180dabc0aea6e38f29274f5" + resolved "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-1.3.2.tgz" integrity sha512-QyAGYo/Fbj4MXeGdJcFzZ+FkDkomfRBrPM+9QYJSg+PxgAUL+LU3FneQk37rKR2/zjqkCV1BLHccX98wRXG3Sg== dependencies: infer-owner "^1.0.4" "@npmcli/run-script@^2.0.0": version "2.0.0" - resolved "https://registry.yarnpkg.com/@npmcli/run-script/-/run-script-2.0.0.tgz#9949c0cab415b17aaac279646db4f027d6f1e743" + resolved "https://registry.npmjs.org/@npmcli/run-script/-/run-script-2.0.0.tgz" integrity sha512-fSan/Pu11xS/TdaTpTB0MRn9guwGU8dye+x56mEVgBEd/QsybBbYcAL0phPXi8SGWFEChkQd6M9qL4y6VOpFig== dependencies: "@npmcli/node-gyp" "^1.0.2" @@ -1957,16 +1960,16 @@ node-gyp "^8.2.0" read-package-json-fast "^2.0.1" -"@nrwl/cli@*", "@nrwl/cli@15.3.0": - version "15.3.0" - resolved "https://registry.yarnpkg.com/@nrwl/cli/-/cli-15.3.0.tgz#61b145d2ba613f9df4dbb9188e631ca50a4e42cb" - integrity sha512-WAki2+puBp6qel/VAxdQmr/L/sLyw8K6bynYNmMl4eIlR5hjefrUChPzUiJDAS9/CUYQNOyva2VV5wofzdv95w== +"@nrwl/cli@*", "@nrwl/cli@15.9.2": + version "15.9.2" + resolved "https://registry.npmjs.org/@nrwl/cli/-/cli-15.9.2.tgz" + integrity sha512-QoCmyrcGakHAYTJaNBbOerRQAmqJHMYGCdqtQidV+aP9p1Dy33XxDELfhd+IYmGqngutXuEWChNpWNhPloLnoA== dependencies: - nx "15.3.0" + nx "15.9.2" "@nrwl/devkit@13.1.3": version "13.1.3" - resolved "https://registry.yarnpkg.com/@nrwl/devkit/-/devkit-13.1.3.tgz#8b119587984371a4caf0b3601a7481e04bac65a3" + resolved "https://registry.npmjs.org/@nrwl/devkit/-/devkit-13.1.3.tgz" integrity sha512-TAAsZJvVc/obeH0rZKY6miVhyM2GHGb8qIWp9MAIdLlXf4VDcNC7rxwb5OrGVSwuTTjqGYBGPUx0yEogOOJthA== dependencies: "@nrwl/tao" "13.1.3" @@ -1976,9 +1979,14 @@ semver "7.3.4" tslib "^2.0.0" +"@nrwl/nx-darwin-x64@15.9.2": + version "15.9.2" + resolved "https://registry.npmjs.org/@nrwl/nx-darwin-x64/-/nx-darwin-x64-15.9.2.tgz" + integrity sha512-qHfdluHlPzV0UHOwj1ZJ+qNEhzfLGiBuy1cOth4BSzDlvMnkuqBWoprfaXoztzYcus2NSILY1/7b3Jw4DAWmMw== + "@nrwl/tao@13.1.3": version "13.1.3" - resolved "https://registry.yarnpkg.com/@nrwl/tao/-/tao-13.1.3.tgz#5a88029b0aa9dfd4bca0a86d3dde2b608c468b36" + resolved "https://registry.npmjs.org/@nrwl/tao/-/tao-13.1.3.tgz" integrity sha512-/IwJgSgCBD1SaF+n8RuXX2OxDAh8ut/+P8pMswjm8063ac30UlAHjQ4XTYyskLH8uoUmNi2hNaGgHUrkwt7tQA== dependencies: chalk "4.1.0" @@ -1993,16 +2001,16 @@ tslib "^2.0.0" yargs-parser "20.0.0" -"@nrwl/tao@15.3.0": - version "15.3.0" - resolved "https://registry.yarnpkg.com/@nrwl/tao/-/tao-15.3.0.tgz#20266f1269815cb28e21677b0aa7f913a7e31b17" - integrity sha512-alyzKKSgfgPwQ/FUozvk43VGOZHyNMiSM6Udl49ZaQwT77GXRFkrOu21odW6dciWPd3iUOUjfJISNqrEJmxvpw== +"@nrwl/tao@15.9.2": + version "15.9.2" + resolved "https://registry.npmjs.org/@nrwl/tao/-/tao-15.9.2.tgz" + integrity sha512-+LqNC37w9c6q6Ukdpf0z0tt1PQFNi4gwhHpJvkYQiKRETHjyrrlyqTNEPEyA7PI62RuYC6VrpVw2gzI7ufqZEA== dependencies: - nx "15.3.0" + nx "15.9.2" "@parcel/watcher@2.0.4": version "2.0.4" - resolved "https://registry.yarnpkg.com/@parcel/watcher/-/watcher-2.0.4.tgz#f300fef4cc38008ff4b8c29d92588eced3ce014b" + resolved "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.0.4.tgz" integrity sha512-cTDi+FUDBIUOBKEtj+nhiJ71AZVlkAsQFuGQTun5tV9mwQBQgZvhCzG+URPQc8myeN32yRVZEfVAPCs1RW+Jvg== dependencies: node-addon-api "^3.2.1" @@ -2010,28 +2018,28 @@ "@polka/url@^1.0.0-next.20": version "1.0.0-next.21" - resolved "https://registry.yarnpkg.com/@polka/url/-/url-1.0.0-next.21.tgz#5de5a2385a35309427f6011992b544514d559aa1" + resolved "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.21.tgz" integrity sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g== "@react-dnd/asap@^4.0.0": version "4.0.1" - resolved "https://registry.yarnpkg.com/@react-dnd/asap/-/asap-4.0.1.tgz#5291850a6b58ce6f2da25352a64f1b0674871aab" + resolved "https://registry.npmjs.org/@react-dnd/asap/-/asap-4.0.1.tgz" integrity sha512-kLy0PJDDwvwwTXxqTFNAAllPHD73AycE9ypWeln/IguoGBEbvFcPDbCV03G52bEcC5E+YgupBE0VzHGdC8SIXg== "@react-dnd/invariant@^2.0.0": version "2.0.0" - resolved "https://registry.yarnpkg.com/@react-dnd/invariant/-/invariant-2.0.0.tgz#09d2e81cd39e0e767d7da62df9325860f24e517e" + resolved "https://registry.npmjs.org/@react-dnd/invariant/-/invariant-2.0.0.tgz" integrity sha512-xL4RCQBCBDJ+GRwKTFhGUW8GXa4yoDfJrPbLblc3U09ciS+9ZJXJ3Qrcs/x2IODOdIE5kQxvMmE2UKyqUictUw== "@react-dnd/shallowequal@^2.0.0": version "2.0.0" - resolved "https://registry.yarnpkg.com/@react-dnd/shallowequal/-/shallowequal-2.0.0.tgz#a3031eb54129f2c66b2753f8404266ec7bf67f0a" + resolved "https://registry.npmjs.org/@react-dnd/shallowequal/-/shallowequal-2.0.0.tgz" integrity sha512-Pc/AFTdwZwEKJxFJvlxrSmGe/di+aAOBn60sremrpLo6VI/6cmiUYNNwlI5KNYttg7uypzA3ILPMPgxB2GYZEg== -"@redux-saga/core@^1.2.1": - version "1.2.1" - resolved "https://registry.yarnpkg.com/@redux-saga/core/-/core-1.2.1.tgz#3680989621517d075a2cc85e0d2744b682990ed8" - integrity sha512-ABCxsZy9DwmNoYNo54ZlfuTvh77RXx8ODKpxOHeWam2dOaLGQ7vAktpfOtqSeTdYrKEORtTeWnxkGJMmPOoukg== +"@redux-saga/core@^1.2.3": + version "1.2.3" + resolved "https://registry.npmjs.org/@redux-saga/core/-/core-1.2.3.tgz" + integrity sha512-U1JO6ncFBAklFTwoQ3mjAeQZ6QGutsJzwNBjgVLSWDpZTRhobUzuVDS1qH3SKGJD8fvqoaYOjp6XJ3gCmeZWgA== dependencies: "@babel/runtime" "^7.6.3" "@redux-saga/deferred" "^1.2.1" @@ -2044,19 +2052,19 @@ "@redux-saga/deferred@^1.2.1": version "1.2.1" - resolved "https://registry.yarnpkg.com/@redux-saga/deferred/-/deferred-1.2.1.tgz#aca373a08ccafd6f3481037f2f7ee97f2c87c3ec" + resolved "https://registry.npmjs.org/@redux-saga/deferred/-/deferred-1.2.1.tgz" integrity sha512-cmin3IuuzMdfQjA0lG4B+jX+9HdTgHZZ+6u3jRAOwGUxy77GSlTi4Qp2d6PM1PUoTmQUR5aijlA39scWWPF31g== "@redux-saga/delay-p@^1.2.1": version "1.2.1" - resolved "https://registry.yarnpkg.com/@redux-saga/delay-p/-/delay-p-1.2.1.tgz#e72ac4731c5080a21f75b61bedc31cb639d9e446" + resolved "https://registry.npmjs.org/@redux-saga/delay-p/-/delay-p-1.2.1.tgz" integrity sha512-MdiDxZdvb1m+Y0s4/hgdcAXntpUytr9g0hpcOO1XFVyyzkrDu3SKPgBFOtHn7lhu7n24ZKIAT1qtKyQjHqRd+w== dependencies: "@redux-saga/symbols" "^1.1.3" "@redux-saga/is@^1.1.3": version "1.1.3" - resolved "https://registry.yarnpkg.com/@redux-saga/is/-/is-1.1.3.tgz#b333f31967e87e32b4e6b02c75b78d609dd4ad73" + resolved "https://registry.npmjs.org/@redux-saga/is/-/is-1.1.3.tgz" integrity sha512-naXrkETG1jLRfVfhOx/ZdLj0EyAzHYbgJWkXbB3qFliPcHKiWbv/ULQryOAEKyjrhiclmr6AMdgsXFyx7/yE6Q== dependencies: "@redux-saga/symbols" "^1.1.3" @@ -2064,80 +2072,80 @@ "@redux-saga/symbols@^1.1.3": version "1.1.3" - resolved "https://registry.yarnpkg.com/@redux-saga/symbols/-/symbols-1.1.3.tgz#b731d56201719e96dc887dc3ae9016e761654367" + resolved "https://registry.npmjs.org/@redux-saga/symbols/-/symbols-1.1.3.tgz" integrity sha512-hCx6ZvU4QAEUojETnX8EVg4ubNLBFl1Lps4j2tX7o45x/2qg37m3c6v+kSp8xjDJY+2tJw4QB3j8o8dsl1FDXg== "@redux-saga/types@^1.2.1": version "1.2.1" - resolved "https://registry.yarnpkg.com/@redux-saga/types/-/types-1.2.1.tgz#9403f51c17cae37edf870c6bc0c81c1ece5ccef8" + resolved "https://registry.npmjs.org/@redux-saga/types/-/types-1.2.1.tgz" integrity sha512-1dgmkh+3so0+LlBWRhGA33ua4MYr7tUOj+a9Si28vUi0IUFNbff1T3sgpeDJI/LaC75bBYnQ0A3wXjn0OrRNBA== "@researchgate/react-intersection-observer@^1.0.0": version "1.3.5" - resolved "https://registry.yarnpkg.com/@researchgate/react-intersection-observer/-/react-intersection-observer-1.3.5.tgz#0321d2dd609aaacdb9bace8004d99c72824fb142" + resolved "https://registry.npmjs.org/@researchgate/react-intersection-observer/-/react-intersection-observer-1.3.5.tgz" integrity sha512-aYlsex5Dd6BAHMJvJrUoFp8gzgMSL27xFvrxkVYW0bV1RMAapVsO+QeYLtTaSF/QCflktODodvv+wJm49oMnnQ== "@scarf/scarf@^1.1.0": version "1.1.1" - resolved "https://registry.yarnpkg.com/@scarf/scarf/-/scarf-1.1.1.tgz#d8b9f20037b3a37dbf8dcdc4b3b72f9285bfce35" + resolved "https://registry.npmjs.org/@scarf/scarf/-/scarf-1.1.1.tgz" integrity sha512-VGbKDbk1RFIaSmdVb0cNjjWJoRWRI/Weo23AjRCC2nryO0iAS8pzsToJfPVPtVs74WHw4L1UTADNdIYRLkirZQ== -"@schematics/angular@13.3.10": - version "13.3.10" - resolved "https://registry.yarnpkg.com/@schematics/angular/-/angular-13.3.10.tgz#7d646ebfaf28bb1a6960493b11f5914f546a3ad5" - integrity sha512-sw6K8YihfcqNyfa2/65ACPixZHQJRBw1aNm8w0DRGFyO3aXRe9G5X23MkCMLH+63oK9R1cK63/fZ8zqfdSq7zA== - dependencies: - "@angular-devkit/core" "13.3.10" - "@angular-devkit/schematics" "13.3.10" - jsonc-parser "3.0.0" - "@schematics/angular@^12.2.17": version "12.2.18" - resolved "https://registry.yarnpkg.com/@schematics/angular/-/angular-12.2.18.tgz#dc6f8f572eaf6e562ec564bb7a52c5c9e38f43cb" + resolved "https://registry.npmjs.org/@schematics/angular/-/angular-12.2.18.tgz" integrity sha512-niRS9Ly9y8uI0YmTSbo8KpdqCCiZ/ATMZWeS2id5M8JZvfXbngwiqJvojdSol0SWU+n1W4iA+lJBdt4gSKlD5w== dependencies: "@angular-devkit/core" "12.2.18" "@angular-devkit/schematics" "12.2.18" jsonc-parser "3.0.0" +"@schematics/angular@13.3.11": + version "13.3.11" + resolved "https://registry.npmjs.org/@schematics/angular/-/angular-13.3.11.tgz" + integrity sha512-imKBnKYEse0SBVELZO/753nkpt3eEgpjrYkB+AFWF9YfO/4RGnYXDHoH8CFkzxPH9QQCgNrmsVFNiYGS+P/S1A== + dependencies: + "@angular-devkit/core" "13.3.11" + "@angular-devkit/schematics" "13.3.11" + jsonc-parser "3.0.0" + "@socket.io/component-emitter@~3.1.0": version "3.1.0" - resolved "https://registry.yarnpkg.com/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz#96116f2a912e0c02817345b3c10751069920d553" + resolved "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz" integrity sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg== "@tootallnate/once@1": version "1.1.2" - resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-1.1.2.tgz#ccb91445360179a04e7fe6aff78c00ffc1eeaf82" + resolved "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz" integrity sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw== "@tootallnate/once@2": version "2.0.0" - resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-2.0.0.tgz#f544a148d3ab35801c1f633a7441fd87c2e484bf" + resolved "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz" integrity sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A== "@tsconfig/node10@^1.0.7": version "1.0.9" - resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.9.tgz#df4907fc07a886922637b15e02d4cebc4c0021b2" + resolved "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz" integrity sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA== "@tsconfig/node12@^1.0.7": version "1.0.11" - resolved "https://registry.yarnpkg.com/@tsconfig/node12/-/node12-1.0.11.tgz#ee3def1f27d9ed66dac6e46a295cffb0152e058d" + resolved "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz" integrity sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag== "@tsconfig/node14@^1.0.0": version "1.0.3" - resolved "https://registry.yarnpkg.com/@tsconfig/node14/-/node14-1.0.3.tgz#e4386316284f00b98435bf40f72f75a09dabf6c1" + resolved "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz" integrity sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow== "@tsconfig/node16@^1.0.2": version "1.0.3" - resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.3.tgz#472eaab5f15c1ffdd7f8628bd4c4f753995ec79e" + resolved "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.3.tgz" integrity sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ== "@types/body-parser@*": version "1.19.2" - resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.2.tgz#aea2059e28b7658639081347ac4fab3de166e6f0" + resolved "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz" integrity sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g== dependencies: "@types/connect" "*" @@ -2145,19 +2153,19 @@ "@types/bonjour@^3.5.9": version "3.5.10" - resolved "https://registry.yarnpkg.com/@types/bonjour/-/bonjour-3.5.10.tgz#0f6aadfe00ea414edc86f5d106357cda9701e275" + resolved "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.10.tgz" integrity sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw== dependencies: "@types/node" "*" "@types/circular-json@^0.4.0": version "0.4.0" - resolved "https://registry.yarnpkg.com/@types/circular-json/-/circular-json-0.4.0.tgz#7401f7e218cfe87ad4c43690da5658b9acaf51be" + resolved "https://registry.npmjs.org/@types/circular-json/-/circular-json-0.4.0.tgz" integrity sha512-7+kYB7x5a7nFWW1YPBh3KxhwKfiaI4PbZ1RvzBU91LZy7lWJO822CI+pqzSre/DZ7KsCuMKdHnLHHFu8AyXbQg== "@types/connect-history-api-fallback@^1.3.5": version "1.3.5" - resolved "https://registry.yarnpkg.com/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.3.5.tgz#d1f7a8a09d0ed5a57aee5ae9c18ab9b803205dae" + resolved "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.3.5.tgz" integrity sha512-h8QJa8xSb1WD4fpKBDcATDNGXghFj6/3GRWG6dhmRcu0RX1Ubasur2Uvx5aeEwlf0MwblEC2bMzzMQntxnw/Cw== dependencies: "@types/express-serve-static-core" "*" @@ -2165,172 +2173,152 @@ "@types/connect@*": version "3.4.35" - resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.35.tgz#5fcf6ae445e4021d1fc2219a4873cc73a3bb2ad1" + resolved "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz" integrity sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ== dependencies: "@types/node" "*" "@types/cookie@^0.4.1": version "0.4.1" - resolved "https://registry.yarnpkg.com/@types/cookie/-/cookie-0.4.1.tgz#bfd02c1f2224567676c1545199f87c3a861d878d" + resolved "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz" integrity sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q== "@types/cors@^2.8.12": version "2.8.13" - resolved "https://registry.yarnpkg.com/@types/cors/-/cors-2.8.13.tgz#b8ade22ba455a1b8cb3b5d3f35910fd204f84f94" + resolved "https://registry.npmjs.org/@types/cors/-/cors-2.8.13.tgz" integrity sha512-RG8AStHlUiV5ysZQKq97copd2UmVYw3/pRMLefISZ3S1hK104Cwm7iLQ3fTKx+lsUH2CE8FlLaYeEA2LSeqYUA== dependencies: "@types/node" "*" "@types/deep-freeze@0.1.2": version "0.1.2" - resolved "https://registry.yarnpkg.com/@types/deep-freeze/-/deep-freeze-0.1.2.tgz#68e5379291910e82c2f0d1629732163c2aa662cc" + resolved "https://registry.npmjs.org/@types/deep-freeze/-/deep-freeze-0.1.2.tgz" integrity sha512-M6x29Vk4681dght4IMnPIcF1SNmeEm0c4uatlTFhp+++H1oDK1THEIzuCC2WeCBVhX+gU0NndsseDS3zaCtlcQ== "@types/ejs@^3.1.1": - version "3.1.1" - resolved "https://registry.yarnpkg.com/@types/ejs/-/ejs-3.1.1.tgz#29c539826376a65e7f7d672d51301f37ed718f6d" - integrity sha512-RQul5wEfY7BjWm0sYY86cmUN/pcXWGyVxWX93DFFJvcrxax5zKlieLwA3T77xJGwNcZW0YW6CYG70p1m8xPFmA== + version "3.1.2" + resolved "https://registry.npmjs.org/@types/ejs/-/ejs-3.1.2.tgz" + integrity sha512-ZmiaE3wglXVWBM9fyVC17aGPkLo/UgaOjEiI2FXQfyczrCefORPxIe+2dVmnmk3zkVIbizjrlQzmPGhSYGXG5g== "@types/eslint-scope@^3.7.3": version "3.7.4" - resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.4.tgz#37fc1223f0786c39627068a12e94d6e6fc61de16" + resolved "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz" integrity sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA== dependencies: "@types/eslint" "*" "@types/estree" "*" "@types/eslint@*": - version "8.4.10" - resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.4.10.tgz#19731b9685c19ed1552da7052b6f668ed7eb64bb" - integrity sha512-Sl/HOqN8NKPmhWo2VBEPm0nvHnu2LL3v9vKo8MEq0EtbJ4eVzGPl41VNPvn5E1i5poMk4/XD8UriLHpJvEP/Nw== + version "8.37.0" + resolved "https://registry.npmjs.org/@types/eslint/-/eslint-8.37.0.tgz" + integrity sha512-Piet7dG2JBuDIfohBngQ3rCt7MgO9xCO4xIMKxBThCq5PNRB91IjlJ10eJVwfoNtvTErmxLzwBZ7rHZtbOMmFQ== dependencies: "@types/estree" "*" "@types/json-schema" "*" -"@types/estree@*": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.0.tgz#5fb2e536c1ae9bf35366eed879e827fa59ca41c2" - integrity sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ== - -"@types/estree@^0.0.51": +"@types/estree@*", "@types/estree@^0.0.51": version "0.0.51" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.51.tgz#cfd70924a25a3fd32b218e5e420e6897e1ac4f40" + resolved "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz" integrity sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ== -"@types/express-serve-static-core@*", "@types/express-serve-static-core@^4.17.18": - version "4.17.31" - resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.31.tgz#a1139efeab4e7323834bb0226e62ac019f474b2f" - integrity sha512-DxMhY+NAsTwMMFHBTtJFNp5qiHKJ7TeqOo23zVEM9alT1Ml27Q3xcTH0xwxn7Q0BbMcVEJOs/7aQtUWupUQN3Q== +"@types/express-serve-static-core@*", "@types/express-serve-static-core@^4.17.33": + version "4.17.33" + resolved "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.33.tgz" + integrity sha512-TPBqmR/HRYI3eC2E5hmiivIzv+bidAfXofM+sbonAGvyDhySGw9/PQZFt2BLOrjUUR++4eJVpx6KnLQK1Fk9tA== dependencies: "@types/node" "*" "@types/qs" "*" "@types/range-parser" "*" "@types/express@*", "@types/express@^4.17.13", "@types/express@^4.17.9": - version "4.17.14" - resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.14.tgz#143ea0557249bc1b3b54f15db4c81c3d4eb3569c" - integrity sha512-TEbt+vaPFQ+xpxFLFssxUDXj5cWCxZJjIcB7Yg0k0GMHGtgtQgpvx/MUQUeAkNbA9AAGrwkAsoeItdTgS7FMyg== + version "4.17.17" + resolved "https://registry.npmjs.org/@types/express/-/express-4.17.17.tgz" + integrity sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q== dependencies: "@types/body-parser" "*" - "@types/express-serve-static-core" "^4.17.18" + "@types/express-serve-static-core" "^4.17.33" "@types/qs" "*" "@types/serve-static" "*" "@types/grecaptcha@^3.0.4": version "3.0.4" - resolved "https://registry.yarnpkg.com/@types/grecaptcha/-/grecaptcha-3.0.4.tgz#3de601f3b0cd0298faf052dd5bd62aff64c2be2e" + resolved "https://registry.npmjs.org/@types/grecaptcha/-/grecaptcha-3.0.4.tgz" integrity sha512-7l1Y8DTGXkx/r4pwU1nMVAR+yD/QC+MCHKXAyEX/7JZhwcN1IED09aZ9vCjjkcGdhSQiu/eJqcXInpl6eEEEwg== "@types/hoist-non-react-statics@^3.3.0", "@types/hoist-non-react-statics@^3.3.1": version "3.3.1" - resolved "https://registry.yarnpkg.com/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz#1124aafe5118cb591977aeb1ceaaed1070eb039f" + resolved "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz" integrity sha512-iMIqiko6ooLrTh1joXodJK5X9xeEALT1kM5G3ZLhD3hszxBdIEd5C75U834D9mLcINgD4OyZf5uQXjkuYydWvA== dependencies: "@types/react" "*" hoist-non-react-statics "^3.3.0" "@types/http-proxy@^1.17.5", "@types/http-proxy@^1.17.8": - version "1.17.9" - resolved "https://registry.yarnpkg.com/@types/http-proxy/-/http-proxy-1.17.9.tgz#7f0e7931343761efde1e2bf48c40f02f3f75705a" - integrity sha512-QsbSjA/fSk7xB+UXlCT3wHBy5ai9wOcNDWwZAtud+jXhwOM3l+EYZh8Lng4+/6n8uar0J7xILzqftJdJ/Wdfkw== + version "1.17.10" + resolved "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.10.tgz" + integrity sha512-Qs5aULi+zV1bwKAg5z1PWnDXWmsn+LxIvUGv6E2+OOMYhclZMO+OXd9pYVf2gLykf2I7IV2u7oTHwChPNsvJ7g== dependencies: "@types/node" "*" "@types/jasmine@~3.6.0": version "3.6.11" - resolved "https://registry.yarnpkg.com/@types/jasmine/-/jasmine-3.6.11.tgz#4b1d77aa9dfc757407cb9e277216d8e83553f09d" + resolved "https://registry.npmjs.org/@types/jasmine/-/jasmine-3.6.11.tgz" integrity sha512-S6pvzQDvMZHrkBz2Mcn/8Du7cpr76PlRJBAoHnSDNbulULsH5dp0Gns+WRyNX5LHejz/ljxK4/vIHK/caHt6SQ== "@types/js-cookie@2.2.6": version "2.2.6" - resolved "https://registry.yarnpkg.com/@types/js-cookie/-/js-cookie-2.2.6.tgz#f1a1cb35aff47bc5cfb05cb0c441ca91e914c26f" + resolved "https://registry.npmjs.org/@types/js-cookie/-/js-cookie-2.2.6.tgz" integrity sha512-+oY0FDTO2GYKEV0YPvSshGq9t7YozVkgvXLty7zogQNuCxBhT9/3INX9Q7H1aRZ4SUDRXAKlJuA4EA5nTt7SNw== "@types/json-schema@*", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": version "7.0.11" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.11.tgz#d421b6c527a3037f7c84433fd2c4229e016863d3" + resolved "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz" integrity sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ== "@types/json5@^0.0.29": version "0.0.29" - resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" + resolved "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz" integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== "@types/lodash@^4.14.165": - version "4.14.191" - resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.191.tgz#09511e7f7cba275acd8b419ddac8da9a6a79e2fa" - integrity sha512-BdZ5BCCvho3EIXw6wUCXHe7rS53AIDPLE+JzwgT+OsJk53oBfbSmZZ7CX4VaRoN78N+TJpFi9QPlfIVNmJYWxQ== + version "4.14.192" + resolved "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.192.tgz" + integrity sha512-km+Vyn3BYm5ytMO13k9KTp27O75rbQ0NFw+U//g+PX7VZyjCioXaRFisqSIJRECljcTv73G3i6BpglNGHgUQ5A== "@types/mime@*": version "3.0.1" - resolved "https://registry.yarnpkg.com/@types/mime/-/mime-3.0.1.tgz#5f8f2bca0a5863cb69bc0b0acd88c96cb1d4ae10" + resolved "https://registry.npmjs.org/@types/mime/-/mime-3.0.1.tgz" integrity sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA== -"@types/node@*": - version "18.14.2" - resolved "https://registry.yarnpkg.com/@types/node/-/node-18.14.2.tgz#c076ed1d7b6095078ad3cf21dfeea951842778b1" - integrity sha512-1uEQxww3DaghA0RxqHx0O0ppVlo43pJhepY51OxuQIKHpjbnYLA7vcdwioNPzIqmC2u3I/dmylcqjlh0e7AyUA== - -"@types/node@>=10.0.0": - version "18.11.11" - resolved "https://registry.yarnpkg.com/@types/node/-/node-18.11.11.tgz#1d455ac0211549a8409d3cdb371cd55cc971e8dc" - integrity sha512-KJ021B1nlQUBLopzZmPBVuGU9un7WJd/W4ya7Ih02B4Uwky5Nja0yGYav2EfYIk0RR2Q9oVhf60S2XR1BCWJ2g== - -"@types/node@^14.14.31": - version "14.18.36" - resolved "https://registry.yarnpkg.com/@types/node/-/node-14.18.36.tgz#c414052cb9d43fab67d679d5f3c641be911f5835" - integrity sha512-FXKWbsJ6a1hIrRxv+FoukuHnGTgEzKYGi7kilfMae96AL9UNkPFNWJEEYWzdRI9ooIkbr4AKldyuSTLql06vLQ== - -"@types/node@^14.14.9": - version "14.18.34" - resolved "https://registry.yarnpkg.com/@types/node/-/node-14.18.34.tgz#cd2e6fa0dbfb08a62582a7b967558e73c32061ec" - integrity sha512-hcU9AIQVHmPnmjRK+XUUYlILlr9pQrsqSrwov/JK1pnf3GTQowVBhx54FbvM0AU/VXGH4i3+vgXS5EguR7fysA== +"@types/node@*", "@types/node@^14.14.31", "@types/node@^14.14.9", "@types/node@>=10.0.0": + version "14.18.42" + resolved "https://registry.npmjs.org/@types/node/-/node-14.18.42.tgz" + integrity sha512-xefu+RBie4xWlK8hwAzGh3npDz/4VhF6icY/shU+zv/1fNn+ZVG7T7CRwe9LId9sAYRPxI+59QBPuKL3WpyGRg== "@types/parse-json@^4.0.0": version "4.0.0" - resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0" + resolved "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz" integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== "@types/prop-types@*": version "15.7.5" - resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.5.tgz#5f19d2b85a98e9558036f6a3cacc8819420f05cf" + resolved "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz" integrity sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w== "@types/qs@*": version "6.9.7" - resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.7.tgz#63bb7d067db107cc1e457c303bc25d511febf6cb" + resolved "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz" integrity sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw== "@types/range-parser@*": version "1.2.4" - resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.4.tgz#cd667bcfdd025213aafb7ca5915a932590acdcdc" + resolved "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz" integrity sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw== "@types/react-redux@^7.1.20": - version "7.1.24" - resolved "https://registry.yarnpkg.com/@types/react-redux/-/react-redux-7.1.24.tgz#6caaff1603aba17b27d20f8ad073e4c077e975c0" - integrity sha512-7FkurKcS1k0FHZEtdbbgN8Oc6b+stGSfZYjQGicofJ0j4U0qIn/jaSvnP2pLwZKiai3/17xqqxkkrxTgN8UNbQ== + version "7.1.25" + resolved "https://registry.npmjs.org/@types/react-redux/-/react-redux-7.1.25.tgz" + integrity sha512-bAGh4e+w5D8dajd6InASVIyCo4pZLJ66oLb80F9OBLO1gKESbZcRCJpTT6uLXX+HAB57zw1WTdwJdAsewuTweg== dependencies: "@types/hoist-non-react-statics" "^3.3.0" "@types/react" "*" @@ -2339,15 +2327,15 @@ "@types/react-transition-group@^4.2.0": version "4.4.5" - resolved "https://registry.yarnpkg.com/@types/react-transition-group/-/react-transition-group-4.4.5.tgz#aae20dcf773c5aa275d5b9f7cdbca638abc5e416" + resolved "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.5.tgz" integrity sha512-juKD/eiSM3/xZYzjuzH6ZwpP+/lejltmiS3QEzV/vmb/Q8+HfDmxu+Baga8UEMGBqV88Nbg4l2hY/K2DkyaLLA== dependencies: "@types/react" "*" -"@types/react@*": - version "18.0.26" - resolved "https://registry.yarnpkg.com/@types/react/-/react-18.0.26.tgz#8ad59fc01fef8eaf5c74f4ea392621749f0b7917" - integrity sha512-hCR3PJQsAIXyxhTNSiDFY//LhnMZWpNNr5etoCqx/iUfGc5gXWtQR2Phl908jVR6uPXacojQWTg4qRpkxTuGug== +"@types/react@*", "@types/react@^16.8.6 || ^17.0.0": + version "18.0.34" + resolved "https://registry.npmjs.org/@types/react/-/react-18.0.34.tgz" + integrity sha512-NO1UO8941541CJl1BeOXi8a9dNKFK09Gnru5ZJqkm4Q3/WoQJtHvmwt0VX0SB9YCEwe7TfSSxDuaNmx6H2BAIQ== dependencies: "@types/prop-types" "*" "@types/scheduler" "*" @@ -2355,80 +2343,80 @@ "@types/retry@0.12.0": version "0.12.0" - resolved "https://registry.yarnpkg.com/@types/retry/-/retry-0.12.0.tgz#2b35eccfcee7d38cd72ad99232fbd58bffb3c84d" + resolved "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz" integrity sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA== "@types/sanitize-html@^2.6.2": - version "2.6.2" - resolved "https://registry.yarnpkg.com/@types/sanitize-html/-/sanitize-html-2.6.2.tgz#9c47960841b9def1e4c9dfebaaab010a3f6e97b9" - integrity sha512-7Lu2zMQnmHHQGKXVvCOhSziQMpa+R2hMHFefzbYoYMHeaXR0uXqNeOc3JeQQQ8/6Xa2Br/P1IQTLzV09xxAiUQ== + version "2.9.0" + resolved "https://registry.npmjs.org/@types/sanitize-html/-/sanitize-html-2.9.0.tgz" + integrity sha512-4fP/kEcKNj2u39IzrxWYuf/FnCCwwQCpif6wwY6ROUS1EPRIfWJjGkY3HIowY1EX/VbX5e86yq8AAE7UPMgATg== dependencies: - htmlparser2 "^6.0.0" + htmlparser2 "^8.0.0" "@types/scheduler@*": - version "0.16.2" - resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.2.tgz#1a62f89525723dde24ba1b01b092bf5df8ad4d39" - integrity sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew== + version "0.16.3" + resolved "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.3.tgz" + integrity sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ== "@types/semver@^7.3.12": version "7.3.13" - resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.3.13.tgz#da4bfd73f49bd541d28920ab0e2bf0ee80f71c91" + resolved "https://registry.npmjs.org/@types/semver/-/semver-7.3.13.tgz" integrity sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw== "@types/serve-index@^1.9.1": version "1.9.1" - resolved "https://registry.yarnpkg.com/@types/serve-index/-/serve-index-1.9.1.tgz#1b5e85370a192c01ec6cec4735cf2917337a6278" + resolved "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.1.tgz" integrity sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg== dependencies: "@types/express" "*" "@types/serve-static@*", "@types/serve-static@^1.13.10": - version "1.15.0" - resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.15.0.tgz#c7930ff61afb334e121a9da780aac0d9b8f34155" - integrity sha512-z5xyF6uh8CbjAu9760KDKsH2FcDxZ2tFCsA4HIMWE6IkiYMXfVoa+4f9KX+FN0ZLsaMw1WNG2ETLA6N+/YA+cg== + version "1.15.1" + resolved "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.1.tgz" + integrity sha512-NUo5XNiAdULrJENtJXZZ3fHtfMolzZwczzBbnAeBbqBwG+LaG6YaJtuwzwGSQZ2wsCrxjEhNNjAkKigy3n8teQ== dependencies: "@types/mime" "*" "@types/node" "*" "@types/sinonjs__fake-timers@8.1.1": version "8.1.1" - resolved "https://registry.yarnpkg.com/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.1.tgz#b49c2c70150141a15e0fa7e79cf1f92a72934ce3" + resolved "https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.1.tgz" integrity sha512-0kSuKjAS0TrGLJ0M/+8MaFkGsQhZpB6pxOmvS3K8FYI72K//YmdfoW9X2qPsAKh1mkwxGD5zib9s1FIFed6E8g== "@types/sizzle@^2.3.2": version "2.3.3" - resolved "https://registry.yarnpkg.com/@types/sizzle/-/sizzle-2.3.3.tgz#ff5e2f1902969d305225a047c8a0fd5c915cebef" + resolved "https://registry.npmjs.org/@types/sizzle/-/sizzle-2.3.3.tgz" integrity sha512-JYM8x9EGF163bEyhdJBpR2QX1R5naCJHC8ucJylJ3w9/CVBaskdQ8WqBf8MmQrd1kRvp/a4TS8HJ+bxzR7ZJYQ== "@types/sockjs@^0.3.33": version "0.3.33" - resolved "https://registry.yarnpkg.com/@types/sockjs/-/sockjs-0.3.33.tgz#570d3a0b99ac995360e3136fd6045113b1bd236f" + resolved "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.33.tgz" integrity sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw== dependencies: "@types/node" "*" "@types/stacktrace-js@^0.0.33": version "0.0.33" - resolved "https://registry.yarnpkg.com/@types/stacktrace-js/-/stacktrace-js-0.0.33.tgz#9b027370ca161b89798f308af77438802546cb39" + resolved "https://registry.npmjs.org/@types/stacktrace-js/-/stacktrace-js-0.0.33.tgz" integrity sha512-aqJ6QM9QThNL4dHBhwl1f9B0oDqiREkYLn9RldghUKsGeFWWGlCsqsRWxbh+hDvvmptMFqc4aIfFIGz9BBu8Qg== "@types/ws@^8.2.2", "@types/ws@^8.5.1": - version "8.5.3" - resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.3.tgz#7d25a1ffbecd3c4f2d35068d0b283c037003274d" - integrity sha512-6YOoWjruKj1uLf3INHH7D3qTXwFfEsg1kf3c0uDdSBJwfa/llkwIjrAGV7j7mVgGNbzTQ3HiHKKDXl6bJPD97w== + version "8.5.4" + resolved "https://registry.npmjs.org/@types/ws/-/ws-8.5.4.tgz" + integrity sha512-zdQDHKUgcX/zBc4GrwsE/7dVdAD8JR4EuiAXiiUhhfyIJXXb2+PrGshFyeXWQPMmmZ2XxgaqclgpIC7eTXc1mg== dependencies: "@types/node" "*" "@types/yauzl@^2.9.1": version "2.10.0" - resolved "https://registry.yarnpkg.com/@types/yauzl/-/yauzl-2.10.0.tgz#b3248295276cf8c6f153ebe6a9aba0c988cb2599" + resolved "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.0.tgz" integrity sha512-Cn6WYCm0tXv8p6k+A8PvbDG763EDpBoTzHdA+Q/MF6H3sapGjCm9NzoaJncJS9tUKSuCoDs9XHxYYsQDgxR6kw== dependencies: "@types/node" "*" -"@typescript-eslint/eslint-plugin@5.11.0": +"@typescript-eslint/eslint-plugin@^5.0.0", "@typescript-eslint/eslint-plugin@5.11.0": version "5.11.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.11.0.tgz#3b866371d8d75c70f9b81535e7f7d3aa26527c7a" + resolved "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.11.0.tgz" integrity sha512-HJh33bgzXe6jGRocOj4FmefD7hRY4itgjzOrSs3JPrTNXsX7j5+nQPciAUj/1nZtwo2kAc3C75jZO+T23gzSGw== dependencies: "@typescript-eslint/scope-manager" "5.11.0" @@ -2443,21 +2431,14 @@ "@typescript-eslint/experimental-utils@5.11.0": version "5.11.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-5.11.0.tgz#e7b2bfd57ddda47c3f658faad57655ed9e01fea0" + resolved "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.11.0.tgz" integrity sha512-EPvC/bU2n1LKtzKWP1AjGWkp7r8tJ8giVlZHIODo6q7SAd6J+/9vjtEKHK2G/Qp+D2IGPsQge+oadDR3CZcFtQ== dependencies: "@typescript-eslint/utils" "5.11.0" -"@typescript-eslint/experimental-utils@^5.0.0": - version "5.45.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-5.45.1.tgz#a2b13d5a655902441589aa135fa17b4d938f9c5e" - integrity sha512-WlXwY9dbmc0Lzu6xQOZ3yN8u/ws/1R8zPC16O217LMZJCbV2hJezqkWMUB+jMwguOJW+cukCDe92vcwwf8zwjQ== - dependencies: - "@typescript-eslint/utils" "5.45.1" - -"@typescript-eslint/parser@5.11.0": +"@typescript-eslint/parser@^5.0.0", "@typescript-eslint/parser@5.11.0": version "5.11.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.11.0.tgz#b4fcaf65513f9b34bdcbffdda055724a5efb7e04" + resolved "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.11.0.tgz" integrity sha512-x0DCjetHZYBRovJdr3U0zG9OOdNXUaFLJ82ehr1AlkArljJuwEsgnud+Q7umlGDFLFrs8tU8ybQDFocp/eX8mQ== dependencies: "@typescript-eslint/scope-manager" "5.11.0" @@ -2467,23 +2448,23 @@ "@typescript-eslint/scope-manager@5.11.0": version "5.11.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.11.0.tgz#f5aef83ff253f457ecbee5f46f762298f0101e4b" + resolved "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.11.0.tgz" integrity sha512-z+K4LlahDFVMww20t/0zcA7gq/NgOawaLuxgqGRVKS0PiZlCTIUtX0EJbC0BK1JtR4CelmkPK67zuCgpdlF4EA== dependencies: "@typescript-eslint/types" "5.11.0" "@typescript-eslint/visitor-keys" "5.11.0" -"@typescript-eslint/scope-manager@5.45.1": - version "5.45.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.45.1.tgz#5b87d025eec7035d879b99c260f03be5c247883c" - integrity sha512-D6fCileR6Iai7E35Eb4Kp+k0iW7F1wxXYrOhX/3dywsOJpJAQ20Fwgcf+P/TDtvQ7zcsWsrJaglaQWDhOMsspQ== +"@typescript-eslint/scope-manager@5.58.0": + version "5.58.0" + resolved "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.58.0.tgz" + integrity sha512-b+w8ypN5CFvrXWQb9Ow9T4/6LC2MikNf1viLkYTiTbkQl46CnR69w7lajz1icW0TBsYmlpg+mRzFJ4LEJ8X9NA== dependencies: - "@typescript-eslint/types" "5.45.1" - "@typescript-eslint/visitor-keys" "5.45.1" + "@typescript-eslint/types" "5.58.0" + "@typescript-eslint/visitor-keys" "5.58.0" "@typescript-eslint/type-utils@5.11.0": version "5.11.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.11.0.tgz#58be0ba73d1f6ef8983d79f7f0bc2209b253fefe" + resolved "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.11.0.tgz" integrity sha512-wDqdsYO6ofLaD4DsGZ0jGwxp4HrzD2YKulpEZXmgN3xo4BHJwf7kq49JTRpV0Gx6bxkSUmc9s0EIK1xPbFFpIA== dependencies: "@typescript-eslint/utils" "5.11.0" @@ -2492,17 +2473,17 @@ "@typescript-eslint/types@5.11.0": version "5.11.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.11.0.tgz#ba345818a2540fdf2755c804dc2158517ab61188" + resolved "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.11.0.tgz" integrity sha512-cxgBFGSRCoBEhvSVLkKw39+kMzUKHlJGVwwMbPcTZX3qEhuXhrjwaZXWMxVfxDgyMm+b5Q5b29Llo2yow8Y7xQ== -"@typescript-eslint/types@5.45.1": - version "5.45.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.45.1.tgz#8e1883041cee23f1bb7e1343b0139f97f6a17c14" - integrity sha512-HEW3U0E5dLjUT+nk7b4lLbOherS1U4ap+b9pfu2oGsW3oPu7genRaY9dDv3nMczC1rbnRY2W/D7SN05wYoGImg== +"@typescript-eslint/types@5.58.0": + version "5.58.0" + resolved "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.58.0.tgz" + integrity sha512-JYV4eITHPzVQMnHZcYJXl2ZloC7thuUHrcUmxtzvItyKPvQ50kb9QXBkgNAt90OYMqwaodQh2kHutWZl1fc+1g== "@typescript-eslint/typescript-estree@5.11.0": version "5.11.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.11.0.tgz#53f9e09b88368191e52020af77c312a4777ffa43" + resolved "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.11.0.tgz" integrity sha512-yVH9hKIv3ZN3lw8m/Jy5I4oXO4ZBMqijcXCdA4mY8ull6TPTAoQnKKrcZ0HDXg7Bsl0Unwwx7jcXMuNZc0m4lg== dependencies: "@typescript-eslint/types" "5.11.0" @@ -2513,22 +2494,36 @@ semver "^7.3.5" tsutils "^3.21.0" -"@typescript-eslint/typescript-estree@5.45.1": - version "5.45.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.45.1.tgz#b3dc37f0c4f0fe73e09917fc735e6f96eabf9ba4" - integrity sha512-76NZpmpCzWVrrb0XmYEpbwOz/FENBi+5W7ipVXAsG3OoFrQKJMiaqsBMbvGRyLtPotGqUfcY7Ur8j0dksDJDng== +"@typescript-eslint/typescript-estree@5.58.0": + version "5.58.0" + resolved "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.58.0.tgz" + integrity sha512-cRACvGTodA+UxnYM2uwA2KCwRL7VAzo45syNysqlMyNyjw0Z35Icc9ihPJZjIYuA5bXJYiJ2YGUB59BqlOZT1Q== dependencies: - "@typescript-eslint/types" "5.45.1" - "@typescript-eslint/visitor-keys" "5.45.1" + "@typescript-eslint/types" "5.58.0" + "@typescript-eslint/visitor-keys" "5.58.0" debug "^4.3.4" globby "^11.1.0" is-glob "^4.0.3" semver "^7.3.7" tsutils "^3.21.0" +"@typescript-eslint/utils@^5.57.0": + version "5.58.0" + resolved "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.58.0.tgz" + integrity sha512-gAmLOTFXMXOC+zP1fsqm3VceKSBQJNzV385Ok3+yzlavNHZoedajjS4UyS21gabJYcobuigQPs/z71A9MdJFqQ== + dependencies: + "@eslint-community/eslint-utils" "^4.2.0" + "@types/json-schema" "^7.0.9" + "@types/semver" "^7.3.12" + "@typescript-eslint/scope-manager" "5.58.0" + "@typescript-eslint/types" "5.58.0" + "@typescript-eslint/typescript-estree" "5.58.0" + eslint-scope "^5.1.1" + semver "^7.3.7" + "@typescript-eslint/utils@5.11.0": version "5.11.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.11.0.tgz#d91548ef180d74c95d417950336d9260fdbe1dc5" + resolved "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.11.0.tgz" integrity sha512-g2I480tFE1iYRDyMhxPAtLQ9HAn0jjBtipgTCZmd9I9s11OV8CTsG+YfFciuNDcHqm4csbAgC2aVZCHzLxMSUw== dependencies: "@types/json-schema" "^7.0.9" @@ -2538,39 +2533,25 @@ eslint-scope "^5.1.1" eslint-utils "^3.0.0" -"@typescript-eslint/utils@5.45.1": - version "5.45.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.45.1.tgz#39610c98bde82c4792f2a858b29b7d0053448be2" - integrity sha512-rlbC5VZz68+yjAzQBc4I7KDYVzWG2X/OrqoZrMahYq3u8FFtmQYc+9rovo/7wlJH5kugJ+jQXV5pJMnofGmPRw== - dependencies: - "@types/json-schema" "^7.0.9" - "@types/semver" "^7.3.12" - "@typescript-eslint/scope-manager" "5.45.1" - "@typescript-eslint/types" "5.45.1" - "@typescript-eslint/typescript-estree" "5.45.1" - eslint-scope "^5.1.1" - eslint-utils "^3.0.0" - semver "^7.3.7" - "@typescript-eslint/visitor-keys@5.11.0": version "5.11.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.11.0.tgz#888542381f1a2ac745b06d110c83c0b261487ebb" + resolved "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.11.0.tgz" integrity sha512-E8w/vJReMGuloGxJDkpPlGwhxocxOpSVgSvjiLO5IxZPmxZF30weOeJYyPSEACwM+X4NziYS9q+WkN/2DHYQwA== dependencies: "@typescript-eslint/types" "5.11.0" eslint-visitor-keys "^3.0.0" -"@typescript-eslint/visitor-keys@5.45.1": - version "5.45.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.45.1.tgz#204428430ad6a830d24c5ac87c71366a1cfe1948" - integrity sha512-cy9ln+6rmthYWjH9fmx+5FU/JDpjQb586++x2FZlveq7GdGuLLW9a2Jcst2TGekH82bXpfmRNSwP9tyEs6RjvQ== +"@typescript-eslint/visitor-keys@5.58.0": + version "5.58.0" + resolved "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.58.0.tgz" + integrity sha512-/fBraTlPj0jwdyTwLyrRTxv/3lnU2H96pNTVM6z3esTWLtA5MZ9ghSMJ7Rb+TtUAdtEw9EyJzJ0EydIMKxQ9gA== dependencies: - "@typescript-eslint/types" "5.45.1" + "@typescript-eslint/types" "5.58.0" eslint-visitor-keys "^3.3.0" "@webassemblyjs/ast@1.11.1": version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.11.1.tgz#2bfd767eae1a6996f432ff7e8d7fc75679c0b6a7" + resolved "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz" integrity sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw== dependencies: "@webassemblyjs/helper-numbers" "1.11.1" @@ -2578,22 +2559,22 @@ "@webassemblyjs/floating-point-hex-parser@1.11.1": version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz#f6c61a705f0fd7a6aecaa4e8198f23d9dc179e4f" + resolved "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz" integrity sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ== "@webassemblyjs/helper-api-error@1.11.1": version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz#1a63192d8788e5c012800ba6a7a46c705288fd16" + resolved "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz" integrity sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg== "@webassemblyjs/helper-buffer@1.11.1": version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz#832a900eb444884cde9a7cad467f81500f5e5ab5" + resolved "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz" integrity sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA== "@webassemblyjs/helper-numbers@1.11.1": version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz#64d81da219fbbba1e3bd1bfc74f6e8c4e10a62ae" + resolved "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz" integrity sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ== dependencies: "@webassemblyjs/floating-point-hex-parser" "1.11.1" @@ -2602,12 +2583,12 @@ "@webassemblyjs/helper-wasm-bytecode@1.11.1": version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz#f328241e41e7b199d0b20c18e88429c4433295e1" + resolved "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz" integrity sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q== "@webassemblyjs/helper-wasm-section@1.11.1": version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz#21ee065a7b635f319e738f0dd73bfbda281c097a" + resolved "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz" integrity sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg== dependencies: "@webassemblyjs/ast" "1.11.1" @@ -2617,26 +2598,26 @@ "@webassemblyjs/ieee754@1.11.1": version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz#963929e9bbd05709e7e12243a099180812992614" + resolved "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz" integrity sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ== dependencies: "@xtuc/ieee754" "^1.2.0" "@webassemblyjs/leb128@1.11.1": version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.11.1.tgz#ce814b45574e93d76bae1fb2644ab9cdd9527aa5" + resolved "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz" integrity sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw== dependencies: "@xtuc/long" "4.2.2" "@webassemblyjs/utf8@1.11.1": version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.11.1.tgz#d1f8b764369e7c6e6bae350e854dec9a59f0a3ff" + resolved "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz" integrity sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ== "@webassemblyjs/wasm-edit@1.11.1": version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz#ad206ebf4bf95a058ce9880a8c092c5dec8193d6" + resolved "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz" integrity sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA== dependencies: "@webassemblyjs/ast" "1.11.1" @@ -2650,7 +2631,7 @@ "@webassemblyjs/wasm-gen@1.11.1": version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz#86c5ea304849759b7d88c47a32f4f039ae3c8f76" + resolved "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz" integrity sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA== dependencies: "@webassemblyjs/ast" "1.11.1" @@ -2661,7 +2642,7 @@ "@webassemblyjs/wasm-opt@1.11.1": version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz#657b4c2202f4cf3b345f8a4c6461c8c2418985f2" + resolved "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz" integrity sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw== dependencies: "@webassemblyjs/ast" "1.11.1" @@ -2671,7 +2652,7 @@ "@webassemblyjs/wasm-parser@1.11.1": version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz#86ca734534f417e9bd3c67c7a1c75d8be41fb199" + resolved "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz" integrity sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA== dependencies: "@webassemblyjs/ast" "1.11.1" @@ -2683,7 +2664,7 @@ "@webassemblyjs/wast-printer@1.11.1": version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz#d0c73beda8eec5426f10ae8ef55cee5e7084c2f0" + resolved "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz" integrity sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg== dependencies: "@webassemblyjs/ast" "1.11.1" @@ -2691,24 +2672,24 @@ "@webpack-cli/configtest@^1.2.0": version "1.2.0" - resolved "https://registry.yarnpkg.com/@webpack-cli/configtest/-/configtest-1.2.0.tgz#7b20ce1c12533912c3b217ea68262365fa29a6f5" + resolved "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.2.0.tgz" integrity sha512-4FB8Tj6xyVkyqjj1OaTqCjXYULB9FMkqQ8yGrZjRDrYh0nOE+7Lhs45WioWQQMV+ceFlE368Ukhe6xdvJM9Egg== "@webpack-cli/info@^1.5.0": version "1.5.0" - resolved "https://registry.yarnpkg.com/@webpack-cli/info/-/info-1.5.0.tgz#6c78c13c5874852d6e2dd17f08a41f3fe4c261b1" + resolved "https://registry.npmjs.org/@webpack-cli/info/-/info-1.5.0.tgz" integrity sha512-e8tSXZpw2hPl2uMJY6fsMswaok5FdlGNRTktvFk2sD8RjH0hE2+XistawJx1vmKteh4NmGmNUrp+Tb2w+udPcQ== dependencies: envinfo "^7.7.3" "@webpack-cli/serve@^1.7.0": version "1.7.0" - resolved "https://registry.yarnpkg.com/@webpack-cli/serve/-/serve-1.7.0.tgz#e1993689ac42d2b16e9194376cfb6753f6254db1" + resolved "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.7.0.tgz" integrity sha512-oxnCNGj88fL+xzV+dacXs44HcDwf1ovs3AuEzvP7mqXw7fQntqIhQ1BRmynh4qEKQSSSRSWVyXRjmTbZIX9V2Q== "@wessberg/ts-evaluator@0.0.27": version "0.0.27" - resolved "https://registry.yarnpkg.com/@wessberg/ts-evaluator/-/ts-evaluator-0.0.27.tgz#06e8b901d5e84f11199b9f84577c6426ae761767" + resolved "https://registry.npmjs.org/@wessberg/ts-evaluator/-/ts-evaluator-0.0.27.tgz" integrity sha512-7gOpVm3yYojUp/Yn7F4ZybJRxyqfMNf0LXK5KJiawbPfL0XTsJV+0mgrEDjOIR6Bi0OYk2Cyg4tjFu1r8MCZaA== dependencies: chalk "^4.1.0" @@ -2718,47 +2699,47 @@ "@xtuc/ieee754@^1.2.0": version "1.2.0" - resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" + resolved "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz" integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA== "@xtuc/long@4.2.2": version "4.2.2" - resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" + resolved "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz" integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== -"@yarnpkg/lockfile@1.1.0", "@yarnpkg/lockfile@^1.1.0": +"@yarnpkg/lockfile@^1.1.0", "@yarnpkg/lockfile@1.1.0": version "1.1.0" - resolved "https://registry.yarnpkg.com/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz#e77a97fbd345b76d83245edcd17d393b1b41fb31" + resolved "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz" integrity sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ== "@yarnpkg/parsers@^3.0.0-rc.18": - version "3.0.0-rc.32" - resolved "https://registry.yarnpkg.com/@yarnpkg/parsers/-/parsers-3.0.0-rc.32.tgz#0aef0bd1b9e9954173c01a7cbd35f98765e39e7d" - integrity sha512-Sz2g88b3iAu2jpMnhtps2bRX2GAAOvanOxGcVi+o7ybGjLetxK23o2cHskXKypvXxtZTsJegel5pUWSPpYphww== + version "3.0.0-rc.42" + resolved "https://registry.npmjs.org/@yarnpkg/parsers/-/parsers-3.0.0-rc.42.tgz" + integrity sha512-eW9Mbegmb5bJjwawJM9ghjUjUqciNMhC6L7XrQPF/clXS5bbP66MstsgCT5hy9VlfUh/CfBT+0Wucf531dMjHA== dependencies: js-yaml "^3.10.0" tslib "^2.4.0" "@zkochan/js-yaml@0.0.6": version "0.0.6" - resolved "https://registry.yarnpkg.com/@zkochan/js-yaml/-/js-yaml-0.0.6.tgz#975f0b306e705e28b8068a07737fa46d3fc04826" + resolved "https://registry.npmjs.org/@zkochan/js-yaml/-/js-yaml-0.0.6.tgz" integrity sha512-nzvgl3VfhcELQ8LyVrYOru+UtAy1nrygk2+AGbTm8a5YcO6o8lSjAT+pfg3vJWxIoZKOUhrK6UU7xW/+00kQrg== dependencies: argparse "^2.0.1" abab@^2.0.3, abab@^2.0.5, abab@^2.0.6: version "2.0.6" - resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.6.tgz#41b80f2c871d19686216b82309231cfd3cb3d291" + resolved "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz" integrity sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA== abbrev@1: version "1.1.1" - resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" + resolved "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz" integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.8: version "1.3.8" - resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" + resolved "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz" integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== dependencies: mime-types "~2.1.34" @@ -2766,7 +2747,7 @@ accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.8: acorn-globals@^6.0.0: version "6.0.0" - resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-6.0.0.tgz#46cdd39f0f8ff08a876619b55f5ac8a6dc770b45" + resolved "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz" integrity sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg== dependencies: acorn "^7.1.1" @@ -2774,120 +2755,100 @@ acorn-globals@^6.0.0: acorn-import-assertions@^1.7.6: version "1.8.0" - resolved "https://registry.yarnpkg.com/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz#ba2b5939ce62c238db6d93d81c9b111b29b855e9" + resolved "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz" integrity sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw== acorn-jsx@^5.3.2: version "5.3.2" - resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" + resolved "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz" integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== acorn-walk@^7.1.1: version "7.2.0" - resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.2.0.tgz#0de889a601203909b0fbe07b8938dc21d2e967bc" + resolved "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz" integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA== -acorn-walk@^8.0.0, acorn-walk@^8.1.1: +acorn-walk@^8.0.0: version "8.2.0" - resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1" + resolved "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz" integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== +acorn-walk@^8.1.1: + version "8.2.0" + resolved "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz" + integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== + +"acorn@^6.0.0 || ^7.0.0 || ^8.0.0", acorn@^8, acorn@^8.0.4, acorn@^8.2.4, acorn@^8.4.1, acorn@^8.5.0, acorn@^8.7.1, acorn@^8.8.0: + version "8.8.2" + resolved "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz" + integrity sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw== + acorn@^7.1.1: version "7.4.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" + resolved "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz" integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== -acorn@^8.0.4, acorn@^8.2.4, acorn@^8.4.1, acorn@^8.5.0, acorn@^8.7.1, acorn@^8.8.0: - version "8.8.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.1.tgz#0a3f9cbecc4ec3bea6f0a80b66ae8dd2da250b73" - integrity sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA== - adjust-sourcemap-loader@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/adjust-sourcemap-loader/-/adjust-sourcemap-loader-4.0.0.tgz#fc4a0fd080f7d10471f30a7320f25560ade28c99" + resolved "https://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-4.0.0.tgz" integrity sha512-OXwN5b9pCUXNQHJpwwD2qP40byEmSgzj8B4ydSN0uMNYWiFmJ6x6KwUllMmfk8Rwu/HJDFR7U8ubsWBoN0Xp0A== dependencies: loader-utils "^2.0.0" regex-parser "^2.2.11" -adm-zip@^0.4.9: - version "0.4.16" - resolved "https://registry.yarnpkg.com/adm-zip/-/adm-zip-0.4.16.tgz#cf4c508fdffab02c269cbc7f471a875f05570365" - integrity sha512-TFi4HBKSGfIKsK5YCkKaaFG2m4PEDyViZmEwof3MTIgzimHLto6muaHVpbrljdIvIrFZzEq/p4nafOeLcYegrg== - -agent-base@6, agent-base@^6.0.2: +agent-base@^6.0.2, agent-base@6: version "6.0.2" - resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" + resolved "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz" integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== dependencies: debug "4" agentkeepalive@^4.1.3, agentkeepalive@^4.2.1: - version "4.2.1" - resolved "https://registry.yarnpkg.com/agentkeepalive/-/agentkeepalive-4.2.1.tgz#a7975cbb9f83b367f06c90cc51ff28fe7d499717" - integrity sha512-Zn4cw2NEqd+9fiSVWMscnjyQ1a8Yfoc5oBajLeo5w+YBHgDUcEBY2hS4YpTz6iN5f/2zQiktcuM6tS8x1p9dpA== + version "4.3.0" + resolved "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.3.0.tgz" + integrity sha512-7Epl1Blf4Sy37j4v9f9FjICCh4+KAQOyXgHEwlyBiAQLbhKdq/i2QQU3amQalS/wPhdPzDXPL5DMR5bkn+YeWg== dependencies: debug "^4.1.0" - depd "^1.1.2" + depd "^2.0.0" humanize-ms "^1.2.1" aggregate-error@^3.0.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" + resolved "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz" integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== dependencies: clean-stack "^2.0.0" indent-string "^4.0.0" -ajv-formats@2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/ajv-formats/-/ajv-formats-2.1.0.tgz#96eaf83e38d32108b66d82a9cb0cfa24886cdfeb" - integrity sha512-USH2jBb+C/hIpwD2iRjp0pe0k+MvzG0mlSn/FIdCgQhUb9ALPRjt2KIQdfZDS9r0ZIeUAg7gOu9KL0PFqGqr5Q== +ajv-formats@^2.1.1, ajv-formats@2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz" + integrity sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA== dependencies: ajv "^8.0.0" -ajv-formats@2.1.1, ajv-formats@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/ajv-formats/-/ajv-formats-2.1.1.tgz#6e669400659eb74973bbf2e33327180a0996b520" - integrity sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA== +ajv-formats@2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.0.tgz" + integrity sha512-USH2jBb+C/hIpwD2iRjp0pe0k+MvzG0mlSn/FIdCgQhUb9ALPRjt2KIQdfZDS9r0ZIeUAg7gOu9KL0PFqGqr5Q== dependencies: ajv "^8.0.0" ajv-keywords@^3.5.2: version "3.5.2" - resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d" + resolved "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz" integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== ajv-keywords@^5.0.0: version "5.1.0" - resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-5.1.0.tgz#69d4d385a4733cdbeab44964a1170a88f87f0e16" + resolved "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz" integrity sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw== dependencies: fast-deep-equal "^3.1.3" -ajv@8.6.2: - version "8.6.2" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.6.2.tgz#2fb45e0e5fcbc0813326c1c3da535d1881bb0571" - integrity sha512-9807RlWAgT564wT+DjeyU5OFMPjmzxVobvDFmNAhY+5zD6A2ly3jDp6sgnfyDtlIQ+7H97oc/DGCzzfu9rjw9w== - dependencies: - fast-deep-equal "^3.1.1" - json-schema-traverse "^1.0.0" - require-from-string "^2.0.2" - uri-js "^4.2.2" - -ajv@8.9.0: - version "8.9.0" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.9.0.tgz#738019146638824dea25edcf299dcba1b0e7eb18" - integrity sha512-qOKJyNj/h+OWx7s5DePL6Zu1KeM9jPZhwBqs+7DzP6bGOvqzVCSf0xueYmVuaC/oQ/VtS2zLMLHdQFbkka+XDQ== - dependencies: - fast-deep-equal "^3.1.1" - json-schema-traverse "^1.0.0" - require-from-string "^2.0.2" - uri-js "^4.2.2" - -ajv@^6.10.0, ajv@^6.12.3, ajv@^6.12.4, ajv@^6.12.5: +ajv@^6.10.0: version "6.12.6" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" + resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz" integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== dependencies: fast-deep-equal "^3.1.1" @@ -2895,10 +2856,40 @@ ajv@^6.10.0, ajv@^6.12.3, ajv@^6.12.4, ajv@^6.12.5: json-schema-traverse "^0.4.1" uri-js "^4.2.2" -ajv@^8.0.0, ajv@^8.8.0: - version "8.11.2" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.11.2.tgz#aecb20b50607acf2569b6382167b65a96008bb78" - integrity sha512-E4bfmKAhGiSTvMfL1Myyycaub+cUEU2/IvpylXkUu7CHBkBj1f/ikdzbD7YQ6FKUbixDxeYvB/xY4fvyroDlQg== +ajv@^6.12.4: + version "6.12.6" + resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +ajv@^6.12.5: + version "6.12.6" + resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +ajv@^6.9.1, ajv@^8.0.0, ajv@^8.8.0, ajv@^8.8.2, ajv@8.9.0: + version "8.9.0" + resolved "https://registry.npmjs.org/ajv/-/ajv-8.9.0.tgz" + integrity sha512-qOKJyNj/h+OWx7s5DePL6Zu1KeM9jPZhwBqs+7DzP6bGOvqzVCSf0xueYmVuaC/oQ/VtS2zLMLHdQFbkka+XDQ== + dependencies: + fast-deep-equal "^3.1.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + uri-js "^4.2.2" + +ajv@8.6.2: + version "8.6.2" + resolved "https://registry.npmjs.org/ajv/-/ajv-8.6.2.tgz" + integrity sha512-9807RlWAgT564wT+DjeyU5OFMPjmzxVobvDFmNAhY+5zD6A2ly3jDp6sgnfyDtlIQ+7H97oc/DGCzzfu9rjw9w== dependencies: fast-deep-equal "^3.1.1" json-schema-traverse "^1.0.0" @@ -2907,80 +2898,77 @@ ajv@^8.0.0, ajv@^8.8.0: angular-idle-preload@3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/angular-idle-preload/-/angular-idle-preload-3.0.0.tgz#decace34d9fac1cb00000727a6dc5caafdb84e4d" + resolved "https://registry.npmjs.org/angular-idle-preload/-/angular-idle-preload-3.0.0.tgz" integrity sha512-W3P2m2B6MHdt1DVunH6H3VWkAZrG3ZwxGcPjedVvIyRhg/LmMtILoizHSxTXw3fsKIEdAPwGObXGpML9WD1jJA== angulartics2@^12.0.0: version "12.2.0" - resolved "https://registry.yarnpkg.com/angulartics2/-/angulartics2-12.2.0.tgz#79159693b4436905391e3b1e7d549c900408e175" + resolved "https://registry.npmjs.org/angulartics2/-/angulartics2-12.2.0.tgz" integrity sha512-1wl/cPA4PGYj42z80VIR+A0Hy3+rt13POzfTfZ83NUDx2KKbHjtTKS0O7u3umi10cqvi5tn4NTSYIFFJ1fI2Tw== dependencies: tslib "^2.3.0" -ansi-colors@4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" - integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== - ansi-colors@^4.1.1: version "4.1.3" - resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.3.tgz#37611340eb2243e70cc604cad35d63270d48781b" + resolved "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz" integrity sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw== +ansi-colors@4.1.1: + version "4.1.1" + resolved "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz" + integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== + ansi-escapes@^4.2.1, ansi-escapes@^4.3.0: version "4.3.2" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" + resolved "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz" integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== dependencies: type-fest "^0.21.3" ansi-html-community@^0.0.8: version "0.0.8" - resolved "https://registry.yarnpkg.com/ansi-html-community/-/ansi-html-community-0.0.8.tgz#69fbc4d6ccbe383f9736934ae34c3f8290f1bf41" + resolved "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz" integrity sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw== -ansi-regex@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" - integrity sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA== - ansi-regex@^3.0.0: version "3.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.1.tgz#123d6479e92ad45ad897d4054e3c7ca7db4944e1" + resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz" integrity sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw== ansi-regex@^5.0.1: version "5.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz" integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== ansi-regex@^6.0.1: version "6.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.0.1.tgz#3183e38fae9a65d7cb5e53945cd5897d0260a06a" + resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz" integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA== -ansi-styles@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" - integrity sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA== - ansi-styles@^3.2.1: version "3.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz" integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== dependencies: color-convert "^1.9.0" -ansi-styles@^4.0.0, ansi-styles@^4.1.0: +ansi-styles@^4.0.0: version "4.3.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== dependencies: color-convert "^2.0.1" anymatch@~3.1.2: version "3.1.3" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" + resolved "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz" integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== dependencies: normalize-path "^3.0.0" @@ -2988,17 +2976,17 @@ anymatch@~3.1.2: "aproba@^1.0.3 || ^2.0.0": version "2.0.0" - resolved "https://registry.yarnpkg.com/aproba/-/aproba-2.0.0.tgz#52520b8ae5b569215b354efc0caa3fe1e45a8adc" + resolved "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz" integrity sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ== arch@^2.2.0: version "2.2.0" - resolved "https://registry.yarnpkg.com/arch/-/arch-2.2.0.tgz#1bc47818f305764f23ab3306b0bfc086c5a29d11" + resolved "https://registry.npmjs.org/arch/-/arch-2.2.0.tgz" integrity sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ== are-we-there-yet@^3.0.0: version "3.0.1" - resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz#679df222b278c64f2cdba1175cdc00b0d96164bd" + resolved "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz" integrity sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg== dependencies: delegates "^1.0.0" @@ -3006,42 +2994,55 @@ are-we-there-yet@^3.0.0: arg@^4.1.0: version "4.1.3" - resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" + resolved "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz" integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== argparse@^1.0.7: version "1.0.10" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" + resolved "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz" integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== dependencies: sprintf-js "~1.0.2" argparse@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" + resolved "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz" integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== aria-query@^4.2.2: version "4.2.2" - resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-4.2.2.tgz#0d2ca6c9aceb56b8977e9fed6aed7e15bbd2f83b" + resolved "https://registry.npmjs.org/aria-query/-/aria-query-4.2.2.tgz" integrity sha512-o/HelwhuKpTj/frsOsbNLNgnNGVIFsVP/SW2BSF14gVl7kAfMOJ6/8wUAUvG1R1NHKrfG+2sHZTu0yauT1qBrA== dependencies: "@babel/runtime" "^7.10.2" "@babel/runtime-corejs3" "^7.10.2" -array-flatten@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" - integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== +array-buffer-byte-length@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz" + integrity sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A== + dependencies: + call-bind "^1.0.2" + is-array-buffer "^3.0.1" -array-flatten@^2.1.0, array-flatten@^2.1.2: +array-flatten@^2.1.0: version "2.1.2" - resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-2.1.2.tgz#24ef80a28c1a893617e2149b0c6d0d788293b099" + resolved "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz" integrity sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ== -array-includes@^3.1.4: +array-flatten@^2.1.2: + version "2.1.2" + resolved "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz" + integrity sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ== + +array-flatten@1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz" + integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== + +array-includes@^3.1.6: version "3.1.6" - resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.6.tgz#9e9e720e194f198266ba9e18c29e6a9b0e4b225f" + resolved "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz" integrity sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw== dependencies: call-bind "^1.0.2" @@ -3050,31 +3051,19 @@ array-includes@^3.1.4: get-intrinsic "^1.1.3" is-string "^1.0.7" -array-union@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" - integrity sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng== - dependencies: - array-uniq "^1.0.1" - array-union@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" + resolved "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz" integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== array-union@^3.0.1: version "3.0.1" - resolved "https://registry.yarnpkg.com/array-union/-/array-union-3.0.1.tgz#da52630d327f8b88cfbfb57728e2af5cd9b6b975" + resolved "https://registry.npmjs.org/array-union/-/array-union-3.0.1.tgz" integrity sha512-1OvF9IbWwaeiM9VhzYXVQacMibxpXOMYVNIvMtKRyX9SImBXpKcFr8XvFDeEslCyuH/t6KRt7HEO94AlP8Iatw== -array-uniq@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" - integrity sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q== - -array.prototype.flat@^1.2.5: +array.prototype.flat@^1.3.1: version "1.3.1" - resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz#ffc6576a7ca3efc2f46a143b9d1dda9b4b3cf5e2" + resolved "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz" integrity sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA== dependencies: call-bind "^1.0.2" @@ -3082,119 +3071,136 @@ array.prototype.flat@^1.2.5: es-abstract "^1.20.4" es-shim-unscopables "^1.0.0" -arrify@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" - integrity sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA== +array.prototype.flatmap@^1.3.1: + version "1.3.1" + resolved "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz" + integrity sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + es-shim-unscopables "^1.0.0" asn1@~0.2.3: version "0.2.6" - resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.6.tgz#0d3a7bb6e64e02a90c0303b31f292868ea09a08d" + resolved "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz" integrity sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ== dependencies: safer-buffer "~2.1.0" -assert-plus@1.0.0, assert-plus@^1.0.0: +assert-plus@^1.0.0, assert-plus@1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" + resolved "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz" integrity sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw== astral-regex@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" + resolved "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz" integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== async-each-series@0.1.1: version "0.1.1" - resolved "https://registry.yarnpkg.com/async-each-series/-/async-each-series-0.1.1.tgz#7617c1917401fd8ca4a28aadce3dbae98afeb432" + resolved "https://registry.npmjs.org/async-each-series/-/async-each-series-0.1.1.tgz" integrity sha512-p4jj6Fws4Iy2m0iCmI2am2ZNZCgbdgE+P8F/8csmn2vx7ixXrO2zGcuNsD46X5uZSVecmkEy/M06X2vG8KD6dQ== -async@^2.6.0, async@^2.6.4: +async@^2.6.0: version "2.6.4" - resolved "https://registry.yarnpkg.com/async/-/async-2.6.4.tgz#706b7ff6084664cd7eae713f6f965433b5504221" + resolved "https://registry.npmjs.org/async/-/async-2.6.4.tgz" + integrity sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA== + dependencies: + lodash "^4.17.14" + +async@^2.6.4: + version "2.6.4" + resolved "https://registry.npmjs.org/async/-/async-2.6.4.tgz" integrity sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA== dependencies: lodash "^4.17.14" async@^3.2.0, async@^3.2.3: version "3.2.4" - resolved "https://registry.yarnpkg.com/async/-/async-3.2.4.tgz#2d22e00f8cddeb5fde5dd33522b56d1cf569a81c" + resolved "https://registry.npmjs.org/async/-/async-3.2.4.tgz" integrity sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ== asynckit@^0.4.0: version "0.4.0" - resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + resolved "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz" integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== at-least-node@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" + resolved "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz" integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== atob@^2.1.2: version "2.1.2" - resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" + resolved "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz" integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== autoprefixer@^10.4.13, autoprefixer@^10.4.2: - version "10.4.13" - resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.13.tgz#b5136b59930209a321e9fa3dca2e7c4d223e83a8" - integrity sha512-49vKpMqcZYsJjwotvt4+h/BCjJVnhGwcLpDt5xkcaOG3eLrG/HUYLagrihYsQ+qrIBgIzX1Rw7a6L8I/ZA1Atg== + version "10.4.14" + resolved "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.14.tgz" + integrity sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ== dependencies: - browserslist "^4.21.4" - caniuse-lite "^1.0.30001426" + browserslist "^4.21.5" + caniuse-lite "^1.0.30001464" fraction.js "^4.2.0" normalize-range "^0.1.2" picocolors "^1.0.0" postcss-value-parser "^4.2.0" +available-typed-arrays@^1.0.5: + version "1.0.5" + resolved "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz" + integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw== + aws-sign2@~0.7.0: version "0.7.0" - resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" + resolved "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz" integrity sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA== aws4@^1.8.0: version "1.12.0" - resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.12.0.tgz#ce1c9d143389679e253b314241ea9aa5cec980d3" + resolved "https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz" integrity sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg== -axe-core@^4.4.3: +"axe-core@^3 || ^4", axe-core@^4.4.3: version "4.6.3" - resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.6.3.tgz#fc0db6fdb65cc7a80ccf85286d91d64ababa3ece" + resolved "https://registry.npmjs.org/axe-core/-/axe-core-4.6.3.tgz" integrity sha512-/BQzOX780JhsxDnPpH4ZiyrJAzcd8AfzFPkv+89veFSr1rcMjuq2JDCwypKaPeB6ljHp9KjXhPpjgCvQlWYuqg== -axios@0.21.4: - version "0.21.4" - resolved "https://registry.yarnpkg.com/axios/-/axios-0.21.4.tgz#c67b90dc0568e5c1cf2b0b858c43ba28e2eda575" - integrity sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg== - dependencies: - follow-redirects "^1.14.0" - axios@^0.27.2: version "0.27.2" - resolved "https://registry.yarnpkg.com/axios/-/axios-0.27.2.tgz#207658cc8621606e586c85db4b41a750e756d972" + resolved "https://registry.npmjs.org/axios/-/axios-0.27.2.tgz" integrity sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ== dependencies: follow-redirects "^1.14.9" form-data "^4.0.0" axios@^1.0.0: - version "1.2.1" - resolved "https://registry.yarnpkg.com/axios/-/axios-1.2.1.tgz#44cf04a3c9f0c2252ebd85975361c026cb9f864a" - integrity sha512-I88cFiGu9ryt/tfVEi4kX2SITsvDddTajXTOFmt2uK1ZVA8LytjtdeyefdQWEf5PU8w+4SSJDoYnggflB5tW4A== + version "1.3.5" + resolved "https://registry.npmjs.org/axios/-/axios-1.3.5.tgz" + integrity sha512-glL/PvG/E+xCWwV8S6nCHcrfg1exGx7vxyUIivIA1iL7BIh6bePylCfVHwp6k13ao7SATxB6imau2kqY+I67kw== dependencies: follow-redirects "^1.15.0" form-data "^4.0.0" proxy-from-env "^1.1.0" +axios@0.21.4: + version "0.21.4" + resolved "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz" + integrity sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg== + dependencies: + follow-redirects "^1.14.0" + axobject-query@^2.2.0: version "2.2.0" - resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-2.2.0.tgz#943d47e10c0b704aa42275e20edf3722648989be" + resolved "https://registry.npmjs.org/axobject-query/-/axobject-query-2.2.0.tgz" integrity sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA== babel-loader@8.2.5: version "8.2.5" - resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.2.5.tgz#d45f585e654d5a5d90f5350a779d7647c5ed512e" + resolved "https://registry.npmjs.org/babel-loader/-/babel-loader-8.2.5.tgz" integrity sha512-OSiFfH89LrEMiWd4pLNqGz4CwJDtbs2ZVc+iGu2HrkRfPxId9F2anQj38IxWpmRfsUY0aBZYi1EFcd3mhtRMLQ== dependencies: find-cache-dir "^3.3.1" @@ -3204,7 +3210,7 @@ babel-loader@8.2.5: babel-plugin-istanbul@6.1.1: version "6.1.1" - resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz#fa88ec59232fd9b4e36dbbc540a8ec9a9b47da73" + resolved "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz" integrity sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA== dependencies: "@babel/helper-plugin-utils" "^7.0.0" @@ -3215,7 +3221,7 @@ babel-plugin-istanbul@6.1.1: babel-plugin-polyfill-corejs2@^0.3.0: version "0.3.3" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.3.tgz#5d1bd3836d0a19e1b84bbf2d9640ccb6f951c122" + resolved "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.3.tgz" integrity sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q== dependencies: "@babel/compat-data" "^7.17.7" @@ -3224,7 +3230,7 @@ babel-plugin-polyfill-corejs2@^0.3.0: babel-plugin-polyfill-corejs3@^0.5.0: version "0.5.3" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.3.tgz#d7e09c9a899079d71a8b670c6181af56ec19c5c7" + resolved "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.3.tgz" integrity sha512-zKsXDh0XjnrUEW0mxIHLfjBfnXSMr5Q/goMe/fxpQnLm07mcOZiIZHBNWCMx60HmdvjxfXcalac0tfFg0wqxyw== dependencies: "@babel/helper-define-polyfill-provider" "^0.3.2" @@ -3232,53 +3238,53 @@ babel-plugin-polyfill-corejs3@^0.5.0: babel-plugin-polyfill-regenerator@^0.3.0: version "0.3.1" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.3.1.tgz#2c0678ea47c75c8cc2fbb1852278d8fb68233990" + resolved "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.3.1.tgz" integrity sha512-Y2B06tvgHYt1x0yz17jGkGeeMr5FeKUu+ASJ+N6nB5lQ8Dapfg42i0OVrf8PNGJ3zKL4A23snMi1IRwrqqND7A== dependencies: "@babel/helper-define-polyfill-provider" "^0.3.1" balanced-match@^1.0.0: version "1.0.2" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== base64-js@^1.2.0, base64-js@^1.3.1: version "1.5.1" - resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" + resolved "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz" integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== -base64id@2.0.0, base64id@~2.0.0: +base64id@~2.0.0, base64id@2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/base64id/-/base64id-2.0.0.tgz#2770ac6bc47d312af97a8bf9a634342e0cd25cb6" + resolved "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz" integrity sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog== basic-auth@~2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/basic-auth/-/basic-auth-2.0.1.tgz#b998279bf47ce38344b4f3cf916d4679bbf51e3a" + resolved "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz" integrity sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg== dependencies: safe-buffer "5.1.2" batch-processor@1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/batch-processor/-/batch-processor-1.0.0.tgz#75c95c32b748e0850d10c2b168f6bdbe9891ace8" + resolved "https://registry.npmjs.org/batch-processor/-/batch-processor-1.0.0.tgz" integrity sha512-xoLQD8gmmR32MeuBHgH0Tzd5PuSZx71ZsbhVxOCRbgktZEPe4SQy7s9Z50uPp0F/f7iw2XmkHN2xkgbMfckMDA== batch@0.6.1: version "0.6.1" - resolved "https://registry.yarnpkg.com/batch/-/batch-0.6.1.tgz#dc34314f4e679318093fc760272525f94bf25c16" + resolved "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz" integrity sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw== bcrypt-pbkdf@^1.0.0: version "1.0.2" - resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" + resolved "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz" integrity sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w== dependencies: tweetnacl "^0.14.3" bent@~7.3.6: version "7.3.12" - resolved "https://registry.yarnpkg.com/bent/-/bent-7.3.12.tgz#e0a2775d4425e7674c64b78b242af4f49da6b035" + resolved "https://registry.npmjs.org/bent/-/bent-7.3.12.tgz" integrity sha512-T3yrKnVGB63zRuoco/7Ybl7BwwGZR0lceoVG5XmQyMIH9s19SV5m+a8qam4if0zQuAmOQTyPTPmsQBdAorGK3w== dependencies: bytesish "^0.4.1" @@ -3287,17 +3293,17 @@ bent@~7.3.6: big.js@^5.2.2: version "5.2.2" - resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" + resolved "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz" integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== binary-extensions@^2.0.0: version "2.2.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" + resolved "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz" integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== bl@^4.0.3, bl@^4.1.0: version "4.1.0" - resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" + resolved "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz" integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== dependencies: buffer "^5.5.0" @@ -3306,17 +3312,17 @@ bl@^4.0.3, bl@^4.1.0: blob-util@^2.0.2: version "2.0.2" - resolved "https://registry.yarnpkg.com/blob-util/-/blob-util-2.0.2.tgz#3b4e3c281111bb7f11128518006cdc60b403a1eb" + resolved "https://registry.npmjs.org/blob-util/-/blob-util-2.0.2.tgz" integrity sha512-T7JQa+zsXXEa6/8ZhHcQEW1UFfVM49Ts65uBkFL6fz2QmrElqmbajIDJvuA0tEhRe5eIjpV9ZF+0RfZR9voJFQ== bluebird@^3.7.2: version "3.7.2" - resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" + resolved "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz" integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== -body-parser@1.20.1, body-parser@^1.19.0: +body-parser@^1.19.0, body-parser@1.20.1: version "1.20.1" - resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.1.tgz#b1812a8912c195cd371a3ee5e66faa2338a5c668" + resolved "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz" integrity sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw== dependencies: bytes "3.1.2" @@ -3333,9 +3339,9 @@ body-parser@1.20.1, body-parser@^1.19.0: unpipe "1.0.0" bonjour-service@^1.0.11: - version "1.0.14" - resolved "https://registry.yarnpkg.com/bonjour-service/-/bonjour-service-1.0.14.tgz#c346f5bc84e87802d08f8d5a60b93f758e514ee7" - integrity sha512-HIMbgLnk1Vqvs6B4Wq5ep7mxvj9sGz5d1JJyDNSGNIdA/w2MCz6GTjWTdjqOJV1bEPj+6IkxDvWNFKEBxNt4kQ== + version "1.1.1" + resolved "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.1.1.tgz" + integrity sha512-Z/5lQRMOG9k7W+FkeGTNjh7htqn/2LMnfOvBZ8pynNZCM9MwkQkI3zeI4oz09uWdcgmgHugVvBqxGg4VQJ5PCg== dependencies: array-flatten "^2.1.2" dns-equal "^1.0.0" @@ -3344,7 +3350,7 @@ bonjour-service@^1.0.11: bonjour@^3.5.0: version "3.5.0" - resolved "https://registry.yarnpkg.com/bonjour/-/bonjour-3.5.0.tgz#8e890a183d8ee9a2393b3844c691a42bcf7bc9f5" + resolved "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz" integrity sha512-RaVTblr+OnEli0r/ud8InrU7D+G0y6aJhlxaLa6Pwty4+xoxboF1BsUI45tujvRpbj9dQVoglChqonGAsjEBYg== dependencies: array-flatten "^2.1.0" @@ -3356,17 +3362,17 @@ bonjour@^3.5.0: boolbase@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" + resolved "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz" integrity sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww== -bootstrap@^4.6.1: +bootstrap@^4.0.0, bootstrap@^4.6.1: version "4.6.2" - resolved "https://registry.yarnpkg.com/bootstrap/-/bootstrap-4.6.2.tgz#8e0cd61611728a5bf65a3a2b8d6ff6c77d5d7479" + resolved "https://registry.npmjs.org/bootstrap/-/bootstrap-4.6.2.tgz" integrity sha512-51Bbp/Uxr9aTuy6ca/8FbFloBUJZLHwnhTcnjIeRn2suQWsWzcuJhGjKDB5eppVte/8oCdOL3VuwxvZDUggwGQ== brace-expansion@^1.1.7: version "1.1.11" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz" integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== dependencies: balanced-match "^1.0.0" @@ -3374,40 +3380,39 @@ brace-expansion@^1.1.7: brace-expansion@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" + resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz" integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== dependencies: balanced-match "^1.0.0" braces@^3.0.2, braces@~3.0.2: version "3.0.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + resolved "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz" integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== dependencies: fill-range "^7.0.1" browser-process-hrtime@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz#3c9b4b7d782c8121e56f10106d84c0d0ffc94626" + resolved "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz" integrity sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow== -browser-sync-client@^2.27.10: - version "2.27.10" - resolved "https://registry.yarnpkg.com/browser-sync-client/-/browser-sync-client-2.27.10.tgz#f06233ea66bd873b96664f001cbc49035022634d" - integrity sha512-KCFKA1YDj6cNul0VsA28apohtBsdk5Wv8T82ClOZPZMZWxPj4Ny5AUbrj9UlAb/k6pdxE5HABrWDhP9+cjt4HQ== +browser-sync-client@^2.29.1: + version "2.29.1" + resolved "https://registry.npmjs.org/browser-sync-client/-/browser-sync-client-2.29.1.tgz" + integrity sha512-aESnjt3rU7CZpzjyqzhIC2UJ3MVhzRis7cPKkGbyYWDf/wnbxyRa3fFenF3Qx9061/guY3HHhD67uiTVV26DVg== dependencies: etag "1.8.1" fresh "0.5.2" mitt "^1.1.3" - rxjs "^5.5.6" - typescript "^4.6.2" -browser-sync-ui@^2.27.10: - version "2.27.10" - resolved "https://registry.yarnpkg.com/browser-sync-ui/-/browser-sync-ui-2.27.10.tgz#59dd6e436e17b743c99094ff5129306ab7ab5b79" - integrity sha512-elbJILq4Uo6OQv6gsvS3Y9vRAJlWu+h8j0JDkF0X/ua+3S6SVbbiWnZc8sNOFlG7yvVGIwBED3eaYQ0iBo1Dtw== +browser-sync-ui@^2.29.1: + version "2.29.1" + resolved "https://registry.npmjs.org/browser-sync-ui/-/browser-sync-ui-2.29.1.tgz" + integrity sha512-MB7SAiUgVUrhipO2xyO1sheC9H0+LKXPQ3L1tQWcZ3AgizBnUNKAqDZPSwe4grNSa8o8ImSAwJp7lMS6XYy1Dw== dependencies: async-each-series "0.1.1" + chalk "4.1.2" connect-history-api-fallback "^1" immutable "^3" server-destroy "1.0.1" @@ -3415,20 +3420,21 @@ browser-sync-ui@^2.27.10: stream-throttle "^0.1.3" browser-sync@^2.26.7: - version "2.27.10" - resolved "https://registry.yarnpkg.com/browser-sync/-/browser-sync-2.27.10.tgz#3568d4f66afb0f68fee4a10902ecbbe8b2f680dd" - integrity sha512-xKm+6KJmJu6RuMWWbFkKwOCSqQOxYe3nOrFkKI5Tr/ZzjPxyU3pFShKK3tWnazBo/3lYQzN7fzjixG8fwJh1Xw== + version "2.29.1" + resolved "https://registry.npmjs.org/browser-sync/-/browser-sync-2.29.1.tgz" + integrity sha512-WXy9HMJVQaNUTPjmai330E2fnDA6W84l/vBILGkYu9yHXIpWw1gJYjdQWDfEhLFljYUHNTN9jM3GCej2T55m+g== dependencies: - browser-sync-client "^2.27.10" - browser-sync-ui "^2.27.10" + browser-sync-client "^2.29.1" + browser-sync-ui "^2.29.1" bs-recipes "1.3.4" bs-snippet-injector "^2.0.1" + chalk "4.1.2" chokidar "^3.5.1" connect "3.6.6" connect-history-api-fallback "^1" dev-ip "^1.0.1" easy-extender "^2.3.4" - eazy-logger "3.1.0" + eazy-logger "^4.0.1" etag "^1.8.1" fresh "^0.5.2" fs-extra "3.0.1" @@ -3438,7 +3444,7 @@ browser-sync@^2.26.7: micromatch "^4.0.2" opn "5.3.0" portscanner "2.2.0" - qs "6.2.3" + qs "^6.11.0" raw-body "^2.3.2" resp-modifier "6.0.2" rx "4.1.0" @@ -3447,47 +3453,47 @@ browser-sync@^2.26.7: serve-static "1.13.2" server-destroy "1.0.1" socket.io "^4.4.1" - ua-parser-js "1.0.2" + ua-parser-js "^1.0.33" yargs "^17.3.1" -browserslist@^4.14.5, browserslist@^4.19.1, browserslist@^4.21.3, browserslist@^4.21.4, browserslist@^4.9.1: - version "4.21.4" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.4.tgz#e7496bbc67b9e39dd0f98565feccdcb0d4ff6987" - integrity sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw== +browserslist@^4.14.5, browserslist@^4.19.1, browserslist@^4.21.3, browserslist@^4.21.4, browserslist@^4.21.5, browserslist@^4.9.1, "browserslist@>= 4.21.0": + version "4.21.5" + resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz" + integrity sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w== dependencies: - caniuse-lite "^1.0.30001400" - electron-to-chromium "^1.4.251" - node-releases "^2.0.6" - update-browserslist-db "^1.0.9" + caniuse-lite "^1.0.30001449" + electron-to-chromium "^1.4.284" + node-releases "^2.0.8" + update-browserslist-db "^1.0.10" bs-recipes@1.3.4: version "1.3.4" - resolved "https://registry.yarnpkg.com/bs-recipes/-/bs-recipes-1.3.4.tgz#0d2d4d48a718c8c044769fdc4f89592dc8b69585" + resolved "https://registry.npmjs.org/bs-recipes/-/bs-recipes-1.3.4.tgz" integrity sha512-BXvDkqhDNxXEjeGM8LFkSbR+jzmP/CYpCiVKYn+soB1dDldeU15EBNDkwVXndKuX35wnNUaPd0qSoQEAkmQtMw== bs-snippet-injector@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/bs-snippet-injector/-/bs-snippet-injector-2.0.1.tgz#61b5393f11f52559ed120693100343b6edb04dd5" + resolved "https://registry.npmjs.org/bs-snippet-injector/-/bs-snippet-injector-2.0.1.tgz" integrity sha512-4u8IgB+L9L+S5hknOj3ddNSb42436gsnGm1AuM15B7CdbkpQTyVWgIM5/JUBiKiRwGOR86uo0Lu/OsX+SAlJmw== buffer-crc32@~0.2.3: version "0.2.13" - resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" + resolved "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz" integrity sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ== buffer-from@^1.0.0: version "1.1.2" - resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" + resolved "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz" integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== buffer-indexof@^1.0.0: version "1.1.1" - resolved "https://registry.yarnpkg.com/buffer-indexof/-/buffer-indexof-1.1.1.tgz#52fabcc6a606d1a00302802648ef68f639da268c" + resolved "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz" integrity sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g== buffer@^5.5.0, buffer@^5.6.0: version "5.7.1" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" + resolved "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz" integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== dependencies: base64-js "^1.3.1" @@ -3495,27 +3501,27 @@ buffer@^5.5.0, buffer@^5.6.0: builtins@^1.0.3: version "1.0.3" - resolved "https://registry.yarnpkg.com/builtins/-/builtins-1.0.3.tgz#cb94faeb61c8696451db36534e1422f94f0aee88" + resolved "https://registry.npmjs.org/builtins/-/builtins-1.0.3.tgz" integrity sha512-uYBjakWipfaO/bXI7E8rq6kpwHRZK5cNYrUv2OzZSI/FvmdMyXJ2tG9dKcjEC5YHmHpUAwsargWIZNWdxb/bnQ== bytes@3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" + resolved "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz" integrity sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw== bytes@3.1.2: version "3.1.2" - resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" + resolved "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz" integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== bytesish@^0.4.1: version "0.4.4" - resolved "https://registry.yarnpkg.com/bytesish/-/bytesish-0.4.4.tgz#f3b535a0f1153747427aee27256748cff92347e6" + resolved "https://registry.npmjs.org/bytesish/-/bytesish-0.4.4.tgz" integrity sha512-i4uu6M4zuMUiyfZN4RU2+i9+peJh//pXhd9x1oSe1LBkZ3LEbCoygu8W0bXTukU1Jme2txKuotpCZRaC3FLxcQ== -cacache@15.3.0, cacache@^15.0.5, cacache@^15.2.0: +cacache@^15.0.5, cacache@^15.2.0, cacache@15.3.0: version "15.3.0" - resolved "https://registry.yarnpkg.com/cacache/-/cacache-15.3.0.tgz#dc85380fb2f556fe3dda4c719bfa0ec875a7f1eb" + resolved "https://registry.npmjs.org/cacache/-/cacache-15.3.0.tgz" integrity sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ== dependencies: "@npmcli/fs" "^1.0.0" @@ -3539,7 +3545,7 @@ cacache@15.3.0, cacache@^15.0.5, cacache@^15.2.0: cacache@^16.1.0: version "16.1.3" - resolved "https://registry.yarnpkg.com/cacache/-/cacache-16.1.3.tgz#a02b9f34ecfaf9a78c9f4bc16fceb94d5d67a38e" + resolved "https://registry.npmjs.org/cacache/-/cacache-16.1.3.tgz" integrity sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ== dependencies: "@npmcli/fs" "^2.1.0" @@ -3563,12 +3569,12 @@ cacache@^16.1.0: cachedir@^2.3.0: version "2.3.0" - resolved "https://registry.yarnpkg.com/cachedir/-/cachedir-2.3.0.tgz#0c75892a052198f0b21c7c1804d8331edfcae0e8" + resolved "https://registry.npmjs.org/cachedir/-/cachedir-2.3.0.tgz" integrity sha512-A+Fezp4zxnit6FanDmv9EqXNAi3vt9DWp51/71UEhXukb7QUuvtv9344h91dyAxuTLoSYJFU299qzR3tzwPAhw== call-bind@^1.0.0, call-bind@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" + resolved "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz" integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== dependencies: function-bind "^1.1.1" @@ -3576,62 +3582,91 @@ call-bind@^1.0.0, call-bind@^1.0.2: callsites@^3.0.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + resolved "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz" integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== camelcase@^5.3.1: version "5.3.1" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" + resolved "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz" integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== -caniuse-lite@^1.0.30001299, caniuse-lite@^1.0.30001400, caniuse-lite@^1.0.30001426: - version "1.0.30001436" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001436.tgz#22d7cbdbbbb60cdc4ca1030ccd6dea9f5de4848b" - integrity sha512-ZmWkKsnC2ifEPoWUvSAIGyOYwT+keAaaWPHiQ9DfMqS1t6tfuyFYoWR78TeZtznkEQ64+vGXH9cZrElwR2Mrxg== +caniuse-lite@^1.0.30001299, caniuse-lite@^1.0.30001449, caniuse-lite@^1.0.30001464: + version "1.0.30001477" + resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001477.tgz" + integrity sha512-lZim4iUHhGcy5p+Ri/G7m84hJwncj+Kz7S5aD4hoQfslKZJgt0tHc/hafVbqHC5bbhHb+mrW2JOUHkI5KH7toQ== caseless@~0.12.0: version "0.12.0" - resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" + resolved "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz" integrity sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw== cerialize@0.1.18: version "0.1.18" - resolved "https://registry.yarnpkg.com/cerialize/-/cerialize-0.1.18.tgz#d0f4f1b61cec7e4ed16a3eda0cac2bc99787414d" + resolved "https://registry.npmjs.org/cerialize/-/cerialize-0.1.18.tgz" integrity sha512-C/hp4UoPrMK060251Pt/21axF9aL4ceJlg3+pThB68VghhRjOzBzy4f8R9AirXdNB4gpqgaV2deU3UaexInL5w== dependencies: typescript "^2.5.0" -chalk@4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.0.tgz#4e14870a618d9e2edd97dd8345fd9d9dc315646a" - integrity sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -chalk@^1.1.1, chalk@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" - integrity sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A== - dependencies: - ansi-styles "^2.2.1" - escape-string-regexp "^1.0.2" - has-ansi "^2.0.0" - strip-ansi "^3.0.0" - supports-color "^2.0.0" - chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.4.1: version "2.4.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + resolved "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== dependencies: ansi-styles "^3.2.1" escape-string-regexp "^1.0.5" supports-color "^5.3.0" -chalk@^4.0.0, chalk@^4.0.2, chalk@^4.1.0, chalk@^4.1.1, chalk@~4.1.0: +chalk@^4.0.0: version "4.1.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +chalk@^4.0.2: + version "4.1.2" + resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +chalk@^4.1.0: + version "4.1.2" + resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +chalk@^4.1.1: + version "4.1.2" + resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +chalk@~4.1.0: + version "4.1.2" + resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +chalk@4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz" + integrity sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +chalk@4.1.2: + version "4.1.2" + resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== dependencies: ansi-styles "^4.1.0" @@ -3639,22 +3674,22 @@ chalk@^4.0.0, chalk@^4.0.2, chalk@^4.1.0, chalk@^4.1.1, chalk@~4.1.0: chardet@^0.7.0: version "0.7.0" - resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" + resolved "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz" integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== charenc@0.0.2: version "0.0.2" - resolved "https://registry.yarnpkg.com/charenc/-/charenc-0.0.2.tgz#c0a1d2f3a7092e03774bfa83f14c0fc5790a8667" + resolved "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz" integrity sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA== check-more-types@^2.24.0: version "2.24.0" - resolved "https://registry.yarnpkg.com/check-more-types/-/check-more-types-2.24.0.tgz#1420ffb10fd444dcfc79b43891bbfffd32a84600" + resolved "https://registry.npmjs.org/check-more-types/-/check-more-types-2.24.0.tgz" integrity sha512-Pj779qHxV2tuapviy1bSZNEL1maXr13bPYpsvSDB68HlYcYuhlDrmGd63i0JHMCLKzc7rUSNIrpdJlhVlNwrxA== cheerio-select@^1.5.0: version "1.6.0" - resolved "https://registry.yarnpkg.com/cheerio-select/-/cheerio-select-1.6.0.tgz#489f36604112c722afa147dedd0d4609c09e1696" + resolved "https://registry.npmjs.org/cheerio-select/-/cheerio-select-1.6.0.tgz" integrity sha512-eq0GdBvxVFbqWgmCm7M3XGs1I8oLy/nExUnh6oLqmBditPO9AqQJrkslDpMun/hZ0yyTs8L0m85OHp4ho6Qm9g== dependencies: css-select "^4.3.0" @@ -3665,7 +3700,7 @@ cheerio-select@^1.5.0: cheerio@1.0.0-rc.10: version "1.0.0-rc.10" - resolved "https://registry.yarnpkg.com/cheerio/-/cheerio-1.0.0-rc.10.tgz#2ba3dcdfcc26e7956fc1f440e61d51c643379f3e" + resolved "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.10.tgz" integrity sha512-g0J0q/O6mW8z5zxQ3A8E8J1hUgp4SMOvEoW/x84OwyHKe/Zccz83PVT4y5Crcr530FV6NgmKI1qvGTKVl9XXVw== dependencies: cheerio-select "^1.5.0" @@ -3676,9 +3711,9 @@ cheerio@1.0.0-rc.10: parse5-htmlparser2-tree-adapter "^6.0.1" tslib "^2.2.0" -"chokidar@>=3.0.0 <4.0.0", chokidar@^3.0.0, chokidar@^3.5.1, chokidar@^3.5.2, chokidar@^3.5.3: +chokidar@^3.0.0, chokidar@^3.5.1, chokidar@^3.5.2, chokidar@^3.5.3, "chokidar@>=3.0.0 <4.0.0": version "3.5.3" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" + resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz" integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== dependencies: anymatch "~3.1.2" @@ -3693,66 +3728,66 @@ cheerio@1.0.0-rc.10: chownr@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece" + resolved "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz" integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ== chrome-trace-event@^1.0.2: version "1.0.3" - resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz#1015eced4741e15d06664a957dbbf50d041e26ac" + resolved "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz" integrity sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg== ci-info@^3.2.0: version "3.8.0" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.8.0.tgz#81408265a5380c929f0bc665d62256628ce9ef91" + resolved "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz" integrity sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw== circular-dependency-plugin@5.2.2: version "5.2.2" - resolved "https://registry.yarnpkg.com/circular-dependency-plugin/-/circular-dependency-plugin-5.2.2.tgz#39e836079db1d3cf2f988dc48c5188a44058b600" + resolved "https://registry.npmjs.org/circular-dependency-plugin/-/circular-dependency-plugin-5.2.2.tgz" integrity sha512-g38K9Cm5WRwlaH6g03B9OEz/0qRizI+2I7n+Gz+L5DxXJAPAiWQvwlYNm1V1jkdpUv95bOe/ASm2vfi/G560jQ== circular-json@^0.5.0: version "0.5.9" - resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.5.9.tgz#932763ae88f4f7dead7a0d09c8a51a4743a53b1d" + resolved "https://registry.npmjs.org/circular-json/-/circular-json-0.5.9.tgz" integrity sha512-4ivwqHpIFJZBuhN3g/pEcdbnGUywkBblloGbkglyloVjjR3uT6tieI89MVOfbP2tHX5sgb01FuLgAOzebNlJNQ== classnames@^2.2.6: version "2.3.2" - resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.3.2.tgz#351d813bf0137fcc6a76a16b88208d2560a0d924" + resolved "https://registry.npmjs.org/classnames/-/classnames-2.3.2.tgz" integrity sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw== clean-stack@^2.0.0: version "2.2.0" - resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" + resolved "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz" integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== -cli-cursor@3.1.0, cli-cursor@^3.1.0: +cli-cursor@^3.1.0, cli-cursor@3.1.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" + resolved "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz" integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== dependencies: restore-cursor "^3.1.0" cli-progress@^3.8.0: - version "3.11.2" - resolved "https://registry.yarnpkg.com/cli-progress/-/cli-progress-3.11.2.tgz#f8c89bd157e74f3f2c43bcfb3505670b4d48fc77" - integrity sha512-lCPoS6ncgX4+rJu5bS3F/iCz17kZ9MPZ6dpuTtI0KXKABkhyXIdYB3Inby1OpaGti3YlI3EeEkM9AuWpelJrVA== + version "3.12.0" + resolved "https://registry.npmjs.org/cli-progress/-/cli-progress-3.12.0.tgz" + integrity sha512-tRkV3HJ1ASwm19THiiLIXLO7Im7wlTuKnvkYaTkyoAPefqjNg7W7DHKUlGRxy9vxDvbyCYQkQozvptuMkGCg8A== dependencies: string-width "^4.2.3" +cli-spinners@^2.5.0: + version "2.8.0" + resolved "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.8.0.tgz" + integrity sha512-/eG5sJcvEIwxcdYM86k5tPwn0MUzkX5YY3eImTGpJOZgVe4SdTMY14vQpcxgBzJ0wXwAYrS8E+c3uHeK4JNyzQ== + cli-spinners@2.6.1: version "2.6.1" - resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.6.1.tgz#adc954ebe281c37a6319bfa401e6dd2488ffb70d" + resolved "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.6.1.tgz" integrity sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g== -cli-spinners@^2.5.0: - version "2.7.0" - resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.7.0.tgz#f815fd30b5f9eaac02db604c7a231ed7cb2f797a" - integrity sha512-qu3pN8Y3qHNgE2AFweciB1IfMnmZ/fsNTEE+NOFjmGB2F/7rLhnhzppvpCnN4FovtP26k8lHyy9ptEbNwWFLzw== - cli-table3@~0.6.1: version "0.6.3" - resolved "https://registry.yarnpkg.com/cli-table3/-/cli-table3-0.6.3.tgz#61ab765aac156b52f222954ffc607a6f01dbeeb2" + resolved "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.3.tgz" integrity sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg== dependencies: string-width "^4.2.0" @@ -3761,7 +3796,7 @@ cli-table3@~0.6.1: cli-truncate@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-2.1.0.tgz#c39e28bf05edcde5be3b98992a22deed5a2b93c7" + resolved "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz" integrity sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg== dependencies: slice-ansi "^3.0.0" @@ -3769,12 +3804,12 @@ cli-truncate@^2.1.0: cli-width@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-3.0.0.tgz#a2f48437a2caa9a22436e794bf071ec9e61cedf6" + resolved "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz" integrity sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw== cliui@^7.0.2: version "7.0.4" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" + resolved "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz" integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== dependencies: string-width "^4.2.0" @@ -3783,7 +3818,7 @@ cliui@^7.0.2: cliui@^8.0.1: version "8.0.1" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" + resolved "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz" integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== dependencies: string-width "^4.2.0" @@ -3792,7 +3827,7 @@ cliui@^8.0.1: clone-deep@^4.0.1: version "4.0.1" - resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-4.0.1.tgz#c19fd9bdbbf85942b4fd979c84dcf7d5f07c2387" + resolved "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz" integrity sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ== dependencies: is-plain-object "^2.0.4" @@ -3801,110 +3836,120 @@ clone-deep@^4.0.1: clone@^1.0.2: version "1.0.4" - resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" + resolved "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz" integrity sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg== clsx@^1.0.4, clsx@^1.1.1: version "1.2.1" - resolved "https://registry.yarnpkg.com/clsx/-/clsx-1.2.1.tgz#0ddc4a20a549b59c93a4116bb26f5294ca17dc12" + resolved "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz" integrity sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg== color-convert@^1.9.0: version "1.9.3" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + resolved "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz" integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== dependencies: color-name "1.1.3" color-convert@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + resolved "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz" integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== dependencies: color-name "~1.1.4" -color-name@1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" - integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== - color-name@~1.1.4: version "1.1.4" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" + integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== + color-support@^1.1.3: version "1.1.3" - resolved "https://registry.yarnpkg.com/color-support/-/color-support-1.1.3.tgz#93834379a1cc9a0c61f82f52f0d04322251bd5a2" + resolved "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz" integrity sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg== colorette@^2.0.10, colorette@^2.0.14, colorette@^2.0.16: version "2.0.19" - resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.19.tgz#cdf044f47ad41a0f4b56b3a0d5b4e6e1a2d5a798" + resolved "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz" integrity sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ== colors@^1.4.0: version "1.4.0" - resolved "https://registry.yarnpkg.com/colors/-/colors-1.4.0.tgz#c50491479d4c1bdaed2c9ced32cf7c7dc2360f78" + resolved "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz" integrity sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA== combined-stream@^1.0.6, combined-stream@^1.0.8, combined-stream@~1.0.6: version "1.0.8" - resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" + resolved "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz" integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== dependencies: delayed-stream "~1.0.0" -commander@9.2.0: - version "9.2.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-9.2.0.tgz#6e21014b2ed90d8b7c9647230d8b7a94a4a419a9" - integrity sha512-e2i4wANQiSXgnrBlIatyHtP1odfUp0BbV5Y5nEGbxtIrStkEOAAzCUirvLBNXHLr7kwLvJl6V+4V3XV9x7Wd9w== - -commander@^2.2.0, commander@^2.20.0: +commander@^2.2.0: version "2.20.3" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" + resolved "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz" + integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== + +commander@^2.20.0: + version "2.20.3" + resolved "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz" integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== commander@^5.1.0: version "5.1.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-5.1.0.tgz#46abbd1652f8e059bddaef99bbdcb2ad9cf179ae" + resolved "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz" integrity sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg== commander@^6.1.0: version "6.2.1" - resolved "https://registry.yarnpkg.com/commander/-/commander-6.2.1.tgz#0792eb682dfbc325999bb2b84fddddba110ac73c" + resolved "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz" integrity sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA== -commander@^7.0.0, commander@^7.2.0: +commander@^7.0.0: version "7.2.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7" + resolved "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz" integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== +commander@^7.2.0: + version "7.2.0" + resolved "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz" + integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== + +commander@9.2.0: + version "9.2.0" + resolved "https://registry.npmjs.org/commander/-/commander-9.2.0.tgz" + integrity sha512-e2i4wANQiSXgnrBlIatyHtP1odfUp0BbV5Y5nEGbxtIrStkEOAAzCUirvLBNXHLr7kwLvJl6V+4V3XV9x7Wd9w== + comment-parser@1.3.1: version "1.3.1" - resolved "https://registry.yarnpkg.com/comment-parser/-/comment-parser-1.3.1.tgz#3d7ea3adaf9345594aedee6563f422348f165c1b" + resolved "https://registry.npmjs.org/comment-parser/-/comment-parser-1.3.1.tgz" integrity sha512-B52sN2VNghyq5ofvUsqZjmk6YkihBX5vMSChmSK9v4ShjKf3Vk5Xcmgpw4o+iIgtrnM/u5FiMpz9VKb8lpBveA== common-tags@^1.8.0: version "1.8.2" - resolved "https://registry.yarnpkg.com/common-tags/-/common-tags-1.8.2.tgz#94ebb3c076d26032745fd54face7f688ef5ac9c6" + resolved "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz" integrity sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA== commondir@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" + resolved "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz" integrity sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg== compressible@~2.0.16: version "2.0.18" - resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.18.tgz#af53cca6b070d4c3c0750fbd77286a6d7cc46fba" + resolved "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz" integrity sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg== dependencies: mime-db ">= 1.43.0 < 2" compression-webpack-plugin@^9.2.0: version "9.2.0" - resolved "https://registry.yarnpkg.com/compression-webpack-plugin/-/compression-webpack-plugin-9.2.0.tgz#57fd539d17c5907eebdeb4e83dcfe2d7eceb9ef6" + resolved "https://registry.npmjs.org/compression-webpack-plugin/-/compression-webpack-plugin-9.2.0.tgz" integrity sha512-R/Oi+2+UHotGfu72fJiRoVpuRifZT0tTC6UqFD/DUo+mv8dbOow9rVOuTvDv5nPPm3GZhHL/fKkwxwIHnJ8Nyw== dependencies: schema-utils "^4.0.0" @@ -3912,7 +3957,7 @@ compression-webpack-plugin@^9.2.0: compression@^1.7.4: version "1.7.4" - resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.4.tgz#95523eff170ca57c29a0ca41e6fe131f41e5bb8f" + resolved "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz" integrity sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ== dependencies: accepts "~1.3.5" @@ -3925,32 +3970,22 @@ compression@^1.7.4: concat-map@0.0.1: version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== connect-history-api-fallback@^1, connect-history-api-fallback@^1.6.0: version "1.6.0" - resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz#8b32089359308d111115d81cad3fceab888f97bc" + resolved "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz" integrity sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg== connect-history-api-fallback@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz#647264845251a0daf25b97ce87834cace0f5f1c8" + resolved "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz" integrity sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA== -connect@3.6.6: - version "3.6.6" - resolved "https://registry.yarnpkg.com/connect/-/connect-3.6.6.tgz#09eff6c55af7236e137135a72574858b6786f524" - integrity sha512-OO7axMmPpu/2XuX1+2Yrg0ddju31B6xLZMWkJ5rYBu4YRmRVlOjvlY6kw2FJKiAzyxGwnrDUAG4s1Pf0sbBMCQ== - dependencies: - debug "2.6.9" - finalhandler "1.1.0" - parseurl "~1.3.2" - utils-merge "1.0.1" - connect@^3.7.0: version "3.7.0" - resolved "https://registry.yarnpkg.com/connect/-/connect-3.7.0.tgz#5d49348910caa5e07a01800b030d0c35f20484f8" + resolved "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz" integrity sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ== dependencies: debug "2.6.9" @@ -3958,31 +3993,41 @@ connect@^3.7.0: parseurl "~1.3.3" utils-merge "1.0.1" +connect@3.6.6: + version "3.6.6" + resolved "https://registry.npmjs.org/connect/-/connect-3.6.6.tgz" + integrity sha512-OO7axMmPpu/2XuX1+2Yrg0ddju31B6xLZMWkJ5rYBu4YRmRVlOjvlY6kw2FJKiAzyxGwnrDUAG4s1Pf0sbBMCQ== + dependencies: + debug "2.6.9" + finalhandler "1.1.0" + parseurl "~1.3.2" + utils-merge "1.0.1" + console-control-strings@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" + resolved "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz" integrity sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ== content-disposition@0.5.4: version "0.5.4" - resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe" + resolved "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz" integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ== dependencies: safe-buffer "5.2.1" content-type@~1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" - integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== + version "1.0.5" + resolved "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz" + integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== convert-source-map@^1.5.1, convert-source-map@^1.7.0: version "1.9.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.9.0.tgz#7faae62353fb4213366d0ca98358d22e8368b05f" + resolved "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz" integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A== cookie-parser@1.4.5: version "1.4.5" - resolved "https://registry.yarnpkg.com/cookie-parser/-/cookie-parser-1.4.5.tgz#3e572d4b7c0c80f9c61daf604e4336831b5d1d49" + resolved "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.4.5.tgz" integrity sha512-f13bPUj/gG/5mDr+xLmSxxDsB9DQiTIfhJS/sqjrmfAWiAN+x2O4i/XguTL9yDZ+/IFDanJ+5x7hC4CXT9Tdzw== dependencies: cookie "0.4.0" @@ -3990,53 +4035,41 @@ cookie-parser@1.4.5: cookie-signature@1.0.6: version "1.0.6" - resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" + resolved "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz" integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ== +cookie@~0.4.1: + version "0.4.2" + resolved "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz" + integrity sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA== + cookie@0.4.0: version "0.4.0" - resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.0.tgz#beb437e7022b3b6d49019d088665303ebe9c14ba" + resolved "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz" integrity sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg== cookie@0.5.0: version "0.5.0" - resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.5.0.tgz#d1f5d71adec6558c58f389987c366aa47e994f8b" + resolved "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz" integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw== -cookie@~0.4.1: - version "0.4.2" - resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.2.tgz#0e41f24de5ecf317947c82fc789e06a884824432" - integrity sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA== - copy-anything@^2.0.1: version "2.0.6" - resolved "https://registry.yarnpkg.com/copy-anything/-/copy-anything-2.0.6.tgz#092454ea9584a7b7ad5573062b2a87f5900fc480" + resolved "https://registry.npmjs.org/copy-anything/-/copy-anything-2.0.6.tgz" integrity sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw== dependencies: is-what "^3.14.1" copy-to-clipboard@^3.3.1: version "3.3.3" - resolved "https://registry.yarnpkg.com/copy-to-clipboard/-/copy-to-clipboard-3.3.3.tgz#55ac43a1db8ae639a4bd99511c148cdd1b83a1b0" + resolved "https://registry.npmjs.org/copy-to-clipboard/-/copy-to-clipboard-3.3.3.tgz" integrity sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA== dependencies: toggle-selection "^1.0.6" -copy-webpack-plugin@10.2.1: - version "10.2.1" - resolved "https://registry.yarnpkg.com/copy-webpack-plugin/-/copy-webpack-plugin-10.2.1.tgz#115a41f913070ac236a1b576066204cbf35341a1" - integrity sha512-nr81NhCAIpAWXGCK5thrKmfCQ6GDY0L5RN0U+BnIn/7Us55+UCex5ANNsNKmIVtDRnk0Ecf+/kzp9SUVrrBMLg== - dependencies: - fast-glob "^3.2.7" - glob-parent "^6.0.1" - globby "^12.0.2" - normalize-path "^3.0.0" - schema-utils "^4.0.0" - serialize-javascript "^6.0.0" - copy-webpack-plugin@^6.4.1: version "6.4.1" - resolved "https://registry.yarnpkg.com/copy-webpack-plugin/-/copy-webpack-plugin-6.4.1.tgz#138cd9b436dbca0a6d071720d5414848992ec47e" + resolved "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-6.4.1.tgz" integrity sha512-MXyPCjdPVx5iiWyl40Va3JGh27bKzOTNY3NjUTrosD2q7dR/cLD0013uqJ3BpFbUjyONINjb6qI7nDIJujrMbA== dependencies: cacache "^15.0.5" @@ -4051,41 +4084,53 @@ copy-webpack-plugin@^6.4.1: serialize-javascript "^5.0.1" webpack-sources "^1.4.3" -core-js-compat@^3.20.2, core-js-compat@^3.21.0: - version "3.26.1" - resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.26.1.tgz#0e710b09ebf689d719545ac36e49041850f943df" - integrity sha512-622/KzTudvXCDLRw70iHW4KKs1aGpcRcowGWyYJr2DEBfRrd6hNJybxSWJFuZYD4ma86xhrwDDHxmDaIq4EA8A== +copy-webpack-plugin@10.2.1: + version "10.2.1" + resolved "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-10.2.1.tgz" + integrity sha512-nr81NhCAIpAWXGCK5thrKmfCQ6GDY0L5RN0U+BnIn/7Us55+UCex5ANNsNKmIVtDRnk0Ecf+/kzp9SUVrrBMLg== dependencies: - browserslist "^4.21.4" + fast-glob "^3.2.7" + glob-parent "^6.0.1" + globby "^12.0.2" + normalize-path "^3.0.0" + schema-utils "^4.0.0" + serialize-javascript "^6.0.0" + +core-js-compat@^3.20.2, core-js-compat@^3.21.0: + version "3.30.0" + resolved "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.30.0.tgz" + integrity sha512-P5A2h/9mRYZFIAP+5Ab8ns6083IyVpSclU74UNvbGVQ8VM7n3n3/g2yF3AkKQ9NXz2O+ioxLbEWKnDtgsFamhg== + dependencies: + browserslist "^4.21.5" core-js-pure@^3.25.1: - version "3.26.1" - resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.26.1.tgz#653f4d7130c427820dcecd3168b594e8bb095a33" - integrity sha512-VVXcDpp/xJ21KdULRq/lXdLzQAtX7+37LzpyfFM973il0tWSsDEoyzG38G14AjTpK9VTfiNM9jnFauq/CpaWGQ== + version "3.30.0" + resolved "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.30.0.tgz" + integrity sha512-+2KbMFGeBU0ln/csoPqTe0i/yfHbrd2EUhNMObsGtXMKS/RTtlkYyi+/3twLcevbgNR0yM/r0Psa3TEoQRpFMQ== + +core-js@^3.7.0, core-js@^3.8.1: + version "3.30.0" + resolved "https://registry.npmjs.org/core-js/-/core-js-3.30.0.tgz" + integrity sha512-hQotSSARoNh1mYPi9O2YaWeiq/cEB95kOrFb4NCrO4RIFt1qqNpKsaE+vy/L3oiqvND5cThqXzUU3r9F7Efztg== core-js@3.20.3: version "3.20.3" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.20.3.tgz#c710d0a676e684522f3db4ee84e5e18a9d11d69a" + resolved "https://registry.npmjs.org/core-js/-/core-js-3.20.3.tgz" integrity sha512-vVl8j8ph6tRS3B8qir40H7yw7voy17xL0piAjlbBUsH7WIfzoedL/ZOr1OV9FyZQLWXsayOJyV4tnRyXR85/ag== -core-js@^3.7.0: - version "3.26.1" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.26.1.tgz#7a9816dabd9ee846c1c0fe0e8fcad68f3709134e" - integrity sha512-21491RRQVzUn0GGM9Z1Jrpr6PNPxPi+Za8OM9q4tksTSnlbXXGKK1nXNg/QvwFYettXvSX6zWKCtHHfjN4puyA== - -core-util-is@1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" - integrity sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ== - core-util-is@~1.0.0: version "1.0.3" - resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" + resolved "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz" integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== +core-util-is@1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz" + integrity sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ== + cors@~2.8.5: version "2.8.5" - resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.5.tgz#eac11da51592dd86b9f06f6e7ac293b3df875d29" + resolved "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz" integrity sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g== dependencies: object-assign "^4" @@ -4093,7 +4138,7 @@ cors@~2.8.5: cosmiconfig@^7.0.0: version "7.1.0" - resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.1.0.tgz#1443b9afa596b670082ea46cbd8f6a62b84635f6" + resolved "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz" integrity sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA== dependencies: "@types/parse-json" "^4.0.0" @@ -4104,12 +4149,12 @@ cosmiconfig@^7.0.0: create-require@^1.1.0: version "1.1.1" - resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" + resolved "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz" integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== critters@0.0.16: version "0.0.16" - resolved "https://registry.yarnpkg.com/critters/-/critters-0.0.16.tgz#ffa2c5561a65b43c53b940036237ce72dcebfe93" + resolved "https://registry.npmjs.org/critters/-/critters-0.0.16.tgz" integrity sha512-JwjgmO6i3y6RWtLYmXwO5jMd+maZt8Tnfu7VVISmEWyQqfLpB8soBswf8/2bu6SBXxtKA68Al3c+qIG1ApT68A== dependencies: chalk "^4.1.0" @@ -4121,14 +4166,14 @@ critters@0.0.16: cross-env@^7.0.3: version "7.0.3" - resolved "https://registry.yarnpkg.com/cross-env/-/cross-env-7.0.3.tgz#865264b29677dc015ba8418918965dd232fc54cf" + resolved "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz" integrity sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw== dependencies: cross-spawn "^7.0.1" cross-spawn@^7.0.0, cross-spawn@^7.0.1, cross-spawn@^7.0.2, cross-spawn@^7.0.3: version "7.0.3" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" + resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz" integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== dependencies: path-key "^3.1.0" @@ -4137,33 +4182,33 @@ cross-spawn@^7.0.0, cross-spawn@^7.0.1, cross-spawn@^7.0.2, cross-spawn@^7.0.3: crypt@0.0.2: version "0.0.2" - resolved "https://registry.yarnpkg.com/crypt/-/crypt-0.0.2.tgz#88d7ff7ec0dfb86f713dc87bbb42d044d3e6c41b" + resolved "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz" integrity sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow== css-blank-pseudo@^3.0.2, css-blank-pseudo@^3.0.3: version "3.0.3" - resolved "https://registry.yarnpkg.com/css-blank-pseudo/-/css-blank-pseudo-3.0.3.tgz#36523b01c12a25d812df343a32c322d2a2324561" + resolved "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-3.0.3.tgz" integrity sha512-VS90XWtsHGqoM0t4KpH053c4ehxZ2E6HtGI7x68YFV0pTo/QmkV/YFA+NnlvK8guxZVNWGQhVNJGC39Q8XF4OQ== dependencies: postcss-selector-parser "^6.0.9" css-box-model@^1.2.0: version "1.2.1" - resolved "https://registry.yarnpkg.com/css-box-model/-/css-box-model-1.2.1.tgz#59951d3b81fd6b2074a62d49444415b0d2b4d7c1" + resolved "https://registry.npmjs.org/css-box-model/-/css-box-model-1.2.1.tgz" integrity sha512-a7Vr4Q/kd/aw96bnJG332W9V9LkJO69JRcaCYDUqjp6/z0w6VcZjgAcTbgFxEPfBgdnAwlh3iwu+hLopa+flJw== dependencies: tiny-invariant "^1.0.6" css-has-pseudo@^3.0.3, css-has-pseudo@^3.0.4: version "3.0.4" - resolved "https://registry.yarnpkg.com/css-has-pseudo/-/css-has-pseudo-3.0.4.tgz#57f6be91ca242d5c9020ee3e51bbb5b89fc7af73" + resolved "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-3.0.4.tgz" integrity sha512-Vse0xpR1K9MNlp2j5w1pgWIJtm1a8qS0JwS9goFYcImjlHEmywP9VUF05aGBXzGpDJF86QXk4L0ypBmwPhGArw== dependencies: postcss-selector-parser "^6.0.9" css-loader@6.5.1: version "6.5.1" - resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-6.5.1.tgz#0c43d4fbe0d97f699c91e9818cb585759091d1b1" + resolved "https://registry.npmjs.org/css-loader/-/css-loader-6.5.1.tgz" integrity sha512-gEy2w9AnJNnD9Kuo4XAP9VflW/ujKoS9c/syO+uWMlm5igc7LysKzPXaDoR2vroROkSwsTS2tGr1yGGEbZOYZQ== dependencies: icss-utils "^5.1.0" @@ -4177,12 +4222,12 @@ css-loader@6.5.1: css-prefers-color-scheme@^6.0.2, css-prefers-color-scheme@^6.0.3: version "6.0.3" - resolved "https://registry.yarnpkg.com/css-prefers-color-scheme/-/css-prefers-color-scheme-6.0.3.tgz#ca8a22e5992c10a5b9d315155e7caee625903349" + resolved "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-6.0.3.tgz" integrity sha512-4BqMbZksRkJQx2zAjrokiGMd07RqOa2IxIrrN10lyBe9xhn9DEvjUK79J6jkeiv9D9hQFXKb6g1jwU62jziJZA== css-select@^4.2.0, css-select@^4.3.0: version "4.3.0" - resolved "https://registry.yarnpkg.com/css-select/-/css-select-4.3.0.tgz#db7129b2846662fd8628cfc496abb2b59e41529b" + resolved "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz" integrity sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ== dependencies: boolbase "^1.0.0" @@ -4193,7 +4238,7 @@ css-select@^4.2.0, css-select@^4.3.0: css-vendor@^2.0.8: version "2.0.8" - resolved "https://registry.yarnpkg.com/css-vendor/-/css-vendor-2.0.8.tgz#e47f91d3bd3117d49180a3c935e62e3d9f7f449d" + resolved "https://registry.npmjs.org/css-vendor/-/css-vendor-2.0.8.tgz" integrity sha512-x9Aq0XTInxrkuFeHKbYC7zWY8ai7qJ04Kxd9MnvbC1uO5DagxoHQjm4JvG+vCdXOoFtCjbL2XSZfxmoYa9uQVQ== dependencies: "@babel/runtime" "^7.8.3" @@ -4201,12 +4246,12 @@ css-vendor@^2.0.8: css-what@^6.0.1: version "6.1.0" - resolved "https://registry.yarnpkg.com/css-what/-/css-what-6.1.0.tgz#fb5effcf76f1ddea2c81bdfaa4de44e79bac70f4" + resolved "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz" integrity sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw== css@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/css/-/css-3.0.0.tgz#4447a4d58fdd03367c516ca9f64ae365cee4aa5d" + resolved "https://registry.npmjs.org/css/-/css-3.0.0.tgz" integrity sha512-DG9pFfwOrzc+hawpmqX/dHYHJG+Bsdb0klhyi1sDneOgGOXy9wQIC8hzyVp1e4NRYDBdxcylvywPkkXCHAzTyQ== dependencies: inherits "^2.0.4" @@ -4215,64 +4260,64 @@ css@^3.0.0: cssdb@^5.0.0: version "5.1.0" - resolved "https://registry.yarnpkg.com/cssdb/-/cssdb-5.1.0.tgz#ec728d5f5c0811debd0820cbebda505d43003400" + resolved "https://registry.npmjs.org/cssdb/-/cssdb-5.1.0.tgz" integrity sha512-/vqjXhv1x9eGkE/zO6o8ZOI7dgdZbLVLUGyVRbPgk6YipXbW87YzUCcO+Jrmi5bwJlAH6oD+MNeZyRgXea1GZw== cssdb@^7.1.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/cssdb/-/cssdb-7.2.0.tgz#f44bd4abc430f0ff7f4c64b8a1fb857a753f77a8" - integrity sha512-JYlIsE7eKHSi0UNuCyo96YuIDFqvhGgHw4Ck6lsN+DP0Tp8M64UTDT2trGbkMDqnCoEjks7CkS0XcjU0rkvBdg== + version "7.5.4" + resolved "https://registry.npmjs.org/cssdb/-/cssdb-7.5.4.tgz" + integrity sha512-fGD+J6Jlq+aurfE1VDXlLS4Pt0VtNlu2+YgfGOdMxRyl/HQ9bDiHTwSck1Yz8A97Dt/82izSK6Bp/4nVqacOsg== cssesc@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" + resolved "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz" integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== cssom@^0.4.4: version "0.4.4" - resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.4.4.tgz#5a66cf93d2d0b661d80bf6a44fb65f5c2e4e0a10" + resolved "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz" integrity sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw== cssom@^0.5.0: version "0.5.0" - resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.5.0.tgz#d254fa92cd8b6fbd83811b9fbaed34663cc17c36" + resolved "https://registry.npmjs.org/cssom/-/cssom-0.5.0.tgz" integrity sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw== cssom@~0.3.6: version "0.3.8" - resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.8.tgz#9f1276f5b2b463f2114d3f2c75250af8c1a36f4a" + resolved "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz" integrity sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg== cssstyle@^2.3.0: version "2.3.0" - resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-2.3.0.tgz#ff665a0ddbdc31864b09647f34163443d90b0852" + resolved "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz" integrity sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A== dependencies: cssom "~0.3.6" csstype@^2.5.2: version "2.6.21" - resolved "https://registry.yarnpkg.com/csstype/-/csstype-2.6.21.tgz#2efb85b7cc55c80017c66a5ad7cbd931fda3a90e" + resolved "https://registry.npmjs.org/csstype/-/csstype-2.6.21.tgz" integrity sha512-Z1PhmomIfypOpoMjRQB70jfvy/wxT50qW08YXO5lMIJkrdq4yOTR+AW7FqutScmB9NkLwxo+jU+kZLbofZZq/w== csstype@^3.0.2: - version "3.1.1" - resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.1.tgz#841b532c45c758ee546a11d5bd7b7b473c8c30b9" - integrity sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw== + version "3.1.2" + resolved "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz" + integrity sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ== custom-event@~1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/custom-event/-/custom-event-1.0.1.tgz#5d02a46850adf1b4a317946a3928fccb5bfd0425" + resolved "https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz" integrity sha512-GAj5FOq0Hd+RsCGVJxZuKaIDXDf3h6GQoNEjFgbLLI/trgtavwUbSnZ5pVfg27DVCaWjIohryS0JFwIJyT2cMg== cypress-axe@^1.1.0: version "1.4.0" - resolved "https://registry.yarnpkg.com/cypress-axe/-/cypress-axe-1.4.0.tgz#e67482bfe9e740796bf77c7823f19781a8a2faff" + resolved "https://registry.npmjs.org/cypress-axe/-/cypress-axe-1.4.0.tgz" integrity sha512-Ut7NKfzjyKm0BEbt2WxuKtLkIXmx6FD2j0RwdvO/Ykl7GmB/qRQkwbKLk3VP35+83hiIr8GKD04PDdrTK5BnyA== -cypress@12.9.0: +"cypress@^10 || ^11 || ^12", cypress@12.9.0: version "12.9.0" - resolved "https://registry.yarnpkg.com/cypress/-/cypress-12.9.0.tgz#e6ab43cf329fd7c821ef7645517649d72ccf0a12" + resolved "https://registry.npmjs.org/cypress/-/cypress-12.9.0.tgz" integrity sha512-Ofe09LbHKgSqX89Iy1xen2WvpgbvNxDzsWx3mgU1mfILouELeXYGwIib3ItCwoRrRifoQwcBFmY54Vs0zw7QCg== dependencies: "@cypress/request" "^2.88.10" @@ -4320,14 +4365,14 @@ cypress@12.9.0: dashdash@^1.12.0: version "1.14.1" - resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" + resolved "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz" integrity sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g== dependencies: assert-plus "^1.0.0" data-urls@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-2.0.0.tgz#156485a72963a970f5d5821aaf642bef2bf2db9b" + resolved "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz" integrity sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ== dependencies: abab "^2.0.3" @@ -4336,7 +4381,7 @@ data-urls@^2.0.0: data-urls@^3.0.1: version "3.0.2" - resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-3.0.2.tgz#9cf24a477ae22bcef5cd5f6f0bfbc1d2d3be9143" + resolved "https://registry.npmjs.org/data-urls/-/data-urls-3.0.2.tgz" integrity sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ== dependencies: abab "^2.0.6" @@ -4344,73 +4389,94 @@ data-urls@^3.0.1: whatwg-url "^11.0.0" date-fns-tz@^1.3.7: - version "1.3.7" - resolved "https://registry.yarnpkg.com/date-fns-tz/-/date-fns-tz-1.3.7.tgz#e8e9d2aaceba5f1cc0e677631563081fdcb0e69a" - integrity sha512-1t1b8zyJo+UI8aR+g3iqr5fkUHWpd58VBx8J/ZSQ+w7YrGlw80Ag4sA86qkfCXRBLmMc4I2US+aPMd4uKvwj5g== + version "1.3.8" + resolved "https://registry.npmjs.org/date-fns-tz/-/date-fns-tz-1.3.8.tgz" + integrity sha512-qwNXUFtMHTTU6CFSFjoJ80W8Fzzp24LntbjFFBgL/faqds4e5mo9mftoRLgr3Vi1trISsg4awSpYVsOQCRnapQ== -date-fns@^2.29.3: +date-fns@^2.29.3, date-fns@>=2.0.0: version "2.29.3" - resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.29.3.tgz#27402d2fc67eb442b511b70bbdf98e6411cd68a8" + resolved "https://registry.npmjs.org/date-fns/-/date-fns-2.29.3.tgz" integrity sha512-dDCnyH2WnnKusqvZZ6+jA1O51Ibt8ZMRNkDZdyAyK4YfbDwa/cEmuztzG5pk6hqlp9aSBPYcjOlktquahGwGeA== date-format@^4.0.14: version "4.0.14" - resolved "https://registry.yarnpkg.com/date-format/-/date-format-4.0.14.tgz#7a8e584434fb169a521c8b7aa481f355810d9400" + resolved "https://registry.npmjs.org/date-format/-/date-format-4.0.14.tgz" integrity sha512-39BOQLs9ZjKh0/patS9nrT8wc3ioX3/eA/zgbKNopnF2wCqJEoxywwwElATYvRsXdnOxA/OQeQoFZ3rFjVajhg== dayjs@^1.10.4: version "1.11.7" - resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.7.tgz#4b296922642f70999544d1144a2c25730fce63e2" + resolved "https://registry.npmjs.org/dayjs/-/dayjs-1.11.7.tgz" integrity sha512-+Yw9U6YO5TQohxLcIkrXBeY73WP3ejHWVvx8XCk3gxvQDCTEmS48ZrSZCKciI7Bhl/uCMyxYtE9UqRILmFphkQ== -debug@2.6.9, debug@^2.2.0, debug@^2.6.9: +debug@^2.2.0: version "2.6.9" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + resolved "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz" integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== dependencies: ms "2.0.0" -debug@4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.2, debug@^4.3.3, debug@^4.3.4, debug@~4.3.1, debug@~4.3.2: +debug@^3.1.0: + version "3.2.7" + resolved "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz" + integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== + dependencies: + ms "^2.1.1" + +debug@^3.2.6: + version "3.2.7" + resolved "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz" + integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== + dependencies: + ms "^2.1.1" + +debug@^3.2.7: + version "3.2.7" + resolved "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz" + integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== + dependencies: + ms "^2.1.1" + +debug@^4.1.0, debug@^4.1.1, debug@^4.3.2, debug@^4.3.3, debug@^4.3.4, debug@~4.3.1, debug@~4.3.2, debug@4: version "4.3.4" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" + resolved "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz" integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== dependencies: ms "2.1.2" +debug@2.6.9: + version "2.6.9" + resolved "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + debug@4.3.2: version "4.3.2" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.2.tgz#f0a49c18ac8779e31d4a0c6029dfb76873c7428b" + resolved "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz" integrity sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw== dependencies: ms "2.1.2" debug@4.3.3: version "4.3.3" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.3.tgz#04266e0b70a98d4462e6e288e38259213332b664" + resolved "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz" integrity sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q== dependencies: ms "2.1.2" -debug@^3.1.0, debug@^3.2.6, debug@^3.2.7: - version "3.2.7" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" - integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== - dependencies: - ms "^2.1.1" - decimal.js@^10.2.1, decimal.js@^10.3.1: version "10.4.3" - resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.4.3.tgz#1044092884d245d1b7f65725fa4ad4c6f781cc23" + resolved "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz" integrity sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA== decode-uri-component@^0.2.0: version "0.2.2" - resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.2.tgz#e69dbe25d37941171dd540e024c444cd5188e1e9" + resolved "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz" integrity sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ== deep-equal@^1.0.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.1.1.tgz#b5c98c942ceffaf7cb051e24e1434a25a2e6076a" + resolved "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz" integrity sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g== dependencies: is-arguments "^1.0.4" @@ -4422,62 +4488,49 @@ deep-equal@^1.0.1: deep-freeze@0.0.1: version "0.0.1" - resolved "https://registry.yarnpkg.com/deep-freeze/-/deep-freeze-0.0.1.tgz#3a0b0005de18672819dfd38cd31f91179c893e84" + resolved "https://registry.npmjs.org/deep-freeze/-/deep-freeze-0.0.1.tgz" integrity sha512-Z+z8HiAvsGwmjqlphnHW5oz6yWlOwu6EQfFTjmeTWlDeda3FS2yv3jhq35TX/ewmsnqB+RX2IdsIOyjJCQN5tg== deep-is@^0.1.3, deep-is@~0.1.3: version "0.1.4" - resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" + resolved "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz" integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== deepmerge@^4.2.2: - version "4.2.2" - resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.2.2.tgz#44d2ea3679b8f4d4ffba33f03d865fc1e7bf4955" - integrity sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg== + version "4.3.1" + resolved "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz" + integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== default-gateway@^6.0.3: version "6.0.3" - resolved "https://registry.yarnpkg.com/default-gateway/-/default-gateway-6.0.3.tgz#819494c888053bdb743edbf343d6cdf7f2943a71" + resolved "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz" integrity sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg== dependencies: execa "^5.0.0" defaults@^1.0.3: version "1.0.4" - resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.4.tgz#b0b02062c1e2aa62ff5d9528f0f98baa90978d7a" + resolved "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz" integrity sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A== dependencies: clone "^1.0.2" define-lazy-prop@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz#3f7ae421129bcaaac9bc74905c98a0009ec9ee7f" + resolved "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz" integrity sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og== define-properties@^1.1.3, define-properties@^1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.4.tgz#0b14d7bd7fbeb2f3572c3a7eda80ea5d57fb05b1" - integrity sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA== + version "1.2.0" + resolved "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz" + integrity sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA== dependencies: has-property-descriptors "^1.0.0" object-keys "^1.1.1" -del@^2.2.0: - version "2.2.2" - resolved "https://registry.yarnpkg.com/del/-/del-2.2.2.tgz#c12c981d067846c84bcaf862cff930d907ffd1a8" - integrity sha512-Z4fzpbIRjOu7lO5jCETSWoqUDVe0IPOlfugBsF6suen2LKDlVb4QZpKEM9P+buNJ4KI1eN7I083w/pbKUpsrWQ== - dependencies: - globby "^5.0.0" - is-path-cwd "^1.0.0" - is-path-in-cwd "^1.0.0" - object-assign "^4.0.1" - pify "^2.0.0" - pinkie-promise "^2.0.0" - rimraf "^2.2.8" - del@^6.0.0: version "6.1.1" - resolved "https://registry.yarnpkg.com/del/-/del-6.1.1.tgz#3b70314f1ec0aa325c6b14eb36b95786671edb7a" + resolved "https://registry.npmjs.org/del/-/del-6.1.1.tgz" integrity sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg== dependencies: globby "^11.0.1" @@ -4491,129 +4544,124 @@ del@^6.0.0: delayed-stream@~1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + resolved "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz" integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== delegates@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" + resolved "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz" integrity sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ== -depd@2.0.0, depd@~2.0.0: +depd@^2.0.0, depd@~2.0.0, depd@2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" + resolved "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz" integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== -depd@^1.1.2, depd@~1.1.2: +depd@~1.1.2: version "1.1.2" - resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" + resolved "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz" integrity sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ== dependency-graph@^0.11.0: version "0.11.0" - resolved "https://registry.yarnpkg.com/dependency-graph/-/dependency-graph-0.11.0.tgz#ac0ce7ed68a54da22165a85e97a01d53f5eb2e27" + resolved "https://registry.npmjs.org/dependency-graph/-/dependency-graph-0.11.0.tgz" integrity sha512-JeMq7fEshyepOWDfcfHK06N3MhyPhz++vtqWhMT5O9A3K42rdsEDpfdVqjaqaAhsw6a+ZqeDvQVtD0hFHQWrzg== -destroy@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" - integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== - destroy@~1.0.4: version "1.0.4" - resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" + resolved "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz" integrity sha512-3NdhDuEXnfun/z7x9GOElY49LoqVHoGScmOKwmxhsS8N5Y+Z8KyPPDnaSzqWgYt/ji4mqwfTS34Htrk0zPIXVg== +destroy@1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz" + integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== + detect-node@^2.0.4: version "2.1.0" - resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.1.0.tgz#c9c70775a49c3d03bc2c06d9a73be550f978f8b1" + resolved "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz" integrity sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g== dev-ip@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/dev-ip/-/dev-ip-1.0.1.tgz#a76a3ed1855be7a012bb8ac16cb80f3c00dc28f0" + resolved "https://registry.npmjs.org/dev-ip/-/dev-ip-1.0.1.tgz" integrity sha512-LmVkry/oDShEgSZPNgqCIp2/TlqtExeGmymru3uCELnfyjY11IzpAproLYs+1X88fXO6DBoYP3ul2Xo2yz2j6A== di@^0.0.1: version "0.0.1" - resolved "https://registry.yarnpkg.com/di/-/di-0.0.1.tgz#806649326ceaa7caa3306d75d985ea2748ba913c" + resolved "https://registry.npmjs.org/di/-/di-0.0.1.tgz" integrity sha512-uJaamHkagcZtHPqCIHZxnFrXlunQXgBOsZSUOWwFw31QJCAbyTBoHMW75YOTur5ZNx8pIeAKgf6GWIgaqqiLhA== diff@^4.0.1: version "4.0.2" - resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" + resolved "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz" integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== dir-glob@^3.0.1: version "3.0.1" - resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" + resolved "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz" integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== dependencies: path-type "^4.0.0" -dlv@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/dlv/-/dlv-1.1.3.tgz#5c198a8a11453596e751494d49874bc7732f2e79" - integrity sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA== - dnd-core@^10.0.2: version "10.0.2" - resolved "https://registry.yarnpkg.com/dnd-core/-/dnd-core-10.0.2.tgz#051dc119682ea1185622f954667670d3d5f6a574" + resolved "https://registry.npmjs.org/dnd-core/-/dnd-core-10.0.2.tgz" integrity sha512-PrxEjxF0+6Y1n1n1Z9hSWZ1tvnDXv9syL+BccV1r1RC08uWNsyetf8AnWmUF3NgYPwy0HKQJwTqGkZK+1NlaFA== dependencies: "@react-dnd/asap" "^4.0.0" "@react-dnd/invariant" "^2.0.0" redux "^4.0.4" -dnd-multi-backend@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/dnd-multi-backend/-/dnd-multi-backend-5.1.1.tgz#0032761795c3df6a479989f002d8a7d92ad58094" - integrity sha512-+bdMsGAC1wlne4+AwTvr6eQ6Bp3St6hn0wp0BcpUMOMVTNM0S+n0Ha8S/qbpYK7XY+i0j439v+yaKO9g9aFvQg== +dnd-multi-backend@^5.0.1: + version "5.0.1" + resolved "https://registry.npmjs.org/dnd-multi-backend/-/dnd-multi-backend-5.0.1.tgz" + integrity sha512-BAOj6fIeGfZPA1LreehaV8mUD7Ww0EpaKqSDRrZ5mZXLWLIxFPPT3bIvpJhHUCt0+lTrOqkXu11Hudh+gHXNUA== dns-equal@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/dns-equal/-/dns-equal-1.0.0.tgz#b39e7f1da6eb0a75ba9c17324b34753c47e0654d" + resolved "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz" integrity sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg== dns-packet@^1.3.1: version "1.3.4" - resolved "https://registry.yarnpkg.com/dns-packet/-/dns-packet-1.3.4.tgz#e3455065824a2507ba886c55a89963bb107dec6f" + resolved "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.4.tgz" integrity sha512-BQ6F4vycLXBvdrJZ6S3gZewt6rcrks9KBgM9vrhW+knGRqc8uEdT7fuCwloc7nny5xNoMJ17HGH0R/6fpo8ECA== dependencies: ip "^1.1.0" safe-buffer "^5.0.1" dns-packet@^5.2.2: - version "5.4.0" - resolved "https://registry.yarnpkg.com/dns-packet/-/dns-packet-5.4.0.tgz#1f88477cf9f27e78a213fb6d118ae38e759a879b" - integrity sha512-EgqGeaBB8hLiHLZtp/IbaDQTL8pZ0+IvwzSHA6d7VyMDM+B9hgddEMa9xjK5oYnw0ci0JQ6g2XCD7/f6cafU6g== + version "5.5.0" + resolved "https://registry.npmjs.org/dns-packet/-/dns-packet-5.5.0.tgz" + integrity sha512-USawdAUzRkV6xrqTjiAEp6M9YagZEzWcSUaZTcIFAiyQWW1SoI6KyId8y2+/71wbgHKQAKd+iupLv4YvEwYWvA== dependencies: "@leichtgewicht/ip-codec" "^2.0.1" dns-txt@^2.0.2: version "2.0.2" - resolved "https://registry.yarnpkg.com/dns-txt/-/dns-txt-2.0.2.tgz#b91d806f5d27188e4ab3e7d107d881a1cc4642b6" + resolved "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz" integrity sha512-Ix5PrWjphuSoUXV/Zv5gaFHjnaJtb02F2+Si3Ht9dyJ87+Z/lMmy+dpNHtTGraNK958ndXq2i+GLkWsWHcKaBQ== dependencies: buffer-indexof "^1.0.0" doctrine@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" + resolved "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz" integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== dependencies: esutils "^2.0.2" doctrine@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" + resolved "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz" integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== dependencies: esutils "^2.0.2" dom-helpers@^5.0.1: version "5.2.1" - resolved "https://registry.yarnpkg.com/dom-helpers/-/dom-helpers-5.2.1.tgz#d9400536b2bf8225ad98fe052e029451ac40e902" + resolved "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz" integrity sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA== dependencies: "@babel/runtime" "^7.8.7" @@ -4621,7 +4669,7 @@ dom-helpers@^5.0.1: dom-serialize@^2.2.1: version "2.2.1" - resolved "https://registry.yarnpkg.com/dom-serialize/-/dom-serialize-2.2.1.tgz#562ae8999f44be5ea3076f5419dcd59eb43ac95b" + resolved "https://registry.npmjs.org/dom-serialize/-/dom-serialize-2.2.1.tgz" integrity sha512-Yra4DbvoW7/Z6LBN560ZwXMjoNOSAN2wRsKFGc4iBeso+mpIA6qj1vfdf9HpMaKAqG6wXTy+1SYEzmNpKXOSsQ== dependencies: custom-event "~1.0.0" @@ -4631,92 +4679,117 @@ dom-serialize@^2.2.1: dom-serializer@^1.0.1, dom-serializer@^1.3.2: version "1.4.1" - resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-1.4.1.tgz#de5d41b1aea290215dc45a6dae8adcf1d32e2d30" + resolved "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz" integrity sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag== dependencies: domelementtype "^2.0.1" domhandler "^4.2.0" entities "^2.0.0" -domelementtype@^2.0.1, domelementtype@^2.2.0: +dom-serializer@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz" + integrity sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg== + dependencies: + domelementtype "^2.3.0" + domhandler "^5.0.2" + entities "^4.2.0" + +domelementtype@^2.0.1, domelementtype@^2.2.0, domelementtype@^2.3.0: version "2.3.0" - resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.3.0.tgz#5c45e8e869952626331d7aab326d01daf65d589d" + resolved "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz" integrity sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw== domexception@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/domexception/-/domexception-2.0.1.tgz#fb44aefba793e1574b0af6aed2801d057529f304" + resolved "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz" integrity sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg== dependencies: webidl-conversions "^5.0.0" domexception@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/domexception/-/domexception-4.0.0.tgz#4ad1be56ccadc86fc76d033353999a8037d03673" + resolved "https://registry.npmjs.org/domexception/-/domexception-4.0.0.tgz" integrity sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw== dependencies: webidl-conversions "^7.0.0" domhandler@^3.3.0: version "3.3.0" - resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-3.3.0.tgz#6db7ea46e4617eb15cf875df68b2b8524ce0037a" + resolved "https://registry.npmjs.org/domhandler/-/domhandler-3.3.0.tgz" integrity sha512-J1C5rIANUbuYK+FuFL98650rihynUOEzRLxW+90bKZRWB6A1X1Tf82GxR1qAWLyfNPRvjqfip3Q5tdYlmAa9lA== dependencies: domelementtype "^2.0.1" domhandler@^4.0.0, domhandler@^4.2.0, domhandler@^4.3.1: version "4.3.1" - resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-4.3.1.tgz#8d792033416f59d68bc03a5aa7b018c1ca89279c" + resolved "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz" integrity sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ== dependencies: domelementtype "^2.2.0" +domhandler@^5.0.1, domhandler@^5.0.2, domhandler@^5.0.3: + version "5.0.3" + resolved "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz" + integrity sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w== + dependencies: + domelementtype "^2.3.0" + domino@^2.1.2: version "2.1.6" - resolved "https://registry.yarnpkg.com/domino/-/domino-2.1.6.tgz#fe4ace4310526e5e7b9d12c7de01b7f485a57ffe" + resolved "https://registry.npmjs.org/domino/-/domino-2.1.6.tgz" integrity sha512-3VdM/SXBZX2omc9JF9nOPCtDaYQ67BGp5CoLpIQlO2KCAPETs8TcDHacF26jXadGbvUteZzRTeos2fhID5+ucQ== dompurify@^2.0.11: - version "2.4.1" - resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-2.4.1.tgz#f9cb1a275fde9af6f2d0a2644ef648dd6847b631" - integrity sha512-ewwFzHzrrneRjxzmK6oVz/rZn9VWspGFRDb4/rRtIsM1n36t9AKma/ye8syCpcw+XJ25kOK/hOG7t1j2I2yBqA== + version "2.4.5" + resolved "https://registry.npmjs.org/dompurify/-/dompurify-2.4.5.tgz" + integrity sha512-jggCCd+8Iqp4Tsz0nIvpcb22InKEBrGz5dw3EQJMs8HPJDsKbFIO3STYtAvCfDx26Muevn1MHVI0XxjgFfmiSA== domutils@^2.4.2, domutils@^2.5.2, domutils@^2.8.0: version "2.8.0" - resolved "https://registry.yarnpkg.com/domutils/-/domutils-2.8.0.tgz#4437def5db6e2d1f5d6ee859bd95ca7d02048135" + resolved "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz" integrity sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A== dependencies: dom-serializer "^1.0.1" domelementtype "^2.2.0" domhandler "^4.2.0" +domutils@^3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/domutils/-/domutils-3.0.1.tgz" + integrity sha512-z08c1l761iKhDFtfXO04C7kTdPBLi41zwOZl00WS8b5eiaebNpY00HKbztwBq+e3vyqWNwWF3mP9YLUeqIrF+Q== + dependencies: + dom-serializer "^2.0.0" + domelementtype "^2.3.0" + domhandler "^5.0.1" + dotenv@~10.0.0: version "10.0.0" - resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-10.0.0.tgz#3d4227b8fb95f81096cdd2b66653fb2c7085ba81" + resolved "https://registry.npmjs.org/dotenv/-/dotenv-10.0.0.tgz" integrity sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q== duplexer@^0.1.1, duplexer@^0.1.2: version "0.1.2" - resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.2.tgz#3abe43aef3835f8ae077d136ddce0f276b0400e6" + resolved "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz" integrity sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg== easy-extender@^2.3.4: version "2.3.4" - resolved "https://registry.yarnpkg.com/easy-extender/-/easy-extender-2.3.4.tgz#298789b64f9aaba62169c77a2b3b64b4c9589b8f" + resolved "https://registry.npmjs.org/easy-extender/-/easy-extender-2.3.4.tgz" integrity sha512-8cAwm6md1YTiPpOvDULYJL4ZS6WfM5/cTeVVh4JsvyYZAoqlRVUpHL9Gr5Fy7HA6xcSZicUia3DeAgO3Us8E+Q== dependencies: lodash "^4.17.10" -eazy-logger@3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/eazy-logger/-/eazy-logger-3.1.0.tgz#b169eb56df714608fa114f164c8a2956bec9f0f3" - integrity sha512-/snsn2JqBtUSSstEl4R0RKjkisGHAhvYj89i7r3ytNUKW12y178KDZwXLXIgwDqLW6E/VRMT9qfld7wvFae8bQ== +eazy-logger@^4.0.1: + version "4.0.1" + resolved "https://registry.npmjs.org/eazy-logger/-/eazy-logger-4.0.1.tgz" + integrity sha512-2GSFtnnC6U4IEKhEI7+PvdxrmjJ04mdsj3wHZTFiw0tUtG4HCWzTr13ZYTk8XOGnA1xQMaDljoBOYlk3D/MMSw== dependencies: - tfunk "^4.0.0" + chalk "4.1.2" ecc-jsbn@~0.1.1: version "0.1.2" - resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" + resolved "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz" integrity sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw== dependencies: jsbn "~0.1.0" @@ -4724,77 +4797,77 @@ ecc-jsbn@~0.1.1: ee-first@1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" + resolved "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz" integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== ejs@^3.1.5, ejs@^3.1.8: - version "3.1.8" - resolved "https://registry.yarnpkg.com/ejs/-/ejs-3.1.8.tgz#758d32910c78047585c7ef1f92f9ee041c1c190b" - integrity sha512-/sXZeMlhS0ArkfX2Aw780gJzXSMPnKjtspYZv+f3NiKLlubezAHDU5+9xz6gd3/NhG3txQCo6xlglmTS+oTGEQ== + version "3.1.9" + resolved "https://registry.npmjs.org/ejs/-/ejs-3.1.9.tgz" + integrity sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ== dependencies: jake "^10.8.5" -electron-to-chromium@^1.4.251: - version "1.4.284" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz#61046d1e4cab3a25238f6bf7413795270f125592" - integrity sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA== +electron-to-chromium@^1.4.284: + version "1.4.357" + resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.357.tgz" + integrity sha512-UTkCbNTAcGXABmEnQrGcW4m3cG6fcyBfD4KDF0iyEAlbrGZiY9dmslyDAGOD1Kr5biN2F743Y30aRCOtau35Vw== element-resize-detector@^1.2.1: version "1.2.4" - resolved "https://registry.yarnpkg.com/element-resize-detector/-/element-resize-detector-1.2.4.tgz#3e6c5982dd77508b5fa7e6d5c02170e26325c9b1" + resolved "https://registry.npmjs.org/element-resize-detector/-/element-resize-detector-1.2.4.tgz" integrity sha512-Fl5Ftk6WwXE0wqCgNoseKWndjzZlDCwuPTcoVZfCP9R3EHQF8qUtr3YUPNETegRBOKqQKPW3n4kiIWngGi8tKg== dependencies: batch-processor "1.0.0" emoji-regex@^8.0.0: version "8.0.0" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz" integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== emojis-list@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78" + resolved "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz" integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q== encodeurl@~1.0.1, encodeurl@~1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" + resolved "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz" integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== -encoding@^0.1.12, encoding@^0.1.13: +encoding@^0.1.0, encoding@^0.1.12, encoding@^0.1.13: version "0.1.13" - resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.13.tgz#56574afdd791f54a8e9b2785c0582a2d26210fa9" + resolved "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz" integrity sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A== dependencies: iconv-lite "^0.6.2" end-of-stream@^1.1.0, end-of-stream@^1.4.1: version "1.4.4" - resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" + resolved "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz" integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== dependencies: once "^1.4.0" -engine.io-client@~6.2.3: - version "6.2.3" - resolved "https://registry.yarnpkg.com/engine.io-client/-/engine.io-client-6.2.3.tgz#a8cbdab003162529db85e9de31575097f6d29458" - integrity sha512-aXPtgF1JS3RuuKcpSrBtimSjYvrbhKW9froICH4s0F3XQWLxsKNxqzG39nnvQZQnva4CMvUK63T7shevxRyYHw== +engine.io-client@~6.4.0: + version "6.4.0" + resolved "https://registry.npmjs.org/engine.io-client/-/engine.io-client-6.4.0.tgz" + integrity sha512-GyKPDyoEha+XZ7iEqam49vz6auPnNJ9ZBfy89f+rMMas8AuiMWOZ9PVzu8xb9ZC6rafUqiGHSCfu22ih66E+1g== dependencies: "@socket.io/component-emitter" "~3.1.0" debug "~4.3.1" engine.io-parser "~5.0.3" - ws "~8.2.3" + ws "~8.11.0" xmlhttprequest-ssl "~2.0.0" engine.io-parser@~5.0.3: - version "5.0.4" - resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-5.0.4.tgz#0b13f704fa9271b3ec4f33112410d8f3f41d0fc0" - integrity sha512-+nVFp+5z1E3HcToEnO7ZIj3g+3k9389DvWtvJZz0T6/eOCPIyyxehFcedoYrZQrp0LgQbD9pPXhpMBKMd5QURg== + version "5.0.6" + resolved "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.0.6.tgz" + integrity sha512-tjuoZDMAdEhVnSFleYPCtdL2GXwVTGtNjoeJd9IhIG3C1xs9uwxqRNEu5WpnDZCaozwVlK/nuQhpodhXSIMaxw== -engine.io@~6.2.1: - version "6.2.1" - resolved "https://registry.yarnpkg.com/engine.io/-/engine.io-6.2.1.tgz#e3f7826ebc4140db9bbaa9021ad6b1efb175878f" - integrity sha512-ECceEFcAaNRybd3lsGQKas3ZlMVjN3cyWwMP25D2i0zWfyiytVbTpRPa34qrr+FHddtpBVOmq4H/DCv1O0lZRA== +engine.io@~6.4.1: + version "6.4.1" + resolved "https://registry.npmjs.org/engine.io/-/engine.io-6.4.1.tgz" + integrity sha512-JFYQurD/nbsA5BSPmbaOSLa3tSVj8L6o4srSwXXY3NqE+gGUNmmPTbhn8tjzcCtSqhFgIeqef81ngny8JM25hw== dependencies: "@types/cookie" "^0.4.1" "@types/cors" "^2.8.12" @@ -4805,119 +4878,143 @@ engine.io@~6.2.1: cors "~2.8.5" debug "~4.3.1" engine.io-parser "~5.0.3" - ws "~8.2.3" + ws "~8.11.0" -enhanced-resolve@^5.10.0, enhanced-resolve@^5.9.2: +enhanced-resolve@^5.10.0: version "5.12.0" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.12.0.tgz#300e1c90228f5b570c4d35babf263f6da7155634" + resolved "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.12.0.tgz" integrity sha512-QHTXI/sZQmko1cbDoNAa3mJ5qhWUUNAq3vR0/YiD379fWQrcfuoX1+HW2S0MTt7XmoPLapdaDKUtelUSPic7hQ== dependencies: graceful-fs "^4.2.4" tapable "^2.2.0" -enquirer@^2.3.6, enquirer@~2.3.6: +enquirer@^2.3.6, "enquirer@>= 2.3.0 < 3", enquirer@~2.3.6: version "2.3.6" - resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.6.tgz#2a7fe5dd634a1e4125a975ec994ff5456dc3734d" + resolved "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz" integrity sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg== dependencies: ansi-colors "^4.1.1" ent@~2.2.0: version "2.2.0" - resolved "https://registry.yarnpkg.com/ent/-/ent-2.2.0.tgz#e964219325a21d05f44466a2f686ed6ce5f5dd1d" + resolved "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz" integrity sha512-GHrMyVZQWvTIdDtpiEXdHZnFQKzeO09apj8Cbl4pKWy4i0Oprcq17usfDt5aO63swf0JOeMWjWQE/LzgSRuWpA== entities@^2.0.0: version "2.2.0" - resolved "https://registry.yarnpkg.com/entities/-/entities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55" + resolved "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz" integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A== +entities@^4.2.0, entities@^4.4.0: + version "4.4.0" + resolved "https://registry.npmjs.org/entities/-/entities-4.4.0.tgz" + integrity sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA== + entities@~3.0.1: version "3.0.1" - resolved "https://registry.yarnpkg.com/entities/-/entities-3.0.1.tgz#2b887ca62585e96db3903482d336c1006c3001d4" + resolved "https://registry.npmjs.org/entities/-/entities-3.0.1.tgz" integrity sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q== env-paths@^2.2.0: version "2.2.1" - resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.1.tgz#420399d416ce1fbe9bc0a07c62fa68d67fd0f8f2" + resolved "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz" integrity sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A== envinfo@^7.7.3: version "7.8.1" - resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.8.1.tgz#06377e3e5f4d379fea7ac592d5ad8927e0c4d475" + resolved "https://registry.npmjs.org/envinfo/-/envinfo-7.8.1.tgz" integrity sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw== err-code@^2.0.2: version "2.0.3" - resolved "https://registry.yarnpkg.com/err-code/-/err-code-2.0.3.tgz#23c2f3b756ffdfc608d30e27c9a941024807e7f9" + resolved "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz" integrity sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA== errno@^0.1.1: version "0.1.8" - resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.8.tgz#8bb3e9c7d463be4976ff888f76b4809ebc2e811f" + resolved "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz" integrity sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A== dependencies: prr "~1.0.1" error-ex@^1.3.1: version "1.3.2" - resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" + resolved "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz" integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== dependencies: is-arrayish "^0.2.1" error-stack-parser@^2.0.1: version "2.1.4" - resolved "https://registry.yarnpkg.com/error-stack-parser/-/error-stack-parser-2.1.4.tgz#229cb01cdbfa84440bfa91876285b94680188286" + resolved "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.1.4.tgz" integrity sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ== dependencies: stackframe "^1.3.4" es-abstract@^1.19.0, es-abstract@^1.20.4: - version "1.20.4" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.20.4.tgz#1d103f9f8d78d4cf0713edcd6d0ed1a46eed5861" - integrity sha512-0UtvRN79eMe2L+UNEF1BwRe364sj/DXhQ/k5FmivgoSdpM90b8Jc0mDzKMGo7QS0BVbOP/bTwBKNnDc9rNzaPA== + version "1.21.2" + resolved "https://registry.npmjs.org/es-abstract/-/es-abstract-1.21.2.tgz" + integrity sha512-y/B5POM2iBnIxCiernH1G7rC9qQoM77lLIMQLuob0zhp8C56Po81+2Nj0WFKnd0pNReDTnkYryc+zhOzpEIROg== dependencies: + array-buffer-byte-length "^1.0.0" + available-typed-arrays "^1.0.5" call-bind "^1.0.2" + es-set-tostringtag "^2.0.1" es-to-primitive "^1.2.1" - function-bind "^1.1.1" function.prototype.name "^1.1.5" - get-intrinsic "^1.1.3" + get-intrinsic "^1.2.0" get-symbol-description "^1.0.0" + globalthis "^1.0.3" + gopd "^1.0.1" has "^1.0.3" has-property-descriptors "^1.0.0" + has-proto "^1.0.1" has-symbols "^1.0.3" - internal-slot "^1.0.3" + internal-slot "^1.0.5" + is-array-buffer "^3.0.2" is-callable "^1.2.7" is-negative-zero "^2.0.2" is-regex "^1.1.4" is-shared-array-buffer "^1.0.2" is-string "^1.0.7" + is-typed-array "^1.1.10" is-weakref "^1.0.2" - object-inspect "^1.12.2" + object-inspect "^1.12.3" object-keys "^1.1.1" object.assign "^4.1.4" regexp.prototype.flags "^1.4.3" safe-regex-test "^1.0.0" - string.prototype.trimend "^1.0.5" - string.prototype.trimstart "^1.0.5" + string.prototype.trim "^1.2.7" + string.prototype.trimend "^1.0.6" + string.prototype.trimstart "^1.0.6" + typed-array-length "^1.0.4" unbox-primitive "^1.0.2" + which-typed-array "^1.1.9" es-module-lexer@^0.9.0: version "0.9.3" - resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-0.9.3.tgz#6f13db00cc38417137daf74366f535c8eb438f19" + resolved "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz" integrity sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ== +es-set-tostringtag@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz" + integrity sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg== + dependencies: + get-intrinsic "^1.1.3" + has "^1.0.3" + has-tostringtag "^1.0.0" + es-shim-unscopables@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz#702e632193201e3edf8713635d083d378e510241" + resolved "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz" integrity sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w== dependencies: has "^1.0.3" es-to-primitive@^1.2.1: version "1.2.1" - resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" + resolved "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz" integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== dependencies: is-callable "^1.1.4" @@ -4926,112 +5023,22 @@ es-to-primitive@^1.2.1: es6-promisify@^6.0.0: version "6.1.1" - resolved "https://registry.yarnpkg.com/es6-promisify/-/es6-promisify-6.1.1.tgz#46837651b7b06bf6fff893d03f29393668d01621" + resolved "https://registry.npmjs.org/es6-promisify/-/es6-promisify-6.1.1.tgz" integrity sha512-HBL8I3mIki5C1Cc9QjKUenHtnG0A5/xA8Q/AllRcfiwl2CZFXGK7ddBiCoRwAix4i2KxcQfjtIVcrVbB3vbmwg== -esbuild-android-arm64@0.14.22: - version "0.14.22" - resolved "https://registry.yarnpkg.com/esbuild-android-arm64/-/esbuild-android-arm64-0.14.22.tgz#fb051169a63307d958aec85ad596cfc7d7770303" - integrity sha512-k1Uu4uC4UOFgrnTj2zuj75EswFSEBK+H6lT70/DdS4mTAOfs2ECv2I9ZYvr3w0WL0T4YItzJdK7fPNxcPw6YmQ== - esbuild-darwin-64@0.14.22: version "0.14.22" - resolved "https://registry.yarnpkg.com/esbuild-darwin-64/-/esbuild-darwin-64-0.14.22.tgz#615ea0a9de67b57a293a7128d7ac83ee307a856d" + resolved "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.14.22.tgz" integrity sha512-d8Ceuo6Vw6HM3fW218FB6jTY6O3r2WNcTAU0SGsBkXZ3k8SDoRLd3Nrc//EqzdgYnzDNMNtrWegK2Qsss4THhw== -esbuild-darwin-arm64@0.14.22: - version "0.14.22" - resolved "https://registry.yarnpkg.com/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.22.tgz#82054dcfcecb15ccfd237093b8008e7745a99ad9" - integrity sha512-YAt9Tj3SkIUkswuzHxkaNlT9+sg0xvzDvE75LlBo4DI++ogSgSmKNR6B4eUhU5EUUepVXcXdRIdqMq9ppeRqfw== - -esbuild-freebsd-64@0.14.22: - version "0.14.22" - resolved "https://registry.yarnpkg.com/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.22.tgz#778a818c5b078d5cdd6bb6c0e0797217d196999b" - integrity sha512-ek1HUv7fkXMy87Qm2G4IRohN+Qux4IcnrDBPZGXNN33KAL0pEJJzdTv0hB/42+DCYWylSrSKxk3KUXfqXOoH4A== - -esbuild-freebsd-arm64@0.14.22: - version "0.14.22" - resolved "https://registry.yarnpkg.com/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.22.tgz#18da93b9f3db2e036f72383bfe73b28b73bb332c" - integrity sha512-zPh9SzjRvr9FwsouNYTqgqFlsMIW07O8mNXulGeQx6O5ApgGUBZBgtzSlBQXkHi18WjrosYfsvp5nzOKiWzkjQ== - -esbuild-linux-32@0.14.22: - version "0.14.22" - resolved "https://registry.yarnpkg.com/esbuild-linux-32/-/esbuild-linux-32-0.14.22.tgz#d0d5d9f5bb3536e17ac097e9512019c65b7c0234" - integrity sha512-SnpveoE4nzjb9t2hqCIzzTWBM0RzcCINDMBB67H6OXIuDa4KqFqaIgmTchNA9pJKOVLVIKd5FYxNiJStli21qg== - -esbuild-linux-64@0.14.22: - version "0.14.22" - resolved "https://registry.yarnpkg.com/esbuild-linux-64/-/esbuild-linux-64-0.14.22.tgz#2773d540971999ea7f38107ef92fca753f6a8c30" - integrity sha512-Zcl9Wg7gKhOWWNqAjygyqzB+fJa19glgl2JG7GtuxHyL1uEnWlpSMytTLMqtfbmRykIHdab797IOZeKwk5g0zg== - -esbuild-linux-arm64@0.14.22: - version "0.14.22" - resolved "https://registry.yarnpkg.com/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.22.tgz#5d4480ce6d6bffab1dd76a23158f5a5ab33e7ba4" - integrity sha512-8q/FRBJtV5IHnQChO3LHh/Jf7KLrxJ/RCTGdBvlVZhBde+dk3/qS9fFsUy+rs3dEi49aAsyVitTwlKw1SUFm+A== - -esbuild-linux-arm@0.14.22: - version "0.14.22" - resolved "https://registry.yarnpkg.com/esbuild-linux-arm/-/esbuild-linux-arm-0.14.22.tgz#c6391b3f7c8fa6d3b99a7e893ce0f45f3a921eef" - integrity sha512-soPDdbpt/C0XvOOK45p4EFt8HbH5g+0uHs5nUKjHVExfgR7du734kEkXR/mE5zmjrlymk5AA79I0VIvj90WZ4g== - -esbuild-linux-mips64le@0.14.22: - version "0.14.22" - resolved "https://registry.yarnpkg.com/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.22.tgz#2c8dabac355c502e86c38f9f292b3517d8e181f3" - integrity sha512-SiNDfuRXhGh1JQLLA9JPprBgPVFOsGuQ0yDfSPTNxztmVJd8W2mX++c4FfLpAwxuJe183mLuKf7qKCHQs5ZnBQ== - -esbuild-linux-ppc64le@0.14.22: - version "0.14.22" - resolved "https://registry.yarnpkg.com/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.22.tgz#69d71b2820d5c94306072dac6094bae38e77d1c0" - integrity sha512-6t/GI9I+3o1EFm2AyN9+TsjdgWCpg2nwniEhjm2qJWtJyJ5VzTXGUU3alCO3evopu8G0hN2Bu1Jhz2YmZD0kng== - -esbuild-linux-riscv64@0.14.22: - version "0.14.22" - resolved "https://registry.yarnpkg.com/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.22.tgz#c0ec0fc3a23624deebf657781550d2329cec4213" - integrity sha512-AyJHipZKe88sc+tp5layovquw5cvz45QXw5SaDgAq2M911wLHiCvDtf/07oDx8eweCyzYzG5Y39Ih568amMTCQ== - -esbuild-linux-s390x@0.14.22: - version "0.14.22" - resolved "https://registry.yarnpkg.com/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.22.tgz#ec2af4572d63336cfb27f5a5c851fb1b6617dd91" - integrity sha512-Sz1NjZewTIXSblQDZWEFZYjOK6p8tV6hrshYdXZ0NHTjWE+lwxpOpWeElUGtEmiPcMT71FiuA9ODplqzzSxkzw== - -esbuild-netbsd-64@0.14.22: - version "0.14.22" - resolved "https://registry.yarnpkg.com/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.22.tgz#0e283278e9fdbaa7f0930f93ee113d7759cd865e" - integrity sha512-TBbCtx+k32xydImsHxvFgsOCuFqCTGIxhzRNbgSL1Z2CKhzxwT92kQMhxort9N/fZM2CkRCPPs5wzQSamtzEHA== - -esbuild-openbsd-64@0.14.22: - version "0.14.22" - resolved "https://registry.yarnpkg.com/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.22.tgz#2a73bba04e16d8ef278fbe2be85248e12a2f2cc2" - integrity sha512-vK912As725haT313ANZZZN+0EysEEQXWC/+YE4rQvOQzLuxAQc2tjbzlAFREx3C8+uMuZj/q7E5gyVB7TzpcTA== - -esbuild-sunos-64@0.14.22: - version "0.14.22" - resolved "https://registry.yarnpkg.com/esbuild-sunos-64/-/esbuild-sunos-64-0.14.22.tgz#8fe03513b8b2e682a6d79d5e3ca5849651a3c1d8" - integrity sha512-/mbJdXTW7MTcsPhtfDsDyPEOju9EOABvCjeUU2OJ7fWpX/Em/H3WYDa86tzLUbcVg++BScQDzqV/7RYw5XNY0g== - esbuild-wasm@0.14.22: version "0.14.22" - resolved "https://registry.yarnpkg.com/esbuild-wasm/-/esbuild-wasm-0.14.22.tgz#9671d1355473b6688d00fe8ef6fa50274eff5465" + resolved "https://registry.npmjs.org/esbuild-wasm/-/esbuild-wasm-0.14.22.tgz" integrity sha512-FOSAM29GN1fWusw0oLMv6JYhoheDIh5+atC72TkJKfIUMID6yISlicoQSd9gsNSFsNBvABvtE2jR4JB1j4FkFw== -esbuild-windows-32@0.14.22: - version "0.14.22" - resolved "https://registry.yarnpkg.com/esbuild-windows-32/-/esbuild-windows-32-0.14.22.tgz#a75df61e3e49df292a1842be8e877a3153ee644f" - integrity sha512-1vRIkuvPTjeSVK3diVrnMLSbkuE36jxA+8zGLUOrT4bb7E/JZvDRhvtbWXWaveUc/7LbhaNFhHNvfPuSw2QOQg== - -esbuild-windows-64@0.14.22: - version "0.14.22" - resolved "https://registry.yarnpkg.com/esbuild-windows-64/-/esbuild-windows-64-0.14.22.tgz#d06cf8bbe4945b8bf95a730d871e54a22f635941" - integrity sha512-AxjIDcOmx17vr31C5hp20HIwz1MymtMjKqX4qL6whPj0dT9lwxPexmLj6G1CpR3vFhui6m75EnBEe4QL82SYqw== - -esbuild-windows-arm64@0.14.22: - version "0.14.22" - resolved "https://registry.yarnpkg.com/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.22.tgz#f8b1b05c548073be8413a5ecb12d7c2f6e717227" - integrity sha512-5wvQ+39tHmRhNpu2Fx04l7QfeK3mQ9tKzDqqGR8n/4WUxsFxnVLfDRBGirIfk4AfWlxk60kqirlODPoT5LqMUg== - esbuild@0.14.22: version "0.14.22" - resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.14.22.tgz#2b55fde89d7aa5aaaad791816d58ff9dfc5ed085" + resolved "https://registry.npmjs.org/esbuild/-/esbuild-0.14.22.tgz" integrity sha512-CjFCFGgYtbFOPrwZNJf7wsuzesx8kqwAffOlbYcFDLFuUtP8xloK1GH+Ai13Qr0RZQf9tE7LMTHJ2iVGJ1SKZA== optionalDependencies: esbuild-android-arm64 "0.14.22" @@ -5056,32 +5063,32 @@ esbuild@0.14.22: escalade@^3.1.1: version "3.1.1" - resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" + resolved "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz" integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== escape-goat@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/escape-goat/-/escape-goat-3.0.0.tgz#e8b5fb658553fe8a3c4959c316c6ebb8c842b19c" + resolved "https://registry.npmjs.org/escape-goat/-/escape-goat-3.0.0.tgz" integrity sha512-w3PwNZJwRxlp47QGzhuEBldEqVHHhh8/tIPcl6ecf2Bou99cdAt0knihBV0Ecc7CGxYduXVBDheH1K2oADRlvw== escape-html@~1.0.3: version "1.0.3" - resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" + resolved "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz" integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== -escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: +escape-string-regexp@^1.0.5: version "1.0.5" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== escape-string-regexp@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz" integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== escodegen@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-2.0.0.tgz#5e32b12833e8aa8fa35e1bf0befa89380484c7dd" + resolved "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz" integrity sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw== dependencies: esprima "^4.0.1" @@ -5091,53 +5098,56 @@ escodegen@^2.0.0: optionalDependencies: source-map "~0.6.1" -eslint-import-resolver-node@^0.3.6: - version "0.3.6" - resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz#4048b958395da89668252001dbd9eca6b83bacbd" - integrity sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw== +eslint-import-resolver-node@^0.3.7: + version "0.3.7" + resolved "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.7.tgz" + integrity sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA== dependencies: debug "^3.2.7" - resolve "^1.20.0" + is-core-module "^2.11.0" + resolve "^1.22.1" -eslint-module-utils@^2.7.3: +eslint-module-utils@^2.7.4: version "2.7.4" - resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.7.4.tgz#4f3e41116aaf13a20792261e61d3a2e7e0583974" + resolved "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.4.tgz" integrity sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA== dependencies: debug "^3.2.7" eslint-plugin-deprecation@^1.3.2: - version "1.3.3" - resolved "https://registry.yarnpkg.com/eslint-plugin-deprecation/-/eslint-plugin-deprecation-1.3.3.tgz#065b5d36ff220afe139f2b19af57454a13464731" - integrity sha512-Bbkv6ZN2cCthVXz/oZKPwsSY5S/CbgTLRG4Q2s2gpPpgNsT0uJ0dB5oLNiWzFYY8AgKX4ULxXFG1l/rDav9QFA== + version "1.4.1" + resolved "https://registry.npmjs.org/eslint-plugin-deprecation/-/eslint-plugin-deprecation-1.4.1.tgz" + integrity sha512-4vxTghWzxsBukPJVQupi6xlTuDc8Pyi1QlRCrFiLgwLPMJQW3cJCNaehJUKQqQFvuue5m4W27e179Y3Qjzeghg== dependencies: - "@typescript-eslint/experimental-utils" "^5.0.0" + "@typescript-eslint/utils" "^5.57.0" tslib "^2.3.1" tsutils "^3.21.0" eslint-plugin-import@^2.25.4: - version "2.26.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.26.0.tgz#f812dc47be4f2b72b478a021605a59fc6fe8b88b" - integrity sha512-hYfi3FXaM8WPLf4S1cikh/r4IxnO6zrhZbEGz2b660EJRbuxgpDS5gkCuYgGWg2xxh2rBuIr4Pvhve/7c31koA== + version "2.27.5" + resolved "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.27.5.tgz" + integrity sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow== dependencies: - array-includes "^3.1.4" - array.prototype.flat "^1.2.5" - debug "^2.6.9" + array-includes "^3.1.6" + array.prototype.flat "^1.3.1" + array.prototype.flatmap "^1.3.1" + debug "^3.2.7" doctrine "^2.1.0" - eslint-import-resolver-node "^0.3.6" - eslint-module-utils "^2.7.3" + eslint-import-resolver-node "^0.3.7" + eslint-module-utils "^2.7.4" has "^1.0.3" - is-core-module "^2.8.1" + is-core-module "^2.11.0" is-glob "^4.0.3" minimatch "^3.1.2" - object.values "^1.1.5" - resolve "^1.22.0" + object.values "^1.1.6" + resolve "^1.22.1" + semver "^6.3.0" tsconfig-paths "^3.14.1" eslint-plugin-jsdoc@^39.6.4: - version "39.6.4" - resolved "https://registry.yarnpkg.com/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-39.6.4.tgz#b940aebd3eea26884a0d341785d2dc3aba6a38a7" - integrity sha512-fskvdLCfwmPjHb6e+xNGDtGgbF8X7cDwMtVLAP2WwSf9Htrx68OAx31BESBM1FAwsN2HTQyYQq7m4aW4Q4Nlag== + version "39.9.1" + resolved "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-39.9.1.tgz" + integrity sha512-Rq2QY6BZP2meNIs48aZ3GlIlJgBqFCmR55+UBvaDkA3ZNQ0SvQXOs2QKkubakEijV8UbIVbVZKsOVN8G3MuqZw== dependencies: "@es-joy/jsdoccomment" "~0.36.1" comment-parser "1.3.1" @@ -5149,26 +5159,26 @@ eslint-plugin-jsdoc@^39.6.4: 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" + resolved "https://registry.npmjs.org/eslint-plugin-lodash/-/eslint-plugin-lodash-7.4.0.tgz" integrity sha512-Tl83UwVXqe1OVeBRKUeWcfg6/pCW1GTRObbdnbEJgYwjxp5Q92MEWQaH9+dmzbRt6kvYU1Mp893E79nJiCSM8A== dependencies: lodash "^4.17.21" eslint-plugin-unused-imports@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-unused-imports/-/eslint-plugin-unused-imports-2.0.0.tgz#d8db8c4d0cfa0637a8b51ce3fd7d1b6bc3f08520" + resolved "https://registry.npmjs.org/eslint-plugin-unused-imports/-/eslint-plugin-unused-imports-2.0.0.tgz" integrity sha512-3APeS/tQlTrFa167ThtP0Zm0vctjr4M44HMpeg1P4bK6wItarumq0Ma82xorMKdFsWpphQBlRPzw/pxiVELX1A== dependencies: eslint-rule-composer "^0.3.0" eslint-rule-composer@^0.3.0: version "0.3.0" - resolved "https://registry.yarnpkg.com/eslint-rule-composer/-/eslint-rule-composer-0.3.0.tgz#79320c927b0c5c0d3d3d2b76c8b4a488f25bbaf9" + resolved "https://registry.npmjs.org/eslint-rule-composer/-/eslint-rule-composer-0.3.0.tgz" integrity sha512-bt+Sh8CtDmn2OajxvNO+BX7Wn4CIWMpTRm3MaiKPCQcnnlm0CS2mhui6QaoeQugs+3Kj2ESKEEGJUdVafwhiCg== -eslint-scope@5.1.1, eslint-scope@^5.1.0, eslint-scope@^5.1.1: +eslint-scope@^5.1.0, eslint-scope@^5.1.1, eslint-scope@5.1.1: version "5.1.1" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" + resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz" integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== dependencies: esrecurse "^4.3.0" @@ -5176,7 +5186,7 @@ eslint-scope@5.1.1, eslint-scope@^5.1.0, eslint-scope@^5.1.1: eslint-scope@^7.1.1: version "7.1.1" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.1.1.tgz#fff34894c2f65e5226d3041ac480b4513a163642" + resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz" integrity sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw== dependencies: esrecurse "^4.3.0" @@ -5184,28 +5194,31 @@ eslint-scope@^7.1.1: eslint-utils@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-3.0.0.tgz#8aebaface7345bb33559db0a1f13a1d2d48c3672" + resolved "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz" integrity sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA== dependencies: eslint-visitor-keys "^2.0.0" eslint-visitor-keys@^2.0.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" + resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz" integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== -eslint-visitor-keys@^3.0.0, eslint-visitor-keys@^3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz#f6480fa6b1f30efe2d1968aa8ac745b862469826" - integrity sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA== +eslint-visitor-keys@^3.0.0, eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.0: + version "3.4.0" + resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.0.tgz" + integrity sha512-HPpKPUBQcAsZOsHAFwTtIKcYlCje62XB7SEAcxjtmW6TD1WVpkS6i6/hOVtTZIl4zGj/mBqpFVGvaDneik+VoQ== -eslint@^8.2.0: - version "8.29.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.29.0.tgz#d74a88a20fb44d59c51851625bc4ee8d0ec43f87" - integrity sha512-isQ4EEiyUjZFbEKvEGJKKGBwXtvXX+zJbkVKCgTuB9t/+jUBcy8avhkEwWJecI15BkRkOYmvIM5ynbhRjEkoeg== +eslint@*, "eslint@^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8", "eslint@^6.0.0 || ^7.0.0 || ^8.0.0", "eslint@^6.0.0 || ^7.0.0 || >=8.0.0", "eslint@^7.0.0 || ^8.0.0", eslint@^8.0.0, eslint@^8.2.0, eslint@>=2, eslint@>=5: + version "8.38.0" + resolved "https://registry.npmjs.org/eslint/-/eslint-8.38.0.tgz" + integrity sha512-pIdsD2jwlUGf/U38Jv97t8lq6HpaU/G9NKbYmpWpZGw3LdTNhZLbJePqxOXGB5+JEKfOPU/XLxYxFh03nr1KTg== dependencies: - "@eslint/eslintrc" "^1.3.3" - "@humanwhocodes/config-array" "^0.11.6" + "@eslint-community/eslint-utils" "^4.2.0" + "@eslint-community/regexpp" "^4.4.0" + "@eslint/eslintrc" "^2.0.2" + "@eslint/js" "8.38.0" + "@humanwhocodes/config-array" "^0.11.8" "@humanwhocodes/module-importer" "^1.0.1" "@nodelib/fs.walk" "^1.2.8" ajv "^6.10.0" @@ -5215,16 +5228,15 @@ eslint@^8.2.0: doctrine "^3.0.0" escape-string-regexp "^4.0.0" eslint-scope "^7.1.1" - eslint-utils "^3.0.0" - eslint-visitor-keys "^3.3.0" - espree "^9.4.0" - esquery "^1.4.0" + eslint-visitor-keys "^3.4.0" + espree "^9.5.1" + esquery "^1.4.2" esutils "^2.0.2" fast-deep-equal "^3.1.3" file-entry-cache "^6.0.1" find-up "^5.0.0" glob-parent "^6.0.2" - globals "^13.15.0" + globals "^13.19.0" grapheme-splitter "^1.0.4" ignore "^5.2.0" import-fresh "^3.0.0" @@ -5239,102 +5251,86 @@ eslint@^8.2.0: minimatch "^3.1.2" natural-compare "^1.4.0" optionator "^0.9.1" - regexpp "^3.2.0" strip-ansi "^6.0.1" strip-json-comments "^3.1.0" text-table "^0.2.0" esm@^3.2.25: version "3.2.25" - resolved "https://registry.yarnpkg.com/esm/-/esm-3.2.25.tgz#342c18c29d56157688ba5ce31f8431fbb795cc10" + resolved "https://registry.npmjs.org/esm/-/esm-3.2.25.tgz" integrity sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA== -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== +espree@^9.5.1: + version "9.5.1" + resolved "https://registry.npmjs.org/espree/-/espree-9.5.1.tgz" + integrity sha512-5yxtHSZXRSW5pvv3hAlXM5+/Oswi1AUFqBmbibKb5s6bp3rGIDkyXU6xCoyuuLhijr4SFwPrXRoZjz0AZDN9tg== dependencies: acorn "^8.8.0" acorn-jsx "^5.3.2" - eslint-visitor-keys "^3.3.0" + eslint-visitor-keys "^3.4.0" esprima@^4.0.0, esprima@^4.0.1: version "4.0.1" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + resolved "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== -esquery@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.4.0.tgz#2148ffc38b82e8c7057dfed48425b3e61f0f24a5" - integrity sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w== +esquery@^1.4.0, esquery@^1.4.2: + version "1.5.0" + resolved "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz" + integrity sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg== dependencies: estraverse "^5.1.0" esrecurse@^4.3.0: version "4.3.0" - resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" + resolved "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz" integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== dependencies: estraverse "^5.2.0" estraverse@^4.1.1: version "4.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" + resolved "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz" integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== estraverse@^5.1.0, estraverse@^5.2.0: version "5.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" + resolved "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz" integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== esutils@^2.0.2: version "2.0.3" - resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + resolved "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz" integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== -etag@1.8.1, etag@^1.8.1, etag@~1.8.1: +etag@^1.8.1, etag@~1.8.1, etag@1.8.1: version "1.8.1" - resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" + resolved "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz" integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== eventemitter-asyncresource@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/eventemitter-asyncresource/-/eventemitter-asyncresource-1.0.0.tgz#734ff2e44bf448e627f7748f905d6bdd57bdb65b" + resolved "https://registry.npmjs.org/eventemitter-asyncresource/-/eventemitter-asyncresource-1.0.0.tgz" integrity sha512-39F7TBIV0G7gTelxwbEqnwhp90eqCPON1k0NwNfwhgKn4Co4ybUbj2pECcXT0B3ztRKZ7Pw1JujUUgmQJHcVAQ== eventemitter2@6.4.7: version "6.4.7" - resolved "https://registry.yarnpkg.com/eventemitter2/-/eventemitter2-6.4.7.tgz#a7f6c4d7abf28a14c1ef3442f21cb306a054271d" + resolved "https://registry.npmjs.org/eventemitter2/-/eventemitter2-6.4.7.tgz" integrity sha512-tYUSVOGeQPKt/eC1ABfhHy5Xd96N3oIijJvN3O9+TsC28T5V9yX9oEfEK5faP0EFSNVOG97qtAS68GBrQB2hDg== eventemitter3@^4.0.0: version "4.0.7" - resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" + resolved "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz" integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== events@^3.2.0: version "3.3.0" - resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" + resolved "https://registry.npmjs.org/events/-/events-3.3.0.tgz" integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== -execa@4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/execa/-/execa-4.1.0.tgz#4e5491ad1572f2f17a77d388c6c857135b22847a" - integrity sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA== - dependencies: - cross-spawn "^7.0.0" - get-stream "^5.0.0" - human-signals "^1.1.1" - is-stream "^2.0.0" - merge-stream "^2.0.0" - npm-run-path "^4.0.0" - onetime "^5.1.0" - signal-exit "^3.0.2" - strip-final-newline "^2.0.0" - execa@^5.0.0: version "5.1.1" - resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" + resolved "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz" integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== dependencies: cross-spawn "^7.0.3" @@ -5347,28 +5343,43 @@ execa@^5.0.0: signal-exit "^3.0.3" strip-final-newline "^2.0.0" +execa@4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz" + integrity sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA== + dependencies: + cross-spawn "^7.0.0" + get-stream "^5.0.0" + human-signals "^1.1.1" + is-stream "^2.0.0" + merge-stream "^2.0.0" + npm-run-path "^4.0.0" + onetime "^5.1.0" + signal-exit "^3.0.2" + strip-final-newline "^2.0.0" + executable@^4.1.1: version "4.1.1" - resolved "https://registry.yarnpkg.com/executable/-/executable-4.1.1.tgz#41532bff361d3e57af4d763b70582db18f5d133c" + resolved "https://registry.npmjs.org/executable/-/executable-4.1.1.tgz" integrity sha512-8iA79xD3uAch729dUG8xaaBBFGaEa0wdD2VkYLFHwlqosEj/jT66AzcreRDSgV7ehnNLBW2WR5jIXwGKjVdTLg== dependencies: pify "^2.2.0" express-rate-limit@^5.1.3: version "5.5.1" - resolved "https://registry.yarnpkg.com/express-rate-limit/-/express-rate-limit-5.5.1.tgz#110c23f6a65dfa96ab468eda95e71697bc6987a2" + resolved "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-5.5.1.tgz" integrity sha512-MTjE2eIbHv5DyfuFz4zLYWxpqVhEhkTiwFGuB74Q9CSou2WHO52nlE5y3Zlg6SIsiYUIPj6ifFxnkPz6O3sIUg== express-static-gzip@^2.1.5: version "2.1.7" - resolved "https://registry.yarnpkg.com/express-static-gzip/-/express-static-gzip-2.1.7.tgz#5904824a07950ba741ec3a23a21839dd04c63506" + resolved "https://registry.npmjs.org/express-static-gzip/-/express-static-gzip-2.1.7.tgz" integrity sha512-QOCZUC+lhPPCjIJKpQGu1Oa61Axg9Mq09Qvit8Of7kzpMuwDeMSqjjQteQS3OVw/GkENBoSBheuQDWPlngImvw== dependencies: serve-static "^1.14.1" -express@^4.17.1, express@^4.17.3: +express@^4.15.2, express@^4.17.1, express@^4.17.3: version "4.18.2" - resolved "https://registry.yarnpkg.com/express/-/express-4.18.2.tgz#3fabe08296e930c796c19e3c516979386ba9fd59" + resolved "https://registry.npmjs.org/express/-/express-4.18.2.tgz" integrity sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ== dependencies: accepts "~1.3.8" @@ -5405,12 +5416,12 @@ express@^4.17.1, express@^4.17.3: extend@^3.0.0, extend@~3.0.2: version "3.0.2" - resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" + resolved "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz" integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== external-editor@^3.0.3: version "3.1.0" - resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495" + resolved "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz" integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew== dependencies: chardet "^0.7.0" @@ -5419,7 +5430,7 @@ external-editor@^3.0.3: extract-zip@2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-2.0.1.tgz#663dca56fe46df890d5f131ef4a06d22bb8ba13a" + resolved "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz" integrity sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg== dependencies: debug "^4.1.1" @@ -5428,25 +5439,20 @@ extract-zip@2.0.1: optionalDependencies: "@types/yauzl" "^2.9.1" -extsprintf@1.3.0: +extsprintf@^1.2.0, extsprintf@1.3.0: version "1.3.0" - resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" + resolved "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz" integrity sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g== -extsprintf@^1.2.0: - version "1.4.1" - resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.1.tgz#8d172c064867f235c0c84a596806d279bf4bcc07" - integrity sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA== - fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: version "3.1.3" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz" integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== -fast-glob@3.2.7: - version "3.2.7" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.7.tgz#fd6cb7a2d7e9aa7a7846111e85a196d6b2f766a1" - integrity sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q== +fast-glob@^3.2.4, fast-glob@^3.2.7, fast-glob@^3.2.9: + version "3.2.12" + resolved "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz" + integrity sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w== dependencies: "@nodelib/fs.stat" "^2.0.2" "@nodelib/fs.walk" "^1.2.3" @@ -5454,10 +5460,10 @@ fast-glob@3.2.7: merge2 "^1.3.0" micromatch "^4.0.4" -fast-glob@^3.2.4, fast-glob@^3.2.7, fast-glob@^3.2.9: - version "3.2.12" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.12.tgz#7f39ec99c2e6ab030337142da9e0c18f37afae80" - integrity sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w== +fast-glob@3.2.7: + version "3.2.7" + resolved "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz" + integrity sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q== dependencies: "@nodelib/fs.stat" "^2.0.2" "@nodelib/fs.walk" "^1.2.3" @@ -5467,86 +5473,86 @@ fast-glob@^3.2.4, fast-glob@^3.2.7, fast-glob@^3.2.9: fast-json-patch@^3.0.0-1: version "3.1.1" - resolved "https://registry.yarnpkg.com/fast-json-patch/-/fast-json-patch-3.1.1.tgz#85064ea1b1ebf97a3f7ad01e23f9337e72c66947" + resolved "https://registry.npmjs.org/fast-json-patch/-/fast-json-patch-3.1.1.tgz" integrity sha512-vf6IHUX2SBcA+5/+4883dsIjpBTqmfBjmYiWK1savxQmFk4JfBMLa7ynTYOs1Rolp/T1betJxHiGD3g1Mn8lUQ== -fast-json-stable-stringify@2.1.0, fast-json-stable-stringify@^2.0.0: +fast-json-stable-stringify@^2.0.0, fast-json-stable-stringify@2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + resolved "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz" integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.6: version "2.0.6" - resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + resolved "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz" integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== fast-memoize@^2.5.1: version "2.5.2" - resolved "https://registry.yarnpkg.com/fast-memoize/-/fast-memoize-2.5.2.tgz#79e3bb6a4ec867ea40ba0e7146816f6cdce9b57e" + resolved "https://registry.npmjs.org/fast-memoize/-/fast-memoize-2.5.2.tgz" integrity sha512-Ue0LwpDYErFbmNnZSF0UH6eImUwDmogUO1jyE+JbN2gsQz/jICm1Ve7t9QT0rNSsfJt+Hs4/S3GnsDVjL4HVrw== fastest-levenshtein@^1.0.12: version "1.0.16" - resolved "https://registry.yarnpkg.com/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz#210e61b6ff181de91ea9b3d1b84fdedd47e034e5" + resolved "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz" integrity sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg== fastq@^1.6.0: - version "1.14.0" - resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.14.0.tgz#107f69d7295b11e0fccc264e1fc6389f623731ce" - integrity sha512-eR2D+V9/ExcbF9ls441yIuN6TI2ED1Y2ZcA5BmMtJsOkWOFRJQ0Jt0g1UwqXJJVAb+V+umH5Dfr8oh4EVP7VVg== + version "1.15.0" + resolved "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz" + integrity sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw== dependencies: reusify "^1.0.4" faye-websocket@^0.11.3: version "0.11.4" - resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.11.4.tgz#7f0d9275cfdd86a1c963dc8b65fcc451edcbb1da" + resolved "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz" integrity sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g== dependencies: websocket-driver ">=0.5.1" fd-slicer@~1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.1.0.tgz#25c7c89cb1f9077f8891bbe61d8f390eae256f1e" + resolved "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz" integrity sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g== dependencies: pend "~1.2.0" -figures@3.2.0, figures@^3.0.0, figures@^3.2.0: +figures@^3.0.0, figures@^3.2.0, figures@3.2.0: version "3.2.0" - resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af" + resolved "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz" integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg== dependencies: escape-string-regexp "^1.0.5" file-entry-cache@^6.0.1: version "6.0.1" - resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" + resolved "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz" integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== dependencies: flat-cache "^3.0.4" filelist@^1.0.1: version "1.0.4" - resolved "https://registry.yarnpkg.com/filelist/-/filelist-1.0.4.tgz#f78978a1e944775ff9e62e744424f215e58352b5" + resolved "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz" integrity sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q== dependencies: minimatch "^5.0.1" filesize@^6.1.0: version "6.4.0" - resolved "https://registry.yarnpkg.com/filesize/-/filesize-6.4.0.tgz#914f50471dd66fdca3cefe628bd0cde4ef769bcd" + resolved "https://registry.npmjs.org/filesize/-/filesize-6.4.0.tgz" integrity sha512-mjFIpOHC4jbfcTfoh4rkWpI31mF7viw9ikj/JyLoKzqlwG/YsefKfvYlYhdYdg/9mtK2z1AzgN/0LvVQ3zdlSQ== fill-range@^7.0.1: version "7.0.1" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + resolved "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz" integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== dependencies: to-regex-range "^5.0.1" finalhandler@1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.0.tgz#ce0b6855b45853e791b2fcc680046d88253dd7f5" + resolved "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.0.tgz" integrity sha512-ejnvM9ZXYzp6PUPUyQBMBf0Co5VX2gr5H2VQe2Ui2jWXNlxv+PYZo8wpAymJNJdLsG1R4p+M4aynF8KuoUEwRw== dependencies: debug "2.6.9" @@ -5559,7 +5565,7 @@ finalhandler@1.1.0: finalhandler@1.1.2: version "1.1.2" - resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d" + resolved "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz" integrity sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA== dependencies: debug "2.6.9" @@ -5572,7 +5578,7 @@ finalhandler@1.1.2: finalhandler@1.2.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.2.0.tgz#7d23fe5731b207b4640e4fcd00aec1f9207a7b32" + resolved "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz" integrity sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg== dependencies: debug "2.6.9" @@ -5585,7 +5591,7 @@ finalhandler@1.2.0: find-cache-dir@^3.3.1: version "3.3.2" - resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.3.2.tgz#b30c5b6eff0730731aea9bbd9dbecbd80256d64b" + resolved "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz" integrity sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig== dependencies: commondir "^1.0.1" @@ -5594,7 +5600,7 @@ find-cache-dir@^3.3.1: find-up@^4.0.0, find-up@^4.1.0: version "4.1.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" + resolved "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz" integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== dependencies: locate-path "^5.0.0" @@ -5602,7 +5608,7 @@ find-up@^4.0.0, find-up@^4.1.0: find-up@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" + resolved "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz" integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== dependencies: locate-path "^6.0.0" @@ -5610,7 +5616,7 @@ find-up@^5.0.0: flat-cache@^3.0.4: version "3.0.4" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11" + resolved "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz" integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg== dependencies: flatted "^3.1.0" @@ -5618,27 +5624,34 @@ flat-cache@^3.0.4: flat@^5.0.2: version "5.0.2" - resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" + resolved "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz" integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== flatted@^3.1.0, flatted@^3.2.7: version "3.2.7" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.7.tgz#609f39207cb614b89d0765b477cb2d437fbf9787" + resolved "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz" integrity sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ== follow-redirects@^1.0.0, follow-redirects@^1.14.0, follow-redirects@^1.14.9, follow-redirects@^1.15.0: version "1.15.2" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.2.tgz#b460864144ba63f2681096f274c4e57026da2c13" + resolved "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz" integrity sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA== +for-each@^0.3.3: + version "0.3.3" + resolved "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz" + integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== + dependencies: + is-callable "^1.1.3" + forever-agent@~0.6.1: version "0.6.1" - resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" + resolved "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz" integrity sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw== form-data@^3.0.0: version "3.0.1" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-3.0.1.tgz#ebd53791b78356a99af9a300d4282c4d5eb9755f" + resolved "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz" integrity sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg== dependencies: asynckit "^0.4.0" @@ -5647,7 +5660,7 @@ form-data@^3.0.0: form-data@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" + resolved "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz" integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== dependencies: asynckit "^0.4.0" @@ -5656,7 +5669,7 @@ form-data@^4.0.0: form-data@~2.3.2: version "2.3.3" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" + resolved "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz" integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== dependencies: asynckit "^0.4.0" @@ -5665,37 +5678,28 @@ form-data@~2.3.2: forwarded@0.2.0: version "0.2.0" - resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" + resolved "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz" integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== fraction.js@^4.2.0: version "4.2.0" - resolved "https://registry.yarnpkg.com/fraction.js/-/fraction.js-4.2.0.tgz#448e5109a313a3527f5a3ab2119ec4cf0e0e2950" + resolved "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz" integrity sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA== -fresh@0.5.2, fresh@^0.5.2: +fresh@^0.5.2, fresh@0.5.2: version "0.5.2" - resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" + resolved "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz" integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== fs-constants@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" + resolved "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz" integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== -fs-extra@3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-3.0.1.tgz#3794f378c58b342ea7dbbb23095109c4b3b62291" - integrity sha512-V3Z3WZWVUYd8hoCL5xfXJCaHWYzmtwW5XWYSlLgERi8PWd8bx1kUHUk8L1BT57e49oKnDDD180mjfrHc1yA9rg== - dependencies: - graceful-fs "^4.1.2" - jsonfile "^3.0.0" - universalify "^0.1.0" - -fs-extra@^10.1.0: - version "10.1.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.1.0.tgz#02873cfbc4084dde127eaa5f9905eef2325d1abf" - integrity sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ== +fs-extra@^11.1.0: + version "11.1.1" + resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.1.tgz" + integrity sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ== dependencies: graceful-fs "^4.2.0" jsonfile "^6.0.1" @@ -5703,7 +5707,7 @@ fs-extra@^10.1.0: fs-extra@^8.1.0: version "8.1.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0" + resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz" integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g== dependencies: graceful-fs "^4.2.0" @@ -5712,7 +5716,7 @@ fs-extra@^8.1.0: fs-extra@^9.1.0: version "9.1.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" + resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz" integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== dependencies: at-least-node "^1.0.0" @@ -5720,41 +5724,50 @@ fs-extra@^9.1.0: jsonfile "^6.0.1" universalify "^2.0.0" +fs-extra@3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-3.0.1.tgz" + integrity sha512-V3Z3WZWVUYd8hoCL5xfXJCaHWYzmtwW5XWYSlLgERi8PWd8bx1kUHUk8L1BT57e49oKnDDD180mjfrHc1yA9rg== + dependencies: + graceful-fs "^4.1.2" + jsonfile "^3.0.0" + universalify "^0.1.0" + fs-minipass@^2.0.0, fs-minipass@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb" + resolved "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz" integrity sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg== dependencies: minipass "^3.0.0" fs-monkey@^1.0.3: version "1.0.3" - resolved "https://registry.yarnpkg.com/fs-monkey/-/fs-monkey-1.0.3.tgz#ae3ac92d53bb328efe0e9a1d9541f6ad8d48e2d3" + resolved "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.3.tgz" integrity sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q== fs.realpath@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== fscreen@^1.0.1: version "1.2.0" - resolved "https://registry.yarnpkg.com/fscreen/-/fscreen-1.2.0.tgz#1a8c88e06bc16a07b473ad96196fb06d6657f59e" + resolved "https://registry.npmjs.org/fscreen/-/fscreen-1.2.0.tgz" integrity sha512-hlq4+BU0hlPmwsFjwGGzZ+OZ9N/wq9Ljg/sq3pX+2CD7hrJsX9tJgWWK/wiNTFM212CLHWhicOoqwXyZGGetJg== fsevents@~2.3.2: version "2.3.2" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" + resolved "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz" integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== function-bind@^1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz" integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== function.prototype.name@^1.1.5: version "1.1.5" - resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.5.tgz#cce0505fe1ffb80503e6f9e46cc64e46a12a9621" + resolved "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz" integrity sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA== dependencies: call-bind "^1.0.2" @@ -5764,17 +5777,17 @@ function.prototype.name@^1.1.5: functional-red-black-tree@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" + resolved "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz" integrity sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g== functions-have-names@^1.2.2: version "1.2.3" - resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" + resolved "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz" integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== gauge@^4.0.3: version "4.0.4" - resolved "https://registry.yarnpkg.com/gauge/-/gauge-4.0.4.tgz#52ff0652f2bbf607a989793d53b751bef2328dce" + resolved "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz" integrity sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg== dependencies: aproba "^1.0.3 || ^2.0.0" @@ -5788,18 +5801,18 @@ gauge@^4.0.3: gensync@^1.0.0-beta.2: version "1.0.0-beta.2" - resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" + resolved "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz" integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== get-caller-file@^2.0.5: version "2.0.5" - resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" + resolved "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== -get-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.3.tgz#063c84329ad93e83893c7f4f243ef63ffa351385" - integrity sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A== +get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3, get-intrinsic@^1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz" + integrity sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q== dependencies: function-bind "^1.1.1" has "^1.0.3" @@ -5807,24 +5820,31 @@ get-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1, get-intrinsic@ get-package-type@^0.1.0: version "0.1.0" - resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" + resolved "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz" integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== -get-stream@^5.0.0, get-stream@^5.1.0: +get-stream@^5.0.0: version "5.2.0" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" + resolved "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz" + integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== + dependencies: + pump "^3.0.0" + +get-stream@^5.1.0: + version "5.2.0" + resolved "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz" integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== dependencies: pump "^3.0.0" get-stream@^6.0.0: version "6.0.1" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" + resolved "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz" integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== get-symbol-description@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz#7fdb81c900101fbd564dd5f1a30af5aadc1e58d6" + resolved "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz" integrity sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw== dependencies: call-bind "^1.0.2" @@ -5832,52 +5852,54 @@ get-symbol-description@^1.0.0: getos@^3.2.1: version "3.2.1" - resolved "https://registry.yarnpkg.com/getos/-/getos-3.2.1.tgz#0134d1f4e00eb46144c5a9c0ac4dc087cbb27dc5" + resolved "https://registry.npmjs.org/getos/-/getos-3.2.1.tgz" integrity sha512-U56CfOK17OKgTVqozZjUKNdkfEv6jk5WISBJ8SHoagjE6L69zOwl3Z+O8myjY9MEW3i2HPWQBt/LTbCgcC973Q== dependencies: async "^3.2.0" getpass@^0.1.1: version "0.1.7" - resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" + resolved "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz" integrity sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng== dependencies: assert-plus "^1.0.0" -glob-parent@^5.1.1, glob-parent@^5.1.2, glob-parent@~5.1.2: +glob-parent@^5.1.1: version "5.1.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + +glob-parent@^5.1.2: + version "5.1.2" + resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== dependencies: is-glob "^4.0.1" glob-parent@^6.0.1, glob-parent@^6.0.2: version "6.0.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" + resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz" integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== dependencies: is-glob "^4.0.3" +glob-parent@~5.1.2: + version "5.1.2" + resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + glob-to-regexp@^0.4.1: version "0.4.1" - resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e" + resolved "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz" integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== -glob@7.1.4: - version "7.1.4" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.4.tgz#aa608a2f6c577ad357e1ae5a5c26d9a8d1969255" - integrity sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.0.4" - once "^1.3.0" - path-is-absolute "^1.0.0" - -glob@7.2.0: +glob@^7.1.3, glob@^7.1.4, glob@^7.1.6, glob@^7.1.7, glob@~7.2.0, glob@7.2.0: version "7.2.0" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023" + resolved "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz" integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q== dependencies: fs.realpath "^1.0.0" @@ -5887,21 +5909,32 @@ glob@7.2.0: once "^1.3.0" path-is-absolute "^1.0.0" -glob@^7.0.3, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6, glob@^7.1.7, glob@~7.2.0: - version "7.2.3" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" - integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== +glob@^8.0.1: + version "8.1.0" + resolved "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz" + integrity sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ== dependencies: fs.realpath "^1.0.0" inflight "^1.0.4" inherits "2" - minimatch "^3.1.1" + minimatch "^5.0.1" + once "^1.3.0" + +glob@7.1.4: + version "7.1.4" + resolved "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz" + integrity sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" once "^1.3.0" path-is-absolute "^1.0.0" -glob@^8.0.1: +glob@8.0.3: version "8.0.3" - resolved "https://registry.yarnpkg.com/glob/-/glob-8.0.3.tgz#415c6eb2deed9e502c68fa44a272e6da6eeca42e" + resolved "https://registry.npmjs.org/glob/-/glob-8.0.3.tgz" integrity sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ== dependencies: fs.realpath "^1.0.0" @@ -5912,26 +5945,57 @@ glob@^8.0.1: global-dirs@^3.0.0: version "3.0.1" - resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-3.0.1.tgz#0c488971f066baceda21447aecb1a8b911d22485" + resolved "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.1.tgz" integrity sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA== dependencies: ini "2.0.0" globals@^11.1.0: version "11.12.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" + resolved "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz" integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== -globals@^13.15.0: - version "13.18.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-13.18.0.tgz#fb224daeeb2bb7d254cd2c640f003528b8d0c1dc" - integrity sha512-/mR4KI8Ps2spmoc0Ulu9L7agOF0du1CZNQ3dke8yItYlyKNmGrkONemBbd6V8UTc1Wgcqn21t3WYB7dbRmh6/A== +globals@^13.19.0: + version "13.20.0" + resolved "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz" + integrity sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ== dependencies: type-fest "^0.20.2" -globby@^11.0.1, globby@^11.0.4, globby@^11.1.0: +globalthis@^1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz" + integrity sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA== + dependencies: + define-properties "^1.1.3" + +globby@^11.0.1: version "11.1.0" - resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" + resolved "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz" + integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== + dependencies: + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.2.9" + ignore "^5.2.0" + merge2 "^1.4.1" + slash "^3.0.0" + +globby@^11.0.4: + version "11.1.0" + resolved "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz" + integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== + dependencies: + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.2.9" + ignore "^5.2.0" + merge2 "^1.4.1" + slash "^3.0.0" + +globby@^11.1.0: + version "11.1.0" + resolved "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz" integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== dependencies: array-union "^2.1.0" @@ -5943,7 +6007,7 @@ globby@^11.0.1, globby@^11.0.4, globby@^11.1.0: globby@^12.0.2: version "12.2.0" - resolved "https://registry.yarnpkg.com/globby/-/globby-12.2.0.tgz#2ab8046b4fba4ff6eede835b29f678f90e3d3c22" + resolved "https://registry.npmjs.org/globby/-/globby-12.2.0.tgz" integrity sha512-wiSuFQLZ+urS9x2gGPl1H5drc5twabmm4m2gTR27XDFyjUHJUNsS8o/2aKyIF6IoBaR630atdher0XJ5g6OMmA== dependencies: array-union "^3.0.1" @@ -5953,116 +6017,96 @@ globby@^12.0.2: merge2 "^1.4.1" slash "^4.0.0" -globby@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/globby/-/globby-5.0.0.tgz#ebd84667ca0dbb330b99bcfc68eac2bc54370e0d" - integrity sha512-HJRTIH2EeH44ka+LWig+EqT2ONSYpVlNfx6pyd592/VF1TbfljJ7elwie7oSwcViLGqOdWocSdu2txwBF9bjmQ== +gopd@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz" + integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== dependencies: - array-union "^1.0.1" - arrify "^1.0.0" - glob "^7.0.3" - object-assign "^4.0.1" - pify "^2.0.0" - pinkie-promise "^2.0.0" + get-intrinsic "^1.1.3" graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4, graceful-fs@^4.2.6, graceful-fs@^4.2.9: - version "4.2.10" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" - integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== + version "4.2.11" + resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz" + integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== grapheme-splitter@^1.0.4: version "1.0.4" - resolved "https://registry.yarnpkg.com/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz#9cf3a665c6247479896834af35cf1dbb4400767e" + resolved "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz" integrity sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ== guess-parser@^0.4.12: version "0.4.22" - resolved "https://registry.yarnpkg.com/guess-parser/-/guess-parser-0.4.22.tgz#c26ab9e21b69bbc761960c5a1511476ae85428eb" + resolved "https://registry.npmjs.org/guess-parser/-/guess-parser-0.4.22.tgz" integrity sha512-KcUWZ5ACGaBM69SbqwVIuWGoSAgD+9iJnchR9j/IarVI1jHVeXv+bUXBIMeqVMSKt3zrn0Dgf9UpcOEpPBLbSg== dependencies: "@wessberg/ts-evaluator" "0.0.27" gzip-size@^6.0.0: version "6.0.0" - resolved "https://registry.yarnpkg.com/gzip-size/-/gzip-size-6.0.0.tgz#065367fd50c239c0671cbcbad5be3e2eeb10e462" + resolved "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz" integrity sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q== dependencies: duplexer "^0.1.2" handle-thing@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-2.0.1.tgz#857f79ce359580c340d43081cc648970d0bb234e" + resolved "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz" integrity sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg== -har-schema@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" - integrity sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q== - -har-validator@~5.1.3: - version "5.1.5" - resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.5.tgz#1f0803b9f8cb20c0fa13822df1ecddb36bde1efd" - integrity sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w== - dependencies: - ajv "^6.12.3" - har-schema "^2.0.0" - -has-ansi@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" - integrity sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg== - dependencies: - ansi-regex "^2.0.0" - has-bigints@^1.0.1, has-bigints@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa" + resolved "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz" integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== has-flag@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + resolved "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz" integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== has-flag@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + resolved "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== has-property-descriptors@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz#610708600606d36961ed04c196193b6a607fa861" + resolved "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz" integrity sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ== dependencies: get-intrinsic "^1.1.1" +has-proto@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz" + integrity sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg== + has-symbols@^1.0.2, has-symbols@^1.0.3: version "1.0.3" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" + resolved "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz" integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== has-tostringtag@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25" + resolved "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz" integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== dependencies: has-symbols "^1.0.2" has-unicode@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" + resolved "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz" integrity sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ== has@^1.0.3: version "1.0.3" - resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" + resolved "https://registry.npmjs.org/has/-/has-1.0.3.tgz" integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== dependencies: function-bind "^1.1.1" hdr-histogram-js@^2.0.1: version "2.0.3" - resolved "https://registry.yarnpkg.com/hdr-histogram-js/-/hdr-histogram-js-2.0.3.tgz#0b860534655722b6e3f3e7dca7b78867cf43dcb5" + resolved "https://registry.npmjs.org/hdr-histogram-js/-/hdr-histogram-js-2.0.3.tgz" integrity sha512-Hkn78wwzWHNCp2uarhzQ2SGFLU3JY8SBDDd3TAABK4fc30wm+MuPOrg5QVFVfkKOQd6Bfz3ukJEI+q9sXEkK1g== dependencies: "@assemblyscript/loader" "^0.10.1" @@ -6071,26 +6115,26 @@ hdr-histogram-js@^2.0.1: hdr-histogram-percentiles-obj@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/hdr-histogram-percentiles-obj/-/hdr-histogram-percentiles-obj-3.0.0.tgz#9409f4de0c2dda78e61de2d9d78b1e9f3cba283c" + resolved "https://registry.npmjs.org/hdr-histogram-percentiles-obj/-/hdr-histogram-percentiles-obj-3.0.0.tgz" integrity sha512-7kIufnBqdsBGcSZLPJwqHT3yhk1QTsSlFsVD3kx5ixH/AlgBs9yM1q6DPhXZ8f8gtdqgh7N7/5btRLpQsS2gHw== hoist-non-react-statics@^3.3.0, hoist-non-react-statics@^3.3.2: version "3.3.2" - resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45" + resolved "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz" integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw== dependencies: react-is "^16.7.0" hosted-git-info@^4.0.1: version "4.1.0" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-4.1.0.tgz#827b82867e9ff1c8d0c4d9d53880397d2c86d224" + resolved "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz" integrity sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA== dependencies: lru-cache "^6.0.0" hpack.js@^2.1.6: version "2.1.6" - resolved "https://registry.yarnpkg.com/hpack.js/-/hpack.js-2.1.6.tgz#87774c0949e513f42e84575b3c45681fade2a0b2" + resolved "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz" integrity sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ== dependencies: inherits "^2.0.1" @@ -6100,38 +6144,38 @@ hpack.js@^2.1.6: html-encoding-sniffer@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz#42a6dc4fd33f00281176e8b23759ca4e4fa185f3" + resolved "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz" integrity sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ== dependencies: whatwg-encoding "^1.0.5" html-encoding-sniffer@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz#2cb1a8cf0db52414776e5b2a7a04d5dd98158de9" + resolved "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz" integrity sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA== dependencies: whatwg-encoding "^2.0.0" html-entities@^2.3.2: version "2.3.3" - resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-2.3.3.tgz#117d7626bece327fc8baace8868fa6f5ef856e46" + resolved "https://registry.npmjs.org/html-entities/-/html-entities-2.3.3.tgz" integrity sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA== html-escaper@^2.0.0: version "2.0.2" - resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" + resolved "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz" integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== html-parse-stringify@^3.0.1: version "3.0.1" - resolved "https://registry.yarnpkg.com/html-parse-stringify/-/html-parse-stringify-3.0.1.tgz#dfc1017347ce9f77c8141a507f233040c59c55d2" + resolved "https://registry.npmjs.org/html-parse-stringify/-/html-parse-stringify-3.0.1.tgz" integrity sha512-KknJ50kTInJ7qIScF3jeaFRpMpE8/lfiTdzf/twXyPBLAGrLRTmkz3AdTnKeh40X8k9L2fdYwEp/42WGXIRGcg== dependencies: void-elements "3.1.0" htmlparser2@^5.0.0: version "5.0.1" - resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-5.0.1.tgz#7daa6fc3e35d6107ac95a4fc08781f091664f6e7" + resolved "https://registry.npmjs.org/htmlparser2/-/htmlparser2-5.0.1.tgz" integrity sha512-vKZZra6CSe9qsJzh0BjBGXo8dvzNsq/oGvsjfRdOrrryfeD9UOBEEQdeoqCRmKZchF5h2zOBMQ6YuQ0uRUmdbQ== dependencies: domelementtype "^2.0.1" @@ -6139,9 +6183,9 @@ htmlparser2@^5.0.0: domutils "^2.4.2" entities "^2.0.0" -htmlparser2@^6.0.0, htmlparser2@^6.1.0: +htmlparser2@^6.1.0: version "6.1.0" - resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-6.1.0.tgz#c4d762b6c3371a05dbe65e94ae43a9f845fb8fb7" + resolved "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz" integrity sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A== dependencies: domelementtype "^2.0.1" @@ -6149,19 +6193,39 @@ htmlparser2@^6.0.0, htmlparser2@^6.1.0: domutils "^2.5.2" entities "^2.0.0" +htmlparser2@^8.0.0: + version "8.0.2" + resolved "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz" + integrity sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA== + dependencies: + domelementtype "^2.3.0" + domhandler "^5.0.3" + domutils "^3.0.1" + entities "^4.4.0" + http-cache-semantics@^4.1.0: version "4.1.1" - resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz#abe02fcb2985460bf0323be664436ec3476a6d5a" + resolved "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz" integrity sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ== http-deceiver@^1.2.7: version "1.2.7" - resolved "https://registry.yarnpkg.com/http-deceiver/-/http-deceiver-1.2.7.tgz#fa7168944ab9a519d337cb0bec7284dc3e723d87" + resolved "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz" integrity sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw== +http-errors@~1.6.2: + version "1.6.3" + resolved "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz" + integrity sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A== + dependencies: + depd "~1.1.2" + inherits "2.0.3" + setprototypeof "1.1.0" + statuses ">= 1.4.0 < 2" + http-errors@2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" + resolved "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz" integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== dependencies: depd "2.0.0" @@ -6170,24 +6234,14 @@ http-errors@2.0.0: statuses "2.0.1" toidentifier "1.0.1" -http-errors@~1.6.2: - version "1.6.3" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d" - integrity sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A== - dependencies: - depd "~1.1.2" - inherits "2.0.3" - setprototypeof "1.1.0" - statuses ">= 1.4.0 < 2" - http-parser-js@>=0.5.1: version "0.5.8" - resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.5.8.tgz#af23090d9ac4e24573de6f6aecc9d84a48bf20e3" + resolved "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz" integrity sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q== http-proxy-agent@^4.0.1: version "4.0.1" - resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz#8a8c8ef7f5932ccf953c296ca8291b95aa74aa3a" + resolved "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz" integrity sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg== dependencies: "@tootallnate/once" "1" @@ -6196,7 +6250,7 @@ http-proxy-agent@^4.0.1: http-proxy-agent@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz#5129800203520d434f142bc78ff3c170800f2b43" + resolved "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz" integrity sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w== dependencies: "@tootallnate/once" "2" @@ -6205,7 +6259,7 @@ http-proxy-agent@^5.0.0: http-proxy-middleware@^1.0.5: version "1.3.1" - resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-1.3.1.tgz#43700d6d9eecb7419bf086a128d0f7205d9eb665" + resolved "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-1.3.1.tgz" integrity sha512-13eVVDYS4z79w7f1+NPllJtOQFx/FdUW4btIvVRMaRlUY9VGstAbo5MOhLEuUgZFRHn3x50ufn25zkj/boZnEg== dependencies: "@types/http-proxy" "^1.17.5" @@ -6214,9 +6268,20 @@ http-proxy-middleware@^1.0.5: is-plain-obj "^3.0.0" micromatch "^4.0.2" -http-proxy-middleware@^2.0.0, http-proxy-middleware@^2.0.3: +http-proxy-middleware@^2.0.0: version "2.0.6" - resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz#e1a4dd6979572c7ab5a4e4b55095d1f32a74963f" + resolved "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz" + integrity sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw== + dependencies: + "@types/http-proxy" "^1.17.8" + http-proxy "^1.18.1" + is-glob "^4.0.1" + is-plain-obj "^3.0.0" + micromatch "^4.0.2" + +http-proxy-middleware@^2.0.3: + version "2.0.6" + resolved "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz" integrity sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw== dependencies: "@types/http-proxy" "^1.17.8" @@ -6227,152 +6292,157 @@ http-proxy-middleware@^2.0.0, http-proxy-middleware@^2.0.3: http-proxy@^1.18.1: version "1.18.1" - resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.18.1.tgz#401541f0534884bbf95260334e72f88ee3976549" + resolved "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz" integrity sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ== dependencies: eventemitter3 "^4.0.0" follow-redirects "^1.0.0" requires-port "^1.0.0" -http-signature@~1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" - integrity sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ== - dependencies: - assert-plus "^1.0.0" - jsprim "^1.2.2" - sshpk "^1.7.0" - http-signature@~1.3.6: version "1.3.6" - resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.3.6.tgz#cb6fbfdf86d1c974f343be94e87f7fc128662cf9" + resolved "https://registry.npmjs.org/http-signature/-/http-signature-1.3.6.tgz" integrity sha512-3adrsD6zqo4GsTqtO7FyrejHNv+NgiIfAfv68+jVlFmSr9OGy7zrxONceFRLKvnnZA5jbxQBX1u9PpB6Wi32Gw== dependencies: assert-plus "^1.0.0" jsprim "^2.0.2" sshpk "^1.14.1" -https-proxy-agent@5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz#e2a90542abb68a762e0a0850f6c9edadfd8506b2" - integrity sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA== +https-proxy-agent@^5.0.0: + version "5.0.1" + resolved "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz" + integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== dependencies: agent-base "6" debug "4" -https-proxy-agent@^5.0.0: - version "5.0.1" - resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6" - integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== +https-proxy-agent@5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz" + integrity sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA== dependencies: agent-base "6" debug "4" human-signals@^1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-1.1.1.tgz#c5b1cd14f50aeae09ab6c59fe63ba3395fe4dfa3" + resolved "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz" integrity sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw== human-signals@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" + resolved "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz" integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== humanize-ms@^1.2.1: version "1.2.1" - resolved "https://registry.yarnpkg.com/humanize-ms/-/humanize-ms-1.2.1.tgz#c46e3159a293f6b896da29316d8b6fe8bb79bbed" + resolved "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz" integrity sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ== dependencies: ms "^2.0.0" hyphenate-style-name@^1.0.3: version "1.0.4" - resolved "https://registry.yarnpkg.com/hyphenate-style-name/-/hyphenate-style-name-1.0.4.tgz#691879af8e220aea5750e8827db4ef62a54e361d" + resolved "https://registry.npmjs.org/hyphenate-style-name/-/hyphenate-style-name-1.0.4.tgz" integrity sha512-ygGZLjmXfPHj+ZWh6LwbC37l43MhfztxetbFCoYTM2VjkIUpeHgSNn7QIyVFj7YQ1Wl9Cbw5sholVJPzWvC2MQ== -i18next@^19.5.0: +i18next@^19.5.0, "i18next@>= 19.0.0": version "19.9.2" - resolved "https://registry.yarnpkg.com/i18next/-/i18next-19.9.2.tgz#ea5a124416e3c5ab85fddca2c8e3c3669a8da397" + resolved "https://registry.npmjs.org/i18next/-/i18next-19.9.2.tgz" integrity sha512-0i6cuo6ER6usEOtKajUUDj92zlG+KArFia0857xxiEHAQcUwh/RtOQocui1LPJwunSYT574Pk64aNva1kwtxZg== dependencies: "@babel/runtime" "^7.12.0" icomcom-react@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/icomcom-react/-/icomcom-react-1.0.1.tgz#6c513655bc576621930e31d19ddb718c3b7439f4" + resolved "https://registry.npmjs.org/icomcom-react/-/icomcom-react-1.0.1.tgz" integrity sha512-Xbz81qZ+er8RYZ6DFMmXxCl9YjxNWngNfPANTSOvzYNrQDieYvBZi+nv1MspI/ze+PAzfHUrmDcUii5RGCUifg== dependencies: prop-types "^15.6.0" -iconv-lite@0.4.24, iconv-lite@^0.4.24, iconv-lite@^0.4.4: +iconv-lite@^0.4.24: version "0.4.24" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz" integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== dependencies: safer-buffer ">= 2.1.2 < 3" -iconv-lite@0.6.3, iconv-lite@^0.6.2, iconv-lite@^0.6.3: +iconv-lite@^0.4.4: + version "0.4.24" + resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + +iconv-lite@^0.6.2, iconv-lite@^0.6.3, iconv-lite@0.6.3: version "0.6.3" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" + resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz" integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== dependencies: safer-buffer ">= 2.1.2 < 3.0.0" +iconv-lite@0.4.24: + version "0.4.24" + resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + icss-utils@^5.0.0, icss-utils@^5.1.0: version "5.1.0" - resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-5.1.0.tgz#c6be6858abd013d768e98366ae47e25d5887b1ae" + resolved "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz" integrity sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA== ieee754@^1.1.13: version "1.2.1" - resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" + resolved "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz" integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== ignore-by-default@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/ignore-by-default/-/ignore-by-default-1.0.1.tgz#48ca6d72f6c6a3af00a9ad4ae6876be3889e2b09" + resolved "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz" integrity sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA== ignore-walk@^4.0.1: version "4.0.1" - resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-4.0.1.tgz#fc840e8346cf88a3a9380c5b17933cd8f4d39fa3" + resolved "https://registry.npmjs.org/ignore-walk/-/ignore-walk-4.0.1.tgz" integrity sha512-rzDQLaW4jQbh2YrOFlJdCtX8qgJTehFRYiUB2r1osqTeDzV/3+Jh8fz1oAPzUThf3iku8Ds4IDqawI5d8mUiQw== dependencies: minimatch "^3.0.4" +ignore@^5.0.4, ignore@^5.1.8, ignore@^5.1.9, ignore@^5.2.0: + version "5.2.4" + resolved "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz" + integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ== + ignore@5.2.0: version "5.2.0" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.0.tgz#6d3bac8fa7fe0d45d9f9be7bac2fc279577e345a" + resolved "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz" integrity sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ== -ignore@^5.0.4, ignore@^5.1.8, ignore@^5.1.9, ignore@^5.2.0: - version "5.2.1" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.1.tgz#c2b1f76cb999ede1502f3a226a9310fdfe88d46c" - integrity sha512-d2qQLzTJ9WxQftPAuEQpSPmKqzxePjzVbpAVv62AQ64NTL+wR4JkrVqR/LqFsFEUsHDAiId52mJteHDFuDkElA== - image-size@~0.5.0: version "0.5.5" - resolved "https://registry.yarnpkg.com/image-size/-/image-size-0.5.5.tgz#09dfd4ab9d20e29eb1c3e80b8990378df9e3cb9c" + resolved "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz" integrity sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ== immutability-helper@^3.0.1: version "3.1.1" - resolved "https://registry.yarnpkg.com/immutability-helper/-/immutability-helper-3.1.1.tgz#2b86b2286ed3b1241c9e23b7b21e0444f52f77b7" + resolved "https://registry.npmjs.org/immutability-helper/-/immutability-helper-3.1.1.tgz" integrity sha512-Q0QaXjPjwIju/28TsugCHNEASwoCcJSyJV3uO1sOIQGI0jKgm9f41Lvz0DZj3n46cNCyAZTsEYoY4C2bVRUzyQ== immutable@^3: version "3.8.2" - resolved "https://registry.yarnpkg.com/immutable/-/immutable-3.8.2.tgz#c2439951455bb39913daf281376f1530e104adf3" + resolved "https://registry.npmjs.org/immutable/-/immutable-3.8.2.tgz" integrity sha512-15gZoQ38eYjEjxkorfbcgBKBL6R7T459OuK+CpcWt7O3KF4uPCx2tD0uFETlUDIyo+1789crbMhTvQBSR5yBMg== immutable@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.1.0.tgz#f795787f0db780183307b9eb2091fcac1f6fafef" - integrity sha512-oNkuqVTA8jqG1Q6c+UglTOD1xhC1BtjKI7XkCXRkZHrN5m18/XsnUp8Q89GkQO/z+0WjonSvl0FLhDYftp46nQ== + version "4.3.0" + resolved "https://registry.npmjs.org/immutable/-/immutable-4.3.0.tgz" + integrity sha512-0AOCmOip+xgJwEVTQj1EfiDDOkPmuyllDuTuEX+DDXUgapLAsBIfkg3sxCYyCEA8mQqZrrxPUGjcOQ2JS3WLkg== import-fresh@^3.0.0, import-fresh@^3.2.1: version "3.3.0" - resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" + resolved "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz" integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== dependencies: parent-module "^1.0.0" @@ -6380,7 +6450,7 @@ import-fresh@^3.0.0, import-fresh@^3.2.1: import-local@^3.0.2: version "3.1.0" - resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.1.0.tgz#b4479df8a5fd44f6cdce24070675676063c95cb4" + resolved "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz" integrity sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg== dependencies: pkg-dir "^4.2.0" @@ -6388,50 +6458,45 @@ import-local@^3.0.2: imurmurhash@^0.1.4: version "0.1.4" - resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + resolved "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz" integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== indent-string@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" + resolved "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz" integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== infer-owner@^1.0.4: version "1.0.4" - resolved "https://registry.yarnpkg.com/infer-owner/-/infer-owner-1.0.4.tgz#c4cefcaa8e51051c2a40ba2ce8a3d27295af9467" + resolved "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz" integrity sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A== inflight@^1.0.4: version "1.0.6" - resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + resolved "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz" integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== dependencies: once "^1.3.0" wrappy "1" -inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3: +inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3, inherits@2, inherits@2.0.4: version "2.0.4" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== inherits@2.0.3: version "2.0.3" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz" integrity sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw== ini@2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/ini/-/ini-2.0.0.tgz#e5fd556ecdd5726be978fa1001862eacb0a94bc5" + resolved "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz" integrity sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA== -ini@^1.3.4: - version "1.3.8" - resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" - integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== - inquirer@8.2.0: version "8.2.0" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-8.2.0.tgz#f44f008dd344bbfc4b30031f45d984e034a3ac3a" + resolved "https://registry.npmjs.org/inquirer/-/inquirer-8.2.0.tgz" integrity sha512-0crLweprevJ02tTuA6ThpoAERAGyVILC4sS74uib58Xf/zSr1/ZWtmm7D5CI+bSQEaA04f0K7idaHpQbSWgiVQ== dependencies: ansi-escapes "^4.2.1" @@ -6449,82 +6514,91 @@ inquirer@8.2.0: strip-ansi "^6.0.0" through "^2.3.6" -internal-slot@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.3.tgz#7347e307deeea2faac2ac6205d4bc7d34967f59c" - integrity sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA== +internal-slot@^1.0.5: + version "1.0.5" + resolved "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz" + integrity sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ== dependencies: - get-intrinsic "^1.1.0" + get-intrinsic "^1.2.0" has "^1.0.3" side-channel "^1.0.4" interpret@^2.2.0: version "2.2.0" - resolved "https://registry.yarnpkg.com/interpret/-/interpret-2.2.0.tgz#1a78a0b5965c40a5416d007ad6f50ad27c417df9" + resolved "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz" integrity sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw== intersection-observer@^0.10.0: version "0.10.0" - resolved "https://registry.yarnpkg.com/intersection-observer/-/intersection-observer-0.10.0.tgz#4d11d63c1ff67e21e62987be24d55218da1a1a69" + resolved "https://registry.npmjs.org/intersection-observer/-/intersection-observer-0.10.0.tgz" integrity sha512-fn4bQ0Xq8FTej09YC/jqKZwtijpvARlRp6wxL5WTA6yPe2YWSJ5RJh7Nm79rK2qB0wr6iDQzH60XGq5V/7u8YQ== invariant@^2.2.4: version "2.2.4" - resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" + resolved "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz" integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== dependencies: loose-envify "^1.0.0" ip@^1.1.0: version "1.1.8" - resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.8.tgz#ae05948f6b075435ed3307acce04629da8cdbf48" + resolved "https://registry.npmjs.org/ip/-/ip-1.1.8.tgz" integrity sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg== ip@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/ip/-/ip-2.0.0.tgz#4cf4ab182fee2314c75ede1276f8c80b479936da" + resolved "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz" integrity sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ== -ipaddr.js@1.9.1: - version "1.9.1" - resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" - integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== - ipaddr.js@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-2.0.1.tgz#eca256a7a877e917aeb368b0a7497ddf42ef81c0" + resolved "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.0.1.tgz" integrity sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng== +ipaddr.js@1.9.1: + version "1.9.1" + resolved "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz" + integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== + is-arguments@^1.0.4: version "1.1.1" - resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b" + resolved "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz" integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA== dependencies: call-bind "^1.0.2" has-tostringtag "^1.0.0" +is-array-buffer@^3.0.1, is-array-buffer@^3.0.2: + version "3.0.2" + resolved "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz" + integrity sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.2.0" + is-typed-array "^1.1.10" + is-arrayish@^0.2.1: version "0.2.1" - resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + resolved "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz" integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== is-bigint@^1.0.1: version "1.0.4" - resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" + resolved "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz" integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== dependencies: has-bigints "^1.0.1" is-binary-path@~2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + resolved "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz" integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== dependencies: binary-extensions "^2.0.0" is-boolean-object@^1.1.0: version "1.1.2" - resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719" + resolved "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz" integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== dependencies: call-bind "^1.0.2" @@ -6532,65 +6606,65 @@ is-boolean-object@^1.1.0: is-buffer@~1.1.6: version "1.1.6" - resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" + resolved "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz" integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== -is-callable@^1.1.4, is-callable@^1.2.7: +is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: version "1.2.7" - resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" + resolved "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz" integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== is-ci@^3.0.0: version "3.0.1" - resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-3.0.1.tgz#db6ecbed1bd659c43dac0f45661e7674103d1867" + resolved "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz" integrity sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ== dependencies: ci-info "^3.2.0" -is-core-module@^2.8.1, is-core-module@^2.9.0: - version "2.11.0" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.11.0.tgz#ad4cb3e3863e814523c96f3f58d26cc570ff0144" - integrity sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw== +is-core-module@^2.11.0, is-core-module@^2.8.1: + version "2.12.0" + resolved "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.0.tgz" + integrity sha512-RECHCBCd/viahWmwj6enj19sKbHfJrddi/6cBDsNTKbNq0f7VeaUkBo60BqzvPqo/W54ChS62Z5qyun7cfOMqQ== dependencies: has "^1.0.3" is-date-object@^1.0.1: version "1.0.5" - resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" + resolved "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz" integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== dependencies: has-tostringtag "^1.0.0" is-docker@^2.0.0, is-docker@^2.1.1: version "2.2.1" - resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" + resolved "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz" integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== is-extglob@^2.1.1: version "2.1.1" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz" integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== is-fullwidth-code-point@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz" integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: version "4.0.3" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz" integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== dependencies: is-extglob "^2.1.1" is-in-browser@^1.0.2, is-in-browser@^1.1.3: version "1.1.3" - resolved "https://registry.yarnpkg.com/is-in-browser/-/is-in-browser-1.1.3.tgz#56ff4db683a078c6082eb95dad7dc62e1d04f835" + resolved "https://registry.npmjs.org/is-in-browser/-/is-in-browser-1.1.3.tgz" integrity sha512-FeXIBgG/CPGd/WUxuEyvgGTEfwiG9Z4EKGxjNMRqviiIIfsmgrpnHLffEDdwUHqNva1VEW91o3xBT/m8Elgl9g== is-installed-globally@~0.4.0: version "0.4.0" - resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.4.0.tgz#9a0fd407949c30f86eb6959ef1b7994ed0b7b520" + resolved "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz" integrity sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ== dependencies: global-dirs "^3.0.0" @@ -6598,92 +6672,73 @@ is-installed-globally@~0.4.0: is-interactive@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/is-interactive/-/is-interactive-1.0.0.tgz#cea6e6ae5c870a7b0a0004070b7b587e0252912e" + resolved "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz" integrity sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w== is-lambda@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/is-lambda/-/is-lambda-1.0.1.tgz#3d9877899e6a53efc0160504cde15f82e6f061d5" + resolved "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz" integrity sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ== is-negative-zero@^2.0.2: version "2.0.2" - resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150" + resolved "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz" integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA== is-number-like@^1.0.3: version "1.0.8" - resolved "https://registry.yarnpkg.com/is-number-like/-/is-number-like-1.0.8.tgz#2e129620b50891042e44e9bbbb30593e75cfbbe3" + resolved "https://registry.npmjs.org/is-number-like/-/is-number-like-1.0.8.tgz" integrity sha512-6rZi3ezCyFcn5L71ywzz2bS5b2Igl1En3eTlZlvKjpz1n3IZLAYMbKYAIQgFmEu0GENg92ziU/faEOA/aixjbA== dependencies: lodash.isfinite "^3.3.2" is-number-object@^1.0.4: version "1.0.7" - resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.7.tgz#59d50ada4c45251784e9904f5246c742f07a42fc" + resolved "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz" integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ== dependencies: has-tostringtag "^1.0.0" is-number@^7.0.0: version "7.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz" integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== -is-path-cwd@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-1.0.0.tgz#d225ec23132e89edd38fda767472e62e65f1106d" - integrity sha512-cnS56eR9SPAscL77ik76ATVqoPARTqPIVkMDVxRaWH06zT+6+CzIroYRJ0VVvm0Z1zfAvxvz9i/D3Ppjaqt5Nw== - is-path-cwd@^2.2.0: version "2.2.0" - resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-2.2.0.tgz#67d43b82664a7b5191fd9119127eb300048a9fdb" + resolved "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz" integrity sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ== -is-path-in-cwd@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz#5ac48b345ef675339bd6c7a48a912110b241cf52" - integrity sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ== - dependencies: - is-path-inside "^1.0.0" - -is-path-inside@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.1.tgz#8ef5b7de50437a3fdca6b4e865ef7aa55cb48036" - integrity sha512-qhsCR/Esx4U4hg/9I19OVUAJkGWtjRYHMRgUMZE2TDdj+Ag+kttZanLupfddNyglzz50cUlmWzUaI37GDfNx/g== - dependencies: - path-is-inside "^1.0.1" - is-path-inside@^3.0.2, is-path-inside@^3.0.3: version "3.0.3" - resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" + resolved "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz" integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== is-plain-obj@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-3.0.0.tgz#af6f2ea14ac5a646183a5bbdb5baabbc156ad9d7" + resolved "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz" integrity sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA== is-plain-object@^2.0.4: version "2.0.4" - resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" + resolved "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz" integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== dependencies: isobject "^3.0.1" is-plain-object@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-5.0.0.tgz#4427f50ab3429e9025ea7d52e9043a9ef4159344" + resolved "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz" integrity sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q== is-potential-custom-element-name@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz#171ed6f19e3ac554394edf78caa05784a45bebb5" + resolved "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz" integrity sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ== is-regex@^1.0.4, is-regex@^1.1.4: version "1.1.4" - resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" + resolved "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz" integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== dependencies: call-bind "^1.0.2" @@ -6691,92 +6746,103 @@ is-regex@^1.0.4, is-regex@^1.1.4: is-shared-array-buffer@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz#8f259c573b60b6a32d4058a1a07430c0a7344c79" + resolved "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz" integrity sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA== dependencies: call-bind "^1.0.2" is-stream@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" + resolved "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz" integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== is-string@^1.0.5, is-string@^1.0.7: version "1.0.7" - resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" + resolved "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz" integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== dependencies: has-tostringtag "^1.0.0" is-symbol@^1.0.2, is-symbol@^1.0.3: version "1.0.4" - resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" + resolved "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz" integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== dependencies: has-symbols "^1.0.2" +is-typed-array@^1.1.10, is-typed-array@^1.1.9: + version "1.1.10" + resolved "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz" + integrity sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A== + dependencies: + available-typed-arrays "^1.0.5" + call-bind "^1.0.2" + for-each "^0.3.3" + gopd "^1.0.1" + has-tostringtag "^1.0.0" + is-typedarray@~1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" + resolved "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz" integrity sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA== is-unicode-supported@^0.1.0: version "0.1.0" - resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" + resolved "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz" integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== is-weakref@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" + resolved "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz" integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== dependencies: call-bind "^1.0.2" is-what@^3.14.1: version "3.14.1" - resolved "https://registry.yarnpkg.com/is-what/-/is-what-3.14.1.tgz#e1222f46ddda85dead0fd1c9df131760e77755c1" + resolved "https://registry.npmjs.org/is-what/-/is-what-3.14.1.tgz" integrity sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA== is-wsl@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d" + resolved "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz" integrity sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw== is-wsl@^2.2.0: version "2.2.0" - resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" + resolved "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz" integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== dependencies: is-docker "^2.0.0" isarray@~1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + resolved "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz" integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== isbinaryfile@^4.0.8: version "4.0.10" - resolved "https://registry.yarnpkg.com/isbinaryfile/-/isbinaryfile-4.0.10.tgz#0c5b5e30c2557a2f06febd37b7322946aaee42b3" + resolved "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.10.tgz" integrity sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw== isbot@^3.6.5: - version "3.6.5" - resolved "https://registry.yarnpkg.com/isbot/-/isbot-3.6.5.tgz#a749980d9dfba9ebcc03ee7b548d1f24dd8c9f1e" - integrity sha512-BchONELXt6yMad++BwGpa0oQxo/uD0keL7N15cYVf0A1oMIoNQ79OqeYdPMFWDrNhCqCbRuw9Y9F3QBjvAxZ5g== + version "3.6.8" + resolved "https://registry.npmjs.org/isbot/-/isbot-3.6.8.tgz" + integrity sha512-V8XUXN0/UYxfgrui4o38pmOve2eO/1KjluxR1G8Qnu5gqlUiNrvtX06t1W5n8vFtrtKfHj96iFYuPL39jXUe8g== isexe@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== isobject@^3.0.1: version "3.0.1" - resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" + resolved "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz" integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg== isomorphic-unfetch@^3.0.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/isomorphic-unfetch/-/isomorphic-unfetch-3.1.0.tgz#87341d5f4f7b63843d468438128cb087b7c3e98f" + resolved "https://registry.npmjs.org/isomorphic-unfetch/-/isomorphic-unfetch-3.1.0.tgz" integrity sha512-geDJjpoZ8N0kWexiwkX8F9NkTsXhetLPVbZFQ+JTW239QNOwvB0gniuR1Wc6f0AMTn7/mFGyXvHTifrCp/GH8Q== dependencies: node-fetch "^2.6.1" @@ -6784,22 +6850,22 @@ isomorphic-unfetch@^3.0.0: isstream@~0.1.2: version "0.1.2" - resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" + resolved "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz" integrity sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g== istanbul-lib-coverage@^2.0.5: version "2.0.5" - resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz#675f0ab69503fad4b1d849f736baaca803344f49" + resolved "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz" integrity sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA== istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0: version "3.2.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz#189e7909d0a39fa5a3dfad5b03f71947770191d3" + resolved "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz" integrity sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw== istanbul-lib-instrument@^5.0.4: version "5.2.1" - resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz#d10c8885c2125574e1c231cacadf955675e1ce3d" + resolved "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz" integrity sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg== dependencies: "@babel/core" "^7.12.3" @@ -6810,7 +6876,7 @@ istanbul-lib-instrument@^5.0.4: istanbul-lib-report@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#7518fe52ea44de372f460a76b5ecda9ffb73d8a6" + resolved "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz" integrity sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw== dependencies: istanbul-lib-coverage "^3.0.0" @@ -6819,7 +6885,7 @@ istanbul-lib-report@^3.0.0: istanbul-lib-source-maps@^3.0.6: version "3.0.6" - resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-3.0.6.tgz#284997c48211752ec486253da97e3879defba8c8" + resolved "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-3.0.6.tgz" integrity sha512-R47KzMtDJH6X4/YW9XTx+jrLnZnscW4VpNN+1PViSYTejLVPWv7oov+Duf8YQSPyVRUvueQqz1TcsC6mooZTXw== dependencies: debug "^4.1.1" @@ -6830,7 +6896,7 @@ istanbul-lib-source-maps@^3.0.6: istanbul-reports@^3.0.2: version "3.1.5" - resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.5.tgz#cc9a6ab25cb25659810e4785ed9d9fb742578bae" + resolved "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz" integrity sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w== dependencies: html-escaper "^2.0.0" @@ -6838,7 +6904,7 @@ istanbul-reports@^3.0.2: jake@^10.8.5: version "10.8.5" - resolved "https://registry.yarnpkg.com/jake/-/jake-10.8.5.tgz#f2183d2c59382cb274226034543b9c03b8164c46" + resolved "https://registry.npmjs.org/jake/-/jake-10.8.5.tgz" integrity sha512-sVpxYeuAhWt0OTWITwT98oyV0GsXyMlXCF+3L1SuafBVUIr/uILGRB+NqwkzhgXKvoJpDIpQvqkUALgdmQsQxw== dependencies: async "^3.2.3" @@ -6846,21 +6912,21 @@ jake@^10.8.5: filelist "^1.0.1" minimatch "^3.0.4" -jasmine-core@^3.6.0, jasmine-core@^3.8.0: +jasmine-core@^3.6.0, jasmine-core@^3.8.0, jasmine-core@>=3.8: version "3.99.1" - resolved "https://registry.yarnpkg.com/jasmine-core/-/jasmine-core-3.99.1.tgz#5bfa4b2d76618868bfac4c8ff08bb26fffa4120d" + resolved "https://registry.npmjs.org/jasmine-core/-/jasmine-core-3.99.1.tgz" integrity sha512-Hu1dmuoGcZ7AfyynN3LsfruwMbxMALMka+YtZeGoLuDEySVmVAPaonkNoBRIw/ectu8b9tVQCJNgp4a4knp+tg== jasmine-marbles@0.9.2: version "0.9.2" - resolved "https://registry.yarnpkg.com/jasmine-marbles/-/jasmine-marbles-0.9.2.tgz#5adfee5f72c7f24270687fa64a6e8a8613ffa841" + resolved "https://registry.npmjs.org/jasmine-marbles/-/jasmine-marbles-0.9.2.tgz" integrity sha512-T7RjG4fRsdiGGzbQZ6Kj39qYt6O1/KIcR4FkUNsD3DUGkd/AzpwzN+xtk0DXlLWEz5BaVdK1SzMgQDVw879c4Q== dependencies: lodash "^4.17.20" jest-worker@^27.4.5: version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-27.5.1.tgz#8d146f0900e8973b106b6f73cc1e9a8cb86f8db0" + resolved "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz" integrity sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg== dependencies: "@types/node" "*" @@ -6869,80 +6935,55 @@ jest-worker@^27.4.5: js-cookie@2.2.1: version "2.2.1" - resolved "https://registry.yarnpkg.com/js-cookie/-/js-cookie-2.2.1.tgz#69e106dc5d5806894562902aa5baec3744e9b2b8" + resolved "https://registry.npmjs.org/js-cookie/-/js-cookie-2.2.1.tgz" integrity sha512-HvdH2LzI/EAZcUwA8+0nKNtWHqS+ZmijLA30RwZA0bo7ToCckjK5MkGhjED9KoRcXO6BaGI3I9UIzSA1FKFPOQ== js-sdsl@^4.1.4: - version "4.2.0" - resolved "https://registry.yarnpkg.com/js-sdsl/-/js-sdsl-4.2.0.tgz#278e98b7bea589b8baaf048c20aeb19eb7ad09d0" - integrity sha512-dyBIzQBDkCqCu+0upx25Y2jGdbTGxE9fshMsCdK0ViOongpV+n5tXRcZY9v7CaVQ79AGS9KA1KHtojxiM7aXSQ== + version "4.4.0" + resolved "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.4.0.tgz" + integrity sha512-FfVSdx6pJ41Oa+CF7RDaFmTnCaFhua+SNYQX74riGOpl96x+2jQCqEfQ2bnXu/5DPCqlRuiqyvTJM0Qjz26IVg== "js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== -js-yaml@4.1.0, js-yaml@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" - integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== - dependencies: - argparse "^2.0.1" - -js-yaml@^3.10.0, js-yaml@^3.13.1: +js-yaml@^3.10.0: version "3.14.1" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" + resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz" integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== dependencies: argparse "^1.0.7" esprima "^4.0.0" +js-yaml@^3.13.1: + version "3.14.1" + resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz" + integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + +js-yaml@^4.1.0, js-yaml@4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== + dependencies: + argparse "^2.0.1" + jsbn@~0.1.0: version "0.1.1" - resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" + resolved "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz" integrity sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg== jsdoc-type-pratt-parser@~3.1.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-3.1.0.tgz#a4a56bdc6e82e5865ffd9febc5b1a227ff28e67e" + resolved "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-3.1.0.tgz" integrity sha512-MgtD0ZiCDk9B+eI73BextfRrVQl0oyzRG8B2BjORts6jbunj4ScKPcyXGTbB6eXL4y9TzxCm6hyeLq/2ASzNdw== -jsdom@19.0.0: - version "19.0.0" - resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-19.0.0.tgz#93e67c149fe26816d38a849ea30ac93677e16b6a" - integrity sha512-RYAyjCbxy/vri/CfnjUWJQQtZ3LKlLnDqj+9XLNnJPgEGeirZs3hllKR20re8LUZ6o1b1X4Jat+Qd26zmP41+A== - dependencies: - abab "^2.0.5" - acorn "^8.5.0" - acorn-globals "^6.0.0" - cssom "^0.5.0" - cssstyle "^2.3.0" - data-urls "^3.0.1" - decimal.js "^10.3.1" - domexception "^4.0.0" - escodegen "^2.0.0" - form-data "^4.0.0" - html-encoding-sniffer "^3.0.0" - http-proxy-agent "^5.0.0" - https-proxy-agent "^5.0.0" - is-potential-custom-element-name "^1.0.1" - nwsapi "^2.2.0" - parse5 "6.0.1" - saxes "^5.0.1" - symbol-tree "^3.2.4" - tough-cookie "^4.0.0" - w3c-hr-time "^1.0.2" - w3c-xmlserializer "^3.0.0" - webidl-conversions "^7.0.0" - whatwg-encoding "^2.0.0" - whatwg-mimetype "^3.0.0" - whatwg-url "^10.0.0" - ws "^8.2.3" - xml-name-validator "^4.0.0" - jsdom@^16.4.0: version "16.7.0" - resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-16.7.0.tgz#918ae71965424b197c819f8183a754e18977b710" + resolved "https://registry.npmjs.org/jsdom/-/jsdom-16.7.0.tgz" integrity sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw== dependencies: abab "^2.0.5" @@ -6973,90 +7014,118 @@ jsdom@^16.4.0: ws "^7.4.6" xml-name-validator "^3.0.0" +jsdom@19.0.0: + version "19.0.0" + resolved "https://registry.npmjs.org/jsdom/-/jsdom-19.0.0.tgz" + integrity sha512-RYAyjCbxy/vri/CfnjUWJQQtZ3LKlLnDqj+9XLNnJPgEGeirZs3hllKR20re8LUZ6o1b1X4Jat+Qd26zmP41+A== + dependencies: + abab "^2.0.5" + acorn "^8.5.0" + acorn-globals "^6.0.0" + cssom "^0.5.0" + cssstyle "^2.3.0" + data-urls "^3.0.1" + decimal.js "^10.3.1" + domexception "^4.0.0" + escodegen "^2.0.0" + form-data "^4.0.0" + html-encoding-sniffer "^3.0.0" + http-proxy-agent "^5.0.0" + https-proxy-agent "^5.0.0" + is-potential-custom-element-name "^1.0.1" + nwsapi "^2.2.0" + parse5 "6.0.1" + saxes "^5.0.1" + symbol-tree "^3.2.4" + tough-cookie "^4.0.0" + w3c-hr-time "^1.0.2" + w3c-xmlserializer "^3.0.0" + webidl-conversions "^7.0.0" + whatwg-encoding "^2.0.0" + whatwg-mimetype "^3.0.0" + whatwg-url "^10.0.0" + ws "^8.2.3" + xml-name-validator "^4.0.0" + jsesc@^2.5.1: version "2.5.2" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" + resolved "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz" integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== jsesc@~0.5.0: version "0.5.0" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" + resolved "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz" integrity sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA== -json-parse-better-errors@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" - integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== - json-parse-even-better-errors@^2.3.0, json-parse-even-better-errors@^2.3.1: version "2.3.1" - resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" + resolved "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz" integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== json-schema-traverse@^0.4.1: version "0.4.1" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz" integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== json-schema-traverse@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" + resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz" integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== json-schema@0.4.0: version "0.4.0" - resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.4.0.tgz#f7de4cf6efab838ebaeb3236474cbba5a1930ab5" + resolved "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz" integrity sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA== json-stable-stringify-without-jsonify@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" + resolved "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz" integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== json-stringify-safe@~5.0.1: version "5.0.1" - resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" + resolved "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz" integrity sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA== -json5@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe" - integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow== +json5@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz" + integrity sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA== dependencies: minimist "^1.2.0" json5@^2.1.2, json5@^2.2.1, json5@^2.2.2: - version "2.2.2" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.2.tgz#64471c5bdcc564c18f7c1d4df2e2297f2457c5ab" - integrity sha512-46Tk9JiOL2z7ytNQWFLpj99RZkVgeHf87yGQKsIkaPz1qSH9UczKH1rO7K3wgRselo0tYMUNfecYpm/p1vC7tQ== + version "2.2.3" + resolved "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz" + integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== -jsonc-parser@3.0.0: +jsonc-parser@^3.0.0, jsonc-parser@3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/jsonc-parser/-/jsonc-parser-3.0.0.tgz#abdd785701c7e7eaca8a9ec8cf070ca51a745a22" + resolved "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.0.0.tgz" integrity sha512-fQzRfAbIBnR0IQvftw9FJveWiHp72Fg20giDrHz6TdfB12UH/uue0D3hm57UB5KgAVuniLMCaS8P1IMj9NR7cA== -jsonc-parser@3.2.0, jsonc-parser@^3.0.0: +jsonc-parser@3.2.0: version "3.2.0" - resolved "https://registry.yarnpkg.com/jsonc-parser/-/jsonc-parser-3.2.0.tgz#31ff3f4c2b9793f89c67212627c51c6394f88e76" + resolved "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz" integrity sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w== jsonfile@^3.0.0: version "3.0.1" - resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-3.0.1.tgz#a5ecc6f65f53f662c4415c7675a0331d0992ec66" + resolved "https://registry.npmjs.org/jsonfile/-/jsonfile-3.0.1.tgz" integrity sha512-oBko6ZHlubVB5mRFkur5vgYR1UyqX+S6Y/oCfLhqNdcc2fYFlDpIoNc7AfKS1KOGcnNAkvsr0grLck9ANM815w== optionalDependencies: graceful-fs "^4.1.6" jsonfile@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" + resolved "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz" integrity sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg== optionalDependencies: graceful-fs "^4.1.6" jsonfile@^6.0.1: version "6.1.0" - resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" + resolved "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz" integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== dependencies: universalify "^2.0.0" @@ -7065,27 +7134,17 @@ jsonfile@^6.0.1: jsonparse@^1.3.1: version "1.3.1" - resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280" + resolved "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz" integrity sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg== jsonschema@1.4.0: version "1.4.0" - resolved "https://registry.yarnpkg.com/jsonschema/-/jsonschema-1.4.0.tgz#1afa34c4bc22190d8e42271ec17ac8b3404f87b2" + resolved "https://registry.npmjs.org/jsonschema/-/jsonschema-1.4.0.tgz" integrity sha512-/YgW6pRMr6M7C+4o8kS+B/2myEpHCrxO4PEWnqJNBFMjn7EWXqlQ4tGwL6xTHeRplwuZmcAncdvfOad1nT2yMw== -jsprim@^1.2.2: - version "1.4.2" - resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.2.tgz#712c65533a15c878ba59e9ed5f0e26d5b77c5feb" - integrity sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw== - dependencies: - assert-plus "1.0.0" - extsprintf "1.3.0" - json-schema "0.4.0" - verror "1.10.0" - jsprim@^2.0.2: version "2.0.2" - resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-2.0.2.tgz#77ca23dbcd4135cd364800d22ff82c2185803d4d" + resolved "https://registry.npmjs.org/jsprim/-/jsprim-2.0.2.tgz" integrity sha512-gqXddjPqQ6G40VdnI6T6yObEC+pDNvyP95wdQhkWkg7crHH3km5qP1FsOXEkzEQwnz6gz5qGTn1c2Y52wP3OyQ== dependencies: assert-plus "1.0.0" @@ -7094,76 +7153,76 @@ jsprim@^2.0.2: verror "1.10.0" jss-plugin-camel-case@^10.5.1: - version "10.9.2" - resolved "https://registry.yarnpkg.com/jss-plugin-camel-case/-/jss-plugin-camel-case-10.9.2.tgz#76dddfa32f9e62d17daa4e3504991fd0933b89e1" - integrity sha512-wgBPlL3WS0WDJ1lPJcgjux/SHnDuu7opmgQKSraKs4z8dCCyYMx9IDPFKBXQ8Q5dVYij1FFV0WdxyhuOOAXuTg== + version "10.10.0" + resolved "https://registry.npmjs.org/jss-plugin-camel-case/-/jss-plugin-camel-case-10.10.0.tgz" + integrity sha512-z+HETfj5IYgFxh1wJnUAU8jByI48ED+v0fuTuhKrPR+pRBYS2EDwbusU8aFOpCdYhtRc9zhN+PJ7iNE8pAWyPw== dependencies: "@babel/runtime" "^7.3.1" hyphenate-style-name "^1.0.3" - jss "10.9.2" + jss "10.10.0" jss-plugin-default-unit@^10.5.1: - version "10.9.2" - resolved "https://registry.yarnpkg.com/jss-plugin-default-unit/-/jss-plugin-default-unit-10.9.2.tgz#3e7f4a1506b18d8fe231554fd982439feb2a9c53" - integrity sha512-pYg0QX3bBEFtTnmeSI3l7ad1vtHU42YEEpgW7pmIh+9pkWNWb5dwS/4onSfAaI0kq+dOZHzz4dWe+8vWnanoSg== + version "10.10.0" + resolved "https://registry.npmjs.org/jss-plugin-default-unit/-/jss-plugin-default-unit-10.10.0.tgz" + integrity sha512-SvpajxIECi4JDUbGLefvNckmI+c2VWmP43qnEy/0eiwzRUsafg5DVSIWSzZe4d2vFX1u9nRDP46WCFV/PXVBGQ== dependencies: "@babel/runtime" "^7.3.1" - jss "10.9.2" + jss "10.10.0" jss-plugin-global@^10.5.1: - version "10.9.2" - resolved "https://registry.yarnpkg.com/jss-plugin-global/-/jss-plugin-global-10.9.2.tgz#e7f2ad4a5e8e674fb703b04b57a570b8c3e5c2c2" - integrity sha512-GcX0aE8Ef6AtlasVrafg1DItlL/tWHoC4cGir4r3gegbWwF5ZOBYhx04gurPvWHC8F873aEGqge7C17xpwmp2g== + version "10.10.0" + resolved "https://registry.npmjs.org/jss-plugin-global/-/jss-plugin-global-10.10.0.tgz" + integrity sha512-icXEYbMufiNuWfuazLeN+BNJO16Ge88OcXU5ZDC2vLqElmMybA31Wi7lZ3lf+vgufRocvPj8443irhYRgWxP+A== dependencies: "@babel/runtime" "^7.3.1" - jss "10.9.2" + jss "10.10.0" jss-plugin-nested@^10.5.1: - version "10.9.2" - resolved "https://registry.yarnpkg.com/jss-plugin-nested/-/jss-plugin-nested-10.9.2.tgz#3aa2502816089ecf3981e1a07c49b276d67dca63" - integrity sha512-VgiOWIC6bvgDaAL97XCxGD0BxOKM0K0zeB/ECyNaVF6FqvdGB9KBBWRdy2STYAss4VVA7i5TbxFZN+WSX1kfQA== + version "10.10.0" + resolved "https://registry.npmjs.org/jss-plugin-nested/-/jss-plugin-nested-10.10.0.tgz" + integrity sha512-9R4JHxxGgiZhurDo3q7LdIiDEgtA1bTGzAbhSPyIOWb7ZubrjQe8acwhEQ6OEKydzpl8XHMtTnEwHXCARLYqYA== dependencies: "@babel/runtime" "^7.3.1" - jss "10.9.2" + jss "10.10.0" tiny-warning "^1.0.2" jss-plugin-props-sort@^10.5.1: - version "10.9.2" - resolved "https://registry.yarnpkg.com/jss-plugin-props-sort/-/jss-plugin-props-sort-10.9.2.tgz#645f6c8f179309667b3e6212f66b59a32fb3f01f" - integrity sha512-AP1AyUTbi2szylgr+O0OB7gkIxEGzySLITZ2GpsaoX72YMCGI2jYAc+WUhPfvUnZYiauF4zTnN4V4TGuvFjJlw== + version "10.10.0" + resolved "https://registry.npmjs.org/jss-plugin-props-sort/-/jss-plugin-props-sort-10.10.0.tgz" + integrity sha512-5VNJvQJbnq/vRfje6uZLe/FyaOpzP/IH1LP+0fr88QamVrGJa0hpRRyAa0ea4U/3LcorJfBFVyC4yN2QC73lJg== dependencies: "@babel/runtime" "^7.3.1" - jss "10.9.2" + jss "10.10.0" jss-plugin-rule-value-function@^10.5.1: - version "10.9.2" - resolved "https://registry.yarnpkg.com/jss-plugin-rule-value-function/-/jss-plugin-rule-value-function-10.9.2.tgz#9afe07596e477123cbf11120776be6a64494541f" - integrity sha512-vf5ms8zvLFMub6swbNxvzsurHfUZ5Shy5aJB2gIpY6WNA3uLinEcxYyraQXItRHi5ivXGqYciFDRM2ZoVoRZ4Q== + version "10.10.0" + resolved "https://registry.npmjs.org/jss-plugin-rule-value-function/-/jss-plugin-rule-value-function-10.10.0.tgz" + integrity sha512-uEFJFgaCtkXeIPgki8ICw3Y7VMkL9GEan6SqmT9tqpwM+/t+hxfMUdU4wQ0MtOiMNWhwnckBV0IebrKcZM9C0g== dependencies: "@babel/runtime" "^7.3.1" - jss "10.9.2" + jss "10.10.0" tiny-warning "^1.0.2" jss-plugin-vendor-prefixer@^10.5.1: - version "10.9.2" - resolved "https://registry.yarnpkg.com/jss-plugin-vendor-prefixer/-/jss-plugin-vendor-prefixer-10.9.2.tgz#410a0f3b9f8dbbfba58f4d329134df4849aa1237" - integrity sha512-SxcEoH+Rttf9fEv6KkiPzLdXRmI6waOTcMkbbEFgdZLDYNIP9UKNHFy6thhbRKqv0XMQZdrEsbDyV464zE/dUA== + version "10.10.0" + resolved "https://registry.npmjs.org/jss-plugin-vendor-prefixer/-/jss-plugin-vendor-prefixer-10.10.0.tgz" + integrity sha512-UY/41WumgjW8r1qMCO8l1ARg7NHnfRVWRhZ2E2m0DMYsr2DD91qIXLyNhiX83hHswR7Wm4D+oDYNC1zWCJWtqg== dependencies: "@babel/runtime" "^7.3.1" css-vendor "^2.0.8" - jss "10.9.2" + jss "10.10.0" jss-rtl@^0.3.0: version "0.3.0" - resolved "https://registry.yarnpkg.com/jss-rtl/-/jss-rtl-0.3.0.tgz#386961615956f9655bd5e9ec7e9d08bef223e4af" + resolved "https://registry.npmjs.org/jss-rtl/-/jss-rtl-0.3.0.tgz" integrity sha512-rg9jJmP1bAyhNOAp+BDZgOP/lMm4+oQ76qGueupDQ68Wq+G+6SGvCZvhIEg8OHSONRWOwFT6skCI+APGi8DgmA== dependencies: rtl-css-js "^1.13.1" -jss@10.9.2, jss@^10.3.0, jss@^10.5.1: - version "10.9.2" - resolved "https://registry.yarnpkg.com/jss/-/jss-10.9.2.tgz#9379be1f195ef98011dfd31f9448251bd61b95a9" - integrity sha512-b8G6rWpYLR4teTUbGd4I4EsnWjg7MN0Q5bSsjKhVkJVjhQDy2KzkbD2AW3TuT0RYZVmZZHKIrXDn6kjU14qkUg== +jss@^10.0.0, jss@^10.3.0, jss@^10.5.1, jss@10.10.0: + version "10.10.0" + resolved "https://registry.npmjs.org/jss/-/jss-10.10.0.tgz" + integrity sha512-cqsOTS7jqPsPMjtKYDUpdFC0AbhYFLTcuGRqymgmdJIeQ8cH7+AgX7YSgQy79wXloZq2VvATYxUOUQEvS1V/Zw== dependencies: "@babel/runtime" "^7.3.1" csstype "^3.0.2" @@ -7172,7 +7231,7 @@ jss@10.9.2, jss@^10.3.0, jss@^10.5.1: juice@^8.0.0: version "8.1.0" - resolved "https://registry.yarnpkg.com/juice/-/juice-8.1.0.tgz#4ea23362522fe06418229943237ee3751a4fca70" + resolved "https://registry.npmjs.org/juice/-/juice-8.1.0.tgz" integrity sha512-FLzurJrx5Iv1e7CfBSZH68dC04EEvXvvVvPYB7Vx1WAuhCp1ZPIMtqxc+WTWxVkpTIC2Ach/GAv0rQbtGf6YMA== dependencies: cheerio "1.0.0-rc.10" @@ -7183,19 +7242,19 @@ juice@^8.0.0: jwt-decode@^3.1.2: version "3.1.2" - resolved "https://registry.yarnpkg.com/jwt-decode/-/jwt-decode-3.1.2.tgz#3fb319f3675a2df0c2895c8f5e9fa4b67b04ed59" + resolved "https://registry.npmjs.org/jwt-decode/-/jwt-decode-3.1.2.tgz" integrity sha512-UfpWE/VZn0iP50d8cz9NrZLM9lSWhcJ+0Gt/nm4by88UL+J1SiKN8/5dkjMmbEzwL2CAe+67GsegCbIKtbp75A== karma-chrome-launcher@~3.1.0: version "3.1.1" - resolved "https://registry.yarnpkg.com/karma-chrome-launcher/-/karma-chrome-launcher-3.1.1.tgz#baca9cc071b1562a1db241827257bfe5cab597ea" + resolved "https://registry.npmjs.org/karma-chrome-launcher/-/karma-chrome-launcher-3.1.1.tgz" integrity sha512-hsIglcq1vtboGPAN+DGCISCFOxW+ZVnIqhDQcCMqqCp+4dmJ0Qpq5QAjkbA0X2L9Mi6OBkHi2Srrbmm7pUKkzQ== dependencies: which "^1.2.1" karma-coverage-istanbul-reporter@~3.0.2: version "3.0.3" - resolved "https://registry.yarnpkg.com/karma-coverage-istanbul-reporter/-/karma-coverage-istanbul-reporter-3.0.3.tgz#f3b5303553aadc8e681d40d360dfdc19bc7e9fe9" + resolved "https://registry.npmjs.org/karma-coverage-istanbul-reporter/-/karma-coverage-istanbul-reporter-3.0.3.tgz" integrity sha512-wE4VFhG/QZv2Y4CdAYWDbMmcAHeS926ZIji4z+FkB2aF/EposRb6DP6G5ncT/wXhqUfAb/d7kZrNKPonbvsATw== dependencies: istanbul-lib-coverage "^3.0.0" @@ -7206,19 +7265,19 @@ karma-coverage-istanbul-reporter@~3.0.2: karma-jasmine-html-reporter@^1.5.0: version "1.7.0" - resolved "https://registry.yarnpkg.com/karma-jasmine-html-reporter/-/karma-jasmine-html-reporter-1.7.0.tgz#52c489a74d760934a1089bfa5ea4a8fcb84cc28b" + resolved "https://registry.npmjs.org/karma-jasmine-html-reporter/-/karma-jasmine-html-reporter-1.7.0.tgz" integrity sha512-pzum1TL7j90DTE86eFt48/s12hqwQuiD+e5aXx2Dc9wDEn2LfGq6RoAxEZZjFiN0RDSCOnosEKRZWxbQ+iMpQQ== -karma-jasmine@~4.0.0: +karma-jasmine@>=1.1, karma-jasmine@~4.0.0: version "4.0.2" - resolved "https://registry.yarnpkg.com/karma-jasmine/-/karma-jasmine-4.0.2.tgz#386db2a3e1acc0af5265c711f673f78f1e4938de" + resolved "https://registry.npmjs.org/karma-jasmine/-/karma-jasmine-4.0.2.tgz" integrity sha512-ggi84RMNQffSDmWSyyt4zxzh2CQGwsxvYYsprgyR1j8ikzIduEdOlcLvXjZGwXG/0j41KUXOWsUCBfbEHPWP9g== dependencies: jasmine-core "^3.6.0" karma-mocha-reporter@2.2.5: version "2.2.5" - resolved "https://registry.yarnpkg.com/karma-mocha-reporter/-/karma-mocha-reporter-2.2.5.tgz#15120095e8ed819186e47a0b012f3cd741895560" + resolved "https://registry.npmjs.org/karma-mocha-reporter/-/karma-mocha-reporter-2.2.5.tgz" integrity sha512-Hr6nhkIp0GIJJrvzY8JFeHpQZNseuIakGac4bpw8K1+5F0tLb6l7uvXRa8mt2Z+NVwYgCct4QAfp2R2QP6o00w== dependencies: chalk "^2.1.0" @@ -7227,14 +7286,14 @@ karma-mocha-reporter@2.2.5: karma-source-map-support@1.4.0: version "1.4.0" - resolved "https://registry.yarnpkg.com/karma-source-map-support/-/karma-source-map-support-1.4.0.tgz#58526ceccf7e8730e56effd97a4de8d712ac0d6b" + resolved "https://registry.npmjs.org/karma-source-map-support/-/karma-source-map-support-1.4.0.tgz" integrity sha512-RsBECncGO17KAoJCYXjv+ckIz+Ii9NCi+9enk+rq6XC81ezYkb4/RHE6CTXdA7IOJqoF3wcaLfVG0CPmE5ca6A== dependencies: source-map-support "^0.5.5" -karma@^6.3.14: +karma@*, karma@^6.3.0, karma@^6.3.14, karma@>=0.13, karma@>=0.9: version "6.4.1" - resolved "https://registry.yarnpkg.com/karma/-/karma-6.4.1.tgz#f2253716dd3a41aaa813fa9f54b6ee047e1127d9" + resolved "https://registry.npmjs.org/karma/-/karma-6.4.1.tgz" integrity sha512-Cj57NKOskK7wtFWSlMvZf459iX+kpYIPXmkNUzP2WAFcA7nhr/ALn5R7sw3w+1udFDcpMx/tuB8d5amgm3ijaA== dependencies: "@colors/colors" "1.5.0" @@ -7264,39 +7323,47 @@ karma@^6.3.14: kind-of@^6.0.2: version "6.0.3" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" + resolved "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz" integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== klaro@^0.7.18: version "0.7.18" - resolved "https://registry.yarnpkg.com/klaro/-/klaro-0.7.18.tgz#fef3a05fcd656451b941e11459f37d6c336e84c0" + resolved "https://registry.npmjs.org/klaro/-/klaro-0.7.18.tgz" integrity sha512-Q5nehkGeZuFerisW4oeeB1ax6dHDszWckR70EcxKvhFiJQ61CM0WBSo20yLbdvz8N9MFsOFu4RNCO9JsbkCxgQ== kleur@^3.0.3: version "3.0.3" - resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" + resolved "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz" integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== klona@^2.0.4, klona@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/klona/-/klona-2.0.5.tgz#d166574d90076395d9963aa7a928fabb8d76afbc" - integrity sha512-pJiBpiXMbt7dkzXe8Ghj/u4FfXOOa98fPW+bihOJ4SjnoijweJrNThJfd3ifXpXhREjpoF2mZVH1GfS9LV3kHQ== + version "2.0.6" + resolved "https://registry.npmjs.org/klona/-/klona-2.0.6.tgz" + integrity sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA== + +launch-editor@^2.6.0: + version "2.6.0" + resolved "https://registry.npmjs.org/launch-editor/-/launch-editor-2.6.0.tgz" + integrity sha512-JpDCcQnyAAzZZaZ7vEiSqL690w7dAEyLao+KC96zBplnYbJS7TYNjvM3M7y3dGz+v7aIsJk3hllWuc0kWAjyRQ== + dependencies: + picocolors "^1.0.0" + shell-quote "^1.7.3" lazy-ass@^1.6.0: version "1.6.0" - resolved "https://registry.yarnpkg.com/lazy-ass/-/lazy-ass-1.6.0.tgz#7999655e8646c17f089fdd187d150d3324d54513" + resolved "https://registry.npmjs.org/lazy-ass/-/lazy-ass-1.6.0.tgz" integrity sha512-cc8oEVoctTvsFZ/Oje/kGnHbpWHYBe8IAJe4C0QNc3t8uM/0Y8+erSz/7Y1ALuXTEZTMvxXwO6YbX1ey3ujiZw== less-loader@10.2.0: version "10.2.0" - resolved "https://registry.yarnpkg.com/less-loader/-/less-loader-10.2.0.tgz#97286d8797dc3dc05b1d16b0ecec5f968bdd4e32" + resolved "https://registry.npmjs.org/less-loader/-/less-loader-10.2.0.tgz" integrity sha512-AV5KHWvCezW27GT90WATaDnfXBv99llDbtaj4bshq6DvAihMdNjaPDcUMa6EXKLRF+P2opFenJp89BXg91XLYg== dependencies: klona "^2.0.4" -less@4.1.2: +"less@^3.5.0 || ^4.0.0", less@4.1.2: version "4.1.2" - resolved "https://registry.yarnpkg.com/less/-/less-4.1.2.tgz#6099ee584999750c2624b65f80145f8674e4b4b0" + resolved "https://registry.npmjs.org/less/-/less-4.1.2.tgz" integrity sha512-EoQp/Et7OSOVu0aJknJOtlXZsnr8XE8KwuzTHOLeVSEx8pVWUICc8Q0VYRHgzyjX78nMEyC/oztWFbgyhtNfDA== dependencies: copy-anything "^2.0.1" @@ -7313,7 +7380,7 @@ less@4.1.2: levn@^0.4.1: version "0.4.1" - resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" + resolved "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz" integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== dependencies: prelude-ls "^1.2.1" @@ -7321,7 +7388,7 @@ levn@^0.4.1: levn@~0.3.0: version "0.3.0" - resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" + resolved "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz" integrity sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA== dependencies: prelude-ls "~1.1.2" @@ -7329,31 +7396,36 @@ levn@~0.3.0: license-webpack-plugin@4.0.2: version "4.0.2" - resolved "https://registry.yarnpkg.com/license-webpack-plugin/-/license-webpack-plugin-4.0.2.tgz#1e18442ed20b754b82f1adeff42249b81d11aec6" + resolved "https://registry.npmjs.org/license-webpack-plugin/-/license-webpack-plugin-4.0.2.tgz" integrity sha512-771TFWFD70G1wLTC4oU2Cw4qvtmNrIw+wRvBtn+okgHl7slJVi7zfNcdmqDL72BojM30VNJ2UHylr1o77U37Jw== dependencies: webpack-sources "^3.0.0" limiter@^1.0.5: version "1.1.5" - resolved "https://registry.yarnpkg.com/limiter/-/limiter-1.1.5.tgz#8f92a25b3b16c6131293a0cc834b4a838a2aa7c2" + resolved "https://registry.npmjs.org/limiter/-/limiter-1.1.5.tgz" integrity sha512-FWWMIEOxz3GwUI4Ts/IvgVy6LPvoMPgjMdQ185nN6psJyBJ4yOpzqm695/h5umdLJg2vW3GR5iG11MAkR2AzJA== lines-and-columns@^1.1.6: version "1.2.4" - resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" + resolved "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz" integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== +lines-and-columns@~2.0.3: + version "2.0.3" + resolved "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-2.0.3.tgz" + integrity sha512-cNOjgCnLB+FnvWWtyRTzmB3POJ+cXxTA81LoW7u8JdmhfXzriropYwpjShnz1QLLWsQwY7nIxoDmcPTwphDK9w== + linkify-it@^4.0.1: version "4.0.1" - resolved "https://registry.yarnpkg.com/linkify-it/-/linkify-it-4.0.1.tgz#01f1d5e508190d06669982ba31a7d9f56a5751ec" + resolved "https://registry.npmjs.org/linkify-it/-/linkify-it-4.0.1.tgz" integrity sha512-C7bfi1UZmoj8+PQx22XyeXCuBlokoyWQL5pWSP+EI6nzRylyThouddufc2c1NDIcP9k5agmN9fLpA7VNJfIiqw== dependencies: uc.micro "^1.0.1" listr2@^3.8.3: version "3.14.0" - resolved "https://registry.yarnpkg.com/listr2/-/listr2-3.14.0.tgz#23101cc62e1375fd5836b248276d1d2b51fdbe9e" + resolved "https://registry.npmjs.org/listr2/-/listr2-3.14.0.tgz" integrity sha512-TyWI8G99GX9GjE54cJ+RrNMcIFBfwMPxc3XTFiAYGN4s10hWROGtOg7+O6u6LE3mNkyld7RSLE6nrKBvTfcs3g== dependencies: cli-truncate "^2.1.0" @@ -7367,26 +7439,26 @@ listr2@^3.8.3: loader-runner@^4.2.0: version "4.3.0" - resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-4.3.0.tgz#c1b4a163b99f614830353b16755e7149ac2314e1" + resolved "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz" integrity sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg== -loader-utils@3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-3.2.1.tgz#4fb104b599daafd82ef3e1a41fb9265f87e1f576" - integrity sha512-ZvFw1KWS3GVyYBYb7qkmRM/WwL2TQQBxgCK62rlvm4WpVQ23Nb4tYjApUlfjrEGvOs7KHEsmyUn75OHZrJMWPw== - loader-utils@^2.0.0: version "2.0.4" - resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.4.tgz#8b5cb38b5c34a9a018ee1fc0e6a066d1dfcc528c" + resolved "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz" integrity sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw== dependencies: big.js "^5.2.2" emojis-list "^3.0.0" json5 "^2.1.2" +loader-utils@3.2.1: + version "3.2.1" + resolved "https://registry.npmjs.org/loader-utils/-/loader-utils-3.2.1.tgz" + integrity sha512-ZvFw1KWS3GVyYBYb7qkmRM/WwL2TQQBxgCK62rlvm4WpVQ23Nb4tYjApUlfjrEGvOs7KHEsmyUn75OHZrJMWPw== + localtunnel@^2.0.1: version "2.0.2" - resolved "https://registry.yarnpkg.com/localtunnel/-/localtunnel-2.0.2.tgz#528d50087151c4790f89c2db374fe7b0a48501f0" + resolved "https://registry.npmjs.org/localtunnel/-/localtunnel-2.0.2.tgz" integrity sha512-n418Cn5ynvJd7m/N1d9WVJISLJF/ellZnfsLnx8WBWGzxv/ntNcFkJ1o6se5quUhCplfLGBNL5tYHiq5WF3Nug== dependencies: axios "0.21.4" @@ -7396,53 +7468,53 @@ localtunnel@^2.0.1: locate-path@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" + resolved "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz" integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== dependencies: p-locate "^4.1.0" locate-path@^6.0.0: version "6.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" + resolved "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz" integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== dependencies: p-locate "^5.0.0" lodash.debounce@^4.0.8: version "4.0.8" - resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" + resolved "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz" integrity sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow== lodash.isfinite@^3.3.2: version "3.3.2" - resolved "https://registry.yarnpkg.com/lodash.isfinite/-/lodash.isfinite-3.3.2.tgz#fb89b65a9a80281833f0b7478b3a5104f898ebb3" + resolved "https://registry.npmjs.org/lodash.isfinite/-/lodash.isfinite-3.3.2.tgz" integrity sha512-7FGG40uhC8Mm633uKW1r58aElFlBlxCrg9JfSi3P6aYiWmfiWF0PgMd86ZUsxE5GwWPdHoS2+48bwTh2VPkIQA== lodash.merge@^4.6.2: version "4.6.2" - resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" + resolved "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz" integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== lodash.once@^4.1.1: version "4.1.1" - resolved "https://registry.yarnpkg.com/lodash.once/-/lodash.once-4.1.1.tgz#0dd3971213c7c56df880977d504c88fb471a97ac" + resolved "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz" integrity sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg== lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.7.0: version "4.17.21" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== log-symbols@^2.1.0: version "2.2.0" - resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-2.2.0.tgz#5740e1c5d6f0dfda4ad9323b5332107ef6b4c40a" + resolved "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz" integrity sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg== dependencies: chalk "^2.0.1" log-symbols@^4.0.0, log-symbols@^4.1.0: version "4.1.0" - resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" + resolved "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz" integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== dependencies: chalk "^4.1.0" @@ -7450,7 +7522,7 @@ log-symbols@^4.0.0, log-symbols@^4.1.0: log-update@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/log-update/-/log-update-4.0.0.tgz#589ecd352471f2a1c0c570287543a64dfd20e0a1" + resolved "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz" integrity sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg== dependencies: ansi-escapes "^4.3.0" @@ -7459,52 +7531,59 @@ log-update@^4.0.0: wrap-ansi "^6.2.0" log4js@^6.4.1: - version "6.7.1" - resolved "https://registry.yarnpkg.com/log4js/-/log4js-6.7.1.tgz#06e12b1ac915dd1067146ffad8215f666f7d2c51" - integrity sha512-lzbd0Eq1HRdWM2abSD7mk6YIVY0AogGJzb/z+lqzRk+8+XJP+M6L1MS5FUSc3jjGru4dbKjEMJmqlsoYYpuivQ== + version "6.9.1" + resolved "https://registry.npmjs.org/log4js/-/log4js-6.9.1.tgz" + integrity sha512-1somDdy9sChrr9/f4UlzhdaGfDR2c/SaD2a4T7qEkG4jTS57/B3qmnjLYePwQ8cqWnUHZI0iAKxMBpCZICiZ2g== dependencies: date-format "^4.0.14" debug "^4.3.4" flatted "^3.2.7" rfdc "^1.3.0" - streamroller "^3.1.3" + streamroller "^3.1.5" loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.4.0: version "1.4.0" - resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" + resolved "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz" integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== dependencies: js-tokens "^3.0.0 || ^4.0.0" +lru-cache@^5.1.1: + version "5.1.1" + resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz" + integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== + dependencies: + yallist "^3.0.2" + lru-cache@^6.0.0: version "6.0.0" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" + resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz" integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== dependencies: yallist "^4.0.0" lru-cache@^7.14.1, lru-cache@^7.7.1: - version "7.14.1" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-7.14.1.tgz#8da8d2f5f59827edb388e63e459ac23d6d408fea" - integrity sha512-ysxwsnTKdAx96aTRdhDOCQfDgbHnt8SK0KY8SEjO0wHinhWOFTESbjVCMPbU1uGXg/ch4lifqx0wfjOawU2+WA== - -magic-string@0.25.7: - version "0.25.7" - resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.25.7.tgz#3f497d6fd34c669c6798dcb821f2ef31f5445051" - integrity sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA== - dependencies: - sourcemap-codec "^1.4.4" + version "7.18.3" + resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz" + integrity sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA== magic-string@^0.26.0: version "0.26.7" - resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.26.7.tgz#caf7daf61b34e9982f8228c4527474dac8981d6f" + resolved "https://registry.npmjs.org/magic-string/-/magic-string-0.26.7.tgz" integrity sha512-hX9XH3ziStPoPhJxLq1syWuZMxbDvGNbVchfrdCtanC7D13888bMFow61x8axrx+GfHLtVeAx2kxL7tTGRl+Ow== dependencies: sourcemap-codec "^1.4.8" +magic-string@0.25.7: + version "0.25.7" + resolved "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz" + integrity sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA== + dependencies: + sourcemap-codec "^1.4.4" + make-dir@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5" + resolved "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz" integrity sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA== dependencies: pify "^4.0.1" @@ -7512,19 +7591,19 @@ make-dir@^2.1.0: make-dir@^3.0.0, make-dir@^3.0.2, make-dir@^3.1.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" + resolved "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz" integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== dependencies: semver "^6.0.0" make-error@^1.1.1: version "1.3.6" - resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" + resolved "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz" integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== make-fetch-happen@^10.0.1: version "10.2.1" - resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-10.2.1.tgz#f5e3835c5e9817b617f2770870d9492d28678164" + resolved "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-10.2.1.tgz" integrity sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w== dependencies: agentkeepalive "^4.2.1" @@ -7546,7 +7625,7 @@ make-fetch-happen@^10.0.1: make-fetch-happen@^9.1.0: version "9.1.0" - resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-9.1.0.tgz#53085a09e7971433e6765f7971bf63f4e05cb968" + resolved "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-9.1.0.tgz" integrity sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg== dependencies: agentkeepalive "^4.1.3" @@ -7567,9 +7646,9 @@ make-fetch-happen@^9.1.0: ssri "^8.0.0" manifesto.js@^4.2.0: - version "4.2.16" - resolved "https://registry.yarnpkg.com/manifesto.js/-/manifesto.js-4.2.16.tgz#084adf6662ac2b4df41a44c29939442acc6b08ae" - integrity sha512-eDwA1nv2rF0VlsHgXV+/La8XunOl0rYxBiLWDUhvNLHpqFctmjJ2PAMpwnq+SptzEL4HKHXsqcKl4KVBljFZhA== + version "4.2.17" + resolved "https://registry.npmjs.org/manifesto.js/-/manifesto.js-4.2.17.tgz" + integrity sha512-UjctsJ2PkgwGDUQ/ZzvyObXJO/yiFYwiz49xrzkayi9fhrwUVC3Vc0aQyGm723BZTl5nKYJQ8YdEhJRp08xOtA== dependencies: "@edsilv/http-status-codes" "^1.0.3" "@iiif/vocabulary" "^1.0.26" @@ -7578,7 +7657,7 @@ manifesto.js@^4.2.0: markdown-it-mathjax3@^4.3.1: version "4.3.2" - resolved "https://registry.yarnpkg.com/markdown-it-mathjax3/-/markdown-it-mathjax3-4.3.2.tgz#1e34aa86f8560b283fd283008334adc2d6b05a37" + resolved "https://registry.npmjs.org/markdown-it-mathjax3/-/markdown-it-mathjax3-4.3.2.tgz" integrity sha512-TX3GW5NjmupgFtMJGRauioMbbkGsOXAAt1DZ/rzzYmTHqzkO1rNAdiMD4NiruurToPApn2kYy76x02QN26qr2w== dependencies: juice "^8.0.0" @@ -7586,7 +7665,7 @@ markdown-it-mathjax3@^4.3.1: markdown-it@^13.0.1: version "13.0.1" - resolved "https://registry.yarnpkg.com/markdown-it/-/markdown-it-13.0.1.tgz#c6ecc431cacf1a5da531423fc6a42807814af430" + resolved "https://registry.npmjs.org/markdown-it/-/markdown-it-13.0.1.tgz" integrity sha512-lTlxriVoy2criHP0JKRhO2VDG9c2ypWCsT237eDiLqi09rmbKoUetyGHq2uOIRoRS//kfoJckS0eUzzkDR+k2Q== dependencies: argparse "^2.0.1" @@ -7597,7 +7676,7 @@ markdown-it@^13.0.1: mathjax-full@^3.2.0: version "3.2.2" - resolved "https://registry.yarnpkg.com/mathjax-full/-/mathjax-full-3.2.2.tgz#43f02e55219db393030985d2b6537ceae82f1fa7" + resolved "https://registry.npmjs.org/mathjax-full/-/mathjax-full-3.2.2.tgz" integrity sha512-+LfG9Fik+OuI8SLwsiR02IVdjcnRCy5MufYLi0C3TdMT56L/pjB0alMVGgoWJF8pN9Rc7FESycZB9BMNWIid5w== dependencies: esm "^3.2.25" @@ -7607,7 +7686,7 @@ mathjax-full@^3.2.0: md5@^2.2.1: version "2.3.0" - resolved "https://registry.yarnpkg.com/md5/-/md5-2.3.0.tgz#c3da9a6aae3a30b46b7b0c349b87b110dc3bda4f" + resolved "https://registry.npmjs.org/md5/-/md5-2.3.0.tgz" integrity sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g== dependencies: charenc "0.0.2" @@ -7616,144 +7695,149 @@ md5@^2.2.1: mdurl@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/mdurl/-/mdurl-1.0.1.tgz#fe85b2ec75a59037f2adfec100fd6c601761152e" + resolved "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz" integrity sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g== media-typer@0.3.0: version "0.3.0" - resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" + resolved "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz" integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== memfs@^3.2.2, memfs@^3.4.3: - version "3.4.12" - resolved "https://registry.yarnpkg.com/memfs/-/memfs-3.4.12.tgz#d00f8ad8dab132dc277c659dc85bfd14b07d03bd" - integrity sha512-BcjuQn6vfqP+k100e0E9m61Hyqa//Brp+I3f0OBmN0ATHlFA8vx3Lt8z57R3u2bPqe3WGDBC+nF72fTH7isyEw== + version "3.5.0" + resolved "https://registry.npmjs.org/memfs/-/memfs-3.5.0.tgz" + integrity sha512-yK6o8xVJlQerz57kvPROwTMgx5WtGwC2ZxDtOUsnGl49rHjYkfQoPNZPCKH73VdLE1BwBu/+Fx/NL8NYMUw2aA== dependencies: fs-monkey "^1.0.3" -"memoize-one@>=3.1.1 <6", memoize-one@^5.1.1: +memoize-one@^5.1.1, "memoize-one@>=3.1.1 <6": version "5.2.1" - resolved "https://registry.yarnpkg.com/memoize-one/-/memoize-one-5.2.1.tgz#8337aa3c4335581839ec01c3d594090cebe8f00e" + resolved "https://registry.npmjs.org/memoize-one/-/memoize-one-5.2.1.tgz" integrity sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q== mensch@^0.3.4: version "0.3.4" - resolved "https://registry.yarnpkg.com/mensch/-/mensch-0.3.4.tgz#770f91b46cb16ea5b204ee735768c3f0c491fecd" + resolved "https://registry.npmjs.org/mensch/-/mensch-0.3.4.tgz" integrity sha512-IAeFvcOnV9V0Yk+bFhYR07O3yNina9ANIN5MoXBKYJ/RLYPurd2d0yw14MDhpr9/momp0WofT1bPUh3hkzdi/g== merge-descriptors@1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" + resolved "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz" integrity sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w== merge-stream@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" + resolved "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz" integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== merge2@^1.3.0, merge2@^1.4.1: version "1.4.1" - resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" + resolved "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz" integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== methods@~1.1.2: version "1.1.2" - resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" + resolved "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz" integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== mhchemparser@^4.1.0: version "4.1.1" - resolved "https://registry.yarnpkg.com/mhchemparser/-/mhchemparser-4.1.1.tgz#a2142fdab37a02ec8d1b48a445059287790becd5" + resolved "https://registry.npmjs.org/mhchemparser/-/mhchemparser-4.1.1.tgz" integrity sha512-R75CUN6O6e1t8bgailrF1qPq+HhVeFTM3XQ0uzI+mXTybmphy3b6h4NbLOYhemViQ3lUs+6CKRkC3Ws1TlYREA== micromatch@^4.0.2, micromatch@^4.0.4: version "4.0.5" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" + resolved "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz" integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== dependencies: braces "^3.0.2" picomatch "^2.3.1" -mime-db@1.52.0, "mime-db@>= 1.43.0 < 2": +"mime-db@>= 1.43.0 < 2", mime-db@1.52.0: version "1.52.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" + resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz" integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== mime-types@^2.1.12, mime-types@^2.1.27, mime-types@^2.1.31, mime-types@~2.1.17, mime-types@~2.1.19, mime-types@~2.1.24, mime-types@~2.1.34: version "2.1.35" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" + resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz" integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== dependencies: mime-db "1.52.0" -mime@1.4.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/mime/-/mime-1.4.1.tgz#121f9ebc49e3766f311a76e1fa1c8003c4b03aa6" - integrity sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ== - -mime@1.6.0, mime@^1.4.1: +mime@^1.4.1, mime@1.6.0: version "1.6.0" - resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" + resolved "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz" integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== -mime@^2.4.6, mime@^2.5.2: +mime@^2.4.6: version "2.6.0" - resolved "https://registry.yarnpkg.com/mime/-/mime-2.6.0.tgz#a2a682a95cd4d0cb1d6257e28f83da7e35800367" + resolved "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz" integrity sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg== +mime@^2.5.2: + version "2.6.0" + resolved "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz" + integrity sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg== + +mime@1.4.1: + version "1.4.1" + resolved "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz" + integrity sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ== + mimic-fn@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + resolved "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz" integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== mini-css-extract-plugin@2.5.3: version "2.5.3" - resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-2.5.3.tgz#c5c79f9b22ce9b4f164e9492267358dbe35376d9" + resolved "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.5.3.tgz" integrity sha512-YseMB8cs8U/KCaAGQoqYmfUuhhGW0a9p9XvWXrxVOkE3/IiISTLw4ALNt7JR5B2eYauFM+PQGSbXMDmVbR7Tfw== dependencies: schema-utils "^4.0.0" minimalistic-assert@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" + resolved "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz" integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== -minimatch@3.0.5: - version "3.0.5" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.5.tgz#4da8f1290ee0f0f8e83d60ca69f8f134068604a3" - integrity sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw== - dependencies: - brace-expansion "^1.1.7" - -minimatch@^3.0.2, minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: +minimatch@^3.0.2, minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.2: version "3.1.2" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== dependencies: brace-expansion "^1.1.7" minimatch@^5.0.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.1.tgz#6c9dffcf9927ff2a31e74b5af11adf8b9604b022" - integrity sha512-362NP+zlprccbEt/SkxKfRMHnNY85V74mVnpUpNyr3F35covl09Kec7/sEFLt3RA4oXmewtoaanoIf67SE5Y5g== + version "5.1.6" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz" + integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g== dependencies: brace-expansion "^2.0.1" -minimist@^1.2.0, minimist@^1.2.5, minimist@^1.2.6: - version "1.2.7" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.7.tgz#daa1c4d91f507390437c6a8bc01078e7000c4d18" - integrity sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g== +minimatch@3.0.5: + version "3.0.5" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.0.5.tgz" + integrity sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw== + dependencies: + brace-expansion "^1.1.7" + +minimist@^1.2.0, minimist@^1.2.6: + version "1.2.8" + resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz" + integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== minipass-collect@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/minipass-collect/-/minipass-collect-1.0.2.tgz#22b813bf745dc6edba2576b940022ad6edc8c617" + resolved "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz" integrity sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA== dependencies: minipass "^3.0.0" minipass-fetch@^1.3.2, minipass-fetch@^1.4.1: version "1.4.1" - resolved "https://registry.yarnpkg.com/minipass-fetch/-/minipass-fetch-1.4.1.tgz#d75e0091daac1b0ffd7e9d41629faff7d0c1f1b6" + resolved "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-1.4.1.tgz" integrity sha512-CGH1eblLq26Y15+Azk7ey4xh0J/XfJfrCox5LDJiKqI2Q2iwOLOKrlmIaODiSQS8d18jalF6y2K2ePUm0CmShw== dependencies: minipass "^3.1.0" @@ -7764,7 +7848,7 @@ minipass-fetch@^1.3.2, minipass-fetch@^1.4.1: minipass-fetch@^2.0.3: version "2.1.2" - resolved "https://registry.yarnpkg.com/minipass-fetch/-/minipass-fetch-2.1.2.tgz#95560b50c472d81a3bc76f20ede80eaed76d8add" + resolved "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-2.1.2.tgz" integrity sha512-LT49Zi2/WMROHYoqGgdlQIZh8mLPZmOrN2NdJjMXxYe4nkN6FUyuPuOAOedNJDrx0IRGg9+4guZewtp8hE6TxA== dependencies: minipass "^3.1.6" @@ -7775,14 +7859,14 @@ minipass-fetch@^2.0.3: minipass-flush@^1.0.5: version "1.0.5" - resolved "https://registry.yarnpkg.com/minipass-flush/-/minipass-flush-1.0.5.tgz#82e7135d7e89a50ffe64610a787953c4c4cbb373" + resolved "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz" integrity sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw== dependencies: minipass "^3.0.0" minipass-json-stream@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/minipass-json-stream/-/minipass-json-stream-1.0.1.tgz#7edbb92588fbfc2ff1db2fc10397acb7b6b44aa7" + resolved "https://registry.npmjs.org/minipass-json-stream/-/minipass-json-stream-1.0.1.tgz" integrity sha512-ODqY18UZt/I8k+b7rl2AENgbWE8IDYam+undIJONvigAz8KR5GWblsFTEfQs0WODsjbSXWlm+JHEv8Gr6Tfdbg== dependencies: jsonparse "^1.3.1" @@ -7790,28 +7874,33 @@ minipass-json-stream@^1.0.1: minipass-pipeline@^1.2.2, minipass-pipeline@^1.2.4: version "1.2.4" - resolved "https://registry.yarnpkg.com/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz#68472f79711c084657c067c5c6ad93cddea8214c" + resolved "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz" integrity sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A== dependencies: minipass "^3.0.0" minipass-sized@^1.0.3: version "1.0.3" - resolved "https://registry.yarnpkg.com/minipass-sized/-/minipass-sized-1.0.3.tgz#70ee5a7c5052070afacfbc22977ea79def353b70" + resolved "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz" integrity sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g== dependencies: minipass "^3.0.0" minipass@^3.0.0, minipass@^3.1.0, minipass@^3.1.1, minipass@^3.1.3, minipass@^3.1.6: version "3.3.6" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.3.6.tgz#7bba384db3a1520d18c9c0e5251c3444e95dd94a" + resolved "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz" integrity sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw== dependencies: yallist "^4.0.0" +minipass@^4.0.0: + version "4.2.7" + resolved "https://registry.npmjs.org/minipass/-/minipass-4.2.7.tgz" + integrity sha512-ScVIgqHcXRMyfflqHmEW0bm8z8rb5McHyOY3ewX9JBgZaR77G7nxq9L/mtV96/QbAAwtbCAHVVLzD1kkyfFQEw== + minizlib@^2.0.0, minizlib@^2.1.1, minizlib@^2.1.2: version "2.1.2" - resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-2.1.2.tgz#e90d3466ba209b932451508a11ce3d3632145931" + resolved "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz" integrity sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg== dependencies: minipass "^3.0.0" @@ -7819,17 +7908,17 @@ minizlib@^2.0.0, minizlib@^2.1.1, minizlib@^2.1.2: mirador-dl-plugin@^0.13.0: version "0.13.0" - resolved "https://registry.yarnpkg.com/mirador-dl-plugin/-/mirador-dl-plugin-0.13.0.tgz#9a6cb0fa3c566a2a1ebe1ad9caa1ff590ff22689" + resolved "https://registry.npmjs.org/mirador-dl-plugin/-/mirador-dl-plugin-0.13.0.tgz" integrity sha512-I/6etIvpTtO1zgjxx2uEUFoyB9NxQ43JWg8CMkKmZqblW7AAeFqRn1/zUlQH7N8KFZft9Rah6D8qxtuNAo9jmA== mirador-share-plugin@^0.11.0: version "0.11.0" - resolved "https://registry.yarnpkg.com/mirador-share-plugin/-/mirador-share-plugin-0.11.0.tgz#13e2f654e38839044382acad42d9329e91a8cd5e" + resolved "https://registry.npmjs.org/mirador-share-plugin/-/mirador-share-plugin-0.11.0.tgz" integrity sha512-fHcdDXyrtfy5pn1zdQNX9BvE5Tjup66eQwyNippE5PMaP8ImUcrFaSL+mStdn+v6agsHcsdRqLhseZ0XWgEuAw== -mirador@^3.3.0: +mirador@^3.0.0-beta.0, mirador@^3.0.0-rc.7, mirador@^3.3.0: version "3.3.0" - resolved "https://registry.yarnpkg.com/mirador/-/mirador-3.3.0.tgz#7a957a1db1a5388b2b8cafab00db4eb9f97557b9" + resolved "https://registry.npmjs.org/mirador/-/mirador-3.3.0.tgz" integrity sha512-BmGfRnWJ45B+vtiAwcFT7n9nKialfejE9UvuUK0NorO37ShArpsKr3yVSD4jQASwSR4DRRpPEG21jOk4WN7H3w== dependencies: "@material-ui/core" "^4.11.0" @@ -7878,29 +7967,36 @@ mirador@^3.3.0: mitt@^1.1.3: version "1.2.0" - resolved "https://registry.yarnpkg.com/mitt/-/mitt-1.2.0.tgz#cb24e6569c806e31bd4e3995787fe38a04fdf90d" + resolved "https://registry.npmjs.org/mitt/-/mitt-1.2.0.tgz" integrity sha512-r6lj77KlwqLhIUku9UWYes7KJtsczvolZkzp8hbaDPPaE24OmWl5s539Mytlj22siEQKosZ26qCBgda2PKwoJw== mj-context-menu@^0.6.1: version "0.6.1" - resolved "https://registry.yarnpkg.com/mj-context-menu/-/mj-context-menu-0.6.1.tgz#a043c5282bf7e1cf3821de07b13525ca6f85aa69" + resolved "https://registry.npmjs.org/mj-context-menu/-/mj-context-menu-0.6.1.tgz" integrity sha512-7NO5s6n10TIV96d4g2uDpG7ZDpIhMh0QNfGdJw/W47JswFcosz457wqz/b5sAKvl12sxINGFCn80NZHKwxQEXA== -mkdirp@^0.5.5, mkdirp@^0.5.6: +mkdirp@^0.5.5: version "0.5.6" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" + resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz" + integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== + dependencies: + minimist "^1.2.6" + +mkdirp@^0.5.6: + version "0.5.6" + resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz" integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== dependencies: minimist "^1.2.6" mkdirp@^1.0.3, mkdirp@^1.0.4: version "1.0.4" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" + resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz" integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== morgan@^1.10.0: version "1.10.0" - resolved "https://registry.yarnpkg.com/morgan/-/morgan-1.10.0.tgz#091778abc1fc47cd3509824653dae1faab6b17d7" + resolved "https://registry.npmjs.org/morgan/-/morgan-1.10.0.tgz" integrity sha512-AbegBVI4sh6El+1gNwvD5YIck7nSA36weD7xvIxG4in80j/UoK8AEGaWnnz8v1GxonMCltmlNs5ZKbGvl9b1XQ== dependencies: basic-auth "~2.0.1" @@ -7911,32 +8007,32 @@ morgan@^1.10.0: mrmime@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/mrmime/-/mrmime-1.0.1.tgz#5f90c825fad4bdd41dc914eff5d1a8cfdaf24f27" + resolved "https://registry.npmjs.org/mrmime/-/mrmime-1.0.1.tgz" integrity sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw== +ms@^2.0.0, ms@^2.1.1, ms@2.1.2: + version "2.1.2" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + ms@2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + resolved "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz" integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== -ms@2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" - integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== - -ms@2.1.3, ms@^2.0.0, ms@^2.1.1: +ms@2.1.3: version "2.1.3" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== multicast-dns-service-types@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz#899f11d9686e5e05cb91b35d5f0e63b773cfc901" + resolved "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz" integrity sha512-cnAsSVxIDsYt0v7HmC0hWZFwwXSh+E6PgCrREDuN/EsjgLwA5XRmlMHhSiDPrt6HxY1gTivEa/Zh7GtODoLevQ== multicast-dns@^6.0.1: version "6.2.3" - resolved "https://registry.yarnpkg.com/multicast-dns/-/multicast-dns-6.2.3.tgz#a0ec7bd9055c4282f790c3c82f4e28db3b31b229" + resolved "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz" integrity sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g== dependencies: dns-packet "^1.3.1" @@ -7944,7 +8040,7 @@ multicast-dns@^6.0.1: multicast-dns@^7.2.5: version "7.2.5" - resolved "https://registry.yarnpkg.com/multicast-dns/-/multicast-dns-7.2.5.tgz#77eb46057f4d7adbd16d9290fa7299f6fa64cced" + resolved "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz" integrity sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg== dependencies: dns-packet "^5.2.2" @@ -7952,92 +8048,92 @@ multicast-dns@^7.2.5: mute-stream@0.0.8: version "0.0.8" - resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" + resolved "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz" integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== nanoid@^3.1.30, nanoid@^3.3.4: - version "3.3.4" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.4.tgz#730b67e3cd09e2deacf03c027c81c9d9dbc5e8ab" - integrity sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw== + version "3.3.6" + resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz" + integrity sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA== natural-compare@^1.4.0: version "1.4.0" - resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + resolved "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz" integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== needle@^2.5.2: version "2.9.1" - resolved "https://registry.yarnpkg.com/needle/-/needle-2.9.1.tgz#22d1dffbe3490c2b83e301f7709b6736cd8f2684" + resolved "https://registry.npmjs.org/needle/-/needle-2.9.1.tgz" integrity sha512-6R9fqJ5Zcmf+uYaFgdIHmLwNldn5HbK8L5ybn7Uz+ylX/rnOsSp1AHcvQSrCaFN+qNM1wpymHqD7mVasEOlHGQ== dependencies: debug "^3.2.6" iconv-lite "^0.4.4" sax "^1.2.4" -negotiator@0.6.3, negotiator@^0.6.2, negotiator@^0.6.3: +negotiator@^0.6.2, negotiator@^0.6.3, negotiator@0.6.3: version "0.6.3" - resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" + resolved "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz" integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== neo-async@^2.6.2: version "2.6.2" - resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" + resolved "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz" integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== ng-mocks@^13.1.1: version "13.5.2" - resolved "https://registry.yarnpkg.com/ng-mocks/-/ng-mocks-13.5.2.tgz#e0d16c4810623b4b096ede31209966e628620d28" + resolved "https://registry.npmjs.org/ng-mocks/-/ng-mocks-13.5.2.tgz" integrity sha512-mn9qkef166cKmg5k1/jY4AlXEGEPx/cdWXKDdSrs/Fett+nLEAx70uD1LJrpQ35PY6k0v6AUd4fbZX5OaoFNRg== ng2-file-upload@1.4.0: version "1.4.0" - resolved "https://registry.yarnpkg.com/ng2-file-upload/-/ng2-file-upload-1.4.0.tgz#8dea28d573234c52af474ad2a4001b335271e5c4" + resolved "https://registry.npmjs.org/ng2-file-upload/-/ng2-file-upload-1.4.0.tgz" integrity sha512-3J/KPU/tyh/ad6TFeUbrxX+SihUj0iOEt2Zsg4EX7mB3GFiQscXOfcUOxCkBtPWWWaqt3azrYbVGzsYa3/7NzQ== dependencies: tslib "^1.9.0" ng2-nouislider@^1.8.3: version "1.8.3" - resolved "https://registry.yarnpkg.com/ng2-nouislider/-/ng2-nouislider-1.8.3.tgz#c9c1ec77b6b5a909f87368ba799914208baa13a6" + resolved "https://registry.npmjs.org/ng2-nouislider/-/ng2-nouislider-1.8.3.tgz" integrity sha512-Vl8tHCcJ/ioJLAs2t6FBC35sZq1P/O5ZdqdFwYxOCOMVbILGWNg+2gWZIjFstvv9pqb/mVvVUYe6qGG/mA/RBQ== ngx-infinite-scroll@^10.0.1: version "10.0.1" - resolved "https://registry.yarnpkg.com/ngx-infinite-scroll/-/ngx-infinite-scroll-10.0.1.tgz#6f51f2f8775a7c50d1dd8bad125d4e748abbe880" + resolved "https://registry.npmjs.org/ngx-infinite-scroll/-/ngx-infinite-scroll-10.0.1.tgz" integrity sha512-7is0eJZ9kJPsaHohRmMhJ/QFHAW9jp9twO5HcHRvFM/Yl/R8QCiokgjwmH0/CR3MuxUanxfHZMfO3PbYTwlBEg== dependencies: "@scarf/scarf" "^1.1.0" opencollective-postinstall "^2.0.2" -ngx-mask@^13.1.7: +ngx-mask@^13.0.0, ngx-mask@^13.1.7: version "13.1.15" - resolved "https://registry.yarnpkg.com/ngx-mask/-/ngx-mask-13.1.15.tgz#1bfd96772f72eabd70ae186335b5e6804789ee23" + resolved "https://registry.npmjs.org/ngx-mask/-/ngx-mask-13.1.15.tgz" integrity sha512-fplyzkFa6lFTzPo/AHaI3TBQxTMdcqQClR9BLLAWTvCyDZkV28fLqWkpIpy0VvPc9ADogFpJJj7R1356mszjag== dependencies: tslib "^2.3.0" ngx-pagination@5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/ngx-pagination/-/ngx-pagination-5.0.0.tgz#a4b4c150a70aef17ccd825e4543e174a974bbd14" + resolved "https://registry.npmjs.org/ngx-pagination/-/ngx-pagination-5.0.0.tgz" integrity sha512-Ur0pTWRe2ZXoJ8impEzo0IZKxY5aEcQfSmL5uBqW1rHI2J6nfzgZAHsSLagKHFGchXq0PkRlDVVMcIaNxYJwvQ== ngx-sortablejs@^11.1.0: version "11.1.0" - resolved "https://registry.yarnpkg.com/ngx-sortablejs/-/ngx-sortablejs-11.1.0.tgz#14e50c48db908c1cb4b37722b28c2d3867c6140a" + resolved "https://registry.npmjs.org/ngx-sortablejs/-/ngx-sortablejs-11.1.0.tgz" integrity sha512-eM4dHwWSmXDcvF5gUmyMMQ0qqcqBXWCSZ9IRpqx4UkBKfo4N7pk/QuYh5io2fXVHWVFDaxW1yhn2FNpqxV6Jqw== dependencies: tslib "^2.0.0" ngx-ui-switch@^13.0.2: version "13.0.2" - resolved "https://registry.yarnpkg.com/ngx-ui-switch/-/ngx-ui-switch-13.0.2.tgz#67aa548c06d0bbaa23f57a8d4bce2b88789aeeb5" + resolved "https://registry.npmjs.org/ngx-ui-switch/-/ngx-ui-switch-13.0.2.tgz" integrity sha512-dhRAQZmrSH8l8VVtce/jD0PIwQjagSYPSln9I6A6gda1HIhvU/M6bqOVJLComWX32aVIBewdJP625wp/S3FdTA== dependencies: tslib "^2.3.0" nice-napi@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/nice-napi/-/nice-napi-1.0.2.tgz#dc0ab5a1eac20ce548802fc5686eaa6bc654927b" + resolved "https://registry.npmjs.org/nice-napi/-/nice-napi-1.0.2.tgz" integrity sha512-px/KnJAJZf5RuBGcfD+Sp2pAKq0ytz8j+1NehvgIGFkvtvFrDM3T8E4x/JJODXK9WZow8RRGrbA9QQ3hs+pDhA== dependencies: node-addon-api "^3.0.0" @@ -8045,29 +8141,29 @@ nice-napi@^1.0.2: node-addon-api@^3.0.0, node-addon-api@^3.2.1: version "3.2.1" - resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-3.2.1.tgz#81325e0a2117789c0128dab65e7e38f07ceba161" + resolved "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.1.tgz" integrity sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A== node-fetch@^2.6.0, node-fetch@^2.6.1: - version "2.6.7" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad" - integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ== + version "2.6.9" + resolved "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.9.tgz" + integrity sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg== dependencies: whatwg-url "^5.0.0" node-forge@^1: version "1.3.1" - resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-1.3.1.tgz#be8da2af243b2417d5f646a770663a92b7e9ded3" + resolved "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz" integrity sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA== node-gyp-build@^4.2.2, node-gyp-build@^4.3.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.5.0.tgz#7a64eefa0b21112f89f58379da128ac177f20e40" - integrity sha512-2iGbaQBV+ITgCz76ZEjmhUKAKVf7xfY1sRl4UiKQspfZMH2h06SyhNsnSVy50cwkFQDGLyif6m/6uFXHkOZ6rg== + version "4.6.0" + resolved "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.6.0.tgz" + integrity sha512-NTZVKn9IylLwUzaKjkas1e4u2DLNcV4rdYagA4PWdPwW87Bi7z+BznyKSRwS/761tV/lzCGXplWsiaMjLqP2zQ== node-gyp@^8.2.0: version "8.4.1" - resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-8.4.1.tgz#3d49308fc31f768180957d6b5746845fbd429937" + resolved "https://registry.npmjs.org/node-gyp/-/node-gyp-8.4.1.tgz" integrity sha512-olTJRgUtAb/hOXG0E93wZDs5YiJlgbXxTwQAFHyNlRsXQnYzUaF2aGgujZbw+hR8aF4ZG/rST57bWMWD16jr9w== dependencies: env-paths "^2.2.0" @@ -8081,15 +8177,15 @@ node-gyp@^8.2.0: tar "^6.1.2" which "^2.0.2" -node-releases@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.6.tgz#8a7088c63a55e493845683ebf3c828d8c51c5503" - integrity sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg== +node-releases@^2.0.8: + version "2.0.10" + resolved "https://registry.npmjs.org/node-releases/-/node-releases-2.0.10.tgz" + integrity sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w== nodemon@^2.0.20: - version "2.0.20" - resolved "https://registry.yarnpkg.com/nodemon/-/nodemon-2.0.20.tgz#e3537de768a492e8d74da5c5813cb0c7486fc701" - integrity sha512-Km2mWHKKY5GzRg6i1j5OxOHQtuvVsgskLfigG25yTtbyfRGn/GNvIbRyOf1PSCKJ2aT/58TiuUsuOU5UToVViw== + version "2.0.22" + resolved "https://registry.npmjs.org/nodemon/-/nodemon-2.0.22.tgz" + integrity sha512-B8YqaKMmyuCO7BowF1Z1/mkPqLk6cs/l63Ojtd6otKjMx47Dq1utxfRxcavH1I7VSaL8n5BUaoutadnsX3AAVQ== dependencies: chokidar "^3.5.2" debug "^3.2.7" @@ -8104,60 +8200,60 @@ nodemon@^2.0.20: nopt@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/nopt/-/nopt-5.0.0.tgz#530942bb58a512fccafe53fe210f13a25355dc88" + resolved "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz" integrity sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ== dependencies: abbrev "1" nopt@~1.0.10: version "1.0.10" - resolved "https://registry.yarnpkg.com/nopt/-/nopt-1.0.10.tgz#6ddd21bd2a31417b92727dd585f8a6f37608ebee" + resolved "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz" integrity sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg== dependencies: abbrev "1" normalize-path@^3.0.0, normalize-path@~3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + resolved "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz" integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== normalize-range@^0.1.2: version "0.1.2" - resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" + resolved "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz" integrity sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA== normalize-url@^4.5.0: version "4.5.1" - resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-4.5.1.tgz#0dd90cf1288ee1d1313b87081c9a5932ee48518a" + resolved "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz" integrity sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA== -nouislider@^14.6.3: +nouislider@^14.6.3, nouislider@>=9.x: version "14.7.0" - resolved "https://registry.yarnpkg.com/nouislider/-/nouislider-14.7.0.tgz#a71db0587c92567b6da1df57d251d3696d942362" + resolved "https://registry.npmjs.org/nouislider/-/nouislider-14.7.0.tgz" integrity sha512-4RtQ1+LHJKesDCNJrXkQcwXAWCrC2aggdLYMstS/G5fEWL+fXZbUA9pwVNHFghMGuFGRATlDLNInRaPeRKzpFQ== npm-bundled@^1.1.1: version "1.1.2" - resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.1.2.tgz#944c78789bd739035b70baa2ca5cc32b8d860bc1" + resolved "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.2.tgz" integrity sha512-x5DHup0SuyQcmL3s7Rx/YQ8sbw/Hzg0rj48eN0dV7hf5cmQq5PXIeioroH3raV1QC1yh3uTYuMThvEQF3iKgGQ== dependencies: npm-normalize-package-bin "^1.0.1" npm-install-checks@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/npm-install-checks/-/npm-install-checks-4.0.0.tgz#a37facc763a2fde0497ef2c6d0ac7c3fbe00d7b4" + resolved "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-4.0.0.tgz" integrity sha512-09OmyDkNLYwqKPOnbI8exiOZU2GVVmQp7tgez2BPi5OZC8M82elDAps7sxC4l//uSUtotWqoEIDwjRvWH4qz8w== dependencies: semver "^7.1.1" npm-normalize-package-bin@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz#6e79a41f23fd235c0623218228da7d9c23b8f6e2" + resolved "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz" integrity sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA== -npm-package-arg@8.1.5, npm-package-arg@^8.0.1, npm-package-arg@^8.1.2, npm-package-arg@^8.1.5: +npm-package-arg@^8.0.1, npm-package-arg@^8.1.2, npm-package-arg@^8.1.5, npm-package-arg@8.1.5: version "8.1.5" - resolved "https://registry.yarnpkg.com/npm-package-arg/-/npm-package-arg-8.1.5.tgz#3369b2d5fe8fdc674baa7f1786514ddc15466e44" + resolved "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-8.1.5.tgz" integrity sha512-LhgZrg0n0VgvzVdSm1oiZworPbTxYHUJCgtsJW8mGvlDpxTM1vSJc3m5QZeUkhAHIzbz3VCHd/R4osi1L1Tg/Q== dependencies: hosted-git-info "^4.0.1" @@ -8166,7 +8262,7 @@ npm-package-arg@8.1.5, npm-package-arg@^8.0.1, npm-package-arg@^8.1.2, npm-packa npm-packlist@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-3.0.0.tgz#0370df5cfc2fcc8f79b8f42b37798dd9ee32c2a9" + resolved "https://registry.npmjs.org/npm-packlist/-/npm-packlist-3.0.0.tgz" integrity sha512-L/cbzmutAwII5glUcf2DBRNY/d0TFd4e/FnaZigJV6JD85RHZXJFGwCndjMWiiViiWSsWt3tiOLpI3ByTnIdFQ== dependencies: glob "^7.1.6" @@ -8174,9 +8270,9 @@ npm-packlist@^3.0.0: npm-bundled "^1.1.1" npm-normalize-package-bin "^1.0.1" -npm-pick-manifest@6.1.1, npm-pick-manifest@^6.0.0, npm-pick-manifest@^6.1.1: +npm-pick-manifest@^6.0.0, npm-pick-manifest@^6.1.1, npm-pick-manifest@6.1.1: version "6.1.1" - resolved "https://registry.yarnpkg.com/npm-pick-manifest/-/npm-pick-manifest-6.1.1.tgz#7b5484ca2c908565f43b7f27644f36bb816f5148" + resolved "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-6.1.1.tgz" integrity sha512-dBsdBtORT84S8V8UTad1WlUyKIY9iMsAmqxHbLdeEeBNMLQDlDWWra3wYUx9EBEIiG/YwAy0XyNHDd2goAsfuA== dependencies: npm-install-checks "^4.0.0" @@ -8186,7 +8282,7 @@ npm-pick-manifest@6.1.1, npm-pick-manifest@^6.0.0, npm-pick-manifest@^6.1.1: npm-registry-fetch@^12.0.0: version "12.0.2" - resolved "https://registry.yarnpkg.com/npm-registry-fetch/-/npm-registry-fetch-12.0.2.tgz#ae583bb3c902a60dae43675b5e33b5b1f6159f1e" + resolved "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-12.0.2.tgz" integrity sha512-Df5QT3RaJnXYuOwtXBXS9BWs+tHH2olvkCLh6jcR/b/u3DvPMlp3J0TvvYwplPKxHMOwfg287PYih9QqaVFoKA== dependencies: make-fetch-happen "^10.0.1" @@ -8198,14 +8294,14 @@ npm-registry-fetch@^12.0.0: npm-run-path@^4.0.0, npm-run-path@^4.0.1: version "4.0.1" - resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" + resolved "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz" integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== dependencies: path-key "^3.0.0" npmlog@^6.0.0: version "6.0.2" - resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-6.0.2.tgz#c8166017a42f2dea92d6453168dd865186a70830" + resolved "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz" integrity sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg== dependencies: are-we-there-yet "^3.0.0" @@ -8215,37 +8311,36 @@ npmlog@^6.0.0: nth-check@^2.0.1: version "2.1.1" - resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-2.1.1.tgz#c9eab428effce36cd6b92c924bdb000ef1f1ed1d" + resolved "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz" integrity sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w== dependencies: boolbase "^1.0.0" nwsapi@^2.2.0: - version "2.2.2" - resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.2.tgz#e5418863e7905df67d51ec95938d67bf801f0bb0" - integrity sha512-90yv+6538zuvUMnN+zCr8LuV6bPFdq50304114vJYJ8RDyK8D5O9Phpbd6SZWgI7PwzmmfN1upeOJlvybDSgCw== + version "2.2.3" + resolved "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.3.tgz" + integrity sha512-jscxIO4/VKScHlbmFBdV1Z6LXnLO+ZR4VMtypudUdfwtKxUN3TQcNFIHLwKtrUbDyHN4/GycY9+oRGZ2XMXYPw== nx@13.1.3: version "13.1.3" - resolved "https://registry.yarnpkg.com/nx/-/nx-13.1.3.tgz#0b2db9b5bc87a47fb3a90014d2b2abb44f568851" + resolved "https://registry.npmjs.org/nx/-/nx-13.1.3.tgz" integrity sha512-clM0NQhQKYkqcNz2E3uYRMLwhp2L/9dBhJhQi9XBX4IAyA2gWAomhRIlLm5Xxg3g4h1xwSpP3eJ5t89VikY8Pw== dependencies: "@nrwl/cli" "*" -nx@15.3.0: - version "15.3.0" - resolved "https://registry.yarnpkg.com/nx/-/nx-15.3.0.tgz#50916064145cf33ba68fb8bd03ff8ffc2b9ebc7b" - integrity sha512-5tBrEF2zDkGBDfe8wThazJqBDhsVkRrxc6OttzfBmkXP4VPp8w5MMtUEOry181AXKfjDGkw//UnCSkUNynTDlw== +nx@15.9.2: + version "15.9.2" + resolved "https://registry.npmjs.org/nx/-/nx-15.9.2.tgz" + integrity sha512-wtcs+wsuplSckvgk+bV+/XuGlo+sVWzSG0RpgWBjQYeqA3QsVFEAPVY66Z5cSoukDbTV77ddcAjEw+Rz8oOR1A== dependencies: - "@nrwl/cli" "15.3.0" - "@nrwl/tao" "15.3.0" + "@nrwl/cli" "15.9.2" + "@nrwl/tao" "15.9.2" "@parcel/watcher" "2.0.4" "@yarnpkg/lockfile" "^1.1.0" "@yarnpkg/parsers" "^3.0.0-rc.18" "@zkochan/js-yaml" "0.0.6" axios "^1.0.0" - chalk "4.1.0" - chokidar "^3.5.1" + chalk "^4.1.0" cli-cursor "3.1.0" cli-spinners "2.6.1" cliui "^7.0.2" @@ -8254,11 +8349,12 @@ nx@15.3.0: fast-glob "3.2.7" figures "3.2.0" flat "^5.0.2" - fs-extra "^10.1.0" + fs-extra "^11.1.0" glob "7.1.4" ignore "^5.0.4" js-yaml "4.1.0" jsonc-parser "3.2.0" + lines-and-columns "~2.0.3" minimatch "3.0.5" npm-run-path "^4.0.1" open "^8.4.0" @@ -8267,30 +8363,35 @@ nx@15.3.0: strong-log-transformer "^2.1.0" tar-stream "~2.2.0" tmp "~0.2.1" - tsconfig-paths "^3.9.0" + tsconfig-paths "^4.1.2" tslib "^2.3.0" v8-compile-cache "2.3.0" yargs "^17.6.2" yargs-parser "21.1.1" + optionalDependencies: + "@nrwl/nx-darwin-arm64" "15.9.2" + "@nrwl/nx-darwin-x64" "15.9.2" + "@nrwl/nx-linux-arm-gnueabihf" "15.9.2" + "@nrwl/nx-linux-arm64-gnu" "15.9.2" + "@nrwl/nx-linux-arm64-musl" "15.9.2" + "@nrwl/nx-linux-x64-gnu" "15.9.2" + "@nrwl/nx-linux-x64-musl" "15.9.2" + "@nrwl/nx-win32-arm64-msvc" "15.9.2" + "@nrwl/nx-win32-x64-msvc" "15.9.2" -oauth-sign@~0.9.0: - version "0.9.0" - resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" - integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== - -object-assign@^4, object-assign@^4.0.1, object-assign@^4.1.1: +object-assign@^4, object-assign@^4.1.1: version "4.1.1" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + resolved "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== -object-inspect@^1.12.2, object-inspect@^1.9.0: - version "1.12.2" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.2.tgz#c0641f26394532f28ab8d796ab954e43c009a8ea" - integrity sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ== +object-inspect@^1.12.3, object-inspect@^1.9.0: + version "1.12.3" + resolved "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz" + integrity sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g== object-is@^1.0.1: version "1.1.5" - resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.5.tgz#b9deeaa5fc7f1846a0faecdceec138e5778f53ac" + resolved "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz" integrity sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw== dependencies: call-bind "^1.0.2" @@ -8298,17 +8399,17 @@ object-is@^1.0.1: object-keys@^1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + resolved "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz" integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== object-path@^0.11.5: version "0.11.8" - resolved "https://registry.yarnpkg.com/object-path/-/object-path-0.11.8.tgz#ed002c02bbdd0070b78a27455e8ae01fc14d4742" + resolved "https://registry.npmjs.org/object-path/-/object-path-0.11.8.tgz" integrity sha512-YJjNZrlXJFM42wTBn6zgOJVar9KFJvzx6sTWDte8sWZF//cnjl0BxHNpfZx+ZffXX63A9q0b1zsFiBX4g4X5KA== object.assign@^4.1.4: version "4.1.4" - resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.4.tgz#9673c7c7c351ab8c4d0b516f4343ebf4dfb7799f" + resolved "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz" integrity sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ== dependencies: call-bind "^1.0.2" @@ -8316,9 +8417,9 @@ object.assign@^4.1.4: has-symbols "^1.0.3" object-keys "^1.1.1" -object.values@^1.1.5: +object.values@^1.1.6: version "1.1.6" - resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.6.tgz#4abbaa71eba47d63589d402856f908243eea9b1d" + resolved "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz" integrity sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw== dependencies: call-bind "^1.0.2" @@ -8327,45 +8428,45 @@ object.values@^1.1.5: obuf@^1.0.0, obuf@^1.1.2: version "1.1.2" - resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.2.tgz#09bea3343d41859ebd446292d11c9d4db619084e" + resolved "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz" integrity sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg== -on-finished@2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" - integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== - dependencies: - ee-first "1.1.1" - on-finished@~2.3.0: version "2.3.0" - resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" + resolved "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz" integrity sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww== dependencies: ee-first "1.1.1" +on-finished@2.4.1: + version "2.4.1" + resolved "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz" + integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== + dependencies: + ee-first "1.1.1" + on-headers@~1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f" + resolved "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz" integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== once@^1.3.0, once@^1.3.1, once@^1.4.0: version "1.4.0" - resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + resolved "https://registry.npmjs.org/once/-/once-1.4.0.tgz" integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== dependencies: wrappy "1" onetime@^5.1.0, onetime@^5.1.2: version "5.1.2" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" + resolved "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz" integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== dependencies: mimic-fn "^2.1.0" -open@8.4.0, open@^8.0.9, open@^8.4.0: +open@^8.0.9, open@^8.4.0, open@8.4.0: version "8.4.0" - resolved "https://registry.yarnpkg.com/open/-/open-8.4.0.tgz#345321ae18f8138f82565a910fdc6b39e8c244f8" + resolved "https://registry.npmjs.org/open/-/open-8.4.0.tgz" integrity sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q== dependencies: define-lazy-prop "^2.0.0" @@ -8374,34 +8475,34 @@ open@8.4.0, open@^8.0.9, open@^8.4.0: opencollective-postinstall@^2.0.2: version "2.0.3" - resolved "https://registry.yarnpkg.com/opencollective-postinstall/-/opencollective-postinstall-2.0.3.tgz#7a0fff978f6dbfa4d006238fbac98ed4198c3259" + resolved "https://registry.npmjs.org/opencollective-postinstall/-/opencollective-postinstall-2.0.3.tgz" integrity sha512-8AV/sCtuzUeTo8gQK5qDZzARrulB3egtLzFgteqB2tcT4Mw7B8Kt7JcDHmltjz6FOAHsvTevk70gZEbhM4ZS9Q== opener@^1.5.2: version "1.5.2" - resolved "https://registry.yarnpkg.com/opener/-/opener-1.5.2.tgz#5d37e1f35077b9dcac4301372271afdeb2a13598" + resolved "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz" integrity sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A== openseadragon@^2.4.2: version "2.4.2" - resolved "https://registry.yarnpkg.com/openseadragon/-/openseadragon-2.4.2.tgz#f25d833d0ab9941599d65a3e2b44bec546c9f15c" + resolved "https://registry.npmjs.org/openseadragon/-/openseadragon-2.4.2.tgz" integrity sha512-398KbZwRtOYA6OmeWRY4Q0737NTacQ9Q6whmr9Lp1MNQO3p0eBz5LIASRne+4gwequcSM1vcHcjfy3dIndQziw== openurl@1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/openurl/-/openurl-1.1.1.tgz#3875b4b0ef7a52c156f0db41d4609dbb0f94b387" + resolved "https://registry.npmjs.org/openurl/-/openurl-1.1.1.tgz" integrity sha512-d/gTkTb1i1GKz5k3XE3XFV/PxQ1k45zDqGP2OA7YhgsaLoqm6qRvARAZOFer1fcXritWlGBRCu/UgeS4HAnXAA== opn@5.3.0: version "5.3.0" - resolved "https://registry.yarnpkg.com/opn/-/opn-5.3.0.tgz#64871565c863875f052cfdf53d3e3cb5adb53b1c" + resolved "https://registry.npmjs.org/opn/-/opn-5.3.0.tgz" integrity sha512-bYJHo/LOmoTd+pfiYhfZDnf9zekVJrY+cnS2a5F2x+w5ppvTqObojTP7WiFG+kVZs9Inw+qQ/lw7TroWwhdd2g== dependencies: is-wsl "^1.1.0" optionator@^0.8.1: version "0.8.3" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" + resolved "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz" integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== dependencies: deep-is "~0.1.3" @@ -8413,7 +8514,7 @@ optionator@^0.8.1: optionator@^0.9.1: version "0.9.1" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499" + resolved "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz" integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw== dependencies: deep-is "^0.1.3" @@ -8423,9 +8524,9 @@ optionator@^0.9.1: type-check "^0.4.0" word-wrap "^1.2.3" -ora@5.4.1, ora@^5.1.0, ora@^5.4.1: +ora@^5.1.0, ora@^5.4.1, ora@5.4.1: version "5.4.1" - resolved "https://registry.yarnpkg.com/ora/-/ora-5.4.1.tgz#1b2678426af4ac4a509008e5e4ac9e9959db9e18" + resolved "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz" integrity sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ== dependencies: bl "^4.1.0" @@ -8440,52 +8541,52 @@ ora@5.4.1, ora@^5.1.0, ora@^5.4.1: os-tmpdir@^1.0.1, os-tmpdir@~1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" + resolved "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz" integrity sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g== ospath@^1.2.2: version "1.2.2" - resolved "https://registry.yarnpkg.com/ospath/-/ospath-1.2.2.tgz#1276639774a3f8ef2572f7fe4280e0ea4550c07b" + resolved "https://registry.npmjs.org/ospath/-/ospath-1.2.2.tgz" integrity sha512-o6E5qJV5zkAbIDNhGSIlyOhScKXgQrSRMilfph0clDfM0nEnBOlKlH4sWDmG95BW/CvwNz0vmm7dJVtU2KlMiA== p-limit@^2.2.0: version "2.3.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" + resolved "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz" integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== dependencies: p-try "^2.0.0" p-limit@^3.0.2: version "3.1.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" + resolved "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz" integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== dependencies: yocto-queue "^0.1.0" p-locate@^4.1.0: version "4.1.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" + resolved "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz" integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== dependencies: p-limit "^2.2.0" p-locate@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" + resolved "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz" integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== dependencies: p-limit "^3.0.2" p-map@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b" + resolved "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz" integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ== dependencies: aggregate-error "^3.0.0" p-retry@^4.5.0: version "4.6.2" - resolved "https://registry.yarnpkg.com/p-retry/-/p-retry-4.6.2.tgz#9baae7184057edd4e17231cee04264106e092a16" + resolved "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz" integrity sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ== dependencies: "@types/retry" "0.12.0" @@ -8493,12 +8594,12 @@ p-retry@^4.5.0: p-try@^2.0.0: version "2.2.0" - resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" + resolved "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz" integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== pacote@12.0.3: version "12.0.3" - resolved "https://registry.yarnpkg.com/pacote/-/pacote-12.0.3.tgz#b6f25868deb810e7e0ddf001be88da2bcaca57c7" + resolved "https://registry.npmjs.org/pacote/-/pacote-12.0.3.tgz" integrity sha512-CdYEl03JDrRO3x18uHjBYA9TyoW8gy+ThVcypcDkxPtKlw76e4ejhYB6i9lJ+/cebbjpqPW/CijjqxwDTts8Ow== dependencies: "@npmcli/git" "^2.1.0" @@ -8523,19 +8624,19 @@ pacote@12.0.3: pako@^1.0.3: version "1.0.11" - resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf" + resolved "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz" integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw== parent-module@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" + resolved "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz" integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== dependencies: callsites "^3.0.0" parse-json@^5.0.0: version "5.2.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" + resolved "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz" integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== dependencies: "@babel/code-frame" "^7.0.0" @@ -8545,17 +8646,17 @@ parse-json@^5.0.0: parse-node-version@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/parse-node-version/-/parse-node-version-1.0.1.tgz#e2b5dbede00e7fa9bc363607f53327e8b073189b" + resolved "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz" integrity sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA== parse-srcset@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/parse-srcset/-/parse-srcset-1.0.2.tgz#f2bd221f6cc970a938d88556abc589caaaa2bde1" + resolved "https://registry.npmjs.org/parse-srcset/-/parse-srcset-1.0.2.tgz" integrity sha512-/2qh0lav6CmI15FzA3i/2Bzk2zCgQhGMkvhOhKNcBVQ1ldgpbfiNTVslmooUmWJcADi1f1kIeynbDRVzNlfR6Q== parse5-html-rewriting-stream@6.0.1: version "6.0.1" - resolved "https://registry.yarnpkg.com/parse5-html-rewriting-stream/-/parse5-html-rewriting-stream-6.0.1.tgz#de1820559317ab4e451ea72dba05fddfd914480b" + resolved "https://registry.npmjs.org/parse5-html-rewriting-stream/-/parse5-html-rewriting-stream-6.0.1.tgz" integrity sha512-vwLQzynJVEfUlURxgnf51yAJDQTtVpNyGD8tKi2Za7m+akukNHxCcUQMAa/mUGLhCeicFdpy7Tlvj8ZNKadprg== dependencies: parse5 "^6.0.1" @@ -8563,71 +8664,71 @@ parse5-html-rewriting-stream@6.0.1: parse5-htmlparser2-tree-adapter@^6.0.1: version "6.0.1" - resolved "https://registry.yarnpkg.com/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz#2cdf9ad823321140370d4dbf5d3e92c7c8ddc6e6" + resolved "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz" integrity sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA== dependencies: parse5 "^6.0.1" parse5-sax-parser@^6.0.1: version "6.0.1" - resolved "https://registry.yarnpkg.com/parse5-sax-parser/-/parse5-sax-parser-6.0.1.tgz#98b4d366b5b266a7cd90b4b58906667af882daba" + resolved "https://registry.npmjs.org/parse5-sax-parser/-/parse5-sax-parser-6.0.1.tgz" integrity sha512-kXX+5S81lgESA0LsDuGjAlBybImAChYRMT+/uKCEXFBFOeEhS52qUCydGhU3qLRD8D9DVjaUo821WK7DM4iCeg== dependencies: parse5 "^6.0.1" -parse5@6.0.1, parse5@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b" - integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== - parse5@^5.0.0: version "5.1.1" - resolved "https://registry.yarnpkg.com/parse5/-/parse5-5.1.1.tgz#f68e4e5ba1852ac2cadc00f4555fff6c2abb6178" + resolved "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz" integrity sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug== +parse5@^6.0.1: + version "6.0.1" + resolved "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz" + integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== + +parse5@6.0.1: + version "6.0.1" + resolved "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz" + integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== + parseurl@~1.3.2, parseurl@~1.3.3: version "1.3.3" - resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" + resolved "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz" integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== path-exists@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + resolved "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz" integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== path-is-absolute@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + resolved "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== -path-is-inside@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" - integrity sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w== - path-key@^3.0.0, path-key@^3.1.0: version "3.1.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + resolved "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz" integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== path-parse@^1.0.7: version "1.0.7" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + resolved "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz" integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== path-to-regexp@0.1.7: version "0.1.7" - resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" + resolved "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz" integrity sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ== path-type@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" + resolved "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz" integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== pem@1.14.4: version "1.14.4" - resolved "https://registry.yarnpkg.com/pem/-/pem-1.14.4.tgz#a68c70c6e751ccc5b3b5bcd7af78b0aec1177ff9" + resolved "https://registry.npmjs.org/pem/-/pem-1.14.4.tgz" integrity sha512-v8lH3NpirgiEmbOqhx0vwQTxwi0ExsiWBGYh0jYNq7K6mQuO4gI6UEFlr6fLAdv9TPXRt6GqiwE37puQdIDS8g== dependencies: es6-promisify "^6.0.0" @@ -8637,55 +8738,48 @@ pem@1.14.4: pend@~1.2.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" + resolved "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz" integrity sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg== performance-now@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" + resolved "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz" integrity sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow== picocolors@^0.2.1: version "0.2.1" - resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-0.2.1.tgz#570670f793646851d1ba135996962abad587859f" + resolved "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz" integrity sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA== picocolors@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" + resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz" integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: version "2.3.1" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== -pify@^2.0.0, pify@^2.2.0, pify@^2.3.0: +pify@^2.2.0: version "2.3.0" - resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" + resolved "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz" + integrity sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog== + +pify@^2.3.0: + version "2.3.0" + resolved "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz" integrity sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog== pify@^4.0.1: version "4.0.1" - resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" + resolved "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz" integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== -pinkie-promise@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" - integrity sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw== - dependencies: - pinkie "^2.0.0" - -pinkie@^2.0.0: - version "2.0.4" - resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" - integrity sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg== - -piscina@3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/piscina/-/piscina-3.2.0.tgz#f5a1dde0c05567775690cccefe59d9223924d154" - integrity sha512-yn/jMdHRw+q2ZJhFhyqsmANcbF6V2QwmD84c6xRau+QpQOmtrBCoRGdvTfeuFDYXB5W2m6MfLkjkvQa9lUSmIA== +piscina@~3.1.0: + version "3.1.0" + resolved "https://registry.npmjs.org/piscina/-/piscina-3.1.0.tgz" + integrity sha512-KTW4sjsCD34MHrUbx9eAAbuUSpVj407hQSgk/6Epkg0pbRBmv4a3UX7Sr8wxm9xYqQLnsN4mFOjqGDzHAdgKQg== dependencies: eventemitter-asyncresource "^1.0.0" hdr-histogram-js "^2.0.1" @@ -8693,10 +8787,10 @@ piscina@3.2.0: optionalDependencies: nice-napi "^1.0.2" -piscina@~3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/piscina/-/piscina-3.1.0.tgz#2333636865b6cb69c5a370bbc499a98cabcf3e04" - integrity sha512-KTW4sjsCD34MHrUbx9eAAbuUSpVj407hQSgk/6Epkg0pbRBmv4a3UX7Sr8wxm9xYqQLnsN4mFOjqGDzHAdgKQg== +piscina@3.2.0: + version "3.2.0" + resolved "https://registry.npmjs.org/piscina/-/piscina-3.2.0.tgz" + integrity sha512-yn/jMdHRw+q2ZJhFhyqsmANcbF6V2QwmD84c6xRau+QpQOmtrBCoRGdvTfeuFDYXB5W2m6MfLkjkvQa9lUSmIA== dependencies: eventemitter-asyncresource "^1.0.0" hdr-histogram-js "^2.0.1" @@ -8706,19 +8800,19 @@ piscina@~3.1.0: pkg-dir@^4.1.0, pkg-dir@^4.2.0: version "4.2.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" + resolved "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz" integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== dependencies: find-up "^4.0.0" -popper.js@1.16.1-lts: +popper.js@^1.16.1, popper.js@1.16.1-lts: version "1.16.1-lts" - resolved "https://registry.yarnpkg.com/popper.js/-/popper.js-1.16.1-lts.tgz#cf6847b807da3799d80ee3d6d2f90df8a3f50b05" + resolved "https://registry.npmjs.org/popper.js/-/popper.js-1.16.1-lts.tgz" integrity sha512-Kjw8nKRl1m+VrSFCoVGPph93W/qrSO7ZkqPpTf7F4bk/sqcfWK019dWBUpE/fBOsOQY1dks/Bmcbfn1heM/IsA== portfinder@^1.0.28: version "1.0.32" - resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.32.tgz#2fe1b9e58389712429dc2bea5beb2146146c7f81" + resolved "https://registry.npmjs.org/portfinder/-/portfinder-1.0.32.tgz" integrity sha512-on2ZJVVDXRADWE6jnQaX0ioEylzgBpQk8r55NE4wjXW1ZxO+BgDlY6DXwj20i0V8eB4SenDQ00WEaxfiIQPcxg== dependencies: async "^2.6.4" @@ -8727,7 +8821,7 @@ portfinder@^1.0.28: portscanner@2.2.0: version "2.2.0" - resolved "https://registry.yarnpkg.com/portscanner/-/portscanner-2.2.0.tgz#6059189b3efa0965c9d96a56b958eb9508411cf1" + resolved "https://registry.npmjs.org/portscanner/-/portscanner-2.2.0.tgz" integrity sha512-IFroCz/59Lqa2uBvzK3bKDbDDIEaAY8XJ1jFxcLWTqosrsc32//P4VuSB2vZXoHiHqOmx8B5L5hnKOxL/7FlPw== dependencies: async "^2.6.0" @@ -8735,7 +8829,7 @@ portscanner@2.2.0: postcss-apply@0.12.0: version "0.12.0" - resolved "https://registry.yarnpkg.com/postcss-apply/-/postcss-apply-0.12.0.tgz#11a47b271b14d81db97ed7f51a6c409d025a9c34" + resolved "https://registry.npmjs.org/postcss-apply/-/postcss-apply-0.12.0.tgz" integrity sha512-u8qZLyA9P86cD08IhqjSVV8tf1eGiKQ4fPvjcG3Ic/eOU65EAkDQClp8We7d15TG+RIWRVPSy9v7cJ2D9OReqw== dependencies: balanced-match "^1.0.0" @@ -8743,70 +8837,70 @@ postcss-apply@0.12.0: postcss-attribute-case-insensitive@^5.0.0, postcss-attribute-case-insensitive@^5.0.2: version "5.0.2" - resolved "https://registry.yarnpkg.com/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-5.0.2.tgz#03d761b24afc04c09e757e92ff53716ae8ea2741" + resolved "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-5.0.2.tgz" integrity sha512-XIidXV8fDr0kKt28vqki84fRK8VW8eTuIa4PChv2MqKuT6C9UjmSKzen6KaWhWEoYvwxFCa7n/tC1SZ3tyq4SQ== dependencies: postcss-selector-parser "^6.0.10" postcss-clamp@^4.1.0: version "4.1.0" - resolved "https://registry.yarnpkg.com/postcss-clamp/-/postcss-clamp-4.1.0.tgz#7263e95abadd8c2ba1bd911b0b5a5c9c93e02363" + resolved "https://registry.npmjs.org/postcss-clamp/-/postcss-clamp-4.1.0.tgz" integrity sha512-ry4b1Llo/9zz+PKC+030KUnPITTJAHeOwjfAyyB60eT0AorGLdzp52s31OsPRHRf8NchkgFoG2y6fCfn1IV1Ow== dependencies: postcss-value-parser "^4.2.0" postcss-color-functional-notation@^4.2.1, postcss-color-functional-notation@^4.2.4: version "4.2.4" - resolved "https://registry.yarnpkg.com/postcss-color-functional-notation/-/postcss-color-functional-notation-4.2.4.tgz#21a909e8d7454d3612d1659e471ce4696f28caec" + resolved "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-4.2.4.tgz" integrity sha512-2yrTAUZUab9s6CpxkxC4rVgFEVaR6/2Pipvi6qcgvnYiVqZcbDHEoBDhrXzyb7Efh2CCfHQNtcqWcIruDTIUeg== dependencies: postcss-value-parser "^4.2.0" postcss-color-hex-alpha@^8.0.2, postcss-color-hex-alpha@^8.0.4: version "8.0.4" - resolved "https://registry.yarnpkg.com/postcss-color-hex-alpha/-/postcss-color-hex-alpha-8.0.4.tgz#c66e2980f2fbc1a63f5b079663340ce8b55f25a5" + resolved "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-8.0.4.tgz" integrity sha512-nLo2DCRC9eE4w2JmuKgVA3fGL3d01kGq752pVALF68qpGLmx2Qrk91QTKkdUqqp45T1K1XV8IhQpcu1hoAQflQ== dependencies: postcss-value-parser "^4.2.0" postcss-color-rebeccapurple@^7.0.2, postcss-color-rebeccapurple@^7.1.1: version "7.1.1" - resolved "https://registry.yarnpkg.com/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-7.1.1.tgz#63fdab91d878ebc4dd4b7c02619a0c3d6a56ced0" + resolved "https://registry.npmjs.org/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-7.1.1.tgz" integrity sha512-pGxkuVEInwLHgkNxUc4sdg4g3py7zUeCQ9sMfwyHAT+Ezk8a4OaaVZ8lIY5+oNqA/BXXgLyXv0+5wHP68R79hg== dependencies: postcss-value-parser "^4.2.0" postcss-custom-media@^8.0.0, postcss-custom-media@^8.0.2: version "8.0.2" - resolved "https://registry.yarnpkg.com/postcss-custom-media/-/postcss-custom-media-8.0.2.tgz#c8f9637edf45fef761b014c024cee013f80529ea" + resolved "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-8.0.2.tgz" integrity sha512-7yi25vDAoHAkbhAzX9dHx2yc6ntS4jQvejrNcC+csQJAXjj15e7VcWfMgLqBNAbOvqi5uIa9huOVwdHbf+sKqg== dependencies: postcss-value-parser "^4.2.0" postcss-custom-properties@^12.1.10, postcss-custom-properties@^12.1.2: version "12.1.11" - resolved "https://registry.yarnpkg.com/postcss-custom-properties/-/postcss-custom-properties-12.1.11.tgz#d14bb9b3989ac4d40aaa0e110b43be67ac7845cf" + resolved "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-12.1.11.tgz" integrity sha512-0IDJYhgU8xDv1KY6+VgUwuQkVtmYzRwu+dMjnmdMafXYv86SWqfxkc7qdDvWS38vsjaEtv8e0vGOUQrAiMBLpQ== dependencies: postcss-value-parser "^4.2.0" postcss-custom-selectors@^6.0.0, postcss-custom-selectors@^6.0.3: version "6.0.3" - resolved "https://registry.yarnpkg.com/postcss-custom-selectors/-/postcss-custom-selectors-6.0.3.tgz#1ab4684d65f30fed175520f82d223db0337239d9" + resolved "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-6.0.3.tgz" integrity sha512-fgVkmyiWDwmD3JbpCmB45SvvlCD6z9CG6Ie6Iere22W5aHea6oWa7EM2bpnv2Fj3I94L3VbtvX9KqwSi5aFzSg== dependencies: postcss-selector-parser "^6.0.4" postcss-dir-pseudo-class@^6.0.3, postcss-dir-pseudo-class@^6.0.5: version "6.0.5" - resolved "https://registry.yarnpkg.com/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-6.0.5.tgz#2bf31de5de76added44e0a25ecf60ae9f7c7c26c" + resolved "https://registry.npmjs.org/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-6.0.5.tgz" integrity sha512-eqn4m70P031PF7ZQIvSgy9RSJ5uI2171O/OO/zcRNYpJbvaeKFUlar1aJ7rmgiQtbm0FSPsRewjpdS0Oew7MPA== dependencies: postcss-selector-parser "^6.0.10" postcss-double-position-gradients@^3.0.4, postcss-double-position-gradients@^3.1.2: version "3.1.2" - resolved "https://registry.yarnpkg.com/postcss-double-position-gradients/-/postcss-double-position-gradients-3.1.2.tgz#b96318fdb477be95997e86edd29c6e3557a49b91" + resolved "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-3.1.2.tgz" integrity sha512-GX+FuE/uBR6eskOK+4vkXgT6pDkexLokPaz/AbJna9s5Kzp/yl488pKPjhy0obB475ovfT1Wv8ho7U/cHNaRgQ== dependencies: "@csstools/postcss-progressive-custom-properties" "^1.1.0" @@ -8814,55 +8908,55 @@ postcss-double-position-gradients@^3.0.4, postcss-double-position-gradients@^3.1 postcss-env-function@^4.0.4, postcss-env-function@^4.0.6: version "4.0.6" - resolved "https://registry.yarnpkg.com/postcss-env-function/-/postcss-env-function-4.0.6.tgz#7b2d24c812f540ed6eda4c81f6090416722a8e7a" + resolved "https://registry.npmjs.org/postcss-env-function/-/postcss-env-function-4.0.6.tgz" integrity sha512-kpA6FsLra+NqcFnL81TnsU+Z7orGtDTxcOhl6pwXeEq1yFPpRMkCDpHhrz8CFQDr/Wfm0jLiNQ1OsGGPjlqPwA== dependencies: postcss-value-parser "^4.2.0" postcss-focus-visible@^6.0.3, postcss-focus-visible@^6.0.4: version "6.0.4" - resolved "https://registry.yarnpkg.com/postcss-focus-visible/-/postcss-focus-visible-6.0.4.tgz#50c9ea9afa0ee657fb75635fabad25e18d76bf9e" + resolved "https://registry.npmjs.org/postcss-focus-visible/-/postcss-focus-visible-6.0.4.tgz" integrity sha512-QcKuUU/dgNsstIK6HELFRT5Y3lbrMLEOwG+A4s5cA+fx3A3y/JTq3X9LaOj3OC3ALH0XqyrgQIgey/MIZ8Wczw== dependencies: postcss-selector-parser "^6.0.9" postcss-focus-within@^5.0.3, postcss-focus-within@^5.0.4: version "5.0.4" - resolved "https://registry.yarnpkg.com/postcss-focus-within/-/postcss-focus-within-5.0.4.tgz#5b1d2ec603195f3344b716c0b75f61e44e8d2e20" + resolved "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-5.0.4.tgz" integrity sha512-vvjDN++C0mu8jz4af5d52CB184ogg/sSxAFS+oUJQq2SuCe7T5U2iIsVJtsCp2d6R4j0jr5+q3rPkBVZkXD9fQ== dependencies: postcss-selector-parser "^6.0.9" postcss-font-variant@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/postcss-font-variant/-/postcss-font-variant-5.0.0.tgz#efd59b4b7ea8bb06127f2d031bfbb7f24d32fa66" + resolved "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-5.0.0.tgz" integrity sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA== postcss-gap-properties@^3.0.2, postcss-gap-properties@^3.0.5: version "3.0.5" - resolved "https://registry.yarnpkg.com/postcss-gap-properties/-/postcss-gap-properties-3.0.5.tgz#f7e3cddcf73ee19e94ccf7cb77773f9560aa2fff" + resolved "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-3.0.5.tgz" integrity sha512-IuE6gKSdoUNcvkGIqdtjtcMtZIFyXZhmFd5RUlg97iVEvp1BZKV5ngsAjCjrVy+14uhGBQl9tzmi1Qwq4kqVOg== postcss-image-set-function@^4.0.4, postcss-image-set-function@^4.0.7: version "4.0.7" - resolved "https://registry.yarnpkg.com/postcss-image-set-function/-/postcss-image-set-function-4.0.7.tgz#08353bd756f1cbfb3b6e93182c7829879114481f" + resolved "https://registry.npmjs.org/postcss-image-set-function/-/postcss-image-set-function-4.0.7.tgz" integrity sha512-9T2r9rsvYzm5ndsBE8WgtrMlIT7VbtTfE7b3BQnudUqnBcBo7L758oc+o+pdj/dUV0l5wjwSdjeOH2DZtfv8qw== dependencies: postcss-value-parser "^4.2.0" -postcss-import@14.0.2: - version "14.0.2" - resolved "https://registry.yarnpkg.com/postcss-import/-/postcss-import-14.0.2.tgz#60eff77e6be92e7b67fe469ec797d9424cae1aa1" - integrity sha512-BJ2pVK4KhUyMcqjuKs9RijV5tatNzNa73e/32aBVE/ejYPe37iH+6vAu9WvqUkB5OAYgLHzbSvzHnorybJCm9g== +postcss-import@^14.0.0: + version "14.1.0" + resolved "https://registry.npmjs.org/postcss-import/-/postcss-import-14.1.0.tgz" + integrity sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw== dependencies: postcss-value-parser "^4.0.0" read-cache "^1.0.0" resolve "^1.1.7" -postcss-import@^14.0.0: - version "14.1.0" - resolved "https://registry.yarnpkg.com/postcss-import/-/postcss-import-14.1.0.tgz#a7333ffe32f0b8795303ee9e40215dac922781f0" - integrity sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw== +postcss-import@14.0.2: + version "14.0.2" + resolved "https://registry.npmjs.org/postcss-import/-/postcss-import-14.0.2.tgz" + integrity sha512-BJ2pVK4KhUyMcqjuKs9RijV5tatNzNa73e/32aBVE/ejYPe37iH+6vAu9WvqUkB5OAYgLHzbSvzHnorybJCm9g== dependencies: postcss-value-parser "^4.0.0" read-cache "^1.0.0" @@ -8870,29 +8964,20 @@ postcss-import@^14.0.0: postcss-initial@^4.0.1: version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-initial/-/postcss-initial-4.0.1.tgz#529f735f72c5724a0fb30527df6fb7ac54d7de42" + resolved "https://registry.npmjs.org/postcss-initial/-/postcss-initial-4.0.1.tgz" integrity sha512-0ueD7rPqX8Pn1xJIjay0AZeIuDoF+V+VvMt/uOnn+4ezUKhZM/NokDeP6DwMNyIoYByuN/94IQnt5FEkaN59xQ== postcss-lab-function@^4.0.3, postcss-lab-function@^4.2.1: version "4.2.1" - resolved "https://registry.yarnpkg.com/postcss-lab-function/-/postcss-lab-function-4.2.1.tgz#6fe4c015102ff7cd27d1bd5385582f67ebdbdc98" + resolved "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-4.2.1.tgz" integrity sha512-xuXll4isR03CrQsmxyz92LJB2xX9n+pZJ5jE9JgcnmsCammLyKdlzrBin+25dy6wIjfhJpKBAN80gsTlCgRk2w== dependencies: "@csstools/postcss-progressive-custom-properties" "^1.1.0" postcss-value-parser "^4.2.0" -postcss-loader@6.2.1: - version "6.2.1" - resolved "https://registry.yarnpkg.com/postcss-loader/-/postcss-loader-6.2.1.tgz#0895f7346b1702103d30fdc66e4d494a93c008ef" - integrity sha512-WbbYpmAaKcux/P66bZ40bpWsBucjx/TTgVVzRZ9yUO8yQfVBlameJ0ZGVaPfH64hNSBh63a+ICP5nqOpBA0w+Q== - dependencies: - cosmiconfig "^7.0.0" - klona "^2.0.5" - semver "^7.3.5" - postcss-loader@^4.0.3: version "4.3.0" - resolved "https://registry.yarnpkg.com/postcss-loader/-/postcss-loader-4.3.0.tgz#2c4de9657cd4f07af5ab42bd60a673004da1b8cc" + resolved "https://registry.npmjs.org/postcss-loader/-/postcss-loader-4.3.0.tgz" integrity sha512-M/dSoIiNDOo8Rk0mUqoj4kpGq91gcxCfb9PoyZVdZ76/AuhxylHDYZblNE8o+EQ9AMSASeMFEKxZf5aU6wlx1Q== dependencies: cosmiconfig "^7.0.0" @@ -8901,24 +8986,33 @@ postcss-loader@^4.0.3: schema-utils "^3.0.0" semver "^7.3.4" +postcss-loader@6.2.1: + version "6.2.1" + resolved "https://registry.npmjs.org/postcss-loader/-/postcss-loader-6.2.1.tgz" + integrity sha512-WbbYpmAaKcux/P66bZ40bpWsBucjx/TTgVVzRZ9yUO8yQfVBlameJ0ZGVaPfH64hNSBh63a+ICP5nqOpBA0w+Q== + dependencies: + cosmiconfig "^7.0.0" + klona "^2.0.5" + semver "^7.3.5" + postcss-logical@^5.0.3, postcss-logical@^5.0.4: version "5.0.4" - resolved "https://registry.yarnpkg.com/postcss-logical/-/postcss-logical-5.0.4.tgz#ec75b1ee54421acc04d5921576b7d8db6b0e6f73" + resolved "https://registry.npmjs.org/postcss-logical/-/postcss-logical-5.0.4.tgz" integrity sha512-RHXxplCeLh9VjinvMrZONq7im4wjWGlRJAqmAVLXyZaXwfDWP73/oq4NdIp+OZwhQUMj0zjqDfM5Fj7qby+B4g== postcss-media-minmax@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/postcss-media-minmax/-/postcss-media-minmax-5.0.0.tgz#7140bddec173e2d6d657edbd8554a55794e2a5b5" + resolved "https://registry.npmjs.org/postcss-media-minmax/-/postcss-media-minmax-5.0.0.tgz" integrity sha512-yDUvFf9QdFZTuCUg0g0uNSHVlJ5X1lSzDZjPSFaiCWvjgsvu8vEVxtahPrLMinIDEEGnx6cBe6iqdx5YWz08wQ== postcss-modules-extract-imports@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz#cda1f047c0ae80c97dbe28c3e76a43b88025741d" + resolved "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz" integrity sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw== postcss-modules-local-by-default@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz#ebbb54fae1598eecfdf691a02b3ff3b390a5a51c" + resolved "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz" integrity sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ== dependencies: icss-utils "^5.0.0" @@ -8927,92 +9021,53 @@ postcss-modules-local-by-default@^4.0.0: postcss-modules-scope@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz#9ef3151456d3bbfa120ca44898dfca6f2fa01f06" + resolved "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz" integrity sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg== dependencies: postcss-selector-parser "^6.0.4" postcss-modules-values@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz#d7c5e7e68c3bb3c9b27cbf48ca0bb3ffb4602c9c" + resolved "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz" integrity sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ== dependencies: icss-utils "^5.0.0" postcss-nesting@^10.1.2, postcss-nesting@^10.2.0: version "10.2.0" - resolved "https://registry.yarnpkg.com/postcss-nesting/-/postcss-nesting-10.2.0.tgz#0b12ce0db8edfd2d8ae0aaf86427370b898890be" + resolved "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-10.2.0.tgz" integrity sha512-EwMkYchxiDiKUhlJGzWsD9b2zvq/r2SSubcRrgP+jujMXFzqvANLt16lJANC+5uZ6hjI7lpRmI6O8JIl+8l1KA== dependencies: "@csstools/selector-specificity" "^2.0.0" postcss-selector-parser "^6.0.10" postcss-opacity-percentage@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/postcss-opacity-percentage/-/postcss-opacity-percentage-1.1.2.tgz#bd698bb3670a0a27f6d657cc16744b3ebf3b1145" - integrity sha512-lyUfF7miG+yewZ8EAk9XUBIlrHyUE6fijnesuz+Mj5zrIHIEw6KcIZSOk/elVMqzLvREmXB83Zi/5QpNRYd47w== + version "1.1.3" + resolved "https://registry.npmjs.org/postcss-opacity-percentage/-/postcss-opacity-percentage-1.1.3.tgz" + integrity sha512-An6Ba4pHBiDtyVpSLymUUERMo2cU7s+Obz6BTrS+gxkbnSBNKSuD0AVUc+CpBMrpVPKKfoVz0WQCX+Tnst0i4A== postcss-overflow-shorthand@^3.0.2, postcss-overflow-shorthand@^3.0.4: version "3.0.4" - resolved "https://registry.yarnpkg.com/postcss-overflow-shorthand/-/postcss-overflow-shorthand-3.0.4.tgz#7ed6486fec44b76f0eab15aa4866cda5d55d893e" + resolved "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-3.0.4.tgz" integrity sha512-otYl/ylHK8Y9bcBnPLo3foYFLL6a6Ak+3EQBPOTR7luMYCOsiVTUk1iLvNf6tVPNGXcoL9Hoz37kpfriRIFb4A== dependencies: postcss-value-parser "^4.2.0" postcss-page-break@^3.0.4: version "3.0.4" - resolved "https://registry.yarnpkg.com/postcss-page-break/-/postcss-page-break-3.0.4.tgz#7fbf741c233621622b68d435babfb70dd8c1ee5f" + resolved "https://registry.npmjs.org/postcss-page-break/-/postcss-page-break-3.0.4.tgz" integrity sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ== postcss-place@^7.0.3, postcss-place@^7.0.5: version "7.0.5" - resolved "https://registry.yarnpkg.com/postcss-place/-/postcss-place-7.0.5.tgz#95dbf85fd9656a3a6e60e832b5809914236986c4" + resolved "https://registry.npmjs.org/postcss-place/-/postcss-place-7.0.5.tgz" integrity sha512-wR8igaZROA6Z4pv0d+bvVrvGY4GVHihBCBQieXFY3kuSuMyOmEnnfFzHl/tQuqHZkfkIVBEbDvYcFfHmpSet9g== dependencies: postcss-value-parser "^4.2.0" -postcss-preset-env@7.2.3: - version "7.2.3" - resolved "https://registry.yarnpkg.com/postcss-preset-env/-/postcss-preset-env-7.2.3.tgz#01b9b6eea0ff16c27a3d514f10105d56363428a6" - integrity sha512-Ok0DhLfwrcNGrBn8sNdy1uZqWRk/9FId0GiQ39W4ILop5GHtjJs8bu1MY9isPwHInpVEPWjb4CEcEaSbBLpfwA== - dependencies: - autoprefixer "^10.4.2" - browserslist "^4.19.1" - caniuse-lite "^1.0.30001299" - css-blank-pseudo "^3.0.2" - css-has-pseudo "^3.0.3" - css-prefers-color-scheme "^6.0.2" - cssdb "^5.0.0" - postcss-attribute-case-insensitive "^5.0.0" - postcss-color-functional-notation "^4.2.1" - postcss-color-hex-alpha "^8.0.2" - postcss-color-rebeccapurple "^7.0.2" - postcss-custom-media "^8.0.0" - postcss-custom-properties "^12.1.2" - postcss-custom-selectors "^6.0.0" - postcss-dir-pseudo-class "^6.0.3" - postcss-double-position-gradients "^3.0.4" - postcss-env-function "^4.0.4" - postcss-focus-visible "^6.0.3" - postcss-focus-within "^5.0.3" - postcss-font-variant "^5.0.0" - postcss-gap-properties "^3.0.2" - postcss-image-set-function "^4.0.4" - postcss-initial "^4.0.1" - postcss-lab-function "^4.0.3" - postcss-logical "^5.0.3" - postcss-media-minmax "^5.0.0" - postcss-nesting "^10.1.2" - postcss-overflow-shorthand "^3.0.2" - postcss-page-break "^3.0.4" - postcss-place "^7.0.3" - postcss-pseudo-class-any-link "^7.0.2" - postcss-replace-overflow-wrap "^4.0.0" - postcss-selector-not "^5.0.0" - postcss-preset-env@^7.4.2: version "7.8.3" - resolved "https://registry.yarnpkg.com/postcss-preset-env/-/postcss-preset-env-7.8.3.tgz#2a50f5e612c3149cc7af75634e202a5b2ad4f1e2" + resolved "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-7.8.3.tgz" integrity sha512-T1LgRm5uEVFSEF83vHZJV2z19lHg4yJuZ6gXZZkqVsqv63nlr6zabMH3l4Pc01FQCyfWVrh2GaUeCVy9Po+Aag== dependencies: "@csstools/postcss-cascade-layers" "^1.1.1" @@ -9065,42 +9120,81 @@ postcss-preset-env@^7.4.2: postcss-selector-not "^6.0.1" postcss-value-parser "^4.2.0" +postcss-preset-env@7.2.3: + version "7.2.3" + resolved "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-7.2.3.tgz" + integrity sha512-Ok0DhLfwrcNGrBn8sNdy1uZqWRk/9FId0GiQ39W4ILop5GHtjJs8bu1MY9isPwHInpVEPWjb4CEcEaSbBLpfwA== + dependencies: + autoprefixer "^10.4.2" + browserslist "^4.19.1" + caniuse-lite "^1.0.30001299" + css-blank-pseudo "^3.0.2" + css-has-pseudo "^3.0.3" + css-prefers-color-scheme "^6.0.2" + cssdb "^5.0.0" + postcss-attribute-case-insensitive "^5.0.0" + postcss-color-functional-notation "^4.2.1" + postcss-color-hex-alpha "^8.0.2" + postcss-color-rebeccapurple "^7.0.2" + postcss-custom-media "^8.0.0" + postcss-custom-properties "^12.1.2" + postcss-custom-selectors "^6.0.0" + postcss-dir-pseudo-class "^6.0.3" + postcss-double-position-gradients "^3.0.4" + postcss-env-function "^4.0.4" + postcss-focus-visible "^6.0.3" + postcss-focus-within "^5.0.3" + postcss-font-variant "^5.0.0" + postcss-gap-properties "^3.0.2" + postcss-image-set-function "^4.0.4" + postcss-initial "^4.0.1" + postcss-lab-function "^4.0.3" + postcss-logical "^5.0.3" + postcss-media-minmax "^5.0.0" + postcss-nesting "^10.1.2" + postcss-overflow-shorthand "^3.0.2" + postcss-page-break "^3.0.4" + postcss-place "^7.0.3" + postcss-pseudo-class-any-link "^7.0.2" + postcss-replace-overflow-wrap "^4.0.0" + postcss-selector-not "^5.0.0" + postcss-pseudo-class-any-link@^7.0.2, postcss-pseudo-class-any-link@^7.1.6: version "7.1.6" - resolved "https://registry.yarnpkg.com/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-7.1.6.tgz#2693b221902da772c278def85a4d9a64b6e617ab" + resolved "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-7.1.6.tgz" integrity sha512-9sCtZkO6f/5ML9WcTLcIyV1yz9D1rf0tWc+ulKcvV30s0iZKS/ONyETvoWsr6vnrmW+X+KmuK3gV/w5EWnT37w== dependencies: postcss-selector-parser "^6.0.10" postcss-replace-overflow-wrap@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-4.0.0.tgz#d2df6bed10b477bf9c52fab28c568b4b29ca4319" + resolved "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-4.0.0.tgz" integrity sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw== postcss-responsive-type@1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/postcss-responsive-type/-/postcss-responsive-type-1.0.0.tgz#bb2d57d830beb9586ec4fda7994f07e37953aad8" + resolved "https://registry.npmjs.org/postcss-responsive-type/-/postcss-responsive-type-1.0.0.tgz" integrity sha512-O4kAKbc4RLnSkzcguJ6ojW67uOfeILaj+8xjsO0quLU94d8BKCqYwwFEUVRNbj0YcXA6d3uF/byhbaEATMRVig== dependencies: postcss "^6.0.6" postcss-selector-not@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/postcss-selector-not/-/postcss-selector-not-5.0.0.tgz#ac5fc506f7565dd872f82f5314c0f81a05630dc7" + resolved "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-5.0.0.tgz" integrity sha512-/2K3A4TCP9orP4TNS7u3tGdRFVKqz/E6pX3aGnriPG0jU78of8wsUcqE4QAhWEU0d+WnMSF93Ah3F//vUtK+iQ== dependencies: balanced-match "^1.0.0" postcss-selector-not@^6.0.1: version "6.0.1" - resolved "https://registry.yarnpkg.com/postcss-selector-not/-/postcss-selector-not-6.0.1.tgz#8f0a709bf7d4b45222793fc34409be407537556d" + resolved "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-6.0.1.tgz" integrity sha512-1i9affjAe9xu/y9uqWH+tD4r6/hDaXJruk8xn2x1vzxC2U3J3LKO3zJW4CyxlNhA56pADJ/djpEwpH1RClI2rQ== dependencies: postcss-selector-parser "^6.0.10" postcss-selector-parser@^6.0.10, postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4, postcss-selector-parser@^6.0.9: version "6.0.11" - resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.11.tgz#2e41dc39b7ad74046e1615185185cd0b17d0c8dc" + resolved "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.11.tgz" integrity sha512-zbARubNdogI9j7WY4nQJBiNqQf3sLS3wCP4WfOidu+p28LofJqDH1tcXypGrcmMHhDk2t9wGhCsYe/+szLTy1g== dependencies: cssesc "^3.0.0" @@ -9108,72 +9202,72 @@ postcss-selector-parser@^6.0.10, postcss-selector-parser@^6.0.2, postcss-selecto postcss-value-parser@^4.0.0, postcss-value-parser@^4.1.0, postcss-value-parser@^4.2.0: version "4.2.0" - resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" + resolved "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz" integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== -postcss@8.4.5: - version "8.4.5" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.5.tgz#bae665764dfd4c6fcc24dc0fdf7e7aa00cc77f95" - integrity sha512-jBDboWM8qpaqwkMwItqTQTiFikhs/67OYVvblFFTM7MrZjt6yMKd6r2kgXizEbTTljacm4NldIlZnhbjr84QYg== - dependencies: - nanoid "^3.1.30" - picocolors "^1.0.0" - source-map-js "^1.0.1" - postcss@^6.0.6: version "6.0.23" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-6.0.23.tgz#61c82cc328ac60e677645f979054eb98bc0e3324" + resolved "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz" integrity sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag== dependencies: chalk "^2.4.1" source-map "^0.6.1" supports-color "^5.4.0" -postcss@^7.0.14: - version "7.0.39" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.39.tgz#9624375d965630e2e1f2c02a935c82a59cb48309" - integrity sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA== - dependencies: - picocolors "^0.2.1" - source-map "^0.6.1" - -postcss@^8.1, postcss@^8.2.14, postcss@^8.2.15, postcss@^8.3.11, postcss@^8.3.7: - version "8.4.19" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.19.tgz#61178e2add236b17351897c8bcc0b4c8ecab56fc" - integrity sha512-h+pbPsyhlYj6N2ozBmHhHrs9DzGmbaarbLvWipMRO7RLS+v4onj26MPFXA5OBYFxyqYhUJK456SwDcY9H2/zsA== +"postcss@^7.0.0 || ^8.0.1", postcss@^8, postcss@^8.0.0, postcss@^8.0.3, postcss@^8.1, postcss@^8.1.0, postcss@^8.2, postcss@^8.2.14, postcss@^8.2.15, postcss@^8.3, postcss@^8.3.11, postcss@^8.3.7, postcss@^8.4, postcss@^8.4.6: + version "8.4.21" + resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.21.tgz" + integrity sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg== dependencies: nanoid "^3.3.4" picocolors "^1.0.0" source-map-js "^1.0.2" +postcss@^7.0.14: + version "7.0.39" + resolved "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz" + integrity sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA== + dependencies: + picocolors "^0.2.1" + source-map "^0.6.1" + +postcss@8.4.5: + version "8.4.5" + resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.5.tgz" + integrity sha512-jBDboWM8qpaqwkMwItqTQTiFikhs/67OYVvblFFTM7MrZjt6yMKd6r2kgXizEbTTljacm4NldIlZnhbjr84QYg== + dependencies: + nanoid "^3.1.30" + picocolors "^1.0.0" + source-map-js "^1.0.1" + prelude-ls@^1.2.1: version "1.2.1" - resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" + resolved "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz" integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== prelude-ls@~1.1.2: version "1.1.2" - resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" + resolved "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz" integrity sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w== pretty-bytes@^5.3.0, pretty-bytes@^5.6.0: version "5.6.0" - resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-5.6.0.tgz#356256f643804773c82f64723fe78c92c62beaeb" + resolved "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz" integrity sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg== process-nextick-args@~2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" + resolved "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz" integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== promise-inflight@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" + resolved "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz" integrity sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g== promise-retry@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/promise-retry/-/promise-retry-2.0.1.tgz#ff747a13620ab57ba688f5fc67855410c370da22" + resolved "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz" integrity sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g== dependencies: err-code "^2.0.2" @@ -9181,15 +9275,15 @@ promise-retry@^2.0.1: prompts@~2.4.2: version "2.4.2" - resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.2.tgz#7b57e73b3a48029ad10ebd44f74b01722a4cb069" + resolved "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz" integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q== dependencies: kleur "^3.0.3" sisteransi "^1.0.5" -prop-types@^15.6.0, prop-types@^15.6.2, prop-types@^15.7.2, prop-types@^15.8.1: +prop-types@^15.5, prop-types@^15.6.0, prop-types@^15.6.2, prop-types@^15.7.2, prop-types@^15.8.1: version "15.8.1" - resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" + resolved "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz" integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== dependencies: loose-envify "^1.4.0" @@ -9198,119 +9292,99 @@ prop-types@^15.6.0, prop-types@^15.6.2, prop-types@^15.7.2, prop-types@^15.8.1: proxy-addr@~2.0.7: version "2.0.7" - resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" + resolved "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz" integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== dependencies: forwarded "0.2.0" ipaddr.js "1.9.1" -proxy-from-env@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.0.0.tgz#33c50398f70ea7eb96d21f7b817630a55791c7ee" - integrity sha512-F2JHgJQ1iqwnHDcQjVBsq3n/uoaFL+iPW/eAeL7kVxy/2RrWaN4WroKjjvbsoRtv0ftelNyC01bjRhn/bhcf4A== - proxy-from-env@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" + resolved "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz" integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== +proxy-from-env@1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.0.0.tgz" + integrity sha512-F2JHgJQ1iqwnHDcQjVBsq3n/uoaFL+iPW/eAeL7kVxy/2RrWaN4WroKjjvbsoRtv0ftelNyC01bjRhn/bhcf4A== + prr@~1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" + resolved "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz" integrity sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw== psl@^1.1.28, psl@^1.1.33: version "1.9.0" - resolved "https://registry.yarnpkg.com/psl/-/psl-1.9.0.tgz#d0df2a137f00794565fcaf3b2c00cd09f8d5a5a7" + resolved "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz" integrity sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag== pstree.remy@^1.1.8: version "1.1.8" - resolved "https://registry.yarnpkg.com/pstree.remy/-/pstree.remy-1.1.8.tgz#c242224f4a67c21f686839bbdb4ac282b8373d3a" + resolved "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz" integrity sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w== pump@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" + resolved "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz" integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== dependencies: end-of-stream "^1.1.0" once "^1.3.1" -punycode@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" - integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== - -punycode@^2.1.1: +punycode@^2.1.0, punycode@^2.1.1: version "2.3.0" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.0.tgz#f67fa67c94da8f4d0cfff981aee4118064199b8f" + resolved "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz" integrity sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA== -q@^1.4.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" - integrity sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw== - qjobs@^1.2.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/qjobs/-/qjobs-1.2.0.tgz#c45e9c61800bd087ef88d7e256423bdd49e5d071" + resolved "https://registry.npmjs.org/qjobs/-/qjobs-1.2.0.tgz" integrity sha512-8YOJEHtxpySA3fFDyCRxA+UUV+fA+rTWnuWvylOK/NCjhY+b4ocCtmu8TtsWb+mYeU+GCHf/S66KZF/AsteKHg== -qs@6.11.0: +qs@^6.11.0, qs@6.11.0: version "6.11.0" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.0.tgz#fd0d963446f7a65e1367e01abd85429453f0c37a" + resolved "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz" integrity sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q== dependencies: side-channel "^1.0.4" -qs@6.2.3: - version "6.2.3" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.2.3.tgz#1cfcb25c10a9b2b483053ff39f5dfc9233908cfe" - integrity sha512-AY4g8t3LMboim0t6XWFdz6J5OuJ1ZNYu54SXihS/OMpgyCqYmcAJnWqkNSOjSjWmq3xxy+GF9uWQI2lI/7tKIA== - qs@~6.10.3: - version "6.10.5" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.10.5.tgz#974715920a80ff6a262264acd2c7e6c2a53282b4" - integrity sha512-O5RlPh0VFtR78y79rgcgKK4wbAI0C5zGVLztOIdpWX6ep368q5Hv6XRxDvXuZ9q3C6v+e3n8UfZZJw7IIG27eQ== + version "6.10.4" + resolved "https://registry.npmjs.org/qs/-/qs-6.10.4.tgz" + integrity sha512-OQiU+C+Ds5qiH91qh/mg0w+8nwQuLjM4F4M/PbmhDOoYehPh+Fb0bDjtR1sOvy7YKxvj28Y/M0PhP5uVX0kB+g== dependencies: side-channel "^1.0.4" -qs@~6.5.2: - version "6.5.3" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.3.tgz#3aeeffc91967ef6e35c0e488ef46fb296ab76aad" - integrity sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA== - querystringify@^2.1.1: version "2.2.0" - resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6" + resolved "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz" integrity sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ== queue-microtask@^1.2.2: version "1.2.3" - resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" + resolved "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz" integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== raf-schd@^4.0.2: version "4.0.3" - resolved "https://registry.yarnpkg.com/raf-schd/-/raf-schd-4.0.3.tgz#5d6c34ef46f8b2a0e880a8fcdb743efc5bfdbc1a" + resolved "https://registry.npmjs.org/raf-schd/-/raf-schd-4.0.3.tgz" integrity sha512-tQkJl2GRWh83ui2DiPTJz9wEiMN20syf+5oKfB03yYP7ioZcJwsIK8FjrtLwH1m7C7e+Tt2yYBlrOpdT+dyeIQ== randombytes@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" + resolved "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz" integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== dependencies: safe-buffer "^5.1.0" range-parser@^1.2.1, range-parser@~1.2.0, range-parser@~1.2.1: version "1.2.1" - resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" + resolved "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz" integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== -raw-body@2.5.1, raw-body@^2.3.2: +raw-body@^2.3.2, raw-body@2.5.1: version "2.5.1" - resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.1.tgz#fe1b1628b181b700215e5fd42389f98b71392857" + resolved "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz" integrity sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig== dependencies: bytes "3.1.2" @@ -9320,26 +9394,26 @@ raw-body@2.5.1, raw-body@^2.3.2: re-reselect@^4.0.0: version "4.0.1" - resolved "https://registry.yarnpkg.com/re-reselect/-/re-reselect-4.0.1.tgz#21a2306d11bbf377ac78687aa46e1a8848974194" + resolved "https://registry.npmjs.org/re-reselect/-/re-reselect-4.0.1.tgz" integrity sha512-xVTNGQy/dAxOolunBLmVMGZ49VUUR1s8jZUiJQb+g1sI63GAv9+a5Jas9yHvdxeUgiZkU9r3gDExDorxHzOgRA== re-resizable@6.9.6: version "6.9.6" - resolved "https://registry.yarnpkg.com/re-resizable/-/re-resizable-6.9.6.tgz#b95d37e3821481b56ddfb1e12862940a791e827d" + resolved "https://registry.npmjs.org/re-resizable/-/re-resizable-6.9.6.tgz" integrity sha512-0xYKS5+Z0zk+vICQlcZW+g54CcJTTmHluA7JUUgvERDxnKAnytylcyPsA+BSFi759s5hPlHmBRegFrwXs2FuBQ== dependencies: fast-memoize "^2.5.1" react-aria-live@^2.0.5: version "2.0.5" - resolved "https://registry.yarnpkg.com/react-aria-live/-/react-aria-live-2.0.5.tgz#333480cb898d6963421bd86fe3cbd0ce54e37f08" + resolved "https://registry.npmjs.org/react-aria-live/-/react-aria-live-2.0.5.tgz" integrity sha512-rXiH1HNKJrr/UfVeGwA2aKY43r5WbjLs+AYB6/kJF1qny2hwxzQc1qewQmUpdQ5h8HAOTD8O/XlGcEHjqlCl0g== dependencies: uuid "^3.2.1" react-beautiful-dnd@^13.0.0: version "13.1.1" - resolved "https://registry.yarnpkg.com/react-beautiful-dnd/-/react-beautiful-dnd-13.1.1.tgz#b0f3087a5840920abf8bb2325f1ffa46d8c4d0a2" + resolved "https://registry.npmjs.org/react-beautiful-dnd/-/react-beautiful-dnd-13.1.1.tgz" integrity sha512-0Lvs4tq2VcrEjEgDXHjT98r+63drkKEgqyxdA7qD3mvKwga6a5SscbdLPO2IExotU1jW8L0Ksdl0Cj2AF67nPQ== dependencies: "@babel/runtime" "^7.9.2" @@ -9352,7 +9426,7 @@ react-beautiful-dnd@^13.0.0: react-copy-to-clipboard@^5.0.1: version "5.1.0" - resolved "https://registry.yarnpkg.com/react-copy-to-clipboard/-/react-copy-to-clipboard-5.1.0.tgz#09aae5ec4c62750ccb2e6421a58725eabc41255c" + resolved "https://registry.npmjs.org/react-copy-to-clipboard/-/react-copy-to-clipboard-5.1.0.tgz" integrity sha512-k61RsNgAayIJNoy9yDsYzDe/yAZAzEbEgcz3DZMhF686LEyukcE1hzurxe85JandPUG+yTfGVFzuEw3xt8WP/A== dependencies: copy-to-clipboard "^3.3.1" @@ -9360,30 +9434,30 @@ react-copy-to-clipboard@^5.0.1: react-dnd-html5-backend@^10.0.2: version "10.0.2" - resolved "https://registry.yarnpkg.com/react-dnd-html5-backend/-/react-dnd-html5-backend-10.0.2.tgz#15cb9d2b923f43576a136df854e288cb5969784c" + resolved "https://registry.npmjs.org/react-dnd-html5-backend/-/react-dnd-html5-backend-10.0.2.tgz" integrity sha512-ny17gUdInZ6PIGXdzfwPhoztRdNVVvjoJMdG80hkDBamJBeUPuNF2Wv4D3uoQJLjXssX1+i9PhBqc7EpogClwQ== dependencies: dnd-core "^10.0.2" react-dnd-multi-backend@^5.0.0: - version "5.1.1" - resolved "https://registry.yarnpkg.com/react-dnd-multi-backend/-/react-dnd-multi-backend-5.1.1.tgz#1ddb243cea74e41efa3932e6403bb84d0a8cd11b" - integrity sha512-u085U6tIAfkFzaBhe0AhZZIhs9Ta1sRcp+S/A7JR81B1TjtPVLYIoTyqCO91wG1Iz5+MEVL88aYuRPayMY4HXQ== + version "5.0.1" + resolved "https://registry.npmjs.org/react-dnd-multi-backend/-/react-dnd-multi-backend-5.0.1.tgz" + integrity sha512-E45T5xVl4CLt9QFV9ZMjWCGLyF16+B6B6FgbeZE9J5o0rvLHaCqyAJTelRDXtbSiSBPaDlN1STO86jkiD31AHA== dependencies: - dnd-multi-backend "^5.1.1" + dnd-multi-backend "^5.0.1" prop-types "^15.7.2" - react-dnd-preview "^5.1.1" + react-dnd-preview "^5.0.1" -react-dnd-preview@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/react-dnd-preview/-/react-dnd-preview-5.1.1.tgz#90c4ad49e90d9abe39728b762d72132b8589b784" - integrity sha512-RryrwRRfF22kL8CQcYqDHt4WLbytRbVNXYnjPkyZKfGsXfQnY0j8OtxokTee4Ba3OkcSiSYQbLhDRFw9wiJj5g== +react-dnd-preview@^5.0.1: + version "5.0.1" + resolved "https://registry.npmjs.org/react-dnd-preview/-/react-dnd-preview-5.0.1.tgz" + integrity sha512-wwUgk8jWuO4WMOoa+GviHoZyYAiXer6vsSW2aEhpz0gsde08O+4cI+j7DG7q9vYlBnljNutdQ1WjDV0VskZ4jQ== dependencies: prop-types "^15.7.2" react-dnd-touch-backend@^10.0.2: version "10.0.2" - resolved "https://registry.yarnpkg.com/react-dnd-touch-backend/-/react-dnd-touch-backend-10.0.2.tgz#90cb916655539b838d49b8895e1813f8b874b3b4" + resolved "https://registry.npmjs.org/react-dnd-touch-backend/-/react-dnd-touch-backend-10.0.2.tgz" integrity sha512-+lW/Ern0dKyHToD0oP+Wc/ZD6l7qJazosLqbjzL7OnPlig6WxdlrHkJylOLkeAdZj41fIJJ551Lb57pIL0CcPw== dependencies: "@react-dnd/invariant" "^2.0.0" @@ -9391,7 +9465,7 @@ react-dnd-touch-backend@^10.0.2: react-dnd@^10.0.2: version "10.0.2" - resolved "https://registry.yarnpkg.com/react-dnd/-/react-dnd-10.0.2.tgz#a6ad8eb3d9f2c573031f7ce05012e5c767a0b1fc" + resolved "https://registry.npmjs.org/react-dnd/-/react-dnd-10.0.2.tgz" integrity sha512-SC2Ymvntynhoqtf5zaFhZscm9xenCoMofilxPdlwUlaelAzmbl9fw82C4ZJ//+lNm3kWAKXjGDZg2/aWjKEAtg== dependencies: "@react-dnd/shallowequal" "^2.0.0" @@ -9399,9 +9473,9 @@ react-dnd@^10.0.2: dnd-core "^10.0.2" hoist-non-react-statics "^3.3.0" -react-dom@^16.14.0: +"react-dom@^0.14.0 || ^15.0.0-0 || ^16.0.0", "react-dom@^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0", "react-dom@^15.3.0 || ^16.0.0-alpha || ^17.0.0 || ^18.0.0-rc", "react-dom@^16.13.1 || ^17.0.0 || ^18.0.0", react-dom@^16.14.0, react-dom@^16.3.2, "react-dom@^16.8.0 || ^17.0.0", react-dom@^16.8.3, "react-dom@^16.8.5 || ^17.0.0 || ^18.0.0", "react-dom@>= 16.3.0", "react-dom@>= 16.8", react-dom@>=16.3.0, react-dom@>=16.6.0, react-dom@>=16.8, react-dom@16.x: version "16.14.0" - resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-16.14.0.tgz#7ad838ec29a777fb3c75c3a190f661cf92ab8b89" + resolved "https://registry.npmjs.org/react-dom/-/react-dom-16.14.0.tgz" integrity sha512-1gCeQXDLoIqMgqD3IO2Ah9bnf0w9kzhwN5q4FGnHZ67hBm9yePzB5JJAIQCc8x3pFnNlwFq4RidZggNAAkzWWw== dependencies: loose-envify "^1.1.0" @@ -9409,17 +9483,17 @@ react-dom@^16.14.0: prop-types "^15.6.2" scheduler "^0.19.1" -react-draggable@4.4.4: - version "4.4.4" - resolved "https://registry.yarnpkg.com/react-draggable/-/react-draggable-4.4.4.tgz#5b26d9996be63d32d285a426f41055de87e59b2f" - integrity sha512-6e0WdcNLwpBx/YIDpoyd2Xb04PB0elrDrulKUgdrIlwuYvxh5Ok9M+F8cljm8kPXXs43PmMzek9RrB1b7mLMqA== +react-draggable@4.4.5: + version "4.4.5" + resolved "https://registry.npmjs.org/react-draggable/-/react-draggable-4.4.5.tgz" + integrity sha512-OMHzJdyJbYTZo4uQE393fHcqqPYsEtkjfMgvCHr6rejT+Ezn4OZbNyGH50vv+SunC1RMvwOTSWkEODQLzw1M9g== dependencies: clsx "^1.1.1" - prop-types "^15.6.0" + prop-types "^15.8.1" react-full-screen@^0.2.4: version "0.2.5" - resolved "https://registry.yarnpkg.com/react-full-screen/-/react-full-screen-0.2.5.tgz#bc79a5cdb9640d8b9b09e11a17fa54f6e6fa5789" + resolved "https://registry.npmjs.org/react-full-screen/-/react-full-screen-0.2.5.tgz" integrity sha512-LNkxjLWmiR+AwemSVdn/miUcBy8tHA6mDVS1qz1AM/DHNEtQbzkh5ok9A6g99502OqutQq1zBvCBGLV8rsB2tw== dependencies: "@types/react" "*" @@ -9427,30 +9501,35 @@ react-full-screen@^0.2.4: react-i18next@^11.7.0: version "11.18.6" - resolved "https://registry.yarnpkg.com/react-i18next/-/react-i18next-11.18.6.tgz#e159c2960c718c1314f1e8fcaa282d1c8b167887" + resolved "https://registry.npmjs.org/react-i18next/-/react-i18next-11.18.6.tgz" integrity sha512-yHb2F9BiT0lqoQDt8loZ5gWP331GwctHz9tYQ8A2EIEUu+CcEdjBLQWli1USG3RdWQt3W+jqQLg/d4rrQR96LA== dependencies: "@babel/runtime" "^7.14.5" html-parse-stringify "^3.0.1" react-image@^4.0.1: - version "4.0.3" - resolved "https://registry.yarnpkg.com/react-image/-/react-image-4.0.3.tgz#6fa722877660b67295298a914bff1ed87ad2cf83" - integrity sha512-19MUK9u1qaw9xys8XEsVkSpVhHctEBUeYFvrLTe1PN+4w5Co13AN2WA7xtBshPM6SthsOj77SlDrEAeOaJpf7g== + version "4.1.0" + resolved "https://registry.npmjs.org/react-image/-/react-image-4.1.0.tgz" + integrity sha512-qwPNlelQe9Zy14K2pGWSwoL+vHsAwmJKS6gkotekDgRpcnRuzXNap00GfibD3eEPYu3WCPlyIUUNzcyHOrLHjw== -react-is@^16.13.1, react-is@^16.7.0: +react-is@^16.13.1: version "16.13.1" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" + resolved "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz" + integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== + +react-is@^16.7.0: + version "16.13.1" + resolved "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz" integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== "react-is@^16.8.0 || ^17.0.0", react-is@^17.0.2: version "17.0.2" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0" + resolved "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz" integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== react-mosaic-component@^4.0.1: version "4.1.1" - resolved "https://registry.yarnpkg.com/react-mosaic-component/-/react-mosaic-component-4.1.1.tgz#48a34e5e5c16654075212666c2aebeb488bab9f2" + resolved "https://registry.npmjs.org/react-mosaic-component/-/react-mosaic-component-4.1.1.tgz" integrity sha512-HVlLvfYQ/AKmoKvw95Orx3Qyc7SNuS/QlAy+SkAVit1g9ipzXBGYoBg7RMXP5sF5w47CgYxA+1gT+fYRVf73jA== dependencies: classnames "^2.2.6" @@ -9465,7 +9544,7 @@ react-mosaic-component@^4.0.1: react-redux@^7.1.0, react-redux@^7.2.0: version "7.2.9" - resolved "https://registry.yarnpkg.com/react-redux/-/react-redux-7.2.9.tgz#09488fbb9416a4efe3735b7235055442b042481d" + resolved "https://registry.npmjs.org/react-redux/-/react-redux-7.2.9.tgz" integrity sha512-Gx4L3uM182jEEayZfRbI/G11ZpYdNAnBs70lFVMNdHJI76XYtR+7m0MN+eAs7UHBPhWXcnFPaS+9owSCJQHNpQ== dependencies: "@babel/runtime" "^7.15.4" @@ -9477,21 +9556,21 @@ react-redux@^7.1.0, react-redux@^7.2.0: react-resize-observer@^1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/react-resize-observer/-/react-resize-observer-1.1.1.tgz#641dfa2e0f4bd2549a8ab4bbbaf43b68f3dcaf76" + resolved "https://registry.npmjs.org/react-resize-observer/-/react-resize-observer-1.1.1.tgz" integrity sha512-3R+90Hou90Mr3wJYc+unsySC8Pn91V4nmjO32NKvUvjphRUbq9HisyLg7bDyGBE7xlMrrM6Fax7iNQaFdc/FYA== react-rnd@^10.1: - version "10.3.7" - resolved "https://registry.yarnpkg.com/react-rnd/-/react-rnd-10.3.7.tgz#037ce277e6c5e682989b51278e44a6ba299990af" - integrity sha512-fYifqMI6xWzzajoRbxNNH2xpKagJT5o1zAY3a4eh4gKk+Eyy/9LGoBKA3eVX0yNOeD7JB+wznps4YmnU38v6Yw== + version "10.4.1" + resolved "https://registry.npmjs.org/react-rnd/-/react-rnd-10.4.1.tgz" + integrity sha512-0m887AjQZr6p2ADLNnipquqsDq4XJu/uqVqI3zuoGD19tRm6uB83HmZWydtkilNp5EWsOHbLGF4IjWMdd5du8Q== dependencies: re-resizable "6.9.6" - react-draggable "4.4.4" + react-draggable "4.4.5" tslib "2.3.1" react-sizeme@^2.6.7: version "2.6.12" - resolved "https://registry.yarnpkg.com/react-sizeme/-/react-sizeme-2.6.12.tgz#ed207be5476f4a85bf364e92042520499455453e" + resolved "https://registry.npmjs.org/react-sizeme/-/react-sizeme-2.6.12.tgz" integrity sha512-tL4sCgfmvapYRZ1FO2VmBmjPVzzqgHA7kI8lSJ6JS6L78jXFNRdOZFpXyK6P1NBZvKPPCZxReNgzZNUajAerZw== dependencies: element-resize-detector "^1.2.1" @@ -9501,7 +9580,7 @@ react-sizeme@^2.6.7: react-transition-group@^4.4.0: version "4.4.5" - resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-4.4.5.tgz#e53d4e3f3344da8521489fbef8f2581d42becdd1" + resolved "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz" integrity sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g== dependencies: "@babel/runtime" "^7.5.5" @@ -9510,21 +9589,21 @@ react-transition-group@^4.4.0: prop-types "^15.6.2" react-virtualized-auto-sizer@^1.0.2: - version "1.0.7" - resolved "https://registry.yarnpkg.com/react-virtualized-auto-sizer/-/react-virtualized-auto-sizer-1.0.7.tgz#bfb8414698ad1597912473de3e2e5f82180c1195" - integrity sha512-Mxi6lwOmjwIjC1X4gABXMJcKHsOo0xWl3E3ugOgufB8GJU+MqrtY35aBuvCYv/razQ1Vbp7h1gWJjGjoNN5pmA== + version "1.0.13" + resolved "https://registry.npmjs.org/react-virtualized-auto-sizer/-/react-virtualized-auto-sizer-1.0.13.tgz" + integrity sha512-iazB2jnZz93jgjo66/rMlrshQ0M67Y7CRSGJRu/BkWH5H63OcC0YL6dBxJZ+etHDjZT6qnUm4PKRjOJx9yF51w== react-window@^1.8.5: version "1.8.8" - resolved "https://registry.yarnpkg.com/react-window/-/react-window-1.8.8.tgz#1b52919f009ddf91970cbdb2050a6c7be44df243" + resolved "https://registry.npmjs.org/react-window/-/react-window-1.8.8.tgz" integrity sha512-D4IiBeRtGXziZ1n0XklnFGu7h9gU684zepqyKzgPNzrsrk7xOCxni+TCckjg2Nr/DiaEEGVVmnhYSlT2rB47dQ== dependencies: "@babel/runtime" "^7.0.0" memoize-one ">=3.1.1 <6" -react@^16.14.0: +"react@^0.14.0 || ^15.0.0-0 || ^16.0.0", "react@^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0", "react@^15.3.0 || ^16.0.0-alpha || ^17.0.0 || ^18.0.0-rc", "react@^15.3.0 || 16 || 17 || 18", "react@^15.6 || ^16", react@^16.0.0, react@^16.13, react@^16.13.1, "react@^16.13.1 || ^17.0.0 || ^18.0.0", react@^16.14.0, react@^16.3.0, react@^16.3.2, react@^16.3.x, "react@^16.8.0 || ^17.0.0", "react@^16.8.0 || ^17.0.0 || ^18.0.0", react@^16.8.3, "react@^16.8.3 || ^17 || ^18", "react@^16.8.5 || ^17.0.0 || ^18.0.0", "react@>= 16.3.0", "react@>= 16.8", "react@>= 16.8.0", react@>=0.14, react@>=16.3.0, react@>=16.6.0, react@>=16.8, react@16.x: version "16.14.0" - resolved "https://registry.yarnpkg.com/react/-/react-16.14.0.tgz#94d776ddd0aaa37da3eda8fc5b6b18a4c9a3114d" + resolved "https://registry.npmjs.org/react/-/react-16.14.0.tgz" integrity sha512-0X2CImDkJGApiAlcf0ODKIneSwBPhqJawOa5wCtKbu7ZECrmS26NvtSILynQ66cgkT/RJ4LidJOc3bUESwmU8g== dependencies: loose-envify "^1.1.0" @@ -9533,23 +9612,23 @@ react@^16.14.0: read-cache@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/read-cache/-/read-cache-1.0.0.tgz#e664ef31161166c9751cdbe8dbcf86b5fb58f774" + resolved "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz" integrity sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA== dependencies: pify "^2.3.0" read-package-json-fast@^2.0.1: version "2.0.3" - resolved "https://registry.yarnpkg.com/read-package-json-fast/-/read-package-json-fast-2.0.3.tgz#323ca529630da82cb34b36cc0b996693c98c2b83" + resolved "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-2.0.3.tgz" integrity sha512-W/BKtbL+dUjTuRL2vziuYhp76s5HZ9qQhd/dKfWIZveD0O40453QNyZhC0e63lqZrAQ4jiOapVoeJ7JrszenQQ== dependencies: json-parse-even-better-errors "^2.3.0" npm-normalize-package-bin "^1.0.1" readable-stream@^2.0.1: - version "2.3.7" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" - integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== + version "2.3.8" + resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz" + integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA== dependencies: core-util-is "~1.0.0" inherits "~2.0.3" @@ -9560,9 +9639,9 @@ readable-stream@^2.0.1: util-deprecate "~1.0.1" readable-stream@^3.0.6, readable-stream@^3.1.1, readable-stream@^3.4.0, readable-stream@^3.6.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" - integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== + version "3.6.2" + resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz" + integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== dependencies: inherits "^2.0.3" string_decoder "^1.1.1" @@ -9570,84 +9649,84 @@ readable-stream@^3.0.6, readable-stream@^3.1.1, readable-stream@^3.4.0, readable readdirp@~3.6.0: version "3.6.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" + resolved "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz" integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== dependencies: picomatch "^2.2.1" rechoir@^0.7.0: version "0.7.1" - resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.7.1.tgz#9478a96a1ca135b5e88fc027f03ee92d6c645686" + resolved "https://registry.npmjs.org/rechoir/-/rechoir-0.7.1.tgz" integrity sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg== dependencies: resolve "^1.9.0" redux-devtools-extension@^2.13.2: version "2.13.9" - resolved "https://registry.yarnpkg.com/redux-devtools-extension/-/redux-devtools-extension-2.13.9.tgz#6b764e8028b507adcb75a1cae790f71e6be08ae7" + resolved "https://registry.npmjs.org/redux-devtools-extension/-/redux-devtools-extension-2.13.9.tgz" integrity sha512-cNJ8Q/EtjhQaZ71c8I9+BPySIBVEKssbPpskBfsXqb8HJ002A3KRVHfeRzwRo6mGPqsm7XuHTqNSNeS1Khig0A== redux-saga@^1.1.3: - version "1.2.1" - resolved "https://registry.yarnpkg.com/redux-saga/-/redux-saga-1.2.1.tgz#3d730563c8d980525fa5e333ea1ee6e143452275" - integrity sha512-fVCicLlf4hLP+KB6H7RHfZlZ8LdYckhaemXBB3wh//a2ESyz/z/l8ygxlm0OqPjS/PARdsQ2hIdAltxEB+NgvA== + version "1.2.3" + resolved "https://registry.npmjs.org/redux-saga/-/redux-saga-1.2.3.tgz" + integrity sha512-HDe0wTR5nhd8Xr5xjGzoyTbdAw6rjy1GDplFt3JKtKN8/MnkQSRqK/n6aQQhpw5NI4ekDVOaW+w4sdxPBaCoTQ== dependencies: - "@redux-saga/core" "^1.2.1" + "@redux-saga/core" "^1.2.3" redux-thunk@^2.3.0: version "2.4.2" - resolved "https://registry.yarnpkg.com/redux-thunk/-/redux-thunk-2.4.2.tgz#b9d05d11994b99f7a91ea223e8b04cf0afa5ef3b" + resolved "https://registry.npmjs.org/redux-thunk/-/redux-thunk-2.4.2.tgz" integrity sha512-+P3TjtnP0k/FEjcBL5FZpoovtvrTNT/UXd4/sluaSyrURlSlhLSzEdfsTBW7WsKB6yPvgd7q/iZPICFjW4o57Q== -redux@^4.0.0, redux@^4.0.4, redux@^4.0.5: - version "4.2.0" - resolved "https://registry.yarnpkg.com/redux/-/redux-4.2.0.tgz#46f10d6e29b6666df758780437651eeb2b969f13" - integrity sha512-oSBmcKKIuIR4ME29/AeNUnl5L+hvBq7OaJWzaptTQJAntaPvxIJqfnjbaEiCzzaIz+XmVILfqAM3Ob0aXLPfjA== +"redux@^3.1.0 || ^4.0.0", redux@^4, redux@^4.0.0, redux@^4.0.4, redux@^4.0.5: + version "4.2.1" + resolved "https://registry.npmjs.org/redux/-/redux-4.2.1.tgz" + integrity sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w== dependencies: "@babel/runtime" "^7.9.2" reflect-metadata@^0.1.13, reflect-metadata@^0.1.2: version "0.1.13" - resolved "https://registry.yarnpkg.com/reflect-metadata/-/reflect-metadata-0.1.13.tgz#67ae3ca57c972a2aa1642b10fe363fe32d49dc08" + resolved "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz" integrity sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg== regenerate-unicode-properties@^10.1.0: version "10.1.0" - resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz#7c3192cab6dd24e21cb4461e5ddd7dd24fa8374c" + resolved "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz" integrity sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ== dependencies: regenerate "^1.4.2" regenerate@^1.4.2: version "1.4.2" - resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.2.tgz#b9346d8827e8f5a32f7ba29637d398b69014848a" + resolved "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz" integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A== -regenerator-runtime@0.13.9: - version "0.13.9" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz#8925742a98ffd90814988d7566ad30ca3b263b52" - integrity sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA== - regenerator-runtime@^0.13.11, regenerator-runtime@^0.13.4: version "0.13.11" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz#f6dca3e7ceec20590d07ada785636a90cdca17f9" + resolved "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz" integrity sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg== +regenerator-runtime@0.13.9: + version "0.13.9" + resolved "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz" + integrity sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA== + regenerator-transform@^0.15.1: version "0.15.1" - resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.15.1.tgz#f6c4e99fc1b4591f780db2586328e4d9a9d8dc56" + resolved "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.1.tgz" integrity sha512-knzmNAcuyxV+gQCufkYcvOqX/qIIfHLv0u5x79kRxuGojfYVky1f15TzZEu2Avte8QGepvUNTnLskf8E6X6Vyg== dependencies: "@babel/runtime" "^7.8.4" regex-parser@^2.2.11: version "2.2.11" - resolved "https://registry.yarnpkg.com/regex-parser/-/regex-parser-2.2.11.tgz#3b37ec9049e19479806e878cabe7c1ca83ccfe58" + resolved "https://registry.npmjs.org/regex-parser/-/regex-parser-2.2.11.tgz" integrity sha512-jbD/FT0+9MBU2XAZluI7w2OBs1RBi6p9M83nkoZayQXXU9e8Robt69FcZc7wU4eJD/YFTjn1JdCk3rbMJajz8Q== regexp.prototype.flags@^1.2.0, regexp.prototype.flags@^1.4.3: version "1.4.3" - resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz#87cab30f80f66660181a3bb7bf5981a872b367ac" + resolved "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz" integrity sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA== dependencies: call-bind "^1.0.2" @@ -9656,106 +9735,75 @@ regexp.prototype.flags@^1.2.0, regexp.prototype.flags@^1.4.3: regexpp@^3.2.0: version "3.2.0" - resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2" + resolved "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz" integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== -regexpu-core@^5.2.1: - version "5.2.2" - resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-5.2.2.tgz#3e4e5d12103b64748711c3aad69934d7718e75fc" - integrity sha512-T0+1Zp2wjF/juXMrMxHxidqGYn8U4R+zleSJhX9tQ1PUsS8a9UtYfbsF9LdiVgNX3kiX8RNaKM42nfSgvFJjmw== +regexpu-core@^5.3.1: + version "5.3.2" + resolved "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz" + integrity sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ== dependencies: + "@babel/regjsgen" "^0.8.0" regenerate "^1.4.2" regenerate-unicode-properties "^10.1.0" - regjsgen "^0.7.1" regjsparser "^0.9.1" unicode-match-property-ecmascript "^2.0.0" unicode-match-property-value-ecmascript "^2.1.0" -regjsgen@^0.7.1: - version "0.7.1" - resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.7.1.tgz#ee5ef30e18d3f09b7c369b76e7c2373ed25546f6" - integrity sha512-RAt+8H2ZEzHeYWxZ3H2z6tF18zyyOnlcdaafLrm21Bguj7uZy6ULibiAFdXEtKQY4Sy7wDTwDiOazasMLc4KPA== - regjsparser@^0.9.1: version "0.9.1" - resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.9.1.tgz#272d05aa10c7c1f67095b1ff0addae8442fc5709" + resolved "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz" integrity sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ== dependencies: jsesc "~0.5.0" request-progress@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/request-progress/-/request-progress-3.0.0.tgz#4ca754081c7fec63f505e4faa825aa06cd669dbe" + resolved "https://registry.npmjs.org/request-progress/-/request-progress-3.0.0.tgz" integrity sha512-MnWzEHHaxHO2iWiQuHrUPBi/1WeBf5PkxQqNyNvLl9VAYSdXkP8tQ3pBSeCPD+yw0v0Aq1zosWLz0BdeXpWwZg== dependencies: throttleit "^1.0.0" -request@^2.87.0: - version "2.88.2" - resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3" - integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw== - dependencies: - aws-sign2 "~0.7.0" - aws4 "^1.8.0" - caseless "~0.12.0" - combined-stream "~1.0.6" - extend "~3.0.2" - forever-agent "~0.6.1" - form-data "~2.3.2" - har-validator "~5.1.3" - http-signature "~1.2.0" - is-typedarray "~1.0.0" - isstream "~0.1.2" - json-stringify-safe "~5.0.1" - mime-types "~2.1.19" - oauth-sign "~0.9.0" - performance-now "^2.1.0" - qs "~6.5.2" - safe-buffer "^5.1.2" - tough-cookie "~2.5.0" - tunnel-agent "^0.6.0" - uuid "^3.3.2" - require-directory@^2.1.1: version "2.1.1" - resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + resolved "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz" integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== require-from-string@^2.0.2: version "2.0.2" - resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" + resolved "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz" integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== requires-port@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" + resolved "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz" integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ== -reselect@^4.0.0: +reselect@^4.0.0, reselect@>1.0.0: version "4.1.7" - resolved "https://registry.yarnpkg.com/reselect/-/reselect-4.1.7.tgz#56480d9ff3d3188970ee2b76527bd94a95567a42" + resolved "https://registry.npmjs.org/reselect/-/reselect-4.1.7.tgz" integrity sha512-Zu1xbUt3/OPwsXL46hvOOoQrap2azE7ZQbokq61BQfiXvhewsKDwhMeZjTX9sX0nvw1t/U5Audyn1I9P/m9z0A== resolve-cwd@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" + resolved "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz" integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg== dependencies: resolve-from "^5.0.0" resolve-from@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz" integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== resolve-from@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" + resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz" integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== resolve-url-loader@5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/resolve-url-loader/-/resolve-url-loader-5.0.0.tgz#ee3142fb1f1e0d9db9524d539cfa166e9314f795" + resolved "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-5.0.0.tgz" integrity sha512-uZtduh8/8srhBoMx//5bwqjQ+rfYOUq8zC9NrMUGtjBiGTtFJM42s58/36+hTqeqINcnYe08Nj3LkK9lW4N8Xg== dependencies: adjust-sourcemap-loader "^4.0.0" @@ -9764,27 +9812,27 @@ resolve-url-loader@5.0.0: postcss "^8.2.14" source-map "0.6.1" +resolve@^1.1.7, resolve@^1.14.2, resolve@^1.22.1, resolve@^1.9.0: + version "1.22.2" + resolved "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz" + integrity sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g== + dependencies: + is-core-module "^2.11.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + resolve@1.22.0: version "1.22.0" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.0.tgz#5e0b8c67c15df57a89bdbabe603a002f21731198" + resolved "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz" integrity sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw== dependencies: is-core-module "^2.8.1" path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" -resolve@^1.1.7, resolve@^1.14.2, resolve@^1.20.0, resolve@^1.22.0, resolve@^1.9.0: - version "1.22.1" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.1.tgz#27cb2ebb53f91abb49470a928bba7558066ac177" - integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw== - dependencies: - is-core-module "^2.9.0" - path-parse "^1.0.7" - supports-preserve-symlinks-flag "^1.0.0" - resp-modifier@6.0.2: version "6.0.2" - resolved "https://registry.yarnpkg.com/resp-modifier/-/resp-modifier-6.0.2.tgz#b124de5c4fbafcba541f48ffa73970f4aa456b4f" + resolved "https://registry.npmjs.org/resp-modifier/-/resp-modifier-6.0.2.tgz" integrity sha512-U1+0kWC/+4ncRFYqQWTx/3qkfE6a4B/h3XXgmXypfa0SPZ3t7cbbaFk297PjQS/yov24R18h6OZe6iZwj3NSLw== dependencies: debug "^2.2.0" @@ -9792,7 +9840,7 @@ resp-modifier@6.0.2: restore-cursor@^3.1.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" + resolved "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz" integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== dependencies: onetime "^5.1.0" @@ -9800,70 +9848,70 @@ restore-cursor@^3.1.0: retry@^0.12.0: version "0.12.0" - resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" + resolved "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz" integrity sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow== retry@^0.13.1: version "0.13.1" - resolved "https://registry.yarnpkg.com/retry/-/retry-0.13.1.tgz#185b1587acf67919d63b357349e03537b2484658" + resolved "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz" integrity sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg== reusify@^1.0.4: version "1.0.4" - resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" + resolved "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz" integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== rfdc@^1.3.0: version "1.3.0" - resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.3.0.tgz#d0b7c441ab2720d05dc4cf26e01c89631d9da08b" + resolved "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz" integrity sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA== -rimraf@^2.2.8, rimraf@^2.5.2, rimraf@^2.6.3: +rimraf@^2.6.3: version "2.7.1" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" + resolved "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz" integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== dependencies: glob "^7.1.3" rimraf@^3.0.0, rimraf@^3.0.2: version "3.0.2" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" + resolved "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz" integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== dependencies: glob "^7.1.3" rtl-css-js@^1.13.1: - version "1.16.0" - resolved "https://registry.yarnpkg.com/rtl-css-js/-/rtl-css-js-1.16.0.tgz#e8d682982441aadb63cabcb2f7385f3fb78ff26e" - integrity sha512-Oc7PnzwIEU4M0K1J4h/7qUUaljXhQ0kCObRsZjxs2HjkpKsnoTMvSmvJ4sqgJZd0zBoEfAyTdnK/jMIYvrjySQ== + version "1.16.1" + resolved "https://registry.npmjs.org/rtl-css-js/-/rtl-css-js-1.16.1.tgz" + integrity sha512-lRQgou1mu19e+Ya0LsTvKrVJ5TYUbqCVPAiImX3UfLTenarvPUl1QFdvu5Z3PYmHT9RCcwIfbjRQBntExyj3Zg== dependencies: "@babel/runtime" "^7.1.2" run-async@^2.4.0: version "2.4.1" - resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455" + resolved "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz" integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ== run-parallel@^1.1.9: version "1.2.0" - resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" + resolved "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz" integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== dependencies: queue-microtask "^1.2.2" rx@4.1.0: version "4.1.0" - resolved "https://registry.yarnpkg.com/rx/-/rx-4.1.0.tgz#a5f13ff79ef3b740fe30aa803fb09f98805d4782" + resolved "https://registry.npmjs.org/rx/-/rx-4.1.0.tgz" integrity sha512-CiaiuN6gapkdl+cZUr67W6I8jquN4lkak3vtIsIWCl4XIPP8ffsoyN6/+PuGXnQy8Cu8W2y9Xxh31Rq4M6wUug== rxjs-for-await@0.0.2: version "0.0.2" - resolved "https://registry.yarnpkg.com/rxjs-for-await/-/rxjs-for-await-0.0.2.tgz#26598a1d6167147cc192172970e7eed4e620384b" + resolved "https://registry.npmjs.org/rxjs-for-await/-/rxjs-for-await-0.0.2.tgz" integrity sha512-IJ8R/ZCFMHOcDIqoABs82jal00VrZx8Xkgfe7TOKoaRPAW5nH/VFlG23bXpeGdrmtqI9UobFPgUKgCuFc7Lncw== rxjs-report-usage@^1.0.4: version "1.0.6" - resolved "https://registry.yarnpkg.com/rxjs-report-usage/-/rxjs-report-usage-1.0.6.tgz#6e06034d9e1592e8a45bee877631638e4bac2576" + resolved "https://registry.npmjs.org/rxjs-report-usage/-/rxjs-report-usage-1.0.6.tgz" integrity sha512-omv1DIv5z1kV+zDAEjaDjWSkx8w5TbFp5NZoPwUipwzYVcor/4So9ZU3bUyQ1c8lxY5Q0Es/ztWW7PGjY7to0Q== dependencies: "@babel/parser" "^7.10.3" @@ -9876,7 +9924,7 @@ rxjs-report-usage@^1.0.4: rxjs-spy@^8.0.2: version "8.0.2" - resolved "https://registry.yarnpkg.com/rxjs-spy/-/rxjs-spy-8.0.2.tgz#dd510bdb58d798e0bc23121ab67714dd6fd95f88" + resolved "https://registry.npmjs.org/rxjs-spy/-/rxjs-spy-8.0.2.tgz" integrity sha512-w2yc+EiwYA8J97hxqMD+pxGZkNbRCQwxR660r4nw4Soa8kCvatsdSRc0THndYk9uk6SvZy2RNyiVcxfX39pWpw== dependencies: "@types/circular-json" "^0.4.0" @@ -9886,89 +9934,94 @@ rxjs-spy@^8.0.2: rxjs-report-usage "^1.0.4" stacktrace-gps "^3.0.2" -rxjs@6.6.7, rxjs@^6.5.4, rxjs@^6.5.5, rxjs@~6.6.0: - version "6.6.7" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.7.tgz#90ac018acabf491bf65044235d5863c4dab804c9" - integrity sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ== - dependencies: - tslib "^1.9.0" - -rxjs@^5.5.6: - version "5.5.12" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-5.5.12.tgz#6fa61b8a77c3d793dbaf270bee2f43f652d741cc" - integrity sha512-xx2itnL5sBbqeeiVgNPVuQQ1nC8Jp2WfNJhXWHmElW9YmrpS9UVnNzhP3EH3HFqexO5Tlp8GhYY+WEcqcVMvGw== - dependencies: - symbol-observable "1.0.1" - -rxjs@^7.2.0, rxjs@^7.5.5: - version "7.6.0" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.6.0.tgz#361da5362b6ddaa691a2de0b4f2d32028f1eb5a2" - integrity sha512-DDa7d8TFNUalGC9VqXvQ1euWNN7sc63TrUCuM9J998+ViviahMIjKSOU7rfcgFOF+FCD71BhDRv4hrFz+ImDLQ== - dependencies: - tslib "^2.1.0" - -rxjs@^7.5.1: +rxjs@^6.0.0, "rxjs@^6.5.3 || ^7.4.0", rxjs@^7.0.0, rxjs@^7.2.0, rxjs@^7.5.1, rxjs@^7.5.5, rxjs@>=6.5.3: version "7.8.0" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.8.0.tgz#90a938862a82888ff4c7359811a595e14e1e09a4" + resolved "https://registry.npmjs.org/rxjs/-/rxjs-7.8.0.tgz" integrity sha512-F2+gxDshqmIub1KdvZkaEfGDwLNpPvk9Fs6LD/MyQxNgMds/WH9OdDDXOmxUZpME+iSK3rQCctkL0DYyytUqMg== dependencies: tslib "^2.1.0" -safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: +rxjs@^6.5.4: + version "6.6.7" + resolved "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz" + integrity sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ== + dependencies: + tslib "^1.9.0" + +rxjs@^6.5.5: + version "6.6.7" + resolved "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz" + integrity sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ== + dependencies: + tslib "^1.9.0" + +rxjs@~6.6.0, rxjs@6.6.7: + version "6.6.7" + resolved "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz" + integrity sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ== + dependencies: + tslib "^1.9.0" + +safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.2, safe-buffer@>=5.1.0, safe-buffer@~5.1.0, safe-buffer@~5.1.1, safe-buffer@5.1.2: version "5.1.2" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== -safe-buffer@5.2.1, safe-buffer@>=5.1.0, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.2, safe-buffer@~5.2.0: +safe-buffer@~5.2.0: version "5.2.1" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +safe-buffer@5.2.1: + version "5.2.1" + resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== safe-regex-test@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.0.tgz#793b874d524eb3640d1873aad03596db2d4f2295" + resolved "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz" integrity sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA== dependencies: call-bind "^1.0.2" get-intrinsic "^1.1.3" is-regex "^1.1.4" -"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@^2.1.2, safer-buffer@~2.1.0: +safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@^2.1.2, "safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0", safer-buffer@~2.1.0: version "2.1.2" - resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== sanitize-html@^2.7.2: - version "2.7.3" - resolved "https://registry.yarnpkg.com/sanitize-html/-/sanitize-html-2.7.3.tgz#166c868444ee4f9fd7352ac8c63fa86c343fc2bd" - integrity sha512-jMaHG29ak4miiJ8wgqA1849iInqORgNv7SLfSw9LtfOhEUQ1C0YHKH73R+hgyufBW9ZFeJrb057k9hjlfBCVlw== + version "2.10.0" + resolved "https://registry.npmjs.org/sanitize-html/-/sanitize-html-2.10.0.tgz" + integrity sha512-JqdovUd81dG4k87vZt6uA6YhDfWkUGruUu/aPmXLxXi45gZExnt9Bnw/qeQU8oGf82vPyaE0vO4aH0PbobB9JQ== dependencies: deepmerge "^4.2.2" escape-string-regexp "^4.0.0" - htmlparser2 "^6.0.0" + htmlparser2 "^8.0.0" is-plain-object "^5.0.0" parse-srcset "^1.0.2" postcss "^8.3.11" -sass-loader@12.4.0: - version "12.4.0" - resolved "https://registry.yarnpkg.com/sass-loader/-/sass-loader-12.4.0.tgz#260b0d51a8a373bb8e88efc11f6ba5583fea0bcf" - integrity sha512-7xN+8khDIzym1oL9XyS6zP6Ges+Bo2B2xbPrjdMHEYyV3AQYhd/wXeru++3ODHF0zMjYmVadblSKrPrjEkL8mg== +sass-loader@^12.6.0: + version "12.6.0" + resolved "https://registry.npmjs.org/sass-loader/-/sass-loader-12.6.0.tgz" + integrity sha512-oLTaH0YCtX4cfnJZxKSLAyglED0naiYfNG1iXfU5w1LNZ+ukoA5DtyDIN5zmKVZwYNJP4KRc5Y3hkWga+7tYfA== dependencies: klona "^2.0.4" neo-async "^2.6.2" -sass-loader@^12.6.0: - version "12.6.0" - resolved "https://registry.yarnpkg.com/sass-loader/-/sass-loader-12.6.0.tgz#5148362c8e2cdd4b950f3c63ac5d16dbfed37bcb" - integrity sha512-oLTaH0YCtX4cfnJZxKSLAyglED0naiYfNG1iXfU5w1LNZ+ukoA5DtyDIN5zmKVZwYNJP4KRc5Y3hkWga+7tYfA== +sass-loader@12.4.0: + version "12.4.0" + resolved "https://registry.npmjs.org/sass-loader/-/sass-loader-12.4.0.tgz" + integrity sha512-7xN+8khDIzym1oL9XyS6zP6Ges+Bo2B2xbPrjdMHEYyV3AQYhd/wXeru++3ODHF0zMjYmVadblSKrPrjEkL8mg== dependencies: klona "^2.0.4" neo-async "^2.6.2" sass-resources-loader@^2.1.1: version "2.2.5" - resolved "https://registry.yarnpkg.com/sass-resources-loader/-/sass-resources-loader-2.2.5.tgz#75131cdb26bae51fcffc007d8155d57b5e825ca7" + resolved "https://registry.npmjs.org/sass-resources-loader/-/sass-resources-loader-2.2.5.tgz" integrity sha512-po8rfETH9cOQACWxubT/1CCu77KjxwRtCDm6QAXZH99aUHBydwSoxdIjC40SGp/dcS/FkSNJl0j1VEojGZqlvQ== dependencies: async "^3.2.3" @@ -9976,37 +10029,37 @@ sass-resources-loader@^2.1.1: glob "^7.1.6" loader-utils "^2.0.0" +sass@^1.3.0, sass@~1.33.0: + version "1.33.0" + resolved "https://registry.npmjs.org/sass/-/sass-1.33.0.tgz" + integrity sha512-9v0MUXnSi62FtfjqcwZ+b8B9FIxdwFEb3FPUkjEPXWd0b5KcnPGSp2XF9WrzcH1ZxedfgJVTdA3A1j4eEj53xg== + dependencies: + chokidar ">=3.0.0 <4.0.0" + sass@1.49.9: version "1.49.9" - resolved "https://registry.yarnpkg.com/sass/-/sass-1.49.9.tgz#b15a189ecb0ca9e24634bae5d1ebc191809712f9" + resolved "https://registry.npmjs.org/sass/-/sass-1.49.9.tgz" integrity sha512-YlYWkkHP9fbwaFRZQRXgDi3mXZShslVmmo+FVK3kHLUELHHEYrCmL1x6IUjC7wLS6VuJSAFXRQS/DxdsC4xL1A== dependencies: chokidar ">=3.0.0 <4.0.0" immutable "^4.0.0" source-map-js ">=0.6.2 <2.0.0" -sass@~1.33.0: - version "1.33.0" - resolved "https://registry.yarnpkg.com/sass/-/sass-1.33.0.tgz#a26186902ee56585b9db6751fd151237f561dbc2" - integrity sha512-9v0MUXnSi62FtfjqcwZ+b8B9FIxdwFEb3FPUkjEPXWd0b5KcnPGSp2XF9WrzcH1ZxedfgJVTdA3A1j4eEj53xg== - dependencies: - chokidar ">=3.0.0 <4.0.0" - -sax@>=0.6.0, sax@^1.2.4, sax@~1.2.4: +sax@^1.2.4, sax@~1.2.4: version "1.2.4" - resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" + resolved "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz" integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== saxes@^5.0.1: version "5.0.1" - resolved "https://registry.yarnpkg.com/saxes/-/saxes-5.0.1.tgz#eebab953fa3b7608dbe94e5dadb15c888fa6696d" + resolved "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz" integrity sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw== dependencies: xmlchars "^2.2.0" scheduler@^0.19.1: version "0.19.1" - resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.19.1.tgz#4f3e2ed2c1a7d65681f4c854fa8c5a1ccb40f196" + resolved "https://registry.npmjs.org/scheduler/-/scheduler-0.19.1.tgz" integrity sha512-n/zwRWRYSUj0/3g/otKDRPMh6qv2SYMWNq85IEa8iZyAv8od9zDYpGSnpBEjNgcMNq6Scbu5KfIPxNF72R/2EA== dependencies: loose-envify "^1.1.0" @@ -10014,16 +10067,34 @@ scheduler@^0.19.1: schema-utils@^2.6.5: version "2.7.1" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.7.1.tgz#1ca4f32d1b24c590c203b8e7a50bf0ea4cd394d7" + resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz" integrity sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg== dependencies: "@types/json-schema" "^7.0.5" ajv "^6.12.4" ajv-keywords "^3.5.2" -schema-utils@^3.0.0, schema-utils@^3.1.0, schema-utils@^3.1.1: +schema-utils@^3.0.0: version "3.1.1" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.1.1.tgz#bc74c4b6b6995c1d88f76a8b77bea7219e0c8281" + resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz" + integrity sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw== + dependencies: + "@types/json-schema" "^7.0.8" + ajv "^6.12.5" + ajv-keywords "^3.5.2" + +schema-utils@^3.1.0: + version "3.1.1" + resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz" + integrity sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw== + dependencies: + "@types/json-schema" "^7.0.8" + ajv "^6.12.5" + ajv-keywords "^3.5.2" + +schema-utils@^3.1.1: + version "3.1.1" + resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz" integrity sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw== dependencies: "@types/json-schema" "^7.0.8" @@ -10032,7 +10103,7 @@ schema-utils@^3.0.0, schema-utils@^3.1.0, schema-utils@^3.1.1: schema-utils@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-4.0.0.tgz#60331e9e3ae78ec5d16353c467c34b3a0a1d3df7" + resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz" integrity sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg== dependencies: "@types/json-schema" "^7.0.9" @@ -10042,55 +10113,95 @@ schema-utils@^4.0.0: select-hose@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca" + resolved "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz" integrity sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg== selfsigned@^2.0.0, selfsigned@^2.1.1: version "2.1.1" - resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-2.1.1.tgz#18a7613d714c0cd3385c48af0075abf3f266af61" + resolved "https://registry.npmjs.org/selfsigned/-/selfsigned-2.1.1.tgz" integrity sha512-GSL3aowiF7wa/WtSFwnUrludWFoNhftq8bUkH9pkzjpN2XSPOAYEgg6e0sS9s0rZwgJzJiQRPU18A6clnoW5wQ== dependencies: node-forge "^1" -semver@7.3.4: - version "7.3.4" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.4.tgz#27aaa7d2e4ca76452f98d3add093a72c943edc97" - integrity sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw== - dependencies: - lru-cache "^6.0.0" - -semver@7.3.5: - version "7.3.5" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7" - integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ== - dependencies: - lru-cache "^6.0.0" - -semver@^5.3.0, semver@^5.6.0, semver@^5.7.1: +semver@^5.6.0: version "5.7.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" + resolved "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz" + integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== + +semver@^5.7.1: + version "5.7.1" + resolved "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz" integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== semver@^6.0.0, semver@^6.1.1, semver@^6.1.2, semver@^6.3.0: version "6.3.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" + resolved "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== -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.3.8" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.8.tgz#07a78feafb3f7b32347d725e33de7e2a2df67798" - integrity sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A== +semver@^7.0.0: + version "7.4.0" + resolved "https://registry.npmjs.org/semver/-/semver-7.4.0.tgz" + integrity sha512-RgOxM8Mw+7Zus0+zcLEUn8+JfoLpj/huFTItQy2hsM4khuC1HYRDp0cU482Ewn/Fcy6bCjufD8vAj7voC66KQw== + dependencies: + lru-cache "^6.0.0" + +semver@^7.1.1: + version "7.4.0" + resolved "https://registry.npmjs.org/semver/-/semver-7.4.0.tgz" + integrity sha512-RgOxM8Mw+7Zus0+zcLEUn8+JfoLpj/huFTItQy2hsM4khuC1HYRDp0cU482Ewn/Fcy6bCjufD8vAj7voC66KQw== + dependencies: + lru-cache "^6.0.0" + +semver@^7.3.2: + version "7.4.0" + resolved "https://registry.npmjs.org/semver/-/semver-7.4.0.tgz" + integrity sha512-RgOxM8Mw+7Zus0+zcLEUn8+JfoLpj/huFTItQy2hsM4khuC1HYRDp0cU482Ewn/Fcy6bCjufD8vAj7voC66KQw== + dependencies: + lru-cache "^6.0.0" + +semver@^7.3.4: + version "7.4.0" + resolved "https://registry.npmjs.org/semver/-/semver-7.4.0.tgz" + integrity sha512-RgOxM8Mw+7Zus0+zcLEUn8+JfoLpj/huFTItQy2hsM4khuC1HYRDp0cU482Ewn/Fcy6bCjufD8vAj7voC66KQw== + dependencies: + lru-cache "^6.0.0" + +semver@^7.3.5, semver@7.3.5: + version "7.3.5" + resolved "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz" + integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ== + dependencies: + lru-cache "^6.0.0" + +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== + dependencies: + lru-cache "^6.0.0" + +semver@^7.3.8: + version "7.4.0" + resolved "https://registry.npmjs.org/semver/-/semver-7.4.0.tgz" + integrity sha512-RgOxM8Mw+7Zus0+zcLEUn8+JfoLpj/huFTItQy2hsM4khuC1HYRDp0cU482Ewn/Fcy6bCjufD8vAj7voC66KQw== dependencies: lru-cache "^6.0.0" semver@~7.0.0: version "7.0.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e" + resolved "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz" integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A== +semver@7.3.4: + version "7.3.4" + resolved "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz" + integrity sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw== + dependencies: + lru-cache "^6.0.0" + send@0.16.2: version "0.16.2" - resolved "https://registry.yarnpkg.com/send/-/send-0.16.2.tgz#6ecca1e0f8c156d141597559848df64730a6bbc1" + resolved "https://registry.npmjs.org/send/-/send-0.16.2.tgz" integrity sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw== dependencies: debug "2.6.9" @@ -10109,7 +10220,7 @@ send@0.16.2: send@0.18.0: version "0.18.0" - resolved "https://registry.yarnpkg.com/send/-/send-0.18.0.tgz#670167cc654b05f5aa4a767f9113bb371bc706be" + resolved "https://registry.npmjs.org/send/-/send-0.18.0.tgz" integrity sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg== dependencies: debug "2.6.9" @@ -10128,21 +10239,21 @@ send@0.18.0: serialize-javascript@^5.0.1: version "5.0.1" - resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-5.0.1.tgz#7886ec848049a462467a97d3d918ebb2aaf934f4" + resolved "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-5.0.1.tgz" integrity sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA== dependencies: randombytes "^2.1.0" -serialize-javascript@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.0.tgz#efae5d88f45d7924141da8b5c3a7a7e663fefeb8" - integrity sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag== +serialize-javascript@^6.0.0, serialize-javascript@^6.0.1: + version "6.0.1" + resolved "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz" + integrity sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w== dependencies: randombytes "^2.1.0" -serve-index@1.9.1, serve-index@^1.9.1: +serve-index@^1.9.1, serve-index@1.9.1: version "1.9.1" - resolved "https://registry.yarnpkg.com/serve-index/-/serve-index-1.9.1.tgz#d3768d69b1e7d82e5ce050fff5b453bea12a9239" + resolved "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz" integrity sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw== dependencies: accepts "~1.3.4" @@ -10153,19 +10264,9 @@ serve-index@1.9.1, serve-index@^1.9.1: mime-types "~2.1.17" parseurl "~1.3.2" -serve-static@1.13.2: - version "1.13.2" - resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.13.2.tgz#095e8472fd5b46237db50ce486a43f4b86c6cec1" - integrity sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw== - dependencies: - encodeurl "~1.0.2" - escape-html "~1.0.3" - parseurl "~1.3.2" - send "0.16.2" - -serve-static@1.15.0, serve-static@^1.14.1: +serve-static@^1.14.1, serve-static@1.15.0: version "1.15.0" - resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.15.0.tgz#faaef08cffe0a1a62f60cad0c4e513cff0ac9540" + resolved "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz" integrity sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g== dependencies: encodeurl "~1.0.2" @@ -10173,53 +10274,68 @@ serve-static@1.15.0, serve-static@^1.14.1: parseurl "~1.3.3" send "0.18.0" +serve-static@1.13.2: + version "1.13.2" + resolved "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz" + integrity sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw== + dependencies: + encodeurl "~1.0.2" + escape-html "~1.0.3" + parseurl "~1.3.2" + send "0.16.2" + server-destroy@1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/server-destroy/-/server-destroy-1.0.1.tgz#f13bf928e42b9c3e79383e61cc3998b5d14e6cdd" + resolved "https://registry.npmjs.org/server-destroy/-/server-destroy-1.0.1.tgz" integrity sha512-rb+9B5YBIEzYcD6x2VKidaa+cqYBJQKnU4oe4E3ANwRRN56yk/ua1YCJT1n21NTS8w6CcOclAKNP3PhdCXKYtQ== set-blocking@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" + resolved "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz" integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== setprototypeof@1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" + resolved "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz" integrity sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ== setprototypeof@1.2.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" + resolved "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz" integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== shallow-clone@^3.0.0: version "3.0.1" - resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-3.0.1.tgz#8f2981ad92531f55035b01fb230769a40e02efa3" + resolved "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz" integrity sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA== dependencies: kind-of "^6.0.2" shallowequal@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/shallowequal/-/shallowequal-1.1.0.tgz#188d521de95b9087404fd4dcb68b13df0ae4e7f8" + resolved "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz" integrity sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ== shebang-command@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz" integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== dependencies: shebang-regex "^3.0.0" shebang-regex@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz" integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== +shell-quote@^1.7.3: + version "1.8.1" + resolved "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz" + integrity sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA== + side-channel@^1.0.4: version "1.0.4" - resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" + resolved "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz" integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== dependencies: call-bind "^1.0.0" @@ -10228,19 +10344,19 @@ side-channel@^1.0.4: signal-exit@^3.0.2, signal-exit@^3.0.3, signal-exit@^3.0.7: version "3.0.7" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" + resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz" integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== simple-update-notifier@^1.0.7: version "1.1.0" - resolved "https://registry.yarnpkg.com/simple-update-notifier/-/simple-update-notifier-1.1.0.tgz#67694c121de354af592b347cdba798463ed49c82" + resolved "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-1.1.0.tgz" integrity sha512-VpsrsJSUcJEseSbMHkrsrAVSdvVS5I96Qo1QAQ4FxQ9wXFcB+pjj7FB7/us9+GcgfW4ziHtYMc1J0PLczb55mg== dependencies: semver "~7.0.0" sirv@^1.0.7: version "1.0.19" - resolved "https://registry.yarnpkg.com/sirv/-/sirv-1.0.19.tgz#1d73979b38c7fe91fcba49c85280daa9c2363b49" + resolved "https://registry.npmjs.org/sirv/-/sirv-1.0.19.tgz" integrity sha512-JuLThK3TnZG1TAKDwNIqNq6QA2afLOCcm+iE8D1Kj3GA40pSPsxQjjJl0J8X3tsR7T+CP1GavpzLwYkgVLWrZQ== dependencies: "@polka/url" "^1.0.0-next.20" @@ -10249,22 +10365,22 @@ sirv@^1.0.7: sisteransi@^1.0.5: version "1.0.5" - resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" + resolved "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz" integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== slash@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" + resolved "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz" integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== slash@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-4.0.0.tgz#2422372176c4c6c5addb5e2ada885af984b396a7" + resolved "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz" integrity sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew== slice-ansi@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-3.0.0.tgz#31ddc10930a1b7e0b67b08c96c2f49b77a789787" + resolved "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz" integrity sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ== dependencies: ansi-styles "^4.0.0" @@ -10273,7 +10389,7 @@ slice-ansi@^3.0.0: slice-ansi@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b" + resolved "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz" integrity sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ== dependencies: ansi-styles "^4.0.0" @@ -10282,52 +10398,54 @@ slice-ansi@^4.0.0: slick@^1.12.2: version "1.12.2" - resolved "https://registry.yarnpkg.com/slick/-/slick-1.12.2.tgz#bd048ddb74de7d1ca6915faa4a57570b3550c2d7" + resolved "https://registry.npmjs.org/slick/-/slick-1.12.2.tgz" integrity sha512-4qdtOGcBjral6YIBCWJ0ljFSKNLz9KkhbWtuGvUyRowl1kxfuE1x/Z/aJcaiilpb3do9bl5K7/1h9XC5wWpY/A== smart-buffer@^4.2.0: version "4.2.0" - resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-4.2.0.tgz#6e1d71fa4f18c05f7d0ff216dd16a481d0e8d9ae" + resolved "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz" integrity sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg== -socket.io-adapter@~2.4.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/socket.io-adapter/-/socket.io-adapter-2.4.0.tgz#b50a4a9ecdd00c34d4c8c808224daa1a786152a6" - integrity sha512-W4N+o69rkMEGVuk2D/cvca3uYsvGlMwsySWV447y99gUPghxq42BxqLNMndb+a1mm/5/7NeXVQS7RLa2XyXvYg== +socket.io-adapter@~2.5.2: + version "2.5.2" + resolved "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.2.tgz" + integrity sha512-87C3LO/NOMc+eMcpcxUBebGjkpMDkNBS9tf7KJqcDsmL936EChtVva71Dw2q4tQcuVC+hAUy4an2NO/sYXmwRA== + dependencies: + ws "~8.11.0" socket.io-client@^4.4.1: - version "4.5.4" - resolved "https://registry.yarnpkg.com/socket.io-client/-/socket.io-client-4.5.4.tgz#d3cde8a06a6250041ba7390f08d2468ccebc5ac9" - integrity sha512-ZpKteoA06RzkD32IbqILZ+Cnst4xewU7ZYK12aS1mzHftFFjpoMz69IuhP/nL25pJfao/amoPI527KnuhFm01g== + version "4.6.1" + resolved "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.6.1.tgz" + integrity sha512-5UswCV6hpaRsNg5kkEHVcbBIXEYoVbMQaHJBXJCyEQ+CiFPV1NIOY0XOFWG4XR4GZcB8Kn6AsRs/9cy9TbqVMQ== dependencies: "@socket.io/component-emitter" "~3.1.0" debug "~4.3.2" - engine.io-client "~6.2.3" + engine.io-client "~6.4.0" socket.io-parser "~4.2.1" socket.io-parser@~4.2.1: - version "4.2.1" - resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-4.2.1.tgz#01c96efa11ded938dcb21cbe590c26af5eff65e5" - integrity sha512-V4GrkLy+HeF1F/en3SpUaM+7XxYXpuMUWLGde1kSSh5nQMN4hLrbPIkD+otwh6q9R6NOQBN4AMaOZ2zVjui82g== + version "4.2.2" + resolved "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.2.tgz" + integrity sha512-DJtziuKypFkMMHCm2uIshOYC7QaylbtzQwiMYDuCKy3OPkjLzu4B2vAhTlqipRHHzrI0NJeBAizTK7X+6m1jVw== dependencies: "@socket.io/component-emitter" "~3.1.0" debug "~4.3.1" socket.io@^4.4.1: - version "4.5.4" - resolved "https://registry.yarnpkg.com/socket.io/-/socket.io-4.5.4.tgz#a4513f06e87451c17013b8d13fdfaf8da5a86a90" - integrity sha512-m3GC94iK9MfIEeIBfbhJs5BqFibMtkRk8ZpKwG2QwxV0m/eEhPIV4ara6XCF1LWNAus7z58RodiZlAH71U3EhQ== + version "4.6.1" + resolved "https://registry.npmjs.org/socket.io/-/socket.io-4.6.1.tgz" + integrity sha512-KMcaAi4l/8+xEjkRICl6ak8ySoxsYG+gG6/XfRCPJPQ/haCRIJBTL4wIl8YCsmtaBovcAXGLOShyVWQ/FG8GZA== dependencies: accepts "~1.3.4" base64id "~2.0.0" debug "~4.3.2" - engine.io "~6.2.1" - socket.io-adapter "~2.4.0" + engine.io "~6.4.1" + socket.io-adapter "~2.5.2" socket.io-parser "~4.2.1" sockjs@^0.3.21, sockjs@^0.3.24: version "0.3.24" - resolved "https://registry.yarnpkg.com/sockjs/-/sockjs-0.3.24.tgz#c9bc8995f33a111bea0395ec30aa3206bdb5ccce" + resolved "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz" integrity sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ== dependencies: faye-websocket "^0.11.3" @@ -10336,7 +10454,7 @@ sockjs@^0.3.21, sockjs@^0.3.24: socks-proxy-agent@^6.0.0: version "6.2.1" - resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-6.2.1.tgz#2687a31f9d7185e38d530bef1944fe1f1496d6ce" + resolved "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-6.2.1.tgz" integrity sha512-a6KW9G+6B3nWZ1yB8G7pJwL3ggLy1uTzKAgCb7ttblwqdz9fMGJUuTy3uFzEP48FAs9FLILlmzDlE2JJhVQaXQ== dependencies: agent-base "^6.0.2" @@ -10345,7 +10463,7 @@ socks-proxy-agent@^6.0.0: socks-proxy-agent@^7.0.0: version "7.0.0" - resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz#dc069ecf34436621acb41e3efa66ca1b5fed15b6" + resolved "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz" integrity sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww== dependencies: agent-base "^6.0.2" @@ -10354,30 +10472,30 @@ socks-proxy-agent@^7.0.0: socks@^2.6.2: version "2.7.1" - resolved "https://registry.yarnpkg.com/socks/-/socks-2.7.1.tgz#d8e651247178fde79c0663043e07240196857d55" + resolved "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz" integrity sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ== dependencies: ip "^2.0.0" smart-buffer "^4.2.0" -sortablejs@1.13.0: +sortablejs@>=1.7.0, sortablejs@1.13.0: version "1.13.0" - resolved "https://registry.yarnpkg.com/sortablejs/-/sortablejs-1.13.0.tgz#3ab2473f8c69ca63569e80b1cd1b5669b51269e9" + resolved "https://registry.npmjs.org/sortablejs/-/sortablejs-1.13.0.tgz" integrity sha512-RBJirPY0spWCrU5yCmWM1eFs/XgX2J5c6b275/YyxFRgnzPhKl/TDeU2hNR8Dt7ITq66NRPM4UlOt+e5O4CFHg== source-list-map@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.1.tgz#3993bd873bfc48479cca9ea3a547835c7c154b34" + resolved "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz" integrity sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw== -"source-map-js@>=0.6.2 <2.0.0", source-map-js@^1.0.1, source-map-js@^1.0.2: +source-map-js@^1.0.1, source-map-js@^1.0.2, "source-map-js@>=0.6.2 <2.0.0": version "1.0.2" - resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" + resolved "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz" integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== source-map-loader@3.0.1: version "3.0.1" - resolved "https://registry.yarnpkg.com/source-map-loader/-/source-map-loader-3.0.1.tgz#9ae5edc7c2d42570934be4c95d1ccc6352eba52d" + resolved "https://registry.npmjs.org/source-map-loader/-/source-map-loader-3.0.1.tgz" integrity sha512-Vp1UsfyPvgujKQzi4pyDiTOnE3E4H+yHvkVRN3c/9PJmQS4CQJExvcDvaX/D+RV+xQben9HJ56jMJS3CgUeWyA== dependencies: abab "^2.0.5" @@ -10386,71 +10504,71 @@ source-map-loader@3.0.1: source-map-resolve@^0.6.0: version "0.6.0" - resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.6.0.tgz#3d9df87e236b53f16d01e58150fc7711138e5ed2" + resolved "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.6.0.tgz" integrity sha512-KXBr9d/fO/bWo97NXsPIAW1bFSBOuCnjbNTBMO7N59hsv5i9yzRDfcYwwt0l04+VqnKC+EwzvJZIP/qkuMgR/w== dependencies: atob "^2.1.2" decode-uri-component "^0.2.0" -source-map-support@0.5.21, source-map-support@^0.5.17, source-map-support@^0.5.5, source-map-support@~0.5.20: +source-map-support@^0.5.17, source-map-support@^0.5.5, source-map-support@~0.5.20, source-map-support@0.5.21: version "0.5.21" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" + resolved "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz" integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== dependencies: buffer-from "^1.0.0" source-map "^0.6.0" -source-map@0.5.6: - version "0.5.6" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.6.tgz#75ce38f52bf0733c5a7f0c118d81334a2bb5f412" - integrity sha512-MjZkVp0NHr5+TPihLcadqnlVoGIoWo4IBHptutGh9wI3ttUYvCG26HkSuDi+K6lsZ25syXJXcctwgyVCt//xqA== - -source-map@0.6.1, source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" - integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== - -source-map@0.7.3: - version "0.7.3" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383" - integrity sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ== - source-map@^0.5.0: version "0.5.7" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz" integrity sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ== +source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1, source-map@0.6.1: + version "0.6.1" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + source-map@^0.7.3: version "0.7.4" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.4.tgz#a9bbe705c9d8846f4e08ff6765acf0f1b0898656" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz" integrity sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA== +source-map@0.5.6: + version "0.5.6" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz" + integrity sha512-MjZkVp0NHr5+TPihLcadqnlVoGIoWo4IBHptutGh9wI3ttUYvCG26HkSuDi+K6lsZ25syXJXcctwgyVCt//xqA== + +source-map@0.7.3: + version "0.7.3" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz" + integrity sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ== + sourcemap-codec@^1.4.4, sourcemap-codec@^1.4.8: version "1.4.8" - resolved "https://registry.yarnpkg.com/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz#ea804bd94857402e6992d05a38ef1ae35a9ab4c4" + resolved "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz" integrity sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA== spdx-exceptions@^2.1.0: version "2.3.0" - resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz#3f28ce1a77a00372683eade4a433183527a2163d" + resolved "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz" integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A== spdx-expression-parse@^3.0.1: version "3.0.1" - resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679" + resolved "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz" integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q== dependencies: spdx-exceptions "^2.1.0" spdx-license-ids "^3.0.0" spdx-license-ids@^3.0.0: - version "3.0.12" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.12.tgz#69077835abe2710b65f03969898b6637b505a779" - integrity sha512-rr+VVSXtRhO4OHbXUiAF7xW3Bo9DuuF6C5jH+q/x15j2jniycgKbxU09Hr0WqlSLUs4i4ltHGXqTe7VHclYWyA== + version "3.0.13" + resolved "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.13.tgz" + integrity sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w== spdy-transport@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/spdy-transport/-/spdy-transport-3.0.0.tgz#00d4863a6400ad75df93361a1608605e5dcdcf31" + resolved "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz" integrity sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw== dependencies: debug "^4.1.0" @@ -10462,7 +10580,7 @@ spdy-transport@^3.0.0: spdy@^4.0.2: version "4.0.2" - resolved "https://registry.yarnpkg.com/spdy/-/spdy-4.0.2.tgz#b74f466203a3eda452c02492b91fb9e84a27677b" + resolved "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz" integrity sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA== dependencies: debug "^4.1.0" @@ -10473,7 +10591,7 @@ spdy@^4.0.2: speech-rule-engine@^4.0.6: version "4.0.7" - resolved "https://registry.yarnpkg.com/speech-rule-engine/-/speech-rule-engine-4.0.7.tgz#b655dacbad3dae04acc0f7665e26ef258397dd09" + resolved "https://registry.npmjs.org/speech-rule-engine/-/speech-rule-engine-4.0.7.tgz" integrity sha512-sJrL3/wHzNwJRLBdf6CjJWIlxC04iYKkyXvYSVsWVOiC2DSkHmxsqOhEeMsBA9XK+CHuNcsdkbFDnoUfAsmp9g== dependencies: commander "9.2.0" @@ -10482,12 +10600,12 @@ speech-rule-engine@^4.0.6: sprintf-js@~1.0.2: version "1.0.3" - resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + resolved "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz" integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== -sshpk@^1.14.1, sshpk@^1.7.0: +sshpk@^1.14.1: version "1.17.0" - resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.17.0.tgz#578082d92d4fe612b13007496e543fa0fbcbe4c5" + resolved "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz" integrity sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ== dependencies: asn1 "~0.2.3" @@ -10502,155 +10620,157 @@ sshpk@^1.14.1, sshpk@^1.7.0: ssri@^8.0.0, ssri@^8.0.1: version "8.0.1" - resolved "https://registry.yarnpkg.com/ssri/-/ssri-8.0.1.tgz#638e4e439e2ffbd2cd289776d5ca457c4f51a2af" + resolved "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz" integrity sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ== dependencies: minipass "^3.1.1" ssri@^9.0.0: version "9.0.1" - resolved "https://registry.yarnpkg.com/ssri/-/ssri-9.0.1.tgz#544d4c357a8d7b71a19700074b6883fcb4eae057" + resolved "https://registry.npmjs.org/ssri/-/ssri-9.0.1.tgz" integrity sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q== dependencies: minipass "^3.1.1" stackframe@^1.3.4: version "1.3.4" - resolved "https://registry.yarnpkg.com/stackframe/-/stackframe-1.3.4.tgz#b881a004c8c149a5e8efef37d51b16e412943310" + resolved "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz" integrity sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw== stacktrace-gps@^3.0.2: version "3.1.2" - resolved "https://registry.yarnpkg.com/stacktrace-gps/-/stacktrace-gps-3.1.2.tgz#0c40b24a9b119b20da4525c398795338966a2fb0" + resolved "https://registry.npmjs.org/stacktrace-gps/-/stacktrace-gps-3.1.2.tgz" integrity sha512-GcUgbO4Jsqqg6RxfyTHFiPxdPqF+3LFmQhm7MgCuYQOYuWyqxo5pwRPz5d/u6/WYJdEnWfK4r+jGbyD8TSggXQ== dependencies: source-map "0.5.6" stackframe "^1.3.4" -statuses@2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" - integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== - -"statuses@>= 1.4.0 < 2", statuses@~1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" - integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA== +"statuses@>= 1.4.0 < 2", statuses@~1.4.0: + version "1.4.0" + resolved "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz" + integrity sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew== statuses@~1.3.1: version "1.3.1" - resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.3.1.tgz#faf51b9eb74aaef3b3acf4ad5f61abf24cb7b93e" + resolved "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz" integrity sha512-wuTCPGlJONk/a1kqZ4fQM2+908lC7fa7nPYpTC1EhnvqLX/IICbeP1OZGDtA374trpSq68YubKUMo8oRhN46yg== -statuses@~1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.4.0.tgz#bb73d446da2796106efcc1b601a253d6c46bd087" - integrity sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew== +statuses@~1.5.0: + version "1.5.0" + resolved "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz" + integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA== + +statuses@2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz" + integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== stream-throttle@^0.1.3: version "0.1.3" - resolved "https://registry.yarnpkg.com/stream-throttle/-/stream-throttle-0.1.3.tgz#add57c8d7cc73a81630d31cd55d3961cfafba9c3" + resolved "https://registry.npmjs.org/stream-throttle/-/stream-throttle-0.1.3.tgz" integrity sha512-889+B9vN9dq7/vLbGyuHeZ6/ctf5sNuGWsDy89uNxkFTAgzy0eK7+w5fL3KLNRTkLle7EgZGvHUphZW0Q26MnQ== dependencies: commander "^2.2.0" limiter "^1.0.5" -streamroller@^3.1.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/streamroller/-/streamroller-3.1.3.tgz#d95689a8c29b30d093525d0baffe6616fd62ca7e" - integrity sha512-CphIJyFx2SALGHeINanjFRKQ4l7x2c+rXYJ4BMq0gd+ZK0gi4VT8b+eHe2wi58x4UayBAKx4xtHpXT/ea1cz8w== +streamroller@^3.1.5: + version "3.1.5" + resolved "https://registry.npmjs.org/streamroller/-/streamroller-3.1.5.tgz" + integrity sha512-KFxaM7XT+irxvdqSP1LGLgNWbYN7ay5owZ3r/8t77p+EtSUAfUgtl7be3xtqtOmGUl9K9YPO2ca8133RlTjvKw== dependencies: date-format "^4.0.14" debug "^4.3.4" fs-extra "^8.1.0" -"string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: - version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - -string.prototype.trimend@^1.0.5: - version "1.0.6" - resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz#c4a27fa026d979d79c04f17397f250a462944533" - integrity sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" - -string.prototype.trimstart@^1.0.5: - version "1.0.6" - resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz#e90ab66aa8e4007d92ef591bbf3cd422c56bdcf4" - integrity sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" - string_decoder@^1.1.1: version "1.3.0" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" + resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz" integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== dependencies: safe-buffer "~5.2.0" string_decoder@~1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz" integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== dependencies: safe-buffer "~5.1.0" -strip-ansi@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" - integrity sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg== +"string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: + version "4.2.3" + resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== dependencies: - ansi-regex "^2.0.0" + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +string.prototype.trim@^1.2.7: + version "1.2.7" + resolved "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz" + integrity sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + +string.prototype.trimend@^1.0.6: + version "1.0.6" + resolved "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz" + integrity sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + +string.prototype.trimstart@^1.0.6: + version "1.0.6" + resolved "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz" + integrity sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" strip-ansi@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz" integrity sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow== dependencies: ansi-regex "^3.0.0" strip-ansi@^6.0.0, strip-ansi@^6.0.1: version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== dependencies: ansi-regex "^5.0.1" strip-ansi@^7.0.0: version "7.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.0.1.tgz#61740a08ce36b61e50e65653f07060d000975fb2" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz" integrity sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw== dependencies: ansi-regex "^6.0.1" strip-bom@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" + resolved "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz" integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== strip-final-newline@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" + resolved "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz" integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== -strip-json-comments@3.1.1, strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: +strip-json-comments@^3.1.0, strip-json-comments@^3.1.1, strip-json-comments@3.1.1: version "3.1.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== strong-log-transformer@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/strong-log-transformer/-/strong-log-transformer-2.1.0.tgz#0f5ed78d325e0421ac6f90f7f10e691d6ae3ae10" + resolved "https://registry.npmjs.org/strong-log-transformer/-/strong-log-transformer-2.1.0.tgz" integrity sha512-B3Hgul+z0L9a236FAUC9iZsL+nVHgoCJnqCbN588DjYxvGXaXaaFbfmQ/JhvKjZwsOukuR72XbHv71Qkug0HxA== dependencies: duplexer "^0.1.1" @@ -10659,16 +10779,16 @@ strong-log-transformer@^2.1.0: stylus-loader@6.2.0: version "6.2.0" - resolved "https://registry.yarnpkg.com/stylus-loader/-/stylus-loader-6.2.0.tgz#0ba499e744e7fb9d9b3977784c8639728a7ced8c" + resolved "https://registry.npmjs.org/stylus-loader/-/stylus-loader-6.2.0.tgz" integrity sha512-5dsDc7qVQGRoc6pvCL20eYgRUxepZ9FpeK28XhdXaIPP6kXr6nI1zAAKFQgP5OBkOfKaURp4WUpJzspg1f01Gg== dependencies: fast-glob "^3.2.7" klona "^2.0.4" normalize-path "^3.0.0" -stylus@0.56.0: +stylus@>=0.52.4, stylus@0.56.0: version "0.56.0" - resolved "https://registry.yarnpkg.com/stylus/-/stylus-0.56.0.tgz#13fc85c48082db483c90d2530942fe8b0be988eb" + resolved "https://registry.npmjs.org/stylus/-/stylus-0.56.0.tgz" integrity sha512-Ev3fOb4bUElwWu4F9P9WjnnaSpc8XB9OFHSFZSKMFL1CE1oM+oFXWEgAqPmmZIyhBihuqIQlFsVTypiiS9RxeA== dependencies: css "^3.0.0" @@ -10678,60 +10798,57 @@ stylus@0.56.0: sax "~1.2.4" source-map "^0.7.3" -supports-color@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" - integrity sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g== - supports-color@^5.3.0, supports-color@^5.4.0, supports-color@^5.5.0: version "5.5.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz" integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== dependencies: has-flag "^3.0.0" supports-color@^7.1.0: version "7.2.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz" integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== dependencies: has-flag "^4.0.0" -supports-color@^8.0.0, supports-color@^8.1.1: +supports-color@^8.0.0: version "8.1.1" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz" + integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== + dependencies: + has-flag "^4.0.0" + +supports-color@^8.1.1: + version "8.1.1" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz" integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== dependencies: has-flag "^4.0.0" supports-preserve-symlinks-flag@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" + resolved "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz" integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== -symbol-observable@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.0.1.tgz#8340fc4702c3122df5d22288f88283f513d3fdd4" - integrity sha512-Kb3PrPYz4HanVF1LVGuAdW6LoVgIwjUYJGzFe7NDrBLCN4lsV/5J0MFurV+ygS4bRVwrCEt2c7MQ1R2a72oJDw== - symbol-observable@4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-4.0.0.tgz#5b425f192279e87f2f9b937ac8540d1984b39205" + resolved "https://registry.npmjs.org/symbol-observable/-/symbol-observable-4.0.0.tgz" integrity sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ== symbol-tree@^3.2.4: version "3.2.4" - resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" + resolved "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz" integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== tapable@^2.1.1, tapable@^2.2.0: version "2.2.1" - resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" + resolved "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz" integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== tar-stream@~2.2.0: version "2.2.0" - resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.2.0.tgz#acad84c284136b060dc3faa64474aa9aebd77287" + resolved "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz" integrity sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ== dependencies: bl "^4.0.3" @@ -10741,42 +10858,42 @@ tar-stream@~2.2.0: readable-stream "^3.1.1" tar@^6.0.2, tar@^6.1.0, tar@^6.1.11, tar@^6.1.2: - version "6.1.12" - resolved "https://registry.yarnpkg.com/tar/-/tar-6.1.12.tgz#3b742fb05669b55671fb769ab67a7791ea1a62e6" - integrity sha512-jU4TdemS31uABHd+Lt5WEYJuzn+TJTCBLljvIAHZOz6M9Os5pJ4dD+vRFLxPa/n3T0iEFzpi+0x1UfuDZYbRMw== + version "6.1.13" + resolved "https://registry.npmjs.org/tar/-/tar-6.1.13.tgz" + integrity sha512-jdIBIN6LTIe2jqzay/2vtYLlBHa3JF42ot3h1dW8Q0PaAG4v8rm0cvpVePtau5C6OKXGGcgO9q2AMNSWxiLqKw== dependencies: chownr "^2.0.0" fs-minipass "^2.0.0" - minipass "^3.0.0" + minipass "^4.0.0" minizlib "^2.1.1" mkdirp "^1.0.3" yallist "^4.0.0" terser-webpack-plugin@^5.1.3: - version "5.3.6" - resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.6.tgz#5590aec31aa3c6f771ce1b1acca60639eab3195c" - integrity sha512-kfLFk+PoLUQIbLmB1+PZDMRSZS99Mp+/MHqDNmMA6tOItzRt+Npe3E+fsMs5mfcM0wCtrrdU387UnV+vnSffXQ== + version "5.3.7" + resolved "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.7.tgz" + integrity sha512-AfKwIktyP7Cu50xNjXF/6Qb5lBNzYaWpU6YfoX3uZicTx0zTy0stDDCsvjDapKsSDvOeWo5MEq4TmdBy2cNoHw== dependencies: - "@jridgewell/trace-mapping" "^0.3.14" + "@jridgewell/trace-mapping" "^0.3.17" jest-worker "^27.4.5" schema-utils "^3.1.1" - serialize-javascript "^6.0.0" - terser "^5.14.1" + serialize-javascript "^6.0.1" + terser "^5.16.5" -terser@5.14.2: - version "5.14.2" - resolved "https://registry.yarnpkg.com/terser/-/terser-5.14.2.tgz#9ac9f22b06994d736174f4091aa368db896f1c10" - integrity sha512-oL0rGeM/WFQCUd0y2QrWxYnq7tfSuKBiqTjRPWrRgB46WD/kiwHwF8T23z78H6Q6kGCuuHcPB+KULHRdxvVGQA== +terser@^5.16.5: + version "5.16.9" + resolved "https://registry.npmjs.org/terser/-/terser-5.16.9.tgz" + integrity sha512-HPa/FdTB9XGI2H1/keLFZHxl6WNvAI4YalHGtDQTlMnJcoqSab1UwL4l1hGEhs6/GmLHBZIg/YgB++jcbzoOEg== dependencies: "@jridgewell/source-map" "^0.3.2" acorn "^8.5.0" commander "^2.20.0" source-map-support "~0.5.20" -terser@^5.14.1: - version "5.16.1" - resolved "https://registry.yarnpkg.com/terser/-/terser-5.16.1.tgz#5af3bc3d0f24241c7fb2024199d5c461a1075880" - integrity sha512-xvQfyfA1ayT0qdK47zskQgRZeWLoOQ8JQ6mIgRGVNwZKdQMU+5FkCBjmv4QjcrTzyZquRw2FVtlJSRUmMKQslw== +terser@5.14.2: + version "5.14.2" + resolved "https://registry.npmjs.org/terser/-/terser-5.14.2.tgz" + integrity sha512-oL0rGeM/WFQCUd0y2QrWxYnq7tfSuKBiqTjRPWrRgB46WD/kiwHwF8T23z78H6Q6kGCuuHcPB+KULHRdxvVGQA== dependencies: "@jridgewell/source-map" "^0.3.2" acorn "^8.5.0" @@ -10785,107 +10902,113 @@ terser@^5.14.1: test-exclude@^6.0.0: version "6.0.0" - resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e" + resolved "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz" integrity sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w== dependencies: "@istanbuljs/schema" "^0.1.2" glob "^7.1.4" minimatch "^3.0.4" -text-table@0.2.0, text-table@^0.2.0: +text-table@^0.2.0, text-table@0.2.0: version "0.2.0" - resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + resolved "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz" integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== -tfunk@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/tfunk/-/tfunk-4.0.0.tgz#de9399feaf2060901d590b7faad80fcd5443077e" - integrity sha512-eJQ0dGfDIzWNiFNYFVjJ+Ezl/GmwHaFTBTjrtqNPW0S7cuVDBrZrmzUz6VkMeCR4DZFqhd4YtLwsw3i2wYHswQ== - dependencies: - chalk "^1.1.3" - dlv "^1.1.3" - throttle-debounce@^2.1.0: version "2.3.0" - resolved "https://registry.yarnpkg.com/throttle-debounce/-/throttle-debounce-2.3.0.tgz#fd31865e66502071e411817e241465b3e9c372e2" + resolved "https://registry.npmjs.org/throttle-debounce/-/throttle-debounce-2.3.0.tgz" integrity sha512-H7oLPV0P7+jgvrk+6mwwwBDmxTaxnu9HMXmloNLXwnNO0ZxZ31Orah2n8lU1eMPvsaowP2CX+USCgyovXfdOFQ== throttleit@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/throttleit/-/throttleit-1.0.0.tgz#9e785836daf46743145a5984b6268d828528ac6c" + resolved "https://registry.npmjs.org/throttleit/-/throttleit-1.0.0.tgz" integrity sha512-rkTVqu6IjfQ/6+uNuuc3sZek4CEYxTJom3IktzgdSxcZqdARuebbA/f4QmAxMQIxqq9ZLEUkSYqvuk1I6VKq4g== through@^2.3.4, through@^2.3.6, through@^2.3.8: version "2.3.8" - resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + resolved "https://registry.npmjs.org/through/-/through-2.3.8.tgz" integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== thunky@^1.0.2: version "1.1.0" - resolved "https://registry.yarnpkg.com/thunky/-/thunky-1.1.0.tgz#5abaf714a9405db0504732bbccd2cedd9ef9537d" + resolved "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz" integrity sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA== tiny-invariant@^1.0.6: version "1.3.1" - resolved "https://registry.yarnpkg.com/tiny-invariant/-/tiny-invariant-1.3.1.tgz#8560808c916ef02ecfd55e66090df23a4b7aa642" + resolved "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.1.tgz" integrity sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw== tiny-warning@^1.0.2: version "1.0.3" - resolved "https://registry.yarnpkg.com/tiny-warning/-/tiny-warning-1.0.3.tgz#94a30db453df4c643d0fd566060d60a875d84754" + resolved "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz" integrity sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA== -tmp@0.2.1, tmp@^0.2.1, tmp@~0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.1.tgz#8457fc3037dcf4719c251367a1af6500ee1ccf14" - integrity sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ== - dependencies: - rimraf "^3.0.0" - tmp@^0.0.33: version "0.0.33" - resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" + resolved "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz" integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== dependencies: os-tmpdir "~1.0.2" +tmp@^0.2.1: + version "0.2.1" + resolved "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz" + integrity sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ== + dependencies: + rimraf "^3.0.0" + +tmp@~0.2.1: + version "0.2.1" + resolved "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz" + integrity sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ== + dependencies: + rimraf "^3.0.0" + +tmp@0.2.1: + version "0.2.1" + resolved "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz" + integrity sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ== + dependencies: + rimraf "^3.0.0" + to-fast-properties@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" + resolved "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz" integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== to-regex-range@^5.0.1: version "5.0.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + resolved "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz" integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== dependencies: is-number "^7.0.0" toggle-selection@^1.0.6: version "1.0.6" - resolved "https://registry.yarnpkg.com/toggle-selection/-/toggle-selection-1.0.6.tgz#6e45b1263f2017fa0acc7d89d78b15b8bf77da32" + resolved "https://registry.npmjs.org/toggle-selection/-/toggle-selection-1.0.6.tgz" integrity sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ== toidentifier@1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" + resolved "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz" integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== totalist@^1.0.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/totalist/-/totalist-1.1.0.tgz#a4d65a3e546517701e3e5c37a47a70ac97fe56df" + resolved "https://registry.npmjs.org/totalist/-/totalist-1.1.0.tgz" integrity sha512-gduQwd1rOdDMGxFG1gEvhV88Oirdo2p+KjoYFU7k2g+i7n6AFFbDQ5kMPUsW0pNbfQsB/cwXvT1i4Bue0s9g5g== touch@^3.1.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/touch/-/touch-3.1.0.tgz#fe365f5f75ec9ed4e56825e0bb76d24ab74af83b" + resolved "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz" integrity sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA== dependencies: nopt "~1.0.10" tough-cookie@^4.0.0: version "4.1.2" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.1.2.tgz#e53e84b85f24e0b65dd526f46628db6c85f6b874" + resolved "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.2.tgz" integrity sha512-G9fqXWoYFZgTc2z8Q5zaHy/vJMjm+WV0AkAeHxVCQiEB1b+dGvWzFW6QV07cY5jQ5gRkeid2qIkzkxUnmoQZUQ== dependencies: psl "^1.1.33" @@ -10895,7 +11018,7 @@ tough-cookie@^4.0.0: tough-cookie@~2.5.0: version "2.5.0" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" + resolved "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz" integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== dependencies: psl "^1.1.28" @@ -10903,34 +11026,34 @@ tough-cookie@~2.5.0: tr46@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-2.1.0.tgz#fa87aa81ca5d5941da8cbf1f9b749dc969a4e240" + resolved "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz" integrity sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw== dependencies: punycode "^2.1.1" tr46@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-3.0.0.tgz#555c4e297a950617e8eeddef633c87d4d9d6cbf9" + resolved "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz" integrity sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA== dependencies: punycode "^2.1.1" tr46@~0.0.3: version "0.0.3" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" + resolved "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz" integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== -tree-kill@1.2.2, tree-kill@^1.2.2: +tree-kill@^1.2.2, tree-kill@1.2.2: version "1.2.2" - resolved "https://registry.yarnpkg.com/tree-kill/-/tree-kill-1.2.2.tgz#4ca09a9092c88b73a7cdc5e8a01b507b0790a0cc" + resolved "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz" integrity sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A== -ts-node@10.2.1, ts-node@^10.0.0: - version "10.2.1" - resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.2.1.tgz#4cc93bea0a7aba2179497e65bb08ddfc198b3ab5" - integrity sha512-hCnyOyuGmD5wHleOQX6NIjJtYVIO8bPP8F2acWkB4W06wdlkgyvJtubO/I9NkI88hCFECbsEgoLc0VNkYmcSfw== +ts-node@^10.0.0: + version "10.9.1" + resolved "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz" + integrity sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw== dependencies: - "@cspotcode/source-map-support" "0.6.1" + "@cspotcode/source-map-support" "^0.8.0" "@tsconfig/node10" "^1.0.7" "@tsconfig/node12" "^1.0.7" "@tsconfig/node14" "^1.0.0" @@ -10941,11 +11064,12 @@ ts-node@10.2.1, ts-node@^10.0.0: create-require "^1.1.0" diff "^4.0.1" make-error "^1.1.1" + v8-compile-cache-lib "^3.0.1" yn "3.1.1" ts-node@^8.10.2: version "8.10.2" - resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-8.10.2.tgz#eee03764633b1234ddd37f8db9ec10b75ec7fb8d" + resolved "https://registry.npmjs.org/ts-node/-/ts-node-8.10.2.tgz" integrity sha512-ISJJGgkIpDdBhWVu3jufsWpK3Rzo7bdiIXJjQc0ynKxVOVcg2oIrf2H2cejminGrptVc6q6/uynAHNCuWGbpVA== dependencies: arg "^4.1.0" @@ -10955,143 +11079,156 @@ ts-node@^8.10.2: yn "3.1.1" tsconfig-paths@^3.14.1, tsconfig-paths@^3.9.0: - version "3.14.1" - resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz#ba0734599e8ea36c862798e920bcf163277b137a" - integrity sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ== + version "3.14.2" + resolved "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz" + integrity sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g== dependencies: "@types/json5" "^0.0.29" - json5 "^1.0.1" + json5 "^1.0.2" minimist "^1.2.6" strip-bom "^3.0.0" -tslib@2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.3.1.tgz#e8a335add5ceae51aa261d32a490158ef042ef01" - integrity sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw== +tsconfig-paths@^4.1.2: + version "4.2.0" + resolved "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz" + integrity sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg== + dependencies: + json5 "^2.2.2" + minimist "^1.2.6" + strip-bom "^3.0.0" -tslib@^1.8.1, tslib@^1.9.0: +tslib@^1.8.1: version "1.14.1" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" + resolved "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== -tslib@^2.0.0, tslib@^2.0.3, tslib@^2.2.0, tslib@^2.3.0, tslib@^2.3.1, tslib@^2.4.0: - version "2.4.1" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.4.1.tgz#0d0bfbaac2880b91e22df0768e55be9753a5b17e" - integrity sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA== +tslib@^1.9.0: + version "1.14.1" + resolved "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz" + integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== -tslib@^2.1.0: +tslib@^2.0.0, tslib@^2.0.3, tslib@^2.1.0, tslib@^2.2.0, tslib@^2.3.0, tslib@^2.3.1, tslib@^2.4.0: version "2.5.0" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.5.0.tgz#42bfed86f5787aeb41d031866c8f402429e0fddf" + resolved "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz" integrity sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg== +tslib@2.3.1: + version "2.3.1" + resolved "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz" + integrity sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw== + tsutils@^3.21.0: version "3.21.0" - resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" + resolved "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz" integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA== dependencies: tslib "^1.8.1" tunnel-agent@^0.6.0: version "0.6.0" - resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" + resolved "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz" integrity sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w== dependencies: safe-buffer "^5.0.1" tweetnacl@^0.14.3, tweetnacl@~0.14.0: version "0.14.5" - resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" + resolved "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz" integrity sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA== type-check@^0.4.0, type-check@~0.4.0: version "0.4.0" - resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" + resolved "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz" integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== dependencies: prelude-ls "^1.2.1" type-check@~0.3.2: version "0.3.2" - resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" + resolved "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz" integrity sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg== dependencies: prelude-ls "~1.1.2" type-fest@^0.20.2: version "0.20.2" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz" integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== type-fest@^0.21.3: version "0.21.3" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz" integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== type-is@~1.6.18: version "1.6.18" - resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" + resolved "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz" integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== dependencies: media-typer "0.3.0" mime-types "~2.1.24" +typed-array-length@^1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz" + integrity sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng== + dependencies: + call-bind "^1.0.2" + for-each "^0.3.3" + is-typed-array "^1.1.9" + typed-assert@^1.0.8: version "1.0.9" - resolved "https://registry.yarnpkg.com/typed-assert/-/typed-assert-1.0.9.tgz#8af9d4f93432c4970ec717e3006f33f135b06213" + resolved "https://registry.npmjs.org/typed-assert/-/typed-assert-1.0.9.tgz" integrity sha512-KNNZtayBCtmnNmbo5mG47p1XsCyrx6iVqomjcZnec/1Y5GGARaxPs6r49RnSPeUP3YjNYiU9sQHAtY4BBvnZwg== typescript-compare@^0.0.2: version "0.0.2" - resolved "https://registry.yarnpkg.com/typescript-compare/-/typescript-compare-0.0.2.tgz#7ee40a400a406c2ea0a7e551efd3309021d5f425" + resolved "https://registry.npmjs.org/typescript-compare/-/typescript-compare-0.0.2.tgz" integrity sha512-8ja4j7pMHkfLJQO2/8tut7ub+J3Lw2S3061eJLFQcvs3tsmJKp8KG5NtpLn7KcY2w08edF74BSVN7qJS0U6oHA== dependencies: typescript-logic "^0.0.0" typescript-logic@^0.0.0: version "0.0.0" - resolved "https://registry.yarnpkg.com/typescript-logic/-/typescript-logic-0.0.0.tgz#66ebd82a2548f2b444a43667bec120b496890196" + resolved "https://registry.npmjs.org/typescript-logic/-/typescript-logic-0.0.0.tgz" integrity sha512-zXFars5LUkI3zP492ls0VskH3TtdeHCqu0i7/duGt60i5IGPIpAHE/DWo5FqJ6EjQ15YKXrt+AETjv60Dat34Q== typescript-tuple@^2.2.1: version "2.2.1" - resolved "https://registry.yarnpkg.com/typescript-tuple/-/typescript-tuple-2.2.1.tgz#7d9813fb4b355f69ac55032e0363e8bb0f04dad2" + resolved "https://registry.npmjs.org/typescript-tuple/-/typescript-tuple-2.2.1.tgz" integrity sha512-Zcr0lbt8z5ZdEzERHAMAniTiIKerFCMgd7yjq1fPnDJ43et/k9twIFQMUYff9k5oXcsQ0WpvFcgzK2ZKASoW6Q== dependencies: typescript-compare "^0.0.2" +typescript@*, "typescript@^3.7.5 || ^4.0.0 || ^5.0.0", typescript@>=2.7, "typescript@>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta", "typescript@>=3.2.x || >= 4.x", typescript@>=3.7.5, "typescript@>=4.4.3 <4.7", "typescript@>=4.6.2 <4.9", typescript@~4.8.4: + version "4.8.4" + resolved "https://registry.npmjs.org/typescript/-/typescript-4.8.4.tgz" + integrity sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ== + typescript@^2.5.0: version "2.9.2" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-2.9.2.tgz#1cbf61d05d6b96269244eb6a3bce4bd914e0f00c" + resolved "https://registry.npmjs.org/typescript/-/typescript-2.9.2.tgz" integrity sha512-Gr4p6nFNaoufRIY4NMdpQRNmgxVIGMs4Fcu/ujdYk3nAZqk7supzBE9idmvfZIlH/Cuj//dvi+019qEue9lV0w== -typescript@^4.6.2: - version "4.9.3" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.3.tgz#3aea307c1746b8c384435d8ac36b8a2e580d85db" - integrity sha512-CIfGzTelbKNEnLpLdGFgdyKhG23CKdKgQPOBc+OUNrkJ2vr+KSzsSV5kq5iWhEQbok+quxgGzrAtGWCyU7tHnA== - -typescript@~4.5.5: - version "4.5.5" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.5.5.tgz#d8c953832d28924a9e3d37c73d729c846c5896f3" - integrity sha512-TCTIul70LyWe6IJWT8QSYeA54WQe8EjQFU4wY52Fasj5UKx88LNYKCgBEHcOMOrFF1rKGbD8v/xcNWVUq9SymA== - -ua-parser-js@1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-1.0.2.tgz#e2976c34dbfb30b15d2c300b2a53eac87c57a775" - integrity sha512-00y/AXhx0/SsnI51fTc0rLRmafiGOM4/O+ny10Ps7f+j/b8p/ZY11ytMgznXkOVo4GQ+KwQG5UQLkLGirsACRg== - ua-parser-js@^0.7.30: - version "0.7.33" - resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.33.tgz#1d04acb4ccef9293df6f70f2c3d22f3030d8b532" - integrity sha512-s8ax/CeZdK9R/56Sui0WM6y9OFREJarMRHqLB2EwkovemBxNQ+Bqu8GAsUnVcXKgphb++ghr/B2BZx4mahujPw== + version "0.7.35" + resolved "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.35.tgz" + integrity sha512-veRf7dawaj9xaWEu9HoTVn5Pggtc/qj+kqTOFvNiN1l0YdxwC1kvel57UCjThjGa3BHBihE8/UJAHI+uQHmd/g== + +ua-parser-js@^1.0.33: + version "1.0.35" + resolved "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-1.0.35.tgz" + integrity sha512-fKnGuqmTBnIE+/KXSzCn4db8RTigUzw1AN0DmdU6hJovUTbYJKyqj+8Mt1c4VfRDnOVJnENmfYkIPZ946UrSAA== uc.micro@^1.0.1, uc.micro@^1.0.5: version "1.0.6" - resolved "https://registry.yarnpkg.com/uc.micro/-/uc.micro-1.0.6.tgz#9c411a802a409a91fc6cf74081baba34b24499ac" + resolved "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz" integrity sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA== unbox-primitive@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e" + resolved "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz" integrity sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw== dependencies: call-bind "^1.0.2" @@ -11101,22 +11238,22 @@ unbox-primitive@^1.0.2: undefsafe@^2.0.5: version "2.0.5" - resolved "https://registry.yarnpkg.com/undefsafe/-/undefsafe-2.0.5.tgz#38733b9327bdcd226db889fb723a6efd162e6e2c" + resolved "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz" integrity sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA== unfetch@^4.2.0: version "4.2.0" - resolved "https://registry.yarnpkg.com/unfetch/-/unfetch-4.2.0.tgz#7e21b0ef7d363d8d9af0fb929a5555f6ef97a3be" + resolved "https://registry.npmjs.org/unfetch/-/unfetch-4.2.0.tgz" integrity sha512-F9p7yYCn6cIW9El1zi0HI6vqpeIvBsr3dSuRO6Xuppb1u5rXpCPmMvLSyECLhybr9isec8Ohl0hPekMVrEinDA== unicode-canonical-property-names-ecmascript@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz#301acdc525631670d39f6146e0e77ff6bbdebddc" + resolved "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz" integrity sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ== unicode-match-property-ecmascript@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz#54fd16e0ecb167cf04cf1f756bdcc92eba7976c3" + resolved "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz" integrity sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q== dependencies: unicode-canonical-property-names-ecmascript "^2.0.0" @@ -11124,70 +11261,70 @@ unicode-match-property-ecmascript@^2.0.0: unicode-match-property-value-ecmascript@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz#cb5fffdcd16a05124f5a4b0bf7c3770208acbbe0" + resolved "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz" integrity sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA== unicode-property-aliases-ecmascript@^2.0.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz#43d41e3be698bd493ef911077c9b131f827e8ccd" + resolved "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz" integrity sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w== unique-filename@^1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.1.tgz#1d69769369ada0583103a1e6ae87681b56573230" + resolved "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz" integrity sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ== dependencies: unique-slug "^2.0.0" unique-filename@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-2.0.1.tgz#e785f8675a9a7589e0ac77e0b5c34d2eaeac6da2" + resolved "https://registry.npmjs.org/unique-filename/-/unique-filename-2.0.1.tgz" integrity sha512-ODWHtkkdx3IAR+veKxFV+VBkUMcN+FaqzUUd7IZzt+0zhDZFPFxhlqwPF3YQvMHx1TD0tdgYl+kuPnJ8E6ql7A== dependencies: unique-slug "^3.0.0" unique-slug@^2.0.0: version "2.0.2" - resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-2.0.2.tgz#baabce91083fc64e945b0f3ad613e264f7cd4e6c" + resolved "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz" integrity sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w== dependencies: imurmurhash "^0.1.4" unique-slug@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-3.0.0.tgz#6d347cf57c8a7a7a6044aabd0e2d74e4d76dc7c9" + resolved "https://registry.npmjs.org/unique-slug/-/unique-slug-3.0.0.tgz" integrity sha512-8EyMynh679x/0gqE9fT9oilG+qEt+ibFyqjuVTsZn1+CMxH+XLlpvr2UZx4nVcCwTpx81nICr2JQFkM+HPLq4w== dependencies: imurmurhash "^0.1.4" universalify@^0.1.0: version "0.1.2" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" + resolved "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz" integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== universalify@^0.2.0: version "0.2.0" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.2.0.tgz#6451760566fa857534745ab1dde952d1b1761be0" + resolved "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz" integrity sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg== universalify@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" + resolved "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz" integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== -unpipe@1.0.0, unpipe@~1.0.0: +unpipe@~1.0.0, unpipe@1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + resolved "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz" integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== untildify@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/untildify/-/untildify-4.0.0.tgz#2bc947b953652487e4600949fb091e3ae8cd919b" + resolved "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz" integrity sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw== -update-browserslist-db@^1.0.9: +update-browserslist-db@^1.0.10: version "1.0.10" - resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz#0f54b876545726f17d00cd9a2561e6dade943ff3" + resolved "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz" integrity sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ== dependencies: escalade "^3.1.1" @@ -11195,14 +11332,14 @@ update-browserslist-db@^1.0.9: uri-js@^4.2.2: version "4.4.1" - resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + resolved "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz" integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== dependencies: punycode "^2.1.0" url-parse@^1.5.3: version "1.5.10" - resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.10.tgz#9d3c2f736c1d75dd3bd2be507dcc111f1e2ea9c1" + resolved "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz" integrity sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ== dependencies: querystringify "^2.1.1" @@ -11210,94 +11347,104 @@ url-parse@^1.5.3: use-memo-one@^1.1.1: version "1.1.3" - resolved "https://registry.yarnpkg.com/use-memo-one/-/use-memo-one-1.1.3.tgz#2fd2e43a2169eabc7496960ace8c79efef975e99" + resolved "https://registry.npmjs.org/use-memo-one/-/use-memo-one-1.1.3.tgz" integrity sha512-g66/K7ZQGYrI6dy8GLpVcMsBp4s17xNkYJVSMvTEevGy3nDxHOfE6z8BVE22+5G5x7t3+bhzrlTDB7ObrEE0cQ== util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: version "1.0.2" - resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== utils-merge@1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" + resolved "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz" integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== -uuid@8.3.2, uuid@^8.1.0, uuid@^8.3.2: +uuid@^3.2.1: + version "3.4.0" + resolved "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz" + integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== + +uuid@^3.3.2: + version "3.4.0" + resolved "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz" + integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== + +uuid@^8.1.0, uuid@^8.3.2, uuid@8.3.2: version "8.3.2" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" + resolved "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz" integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== -uuid@^3.2.1, uuid@^3.3.2: - version "3.4.0" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" - integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== +v8-compile-cache-lib@^3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz" + integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== v8-compile-cache@2.3.0: version "2.3.0" - resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee" + resolved "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz" integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA== valid-data-url@^3.0.0: version "3.0.1" - resolved "https://registry.yarnpkg.com/valid-data-url/-/valid-data-url-3.0.1.tgz#826c1744e71b5632e847dd15dbd45b9fb38aa34f" + resolved "https://registry.npmjs.org/valid-data-url/-/valid-data-url-3.0.1.tgz" integrity sha512-jOWVmzVceKlVVdwjNSenT4PbGghU0SBIizAev8ofZVgivk/TVHXSbNL8LP6M3spZvkR9/QolkyJavGSX5Cs0UA== validate-npm-package-name@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz#5fa912d81eb7d0c74afc140de7317f0ca7df437e" + resolved "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz" integrity sha512-M6w37eVCMMouJ9V/sdPGnC5H4uDr73/+xdq0FBLO3TFFX1+7wiUY6Es328NN+y43tmY+doUdN9g9J21vqB7iLw== dependencies: builtins "^1.0.3" vary@^1, vary@~1.1.2: version "1.1.2" - resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" + resolved "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz" integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== verror@1.10.0: version "1.10.0" - resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" + resolved "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz" integrity sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw== dependencies: assert-plus "^1.0.0" core-util-is "1.0.2" extsprintf "^1.2.0" -void-elements@3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/void-elements/-/void-elements-3.1.0.tgz#614f7fbf8d801f0bb5f0661f5b2f5785750e4f09" - integrity sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w== - void-elements@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/void-elements/-/void-elements-2.0.1.tgz#c066afb582bb1cb4128d60ea92392e94d5e9dbec" + resolved "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz" integrity sha512-qZKX4RnBzH2ugr8Lxa7x+0V6XD9Sb/ouARtiasEQCHB1EVU4NXtmHsDDrx1dO4ne5fc3J6EW05BP1Dl0z0iung== +void-elements@3.1.0: + version "3.1.0" + resolved "https://registry.npmjs.org/void-elements/-/void-elements-3.1.0.tgz" + integrity sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w== + w3c-hr-time@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz#0a89cdf5cc15822df9c360543676963e0cc308cd" + resolved "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz" integrity sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ== dependencies: browser-process-hrtime "^1.0.0" w3c-xmlserializer@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz#3e7104a05b75146cc60f564380b7f683acf1020a" + resolved "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz" integrity sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA== dependencies: xml-name-validator "^3.0.0" w3c-xmlserializer@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/w3c-xmlserializer/-/w3c-xmlserializer-3.0.0.tgz#06cdc3eefb7e4d0b20a560a5a3aeb0d2d9a65923" + resolved "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-3.0.0.tgz" integrity sha512-3WFqGEgSXIyGhOmAFtlicJNMjEps8b1MG31NCA0/vOF9+nKMUW1ckhi9cnNHmf88Rzw5V+dwIwsm2C7X8k9aQg== dependencies: xml-name-validator "^4.0.0" -watchpack@^2.3.1, watchpack@^2.4.0: +watchpack@^2.4.0: version "2.4.0" - resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.4.0.tgz#fa33032374962c78113f93c7f2fb4c54c9862a5d" + resolved "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz" integrity sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg== dependencies: glob-to-regexp "^0.4.1" @@ -11305,21 +11452,21 @@ watchpack@^2.3.1, watchpack@^2.4.0: wbuf@^1.1.0, wbuf@^1.7.3: version "1.7.3" - resolved "https://registry.yarnpkg.com/wbuf/-/wbuf-1.7.3.tgz#c1d8d149316d3ea852848895cb6a0bfe887b87df" + resolved "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz" integrity sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA== dependencies: minimalistic-assert "^1.0.0" wcwidth@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8" + resolved "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz" integrity sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg== dependencies: defaults "^1.0.3" web-resource-inliner@^6.0.1: version "6.0.1" - resolved "https://registry.yarnpkg.com/web-resource-inliner/-/web-resource-inliner-6.0.1.tgz#df0822f0a12028805fe80719ed52ab6526886e02" + resolved "https://registry.npmjs.org/web-resource-inliner/-/web-resource-inliner-6.0.1.tgz" integrity sha512-kfqDxt5dTB1JhqsCUQVFDj0rmY+4HLwGQIsLPbyrsN9y9WV/1oFDSx3BQ4GfCv9X+jVeQ7rouTqwK53rA/7t8A== dependencies: ansi-colors "^4.1.1" @@ -11329,53 +11476,37 @@ web-resource-inliner@^6.0.1: node-fetch "^2.6.0" valid-data-url "^3.0.0" -webdriver-manager@^12.1.8: - version "12.1.8" - resolved "https://registry.yarnpkg.com/webdriver-manager/-/webdriver-manager-12.1.8.tgz#5e70e73eaaf53a0767d5745270addafbc5905fd4" - integrity sha512-qJR36SXG2VwKugPcdwhaqcLQOD7r8P2Xiv9sfNbfZrKBnX243iAkOueX1yAmeNgIKhJ3YAT/F2gq6IiEZzahsg== - dependencies: - adm-zip "^0.4.9" - chalk "^1.1.1" - del "^2.2.0" - glob "^7.0.3" - ini "^1.3.4" - minimist "^1.2.0" - q "^1.4.1" - request "^2.87.0" - rimraf "^2.5.2" - semver "^5.3.0" - xml2js "^0.4.17" - webfontloader@1.6.28: version "1.6.28" - resolved "https://registry.yarnpkg.com/webfontloader/-/webfontloader-1.6.28.tgz#db786129253cb6e8eae54c2fb05f870af6675bae" + resolved "https://registry.npmjs.org/webfontloader/-/webfontloader-1.6.28.tgz" integrity sha512-Egb0oFEga6f+nSgasH3E0M405Pzn6y3/9tOVanv/DLfa1YBIgcv90L18YyWnvXkRbIM17v5Kv6IT2N6g1x5tvQ== webidl-conversions@^3.0.0: version "3.0.1" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" + resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz" integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== webidl-conversions@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-5.0.0.tgz#ae59c8a00b121543a2acc65c0434f57b0fc11aff" + resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz" integrity sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA== webidl-conversions@^6.1.0: version "6.1.0" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-6.1.0.tgz#9111b4d7ea80acd40f5270d666621afa78b69514" + resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz" integrity sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w== webidl-conversions@^7.0.0: version "7.0.0" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-7.0.0.tgz#256b4e1882be7debbf01d05f0aa2039778ea080a" + resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz" integrity sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g== webpack-bundle-analyzer@^4.4.0: - version "4.7.0" - resolved "https://registry.yarnpkg.com/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.7.0.tgz#33c1c485a7fcae8627c547b5c3328b46de733c66" - integrity sha512-j9b8ynpJS4K+zfO5GGwsAcQX4ZHpWV+yRiHDiL+bE0XHJ8NiPYLTNVQdlFYWxtpg9lfAQNlwJg16J9AJtFSXRg== + version "4.8.0" + resolved "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.8.0.tgz" + integrity sha512-ZzoSBePshOKhr+hd8u6oCkZVwpVaXgpw23ScGLFpR6SjYI7+7iIWYarjN6OEYOfRt8o7ZyZZQk0DuMizJ+LEIg== dependencies: + "@discoveryjs/json-ext" "0.5.7" acorn "^8.0.4" acorn-walk "^8.0.0" chalk "^4.1.0" @@ -11386,9 +11517,9 @@ webpack-bundle-analyzer@^4.4.0: sirv "^1.0.7" ws "^7.3.1" -webpack-cli@^4.2.0: +webpack-cli@^4.2.0, webpack-cli@4.x.x: version "4.10.0" - resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-4.10.0.tgz#37c1d69c8d85214c5a65e589378f53aec64dab31" + resolved "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.10.0.tgz" integrity sha512-NLhDfH/h4O6UOy+0LSso42xvYypClINuMNBVVzX4vX98TmTaTUxwRbXdhucbFMd2qLaCTcLq/PdYrvi8onw90w== dependencies: "@discoveryjs/json-ext" "^0.5.0" @@ -11404,9 +11535,9 @@ webpack-cli@^4.2.0: rechoir "^0.7.0" webpack-merge "^5.7.3" -webpack-dev-middleware@5.3.0: +webpack-dev-middleware@^5.3.0, webpack-dev-middleware@5.3.0: version "5.3.0" - resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-5.3.0.tgz#8fc02dba6e72e1d373eca361623d84610f27be7c" + resolved "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.0.tgz" integrity sha512-MouJz+rXAm9B1OTOYaJnn6rtD/lWZPy2ufQCH3BPs8Rloh/Du6Jze4p7AeLYHkVi0giJnYLaSGDC7S+GM9arhg== dependencies: colorette "^2.0.10" @@ -11415,9 +11546,9 @@ webpack-dev-middleware@5.3.0: range-parser "^1.2.1" schema-utils "^4.0.0" -webpack-dev-middleware@^5.3.0, webpack-dev-middleware@^5.3.1: +webpack-dev-middleware@^5.3.1: version "5.3.3" - resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz#efae67c2793908e7311f1d9b06f2a08dcc97e51f" + resolved "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz" integrity sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA== dependencies: colorette "^2.0.10" @@ -11426,9 +11557,45 @@ webpack-dev-middleware@^5.3.0, webpack-dev-middleware@^5.3.1: range-parser "^1.2.1" schema-utils "^4.0.0" +webpack-dev-server@^4.0.0, webpack-dev-server@^4.5.0: + version "4.13.2" + resolved "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.13.2.tgz" + integrity sha512-5i6TrGBRxG4vnfDpB6qSQGfnB6skGBXNL5/542w2uRGLimX6qeE5BQMLrzIC3JYV/xlGOv+s+hTleI9AZKUQNw== + dependencies: + "@types/bonjour" "^3.5.9" + "@types/connect-history-api-fallback" "^1.3.5" + "@types/express" "^4.17.13" + "@types/serve-index" "^1.9.1" + "@types/serve-static" "^1.13.10" + "@types/sockjs" "^0.3.33" + "@types/ws" "^8.5.1" + ansi-html-community "^0.0.8" + bonjour-service "^1.0.11" + chokidar "^3.5.3" + colorette "^2.0.10" + compression "^1.7.4" + connect-history-api-fallback "^2.0.0" + default-gateway "^6.0.3" + express "^4.17.3" + graceful-fs "^4.2.6" + html-entities "^2.3.2" + http-proxy-middleware "^2.0.3" + ipaddr.js "^2.0.1" + launch-editor "^2.6.0" + open "^8.0.9" + p-retry "^4.5.0" + rimraf "^3.0.2" + schema-utils "^4.0.0" + selfsigned "^2.1.1" + serve-index "^1.9.1" + sockjs "^0.3.24" + spdy "^4.0.2" + webpack-dev-middleware "^5.3.1" + ws "^8.13.0" + webpack-dev-server@4.7.3: version "4.7.3" - resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-4.7.3.tgz#4e995b141ff51fa499906eebc7906f6925d0beaa" + resolved "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.7.3.tgz" integrity sha512-mlxq2AsIw2ag016nixkzUkdyOE8ST2GTy34uKSABp1c4nhjZvH90D5ZRR+UOLSsG4Z3TFahAi72a3ymRtfRm+Q== dependencies: "@types/bonjour" "^3.5.9" @@ -11461,44 +11628,9 @@ webpack-dev-server@4.7.3: webpack-dev-middleware "^5.3.0" ws "^8.1.0" -webpack-dev-server@^4.5.0: - version "4.11.1" - resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-4.11.1.tgz#ae07f0d71ca0438cf88446f09029b92ce81380b5" - integrity sha512-lILVz9tAUy1zGFwieuaQtYiadImb5M3d+H+L1zDYalYoDl0cksAB1UNyuE5MMWJrG6zR1tXkCP2fitl7yoUJiw== - dependencies: - "@types/bonjour" "^3.5.9" - "@types/connect-history-api-fallback" "^1.3.5" - "@types/express" "^4.17.13" - "@types/serve-index" "^1.9.1" - "@types/serve-static" "^1.13.10" - "@types/sockjs" "^0.3.33" - "@types/ws" "^8.5.1" - ansi-html-community "^0.0.8" - bonjour-service "^1.0.11" - chokidar "^3.5.3" - colorette "^2.0.10" - compression "^1.7.4" - connect-history-api-fallback "^2.0.0" - default-gateway "^6.0.3" - express "^4.17.3" - graceful-fs "^4.2.6" - html-entities "^2.3.2" - http-proxy-middleware "^2.0.3" - ipaddr.js "^2.0.1" - open "^8.0.9" - p-retry "^4.5.0" - rimraf "^3.0.2" - schema-utils "^4.0.0" - selfsigned "^2.1.1" - serve-index "^1.9.1" - sockjs "^0.3.24" - spdy "^4.0.2" - webpack-dev-middleware "^5.3.1" - ws "^8.4.2" - -webpack-merge@5.8.0, webpack-merge@^5.7.3: +webpack-merge@^5.7.3, webpack-merge@5.8.0: version "5.8.0" - resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-5.8.0.tgz#2b39dbf22af87776ad744c390223731d30a68f61" + resolved "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz" integrity sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q== dependencies: clone-deep "^4.0.1" @@ -11506,7 +11638,7 @@ webpack-merge@5.8.0, webpack-merge@^5.7.3: webpack-sources@^1.4.3: version "1.4.3" - resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.4.3.tgz#eedd8ec0b928fbf1cbfe994e22d2d890f330a933" + resolved "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz" integrity sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ== dependencies: source-list-map "^2.0.0" @@ -11514,50 +11646,20 @@ webpack-sources@^1.4.3: webpack-sources@^3.0.0, webpack-sources@^3.2.3: version "3.2.3" - resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-3.2.3.tgz#2d4daab8451fd4b240cc27055ff6a0c2ccea0cde" + resolved "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz" integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w== webpack-subresource-integrity@5.1.0: version "5.1.0" - resolved "https://registry.yarnpkg.com/webpack-subresource-integrity/-/webpack-subresource-integrity-5.1.0.tgz#8b7606b033c6ccac14e684267cb7fb1f5c2a132a" + resolved "https://registry.npmjs.org/webpack-subresource-integrity/-/webpack-subresource-integrity-5.1.0.tgz" integrity sha512-sacXoX+xd8r4WKsy9MvH/q/vBtEHr86cpImXwyg74pFIpERKt6FmB8cXpeuh0ZLgclOlHI4Wcll7+R5L02xk9Q== dependencies: typed-assert "^1.0.8" -webpack@5.70.0: - version "5.70.0" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.70.0.tgz#3461e6287a72b5e6e2f4872700bc8de0d7500e6d" - integrity sha512-ZMWWy8CeuTTjCxbeaQI21xSswseF2oNOwc70QSKNePvmxE7XW36i7vpBMYZFAUHPwQiEbNGCEYIOOlyRbdGmxw== - dependencies: - "@types/eslint-scope" "^3.7.3" - "@types/estree" "^0.0.51" - "@webassemblyjs/ast" "1.11.1" - "@webassemblyjs/wasm-edit" "1.11.1" - "@webassemblyjs/wasm-parser" "1.11.1" - acorn "^8.4.1" - acorn-import-assertions "^1.7.6" - browserslist "^4.14.5" - chrome-trace-event "^1.0.2" - enhanced-resolve "^5.9.2" - es-module-lexer "^0.9.0" - eslint-scope "5.1.1" - events "^3.2.0" - glob-to-regexp "^0.4.1" - graceful-fs "^4.2.9" - json-parse-better-errors "^1.0.2" - loader-runner "^4.2.0" - mime-types "^2.1.27" - neo-async "^2.6.2" - schema-utils "^3.1.0" - tapable "^2.1.1" - terser-webpack-plugin "^5.1.3" - watchpack "^2.3.1" - webpack-sources "^3.2.3" - -webpack@^5.76.0: - version "5.76.0" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.76.0.tgz#f9fb9fb8c4a7dbdcd0d56a98e56b8a942ee2692c" - integrity sha512-l5sOdYBDunyf72HW8dF23rFtWq/7Zgvt/9ftMof71E/yUb1YLOBmTgA2K4vQthB3kotMrSj609txVE0dnr2fjA== +"webpack@^4.0.0 || ^5.0.0", "webpack@^4.37.0 || ^5.0.0", webpack@^5.0.0, webpack@^5.1.0, webpack@^5.12.0, webpack@^5.30.0, webpack@^5.76.0, webpack@>=2, webpack@>=4.0.1, "webpack@4.x.x || 5.x.x": + version "5.78.0" + resolved "https://registry.npmjs.org/webpack/-/webpack-5.78.0.tgz" + integrity sha512-gT5DP72KInmE/3azEaQrISjTvLYlSM0j1Ezhht/KLVkrqtv10JoP/RXhwmX/frrutOPuSq3o5Vq0ehR/4Vmd1g== dependencies: "@types/eslint-scope" "^3.7.3" "@types/estree" "^0.0.51" @@ -11584,9 +11686,39 @@ webpack@^5.76.0: watchpack "^2.4.0" webpack-sources "^3.2.3" -websocket-driver@>=0.5.1, websocket-driver@^0.7.4: +webpack@5.76.1: + version "5.76.1" + resolved "https://registry.npmjs.org/webpack/-/webpack-5.76.1.tgz" + integrity sha512-4+YIK4Abzv8172/SGqObnUjaIHjLEuUasz9EwQj/9xmPPkYJy2Mh03Q/lJfSD3YLzbxy5FeTq5Uw0323Oh6SJQ== + dependencies: + "@types/eslint-scope" "^3.7.3" + "@types/estree" "^0.0.51" + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/wasm-edit" "1.11.1" + "@webassemblyjs/wasm-parser" "1.11.1" + acorn "^8.7.1" + acorn-import-assertions "^1.7.6" + browserslist "^4.14.5" + chrome-trace-event "^1.0.2" + enhanced-resolve "^5.10.0" + es-module-lexer "^0.9.0" + eslint-scope "5.1.1" + events "^3.2.0" + glob-to-regexp "^0.4.1" + graceful-fs "^4.2.9" + json-parse-even-better-errors "^2.3.1" + loader-runner "^4.2.0" + mime-types "^2.1.27" + neo-async "^2.6.2" + schema-utils "^3.1.0" + tapable "^2.1.1" + terser-webpack-plugin "^5.1.3" + watchpack "^2.4.0" + webpack-sources "^3.2.3" + +websocket-driver@^0.7.4, websocket-driver@>=0.5.1: version "0.7.4" - resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.4.tgz#89ad5295bbf64b480abcba31e4953aca706f5760" + resolved "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz" integrity sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg== dependencies: http-parser-js ">=0.5.1" @@ -11595,36 +11727,36 @@ websocket-driver@>=0.5.1, websocket-driver@^0.7.4: websocket-extensions@>=0.1.1: version "0.1.4" - resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.4.tgz#7f8473bc839dfd87608adb95d7eb075211578a42" + resolved "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz" integrity sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg== whatwg-encoding@^1.0.5: version "1.0.5" - resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz#5abacf777c32166a51d085d6b4f3e7d27113ddb0" + resolved "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz" integrity sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw== dependencies: iconv-lite "0.4.24" whatwg-encoding@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz#e7635f597fd87020858626805a2729fa7698ac53" + resolved "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz" integrity sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg== dependencies: iconv-lite "0.6.3" whatwg-mimetype@^2.3.0: version "2.3.0" - resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz#3d4b1e0312d2079879f826aff18dbeeca5960fbf" + resolved "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz" integrity sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g== whatwg-mimetype@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz#5fa1a7623867ff1af6ca3dc72ad6b8a4208beba7" + resolved "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz" integrity sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q== whatwg-url@^10.0.0: version "10.0.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-10.0.0.tgz#37264f720b575b4a311bd4094ed8c760caaa05da" + resolved "https://registry.npmjs.org/whatwg-url/-/whatwg-url-10.0.0.tgz" integrity sha512-CLxxCmdUby142H5FZzn4D8ikO1cmypvXVQktsgosNy4a4BHrDHeciBBGZhb0bNoR5/MltoCatso+vFjjGx8t0w== dependencies: tr46 "^3.0.0" @@ -11632,7 +11764,7 @@ whatwg-url@^10.0.0: whatwg-url@^11.0.0: version "11.0.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-11.0.0.tgz#0a849eebb5faf2119b901bb76fd795c2848d4018" + resolved "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz" integrity sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ== dependencies: tr46 "^3.0.0" @@ -11640,7 +11772,7 @@ whatwg-url@^11.0.0: whatwg-url@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" + resolved "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz" integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== dependencies: tr46 "~0.0.3" @@ -11648,7 +11780,7 @@ whatwg-url@^5.0.0: whatwg-url@^8.0.0, whatwg-url@^8.5.0: version "8.7.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-8.7.0.tgz#656a78e510ff8f3937bc0bcbe9f5c0ac35941b77" + resolved "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz" integrity sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg== dependencies: lodash "^4.7.0" @@ -11657,7 +11789,7 @@ whatwg-url@^8.0.0, whatwg-url@^8.5.0: which-boxed-primitive@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" + resolved "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz" integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== dependencies: is-bigint "^1.0.1" @@ -11666,45 +11798,57 @@ which-boxed-primitive@^1.0.2: is-string "^1.0.5" is-symbol "^1.0.3" +which-typed-array@^1.1.9: + version "1.1.9" + resolved "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz" + integrity sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA== + dependencies: + available-typed-arrays "^1.0.5" + call-bind "^1.0.2" + for-each "^0.3.3" + gopd "^1.0.1" + has-tostringtag "^1.0.0" + is-typed-array "^1.1.10" + which@^1.2.1: version "1.3.1" - resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" + resolved "https://registry.npmjs.org/which/-/which-1.3.1.tgz" integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== dependencies: isexe "^2.0.0" which@^2.0.1, which@^2.0.2: version "2.0.2" - resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + resolved "https://registry.npmjs.org/which/-/which-2.0.2.tgz" integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== dependencies: isexe "^2.0.0" wicked-good-xpath@1.3.0: version "1.3.0" - resolved "https://registry.yarnpkg.com/wicked-good-xpath/-/wicked-good-xpath-1.3.0.tgz#81b0e95e8650e49c94b22298fff8686b5553cf6c" + resolved "https://registry.npmjs.org/wicked-good-xpath/-/wicked-good-xpath-1.3.0.tgz" integrity sha512-Gd9+TUn5nXdwj/hFsPVx5cuHHiF5Bwuc30jZ4+ronF1qHK5O7HD0sgmXWSEgwKquT3ClLoKPVbO6qGwVwLzvAw== wide-align@^1.1.5: version "1.1.5" - resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.5.tgz#df1d4c206854369ecf3c9a4898f1b23fbd9d15d3" + resolved "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz" integrity sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg== dependencies: string-width "^1.0.2 || 2 || 3 || 4" wildcard@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/wildcard/-/wildcard-2.0.0.tgz#a77d20e5200c6faaac979e4b3aadc7b3dd7f8fec" + resolved "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz" integrity sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw== word-wrap@^1.2.3, word-wrap@~1.2.3: version "1.2.3" - resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" + resolved "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz" integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== wrap-ansi@^6.2.0: version "6.2.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" + resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz" integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== dependencies: ansi-styles "^4.0.0" @@ -11713,7 +11857,7 @@ wrap-ansi@^6.2.0: wrap-ansi@^7.0.0: version "7.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz" integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== dependencies: ansi-styles "^4.0.0" @@ -11722,113 +11866,97 @@ wrap-ansi@^7.0.0: wrappy@1: version "1.0.2" - resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== -ws@^7.3.1, ws@^7.4.6: +ws@^7.3.1: version "7.5.9" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.9.tgz#54fa7db29f4c7cec68b1ddd3a89de099942bb591" + resolved "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz" integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== -ws@^8.1.0, ws@^8.2.3, ws@^8.4.2: - version "8.11.0" - resolved "https://registry.yarnpkg.com/ws/-/ws-8.11.0.tgz#6a0d36b8edfd9f96d8b25683db2f8d7de6e8e143" - integrity sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg== +ws@^7.4.6: + version "7.5.9" + resolved "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz" + integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== -ws@~8.2.3: - version "8.2.3" - resolved "https://registry.yarnpkg.com/ws/-/ws-8.2.3.tgz#63a56456db1b04367d0b721a0b80cae6d8becbba" - integrity sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA== +ws@^8.1.0, ws@^8.13.0, ws@^8.2.3: + version "8.13.0" + resolved "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz" + integrity sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA== + +ws@~8.11.0: + version "8.11.0" + resolved "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz" + integrity sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg== xhr2@^0.2.0: version "0.2.1" - resolved "https://registry.yarnpkg.com/xhr2/-/xhr2-0.2.1.tgz#4e73adc4f9cfec9cbd2157f73efdce3a5f108a93" + resolved "https://registry.npmjs.org/xhr2/-/xhr2-0.2.1.tgz" integrity sha512-sID0rrVCqkVNUn8t6xuv9+6FViXjUVXq8H5rWOH2rz9fDNQEd4g0EA2XlcEdJXRz5BMEn4O1pJFdT+z4YHhoWw== xml-name-validator@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a" + resolved "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz" integrity sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw== xml-name-validator@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-4.0.0.tgz#79a006e2e63149a8600f15430f0a4725d1524835" + resolved "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz" integrity sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw== -xml2js@^0.4.17: - version "0.4.23" - resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.4.23.tgz#a0c69516752421eb2ac758ee4d4ccf58843eac66" - integrity sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug== - dependencies: - sax ">=0.6.0" - xmlbuilder "~11.0.0" - -xmlbuilder@~11.0.0: - version "11.0.1" - resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-11.0.1.tgz#be9bae1c8a046e76b31127726347d0ad7002beb3" - integrity sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA== - xmlchars@^2.2.0: version "2.2.0" - resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb" + resolved "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz" integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== xmldom-sre@0.1.31: version "0.1.31" - resolved "https://registry.yarnpkg.com/xmldom-sre/-/xmldom-sre-0.1.31.tgz#10860d5bab2c603144597d04bf2c4980e98067f4" + resolved "https://registry.npmjs.org/xmldom-sre/-/xmldom-sre-0.1.31.tgz" integrity sha512-f9s+fUkX04BxQf+7mMWAp5zk61pciie+fFLC9hX9UVvCeJQfNHRHXpeo5MPcR0EUf57PYLdt+ZO4f3Ipk2oZUw== xmlhttprequest-ssl@~2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.0.0.tgz#91360c86b914e67f44dce769180027c0da618c67" + resolved "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.0.0.tgz" integrity sha512-QKxVRxiRACQcVuQEYFsI1hhkrMlrXHPegbbd1yn9UHOmRxY+si12nQYzri3vbzt8VdTTRviqcKxcyllFas5z2A== y18n@^5.0.5: version "5.0.8" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" + resolved "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz" integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== +yallist@^3.0.2: + version "3.1.1" + resolved "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz" + integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== + yallist@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" + resolved "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz" integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== yaml@^1.10.0: version "1.10.2" - resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" + resolved "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz" integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== -yargs-parser@20.0.0: - version "20.0.0" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.0.0.tgz#c65a1daaa977ad63cebdd52159147b789a4e19a9" - integrity sha512-8eblPHTL7ZWRkyjIZJjnGf+TijiKJSwA24svzLRVvtgoi/RZiKa9fFQTrlx0OKLnyHSdt/enrdadji6WFfESVA== - -yargs-parser@21.1.1, yargs-parser@^21.1.1: - version "21.1.1" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" - integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== - yargs-parser@^20.2.2: version "20.2.9" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" + resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz" integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== -yargs@17.1.1: - version "17.1.1" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.1.1.tgz#c2a8091564bdb196f7c0a67c1d12e5b85b8067ba" - integrity sha512-c2k48R0PwKIqKhPMWjeiF6y2xY/gPMUlro0sgxqXpbOIohWiLNXWslsootttv7E1e73QPAMQSg5FeySbVcpsPQ== - dependencies: - cliui "^7.0.2" - escalade "^3.1.1" - get-caller-file "^2.0.5" - require-directory "^2.1.1" - string-width "^4.2.0" - y18n "^5.0.5" - yargs-parser "^20.2.2" +yargs-parser@^21.1.1, yargs-parser@21.1.1: + version "21.1.1" + resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz" + integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== + +yargs-parser@20.0.0: + version "20.0.0" + resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.0.0.tgz" + integrity sha512-8eblPHTL7ZWRkyjIZJjnGf+TijiKJSwA24svzLRVvtgoi/RZiKa9fFQTrlx0OKLnyHSdt/enrdadji6WFfESVA== yargs@^16.1.1: version "16.2.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" + resolved "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz" integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== dependencies: cliui "^7.0.2" @@ -11840,9 +11968,9 @@ yargs@^16.1.1: yargs-parser "^20.2.2" yargs@^17.2.1, yargs@^17.3.1, yargs@^17.6.2: - version "17.6.2" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.6.2.tgz#2e23f2944e976339a1ee00f18c77fedee8332541" - integrity sha512-1/9UrdHjDZc0eOU0HxOHoS78C69UD3JRMvzlJ7S79S2nTaWRA/whGCTV8o9e/N/1Va9YIV7Q4sOxD8VV4pCWOw== + version "17.7.1" + resolved "https://registry.npmjs.org/yargs/-/yargs-17.7.1.tgz" + integrity sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw== dependencies: cliui "^8.0.1" escalade "^3.1.1" @@ -11852,9 +11980,22 @@ yargs@^17.2.1, yargs@^17.3.1, yargs@^17.6.2: y18n "^5.0.5" yargs-parser "^21.1.1" +yargs@17.1.1: + version "17.1.1" + resolved "https://registry.npmjs.org/yargs/-/yargs-17.1.1.tgz" + integrity sha512-c2k48R0PwKIqKhPMWjeiF6y2xY/gPMUlro0sgxqXpbOIohWiLNXWslsootttv7E1e73QPAMQSg5FeySbVcpsPQ== + dependencies: + cliui "^7.0.2" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.0" + y18n "^5.0.5" + yargs-parser "^20.2.2" + yauzl@^2.10.0: version "2.10.0" - resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.10.0.tgz#c7eb17c93e112cb1086fa6d8e51fb0667b79a5f9" + resolved "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz" integrity sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g== dependencies: buffer-crc32 "~0.2.3" @@ -11862,17 +12003,17 @@ yauzl@^2.10.0: yn@3.1.1: version "3.1.1" - resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" + resolved "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz" integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== yocto-queue@^0.1.0: version "0.1.0" - resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" + resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz" integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== -zone.js@~0.11.5: +zone.js@~0.11.4, "zone.js@~0.11.4 || ~0.12.0", zone.js@~0.11.5: version "0.11.8" - resolved "https://registry.yarnpkg.com/zone.js/-/zone.js-0.11.8.tgz#40dea9adc1ad007b5effb2bfed17f350f1f46a21" + resolved "https://registry.npmjs.org/zone.js/-/zone.js-0.11.8.tgz" integrity sha512-82bctBg2hKcEJ21humWIkXRlLBBmrc3nN7DFh5LGGhcyycO2S7FN8NmdvlcKaGFDNVL4/9kFLmwmInTavdJERA== dependencies: tslib "^2.3.0" From 859ffb5cdc7a643e0b0096dd973b3295715eb39f Mon Sep 17 00:00:00 2001 From: Kristof De Langhe Date: Tue, 11 Apr 2023 16:23:18 +0200 Subject: [PATCH 070/409] 101108: Automatic ng update @angular-devkit/build-angular@14 --- package.json | 2 +- yarn.lock | 988 +++++++++++++++++++++++++++++++++++++++++++-------- 2 files changed, 839 insertions(+), 151 deletions(-) diff --git a/package.json b/package.json index 4360d49bf3..d6566515a7 100644 --- a/package.json +++ b/package.json @@ -135,7 +135,7 @@ }, "devDependencies": { "@angular-builders/custom-webpack": "~13.1.0", - "@angular-devkit/build-angular": "~13.3.10", + "@angular-devkit/build-angular": "~14.2.11", "@angular-eslint/builder": "13.1.0", "@angular-eslint/eslint-plugin": "13.1.0", "@angular-eslint/eslint-plugin-template": "13.1.0", diff --git a/yarn.lock b/yarn.lock index 00dafb2c9c..a67eeed190 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,6 +2,19 @@ # yarn lockfile v1 +"@adobe/css-tools@^4.0.1": + version "4.2.0" + resolved "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.2.0.tgz" + integrity sha512-E09FiIft46CmH5Qnjb0wsW54/YQd69LsxeKUOWawmws1XWvyFGURnAChH0mlr7YPFR1ofwvUQfcL0J3lMxXqPA== + +"@ampproject/remapping@^2.0.0", "@ampproject/remapping@2.2.0": + version "2.2.0" + resolved "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz" + integrity sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w== + dependencies: + "@jridgewell/gen-mapping" "^0.1.0" + "@jridgewell/trace-mapping" "^0.3.9" + "@ampproject/remapping@^2.1.0": version "2.2.1" resolved "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz" @@ -10,14 +23,6 @@ "@jridgewell/gen-mapping" "^0.3.0" "@jridgewell/trace-mapping" "^0.3.9" -"@ampproject/remapping@2.2.0": - version "2.2.0" - resolved "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz" - integrity sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w== - dependencies: - "@jridgewell/gen-mapping" "^0.1.0" - "@jridgewell/trace-mapping" "^0.3.9" - "@angular-builders/custom-webpack@~13.1.0": version "13.1.0" resolved "https://registry.npmjs.org/@angular-builders/custom-webpack/-/custom-webpack-13.1.0.tgz" @@ -47,7 +52,15 @@ "@angular-devkit/core" "13.3.11" rxjs "6.6.7" -"@angular-devkit/build-angular@^13.0.0", "@angular-devkit/build-angular@^13.3.4", "@angular-devkit/build-angular@~13.3.10": +"@angular-devkit/architect@0.1402.11": + version "0.1402.11" + resolved "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1402.11.tgz" + integrity sha512-RuSZrBQ+QbipAESZ4aXCyAMQHaEaDyyV/FDS9J2HJWfEFbRD5oxlEt/tBC8XjmJQsktaUOh07GT8MNJjPKVAQw== + dependencies: + "@angular-devkit/core" "14.2.11" + rxjs "6.6.7" + +"@angular-devkit/build-angular@^13.0.0": version "13.3.11" resolved "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-13.3.11.tgz" integrity sha512-H4tpdmRu+6HSjsL+swV/8qj8v0YSDq6lpb31EYajlBB6fDj+YJQvHgaWvexSWl6eIqgDKXcujhNUjNi1enjwHw== @@ -119,6 +132,76 @@ optionalDependencies: esbuild "0.14.22" +"@angular-devkit/build-angular@^13.3.4", "@angular-devkit/build-angular@~14.2.11": + version "14.2.11" + resolved "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-14.2.11.tgz" + integrity sha512-O3X7GXcCBCGceVSHT+GIJ2JrRCg2YcO7HtNavpmPrraNr1o+aCdTkmT5WTS2cqWkZBm/z0wqKR8PsX/ZoD2r1A== + dependencies: + "@ampproject/remapping" "2.2.0" + "@angular-devkit/architect" "0.1402.11" + "@angular-devkit/build-webpack" "0.1402.11" + "@angular-devkit/core" "14.2.11" + "@babel/core" "7.18.10" + "@babel/generator" "7.18.12" + "@babel/helper-annotate-as-pure" "7.18.6" + "@babel/plugin-proposal-async-generator-functions" "7.18.10" + "@babel/plugin-transform-async-to-generator" "7.18.6" + "@babel/plugin-transform-runtime" "7.18.10" + "@babel/preset-env" "7.18.10" + "@babel/runtime" "7.18.9" + "@babel/template" "7.18.10" + "@discoveryjs/json-ext" "0.5.7" + "@ngtools/webpack" "14.2.11" + ansi-colors "4.1.3" + babel-loader "8.2.5" + babel-plugin-istanbul "6.1.1" + browserslist "^4.9.1" + cacache "16.1.2" + copy-webpack-plugin "11.0.0" + critters "0.0.16" + css-loader "6.7.1" + esbuild-wasm "0.15.5" + glob "8.0.3" + https-proxy-agent "5.0.1" + inquirer "8.2.4" + jsonc-parser "3.1.0" + karma-source-map-support "1.4.0" + less "4.1.3" + less-loader "11.0.0" + license-webpack-plugin "4.0.2" + loader-utils "3.2.1" + mini-css-extract-plugin "2.6.1" + minimatch "5.1.0" + open "8.4.0" + ora "5.4.1" + parse5-html-rewriting-stream "6.0.1" + piscina "3.2.0" + postcss "8.4.16" + postcss-import "15.0.0" + postcss-loader "7.0.1" + postcss-preset-env "7.8.0" + regenerator-runtime "0.13.9" + resolve-url-loader "5.0.0" + rxjs "6.6.7" + sass "1.54.4" + sass-loader "13.0.2" + semver "7.3.7" + source-map-loader "4.0.0" + source-map-support "0.5.21" + stylus "0.59.0" + stylus-loader "7.0.0" + terser "5.14.2" + text-table "0.2.0" + tree-kill "1.2.2" + tslib "2.4.0" + webpack "5.76.1" + webpack-dev-middleware "5.3.3" + webpack-dev-server "4.11.0" + webpack-merge "5.8.0" + webpack-subresource-integrity "5.1.0" + optionalDependencies: + esbuild "0.15.5" + "@angular-devkit/build-webpack@0.1303.11": version "0.1303.11" resolved "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1303.11.tgz" @@ -127,6 +210,14 @@ "@angular-devkit/architect" "0.1303.11" rxjs "6.6.7" +"@angular-devkit/build-webpack@0.1402.11": + version "0.1402.11" + resolved "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1402.11.tgz" + integrity sha512-Ajyg1O6B6JSHsDlPdh165uy3glW4IiUlRXu8VVAOSA88WIT1Dl17f4Oun0/t27ip0/CNceiVY9MzOqIwGL1E6g== + dependencies: + "@angular-devkit/architect" "0.1402.11" + rxjs "6.6.7" + "@angular-devkit/core@^12.2.17", "@angular-devkit/core@12.2.18": version "12.2.18" resolved "https://registry.npmjs.org/@angular-devkit/core/-/core-12.2.18.tgz" @@ -151,6 +242,17 @@ rxjs "6.6.7" source-map "0.7.3" +"@angular-devkit/core@14.2.11": + version "14.2.11" + resolved "https://registry.npmjs.org/@angular-devkit/core/-/core-14.2.11.tgz" + integrity sha512-cBIGs6y9rykOQqnuAQOB1DgIRyBFYtvKRJb7QNUfIJ0qUfARKkuV/yikv3lrb95ePGkmoRzmjkFqcFZiYU+r7A== + dependencies: + ajv "8.11.0" + ajv-formats "2.1.1" + jsonc-parser "3.1.0" + rxjs "6.6.7" + source-map "0.7.4" + "@angular-devkit/schematics@^12.2.17", "@angular-devkit/schematics@12.2.18": version "12.2.18" resolved "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-12.2.18.tgz" @@ -276,7 +378,23 @@ dependencies: tslib "^2.3.0" -"@angular/compiler-cli@^13.0.0", "@angular/compiler-cli@^13.0.0 || ^13.3.0-rc.0", "@angular/compiler-cli@~14.3.0", "@angular/compiler-cli@14.3.0": +"@angular/compiler-cli@^13.0.0 || ^13.3.0-rc.0", "@angular/compiler-cli@13.4.0": + version "13.4.0" + resolved "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-13.4.0.tgz" + integrity sha512-OQD0w9aZXbpcyWDEaozoHH/n3eYDLhBsmJcIBVqUN8Awx8m17v2u2R6m7DIEpVRbBzYtTscAMTKONNVwsTolHA== + dependencies: + "@babel/core" "^7.17.2" + chokidar "^3.0.0" + convert-source-map "^1.5.1" + dependency-graph "^0.11.0" + magic-string "^0.26.0" + reflect-metadata "^0.1.2" + semver "^7.0.0" + sourcemap-codec "^1.4.8" + tslib "^2.3.0" + yargs "^17.2.1" + +"@angular/compiler-cli@^13.0.0", "@angular/compiler-cli@^14.0.0", "@angular/compiler-cli@~14.3.0", "@angular/compiler-cli@14.3.0": version "14.3.0" resolved "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-14.3.0.tgz" integrity sha512-eoKpKdQ2X6axMgzcPUMZVYl3bIlTMzMeTo5V29No4BzgiUB+QoOTYGNJZkGRyqTNpwD9uSBJvmT2vG9+eC4ghQ== @@ -299,6 +417,13 @@ dependencies: tslib "^2.3.0" +"@angular/compiler@13.4.0": + version "13.4.0" + resolved "https://registry.npmjs.org/@angular/compiler/-/compiler-13.4.0.tgz" + integrity sha512-tPWoq2RC/VIrJtynEnMRWQZemBIC/ypuVfuUf3p8IIXCZHjuGnibdlZTtFYkexc4/sR1ug9xk1cJWvbOPwilng== + dependencies: + tslib "^2.3.0" + "@angular/core@*", "@angular/core@^11.0.0", "@angular/core@^13.0.0", "@angular/core@^13.0.0 || ^14.0.0-0", "@angular/core@^13.3.4", "@angular/core@>=10.0.0", "@angular/core@>=12", "@angular/core@>=13.0.0 <14", "@angular/core@>=13.0.0-0", "@angular/core@>=2.x", "@angular/core@>=5.0.0", "@angular/core@>=5.0.0 <14.0.0", "@angular/core@~14.3.0", "@angular/core@14.3.0", "@angular/core@5.0.0-alpha - 5 || 6.0.0-alpha - 6 || 7.0.0-alpha - 7 || 8.0.0-alpha - 8 || 9.0.0-alpha - 9 || 10.0.0-alpha - 10 || 11.0.0-alpha - 11 || 12.0.0-alpha - 12 || 13.0.0-alpha - 13 || 14.0.0-alpha - 14": version "14.3.0" resolved "https://registry.npmjs.org/@angular/core/-/core-14.3.0.tgz" @@ -325,7 +450,16 @@ resolved "https://registry.npmjs.org/@angular/language-service/-/language-service-14.3.0.tgz" integrity sha512-Sij3OQzj1UGs1O8H9PxVAY/o27+oqZwQRnib66rsWvtbIBTjHp4FV3dTs5iVcr62GGv4V4Mff/2I82NP10GPQg== -"@angular/localize@^13.0.0", "@angular/localize@^13.0.0 || ^13.3.0-rc.0", "@angular/localize@14.3.0": +"@angular/localize@^13.0.0 || ^13.3.0-rc.0": + version "13.4.0" + resolved "https://registry.npmjs.org/@angular/localize/-/localize-13.4.0.tgz" + integrity sha512-du98xPMGNexwqc1Tbg1lR3tihUlW9IBn7OaTDVdzhFuIUkt30mLK4ri2LSpLZrwT5q3nLHi0e7O3ublY7ubGzQ== + dependencies: + "@babel/core" "7.17.2" + glob "7.2.0" + yargs "^17.2.1" + +"@angular/localize@^13.0.0", "@angular/localize@^14.0.0", "@angular/localize@14.3.0": version "14.3.0" resolved "https://registry.npmjs.org/@angular/localize/-/localize-14.3.0.tgz" integrity sha512-YmwlOEGnFonfDrIcWqlxXVFFjd0Q6yXeHGZCBFBfwbtjIseiJJ4UBmkTUgFeq7qlWevSFQzHdQnraFRGZpnMig== @@ -376,7 +510,7 @@ dependencies: "@babel/highlight" "^7.18.6" -"@babel/compat-data@^7.16.8", "@babel/compat-data@^7.17.7", "@babel/compat-data@^7.20.5", "@babel/compat-data@^7.21.4": +"@babel/compat-data@^7.16.8", "@babel/compat-data@^7.17.7", "@babel/compat-data@^7.18.8", "@babel/compat-data@^7.20.5", "@babel/compat-data@^7.21.4": version "7.21.4" resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.21.4.tgz" integrity sha512-/DYyDpeCfaVinT40FPGdkkb+lYSKvsVuMjDAG7jPOWWiM1ibOaB9CXJAlc4d1QpP/U2q2P9jbrSlClKSErd55g== @@ -423,6 +557,48 @@ semver "^6.3.0" source-map "^0.5.0" +"@babel/core@7.17.2": + version "7.17.2" + resolved "https://registry.npmjs.org/@babel/core/-/core-7.17.2.tgz" + integrity sha512-R3VH5G42VSDolRHyUO4V2cfag8WHcZyxdq5Z/m8Xyb92lW/Erm/6kM+XtRFGf3Mulre3mveni2NHfEUws8wSvw== + dependencies: + "@ampproject/remapping" "^2.0.0" + "@babel/code-frame" "^7.16.7" + "@babel/generator" "^7.17.0" + "@babel/helper-compilation-targets" "^7.16.7" + "@babel/helper-module-transforms" "^7.16.7" + "@babel/helpers" "^7.17.2" + "@babel/parser" "^7.17.0" + "@babel/template" "^7.16.7" + "@babel/traverse" "^7.17.0" + "@babel/types" "^7.17.0" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.1.2" + semver "^6.3.0" + +"@babel/core@7.18.10": + version "7.18.10" + resolved "https://registry.npmjs.org/@babel/core/-/core-7.18.10.tgz" + integrity sha512-JQM6k6ENcBFKVtWvLavlvi/mPcpYZ3+R+2EySDEMSMbp7Mn4FexlbbJVrx2R7Ijhr01T8gyqrOaABWIOgxeUyw== + dependencies: + "@ampproject/remapping" "^2.1.0" + "@babel/code-frame" "^7.18.6" + "@babel/generator" "^7.18.10" + "@babel/helper-compilation-targets" "^7.18.9" + "@babel/helper-module-transforms" "^7.18.9" + "@babel/helpers" "^7.18.9" + "@babel/parser" "^7.18.10" + "@babel/template" "^7.18.10" + "@babel/traverse" "^7.18.10" + "@babel/types" "^7.18.10" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.2.1" + semver "^6.3.0" + "@babel/generator@^7.16.8", "@babel/generator@7.16.8": version "7.16.8" resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.16.8.tgz" @@ -432,6 +608,25 @@ jsesc "^2.5.1" source-map "^0.5.0" +"@babel/generator@^7.17.0": + version "7.21.4" + resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.21.4.tgz" + integrity sha512-NieM3pVIYW2SwGzKoqfPrQsf4xGs9M9AIG3ThppsSRmO+m7eQhmI6amajKMUeIO37wFfsvnvcxQFx6x6iqxDnA== + dependencies: + "@babel/types" "^7.21.4" + "@jridgewell/gen-mapping" "^0.3.2" + "@jridgewell/trace-mapping" "^0.3.17" + jsesc "^2.5.1" + +"@babel/generator@^7.18.10", "@babel/generator@7.18.12": + version "7.18.12" + resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.18.12.tgz" + integrity sha512-dfQ8ebCN98SvyL7IxNMCUtZQSq5R7kxgN+r8qYTGDmmSion1hX2C0zq2yo1bsCDhXixokv1SAWTZUMYbO/V5zg== + dependencies: + "@babel/types" "^7.18.10" + "@jridgewell/gen-mapping" "^0.3.2" + jsesc "^2.5.1" + "@babel/generator@^7.18.9", "@babel/generator@^7.21.4": version "7.21.4" resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.21.4.tgz" @@ -442,7 +637,7 @@ "@jridgewell/trace-mapping" "^0.3.17" jsesc "^2.5.1" -"@babel/helper-annotate-as-pure@^7.18.6": +"@babel/helper-annotate-as-pure@^7.18.6", "@babel/helper-annotate-as-pure@7.18.6": version "7.18.6" resolved "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz" integrity sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA== @@ -571,12 +766,12 @@ dependencies: "@babel/types" "^7.18.6" -"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.16.7", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.18.9", "@babel/helper-plugin-utils@^7.20.2", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.16.7", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.18.9", "@babel/helper-plugin-utils@^7.19.0", "@babel/helper-plugin-utils@^7.20.2", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": version "7.20.2" resolved "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz" integrity sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ== -"@babel/helper-remap-async-to-generator@^7.16.8": +"@babel/helper-remap-async-to-generator@^7.16.8", "@babel/helper-remap-async-to-generator@^7.18.6", "@babel/helper-remap-async-to-generator@^7.18.9": version "7.18.9" resolved "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.9.tgz" integrity sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA== @@ -629,7 +824,7 @@ resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz" integrity sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w== -"@babel/helper-validator-option@^7.16.7", "@babel/helper-validator-option@^7.21.0": +"@babel/helper-validator-option@^7.16.7", "@babel/helper-validator-option@^7.18.6", "@babel/helper-validator-option@^7.21.0": version "7.21.0" resolved "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.21.0.tgz" integrity sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ== @@ -644,7 +839,7 @@ "@babel/traverse" "^7.20.5" "@babel/types" "^7.20.5" -"@babel/helpers@^7.16.7", "@babel/helpers@^7.18.9": +"@babel/helpers@^7.16.7", "@babel/helpers@^7.17.2", "@babel/helpers@^7.18.9": version "7.21.0" resolved "https://registry.npmjs.org/@babel/helpers/-/helpers-7.21.0.tgz" integrity sha512-XXve0CBtOW0pd7MRzzmoyuSj0e3SEzj8pgyFxnTT1NJZL38BD1MK7yYrm8yefRPIDvNNe14xR4FdbHwpInD4rA== @@ -662,19 +857,19 @@ chalk "^2.0.0" js-tokens "^4.0.0" -"@babel/parser@^7.10.3", "@babel/parser@^7.14.7", "@babel/parser@^7.16.12", "@babel/parser@^7.16.7", "@babel/parser@^7.18.9", "@babel/parser@^7.20.7", "@babel/parser@^7.21.4": +"@babel/parser@^7.10.3", "@babel/parser@^7.14.7", "@babel/parser@^7.16.12", "@babel/parser@^7.16.7", "@babel/parser@^7.17.0", "@babel/parser@^7.18.10", "@babel/parser@^7.18.9", "@babel/parser@^7.20.7", "@babel/parser@^7.21.4": version "7.21.4" resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.21.4.tgz" integrity sha512-alVJj7k7zIxqBZ7BTRhz0IqJFxW1VJbm6N8JbcYhQ186df9ZBPbZBmWSqAMXwHGsCJdYks7z/voa3ibiS5bCIw== -"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.16.7": +"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.16.7", "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.18.6": version "7.18.6" resolved "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.18.6.tgz" integrity sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ== dependencies: "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.16.7": +"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.16.7", "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.18.9": version "7.20.7" resolved "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.20.7.tgz" integrity sha512-sbr9+wNE5aXMBBFBICk01tt7sBf2Oc9ikRFEcem/ZORup9IMUdNhW7/wVLEbbtlWOsEubJet46mHAL2C8+2jKQ== @@ -692,7 +887,17 @@ "@babel/helper-remap-async-to-generator" "^7.16.8" "@babel/plugin-syntax-async-generators" "^7.8.4" -"@babel/plugin-proposal-class-properties@^7.16.7": +"@babel/plugin-proposal-async-generator-functions@^7.18.10", "@babel/plugin-proposal-async-generator-functions@7.18.10": + version "7.18.10" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.18.10.tgz" + integrity sha512-1mFuY2TOsR1hxbjCo4QL+qlIjV07p4H4EUYw2J/WCqsvFV6V9X9z9YhXbWndc/4fw+hYGlDT7egYxliMp5O6Ew== + dependencies: + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-plugin-utils" "^7.18.9" + "@babel/helper-remap-async-to-generator" "^7.18.9" + "@babel/plugin-syntax-async-generators" "^7.8.4" + +"@babel/plugin-proposal-class-properties@^7.16.7", "@babel/plugin-proposal-class-properties@^7.18.6": version "7.18.6" resolved "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz" integrity sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ== @@ -700,7 +905,7 @@ "@babel/helper-create-class-features-plugin" "^7.18.6" "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-proposal-class-static-block@^7.16.7": +"@babel/plugin-proposal-class-static-block@^7.16.7", "@babel/plugin-proposal-class-static-block@^7.18.6": version "7.21.0" resolved "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.21.0.tgz" integrity sha512-XP5G9MWNUskFuP30IfFSEFB0Z6HzLIUcjYM4bYOPHXl7eiJ9HFv8tWj6TXTN5QODiEhDZAeI4hLok2iHFFV4hw== @@ -709,7 +914,7 @@ "@babel/helper-plugin-utils" "^7.20.2" "@babel/plugin-syntax-class-static-block" "^7.14.5" -"@babel/plugin-proposal-dynamic-import@^7.16.7": +"@babel/plugin-proposal-dynamic-import@^7.16.7", "@babel/plugin-proposal-dynamic-import@^7.18.6": version "7.18.6" resolved "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.18.6.tgz" integrity sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw== @@ -717,7 +922,7 @@ "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-syntax-dynamic-import" "^7.8.3" -"@babel/plugin-proposal-export-namespace-from@^7.16.7": +"@babel/plugin-proposal-export-namespace-from@^7.16.7", "@babel/plugin-proposal-export-namespace-from@^7.18.9": version "7.18.9" resolved "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.9.tgz" integrity sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA== @@ -725,7 +930,7 @@ "@babel/helper-plugin-utils" "^7.18.9" "@babel/plugin-syntax-export-namespace-from" "^7.8.3" -"@babel/plugin-proposal-json-strings@^7.16.7": +"@babel/plugin-proposal-json-strings@^7.16.7", "@babel/plugin-proposal-json-strings@^7.18.6": version "7.18.6" resolved "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.18.6.tgz" integrity sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ== @@ -733,7 +938,7 @@ "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-syntax-json-strings" "^7.8.3" -"@babel/plugin-proposal-logical-assignment-operators@^7.16.7": +"@babel/plugin-proposal-logical-assignment-operators@^7.16.7", "@babel/plugin-proposal-logical-assignment-operators@^7.18.9": version "7.20.7" resolved "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.20.7.tgz" integrity sha512-y7C7cZgpMIjWlKE5T7eJwp+tnRYM89HmRvWM5EQuB5BoHEONjmQ8lSNmBUwOyy/GFRsohJED51YBF79hE1djug== @@ -741,7 +946,7 @@ "@babel/helper-plugin-utils" "^7.20.2" "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" -"@babel/plugin-proposal-nullish-coalescing-operator@^7.16.7": +"@babel/plugin-proposal-nullish-coalescing-operator@^7.16.7", "@babel/plugin-proposal-nullish-coalescing-operator@^7.18.6": version "7.18.6" resolved "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz" integrity sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA== @@ -749,7 +954,7 @@ "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" -"@babel/plugin-proposal-numeric-separator@^7.16.7": +"@babel/plugin-proposal-numeric-separator@^7.16.7", "@babel/plugin-proposal-numeric-separator@^7.18.6": version "7.18.6" resolved "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz" integrity sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q== @@ -757,7 +962,7 @@ "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-syntax-numeric-separator" "^7.10.4" -"@babel/plugin-proposal-object-rest-spread@^7.16.7": +"@babel/plugin-proposal-object-rest-spread@^7.16.7", "@babel/plugin-proposal-object-rest-spread@^7.18.9": version "7.20.7" resolved "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz" integrity sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg== @@ -768,7 +973,7 @@ "@babel/plugin-syntax-object-rest-spread" "^7.8.3" "@babel/plugin-transform-parameters" "^7.20.7" -"@babel/plugin-proposal-optional-catch-binding@^7.16.7": +"@babel/plugin-proposal-optional-catch-binding@^7.16.7", "@babel/plugin-proposal-optional-catch-binding@^7.18.6": version "7.18.6" resolved "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz" integrity sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw== @@ -776,7 +981,7 @@ "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" -"@babel/plugin-proposal-optional-chaining@^7.16.7", "@babel/plugin-proposal-optional-chaining@^7.20.7": +"@babel/plugin-proposal-optional-chaining@^7.16.7", "@babel/plugin-proposal-optional-chaining@^7.18.9", "@babel/plugin-proposal-optional-chaining@^7.20.7": version "7.21.0" resolved "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.21.0.tgz" integrity sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA== @@ -785,7 +990,7 @@ "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" "@babel/plugin-syntax-optional-chaining" "^7.8.3" -"@babel/plugin-proposal-private-methods@^7.16.11": +"@babel/plugin-proposal-private-methods@^7.16.11", "@babel/plugin-proposal-private-methods@^7.18.6": version "7.18.6" resolved "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz" integrity sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA== @@ -793,7 +998,7 @@ "@babel/helper-create-class-features-plugin" "^7.18.6" "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-proposal-private-property-in-object@^7.16.7": +"@babel/plugin-proposal-private-property-in-object@^7.16.7", "@babel/plugin-proposal-private-property-in-object@^7.18.6": version "7.21.0" resolved "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0.tgz" integrity sha512-ha4zfehbJjc5MmXBlHec1igel5TJXXLDDRbuJ4+XT2TJcyD9/V1919BA8gMvsdHcNMBy4WBUBiRb3nw/EQUtBw== @@ -803,7 +1008,7 @@ "@babel/helper-plugin-utils" "^7.20.2" "@babel/plugin-syntax-private-property-in-object" "^7.14.5" -"@babel/plugin-proposal-unicode-property-regex@^7.16.7", "@babel/plugin-proposal-unicode-property-regex@^7.4.4": +"@babel/plugin-proposal-unicode-property-regex@^7.16.7", "@babel/plugin-proposal-unicode-property-regex@^7.18.6", "@babel/plugin-proposal-unicode-property-regex@^7.4.4": version "7.18.6" resolved "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz" integrity sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w== @@ -846,6 +1051,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.3" +"@babel/plugin-syntax-import-assertions@^7.18.6": + version "7.20.0" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.20.0.tgz" + integrity sha512-IUh1vakzNoWalR8ch/areW7qFopR2AEw03JlG7BbrDqmQ4X3q9uuipQwSGrUn7oGiemKjtSLDhNtQHzMHr1JdQ== + dependencies: + "@babel/helper-plugin-utils" "^7.19.0" + "@babel/plugin-syntax-json-strings@^7.8.3": version "7.8.3" resolved "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz" @@ -909,7 +1121,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-arrow-functions@^7.16.7": +"@babel/plugin-transform-arrow-functions@^7.16.7", "@babel/plugin-transform-arrow-functions@^7.18.6": version "7.20.7" resolved "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.20.7.tgz" integrity sha512-3poA5E7dzDomxj9WXWwuD6A5F3kc7VXwIJO+E+J8qtDtS+pXPAhrgEyh+9GBwBgPq1Z+bB+/JD60lp5jsN7JPQ== @@ -925,21 +1137,30 @@ "@babel/helper-plugin-utils" "^7.16.7" "@babel/helper-remap-async-to-generator" "^7.16.8" -"@babel/plugin-transform-block-scoped-functions@^7.16.7": +"@babel/plugin-transform-async-to-generator@^7.18.6", "@babel/plugin-transform-async-to-generator@7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.18.6.tgz" + integrity sha512-ARE5wZLKnTgPW7/1ftQmSi1CmkqqHo2DNmtztFhvgtOWSDfq0Cq9/9L+KnZNYSNrydBekhW3rwShduf59RoXag== + dependencies: + "@babel/helper-module-imports" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-remap-async-to-generator" "^7.18.6" + +"@babel/plugin-transform-block-scoped-functions@^7.16.7", "@babel/plugin-transform-block-scoped-functions@^7.18.6": version "7.18.6" resolved "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.18.6.tgz" integrity sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ== dependencies: "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-block-scoping@^7.16.7": +"@babel/plugin-transform-block-scoping@^7.16.7", "@babel/plugin-transform-block-scoping@^7.18.9": version "7.21.0" resolved "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.21.0.tgz" integrity sha512-Mdrbunoh9SxwFZapeHVrwFmri16+oYotcZysSzhNIVDwIAb1UV+kvnxULSYq9J3/q5MDG+4X6w8QVgD1zhBXNQ== dependencies: "@babel/helper-plugin-utils" "^7.20.2" -"@babel/plugin-transform-classes@^7.16.7": +"@babel/plugin-transform-classes@^7.16.7", "@babel/plugin-transform-classes@^7.18.9": version "7.21.0" resolved "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.21.0.tgz" integrity sha512-RZhbYTCEUAe6ntPehC4hlslPWosNHDox+vAs4On/mCLRLfoDVHf6hVEd7kuxr1RnHwJmxFfUM3cZiZRmPxJPXQ== @@ -954,7 +1175,7 @@ "@babel/helper-split-export-declaration" "^7.18.6" globals "^11.1.0" -"@babel/plugin-transform-computed-properties@^7.16.7": +"@babel/plugin-transform-computed-properties@^7.16.7", "@babel/plugin-transform-computed-properties@^7.18.9": version "7.20.7" resolved "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.20.7.tgz" integrity sha512-Lz7MvBK6DTjElHAmfu6bfANzKcxpyNPeYBGEafyA6E5HtRpjpZwU+u7Qrgz/2OR0z+5TvKYbPdphfSaAcZBrYQ== @@ -962,14 +1183,14 @@ "@babel/helper-plugin-utils" "^7.20.2" "@babel/template" "^7.20.7" -"@babel/plugin-transform-destructuring@^7.16.7": +"@babel/plugin-transform-destructuring@^7.16.7", "@babel/plugin-transform-destructuring@^7.18.9": version "7.21.3" resolved "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.21.3.tgz" integrity sha512-bp6hwMFzuiE4HqYEyoGJ/V2LeIWn+hLVKc4pnj++E5XQptwhtcGmSayM029d/j2X1bPKGTlsyPwAubuU22KhMA== dependencies: "@babel/helper-plugin-utils" "^7.20.2" -"@babel/plugin-transform-dotall-regex@^7.16.7", "@babel/plugin-transform-dotall-regex@^7.4.4": +"@babel/plugin-transform-dotall-regex@^7.16.7", "@babel/plugin-transform-dotall-regex@^7.18.6", "@babel/plugin-transform-dotall-regex@^7.4.4": version "7.18.6" resolved "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.18.6.tgz" integrity sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg== @@ -977,14 +1198,14 @@ "@babel/helper-create-regexp-features-plugin" "^7.18.6" "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-duplicate-keys@^7.16.7": +"@babel/plugin-transform-duplicate-keys@^7.16.7", "@babel/plugin-transform-duplicate-keys@^7.18.9": version "7.18.9" resolved "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.9.tgz" integrity sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw== dependencies: "@babel/helper-plugin-utils" "^7.18.9" -"@babel/plugin-transform-exponentiation-operator@^7.16.7": +"@babel/plugin-transform-exponentiation-operator@^7.16.7", "@babel/plugin-transform-exponentiation-operator@^7.18.6": version "7.18.6" resolved "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.18.6.tgz" integrity sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw== @@ -992,14 +1213,14 @@ "@babel/helper-builder-binary-assignment-operator-visitor" "^7.18.6" "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-for-of@^7.16.7": +"@babel/plugin-transform-for-of@^7.16.7", "@babel/plugin-transform-for-of@^7.18.8": version "7.21.0" resolved "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.21.0.tgz" integrity sha512-LlUYlydgDkKpIY7mcBWvyPPmMcOphEyYA27Ef4xpbh1IiDNLr0kZsos2nf92vz3IccvJI25QUwp86Eo5s6HmBQ== dependencies: "@babel/helper-plugin-utils" "^7.20.2" -"@babel/plugin-transform-function-name@^7.16.7": +"@babel/plugin-transform-function-name@^7.16.7", "@babel/plugin-transform-function-name@^7.18.9": version "7.18.9" resolved "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.9.tgz" integrity sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ== @@ -1008,21 +1229,21 @@ "@babel/helper-function-name" "^7.18.9" "@babel/helper-plugin-utils" "^7.18.9" -"@babel/plugin-transform-literals@^7.16.7": +"@babel/plugin-transform-literals@^7.16.7", "@babel/plugin-transform-literals@^7.18.9": version "7.18.9" resolved "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.9.tgz" integrity sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg== dependencies: "@babel/helper-plugin-utils" "^7.18.9" -"@babel/plugin-transform-member-expression-literals@^7.16.7": +"@babel/plugin-transform-member-expression-literals@^7.16.7", "@babel/plugin-transform-member-expression-literals@^7.18.6": version "7.18.6" resolved "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.18.6.tgz" integrity sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA== dependencies: "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-modules-amd@^7.16.7": +"@babel/plugin-transform-modules-amd@^7.16.7", "@babel/plugin-transform-modules-amd@^7.18.6": version "7.20.11" resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.20.11.tgz" integrity sha512-NuzCt5IIYOW0O30UvqktzHYR2ud5bOWbY0yaxWZ6G+aFzOMJvrs5YHNikrbdaT15+KNO31nPOy5Fim3ku6Zb5g== @@ -1030,7 +1251,7 @@ "@babel/helper-module-transforms" "^7.20.11" "@babel/helper-plugin-utils" "^7.20.2" -"@babel/plugin-transform-modules-commonjs@^7.16.8": +"@babel/plugin-transform-modules-commonjs@^7.16.8", "@babel/plugin-transform-modules-commonjs@^7.18.6": version "7.21.2" resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.21.2.tgz" integrity sha512-Cln+Yy04Gxua7iPdj6nOV96smLGjpElir5YwzF0LBPKoPlLDNJePNlrGGaybAJkd0zKRnOVXOgizSqPYMNYkzA== @@ -1039,7 +1260,7 @@ "@babel/helper-plugin-utils" "^7.20.2" "@babel/helper-simple-access" "^7.20.2" -"@babel/plugin-transform-modules-systemjs@^7.16.7": +"@babel/plugin-transform-modules-systemjs@^7.16.7", "@babel/plugin-transform-modules-systemjs@^7.18.9": version "7.20.11" resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.20.11.tgz" integrity sha512-vVu5g9BPQKSFEmvt2TA4Da5N+QVS66EX21d8uoOihC+OCpUoGvzVsXeqFdtAEfVa5BILAeFt+U7yVmLbQnAJmw== @@ -1049,7 +1270,7 @@ "@babel/helper-plugin-utils" "^7.20.2" "@babel/helper-validator-identifier" "^7.19.1" -"@babel/plugin-transform-modules-umd@^7.16.7": +"@babel/plugin-transform-modules-umd@^7.16.7", "@babel/plugin-transform-modules-umd@^7.18.6": version "7.18.6" resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.6.tgz" integrity sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ== @@ -1057,7 +1278,7 @@ "@babel/helper-module-transforms" "^7.18.6" "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-named-capturing-groups-regex@^7.16.8": +"@babel/plugin-transform-named-capturing-groups-regex@^7.16.8", "@babel/plugin-transform-named-capturing-groups-regex@^7.18.6": version "7.20.5" resolved "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.20.5.tgz" integrity sha512-mOW4tTzi5iTLnw+78iEq3gr8Aoq4WNRGpmSlrogqaiCBoR1HFhpU4JkpQFOHfeYx3ReVIFWOQJS4aZBRvuZ6mA== @@ -1065,14 +1286,14 @@ "@babel/helper-create-regexp-features-plugin" "^7.20.5" "@babel/helper-plugin-utils" "^7.20.2" -"@babel/plugin-transform-new-target@^7.16.7": +"@babel/plugin-transform-new-target@^7.16.7", "@babel/plugin-transform-new-target@^7.18.6": version "7.18.6" resolved "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.18.6.tgz" integrity sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw== dependencies: "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-object-super@^7.16.7": +"@babel/plugin-transform-object-super@^7.16.7", "@babel/plugin-transform-object-super@^7.18.6": version "7.18.6" resolved "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.18.6.tgz" integrity sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA== @@ -1080,21 +1301,21 @@ "@babel/helper-plugin-utils" "^7.18.6" "@babel/helper-replace-supers" "^7.18.6" -"@babel/plugin-transform-parameters@^7.16.7", "@babel/plugin-transform-parameters@^7.20.7": +"@babel/plugin-transform-parameters@^7.16.7", "@babel/plugin-transform-parameters@^7.18.8", "@babel/plugin-transform-parameters@^7.20.7": version "7.21.3" resolved "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.21.3.tgz" integrity sha512-Wxc+TvppQG9xWFYatvCGPvZ6+SIUxQ2ZdiBP+PHYMIjnPXD+uThCshaz4NZOnODAtBjjcVQQ/3OKs9LW28purQ== dependencies: "@babel/helper-plugin-utils" "^7.20.2" -"@babel/plugin-transform-property-literals@^7.16.7": +"@babel/plugin-transform-property-literals@^7.16.7", "@babel/plugin-transform-property-literals@^7.18.6": version "7.18.6" resolved "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.18.6.tgz" integrity sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg== dependencies: "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-regenerator@^7.16.7": +"@babel/plugin-transform-regenerator@^7.16.7", "@babel/plugin-transform-regenerator@^7.18.6": version "7.20.5" resolved "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.20.5.tgz" integrity sha512-kW/oO7HPBtntbsahzQ0qSE3tFvkFwnbozz3NWFhLGqH75vLEg+sCGngLlhVkePlCs3Jv0dBBHDzCHxNiFAQKCQ== @@ -1102,7 +1323,7 @@ "@babel/helper-plugin-utils" "^7.20.2" regenerator-transform "^0.15.1" -"@babel/plugin-transform-reserved-words@^7.16.7": +"@babel/plugin-transform-reserved-words@^7.16.7", "@babel/plugin-transform-reserved-words@^7.18.6": version "7.18.6" resolved "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.18.6.tgz" integrity sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA== @@ -1121,14 +1342,26 @@ babel-plugin-polyfill-regenerator "^0.3.0" semver "^6.3.0" -"@babel/plugin-transform-shorthand-properties@^7.16.7": +"@babel/plugin-transform-runtime@7.18.10": + version "7.18.10" + resolved "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.18.10.tgz" + integrity sha512-q5mMeYAdfEbpBAgzl7tBre/la3LeCxmDO1+wMXRdPWbcoMjR3GiXlCLk7JBZVVye0bqTGNMbt0yYVXX1B1jEWQ== + dependencies: + "@babel/helper-module-imports" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.9" + babel-plugin-polyfill-corejs2 "^0.3.2" + babel-plugin-polyfill-corejs3 "^0.5.3" + babel-plugin-polyfill-regenerator "^0.4.0" + semver "^6.3.0" + +"@babel/plugin-transform-shorthand-properties@^7.16.7", "@babel/plugin-transform-shorthand-properties@^7.18.6": version "7.18.6" resolved "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.18.6.tgz" integrity sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw== dependencies: "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-spread@^7.16.7": +"@babel/plugin-transform-spread@^7.16.7", "@babel/plugin-transform-spread@^7.18.9": version "7.20.7" resolved "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.20.7.tgz" integrity sha512-ewBbHQ+1U/VnH1fxltbJqDeWBU1oNLG8Dj11uIv3xVf7nrQu0bPGe5Rf716r7K5Qz+SqtAOVswoVunoiBtGhxw== @@ -1136,35 +1369,35 @@ "@babel/helper-plugin-utils" "^7.20.2" "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" -"@babel/plugin-transform-sticky-regex@^7.16.7": +"@babel/plugin-transform-sticky-regex@^7.16.7", "@babel/plugin-transform-sticky-regex@^7.18.6": version "7.18.6" resolved "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.18.6.tgz" integrity sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q== dependencies: "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-template-literals@^7.16.7": +"@babel/plugin-transform-template-literals@^7.16.7", "@babel/plugin-transform-template-literals@^7.18.9": version "7.18.9" resolved "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.9.tgz" integrity sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA== dependencies: "@babel/helper-plugin-utils" "^7.18.9" -"@babel/plugin-transform-typeof-symbol@^7.16.7": +"@babel/plugin-transform-typeof-symbol@^7.16.7", "@babel/plugin-transform-typeof-symbol@^7.18.9": version "7.18.9" resolved "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.9.tgz" integrity sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw== dependencies: "@babel/helper-plugin-utils" "^7.18.9" -"@babel/plugin-transform-unicode-escapes@^7.16.7": +"@babel/plugin-transform-unicode-escapes@^7.16.7", "@babel/plugin-transform-unicode-escapes@^7.18.10": version "7.18.10" resolved "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.18.10.tgz" integrity sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ== dependencies: "@babel/helper-plugin-utils" "^7.18.9" -"@babel/plugin-transform-unicode-regex@^7.16.7": +"@babel/plugin-transform-unicode-regex@^7.16.7", "@babel/plugin-transform-unicode-regex@^7.18.6": version "7.18.6" resolved "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.18.6.tgz" integrity sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA== @@ -1252,6 +1485,87 @@ core-js-compat "^3.20.2" semver "^6.3.0" +"@babel/preset-env@7.18.10": + version "7.18.10" + resolved "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.18.10.tgz" + integrity sha512-wVxs1yjFdW3Z/XkNfXKoblxoHgbtUF7/l3PvvP4m02Qz9TZ6uZGxRVYjSQeR87oQmHco9zWitW5J82DJ7sCjvA== + dependencies: + "@babel/compat-data" "^7.18.8" + "@babel/helper-compilation-targets" "^7.18.9" + "@babel/helper-plugin-utils" "^7.18.9" + "@babel/helper-validator-option" "^7.18.6" + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.18.6" + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.18.9" + "@babel/plugin-proposal-async-generator-functions" "^7.18.10" + "@babel/plugin-proposal-class-properties" "^7.18.6" + "@babel/plugin-proposal-class-static-block" "^7.18.6" + "@babel/plugin-proposal-dynamic-import" "^7.18.6" + "@babel/plugin-proposal-export-namespace-from" "^7.18.9" + "@babel/plugin-proposal-json-strings" "^7.18.6" + "@babel/plugin-proposal-logical-assignment-operators" "^7.18.9" + "@babel/plugin-proposal-nullish-coalescing-operator" "^7.18.6" + "@babel/plugin-proposal-numeric-separator" "^7.18.6" + "@babel/plugin-proposal-object-rest-spread" "^7.18.9" + "@babel/plugin-proposal-optional-catch-binding" "^7.18.6" + "@babel/plugin-proposal-optional-chaining" "^7.18.9" + "@babel/plugin-proposal-private-methods" "^7.18.6" + "@babel/plugin-proposal-private-property-in-object" "^7.18.6" + "@babel/plugin-proposal-unicode-property-regex" "^7.18.6" + "@babel/plugin-syntax-async-generators" "^7.8.4" + "@babel/plugin-syntax-class-properties" "^7.12.13" + "@babel/plugin-syntax-class-static-block" "^7.14.5" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" + "@babel/plugin-syntax-export-namespace-from" "^7.8.3" + "@babel/plugin-syntax-import-assertions" "^7.18.6" + "@babel/plugin-syntax-json-strings" "^7.8.3" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + "@babel/plugin-syntax-private-property-in-object" "^7.14.5" + "@babel/plugin-syntax-top-level-await" "^7.14.5" + "@babel/plugin-transform-arrow-functions" "^7.18.6" + "@babel/plugin-transform-async-to-generator" "^7.18.6" + "@babel/plugin-transform-block-scoped-functions" "^7.18.6" + "@babel/plugin-transform-block-scoping" "^7.18.9" + "@babel/plugin-transform-classes" "^7.18.9" + "@babel/plugin-transform-computed-properties" "^7.18.9" + "@babel/plugin-transform-destructuring" "^7.18.9" + "@babel/plugin-transform-dotall-regex" "^7.18.6" + "@babel/plugin-transform-duplicate-keys" "^7.18.9" + "@babel/plugin-transform-exponentiation-operator" "^7.18.6" + "@babel/plugin-transform-for-of" "^7.18.8" + "@babel/plugin-transform-function-name" "^7.18.9" + "@babel/plugin-transform-literals" "^7.18.9" + "@babel/plugin-transform-member-expression-literals" "^7.18.6" + "@babel/plugin-transform-modules-amd" "^7.18.6" + "@babel/plugin-transform-modules-commonjs" "^7.18.6" + "@babel/plugin-transform-modules-systemjs" "^7.18.9" + "@babel/plugin-transform-modules-umd" "^7.18.6" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.18.6" + "@babel/plugin-transform-new-target" "^7.18.6" + "@babel/plugin-transform-object-super" "^7.18.6" + "@babel/plugin-transform-parameters" "^7.18.8" + "@babel/plugin-transform-property-literals" "^7.18.6" + "@babel/plugin-transform-regenerator" "^7.18.6" + "@babel/plugin-transform-reserved-words" "^7.18.6" + "@babel/plugin-transform-shorthand-properties" "^7.18.6" + "@babel/plugin-transform-spread" "^7.18.9" + "@babel/plugin-transform-sticky-regex" "^7.18.6" + "@babel/plugin-transform-template-literals" "^7.18.9" + "@babel/plugin-transform-typeof-symbol" "^7.18.9" + "@babel/plugin-transform-unicode-escapes" "^7.18.10" + "@babel/plugin-transform-unicode-regex" "^7.18.6" + "@babel/preset-modules" "^0.1.5" + "@babel/types" "^7.18.10" + babel-plugin-polyfill-corejs2 "^0.3.2" + babel-plugin-polyfill-corejs3 "^0.5.3" + babel-plugin-polyfill-regenerator "^0.4.0" + core-js-compat "^3.22.1" + semver "^6.3.0" + "@babel/preset-modules@^0.1.5": version "0.1.5" resolved "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.5.tgz" @@ -1290,6 +1604,13 @@ dependencies: regenerator-runtime "^0.13.4" +"@babel/runtime@7.18.9": + version "7.18.9" + resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.18.9.tgz" + integrity sha512-lkqXDcvlFT5rvEjiu6+QYO+1GXrEHRo2LOtS7E4GtX5ESIZOgepqsZBVIj6Pv+a6zqsya9VCgiK1KAK4BvJDAw== + dependencies: + regenerator-runtime "^0.13.4" + "@babel/template@^7.16.7", "@babel/template@7.16.7": version "7.16.7" resolved "https://registry.npmjs.org/@babel/template/-/template-7.16.7.tgz" @@ -1308,7 +1629,16 @@ "@babel/parser" "^7.20.7" "@babel/types" "^7.20.7" -"@babel/traverse@^7.10.3", "@babel/traverse@^7.16.10", "@babel/traverse@^7.18.9", "@babel/traverse@^7.20.5", "@babel/traverse@^7.20.7", "@babel/traverse@^7.21.0", "@babel/traverse@^7.21.2": +"@babel/template@7.18.10": + version "7.18.10" + resolved "https://registry.npmjs.org/@babel/template/-/template-7.18.10.tgz" + integrity sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA== + dependencies: + "@babel/code-frame" "^7.18.6" + "@babel/parser" "^7.18.10" + "@babel/types" "^7.18.10" + +"@babel/traverse@^7.10.3", "@babel/traverse@^7.16.10", "@babel/traverse@^7.17.0", "@babel/traverse@^7.18.10", "@babel/traverse@^7.18.9", "@babel/traverse@^7.20.5", "@babel/traverse@^7.20.7", "@babel/traverse@^7.21.0", "@babel/traverse@^7.21.2": version "7.21.4" resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.21.4.tgz" integrity sha512-eyKrRHKdyZxqDm+fV1iqL9UAHMoIg0nDaGqfIOd8rKH17m5snv7Gn4qgjBoFfLz9APvjFU/ICT00NVCv1Epp8Q== @@ -1324,7 +1654,7 @@ debug "^4.1.0" globals "^11.1.0" -"@babel/types@^7.10.3", "@babel/types@^7.16.7", "@babel/types@^7.16.8", "@babel/types@^7.18.6", "@babel/types@^7.18.9", "@babel/types@^7.20.0", "@babel/types@^7.20.2", "@babel/types@^7.20.5", "@babel/types@^7.20.7", "@babel/types@^7.21.0", "@babel/types@^7.21.2", "@babel/types@^7.21.4", "@babel/types@^7.4.4": +"@babel/types@^7.10.3", "@babel/types@^7.16.7", "@babel/types@^7.16.8", "@babel/types@^7.17.0", "@babel/types@^7.18.10", "@babel/types@^7.18.6", "@babel/types@^7.18.9", "@babel/types@^7.20.0", "@babel/types@^7.20.2", "@babel/types@^7.20.5", "@babel/types@^7.20.7", "@babel/types@^7.21.0", "@babel/types@^7.21.2", "@babel/types@^7.21.4", "@babel/types@^7.4.4": version "7.21.4" resolved "https://registry.npmjs.org/@babel/types/-/types-7.21.4.tgz" integrity sha512-rU2oY501qDxE8Pyo7i/Orqma4ziCOrby0/9mvbDUGEfvZjb279Nk9k19e2fiCxHbRRpY2ZyrgW1eq22mvmOIzA== @@ -1345,7 +1675,7 @@ dependencies: "@jridgewell/trace-mapping" "0.3.9" -"@csstools/postcss-cascade-layers@^1.1.1": +"@csstools/postcss-cascade-layers@^1.0.5", "@csstools/postcss-cascade-layers@^1.1.1": version "1.1.1" resolved "https://registry.npmjs.org/@csstools/postcss-cascade-layers/-/postcss-cascade-layers-1.1.1.tgz" integrity sha512-+KdYrpKC5TgomQr2DlZF4lDEpHcoxnj5IGddYYfBWJAKfj1JtuHUIqMa+E1pJJ+z3kvDViWMqyqPlG4Ja7amQA== @@ -1815,6 +2145,11 @@ resolved "https://registry.npmjs.org/@ngtools/webpack/-/webpack-13.3.11.tgz" integrity sha512-gB33hTbc/RJmHyIgSUYj8ErPazhYYm7yfapOnvwHdYhCjrj1TKkR1ierOlhJtpfBYUQg6FChdl2YpyIQNPjWMA== +"@ngtools/webpack@14.2.11": + version "14.2.11" + resolved "https://registry.npmjs.org/@ngtools/webpack/-/webpack-14.2.11.tgz" + integrity sha512-4enbLFAp98uTgWYF6OFceQqLcfv2/0brIrNN4iWT9xe/Mh3zdCt+eH42zvNRsqo9WXNWRSLvnx8I924p83LNlw== + "@nguniversal/builders@^13.1.1": version "13.1.1" resolved "https://registry.npmjs.org/@nguniversal/builders/-/builders-13.1.1.tgz" @@ -2333,9 +2668,9 @@ "@types/react" "*" "@types/react@*", "@types/react@^16.8.6 || ^17.0.0": - version "18.0.34" - resolved "https://registry.npmjs.org/@types/react/-/react-18.0.34.tgz" - integrity sha512-NO1UO8941541CJl1BeOXi8a9dNKFK09Gnru5ZJqkm4Q3/WoQJtHvmwt0VX0SB9YCEwe7TfSSxDuaNmx6H2BAIQ== + version "17.0.57" + resolved "https://registry.npmjs.org/@types/react/-/react-17.0.57.tgz" + integrity sha512-e4msYpu5QDxzNrXDHunU/VPyv2M1XemGG/p7kfCjUiPtlLDCWLGQfgAMng6YyisWYxZ09mYdQlmMnyS0NfZdEg== dependencies: "@types/prop-types" "*" "@types/scheduler" "*" @@ -2846,7 +3181,7 @@ ajv-keywords@^5.0.0: dependencies: fast-deep-equal "^3.1.3" -ajv@^6.10.0: +ajv@^6.10.0, ajv@^6.12.4, ajv@^6.12.5, ajv@^6.9.1: version "6.12.6" resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz" integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== @@ -2856,40 +3191,40 @@ ajv@^6.10.0: json-schema-traverse "^0.4.1" uri-js "^4.2.2" -ajv@^6.12.4: - version "6.12.6" - resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz" - integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== - dependencies: - fast-deep-equal "^3.1.1" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.4.1" - uri-js "^4.2.2" - -ajv@^6.12.5: - version "6.12.6" - resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz" - integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== - dependencies: - fast-deep-equal "^3.1.1" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.4.1" - uri-js "^4.2.2" - -ajv@^6.9.1, ajv@^8.0.0, ajv@^8.8.0, ajv@^8.8.2, ajv@8.9.0: - version "8.9.0" - resolved "https://registry.npmjs.org/ajv/-/ajv-8.9.0.tgz" - integrity sha512-qOKJyNj/h+OWx7s5DePL6Zu1KeM9jPZhwBqs+7DzP6bGOvqzVCSf0xueYmVuaC/oQ/VtS2zLMLHdQFbkka+XDQ== +ajv@^8.0.0, ajv@8.6.2: + version "8.6.2" + resolved "https://registry.npmjs.org/ajv/-/ajv-8.6.2.tgz" + integrity sha512-9807RlWAgT564wT+DjeyU5OFMPjmzxVobvDFmNAhY+5zD6A2ly3jDp6sgnfyDtlIQ+7H97oc/DGCzzfu9rjw9w== dependencies: fast-deep-equal "^3.1.1" json-schema-traverse "^1.0.0" require-from-string "^2.0.2" uri-js "^4.2.2" -ajv@8.6.2: - version "8.6.2" - resolved "https://registry.npmjs.org/ajv/-/ajv-8.6.2.tgz" - integrity sha512-9807RlWAgT564wT+DjeyU5OFMPjmzxVobvDFmNAhY+5zD6A2ly3jDp6sgnfyDtlIQ+7H97oc/DGCzzfu9rjw9w== +ajv@^8.8.0, ajv@^8.8.2: + version "8.12.0" + resolved "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz" + integrity sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA== + dependencies: + fast-deep-equal "^3.1.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + uri-js "^4.2.2" + +ajv@8.11.0: + version "8.11.0" + resolved "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz" + integrity sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg== + dependencies: + fast-deep-equal "^3.1.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + uri-js "^4.2.2" + +ajv@8.9.0: + version "8.9.0" + resolved "https://registry.npmjs.org/ajv/-/ajv-8.9.0.tgz" + integrity sha512-qOKJyNj/h+OWx7s5DePL6Zu1KeM9jPZhwBqs+7DzP6bGOvqzVCSf0xueYmVuaC/oQ/VtS2zLMLHdQFbkka+XDQ== dependencies: fast-deep-equal "^3.1.1" json-schema-traverse "^1.0.0" @@ -2908,7 +3243,7 @@ angulartics2@^12.0.0: dependencies: tslib "^2.3.0" -ansi-colors@^4.1.1: +ansi-colors@^4.1.1, ansi-colors@4.1.3: version "4.1.3" resolved "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz" integrity sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw== @@ -3137,7 +3472,7 @@ atob@^2.1.2: resolved "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz" integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== -autoprefixer@^10.4.13, autoprefixer@^10.4.2: +autoprefixer@^10.4.13, autoprefixer@^10.4.2, autoprefixer@^10.4.8: version "10.4.14" resolved "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.14.tgz" integrity sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ== @@ -3219,7 +3554,7 @@ babel-plugin-istanbul@6.1.1: istanbul-lib-instrument "^5.0.4" test-exclude "^6.0.0" -babel-plugin-polyfill-corejs2@^0.3.0: +babel-plugin-polyfill-corejs2@^0.3.0, babel-plugin-polyfill-corejs2@^0.3.2: version "0.3.3" resolved "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.3.tgz" integrity sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q== @@ -3228,7 +3563,7 @@ babel-plugin-polyfill-corejs2@^0.3.0: "@babel/helper-define-polyfill-provider" "^0.3.3" semver "^6.1.1" -babel-plugin-polyfill-corejs3@^0.5.0: +babel-plugin-polyfill-corejs3@^0.5.0, babel-plugin-polyfill-corejs3@^0.5.3: version "0.5.3" resolved "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.3.tgz" integrity sha512-zKsXDh0XjnrUEW0mxIHLfjBfnXSMr5Q/goMe/fxpQnLm07mcOZiIZHBNWCMx60HmdvjxfXcalac0tfFg0wqxyw== @@ -3243,6 +3578,13 @@ babel-plugin-polyfill-regenerator@^0.3.0: dependencies: "@babel/helper-define-polyfill-provider" "^0.3.1" +babel-plugin-polyfill-regenerator@^0.4.0: + version "0.4.1" + resolved "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.4.1.tgz" + integrity sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.3.3" + balanced-match@^1.0.0: version "1.0.2" resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz" @@ -3567,6 +3909,30 @@ cacache@^16.1.0: tar "^6.1.11" unique-filename "^2.0.0" +cacache@16.1.2: + version "16.1.2" + resolved "https://registry.npmjs.org/cacache/-/cacache-16.1.2.tgz" + integrity sha512-Xx+xPlfCZIUHagysjjOAje9nRo8pRDczQCcXb4J2O0BLtH+xeVue6ba4y1kfJfQMAnM2mkcoMIAyOctlaRGWYA== + dependencies: + "@npmcli/fs" "^2.1.0" + "@npmcli/move-file" "^2.0.0" + chownr "^2.0.0" + fs-minipass "^2.1.0" + glob "^8.0.1" + infer-owner "^1.0.4" + lru-cache "^7.7.1" + minipass "^3.1.6" + minipass-collect "^1.0.2" + minipass-flush "^1.0.5" + minipass-pipeline "^1.2.4" + mkdirp "^1.0.4" + p-map "^4.0.0" + promise-inflight "^1.0.1" + rimraf "^3.0.2" + ssri "^9.0.0" + tar "^6.1.11" + unique-filename "^1.1.1" + cachedir@^2.3.0: version "2.3.0" resolved "https://registry.npmjs.org/cachedir/-/cachedir-2.3.0.tgz" @@ -4096,7 +4462,19 @@ copy-webpack-plugin@10.2.1: schema-utils "^4.0.0" serialize-javascript "^6.0.0" -core-js-compat@^3.20.2, core-js-compat@^3.21.0: +copy-webpack-plugin@11.0.0: + version "11.0.0" + resolved "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-11.0.0.tgz" + integrity sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ== + dependencies: + fast-glob "^3.2.11" + glob-parent "^6.0.1" + globby "^13.1.1" + normalize-path "^3.0.0" + schema-utils "^4.0.0" + serialize-javascript "^6.0.0" + +core-js-compat@^3.20.2, core-js-compat@^3.21.0, core-js-compat@^3.22.1: version "3.30.0" resolved "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.30.0.tgz" integrity sha512-P5A2h/9mRYZFIAP+5Ab8ns6083IyVpSclU74UNvbGVQ8VM7n3n3/g2yF3AkKQ9NXz2O+ioxLbEWKnDtgsFamhg== @@ -4220,6 +4598,20 @@ css-loader@6.5.1: postcss-value-parser "^4.1.0" semver "^7.3.5" +css-loader@6.7.1: + version "6.7.1" + resolved "https://registry.npmjs.org/css-loader/-/css-loader-6.7.1.tgz" + integrity sha512-yB5CNFa14MbPJcomwNh3wLThtkZgcNyI2bNMRt8iE5Z8Vwl7f8vQXFAzn2HDOJvtDq2NTZBUGMSUNNyrv3/+cw== + dependencies: + icss-utils "^5.1.0" + postcss "^8.4.7" + postcss-modules-extract-imports "^3.0.0" + postcss-modules-local-by-default "^4.0.0" + postcss-modules-scope "^3.0.0" + postcss-modules-values "^4.0.0" + postcss-value-parser "^4.2.0" + semver "^7.3.5" + css-prefers-color-scheme@^6.0.2, css-prefers-color-scheme@^6.0.3: version "6.0.3" resolved "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-6.0.3.tgz" @@ -4263,6 +4655,11 @@ cssdb@^5.0.0: resolved "https://registry.npmjs.org/cssdb/-/cssdb-5.1.0.tgz" integrity sha512-/vqjXhv1x9eGkE/zO6o8ZOI7dgdZbLVLUGyVRbPgk6YipXbW87YzUCcO+Jrmi5bwJlAH6oD+MNeZyRgXea1GZw== +cssdb@^7.0.0: + version "7.5.4" + resolved "https://registry.npmjs.org/cssdb/-/cssdb-7.5.4.tgz" + integrity sha512-fGD+J6Jlq+aurfE1VDXlLS4Pt0VtNlu2+YgfGOdMxRyl/HQ9bDiHTwSck1Yz8A97Dt/82izSK6Bp/4nVqacOsg== + cssdb@^7.1.0: version "7.5.4" resolved "https://registry.npmjs.org/cssdb/-/cssdb-7.5.4.tgz" @@ -5031,11 +5428,21 @@ esbuild-darwin-64@0.14.22: resolved "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.14.22.tgz" integrity sha512-d8Ceuo6Vw6HM3fW218FB6jTY6O3r2WNcTAU0SGsBkXZ3k8SDoRLd3Nrc//EqzdgYnzDNMNtrWegK2Qsss4THhw== +esbuild-darwin-64@0.15.5: + version "0.15.5" + resolved "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.15.5.tgz" + integrity sha512-Cr0iIqnWKx3ZTvDUAzG0H/u9dWjLE4c2gTtRLz4pqOBGjfjqdcZSfAObFzKTInLLSmD0ZV1I/mshhPoYSBMMCQ== + esbuild-wasm@0.14.22: version "0.14.22" resolved "https://registry.npmjs.org/esbuild-wasm/-/esbuild-wasm-0.14.22.tgz" integrity sha512-FOSAM29GN1fWusw0oLMv6JYhoheDIh5+atC72TkJKfIUMID6yISlicoQSd9gsNSFsNBvABvtE2jR4JB1j4FkFw== +esbuild-wasm@0.15.5: + version "0.15.5" + resolved "https://registry.npmjs.org/esbuild-wasm/-/esbuild-wasm-0.15.5.tgz" + integrity sha512-lTJOEKekN/4JI/eOEq0wLcx53co2N6vaT/XjBz46D1tvIVoUEyM0o2K6txW6gEotf31szFD/J1PbxmnbkGlK9A== + esbuild@0.14.22: version "0.14.22" resolved "https://registry.npmjs.org/esbuild/-/esbuild-0.14.22.tgz" @@ -5061,6 +5468,33 @@ esbuild@0.14.22: esbuild-windows-64 "0.14.22" esbuild-windows-arm64 "0.14.22" +esbuild@0.15.5: + version "0.15.5" + resolved "https://registry.npmjs.org/esbuild/-/esbuild-0.15.5.tgz" + integrity sha512-VSf6S1QVqvxfIsSKb3UKr3VhUCis7wgDbtF4Vd9z84UJr05/Sp2fRKmzC+CSPG/dNAPPJZ0BTBLTT1Fhd6N9Gg== + optionalDependencies: + "@esbuild/linux-loong64" "0.15.5" + esbuild-android-64 "0.15.5" + esbuild-android-arm64 "0.15.5" + esbuild-darwin-64 "0.15.5" + esbuild-darwin-arm64 "0.15.5" + esbuild-freebsd-64 "0.15.5" + esbuild-freebsd-arm64 "0.15.5" + esbuild-linux-32 "0.15.5" + esbuild-linux-64 "0.15.5" + esbuild-linux-arm "0.15.5" + esbuild-linux-arm64 "0.15.5" + esbuild-linux-mips64le "0.15.5" + esbuild-linux-ppc64le "0.15.5" + esbuild-linux-riscv64 "0.15.5" + esbuild-linux-s390x "0.15.5" + esbuild-netbsd-64 "0.15.5" + esbuild-openbsd-64 "0.15.5" + esbuild-sunos-64 "0.15.5" + esbuild-windows-32 "0.15.5" + esbuild-windows-64 "0.15.5" + esbuild-windows-arm64 "0.15.5" + escalade@^3.1.1: version "3.1.1" resolved "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz" @@ -5449,7 +5883,7 @@ fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz" integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== -fast-glob@^3.2.4, fast-glob@^3.2.7, fast-glob@^3.2.9: +fast-glob@^3.2.11, fast-glob@^3.2.4, fast-glob@^3.2.7, fast-glob@^3.2.9: version "3.2.12" resolved "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz" integrity sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w== @@ -5909,10 +6343,10 @@ glob@^7.1.3, glob@^7.1.4, glob@^7.1.6, glob@^7.1.7, glob@~7.2.0, glob@7.2.0: once "^1.3.0" path-is-absolute "^1.0.0" -glob@^8.0.1: - version "8.1.0" - resolved "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz" - integrity sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ== +glob@^8.0.1, glob@8.0.3: + version "8.0.3" + resolved "https://registry.npmjs.org/glob/-/glob-8.0.3.tgz" + integrity sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ== dependencies: fs.realpath "^1.0.0" inflight "^1.0.4" @@ -5932,17 +6366,6 @@ glob@7.1.4: once "^1.3.0" path-is-absolute "^1.0.0" -glob@8.0.3: - version "8.0.3" - resolved "https://registry.npmjs.org/glob/-/glob-8.0.3.tgz" - integrity sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^5.0.1" - once "^1.3.0" - global-dirs@^3.0.0: version "3.0.1" resolved "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.1.tgz" @@ -6017,6 +6440,17 @@ globby@^12.0.2: merge2 "^1.4.1" slash "^4.0.0" +globby@^13.1.1: + version "13.1.4" + resolved "https://registry.npmjs.org/globby/-/globby-13.1.4.tgz" + integrity sha512-iui/IiiW+QrJ1X1hKH5qwlMQyv34wJAYwH1vrf8b9kBA4sNiif3gKsMHa+BrdnOpEudWjpotfa7LrTzB1ERS/g== + dependencies: + dir-glob "^3.0.1" + fast-glob "^3.2.11" + ignore "^5.2.0" + merge2 "^1.4.1" + slash "^4.0.0" + gopd@^1.0.1: version "1.0.1" resolved "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz" @@ -6308,7 +6742,7 @@ http-signature@~1.3.6: jsprim "^2.0.2" sshpk "^1.14.1" -https-proxy-agent@^5.0.0: +https-proxy-agent@^5.0.0, https-proxy-agent@5.0.1: version "5.0.1" resolved "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz" integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== @@ -6514,6 +6948,27 @@ inquirer@8.2.0: strip-ansi "^6.0.0" through "^2.3.6" +inquirer@8.2.4: + version "8.2.4" + resolved "https://registry.npmjs.org/inquirer/-/inquirer-8.2.4.tgz" + integrity sha512-nn4F01dxU8VeKfq192IjLsxu0/OmMZ4Lg3xKAns148rCaXP6ntAoEkVYZThWjwON8AlzdZZi6oqnhNbxUG9hVg== + dependencies: + ansi-escapes "^4.2.1" + chalk "^4.1.1" + cli-cursor "^3.1.0" + cli-width "^3.0.0" + external-editor "^3.0.3" + figures "^3.0.0" + lodash "^4.17.21" + mute-stream "0.0.8" + ora "^5.4.1" + run-async "^2.4.0" + rxjs "^7.5.5" + string-width "^4.1.0" + strip-ansi "^6.0.0" + through "^2.3.6" + wrap-ansi "^7.0.0" + internal-slot@^1.0.5: version "1.0.5" resolved "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz" @@ -6933,6 +7388,11 @@ jest-worker@^27.4.5: merge-stream "^2.0.0" supports-color "^8.0.0" +"jquery@1.9.1 - 3": + version "3.6.4" + resolved "https://registry.npmjs.org/jquery/-/jquery-3.6.4.tgz" + integrity sha512-v28EW9DWDFpzcD9O5iyJXg3R3+q+mET5JhnjJzQUZMHOv67bpSIHq81GEYpPNZHG+XXHsfSme3nxp/hndKEcsQ== + js-cookie@2.2.1: version "2.2.1" resolved "https://registry.npmjs.org/js-cookie/-/js-cookie-2.2.1.tgz" @@ -7104,6 +7564,11 @@ jsonc-parser@^3.0.0, jsonc-parser@3.0.0: resolved "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.0.0.tgz" integrity sha512-fQzRfAbIBnR0IQvftw9FJveWiHp72Fg20giDrHz6TdfB12UH/uue0D3hm57UB5KgAVuniLMCaS8P1IMj9NR7cA== +jsonc-parser@3.1.0: + version "3.1.0" + resolved "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.1.0.tgz" + integrity sha512-DRf0QjnNeCUds3xTjKlQQ3DpJD51GvDjJfnxUVWg6PZTo2otSm+slzNAxU/35hF8/oJIKoG9slq30JYOsF2azg== + jsonc-parser@3.2.0: version "3.2.0" resolved "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz" @@ -7361,7 +7826,31 @@ less-loader@10.2.0: dependencies: klona "^2.0.4" -"less@^3.5.0 || ^4.0.0", less@4.1.2: +less-loader@11.0.0: + version "11.0.0" + resolved "https://registry.npmjs.org/less-loader/-/less-loader-11.0.0.tgz" + integrity sha512-9+LOWWjuoectIEx3zrfN83NAGxSUB5pWEabbbidVQVgZhN+wN68pOvuyirVlH1IK4VT1f3TmlyvAnCXh8O5KEw== + dependencies: + klona "^2.0.4" + +"less@^3.5.0 || ^4.0.0", less@4.1.3: + version "4.1.3" + resolved "https://registry.npmjs.org/less/-/less-4.1.3.tgz" + integrity sha512-w16Xk/Ta9Hhyei0Gpz9m7VS8F28nieJaL/VyShID7cYvP6IL5oHeL6p4TXSDJqZE/lNv0oJ2pGVjJsRkfwm5FA== + dependencies: + copy-anything "^2.0.1" + parse-node-version "^1.0.1" + tslib "^2.3.0" + optionalDependencies: + errno "^0.1.1" + graceful-fs "^4.1.2" + image-size "~0.5.0" + make-dir "^2.1.0" + mime "^1.4.1" + needle "^3.1.0" + source-map "~0.6.0" + +less@4.1.2: version "4.1.2" resolved "https://registry.npmjs.org/less/-/less-4.1.2.tgz" integrity sha512-EoQp/Et7OSOVu0aJknJOtlXZsnr8XE8KwuzTHOLeVSEx8pVWUICc8Q0VYRHgzyjX78nMEyC/oztWFbgyhtNfDA== @@ -7797,6 +8286,13 @@ mini-css-extract-plugin@2.5.3: dependencies: schema-utils "^4.0.0" +mini-css-extract-plugin@2.6.1: + version "2.6.1" + resolved "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.6.1.tgz" + integrity sha512-wd+SD57/K6DiV7jIR34P+s3uckTRuQvx0tKPcvjFlrEylk6P4mQ2KSWk1hblj1Kxaqok7LogKOieygXqBczNlg== + dependencies: + schema-utils "^4.0.0" + minimalistic-assert@^1.0.0: version "1.0.1" resolved "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz" @@ -7809,10 +8305,10 @@ minimatch@^3.0.2, minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.2: dependencies: brace-expansion "^1.1.7" -minimatch@^5.0.1: - version "5.1.6" - resolved "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz" - integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g== +minimatch@^5.0.1, minimatch@5.1.0: + version "5.1.0" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz" + integrity sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg== dependencies: brace-expansion "^2.0.1" @@ -8070,6 +8566,15 @@ needle@^2.5.2: iconv-lite "^0.4.4" sax "^1.2.4" +needle@^3.1.0: + version "3.2.0" + resolved "https://registry.npmjs.org/needle/-/needle-3.2.0.tgz" + integrity sha512-oUvzXnyLiVyVGoianLijF9O/RecZUf7TkBfimjGrLM4eQhXyeJwM6GeAWccwfQ9aa4gMCZKqhAOuLaMIcQxajQ== + dependencies: + debug "^3.2.6" + iconv-lite "^0.6.3" + sax "^1.2.4" + negotiator@^0.6.2, negotiator@^0.6.3, negotiator@0.6.3: version "0.6.3" resolved "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz" @@ -8805,7 +9310,12 @@ pkg-dir@^4.1.0, pkg-dir@^4.2.0: dependencies: find-up "^4.0.0" -popper.js@^1.16.1, popper.js@1.16.1-lts: +popper.js@^1.16.1: + version "1.16.1" + resolved "https://registry.npmjs.org/popper.js/-/popper.js-1.16.1.tgz" + integrity sha512-Wb4p1J4zyFTbM+u6WuO4XstYx4Ky9Cewe4DWrel7B0w6VVICvPwdOpotjzcf6eD8TsckVnIMNONQyPIUFOUbCQ== + +popper.js@1.16.1-lts: version "1.16.1-lts" resolved "https://registry.npmjs.org/popper.js/-/popper.js-1.16.1-lts.tgz" integrity sha512-Kjw8nKRl1m+VrSFCoVGPph93W/qrSO7ZkqPpTf7F4bk/sqcfWK019dWBUpE/fBOsOQY1dks/Bmcbfn1heM/IsA== @@ -8877,7 +9387,7 @@ postcss-custom-media@^8.0.0, postcss-custom-media@^8.0.2: dependencies: postcss-value-parser "^4.2.0" -postcss-custom-properties@^12.1.10, postcss-custom-properties@^12.1.2: +postcss-custom-properties@^12.1.10, postcss-custom-properties@^12.1.2, postcss-custom-properties@^12.1.8: version "12.1.11" resolved "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-12.1.11.tgz" integrity sha512-0IDJYhgU8xDv1KY6+VgUwuQkVtmYzRwu+dMjnmdMafXYv86SWqfxkc7qdDvWS38vsjaEtv8e0vGOUQrAiMBLpQ== @@ -8962,6 +9472,15 @@ postcss-import@14.0.2: read-cache "^1.0.0" resolve "^1.1.7" +postcss-import@15.0.0: + version "15.0.0" + resolved "https://registry.npmjs.org/postcss-import/-/postcss-import-15.0.0.tgz" + integrity sha512-Y20shPQ07RitgBGv2zvkEAu9bqvrD77C9axhj/aA1BQj4czape2MdClCExvB27EwYEJdGgKZBpKanb0t1rK2Kg== + dependencies: + postcss-value-parser "^4.0.0" + read-cache "^1.0.0" + resolve "^1.1.7" + postcss-initial@^4.0.1: version "4.0.1" resolved "https://registry.npmjs.org/postcss-initial/-/postcss-initial-4.0.1.tgz" @@ -8995,6 +9514,15 @@ postcss-loader@6.2.1: klona "^2.0.5" semver "^7.3.5" +postcss-loader@7.0.1: + version "7.0.1" + resolved "https://registry.npmjs.org/postcss-loader/-/postcss-loader-7.0.1.tgz" + integrity sha512-VRviFEyYlLjctSM93gAZtcJJ/iSkPZ79zWbN/1fSH+NisBByEiVLqpdVDrPLVSi8DX0oJo12kL/GppTBdKVXiQ== + dependencies: + cosmiconfig "^7.0.0" + klona "^2.0.5" + semver "^7.3.7" + postcss-logical@^5.0.3, postcss-logical@^5.0.4: version "5.0.4" resolved "https://registry.npmjs.org/postcss-logical/-/postcss-logical-5.0.4.tgz" @@ -9033,7 +9561,7 @@ postcss-modules-values@^4.0.0: dependencies: icss-utils "^5.0.0" -postcss-nesting@^10.1.2, postcss-nesting@^10.2.0: +postcss-nesting@^10.1.10, postcss-nesting@^10.1.2, postcss-nesting@^10.2.0: version "10.2.0" resolved "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-10.2.0.tgz" integrity sha512-EwMkYchxiDiKUhlJGzWsD9b2zvq/r2SSubcRrgP+jujMXFzqvANLt16lJANC+5uZ6hjI7lpRmI6O8JIl+8l1KA== @@ -9159,6 +9687,61 @@ postcss-preset-env@7.2.3: postcss-replace-overflow-wrap "^4.0.0" postcss-selector-not "^5.0.0" +postcss-preset-env@7.8.0: + version "7.8.0" + resolved "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-7.8.0.tgz" + integrity sha512-leqiqLOellpLKfbHkD06E04P6d9ZQ24mat6hu4NSqun7WG0UhspHR5Myiv/510qouCjoo4+YJtNOqg5xHaFnCA== + dependencies: + "@csstools/postcss-cascade-layers" "^1.0.5" + "@csstools/postcss-color-function" "^1.1.1" + "@csstools/postcss-font-format-keywords" "^1.0.1" + "@csstools/postcss-hwb-function" "^1.0.2" + "@csstools/postcss-ic-unit" "^1.0.1" + "@csstools/postcss-is-pseudo-class" "^2.0.7" + "@csstools/postcss-nested-calc" "^1.0.0" + "@csstools/postcss-normalize-display-values" "^1.0.1" + "@csstools/postcss-oklab-function" "^1.1.1" + "@csstools/postcss-progressive-custom-properties" "^1.3.0" + "@csstools/postcss-stepped-value-functions" "^1.0.1" + "@csstools/postcss-text-decoration-shorthand" "^1.0.0" + "@csstools/postcss-trigonometric-functions" "^1.0.2" + "@csstools/postcss-unset-value" "^1.0.2" + autoprefixer "^10.4.8" + browserslist "^4.21.3" + css-blank-pseudo "^3.0.3" + css-has-pseudo "^3.0.4" + css-prefers-color-scheme "^6.0.3" + cssdb "^7.0.0" + postcss-attribute-case-insensitive "^5.0.2" + postcss-clamp "^4.1.0" + postcss-color-functional-notation "^4.2.4" + postcss-color-hex-alpha "^8.0.4" + postcss-color-rebeccapurple "^7.1.1" + postcss-custom-media "^8.0.2" + postcss-custom-properties "^12.1.8" + postcss-custom-selectors "^6.0.3" + postcss-dir-pseudo-class "^6.0.5" + postcss-double-position-gradients "^3.1.2" + postcss-env-function "^4.0.6" + postcss-focus-visible "^6.0.4" + postcss-focus-within "^5.0.4" + postcss-font-variant "^5.0.0" + postcss-gap-properties "^3.0.5" + postcss-image-set-function "^4.0.7" + postcss-initial "^4.0.1" + postcss-lab-function "^4.2.1" + postcss-logical "^5.0.4" + postcss-media-minmax "^5.0.0" + postcss-nesting "^10.1.10" + postcss-opacity-percentage "^1.1.2" + postcss-overflow-shorthand "^3.0.4" + postcss-page-break "^3.0.4" + postcss-place "^7.0.5" + postcss-pseudo-class-any-link "^7.1.6" + postcss-replace-overflow-wrap "^4.0.0" + postcss-selector-not "^6.0.1" + postcss-value-parser "^4.2.0" + postcss-pseudo-class-any-link@^7.0.2, postcss-pseudo-class-any-link@^7.1.6: version "7.1.6" resolved "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-7.1.6.tgz" @@ -9214,7 +9797,7 @@ postcss@^6.0.6: source-map "^0.6.1" supports-color "^5.4.0" -"postcss@^7.0.0 || ^8.0.1", postcss@^8, postcss@^8.0.0, postcss@^8.0.3, postcss@^8.1, postcss@^8.1.0, postcss@^8.2, postcss@^8.2.14, postcss@^8.2.15, postcss@^8.3, postcss@^8.3.11, postcss@^8.3.7, postcss@^8.4, postcss@^8.4.6: +"postcss@^7.0.0 || ^8.0.1", postcss@^8, postcss@^8.0.0, postcss@^8.0.3, postcss@^8.1, postcss@^8.1.0, postcss@^8.2, postcss@^8.2.14, postcss@^8.3, postcss@^8.3.11, postcss@^8.3.7, postcss@^8.4, postcss@^8.4.6, postcss@^8.4.7: version "8.4.21" resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.21.tgz" integrity sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg== @@ -9231,7 +9814,7 @@ postcss@^7.0.14: picocolors "^0.2.1" source-map "^0.6.1" -postcss@8.4.5: +postcss@^8.2.15, postcss@8.4.5: version "8.4.5" resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.5.tgz" integrity sha512-jBDboWM8qpaqwkMwItqTQTiFikhs/67OYVvblFFTM7MrZjt6yMKd6r2kgXizEbTTljacm4NldIlZnhbjr84QYg== @@ -9240,6 +9823,15 @@ postcss@8.4.5: picocolors "^1.0.0" source-map-js "^1.0.1" +postcss@8.4.16: + version "8.4.16" + resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.16.tgz" + integrity sha512-ipHE1XBvKzm5xI7hiHCZJCSugxvsdq2mPnsq5+UF+VHCjiBvtDrlxJfMBToWaP9D5XlgNmcFGqoHmUn0EYEaRQ== + dependencies: + nanoid "^3.3.4" + picocolors "^1.0.0" + source-map-js "^1.0.2" + prelude-ls@^1.2.1: version "1.2.1" resolved "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz" @@ -10019,6 +10611,14 @@ sass-loader@12.4.0: klona "^2.0.4" neo-async "^2.6.2" +sass-loader@13.0.2: + version "13.0.2" + resolved "https://registry.npmjs.org/sass-loader/-/sass-loader-13.0.2.tgz" + integrity sha512-BbiqbVmbfJaWVeOOAu2o7DhYWtcNmTfvroVgFXa6k2hHheMxNAeDHLNoDy/Q5aoaVlz0LH+MbMktKwm9vN/j8Q== + dependencies: + klona "^2.0.4" + neo-async "^2.6.2" + sass-resources-loader@^2.1.1: version "2.2.5" resolved "https://registry.npmjs.org/sass-resources-loader/-/sass-resources-loader-2.2.5.tgz" @@ -10045,6 +10645,15 @@ sass@1.49.9: immutable "^4.0.0" source-map-js ">=0.6.2 <2.0.0" +sass@1.54.4: + version "1.54.4" + resolved "https://registry.npmjs.org/sass/-/sass-1.54.4.tgz" + integrity sha512-3tmF16yvnBwtlPrNBHw/H907j8MlOX8aTBnlNX1yrKx24RKcJGPyLhFUwkoKBKesR3unP93/2z14Ll8NicwQUA== + dependencies: + chokidar ">=3.0.0 <4.0.0" + immutable "^4.0.0" + source-map-js ">=0.6.2 <2.0.0" + sax@^1.2.4, sax@~1.2.4: version "1.2.4" resolved "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz" @@ -10116,7 +10725,7 @@ select-hose@^2.0.0: resolved "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz" integrity sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg== -selfsigned@^2.0.0, selfsigned@^2.1.1: +selfsigned@^2.0.0, selfsigned@^2.0.1, selfsigned@^2.1.1: version "2.1.1" resolved "https://registry.npmjs.org/selfsigned/-/selfsigned-2.1.1.tgz" integrity sha512-GSL3aowiF7wa/WtSFwnUrludWFoNhftq8bUkH9pkzjpN2XSPOAYEgg6e0sS9s0rZwgJzJiQRPU18A6clnoW5wQ== @@ -10138,7 +10747,7 @@ semver@^6.0.0, semver@^6.1.1, semver@^6.1.2, semver@^6.3.0: resolved "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== -semver@^7.0.0: +semver@^7.0.0, semver@^7.3.5: version "7.4.0" resolved "https://registry.npmjs.org/semver/-/semver-7.4.0.tgz" integrity sha512-RgOxM8Mw+7Zus0+zcLEUn8+JfoLpj/huFTItQy2hsM4khuC1HYRDp0cU482Ewn/Fcy6bCjufD8vAj7voC66KQw== @@ -10166,17 +10775,10 @@ semver@^7.3.4: dependencies: lru-cache "^6.0.0" -semver@^7.3.5, semver@7.3.5: - version "7.3.5" - resolved "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz" - integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ== - dependencies: - lru-cache "^6.0.0" - -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.3.7, semver@7.3.7: + version "7.3.7" + resolved "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz" + integrity sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g== dependencies: lru-cache "^6.0.0" @@ -10199,6 +10801,13 @@ semver@7.3.4: dependencies: lru-cache "^6.0.0" +semver@7.3.5: + version "7.3.5" + resolved "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz" + integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ== + dependencies: + lru-cache "^6.0.0" + send@0.16.2: version "0.16.2" resolved "https://registry.npmjs.org/send/-/send-0.16.2.tgz" @@ -10502,6 +11111,15 @@ source-map-loader@3.0.1: iconv-lite "^0.6.3" source-map-js "^1.0.1" +source-map-loader@4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/source-map-loader/-/source-map-loader-4.0.0.tgz" + integrity sha512-i3KVgM3+QPAHNbGavK+VBq03YoJl24m9JWNbLgsjTj8aJzXG9M61bantBTNBt7CNwY2FYf+RJRYJ3pzalKjIrw== + dependencies: + abab "^2.0.6" + iconv-lite "^0.6.3" + source-map-js "^1.0.2" + source-map-resolve@^0.6.0: version "0.6.0" resolved "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.6.0.tgz" @@ -10543,6 +11161,11 @@ source-map@0.7.3: resolved "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz" integrity sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ== +source-map@0.7.4: + version "0.7.4" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz" + integrity sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA== + sourcemap-codec@^1.4.4, sourcemap-codec@^1.4.8: version "1.4.8" resolved "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz" @@ -10786,7 +11409,27 @@ stylus-loader@6.2.0: klona "^2.0.4" normalize-path "^3.0.0" -stylus@>=0.52.4, stylus@0.56.0: +stylus-loader@7.0.0: + version "7.0.0" + resolved "https://registry.npmjs.org/stylus-loader/-/stylus-loader-7.0.0.tgz" + integrity sha512-WTbtLrNfOfLgzTaR9Lj/BPhQroKk/LC1hfTXSUbrxmxgfUo3Y3LpmKRVA2R1XbjvTAvOfaian9vOyfv1z99E+A== + dependencies: + fast-glob "^3.2.11" + klona "^2.0.5" + normalize-path "^3.0.0" + +stylus@>=0.52.4, stylus@0.59.0: + version "0.59.0" + resolved "https://registry.npmjs.org/stylus/-/stylus-0.59.0.tgz" + integrity sha512-lQ9w/XIOH5ZHVNuNbWW8D822r+/wBSO/d6XvtyHLF7LW4KaCIDeVbvn5DF8fGCJAUCwVhVi/h6J0NUcnylUEjg== + dependencies: + "@adobe/css-tools" "^4.0.1" + debug "^4.3.2" + glob "^7.1.6" + sax "~1.2.4" + source-map "^0.7.3" + +stylus@0.56.0: version "0.56.0" resolved "https://registry.npmjs.org/stylus/-/stylus-0.56.0.tgz" integrity sha512-Ev3fOb4bUElwWu4F9P9WjnnaSpc8XB9OFHSFZSKMFL1CE1oM+oFXWEgAqPmmZIyhBihuqIQlFsVTypiiS9RxeA== @@ -11117,6 +11760,11 @@ tslib@2.3.1: resolved "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz" integrity sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw== +tslib@2.4.0: + version "2.4.0" + resolved "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz" + integrity sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ== + tsutils@^3.21.0: version "3.21.0" resolved "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz" @@ -11211,6 +11859,11 @@ typescript@^2.5.0: resolved "https://registry.npmjs.org/typescript/-/typescript-2.9.2.tgz" integrity sha512-Gr4p6nFNaoufRIY4NMdpQRNmgxVIGMs4Fcu/ujdYk3nAZqk7supzBE9idmvfZIlH/Cuj//dvi+019qEue9lV0w== +"typescript@>=4.4.2 <4.7": + version "4.6.4" + resolved "https://registry.npmjs.org/typescript/-/typescript-4.6.4.tgz" + integrity sha512-9ia/jWHIEbo49HfjrLGfKbZSuWo9iTMwXO+Ca3pRsSpbsMbc7/IU8NKdCZVRRBafVPGnoJeFL76ZOAA84I9fEg== + ua-parser-js@^0.7.30: version "0.7.35" resolved "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.35.tgz" @@ -11546,7 +12199,7 @@ webpack-dev-middleware@^5.3.0, webpack-dev-middleware@5.3.0: range-parser "^1.2.1" schema-utils "^4.0.0" -webpack-dev-middleware@^5.3.1: +webpack-dev-middleware@^5.3.1, webpack-dev-middleware@5.3.3: version "5.3.3" resolved "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz" integrity sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA== @@ -11593,6 +12246,41 @@ webpack-dev-server@^4.0.0, webpack-dev-server@^4.5.0: webpack-dev-middleware "^5.3.1" ws "^8.13.0" +webpack-dev-server@4.11.0: + version "4.11.0" + resolved "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.11.0.tgz" + integrity sha512-L5S4Q2zT57SK7tazgzjMiSMBdsw+rGYIX27MgPgx7LDhWO0lViPrHKoLS7jo5In06PWYAhlYu3PbyoC6yAThbw== + dependencies: + "@types/bonjour" "^3.5.9" + "@types/connect-history-api-fallback" "^1.3.5" + "@types/express" "^4.17.13" + "@types/serve-index" "^1.9.1" + "@types/serve-static" "^1.13.10" + "@types/sockjs" "^0.3.33" + "@types/ws" "^8.5.1" + ansi-html-community "^0.0.8" + bonjour-service "^1.0.11" + chokidar "^3.5.3" + colorette "^2.0.10" + compression "^1.7.4" + connect-history-api-fallback "^2.0.0" + default-gateway "^6.0.3" + express "^4.17.3" + graceful-fs "^4.2.6" + html-entities "^2.3.2" + http-proxy-middleware "^2.0.3" + ipaddr.js "^2.0.1" + open "^8.0.9" + p-retry "^4.5.0" + rimraf "^3.0.2" + schema-utils "^4.0.0" + selfsigned "^2.0.1" + serve-index "^1.9.1" + sockjs "^0.3.24" + spdy "^4.0.2" + webpack-dev-middleware "^5.3.1" + ws "^8.4.2" + webpack-dev-server@4.7.3: version "4.7.3" resolved "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.7.3.tgz" @@ -11656,7 +12344,7 @@ webpack-subresource-integrity@5.1.0: dependencies: typed-assert "^1.0.8" -"webpack@^4.0.0 || ^5.0.0", "webpack@^4.37.0 || ^5.0.0", webpack@^5.0.0, webpack@^5.1.0, webpack@^5.12.0, webpack@^5.30.0, webpack@^5.76.0, webpack@>=2, webpack@>=4.0.1, "webpack@4.x.x || 5.x.x": +"webpack@^4.0.0 || ^5.0.0", "webpack@^4.37.0 || ^5.0.0", webpack@^5.0.0, webpack@^5.1.0, webpack@^5.12.0, webpack@^5.30.0, webpack@^5.72.1, webpack@^5.76.0, webpack@>=2, webpack@>=4.0.1, "webpack@4.x.x || 5.x.x": version "5.78.0" resolved "https://registry.npmjs.org/webpack/-/webpack-5.78.0.tgz" integrity sha512-gT5DP72KInmE/3azEaQrISjTvLYlSM0j1Ezhht/KLVkrqtv10JoP/RXhwmX/frrutOPuSq3o5Vq0ehR/4Vmd1g== @@ -11686,7 +12374,7 @@ webpack-subresource-integrity@5.1.0: watchpack "^2.4.0" webpack-sources "^3.2.3" -webpack@5.76.1: +webpack@^5.54.0, webpack@5.76.1: version "5.76.1" resolved "https://registry.npmjs.org/webpack/-/webpack-5.76.1.tgz" integrity sha512-4+YIK4Abzv8172/SGqObnUjaIHjLEuUasz9EwQj/9xmPPkYJy2Mh03Q/lJfSD3YLzbxy5FeTq5Uw0323Oh6SJQ== @@ -11879,7 +12567,7 @@ ws@^7.4.6: resolved "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz" integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== -ws@^8.1.0, ws@^8.13.0, ws@^8.2.3: +ws@^8.1.0, ws@^8.13.0, ws@^8.2.3, ws@^8.4.2: version "8.13.0" resolved "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz" integrity sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA== From 5fb237d905eeda1ded2f98c77a2dc8cff4708dc0 Mon Sep 17 00:00:00 2001 From: Kristof De Langhe Date: Tue, 11 Apr 2023 16:28:29 +0200 Subject: [PATCH 071/409] 101108: Automatic ng update @nguniversal/builders@14 --- package.json | 2 +- yarn.lock | 129 +++++++++++++++++++++++++++++++++------------------ 2 files changed, 85 insertions(+), 46 deletions(-) diff --git a/package.json b/package.json index d6566515a7..a0c63ebe5c 100644 --- a/package.json +++ b/package.json @@ -148,7 +148,7 @@ "@fortawesome/fontawesome-free": "^6.2.1", "@ngrx/store-devtools": "^13.0.2", "@ngtools/webpack": "^13.2.6", - "@nguniversal/builders": "^13.1.1", + "@nguniversal/builders": "^14.2.3", "@types/deep-freeze": "0.1.2", "@types/ejs": "^3.1.1", "@types/express": "^4.17.9", diff --git a/yarn.lock b/yarn.lock index a67eeed190..9d08f5bc3a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -44,7 +44,15 @@ "@angular-devkit/core" "12.2.18" rxjs "6.6.7" -"@angular-devkit/architect@^0.1303.0", "@angular-devkit/architect@>=0.1300.0 < 0.1400.0", "@angular-devkit/architect@0.1303.11": +"@angular-devkit/architect@^0.1402.0": + version "0.1402.11" + resolved "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1402.11.tgz" + integrity sha512-RuSZrBQ+QbipAESZ4aXCyAMQHaEaDyyV/FDS9J2HJWfEFbRD5oxlEt/tBC8XjmJQsktaUOh07GT8MNJjPKVAQw== + dependencies: + "@angular-devkit/core" "14.2.11" + rxjs "6.6.7" + +"@angular-devkit/architect@>=0.1300.0 < 0.1400.0", "@angular-devkit/architect@0.1303.11": version "0.1303.11" resolved "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1303.11.tgz" integrity sha512-JwrWomNqNGjAeKlqV2pimUFlCgFxQy+Vioz9+QAPIrUkvvjbkQ1dZKOe8Ul8eosb1N3Ln282U6qzOpHKfJ4TOg== @@ -132,7 +140,7 @@ optionalDependencies: esbuild "0.14.22" -"@angular-devkit/build-angular@^13.3.4", "@angular-devkit/build-angular@~14.2.11": +"@angular-devkit/build-angular@^14.2.0", "@angular-devkit/build-angular@~14.2.11": version "14.2.11" resolved "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-14.2.11.tgz" integrity sha512-O3X7GXcCBCGceVSHT+GIJ2JrRCg2YcO7HtNavpmPrraNr1o+aCdTkmT5WTS2cqWkZBm/z0wqKR8PsX/ZoD2r1A== @@ -230,7 +238,7 @@ rxjs "6.6.7" source-map "0.7.3" -"@angular-devkit/core@^13.0.0", "@angular-devkit/core@^13.3.4", "@angular-devkit/core@13.3.11": +"@angular-devkit/core@^13.0.0", "@angular-devkit/core@13.3.11": version "13.3.11" resolved "https://registry.npmjs.org/@angular-devkit/core/-/core-13.3.11.tgz" integrity sha512-rfqoLMRYhlz0wzKlHx7FfyIyQq8dKTsmbCoIVU1cEIH0gyTMVY7PbVzwRRcO6xp5waY+0hA+0Brriujpuhkm4w== @@ -242,7 +250,7 @@ rxjs "6.6.7" source-map "0.7.3" -"@angular-devkit/core@14.2.11": +"@angular-devkit/core@^14.2.0", "@angular-devkit/core@14.2.11": version "14.2.11" resolved "https://registry.npmjs.org/@angular-devkit/core/-/core-14.2.11.tgz" integrity sha512-cBIGs6y9rykOQqnuAQOB1DgIRyBFYtvKRJb7QNUfIJ0qUfARKkuV/yikv3lrb95ePGkmoRzmjkFqcFZiYU+r7A== @@ -371,7 +379,7 @@ symbol-observable "4.0.0" uuid "8.3.2" -"@angular/common@*", "@angular/common@^11.0.0", "@angular/common@^13.0.0", "@angular/common@^13.0.0 || ^14.0.0-0", "@angular/common@^13.3.4", "@angular/common@>=10.0.0", "@angular/common@>=13.0.0 <14", "@angular/common@>=13.0.0-0", "@angular/common@>=2.x", "@angular/common@>=5.0.0", "@angular/common@>=5.0.0 <14.0.0", "@angular/common@~14.3.0", "@angular/common@14.3.0", "@angular/common@5.0.0-alpha - 5 || 6.0.0-alpha - 6 || 7.0.0-alpha - 7 || 8.0.0-alpha - 8 || 9.0.0-alpha - 9 || 10.0.0-alpha - 10 || 11.0.0-alpha - 11 || 12.0.0-alpha - 12 || 13.0.0-alpha - 13 || 14.0.0-alpha - 14": +"@angular/common@*", "@angular/common@^11.0.0", "@angular/common@^13.0.0", "@angular/common@^13.0.0 || ^14.0.0-0", "@angular/common@^13.3.4", "@angular/common@^14.2.0", "@angular/common@>=10.0.0", "@angular/common@>=13.0.0 <14", "@angular/common@>=13.0.0-0", "@angular/common@>=2.x", "@angular/common@>=5.0.0", "@angular/common@>=5.0.0 <14.0.0", "@angular/common@~14.3.0", "@angular/common@14.3.0", "@angular/common@5.0.0-alpha - 5 || 6.0.0-alpha - 6 || 7.0.0-alpha - 7 || 8.0.0-alpha - 8 || 9.0.0-alpha - 9 || 10.0.0-alpha - 10 || 11.0.0-alpha - 11 || 12.0.0-alpha - 12 || 13.0.0-alpha - 13 || 14.0.0-alpha - 14": version "14.3.0" resolved "https://registry.npmjs.org/@angular/common/-/common-14.3.0.tgz" integrity sha512-pV9oyG3JhGWeQ+TFB0Qub6a1VZWMNZ6/7zEopvYivdqa5yDLLDSBRWb6P80RuONXyGnM1pa7l5nYopX+r/23GQ== @@ -424,20 +432,13 @@ dependencies: tslib "^2.3.0" -"@angular/core@*", "@angular/core@^11.0.0", "@angular/core@^13.0.0", "@angular/core@^13.0.0 || ^14.0.0-0", "@angular/core@^13.3.4", "@angular/core@>=10.0.0", "@angular/core@>=12", "@angular/core@>=13.0.0 <14", "@angular/core@>=13.0.0-0", "@angular/core@>=2.x", "@angular/core@>=5.0.0", "@angular/core@>=5.0.0 <14.0.0", "@angular/core@~14.3.0", "@angular/core@14.3.0", "@angular/core@5.0.0-alpha - 5 || 6.0.0-alpha - 6 || 7.0.0-alpha - 7 || 8.0.0-alpha - 8 || 9.0.0-alpha - 9 || 10.0.0-alpha - 10 || 11.0.0-alpha - 11 || 12.0.0-alpha - 12 || 13.0.0-alpha - 13 || 14.0.0-alpha - 14": +"@angular/core@*", "@angular/core@^11.0.0", "@angular/core@^13.0.0", "@angular/core@^13.0.0 || ^14.0.0-0", "@angular/core@^13.3.4", "@angular/core@^14.2.0", "@angular/core@>=10.0.0", "@angular/core@>=12", "@angular/core@>=13.0.0 <14", "@angular/core@>=13.0.0-0", "@angular/core@>=2.x", "@angular/core@>=5.0.0", "@angular/core@>=5.0.0 <14.0.0", "@angular/core@~14.3.0", "@angular/core@14.3.0", "@angular/core@5.0.0-alpha - 5 || 6.0.0-alpha - 6 || 7.0.0-alpha - 7 || 8.0.0-alpha - 8 || 9.0.0-alpha - 9 || 10.0.0-alpha - 10 || 11.0.0-alpha - 11 || 12.0.0-alpha - 12 || 13.0.0-alpha - 13 || 14.0.0-alpha - 14": version "14.3.0" resolved "https://registry.npmjs.org/@angular/core/-/core-14.3.0.tgz" integrity sha512-wYiwItc0Uyn4FWZ/OAx/Ubp2/WrD3EgUJ476y1XI7yATGPF8n9Ld5iCXT08HOvc4eBcYlDfh90kTXR6/MfhzdQ== dependencies: tslib "^2.3.0" -"@angular/core@13.4.0": - version "13.4.0" - resolved "https://registry.npmjs.org/@angular/core/-/core-13.4.0.tgz" - integrity sha512-RE9KL7pRj+3lkJjdSR2uKmqiG0gqjnoVCMbSLG93pWrmzNIhElmlkiDaK39aMHGl836dc68Usv9CEisyVnRqHQ== - dependencies: - tslib "^2.3.0" - "@angular/forms@^13.0.0", "@angular/forms@>=10.0.0", "@angular/forms@>=5.0.0 <14.0.0", "@angular/forms@~14.3.0", "@angular/forms@5.0.0-alpha - 5 || 6.0.0-alpha - 6 || 7.0.0-alpha - 7 || 8.0.0-alpha - 8 || 9.0.0-alpha - 9 || 10.0.0-alpha - 10 || 11.0.0-alpha - 11 || 12.0.0-alpha - 12 || 13.0.0-alpha - 13 || 14.0.0-alpha - 14": version "14.3.0" resolved "https://registry.npmjs.org/@angular/forms/-/forms-14.3.0.tgz" @@ -2150,20 +2151,20 @@ resolved "https://registry.npmjs.org/@ngtools/webpack/-/webpack-14.2.11.tgz" integrity sha512-4enbLFAp98uTgWYF6OFceQqLcfv2/0brIrNN4iWT9xe/Mh3zdCt+eH42zvNRsqo9WXNWRSLvnx8I924p83LNlw== -"@nguniversal/builders@^13.1.1": - version "13.1.1" - resolved "https://registry.npmjs.org/@nguniversal/builders/-/builders-13.1.1.tgz" - integrity sha512-R73GKHr7KeTIBE/kSudhsN0V1gx+TrnM28RHdzw3eHCz2Q3msGpgdt/79+2EjLcvWjoVHOsD+aFIJ9+sx422yQ== +"@nguniversal/builders@^14.2.3": + version "14.2.3" + resolved "https://registry.npmjs.org/@nguniversal/builders/-/builders-14.2.3.tgz" + integrity sha512-4WpQ5zMfw4BIH/2ymWchFm2bbN8w0/sC0Rg3IracJ9ESsfTJMaIg8CzVer6NBqC+5As9iLZwau7nrfzt7sQf1A== dependencies: - "@angular-devkit/architect" "^0.1303.0" - "@angular-devkit/core" "^13.3.4" - "@nguniversal/common" "13.1.1" + "@angular-devkit/architect" "^0.1402.0" + "@angular-devkit/core" "^14.2.0" + "@nguniversal/common" "14.2.3" browser-sync "^2.26.7" express "^4.17.1" guess-parser "^0.4.12" http-proxy-middleware "^2.0.0" ora "^5.1.0" - piscina "~3.1.0" + piscina "~3.2.0" rxjs "^6.5.5" tree-kill "^1.2.2" @@ -2176,6 +2177,15 @@ jsdom "19.0.0" tslib "^2.3.0" +"@nguniversal/common@14.2.3": + version "14.2.3" + resolved "https://registry.npmjs.org/@nguniversal/common/-/common-14.2.3.tgz" + integrity sha512-FWoZY+DZCNw24tNnnWkgTpNAlshkfiaxiT7V+fx2WFpY0LNXLWk45+hWhl4+wFEknOXr/DT/oU1m/RjR6FgXZQ== + dependencies: + critters "0.0.16" + jsdom "20.0.0" + tslib "^2.3.0" + "@nguniversal/express-engine@^13.0.2": version "13.1.1" resolved "https://registry.npmjs.org/@nguniversal/express-engine/-/express-engine-13.1.1.tgz" @@ -4776,7 +4786,7 @@ data-urls@^2.0.0: whatwg-mimetype "^2.3.0" whatwg-url "^8.0.0" -data-urls@^3.0.1: +data-urls@^3.0.1, data-urls@^3.0.2: version "3.0.2" resolved "https://registry.npmjs.org/data-urls/-/data-urls-3.0.2.tgz" integrity sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ== @@ -6742,7 +6752,7 @@ http-signature@~1.3.6: jsprim "^2.0.2" sshpk "^1.14.1" -https-proxy-agent@^5.0.0, https-proxy-agent@5.0.1: +https-proxy-agent@^5.0.0, https-proxy-agent@^5.0.1, https-proxy-agent@5.0.1: version "5.0.1" resolved "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz" integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== @@ -7507,6 +7517,39 @@ jsdom@19.0.0: ws "^8.2.3" xml-name-validator "^4.0.0" +jsdom@20.0.0: + version "20.0.0" + resolved "https://registry.npmjs.org/jsdom/-/jsdom-20.0.0.tgz" + integrity sha512-x4a6CKCgx00uCmP+QakBDFXwjAJ69IkkIWHmtmjd3wvXPcdOS44hfX2vqkOQrVrq8l9DhNNADZRXaCEWvgXtVA== + dependencies: + abab "^2.0.6" + acorn "^8.7.1" + acorn-globals "^6.0.0" + cssom "^0.5.0" + cssstyle "^2.3.0" + data-urls "^3.0.2" + decimal.js "^10.3.1" + domexception "^4.0.0" + escodegen "^2.0.0" + form-data "^4.0.0" + html-encoding-sniffer "^3.0.0" + http-proxy-agent "^5.0.0" + https-proxy-agent "^5.0.1" + is-potential-custom-element-name "^1.0.1" + nwsapi "^2.2.0" + parse5 "^7.0.0" + saxes "^6.0.0" + symbol-tree "^3.2.4" + tough-cookie "^4.0.0" + w3c-hr-time "^1.0.2" + w3c-xmlserializer "^3.0.0" + webidl-conversions "^7.0.0" + whatwg-encoding "^2.0.0" + whatwg-mimetype "^3.0.0" + whatwg-url "^11.0.0" + ws "^8.8.0" + xml-name-validator "^4.0.0" + jsesc@^2.5.1: version "2.5.2" resolved "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz" @@ -9191,6 +9234,13 @@ parse5@^6.0.1: resolved "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz" integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== +parse5@^7.0.0: + version "7.1.2" + resolved "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz" + integrity sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw== + dependencies: + entities "^4.4.0" + parse5@6.0.1: version "6.0.1" resolved "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz" @@ -9281,18 +9331,7 @@ pify@^4.0.1: resolved "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz" integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== -piscina@~3.1.0: - version "3.1.0" - resolved "https://registry.npmjs.org/piscina/-/piscina-3.1.0.tgz" - integrity sha512-KTW4sjsCD34MHrUbx9eAAbuUSpVj407hQSgk/6Epkg0pbRBmv4a3UX7Sr8wxm9xYqQLnsN4mFOjqGDzHAdgKQg== - dependencies: - eventemitter-asyncresource "^1.0.0" - hdr-histogram-js "^2.0.1" - hdr-histogram-percentiles-obj "^3.0.0" - optionalDependencies: - nice-napi "^1.0.2" - -piscina@3.2.0: +piscina@~3.2.0, piscina@3.2.0: version "3.2.0" resolved "https://registry.npmjs.org/piscina/-/piscina-3.2.0.tgz" integrity sha512-yn/jMdHRw+q2ZJhFhyqsmANcbF6V2QwmD84c6xRau+QpQOmtrBCoRGdvTfeuFDYXB5W2m6MfLkjkvQa9lUSmIA== @@ -10540,14 +10579,7 @@ rxjs@^6.5.4: dependencies: tslib "^1.9.0" -rxjs@^6.5.5: - version "6.6.7" - resolved "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz" - integrity sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ== - dependencies: - tslib "^1.9.0" - -rxjs@~6.6.0, rxjs@6.6.7: +rxjs@^6.5.5, rxjs@~6.6.0, rxjs@6.6.7: version "6.6.7" resolved "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz" integrity sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ== @@ -10666,6 +10698,13 @@ saxes@^5.0.1: dependencies: xmlchars "^2.2.0" +saxes@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz" + integrity sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA== + dependencies: + xmlchars "^2.2.0" + scheduler@^0.19.1: version "0.19.1" resolved "https://registry.npmjs.org/scheduler/-/scheduler-0.19.1.tgz" @@ -12567,7 +12606,7 @@ ws@^7.4.6: resolved "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz" integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== -ws@^8.1.0, ws@^8.13.0, ws@^8.2.3, ws@^8.4.2: +ws@^8.1.0, ws@^8.13.0, ws@^8.2.3, ws@^8.4.2, ws@^8.8.0: version "8.13.0" resolved "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz" integrity sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA== @@ -12699,7 +12738,7 @@ yocto-queue@^0.1.0: resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz" integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== -zone.js@~0.11.4, "zone.js@~0.11.4 || ~0.12.0", zone.js@~0.11.5: +"zone.js@~0.11.4 || ~0.12.0", zone.js@~0.11.5: version "0.11.8" resolved "https://registry.npmjs.org/zone.js/-/zone.js-0.11.8.tgz" integrity sha512-82bctBg2hKcEJ21humWIkXRlLBBmrc3nN7DFh5LGGhcyycO2S7FN8NmdvlcKaGFDNVL4/9kFLmwmInTavdJERA== From 4c10721e3ad2cdcfe821b2c40d9b84b09d58d597 Mon Sep 17 00:00:00 2001 From: Kristof De Langhe Date: Tue, 11 Apr 2023 16:43:04 +0200 Subject: [PATCH 072/409] 101108: Automatic ng update @angular/cli@14 --- angular.json | 5 +- package.json | 26 +-- tsconfig.json | 2 +- yarn.lock | 506 ++++++++++++++++++++++++++++---------------------- 4 files changed, 301 insertions(+), 238 deletions(-) diff --git a/angular.json b/angular.json index b32670ad77..d5227c4f10 100644 --- a/angular.json +++ b/angular.json @@ -273,9 +273,10 @@ } } }, - "defaultProject": "dspace-angular", "cli": { "analytics": false, - "defaultCollection": "@angular-eslint/schematics" + "schematicCollections": [ + "@angular-eslint/schematics" + ] } } diff --git a/package.json b/package.json index a0c63ebe5c..bc54a4057f 100644 --- a/package.json +++ b/package.json @@ -55,17 +55,17 @@ "ts-node": "10.2.1" }, "dependencies": { - "@angular/animations": "~14.3.0", + "@angular/animations": "^14.3.0", "@angular/cdk": "^13.2.6", - "@angular/common": "~14.3.0", - "@angular/compiler": "~14.3.0", - "@angular/core": "~14.3.0", - "@angular/forms": "~14.3.0", + "@angular/common": "^14.3.0", + "@angular/compiler": "^14.3.0", + "@angular/core": "^14.3.0", + "@angular/forms": "^14.3.0", "@angular/localize": "14.3.0", - "@angular/platform-browser": "~14.3.0", - "@angular/platform-browser-dynamic": "~14.3.0", - "@angular/platform-server": "~14.3.0", - "@angular/router": "~14.3.0", + "@angular/platform-browser": "^14.3.0", + "@angular/platform-browser-dynamic": "^14.3.0", + "@angular/platform-server": "^14.3.0", + "@angular/router": "^14.3.0", "@babel/runtime": "7.17.2", "@kolkov/ngx-gallery": "^2.0.1", "@material-ui/core": "^4.11.0", @@ -135,15 +135,15 @@ }, "devDependencies": { "@angular-builders/custom-webpack": "~13.1.0", - "@angular-devkit/build-angular": "~14.2.11", + "@angular-devkit/build-angular": "^14.2.11", "@angular-eslint/builder": "13.1.0", "@angular-eslint/eslint-plugin": "13.1.0", "@angular-eslint/eslint-plugin-template": "13.1.0", "@angular-eslint/schematics": "13.1.0", "@angular-eslint/template-parser": "13.1.0", - "@angular/cli": "~13.3.10", - "@angular/compiler-cli": "~14.3.0", - "@angular/language-service": "~14.3.0", + "@angular/cli": "^14.2.11", + "@angular/compiler-cli": "^14.3.0", + "@angular/language-service": "^14.3.0", "@cypress/schematic": "^1.5.0", "@fortawesome/fontawesome-free": "^6.2.1", "@ngrx/store-devtools": "^13.0.2", diff --git a/tsconfig.json b/tsconfig.json index 7d2e9a69af..46aa25d4a9 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -21,7 +21,7 @@ "skipDefaultLibCheck": true, "pretty": true, "allowSyntheticDefaultImports": true, - "target": "es2015", + "target": "es2020", "typeRoots": [ "node_modules/@types", "src/typings.d.ts" diff --git a/yarn.lock b/yarn.lock index 9d08f5bc3a..84429ae63f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -140,7 +140,7 @@ optionalDependencies: esbuild "0.14.22" -"@angular-devkit/build-angular@^14.2.0", "@angular-devkit/build-angular@~14.2.11": +"@angular-devkit/build-angular@^14.2.0", "@angular-devkit/build-angular@^14.2.11": version "14.2.11" resolved "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-14.2.11.tgz" integrity sha512-O3X7GXcCBCGceVSHT+GIJ2JrRCg2YcO7HtNavpmPrraNr1o+aCdTkmT5WTS2cqWkZBm/z0wqKR8PsX/ZoD2r1A== @@ -270,14 +270,14 @@ ora "5.4.1" rxjs "6.6.7" -"@angular-devkit/schematics@13.3.11": - version "13.3.11" - resolved "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-13.3.11.tgz" - integrity sha512-ben+EGXpCrClnIVAAnEQmhQdKmnnqFhMp5BqMxgOslSYBAmCutLA6rBu5vsc8kZcGian1wt+lueF7G1Uk5cGBg== +"@angular-devkit/schematics@14.2.11": + version "14.2.11" + resolved "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-14.2.11.tgz" + integrity sha512-OTEOu4uf3kZDcSGYkuESxf/IOlJSn/GdLt63Sd1QwJu6pJSeFxkANw/WEWICZyJfRLNW6fdLJLEGPM9Zt5ZqAg== dependencies: - "@angular-devkit/core" "13.3.11" - jsonc-parser "3.0.0" - magic-string "0.25.7" + "@angular-devkit/core" "14.2.11" + jsonc-parser "3.1.0" + magic-string "0.26.2" ora "5.4.1" rxjs "6.6.7" @@ -338,7 +338,7 @@ "@angular-eslint/bundled-angular-compiler" "13.1.0" "@typescript-eslint/experimental-utils" "5.11.0" -"@angular/animations@>=13.0.0 <14", "@angular/animations@>=5.0.0 <14.0.0", "@angular/animations@~14.3.0", "@angular/animations@14.3.0": +"@angular/animations@^14.3.0", "@angular/animations@>=13.0.0 <14", "@angular/animations@>=5.0.0 <14.0.0", "@angular/animations@14.3.0": version "14.3.0" resolved "https://registry.npmjs.org/@angular/animations/-/animations-14.3.0.tgz" integrity sha512-QoBcIKy1ZiU+4qJsAh5Ls20BupWiXiZzKb0s6L9/dntPt5Msr4Ao289XR2P6O1L+kTsCprH9Kt41zyGQ/bkRqg== @@ -354,32 +354,33 @@ optionalDependencies: parse5 "^5.0.0" -"@angular/cli@>= 13.0.0 < 14.0.0", "@angular/cli@>=12", "@angular/cli@~13.3.10": - version "13.3.11" - resolved "https://registry.npmjs.org/@angular/cli/-/cli-13.3.11.tgz" - integrity sha512-LTuQ1wC/VJiHqHx8nYJCx0EJv1Ek7R6VvP/5vmr/+M8oVvJ2zSh/aIbcPg6BTL0YEfMI6nX41mUjPBUfF0q2OA== +"@angular/cli@^14.2.11", "@angular/cli@>= 13.0.0 < 14.0.0", "@angular/cli@>=12": + version "14.2.11" + resolved "https://registry.npmjs.org/@angular/cli/-/cli-14.2.11.tgz" + integrity sha512-k4Epob8Xz+9oyC6Ty9SNntTa2wHAvzxfcCi7itefPMcwEU9pqBcAv4XYfyawb5d7n/S5RBNwdsDpjoh2DPtmow== dependencies: - "@angular-devkit/architect" "0.1303.11" - "@angular-devkit/core" "13.3.11" - "@angular-devkit/schematics" "13.3.11" - "@schematics/angular" "13.3.11" + "@angular-devkit/architect" "0.1402.11" + "@angular-devkit/core" "14.2.11" + "@angular-devkit/schematics" "14.2.11" + "@schematics/angular" "14.2.11" "@yarnpkg/lockfile" "1.1.0" - ansi-colors "4.1.1" - debug "4.3.3" - ini "2.0.0" - inquirer "8.2.0" - jsonc-parser "3.0.0" - npm-package-arg "8.1.5" - npm-pick-manifest "6.1.1" + ansi-colors "4.1.3" + debug "4.3.4" + ini "3.0.0" + inquirer "8.2.4" + jsonc-parser "3.1.0" + npm-package-arg "9.1.0" + npm-pick-manifest "7.0.1" open "8.4.0" ora "5.4.1" - pacote "12.0.3" - resolve "1.22.0" - semver "7.3.5" + pacote "13.6.2" + resolve "1.22.1" + semver "7.3.7" symbol-observable "4.0.0" uuid "8.3.2" + yargs "17.5.1" -"@angular/common@*", "@angular/common@^11.0.0", "@angular/common@^13.0.0", "@angular/common@^13.0.0 || ^14.0.0-0", "@angular/common@^13.3.4", "@angular/common@^14.2.0", "@angular/common@>=10.0.0", "@angular/common@>=13.0.0 <14", "@angular/common@>=13.0.0-0", "@angular/common@>=2.x", "@angular/common@>=5.0.0", "@angular/common@>=5.0.0 <14.0.0", "@angular/common@~14.3.0", "@angular/common@14.3.0", "@angular/common@5.0.0-alpha - 5 || 6.0.0-alpha - 6 || 7.0.0-alpha - 7 || 8.0.0-alpha - 8 || 9.0.0-alpha - 9 || 10.0.0-alpha - 10 || 11.0.0-alpha - 11 || 12.0.0-alpha - 12 || 13.0.0-alpha - 13 || 14.0.0-alpha - 14": +"@angular/common@*", "@angular/common@^11.0.0", "@angular/common@^13.0.0", "@angular/common@^13.0.0 || ^14.0.0-0", "@angular/common@^13.3.4", "@angular/common@^14.2.0", "@angular/common@^14.3.0", "@angular/common@>=10.0.0", "@angular/common@>=13.0.0 <14", "@angular/common@>=13.0.0-0", "@angular/common@>=2.x", "@angular/common@>=5.0.0", "@angular/common@>=5.0.0 <14.0.0", "@angular/common@14.3.0", "@angular/common@5.0.0-alpha - 5 || 6.0.0-alpha - 6 || 7.0.0-alpha - 7 || 8.0.0-alpha - 8 || 9.0.0-alpha - 9 || 10.0.0-alpha - 10 || 11.0.0-alpha - 11 || 12.0.0-alpha - 12 || 13.0.0-alpha - 13 || 14.0.0-alpha - 14": version "14.3.0" resolved "https://registry.npmjs.org/@angular/common/-/common-14.3.0.tgz" integrity sha512-pV9oyG3JhGWeQ+TFB0Qub6a1VZWMNZ6/7zEopvYivdqa5yDLLDSBRWb6P80RuONXyGnM1pa7l5nYopX+r/23GQ== @@ -402,7 +403,7 @@ tslib "^2.3.0" yargs "^17.2.1" -"@angular/compiler-cli@^13.0.0", "@angular/compiler-cli@^14.0.0", "@angular/compiler-cli@~14.3.0", "@angular/compiler-cli@14.3.0": +"@angular/compiler-cli@^13.0.0", "@angular/compiler-cli@^14.0.0", "@angular/compiler-cli@^14.3.0", "@angular/compiler-cli@14.3.0": version "14.3.0" resolved "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-14.3.0.tgz" integrity sha512-eoKpKdQ2X6axMgzcPUMZVYl3bIlTMzMeTo5V29No4BzgiUB+QoOTYGNJZkGRyqTNpwD9uSBJvmT2vG9+eC4ghQ== @@ -418,7 +419,7 @@ tslib "^2.3.0" yargs "^17.2.1" -"@angular/compiler@~14.3.0", "@angular/compiler@14.3.0": +"@angular/compiler@^14.3.0", "@angular/compiler@14.3.0": version "14.3.0" resolved "https://registry.npmjs.org/@angular/compiler/-/compiler-14.3.0.tgz" integrity sha512-E15Rh0t3vA+bctbKnBCaDmLvc3ix+ZBt6yFZmhZalReQ+KpOlvOJv+L9oiFEgg+rYVl2QdvN7US1fvT0PqswLw== @@ -432,21 +433,21 @@ dependencies: tslib "^2.3.0" -"@angular/core@*", "@angular/core@^11.0.0", "@angular/core@^13.0.0", "@angular/core@^13.0.0 || ^14.0.0-0", "@angular/core@^13.3.4", "@angular/core@^14.2.0", "@angular/core@>=10.0.0", "@angular/core@>=12", "@angular/core@>=13.0.0 <14", "@angular/core@>=13.0.0-0", "@angular/core@>=2.x", "@angular/core@>=5.0.0", "@angular/core@>=5.0.0 <14.0.0", "@angular/core@~14.3.0", "@angular/core@14.3.0", "@angular/core@5.0.0-alpha - 5 || 6.0.0-alpha - 6 || 7.0.0-alpha - 7 || 8.0.0-alpha - 8 || 9.0.0-alpha - 9 || 10.0.0-alpha - 10 || 11.0.0-alpha - 11 || 12.0.0-alpha - 12 || 13.0.0-alpha - 13 || 14.0.0-alpha - 14": +"@angular/core@*", "@angular/core@^11.0.0", "@angular/core@^13.0.0", "@angular/core@^13.0.0 || ^14.0.0-0", "@angular/core@^13.3.4", "@angular/core@^14.2.0", "@angular/core@^14.3.0", "@angular/core@>=10.0.0", "@angular/core@>=12", "@angular/core@>=13.0.0 <14", "@angular/core@>=13.0.0-0", "@angular/core@>=2.x", "@angular/core@>=5.0.0", "@angular/core@>=5.0.0 <14.0.0", "@angular/core@14.3.0", "@angular/core@5.0.0-alpha - 5 || 6.0.0-alpha - 6 || 7.0.0-alpha - 7 || 8.0.0-alpha - 8 || 9.0.0-alpha - 9 || 10.0.0-alpha - 10 || 11.0.0-alpha - 11 || 12.0.0-alpha - 12 || 13.0.0-alpha - 13 || 14.0.0-alpha - 14": version "14.3.0" resolved "https://registry.npmjs.org/@angular/core/-/core-14.3.0.tgz" integrity sha512-wYiwItc0Uyn4FWZ/OAx/Ubp2/WrD3EgUJ476y1XI7yATGPF8n9Ld5iCXT08HOvc4eBcYlDfh90kTXR6/MfhzdQ== dependencies: tslib "^2.3.0" -"@angular/forms@^13.0.0", "@angular/forms@>=10.0.0", "@angular/forms@>=5.0.0 <14.0.0", "@angular/forms@~14.3.0", "@angular/forms@5.0.0-alpha - 5 || 6.0.0-alpha - 6 || 7.0.0-alpha - 7 || 8.0.0-alpha - 8 || 9.0.0-alpha - 9 || 10.0.0-alpha - 10 || 11.0.0-alpha - 11 || 12.0.0-alpha - 12 || 13.0.0-alpha - 13 || 14.0.0-alpha - 14": +"@angular/forms@^13.0.0", "@angular/forms@^14.3.0", "@angular/forms@>=10.0.0", "@angular/forms@>=5.0.0 <14.0.0", "@angular/forms@5.0.0-alpha - 5 || 6.0.0-alpha - 6 || 7.0.0-alpha - 7 || 8.0.0-alpha - 8 || 9.0.0-alpha - 9 || 10.0.0-alpha - 10 || 11.0.0-alpha - 11 || 12.0.0-alpha - 12 || 13.0.0-alpha - 13 || 14.0.0-alpha - 14": version "14.3.0" resolved "https://registry.npmjs.org/@angular/forms/-/forms-14.3.0.tgz" integrity sha512-fBZZC2UFMom2AZPjGQzROPXFWO6kvCsPDKctjJwClVC8PuMrkm+RRyiYRdBbt2qxWHEqOZM2OCQo73xUyZOYHw== dependencies: tslib "^2.3.0" -"@angular/language-service@~14.3.0": +"@angular/language-service@^14.3.0": version "14.3.0" resolved "https://registry.npmjs.org/@angular/language-service/-/language-service-14.3.0.tgz" integrity sha512-Sij3OQzj1UGs1O8H9PxVAY/o27+oqZwQRnib66rsWvtbIBTjHp4FV3dTs5iVcr62GGv4V4Mff/2I82NP10GPQg== @@ -469,21 +470,21 @@ glob "8.0.3" yargs "^17.2.1" -"@angular/platform-browser-dynamic@~14.3.0", "@angular/platform-browser-dynamic@14.3.0": +"@angular/platform-browser-dynamic@^14.3.0", "@angular/platform-browser-dynamic@14.3.0": version "14.3.0" resolved "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-14.3.0.tgz" integrity sha512-rneZiMrIiYRhrkQvdL40E2ErKRn4Zdo6EtjBM9pAmWeyoM8oMnOZb9gz5vhrkNWg06kVMVg0yKqluP5How7j3A== dependencies: tslib "^2.3.0" -"@angular/platform-browser@>=5.0.0 <14.0.0", "@angular/platform-browser@~14.3.0", "@angular/platform-browser@14.3.0", "@angular/platform-browser@5.0.0-alpha - 5 || 6.0.0-alpha - 6 || 7.0.0-alpha - 7 || 8.0.0-alpha - 8 || 9.0.0-alpha - 9 || 10.0.0-alpha - 10 || 11.0.0-alpha - 11 || 12.0.0-alpha - 12 || 13.0.0-alpha - 13 || 14.0.0-alpha - 14": +"@angular/platform-browser@^14.3.0", "@angular/platform-browser@>=5.0.0 <14.0.0", "@angular/platform-browser@14.3.0", "@angular/platform-browser@5.0.0-alpha - 5 || 6.0.0-alpha - 6 || 7.0.0-alpha - 7 || 8.0.0-alpha - 8 || 9.0.0-alpha - 9 || 10.0.0-alpha - 10 || 11.0.0-alpha - 11 || 12.0.0-alpha - 12 || 13.0.0-alpha - 13 || 14.0.0-alpha - 14": version "14.3.0" resolved "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-14.3.0.tgz" integrity sha512-w9Y3740UmTz44T0Egvc+4QV9sEbO61L+aRHbpkLTJdlEGzHByZvxJmJyBYmdqeyTPwc/Zpy7c02frlpfAlyB7A== dependencies: tslib "^2.3.0" -"@angular/platform-server@^13.3.4", "@angular/platform-server@~14.3.0": +"@angular/platform-server@^13.3.4", "@angular/platform-server@^14.3.0": version "14.3.0" resolved "https://registry.npmjs.org/@angular/platform-server/-/platform-server-14.3.0.tgz" integrity sha512-JGeyS5T2bpG1wiRPFpVFU6L8OeYYe1cVDQRi1B1Wzd3hZklF0BCck0BHpYIifuhQGoUpsG7t3aDiqJW2Oj9Vaw== @@ -492,7 +493,7 @@ tslib "^2.3.0" xhr2 "^0.2.0" -"@angular/router@^13.0.0", "@angular/router@~14.3.0": +"@angular/router@^13.0.0", "@angular/router@^14.3.0": version "14.3.0" resolved "https://registry.npmjs.org/@angular/router/-/router-14.3.0.tgz" integrity sha512-uip0V7w7k7xyxxpTPbr7EuMnYLj3FzJrwkLVJSEw3TMMGHt5VU5t4BBa9veGZOta2C205XFrTAHnp8mD+XYY1w== @@ -2245,21 +2246,22 @@ "@gar/promisify" "^1.1.3" semver "^7.3.5" -"@npmcli/git@^2.1.0": - version "2.1.0" - resolved "https://registry.npmjs.org/@npmcli/git/-/git-2.1.0.tgz" - integrity sha512-/hBFX/QG1b+N7PZBFs0bi+evgRZcK9nWBxQKZkGoXUT5hJSwl5c4d7y8/hm+NQZRPhQ67RzFaj5UM9YeyKoryw== +"@npmcli/git@^3.0.0": + version "3.0.2" + resolved "https://registry.npmjs.org/@npmcli/git/-/git-3.0.2.tgz" + integrity sha512-CAcd08y3DWBJqJDpfuVL0uijlq5oaXaOJEKHKc4wqrjd00gkvTZB+nFuLn+doOOKddaQS9JfqtNoFCO2LCvA3w== dependencies: - "@npmcli/promise-spawn" "^1.3.2" - lru-cache "^6.0.0" + "@npmcli/promise-spawn" "^3.0.0" + lru-cache "^7.4.4" mkdirp "^1.0.4" - npm-pick-manifest "^6.1.1" + npm-pick-manifest "^7.0.0" + proc-log "^2.0.0" promise-inflight "^1.0.1" promise-retry "^2.0.1" semver "^7.3.5" which "^2.0.2" -"@npmcli/installed-package-contents@^1.0.6": +"@npmcli/installed-package-contents@^1.0.7": version "1.0.7" resolved "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-1.0.7.tgz" integrity sha512-9rufe0wnJusCQoLpV9ZPKIVP55itrM5BxOXs10DmdbRfgWtHy1LDyskbwRnBghuB0PrF7pNPOqREVtpz4HqzKw== @@ -2283,27 +2285,28 @@ mkdirp "^1.0.4" rimraf "^3.0.2" -"@npmcli/node-gyp@^1.0.2": - version "1.0.3" - resolved "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-1.0.3.tgz" - integrity sha512-fnkhw+fmX65kiLqk6E3BFLXNC26rUhK90zVwe2yncPliVT/Qos3xjhTLE59Df8KnPlcwIERXKVlU1bXoUQ+liA== +"@npmcli/node-gyp@^2.0.0": + version "2.0.0" + resolved "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-2.0.0.tgz" + integrity sha512-doNI35wIe3bBaEgrlPfdJPaCpUR89pJWep4Hq3aRdh6gKazIVWfs0jHttvSSoq47ZXgC7h73kDsUl8AoIQUB+A== -"@npmcli/promise-spawn@^1.2.0", "@npmcli/promise-spawn@^1.3.2": - version "1.3.2" - resolved "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-1.3.2.tgz" - integrity sha512-QyAGYo/Fbj4MXeGdJcFzZ+FkDkomfRBrPM+9QYJSg+PxgAUL+LU3FneQk37rKR2/zjqkCV1BLHccX98wRXG3Sg== +"@npmcli/promise-spawn@^3.0.0": + version "3.0.0" + resolved "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-3.0.0.tgz" + integrity sha512-s9SgS+p3a9Eohe68cSI3fi+hpcZUmXq5P7w0kMlAsWVtR7XbK3ptkZqKT2cK1zLDObJ3sR+8P59sJE0w/KTL1g== dependencies: infer-owner "^1.0.4" -"@npmcli/run-script@^2.0.0": - version "2.0.0" - resolved "https://registry.npmjs.org/@npmcli/run-script/-/run-script-2.0.0.tgz" - integrity sha512-fSan/Pu11xS/TdaTpTB0MRn9guwGU8dye+x56mEVgBEd/QsybBbYcAL0phPXi8SGWFEChkQd6M9qL4y6VOpFig== +"@npmcli/run-script@^4.1.0": + version "4.2.1" + resolved "https://registry.npmjs.org/@npmcli/run-script/-/run-script-4.2.1.tgz" + integrity sha512-7dqywvVudPSrRCW5nTHpHgeWnbBtz8cFkOuKrecm6ih+oO9ciydhWt6OF7HlqupRRmB8Q/gECVdB9LMfToJbRg== dependencies: - "@npmcli/node-gyp" "^1.0.2" - "@npmcli/promise-spawn" "^1.3.2" - node-gyp "^8.2.0" - read-package-json-fast "^2.0.1" + "@npmcli/node-gyp" "^2.0.0" + "@npmcli/promise-spawn" "^3.0.0" + node-gyp "^9.0.0" + read-package-json-fast "^2.0.3" + which "^2.0.2" "@nrwl/cli@*", "@nrwl/cli@15.9.2": version "15.9.2" @@ -2444,14 +2447,14 @@ "@angular-devkit/schematics" "12.2.18" jsonc-parser "3.0.0" -"@schematics/angular@13.3.11": - version "13.3.11" - resolved "https://registry.npmjs.org/@schematics/angular/-/angular-13.3.11.tgz" - integrity sha512-imKBnKYEse0SBVELZO/753nkpt3eEgpjrYkB+AFWF9YfO/4RGnYXDHoH8CFkzxPH9QQCgNrmsVFNiYGS+P/S1A== +"@schematics/angular@14.2.11": + version "14.2.11" + resolved "https://registry.npmjs.org/@schematics/angular/-/angular-14.2.11.tgz" + integrity sha512-tejU2BOc25bQO34mZmTwmtAfOiFtDE/io/yHqYgUsTn804kyMQbz2QOOXN0epdzRYrkAHvH4KV8c2LDyO6iijA== dependencies: - "@angular-devkit/core" "13.3.11" - "@angular-devkit/schematics" "13.3.11" - jsonc-parser "3.0.0" + "@angular-devkit/core" "14.2.11" + "@angular-devkit/schematics" "14.2.11" + jsonc-parser "3.1.0" "@socket.io/component-emitter@~3.1.0": version "3.1.0" @@ -3077,7 +3080,7 @@ abab@^2.0.3, abab@^2.0.5, abab@^2.0.6: resolved "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz" integrity sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA== -abbrev@1: +abbrev@^1.0.0, abbrev@1: version "1.1.1" resolved "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz" integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== @@ -3148,7 +3151,7 @@ agent-base@^6.0.2, agent-base@6: dependencies: debug "4" -agentkeepalive@^4.1.3, agentkeepalive@^4.2.1: +agentkeepalive@^4.2.1: version "4.3.0" resolved "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.3.0.tgz" integrity sha512-7Epl1Blf4Sy37j4v9f9FjICCh4+KAQOyXgHEwlyBiAQLbhKdq/i2QQU3amQalS/wPhdPzDXPL5DMR5bkn+YeWg== @@ -3851,10 +3854,12 @@ buffer@^5.5.0, buffer@^5.6.0: base64-js "^1.3.1" ieee754 "^1.1.13" -builtins@^1.0.3: - version "1.0.3" - resolved "https://registry.npmjs.org/builtins/-/builtins-1.0.3.tgz" - integrity sha512-uYBjakWipfaO/bXI7E8rq6kpwHRZK5cNYrUv2OzZSI/FvmdMyXJ2tG9dKcjEC5YHmHpUAwsargWIZNWdxb/bnQ== +builtins@^5.0.0: + version "5.0.1" + resolved "https://registry.npmjs.org/builtins/-/builtins-5.0.1.tgz" + integrity sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ== + dependencies: + semver "^7.0.0" bytes@3.0.0: version "3.0.0" @@ -3871,7 +3876,7 @@ bytesish@^0.4.1: resolved "https://registry.npmjs.org/bytesish/-/bytesish-0.4.4.tgz" integrity sha512-i4uu6M4zuMUiyfZN4RU2+i9+peJh//pXhd9x1oSe1LBkZ3LEbCoygu8W0bXTukU1Jme2txKuotpCZRaC3FLxcQ== -cacache@^15.0.5, cacache@^15.2.0, cacache@15.3.0: +cacache@^15.0.5, cacache@15.3.0: version "15.3.0" resolved "https://registry.npmjs.org/cacache/-/cacache-15.3.0.tgz" integrity sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ== @@ -3895,6 +3900,30 @@ cacache@^15.0.5, cacache@^15.2.0, cacache@15.3.0: tar "^6.0.2" unique-filename "^1.1.1" +cacache@^16.0.0: + version "16.1.3" + resolved "https://registry.npmjs.org/cacache/-/cacache-16.1.3.tgz" + integrity sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ== + dependencies: + "@npmcli/fs" "^2.1.0" + "@npmcli/move-file" "^2.0.0" + chownr "^2.0.0" + fs-minipass "^2.1.0" + glob "^8.0.1" + infer-owner "^1.0.4" + lru-cache "^7.7.1" + minipass "^3.1.6" + minipass-collect "^1.0.2" + minipass-flush "^1.0.5" + minipass-pipeline "^1.2.4" + mkdirp "^1.0.4" + p-map "^4.0.0" + promise-inflight "^1.0.1" + rimraf "^3.0.2" + ssri "^9.0.0" + tar "^6.1.11" + unique-filename "^2.0.0" + cacache@^16.1.0: version "16.1.3" resolved "https://registry.npmjs.org/cacache/-/cacache-16.1.3.tgz" @@ -4843,7 +4872,7 @@ debug@^3.2.7: dependencies: ms "^2.1.1" -debug@^4.1.0, debug@^4.1.1, debug@^4.3.2, debug@^4.3.3, debug@^4.3.4, debug@~4.3.1, debug@~4.3.2, debug@4: +debug@^4.1.0, debug@^4.1.1, debug@^4.3.2, debug@^4.3.3, debug@^4.3.4, debug@~4.3.1, debug@~4.3.2, debug@4, debug@4.3.4: version "4.3.4" resolved "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz" integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== @@ -4864,13 +4893,6 @@ debug@4.3.2: dependencies: ms "2.1.2" -debug@4.3.3: - version "4.3.3" - resolved "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz" - integrity sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q== - dependencies: - ms "2.1.2" - decimal.js@^10.2.1, decimal.js@^10.3.1: version "10.4.3" resolved "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz" @@ -5241,7 +5263,7 @@ encodeurl@~1.0.1, encodeurl@~1.0.2: resolved "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz" integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== -encoding@^0.1.0, encoding@^0.1.12, encoding@^0.1.13: +encoding@^0.1.0, encoding@^0.1.13: version "0.1.13" resolved "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz" integrity sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A== @@ -6569,12 +6591,12 @@ hoist-non-react-statics@^3.3.0, hoist-non-react-statics@^3.3.2: dependencies: react-is "^16.7.0" -hosted-git-info@^4.0.1: - version "4.1.0" - resolved "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz" - integrity sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA== +hosted-git-info@^5.0.0: + version "5.2.1" + resolved "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-5.2.1.tgz" + integrity sha512-xIcQYMnhcx2Nr4JTjsFmwwnr9vldugPy9uVm0o87bjqqWMv9GaqsTeT+i99wTl0mk1uLxJtHxLb8kymqTENQsw== dependencies: - lru-cache "^6.0.0" + lru-cache "^7.5.1" hpack.js@^2.1.6: version "2.1.6" @@ -6847,12 +6869,12 @@ ignore-by-default@^1.0.1: resolved "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz" integrity sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA== -ignore-walk@^4.0.1: - version "4.0.1" - resolved "https://registry.npmjs.org/ignore-walk/-/ignore-walk-4.0.1.tgz" - integrity sha512-rzDQLaW4jQbh2YrOFlJdCtX8qgJTehFRYiUB2r1osqTeDzV/3+Jh8fz1oAPzUThf3iku8Ds4IDqawI5d8mUiQw== +ignore-walk@^5.0.1: + version "5.0.1" + resolved "https://registry.npmjs.org/ignore-walk/-/ignore-walk-5.0.1.tgz" + integrity sha512-yemi4pMf51WKT7khInJqAvsIGzoqYXblnsz0ql8tM+yi1EKYTY1evX4NAbJrLL/Aanr2HyZeluqU+Oi7MGHokw== dependencies: - minimatch "^3.0.4" + minimatch "^5.0.1" ignore@^5.0.4, ignore@^5.1.8, ignore@^5.1.9, ignore@^5.2.0: version "5.2.4" @@ -6938,6 +6960,11 @@ ini@2.0.0: resolved "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz" integrity sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA== +ini@3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/ini/-/ini-3.0.0.tgz" + integrity sha512-TxYQaeNW/N8ymDvwAxPyRbhMBtnEwuvaTYpOQkFx1nSeusgezHniEc/l35Vo4iCq/mMiTJbpD7oYxN98hFlfmw== + inquirer@8.2.0: version "8.2.0" resolved "https://registry.npmjs.org/inquirer/-/inquirer-8.2.0.tgz" @@ -7086,7 +7113,7 @@ is-ci@^3.0.0: dependencies: ci-info "^3.2.0" -is-core-module@^2.11.0, is-core-module@^2.8.1: +is-core-module@^2.11.0, is-core-module@^2.8.1, is-core-module@^2.9.0: version "2.12.0" resolved "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.0.tgz" integrity sha512-RECHCBCd/viahWmwj6enj19sKbHfJrddi/6cBDsNTKbNq0f7VeaUkBo60BqzvPqo/W54ChS62Z5qyun7cfOMqQ== @@ -8094,7 +8121,7 @@ lru-cache@^6.0.0: dependencies: yallist "^4.0.0" -lru-cache@^7.14.1, lru-cache@^7.7.1: +lru-cache@^7.14.1, lru-cache@^7.4.4, lru-cache@^7.5.1, lru-cache@^7.7.1: version "7.18.3" resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz" integrity sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA== @@ -8113,6 +8140,13 @@ magic-string@0.25.7: dependencies: sourcemap-codec "^1.4.4" +magic-string@0.26.2: + version "0.26.2" + resolved "https://registry.npmjs.org/magic-string/-/magic-string-0.26.2.tgz" + integrity sha512-NzzlXpclt5zAbmo6h6jNc8zl2gNRGHvmsZW4IvZhTC4W7k4OlLP+S5YLussa/r3ixNT66KOQfNORlXHSOy/X4A== + dependencies: + sourcemap-codec "^1.4.8" + make-dir@^2.1.0: version "2.1.0" resolved "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz" @@ -8133,7 +8167,7 @@ make-error@^1.1.1: resolved "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz" integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== -make-fetch-happen@^10.0.1: +make-fetch-happen@^10.0.3, make-fetch-happen@^10.0.6: version "10.2.1" resolved "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-10.2.1.tgz" integrity sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w== @@ -8155,28 +8189,6 @@ make-fetch-happen@^10.0.1: socks-proxy-agent "^7.0.0" ssri "^9.0.0" -make-fetch-happen@^9.1.0: - version "9.1.0" - resolved "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-9.1.0.tgz" - integrity sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg== - dependencies: - agentkeepalive "^4.1.3" - cacache "^15.2.0" - http-cache-semantics "^4.1.0" - http-proxy-agent "^4.0.1" - https-proxy-agent "^5.0.0" - is-lambda "^1.0.1" - lru-cache "^6.0.0" - minipass "^3.1.3" - minipass-collect "^1.0.2" - minipass-fetch "^1.3.2" - minipass-flush "^1.0.5" - minipass-pipeline "^1.2.4" - negotiator "^0.6.2" - promise-retry "^2.0.1" - socks-proxy-agent "^6.0.0" - ssri "^8.0.0" - manifesto.js@^4.2.0: version "4.2.17" resolved "https://registry.npmjs.org/manifesto.js/-/manifesto.js-4.2.17.tgz" @@ -8374,17 +8386,6 @@ minipass-collect@^1.0.2: dependencies: minipass "^3.0.0" -minipass-fetch@^1.3.2, minipass-fetch@^1.4.1: - version "1.4.1" - resolved "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-1.4.1.tgz" - integrity sha512-CGH1eblLq26Y15+Azk7ey4xh0J/XfJfrCox5LDJiKqI2Q2iwOLOKrlmIaODiSQS8d18jalF6y2K2ePUm0CmShw== - dependencies: - minipass "^3.1.0" - minipass-sized "^1.0.3" - minizlib "^2.0.0" - optionalDependencies: - encoding "^0.1.12" - minipass-fetch@^2.0.3: version "2.1.2" resolved "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-2.1.2.tgz" @@ -8425,7 +8426,7 @@ minipass-sized@^1.0.3: dependencies: minipass "^3.0.0" -minipass@^3.0.0, minipass@^3.1.0, minipass@^3.1.1, minipass@^3.1.3, minipass@^3.1.6: +minipass@^3.0.0, minipass@^3.1.1, minipass@^3.1.6: version "3.3.6" resolved "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz" integrity sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw== @@ -8437,7 +8438,7 @@ minipass@^4.0.0: resolved "https://registry.npmjs.org/minipass/-/minipass-4.2.7.tgz" integrity sha512-ScVIgqHcXRMyfflqHmEW0bm8z8rb5McHyOY3ewX9JBgZaR77G7nxq9L/mtV96/QbAAwtbCAHVVLzD1kkyfFQEw== -minizlib@^2.0.0, minizlib@^2.1.1, minizlib@^2.1.2: +minizlib@^2.1.1, minizlib@^2.1.2: version "2.1.2" resolved "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz" integrity sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg== @@ -8618,7 +8619,7 @@ needle@^3.1.0: iconv-lite "^0.6.3" sax "^1.2.4" -negotiator@^0.6.2, negotiator@^0.6.3, negotiator@0.6.3: +negotiator@^0.6.3, negotiator@0.6.3: version "0.6.3" resolved "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz" integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== @@ -8709,16 +8710,16 @@ node-gyp-build@^4.2.2, node-gyp-build@^4.3.0: resolved "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.6.0.tgz" integrity sha512-NTZVKn9IylLwUzaKjkas1e4u2DLNcV4rdYagA4PWdPwW87Bi7z+BznyKSRwS/761tV/lzCGXplWsiaMjLqP2zQ== -node-gyp@^8.2.0: - version "8.4.1" - resolved "https://registry.npmjs.org/node-gyp/-/node-gyp-8.4.1.tgz" - integrity sha512-olTJRgUtAb/hOXG0E93wZDs5YiJlgbXxTwQAFHyNlRsXQnYzUaF2aGgujZbw+hR8aF4ZG/rST57bWMWD16jr9w== +node-gyp@^9.0.0: + version "9.3.1" + resolved "https://registry.npmjs.org/node-gyp/-/node-gyp-9.3.1.tgz" + integrity sha512-4Q16ZCqq3g8awk6UplT7AuxQ35XN4R/yf/+wSAwcBUAjg7l58RTactWaP8fIDTi0FzI7YcVLujwExakZlfWkXg== dependencies: env-paths "^2.2.0" glob "^7.1.4" graceful-fs "^4.2.6" - make-fetch-happen "^9.1.0" - nopt "^5.0.0" + make-fetch-happen "^10.0.3" + nopt "^6.0.0" npmlog "^6.0.0" rimraf "^3.0.2" semver "^7.3.5" @@ -8746,12 +8747,12 @@ nodemon@^2.0.20: touch "^3.1.0" undefsafe "^2.0.5" -nopt@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz" - integrity sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ== +nopt@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/nopt/-/nopt-6.0.0.tgz" + integrity sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g== dependencies: - abbrev "1" + abbrev "^1.0.0" nopt@~1.0.10: version "1.0.10" @@ -8760,6 +8761,16 @@ nopt@~1.0.10: dependencies: abbrev "1" +normalize-package-data@^4.0.0: + version "4.0.1" + resolved "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-4.0.1.tgz" + integrity sha512-EBk5QKKuocMJhB3BILuKhmaPjI8vNRSpIfO9woLC6NyHVkKKdVEdAO1mrT0ZfxNR1lKwCcTkuZfmGIFdizZ8Pg== + dependencies: + hosted-git-info "^5.0.0" + is-core-module "^2.8.1" + semver "^7.3.5" + validate-npm-package-license "^3.0.4" + normalize-path@^3.0.0, normalize-path@~3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz" @@ -8787,10 +8798,17 @@ npm-bundled@^1.1.1: dependencies: npm-normalize-package-bin "^1.0.1" -npm-install-checks@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-4.0.0.tgz" - integrity sha512-09OmyDkNLYwqKPOnbI8exiOZU2GVVmQp7tgez2BPi5OZC8M82elDAps7sxC4l//uSUtotWqoEIDwjRvWH4qz8w== +npm-bundled@^2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/npm-bundled/-/npm-bundled-2.0.1.tgz" + integrity sha512-gZLxXdjEzE/+mOstGDqR6b0EkhJ+kM6fxM6vUuckuctuVPh80Q6pw/rSZj9s4Gex9GxWtIicO1pc8DB9KZWudw== + dependencies: + npm-normalize-package-bin "^2.0.0" + +npm-install-checks@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-5.0.0.tgz" + integrity sha512-65lUsMI8ztHCxFz5ckCEC44DRvEGdZX5usQFriauxHEwt7upv1FKaQEmAtU0YnOAdwuNWCmk64xYiQABNrEyLA== dependencies: semver "^7.1.1" @@ -8799,46 +8817,53 @@ npm-normalize-package-bin@^1.0.1: resolved "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz" integrity sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA== -npm-package-arg@^8.0.1, npm-package-arg@^8.1.2, npm-package-arg@^8.1.5, npm-package-arg@8.1.5: - version "8.1.5" - resolved "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-8.1.5.tgz" - integrity sha512-LhgZrg0n0VgvzVdSm1oiZworPbTxYHUJCgtsJW8mGvlDpxTM1vSJc3m5QZeUkhAHIzbz3VCHd/R4osi1L1Tg/Q== - dependencies: - hosted-git-info "^4.0.1" - semver "^7.3.4" - validate-npm-package-name "^3.0.0" +npm-normalize-package-bin@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-2.0.0.tgz" + integrity sha512-awzfKUO7v0FscrSpRoogyNm0sajikhBWpU0QMrW09AMi9n1PoKU6WaIqUzuJSQnpciZZmJ/jMZ2Egfmb/9LiWQ== -npm-packlist@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/npm-packlist/-/npm-packlist-3.0.0.tgz" - integrity sha512-L/cbzmutAwII5glUcf2DBRNY/d0TFd4e/FnaZigJV6JD85RHZXJFGwCndjMWiiViiWSsWt3tiOLpI3ByTnIdFQ== +npm-package-arg@^9.0.0, npm-package-arg@^9.0.1, npm-package-arg@9.1.0: + version "9.1.0" + resolved "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-9.1.0.tgz" + integrity sha512-4J0GL+u2Nh6OnhvUKXRr2ZMG4lR8qtLp+kv7UiV00Y+nGiSxtttCyIRHCt5L5BNkXQld/RceYItau3MDOoGiBw== dependencies: - glob "^7.1.6" - ignore-walk "^4.0.1" - npm-bundled "^1.1.1" + hosted-git-info "^5.0.0" + proc-log "^2.0.1" + semver "^7.3.5" + validate-npm-package-name "^4.0.0" + +npm-packlist@^5.1.0: + version "5.1.3" + resolved "https://registry.npmjs.org/npm-packlist/-/npm-packlist-5.1.3.tgz" + integrity sha512-263/0NGrn32YFYi4J533qzrQ/krmmrWwhKkzwTuM4f/07ug51odoaNjUexxO4vxlzURHcmYMH1QjvHjsNDKLVg== + dependencies: + glob "^8.0.1" + ignore-walk "^5.0.1" + npm-bundled "^2.0.0" + npm-normalize-package-bin "^2.0.0" + +npm-pick-manifest@^7.0.0, npm-pick-manifest@7.0.1: + version "7.0.1" + resolved "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-7.0.1.tgz" + integrity sha512-IA8+tuv8KujbsbLQvselW2XQgmXWS47t3CB0ZrzsRZ82DbDfkcFunOaPm4X7qNuhMfq+FmV7hQT4iFVpHqV7mg== + dependencies: + npm-install-checks "^5.0.0" npm-normalize-package-bin "^1.0.1" + npm-package-arg "^9.0.0" + semver "^7.3.5" -npm-pick-manifest@^6.0.0, npm-pick-manifest@^6.1.1, npm-pick-manifest@6.1.1: - version "6.1.1" - resolved "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-6.1.1.tgz" - integrity sha512-dBsdBtORT84S8V8UTad1WlUyKIY9iMsAmqxHbLdeEeBNMLQDlDWWra3wYUx9EBEIiG/YwAy0XyNHDd2goAsfuA== +npm-registry-fetch@^13.0.1: + version "13.3.1" + resolved "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-13.3.1.tgz" + integrity sha512-eukJPi++DKRTjSBRcDZSDDsGqRK3ehbxfFUcgaRd0Yp6kRwOwh2WVn0r+8rMB4nnuzvAk6rQVzl6K5CkYOmnvw== dependencies: - npm-install-checks "^4.0.0" - npm-normalize-package-bin "^1.0.1" - npm-package-arg "^8.1.2" - semver "^7.3.4" - -npm-registry-fetch@^12.0.0: - version "12.0.2" - resolved "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-12.0.2.tgz" - integrity sha512-Df5QT3RaJnXYuOwtXBXS9BWs+tHH2olvkCLh6jcR/b/u3DvPMlp3J0TvvYwplPKxHMOwfg287PYih9QqaVFoKA== - dependencies: - make-fetch-happen "^10.0.1" + make-fetch-happen "^10.0.6" minipass "^3.1.6" - minipass-fetch "^1.4.1" + minipass-fetch "^2.0.3" minipass-json-stream "^1.0.1" minizlib "^2.1.2" - npm-package-arg "^8.1.5" + npm-package-arg "^9.0.1" + proc-log "^2.0.0" npm-run-path@^4.0.0, npm-run-path@^4.0.1: version "4.0.1" @@ -9145,30 +9170,32 @@ p-try@^2.0.0: resolved "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz" integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== -pacote@12.0.3: - version "12.0.3" - resolved "https://registry.npmjs.org/pacote/-/pacote-12.0.3.tgz" - integrity sha512-CdYEl03JDrRO3x18uHjBYA9TyoW8gy+ThVcypcDkxPtKlw76e4ejhYB6i9lJ+/cebbjpqPW/CijjqxwDTts8Ow== +pacote@13.6.2: + version "13.6.2" + resolved "https://registry.npmjs.org/pacote/-/pacote-13.6.2.tgz" + integrity sha512-Gu8fU3GsvOPkak2CkbojR7vjs3k3P9cA6uazKTHdsdV0gpCEQq2opelnEv30KRQWgVzP5Vd/5umjcedma3MKtg== dependencies: - "@npmcli/git" "^2.1.0" - "@npmcli/installed-package-contents" "^1.0.6" - "@npmcli/promise-spawn" "^1.2.0" - "@npmcli/run-script" "^2.0.0" - cacache "^15.0.5" + "@npmcli/git" "^3.0.0" + "@npmcli/installed-package-contents" "^1.0.7" + "@npmcli/promise-spawn" "^3.0.0" + "@npmcli/run-script" "^4.1.0" + cacache "^16.0.0" chownr "^2.0.0" fs-minipass "^2.1.0" infer-owner "^1.0.4" - minipass "^3.1.3" - mkdirp "^1.0.3" - npm-package-arg "^8.0.1" - npm-packlist "^3.0.0" - npm-pick-manifest "^6.0.0" - npm-registry-fetch "^12.0.0" + minipass "^3.1.6" + mkdirp "^1.0.4" + npm-package-arg "^9.0.0" + npm-packlist "^5.1.0" + npm-pick-manifest "^7.0.0" + npm-registry-fetch "^13.0.1" + proc-log "^2.0.0" promise-retry "^2.0.1" - read-package-json-fast "^2.0.1" + read-package-json "^5.0.0" + read-package-json-fast "^2.0.3" rimraf "^3.0.2" - ssri "^8.0.1" - tar "^6.1.0" + ssri "^9.0.0" + tar "^6.1.11" pako@^1.0.3: version "1.0.11" @@ -9886,6 +9913,11 @@ pretty-bytes@^5.3.0, pretty-bytes@^5.6.0: resolved "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz" integrity sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg== +proc-log@^2.0.0, proc-log@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/proc-log/-/proc-log-2.0.1.tgz" + integrity sha512-Kcmo2FhfDTXdcbfDH76N7uBYHINxc/8GW7UAVuVP9I+Va3uHSerrnKV6dLooga/gh7GlgzuCCr/eoldnL1muGw== + process-nextick-args@~2.0.0: version "2.0.1" resolved "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz" @@ -10248,7 +10280,7 @@ read-cache@^1.0.0: dependencies: pify "^2.3.0" -read-package-json-fast@^2.0.1: +read-package-json-fast@^2.0.3: version "2.0.3" resolved "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-2.0.3.tgz" integrity sha512-W/BKtbL+dUjTuRL2vziuYhp76s5HZ9qQhd/dKfWIZveD0O40453QNyZhC0e63lqZrAQ4jiOapVoeJ7JrszenQQ== @@ -10256,6 +10288,16 @@ read-package-json-fast@^2.0.1: json-parse-even-better-errors "^2.3.0" npm-normalize-package-bin "^1.0.1" +read-package-json@^5.0.0: + version "5.0.2" + resolved "https://registry.npmjs.org/read-package-json/-/read-package-json-5.0.2.tgz" + integrity sha512-BSzugrt4kQ/Z0krro8zhTwV1Kd79ue25IhNN/VtHFy1mG/6Tluyi+msc0UpwaoQzxSHa28mntAjIZY6kEgfR9Q== + dependencies: + glob "^8.0.1" + json-parse-even-better-errors "^2.3.1" + normalize-package-data "^4.0.0" + npm-normalize-package-bin "^2.0.0" + readable-stream@^2.0.1: version "2.3.8" resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz" @@ -10452,12 +10494,12 @@ resolve@^1.1.7, resolve@^1.14.2, resolve@^1.22.1, resolve@^1.9.0: path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" -resolve@1.22.0: - version "1.22.0" - resolved "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz" - integrity sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw== +resolve@1.22.1: + version "1.22.1" + resolved "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz" + integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw== dependencies: - is-core-module "^2.8.1" + is-core-module "^2.9.0" path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" @@ -11100,15 +11142,6 @@ sockjs@^0.3.21, sockjs@^0.3.24: uuid "^8.3.2" websocket-driver "^0.7.4" -socks-proxy-agent@^6.0.0: - version "6.2.1" - resolved "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-6.2.1.tgz" - integrity sha512-a6KW9G+6B3nWZ1yB8G7pJwL3ggLy1uTzKAgCb7ttblwqdz9fMGJUuTy3uFzEP48FAs9FLILlmzDlE2JJhVQaXQ== - dependencies: - agent-base "^6.0.2" - debug "^4.3.3" - socks "^2.6.2" - socks-proxy-agent@^7.0.0: version "7.0.0" resolved "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz" @@ -11210,12 +11243,20 @@ sourcemap-codec@^1.4.4, sourcemap-codec@^1.4.8: resolved "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz" integrity sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA== +spdx-correct@^3.0.0: + version "3.2.0" + resolved "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz" + integrity sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA== + dependencies: + spdx-expression-parse "^3.0.0" + spdx-license-ids "^3.0.0" + spdx-exceptions@^2.1.0: version "2.3.0" resolved "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz" integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A== -spdx-expression-parse@^3.0.1: +spdx-expression-parse@^3.0.0, spdx-expression-parse@^3.0.1: version "3.0.1" resolved "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz" integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q== @@ -11280,7 +11321,7 @@ sshpk@^1.14.1: safer-buffer "^2.0.2" tweetnacl "~0.14.0" -ssri@^8.0.0, ssri@^8.0.1: +ssri@^8.0.1: version "8.0.1" resolved "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz" integrity sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ== @@ -11539,7 +11580,7 @@ tar-stream@~2.2.0: inherits "^2.0.3" readable-stream "^3.1.1" -tar@^6.0.2, tar@^6.1.0, tar@^6.1.11, tar@^6.1.2: +tar@^6.0.2, tar@^6.1.11, tar@^6.1.2: version "6.1.13" resolved "https://registry.npmjs.org/tar/-/tar-6.1.13.tgz" integrity sha512-jdIBIN6LTIe2jqzay/2vtYLlBHa3JF42ot3h1dW8Q0PaAG4v8rm0cvpVePtau5C6OKXGGcgO9q2AMNSWxiLqKw== @@ -12082,12 +12123,20 @@ valid-data-url@^3.0.0: resolved "https://registry.npmjs.org/valid-data-url/-/valid-data-url-3.0.1.tgz" integrity sha512-jOWVmzVceKlVVdwjNSenT4PbGghU0SBIizAev8ofZVgivk/TVHXSbNL8LP6M3spZvkR9/QolkyJavGSX5Cs0UA== -validate-npm-package-name@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz" - integrity sha512-M6w37eVCMMouJ9V/sdPGnC5H4uDr73/+xdq0FBLO3TFFX1+7wiUY6Es328NN+y43tmY+doUdN9g9J21vqB7iLw== +validate-npm-package-license@^3.0.4: + version "3.0.4" + resolved "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz" + integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== dependencies: - builtins "^1.0.3" + spdx-correct "^3.0.0" + spdx-expression-parse "^3.0.0" + +validate-npm-package-name@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-4.0.0.tgz" + integrity sha512-mzR0L8ZDktZjpX4OB46KT+56MAhl4EIazWP/+G/HPGuvfdaqg4YsCdtOm6U9+LOFyYDoh4dpnpxZRB9MQQns5Q== + dependencies: + builtins "^5.0.0" vary@^1, vary@~1.1.2: version "1.1.2" @@ -12671,7 +12720,7 @@ yargs-parser@^20.2.2: resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz" integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== -yargs-parser@^21.1.1, yargs-parser@21.1.1: +yargs-parser@^21.0.0, yargs-parser@^21.1.1, yargs-parser@21.1.1: version "21.1.1" resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz" integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== @@ -12720,6 +12769,19 @@ yargs@17.1.1: y18n "^5.0.5" yargs-parser "^20.2.2" +yargs@17.5.1: + version "17.5.1" + resolved "https://registry.npmjs.org/yargs/-/yargs-17.5.1.tgz" + integrity sha512-t6YAJcxDkNX7NFYiVtKvWUz8l+PaKTLiL63mJYWR2GnHq2gjEWISzsLp9wg3aY36dY1j+gfIEL3pIF+XlJJfbA== + dependencies: + cliui "^7.0.2" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.3" + y18n "^5.0.5" + yargs-parser "^21.0.0" + yauzl@^2.10.0: version "2.10.0" resolved "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz" From 59681ea54d8b4a0d89df2b85da988555e2f56899 Mon Sep 17 00:00:00 2001 From: Kristof De Langhe Date: Tue, 11 Apr 2023 17:05:23 +0200 Subject: [PATCH 073/409] 101108: Automatic ng update @angular-devkit/build-angular@14 --- package.json | 2 +- yarn.lock | 1140 ++++++-------------------------------------------- 2 files changed, 139 insertions(+), 1003 deletions(-) diff --git a/package.json b/package.json index bc54a4057f..3f3eff4dfc 100644 --- a/package.json +++ b/package.json @@ -134,7 +134,7 @@ "zone.js": "~0.11.5" }, "devDependencies": { - "@angular-builders/custom-webpack": "~13.1.0", + "@angular-builders/custom-webpack": "~14.1.0", "@angular-devkit/build-angular": "^14.2.11", "@angular-eslint/builder": "13.1.0", "@angular-eslint/eslint-plugin": "13.1.0", diff --git a/yarn.lock b/yarn.lock index 84429ae63f..dce0951924 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7,14 +7,6 @@ resolved "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.2.0.tgz" integrity sha512-E09FiIft46CmH5Qnjb0wsW54/YQd69LsxeKUOWawmws1XWvyFGURnAChH0mlr7YPFR1ofwvUQfcL0J3lMxXqPA== -"@ampproject/remapping@^2.0.0", "@ampproject/remapping@2.2.0": - version "2.2.0" - resolved "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz" - integrity sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w== - dependencies: - "@jridgewell/gen-mapping" "^0.1.0" - "@jridgewell/trace-mapping" "^0.3.9" - "@ampproject/remapping@^2.1.0": version "2.2.1" resolved "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz" @@ -23,14 +15,22 @@ "@jridgewell/gen-mapping" "^0.3.0" "@jridgewell/trace-mapping" "^0.3.9" -"@angular-builders/custom-webpack@~13.1.0": - version "13.1.0" - resolved "https://registry.npmjs.org/@angular-builders/custom-webpack/-/custom-webpack-13.1.0.tgz" - integrity sha512-qhtnAv1i7agk14zeKZZfXjrckYt37OZ+3tsTBLhf3ZFbwREK8L1SNi8xhZ1j1JLGsf2Dp0GEcZrSYeFDweo0WA== +"@ampproject/remapping@2.2.0": + version "2.2.0" + resolved "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz" + integrity sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w== dependencies: - "@angular-devkit/architect" ">=0.1300.0 < 0.1400.0" - "@angular-devkit/build-angular" "^13.0.0" - "@angular-devkit/core" "^13.0.0" + "@jridgewell/gen-mapping" "^0.1.0" + "@jridgewell/trace-mapping" "^0.3.9" + +"@angular-builders/custom-webpack@~14.1.0": + version "14.1.0" + resolved "https://registry.npmjs.org/@angular-builders/custom-webpack/-/custom-webpack-14.1.0.tgz" + integrity sha512-FLGDrBOg04cYvzCudeb15LWY2v91dtJ5+AfmP0aS/0T0D0AYmY4uM3FxZeh4jJcWETLvnHVFBCjan6y2Ct9J3A== + dependencies: + "@angular-devkit/architect" ">=0.1400.0 < 0.1500.0" + "@angular-devkit/build-angular" "^14.0.0" + "@angular-devkit/core" "^14.0.0" lodash "^4.17.15" ts-node "^10.0.0" tsconfig-paths "^3.9.0" @@ -44,7 +44,7 @@ "@angular-devkit/core" "12.2.18" rxjs "6.6.7" -"@angular-devkit/architect@^0.1402.0": +"@angular-devkit/architect@^0.1402.0", "@angular-devkit/architect@>=0.1400.0 < 0.1500.0", "@angular-devkit/architect@0.1402.11": version "0.1402.11" resolved "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1402.11.tgz" integrity sha512-RuSZrBQ+QbipAESZ4aXCyAMQHaEaDyyV/FDS9J2HJWfEFbRD5oxlEt/tBC8XjmJQsktaUOh07GT8MNJjPKVAQw== @@ -52,95 +52,7 @@ "@angular-devkit/core" "14.2.11" rxjs "6.6.7" -"@angular-devkit/architect@>=0.1300.0 < 0.1400.0", "@angular-devkit/architect@0.1303.11": - version "0.1303.11" - resolved "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1303.11.tgz" - integrity sha512-JwrWomNqNGjAeKlqV2pimUFlCgFxQy+Vioz9+QAPIrUkvvjbkQ1dZKOe8Ul8eosb1N3Ln282U6qzOpHKfJ4TOg== - dependencies: - "@angular-devkit/core" "13.3.11" - rxjs "6.6.7" - -"@angular-devkit/architect@0.1402.11": - version "0.1402.11" - resolved "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1402.11.tgz" - integrity sha512-RuSZrBQ+QbipAESZ4aXCyAMQHaEaDyyV/FDS9J2HJWfEFbRD5oxlEt/tBC8XjmJQsktaUOh07GT8MNJjPKVAQw== - dependencies: - "@angular-devkit/core" "14.2.11" - rxjs "6.6.7" - -"@angular-devkit/build-angular@^13.0.0": - version "13.3.11" - resolved "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-13.3.11.tgz" - integrity sha512-H4tpdmRu+6HSjsL+swV/8qj8v0YSDq6lpb31EYajlBB6fDj+YJQvHgaWvexSWl6eIqgDKXcujhNUjNi1enjwHw== - dependencies: - "@ampproject/remapping" "2.2.0" - "@angular-devkit/architect" "0.1303.11" - "@angular-devkit/build-webpack" "0.1303.11" - "@angular-devkit/core" "13.3.11" - "@babel/core" "7.16.12" - "@babel/generator" "7.16.8" - "@babel/helper-annotate-as-pure" "7.16.7" - "@babel/plugin-proposal-async-generator-functions" "7.16.8" - "@babel/plugin-transform-async-to-generator" "7.16.8" - "@babel/plugin-transform-runtime" "7.16.10" - "@babel/preset-env" "7.16.11" - "@babel/runtime" "7.16.7" - "@babel/template" "7.16.7" - "@discoveryjs/json-ext" "0.5.6" - "@ngtools/webpack" "13.3.11" - ansi-colors "4.1.1" - babel-loader "8.2.5" - babel-plugin-istanbul "6.1.1" - browserslist "^4.9.1" - cacache "15.3.0" - circular-dependency-plugin "5.2.2" - copy-webpack-plugin "10.2.1" - core-js "3.20.3" - critters "0.0.16" - css-loader "6.5.1" - esbuild-wasm "0.14.22" - glob "7.2.0" - https-proxy-agent "5.0.0" - inquirer "8.2.0" - jsonc-parser "3.0.0" - karma-source-map-support "1.4.0" - less "4.1.2" - less-loader "10.2.0" - license-webpack-plugin "4.0.2" - loader-utils "3.2.1" - mini-css-extract-plugin "2.5.3" - minimatch "3.0.5" - open "8.4.0" - ora "5.4.1" - parse5-html-rewriting-stream "6.0.1" - piscina "3.2.0" - postcss "8.4.5" - postcss-import "14.0.2" - postcss-loader "6.2.1" - postcss-preset-env "7.2.3" - regenerator-runtime "0.13.9" - resolve-url-loader "5.0.0" - rxjs "6.6.7" - sass "1.49.9" - sass-loader "12.4.0" - semver "7.3.5" - source-map-loader "3.0.1" - source-map-support "0.5.21" - stylus "0.56.0" - stylus-loader "6.2.0" - terser "5.14.2" - text-table "0.2.0" - tree-kill "1.2.2" - tslib "2.3.1" - webpack "5.76.1" - webpack-dev-middleware "5.3.0" - webpack-dev-server "4.7.3" - webpack-merge "5.8.0" - webpack-subresource-integrity "5.1.0" - optionalDependencies: - esbuild "0.14.22" - -"@angular-devkit/build-angular@^14.2.0", "@angular-devkit/build-angular@^14.2.11": +"@angular-devkit/build-angular@^14.0.0", "@angular-devkit/build-angular@^14.2.0", "@angular-devkit/build-angular@^14.2.11": version "14.2.11" resolved "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-14.2.11.tgz" integrity sha512-O3X7GXcCBCGceVSHT+GIJ2JrRCg2YcO7HtNavpmPrraNr1o+aCdTkmT5WTS2cqWkZBm/z0wqKR8PsX/ZoD2r1A== @@ -210,14 +122,6 @@ optionalDependencies: esbuild "0.15.5" -"@angular-devkit/build-webpack@0.1303.11": - version "0.1303.11" - resolved "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1303.11.tgz" - integrity sha512-599pWAQLq7i/fmEZLb7PaNU6nmPC3EZbJk1nU/UBcpx7FWs9e0o2XQE2PCAs0buqtQxVjSgY6kMO8ex5dUmgUQ== - dependencies: - "@angular-devkit/architect" "0.1303.11" - rxjs "6.6.7" - "@angular-devkit/build-webpack@0.1402.11": version "0.1402.11" resolved "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1402.11.tgz" @@ -238,19 +142,7 @@ rxjs "6.6.7" source-map "0.7.3" -"@angular-devkit/core@^13.0.0", "@angular-devkit/core@13.3.11": - version "13.3.11" - resolved "https://registry.npmjs.org/@angular-devkit/core/-/core-13.3.11.tgz" - integrity sha512-rfqoLMRYhlz0wzKlHx7FfyIyQq8dKTsmbCoIVU1cEIH0gyTMVY7PbVzwRRcO6xp5waY+0hA+0Brriujpuhkm4w== - dependencies: - ajv "8.9.0" - ajv-formats "2.1.1" - fast-json-stable-stringify "2.1.0" - magic-string "0.25.7" - rxjs "6.6.7" - source-map "0.7.3" - -"@angular-devkit/core@^14.2.0", "@angular-devkit/core@14.2.11": +"@angular-devkit/core@^14.0.0", "@angular-devkit/core@^14.2.0", "@angular-devkit/core@14.2.11": version "14.2.11" resolved "https://registry.npmjs.org/@angular-devkit/core/-/core-14.2.11.tgz" integrity sha512-cBIGs6y9rykOQqnuAQOB1DgIRyBFYtvKRJb7QNUfIJ0qUfARKkuV/yikv3lrb95ePGkmoRzmjkFqcFZiYU+r7A== @@ -387,22 +279,6 @@ dependencies: tslib "^2.3.0" -"@angular/compiler-cli@^13.0.0 || ^13.3.0-rc.0", "@angular/compiler-cli@13.4.0": - version "13.4.0" - resolved "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-13.4.0.tgz" - integrity sha512-OQD0w9aZXbpcyWDEaozoHH/n3eYDLhBsmJcIBVqUN8Awx8m17v2u2R6m7DIEpVRbBzYtTscAMTKONNVwsTolHA== - dependencies: - "@babel/core" "^7.17.2" - chokidar "^3.0.0" - convert-source-map "^1.5.1" - dependency-graph "^0.11.0" - magic-string "^0.26.0" - reflect-metadata "^0.1.2" - semver "^7.0.0" - sourcemap-codec "^1.4.8" - tslib "^2.3.0" - yargs "^17.2.1" - "@angular/compiler-cli@^13.0.0", "@angular/compiler-cli@^14.0.0", "@angular/compiler-cli@^14.3.0", "@angular/compiler-cli@14.3.0": version "14.3.0" resolved "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-14.3.0.tgz" @@ -426,13 +302,6 @@ dependencies: tslib "^2.3.0" -"@angular/compiler@13.4.0": - version "13.4.0" - resolved "https://registry.npmjs.org/@angular/compiler/-/compiler-13.4.0.tgz" - integrity sha512-tPWoq2RC/VIrJtynEnMRWQZemBIC/ypuVfuUf3p8IIXCZHjuGnibdlZTtFYkexc4/sR1ug9xk1cJWvbOPwilng== - dependencies: - tslib "^2.3.0" - "@angular/core@*", "@angular/core@^11.0.0", "@angular/core@^13.0.0", "@angular/core@^13.0.0 || ^14.0.0-0", "@angular/core@^13.3.4", "@angular/core@^14.2.0", "@angular/core@^14.3.0", "@angular/core@>=10.0.0", "@angular/core@>=12", "@angular/core@>=13.0.0 <14", "@angular/core@>=13.0.0-0", "@angular/core@>=2.x", "@angular/core@>=5.0.0", "@angular/core@>=5.0.0 <14.0.0", "@angular/core@14.3.0", "@angular/core@5.0.0-alpha - 5 || 6.0.0-alpha - 6 || 7.0.0-alpha - 7 || 8.0.0-alpha - 8 || 9.0.0-alpha - 9 || 10.0.0-alpha - 10 || 11.0.0-alpha - 11 || 12.0.0-alpha - 12 || 13.0.0-alpha - 13 || 14.0.0-alpha - 14": version "14.3.0" resolved "https://registry.npmjs.org/@angular/core/-/core-14.3.0.tgz" @@ -452,15 +321,6 @@ resolved "https://registry.npmjs.org/@angular/language-service/-/language-service-14.3.0.tgz" integrity sha512-Sij3OQzj1UGs1O8H9PxVAY/o27+oqZwQRnib66rsWvtbIBTjHp4FV3dTs5iVcr62GGv4V4Mff/2I82NP10GPQg== -"@angular/localize@^13.0.0 || ^13.3.0-rc.0": - version "13.4.0" - resolved "https://registry.npmjs.org/@angular/localize/-/localize-13.4.0.tgz" - integrity sha512-du98xPMGNexwqc1Tbg1lR3tihUlW9IBn7OaTDVdzhFuIUkt30mLK4ri2LSpLZrwT5q3nLHi0e7O3ublY7ubGzQ== - dependencies: - "@babel/core" "7.17.2" - glob "7.2.0" - yargs "^17.2.1" - "@angular/localize@^13.0.0", "@angular/localize@^14.0.0", "@angular/localize@14.3.0": version "14.3.0" resolved "https://registry.npmjs.org/@angular/localize/-/localize-14.3.0.tgz" @@ -505,14 +365,14 @@ resolved "https://registry.npmjs.org/@assemblyscript/loader/-/loader-0.10.1.tgz" integrity sha512-H71nDOOL8Y7kWRLqf6Sums+01Q5msqBW2KhDUTemh1tvY04eSkSXrK0uj/4mmY0Xr16/3zyZmsrxN7CKuRbNRg== -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.16.7", "@babel/code-frame@^7.18.6", "@babel/code-frame@^7.21.4": +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.18.6", "@babel/code-frame@^7.21.4": version "7.21.4" resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.21.4.tgz" integrity sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g== dependencies: "@babel/highlight" "^7.18.6" -"@babel/compat-data@^7.16.8", "@babel/compat-data@^7.17.7", "@babel/compat-data@^7.18.8", "@babel/compat-data@^7.20.5", "@babel/compat-data@^7.21.4": +"@babel/compat-data@^7.17.7", "@babel/compat-data@^7.18.8", "@babel/compat-data@^7.20.5", "@babel/compat-data@^7.21.4": version "7.21.4" resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.21.4.tgz" integrity sha512-/DYyDpeCfaVinT40FPGdkkb+lYSKvsVuMjDAG7jPOWWiM1ibOaB9CXJAlc4d1QpP/U2q2P9jbrSlClKSErd55g== @@ -538,48 +398,6 @@ json5 "^2.2.1" semver "^6.3.0" -"@babel/core@7.16.12": - version "7.16.12" - resolved "https://registry.npmjs.org/@babel/core/-/core-7.16.12.tgz" - integrity sha512-dK5PtG1uiN2ikk++5OzSYsitZKny4wOCD0nrO4TqnW4BVBTQ2NGS3NgilvT/TEyxTST7LNyWV/T4tXDoD3fOgg== - dependencies: - "@babel/code-frame" "^7.16.7" - "@babel/generator" "^7.16.8" - "@babel/helper-compilation-targets" "^7.16.7" - "@babel/helper-module-transforms" "^7.16.7" - "@babel/helpers" "^7.16.7" - "@babel/parser" "^7.16.12" - "@babel/template" "^7.16.7" - "@babel/traverse" "^7.16.10" - "@babel/types" "^7.16.8" - convert-source-map "^1.7.0" - debug "^4.1.0" - gensync "^1.0.0-beta.2" - json5 "^2.1.2" - semver "^6.3.0" - source-map "^0.5.0" - -"@babel/core@7.17.2": - version "7.17.2" - resolved "https://registry.npmjs.org/@babel/core/-/core-7.17.2.tgz" - integrity sha512-R3VH5G42VSDolRHyUO4V2cfag8WHcZyxdq5Z/m8Xyb92lW/Erm/6kM+XtRFGf3Mulre3mveni2NHfEUws8wSvw== - dependencies: - "@ampproject/remapping" "^2.0.0" - "@babel/code-frame" "^7.16.7" - "@babel/generator" "^7.17.0" - "@babel/helper-compilation-targets" "^7.16.7" - "@babel/helper-module-transforms" "^7.16.7" - "@babel/helpers" "^7.17.2" - "@babel/parser" "^7.17.0" - "@babel/template" "^7.16.7" - "@babel/traverse" "^7.17.0" - "@babel/types" "^7.17.0" - convert-source-map "^1.7.0" - debug "^4.1.0" - gensync "^1.0.0-beta.2" - json5 "^2.1.2" - semver "^6.3.0" - "@babel/core@7.18.10": version "7.18.10" resolved "https://registry.npmjs.org/@babel/core/-/core-7.18.10.tgz" @@ -601,25 +419,6 @@ json5 "^2.2.1" semver "^6.3.0" -"@babel/generator@^7.16.8", "@babel/generator@7.16.8": - version "7.16.8" - resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.16.8.tgz" - integrity sha512-1ojZwE9+lOXzcWdWmO6TbUzDfqLD39CmEhN8+2cX9XkDo5yW1OpgfejfliysR2AWLpMamTiOiAp/mtroaymhpw== - dependencies: - "@babel/types" "^7.16.8" - jsesc "^2.5.1" - source-map "^0.5.0" - -"@babel/generator@^7.17.0": - version "7.21.4" - resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.21.4.tgz" - integrity sha512-NieM3pVIYW2SwGzKoqfPrQsf4xGs9M9AIG3ThppsSRmO+m7eQhmI6amajKMUeIO37wFfsvnvcxQFx6x6iqxDnA== - dependencies: - "@babel/types" "^7.21.4" - "@jridgewell/gen-mapping" "^0.3.2" - "@jridgewell/trace-mapping" "^0.3.17" - jsesc "^2.5.1" - "@babel/generator@^7.18.10", "@babel/generator@7.18.12": version "7.18.12" resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.18.12.tgz" @@ -646,13 +445,6 @@ dependencies: "@babel/types" "^7.18.6" -"@babel/helper-annotate-as-pure@7.16.7": - version "7.16.7" - resolved "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.7.tgz" - integrity sha512-s6t2w/IPQVTAET1HitoowRGXooX8mCgtuP5195wD/QJPV6wYjpujCGF7JuMODVX2ZAJOf1GT6DT9MHEZvLOFSw== - dependencies: - "@babel/types" "^7.16.7" - "@babel/helper-builder-binary-assignment-operator-visitor@^7.18.6": version "7.18.9" resolved "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.18.9.tgz" @@ -661,7 +453,7 @@ "@babel/helper-explode-assignable-expression" "^7.18.6" "@babel/types" "^7.18.9" -"@babel/helper-compilation-targets@^7.16.7", "@babel/helper-compilation-targets@^7.17.7", "@babel/helper-compilation-targets@^7.18.9", "@babel/helper-compilation-targets@^7.20.7": +"@babel/helper-compilation-targets@^7.17.7", "@babel/helper-compilation-targets@^7.18.9", "@babel/helper-compilation-targets@^7.20.7": version "7.21.4" resolved "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.21.4.tgz" integrity sha512-Fa0tTuOXZ1iL8IeDFUWCzjZcn+sJGd9RZdH9esYVjEejGmzf+FFYQpMi/kZUk2kPy/q1H3/GPw7np8qar/stfg== @@ -694,7 +486,7 @@ "@babel/helper-annotate-as-pure" "^7.18.6" regexpu-core "^5.3.1" -"@babel/helper-define-polyfill-provider@^0.3.1", "@babel/helper-define-polyfill-provider@^0.3.2", "@babel/helper-define-polyfill-provider@^0.3.3": +"@babel/helper-define-polyfill-provider@^0.3.2", "@babel/helper-define-polyfill-provider@^0.3.3": version "0.3.3" resolved "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.3.tgz" integrity sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww== @@ -740,14 +532,14 @@ dependencies: "@babel/types" "^7.21.0" -"@babel/helper-module-imports@^7.16.7", "@babel/helper-module-imports@^7.18.6": +"@babel/helper-module-imports@^7.18.6": version "7.21.4" resolved "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.21.4.tgz" integrity sha512-orajc5T2PsRYUN3ZryCEFeMDYwyw09c/pZeaQEZPH0MpKzSvn3e0uXsDBu3k03VI+9DBiRo+l22BfKTpKwa/Wg== dependencies: "@babel/types" "^7.21.4" -"@babel/helper-module-transforms@^7.16.7", "@babel/helper-module-transforms@^7.18.6", "@babel/helper-module-transforms@^7.18.9", "@babel/helper-module-transforms@^7.20.11", "@babel/helper-module-transforms@^7.21.2": +"@babel/helper-module-transforms@^7.18.6", "@babel/helper-module-transforms@^7.18.9", "@babel/helper-module-transforms@^7.20.11", "@babel/helper-module-transforms@^7.21.2": version "7.21.2" resolved "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.21.2.tgz" integrity sha512-79yj2AR4U/Oqq/WOV7Lx6hUjau1Zfo4cI+JLAVYeMV5XIlbOhmjEk5ulbTc9fMpmlojzZHkUUxAiK+UKn+hNQQ== @@ -773,7 +565,7 @@ resolved "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz" integrity sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ== -"@babel/helper-remap-async-to-generator@^7.16.8", "@babel/helper-remap-async-to-generator@^7.18.6", "@babel/helper-remap-async-to-generator@^7.18.9": +"@babel/helper-remap-async-to-generator@^7.18.6", "@babel/helper-remap-async-to-generator@^7.18.9": version "7.18.9" resolved "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.9.tgz" integrity sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA== @@ -826,7 +618,7 @@ resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz" integrity sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w== -"@babel/helper-validator-option@^7.16.7", "@babel/helper-validator-option@^7.18.6", "@babel/helper-validator-option@^7.21.0": +"@babel/helper-validator-option@^7.18.6", "@babel/helper-validator-option@^7.21.0": version "7.21.0" resolved "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.21.0.tgz" integrity sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ== @@ -841,7 +633,7 @@ "@babel/traverse" "^7.20.5" "@babel/types" "^7.20.5" -"@babel/helpers@^7.16.7", "@babel/helpers@^7.17.2", "@babel/helpers@^7.18.9": +"@babel/helpers@^7.18.9": version "7.21.0" resolved "https://registry.npmjs.org/@babel/helpers/-/helpers-7.21.0.tgz" integrity sha512-XXve0CBtOW0pd7MRzzmoyuSj0e3SEzj8pgyFxnTT1NJZL38BD1MK7yYrm8yefRPIDvNNe14xR4FdbHwpInD4rA== @@ -859,19 +651,19 @@ chalk "^2.0.0" js-tokens "^4.0.0" -"@babel/parser@^7.10.3", "@babel/parser@^7.14.7", "@babel/parser@^7.16.12", "@babel/parser@^7.16.7", "@babel/parser@^7.17.0", "@babel/parser@^7.18.10", "@babel/parser@^7.18.9", "@babel/parser@^7.20.7", "@babel/parser@^7.21.4": +"@babel/parser@^7.10.3", "@babel/parser@^7.14.7", "@babel/parser@^7.18.10", "@babel/parser@^7.18.9", "@babel/parser@^7.20.7", "@babel/parser@^7.21.4": version "7.21.4" resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.21.4.tgz" integrity sha512-alVJj7k7zIxqBZ7BTRhz0IqJFxW1VJbm6N8JbcYhQ186df9ZBPbZBmWSqAMXwHGsCJdYks7z/voa3ibiS5bCIw== -"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.16.7", "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.18.6": +"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.18.6": version "7.18.6" resolved "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.18.6.tgz" integrity sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ== dependencies: "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.16.7", "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.18.9": +"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.18.9": version "7.20.7" resolved "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.20.7.tgz" integrity sha512-sbr9+wNE5aXMBBFBICk01tt7sBf2Oc9ikRFEcem/ZORup9IMUdNhW7/wVLEbbtlWOsEubJet46mHAL2C8+2jKQ== @@ -880,15 +672,6 @@ "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" "@babel/plugin-proposal-optional-chaining" "^7.20.7" -"@babel/plugin-proposal-async-generator-functions@^7.16.8", "@babel/plugin-proposal-async-generator-functions@7.16.8": - version "7.16.8" - resolved "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.16.8.tgz" - integrity sha512-71YHIvMuiuqWJQkebWJtdhQTfd4Q4mF76q2IX37uZPkG9+olBxsX+rH1vkhFto4UeJZ9dPY2s+mDvhDm1u2BGQ== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/helper-remap-async-to-generator" "^7.16.8" - "@babel/plugin-syntax-async-generators" "^7.8.4" - "@babel/plugin-proposal-async-generator-functions@^7.18.10", "@babel/plugin-proposal-async-generator-functions@7.18.10": version "7.18.10" resolved "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.18.10.tgz" @@ -899,7 +682,7 @@ "@babel/helper-remap-async-to-generator" "^7.18.9" "@babel/plugin-syntax-async-generators" "^7.8.4" -"@babel/plugin-proposal-class-properties@^7.16.7", "@babel/plugin-proposal-class-properties@^7.18.6": +"@babel/plugin-proposal-class-properties@^7.18.6": version "7.18.6" resolved "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz" integrity sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ== @@ -907,7 +690,7 @@ "@babel/helper-create-class-features-plugin" "^7.18.6" "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-proposal-class-static-block@^7.16.7", "@babel/plugin-proposal-class-static-block@^7.18.6": +"@babel/plugin-proposal-class-static-block@^7.18.6": version "7.21.0" resolved "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.21.0.tgz" integrity sha512-XP5G9MWNUskFuP30IfFSEFB0Z6HzLIUcjYM4bYOPHXl7eiJ9HFv8tWj6TXTN5QODiEhDZAeI4hLok2iHFFV4hw== @@ -916,7 +699,7 @@ "@babel/helper-plugin-utils" "^7.20.2" "@babel/plugin-syntax-class-static-block" "^7.14.5" -"@babel/plugin-proposal-dynamic-import@^7.16.7", "@babel/plugin-proposal-dynamic-import@^7.18.6": +"@babel/plugin-proposal-dynamic-import@^7.18.6": version "7.18.6" resolved "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.18.6.tgz" integrity sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw== @@ -924,7 +707,7 @@ "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-syntax-dynamic-import" "^7.8.3" -"@babel/plugin-proposal-export-namespace-from@^7.16.7", "@babel/plugin-proposal-export-namespace-from@^7.18.9": +"@babel/plugin-proposal-export-namespace-from@^7.18.9": version "7.18.9" resolved "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.9.tgz" integrity sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA== @@ -932,7 +715,7 @@ "@babel/helper-plugin-utils" "^7.18.9" "@babel/plugin-syntax-export-namespace-from" "^7.8.3" -"@babel/plugin-proposal-json-strings@^7.16.7", "@babel/plugin-proposal-json-strings@^7.18.6": +"@babel/plugin-proposal-json-strings@^7.18.6": version "7.18.6" resolved "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.18.6.tgz" integrity sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ== @@ -940,7 +723,7 @@ "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-syntax-json-strings" "^7.8.3" -"@babel/plugin-proposal-logical-assignment-operators@^7.16.7", "@babel/plugin-proposal-logical-assignment-operators@^7.18.9": +"@babel/plugin-proposal-logical-assignment-operators@^7.18.9": version "7.20.7" resolved "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.20.7.tgz" integrity sha512-y7C7cZgpMIjWlKE5T7eJwp+tnRYM89HmRvWM5EQuB5BoHEONjmQ8lSNmBUwOyy/GFRsohJED51YBF79hE1djug== @@ -948,7 +731,7 @@ "@babel/helper-plugin-utils" "^7.20.2" "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" -"@babel/plugin-proposal-nullish-coalescing-operator@^7.16.7", "@babel/plugin-proposal-nullish-coalescing-operator@^7.18.6": +"@babel/plugin-proposal-nullish-coalescing-operator@^7.18.6": version "7.18.6" resolved "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz" integrity sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA== @@ -956,7 +739,7 @@ "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" -"@babel/plugin-proposal-numeric-separator@^7.16.7", "@babel/plugin-proposal-numeric-separator@^7.18.6": +"@babel/plugin-proposal-numeric-separator@^7.18.6": version "7.18.6" resolved "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz" integrity sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q== @@ -964,7 +747,7 @@ "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-syntax-numeric-separator" "^7.10.4" -"@babel/plugin-proposal-object-rest-spread@^7.16.7", "@babel/plugin-proposal-object-rest-spread@^7.18.9": +"@babel/plugin-proposal-object-rest-spread@^7.18.9": version "7.20.7" resolved "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz" integrity sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg== @@ -975,7 +758,7 @@ "@babel/plugin-syntax-object-rest-spread" "^7.8.3" "@babel/plugin-transform-parameters" "^7.20.7" -"@babel/plugin-proposal-optional-catch-binding@^7.16.7", "@babel/plugin-proposal-optional-catch-binding@^7.18.6": +"@babel/plugin-proposal-optional-catch-binding@^7.18.6": version "7.18.6" resolved "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz" integrity sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw== @@ -983,7 +766,7 @@ "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" -"@babel/plugin-proposal-optional-chaining@^7.16.7", "@babel/plugin-proposal-optional-chaining@^7.18.9", "@babel/plugin-proposal-optional-chaining@^7.20.7": +"@babel/plugin-proposal-optional-chaining@^7.18.9", "@babel/plugin-proposal-optional-chaining@^7.20.7": version "7.21.0" resolved "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.21.0.tgz" integrity sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA== @@ -992,7 +775,7 @@ "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" "@babel/plugin-syntax-optional-chaining" "^7.8.3" -"@babel/plugin-proposal-private-methods@^7.16.11", "@babel/plugin-proposal-private-methods@^7.18.6": +"@babel/plugin-proposal-private-methods@^7.18.6": version "7.18.6" resolved "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz" integrity sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA== @@ -1000,7 +783,7 @@ "@babel/helper-create-class-features-plugin" "^7.18.6" "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-proposal-private-property-in-object@^7.16.7", "@babel/plugin-proposal-private-property-in-object@^7.18.6": +"@babel/plugin-proposal-private-property-in-object@^7.18.6": version "7.21.0" resolved "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0.tgz" integrity sha512-ha4zfehbJjc5MmXBlHec1igel5TJXXLDDRbuJ4+XT2TJcyD9/V1919BA8gMvsdHcNMBy4WBUBiRb3nw/EQUtBw== @@ -1010,7 +793,7 @@ "@babel/helper-plugin-utils" "^7.20.2" "@babel/plugin-syntax-private-property-in-object" "^7.14.5" -"@babel/plugin-proposal-unicode-property-regex@^7.16.7", "@babel/plugin-proposal-unicode-property-regex@^7.18.6", "@babel/plugin-proposal-unicode-property-regex@^7.4.4": +"@babel/plugin-proposal-unicode-property-regex@^7.18.6", "@babel/plugin-proposal-unicode-property-regex@^7.4.4": version "7.18.6" resolved "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz" integrity sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w== @@ -1123,22 +906,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-arrow-functions@^7.16.7", "@babel/plugin-transform-arrow-functions@^7.18.6": +"@babel/plugin-transform-arrow-functions@^7.18.6": version "7.20.7" resolved "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.20.7.tgz" integrity sha512-3poA5E7dzDomxj9WXWwuD6A5F3kc7VXwIJO+E+J8qtDtS+pXPAhrgEyh+9GBwBgPq1Z+bB+/JD60lp5jsN7JPQ== dependencies: "@babel/helper-plugin-utils" "^7.20.2" -"@babel/plugin-transform-async-to-generator@^7.16.8", "@babel/plugin-transform-async-to-generator@7.16.8": - version "7.16.8" - resolved "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.16.8.tgz" - integrity sha512-MtmUmTJQHCnyJVrScNzNlofQJ3dLFuobYn3mwOTKHnSCMtbNsqvF71GQmJfFjdrXSsAA7iysFmYWw4bXZ20hOg== - dependencies: - "@babel/helper-module-imports" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/helper-remap-async-to-generator" "^7.16.8" - "@babel/plugin-transform-async-to-generator@^7.18.6", "@babel/plugin-transform-async-to-generator@7.18.6": version "7.18.6" resolved "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.18.6.tgz" @@ -1148,21 +922,21 @@ "@babel/helper-plugin-utils" "^7.18.6" "@babel/helper-remap-async-to-generator" "^7.18.6" -"@babel/plugin-transform-block-scoped-functions@^7.16.7", "@babel/plugin-transform-block-scoped-functions@^7.18.6": +"@babel/plugin-transform-block-scoped-functions@^7.18.6": version "7.18.6" resolved "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.18.6.tgz" integrity sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ== dependencies: "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-block-scoping@^7.16.7", "@babel/plugin-transform-block-scoping@^7.18.9": +"@babel/plugin-transform-block-scoping@^7.18.9": version "7.21.0" resolved "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.21.0.tgz" integrity sha512-Mdrbunoh9SxwFZapeHVrwFmri16+oYotcZysSzhNIVDwIAb1UV+kvnxULSYq9J3/q5MDG+4X6w8QVgD1zhBXNQ== dependencies: "@babel/helper-plugin-utils" "^7.20.2" -"@babel/plugin-transform-classes@^7.16.7", "@babel/plugin-transform-classes@^7.18.9": +"@babel/plugin-transform-classes@^7.18.9": version "7.21.0" resolved "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.21.0.tgz" integrity sha512-RZhbYTCEUAe6ntPehC4hlslPWosNHDox+vAs4On/mCLRLfoDVHf6hVEd7kuxr1RnHwJmxFfUM3cZiZRmPxJPXQ== @@ -1177,7 +951,7 @@ "@babel/helper-split-export-declaration" "^7.18.6" globals "^11.1.0" -"@babel/plugin-transform-computed-properties@^7.16.7", "@babel/plugin-transform-computed-properties@^7.18.9": +"@babel/plugin-transform-computed-properties@^7.18.9": version "7.20.7" resolved "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.20.7.tgz" integrity sha512-Lz7MvBK6DTjElHAmfu6bfANzKcxpyNPeYBGEafyA6E5HtRpjpZwU+u7Qrgz/2OR0z+5TvKYbPdphfSaAcZBrYQ== @@ -1185,14 +959,14 @@ "@babel/helper-plugin-utils" "^7.20.2" "@babel/template" "^7.20.7" -"@babel/plugin-transform-destructuring@^7.16.7", "@babel/plugin-transform-destructuring@^7.18.9": +"@babel/plugin-transform-destructuring@^7.18.9": version "7.21.3" resolved "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.21.3.tgz" integrity sha512-bp6hwMFzuiE4HqYEyoGJ/V2LeIWn+hLVKc4pnj++E5XQptwhtcGmSayM029d/j2X1bPKGTlsyPwAubuU22KhMA== dependencies: "@babel/helper-plugin-utils" "^7.20.2" -"@babel/plugin-transform-dotall-regex@^7.16.7", "@babel/plugin-transform-dotall-regex@^7.18.6", "@babel/plugin-transform-dotall-regex@^7.4.4": +"@babel/plugin-transform-dotall-regex@^7.18.6", "@babel/plugin-transform-dotall-regex@^7.4.4": version "7.18.6" resolved "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.18.6.tgz" integrity sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg== @@ -1200,14 +974,14 @@ "@babel/helper-create-regexp-features-plugin" "^7.18.6" "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-duplicate-keys@^7.16.7", "@babel/plugin-transform-duplicate-keys@^7.18.9": +"@babel/plugin-transform-duplicate-keys@^7.18.9": version "7.18.9" resolved "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.9.tgz" integrity sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw== dependencies: "@babel/helper-plugin-utils" "^7.18.9" -"@babel/plugin-transform-exponentiation-operator@^7.16.7", "@babel/plugin-transform-exponentiation-operator@^7.18.6": +"@babel/plugin-transform-exponentiation-operator@^7.18.6": version "7.18.6" resolved "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.18.6.tgz" integrity sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw== @@ -1215,14 +989,14 @@ "@babel/helper-builder-binary-assignment-operator-visitor" "^7.18.6" "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-for-of@^7.16.7", "@babel/plugin-transform-for-of@^7.18.8": +"@babel/plugin-transform-for-of@^7.18.8": version "7.21.0" resolved "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.21.0.tgz" integrity sha512-LlUYlydgDkKpIY7mcBWvyPPmMcOphEyYA27Ef4xpbh1IiDNLr0kZsos2nf92vz3IccvJI25QUwp86Eo5s6HmBQ== dependencies: "@babel/helper-plugin-utils" "^7.20.2" -"@babel/plugin-transform-function-name@^7.16.7", "@babel/plugin-transform-function-name@^7.18.9": +"@babel/plugin-transform-function-name@^7.18.9": version "7.18.9" resolved "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.9.tgz" integrity sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ== @@ -1231,21 +1005,21 @@ "@babel/helper-function-name" "^7.18.9" "@babel/helper-plugin-utils" "^7.18.9" -"@babel/plugin-transform-literals@^7.16.7", "@babel/plugin-transform-literals@^7.18.9": +"@babel/plugin-transform-literals@^7.18.9": version "7.18.9" resolved "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.9.tgz" integrity sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg== dependencies: "@babel/helper-plugin-utils" "^7.18.9" -"@babel/plugin-transform-member-expression-literals@^7.16.7", "@babel/plugin-transform-member-expression-literals@^7.18.6": +"@babel/plugin-transform-member-expression-literals@^7.18.6": version "7.18.6" resolved "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.18.6.tgz" integrity sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA== dependencies: "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-modules-amd@^7.16.7", "@babel/plugin-transform-modules-amd@^7.18.6": +"@babel/plugin-transform-modules-amd@^7.18.6": version "7.20.11" resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.20.11.tgz" integrity sha512-NuzCt5IIYOW0O30UvqktzHYR2ud5bOWbY0yaxWZ6G+aFzOMJvrs5YHNikrbdaT15+KNO31nPOy5Fim3ku6Zb5g== @@ -1253,7 +1027,7 @@ "@babel/helper-module-transforms" "^7.20.11" "@babel/helper-plugin-utils" "^7.20.2" -"@babel/plugin-transform-modules-commonjs@^7.16.8", "@babel/plugin-transform-modules-commonjs@^7.18.6": +"@babel/plugin-transform-modules-commonjs@^7.18.6": version "7.21.2" resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.21.2.tgz" integrity sha512-Cln+Yy04Gxua7iPdj6nOV96smLGjpElir5YwzF0LBPKoPlLDNJePNlrGGaybAJkd0zKRnOVXOgizSqPYMNYkzA== @@ -1262,7 +1036,7 @@ "@babel/helper-plugin-utils" "^7.20.2" "@babel/helper-simple-access" "^7.20.2" -"@babel/plugin-transform-modules-systemjs@^7.16.7", "@babel/plugin-transform-modules-systemjs@^7.18.9": +"@babel/plugin-transform-modules-systemjs@^7.18.9": version "7.20.11" resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.20.11.tgz" integrity sha512-vVu5g9BPQKSFEmvt2TA4Da5N+QVS66EX21d8uoOihC+OCpUoGvzVsXeqFdtAEfVa5BILAeFt+U7yVmLbQnAJmw== @@ -1272,7 +1046,7 @@ "@babel/helper-plugin-utils" "^7.20.2" "@babel/helper-validator-identifier" "^7.19.1" -"@babel/plugin-transform-modules-umd@^7.16.7", "@babel/plugin-transform-modules-umd@^7.18.6": +"@babel/plugin-transform-modules-umd@^7.18.6": version "7.18.6" resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.6.tgz" integrity sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ== @@ -1280,7 +1054,7 @@ "@babel/helper-module-transforms" "^7.18.6" "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-named-capturing-groups-regex@^7.16.8", "@babel/plugin-transform-named-capturing-groups-regex@^7.18.6": +"@babel/plugin-transform-named-capturing-groups-regex@^7.18.6": version "7.20.5" resolved "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.20.5.tgz" integrity sha512-mOW4tTzi5iTLnw+78iEq3gr8Aoq4WNRGpmSlrogqaiCBoR1HFhpU4JkpQFOHfeYx3ReVIFWOQJS4aZBRvuZ6mA== @@ -1288,14 +1062,14 @@ "@babel/helper-create-regexp-features-plugin" "^7.20.5" "@babel/helper-plugin-utils" "^7.20.2" -"@babel/plugin-transform-new-target@^7.16.7", "@babel/plugin-transform-new-target@^7.18.6": +"@babel/plugin-transform-new-target@^7.18.6": version "7.18.6" resolved "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.18.6.tgz" integrity sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw== dependencies: "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-object-super@^7.16.7", "@babel/plugin-transform-object-super@^7.18.6": +"@babel/plugin-transform-object-super@^7.18.6": version "7.18.6" resolved "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.18.6.tgz" integrity sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA== @@ -1303,21 +1077,21 @@ "@babel/helper-plugin-utils" "^7.18.6" "@babel/helper-replace-supers" "^7.18.6" -"@babel/plugin-transform-parameters@^7.16.7", "@babel/plugin-transform-parameters@^7.18.8", "@babel/plugin-transform-parameters@^7.20.7": +"@babel/plugin-transform-parameters@^7.18.8", "@babel/plugin-transform-parameters@^7.20.7": version "7.21.3" resolved "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.21.3.tgz" integrity sha512-Wxc+TvppQG9xWFYatvCGPvZ6+SIUxQ2ZdiBP+PHYMIjnPXD+uThCshaz4NZOnODAtBjjcVQQ/3OKs9LW28purQ== dependencies: "@babel/helper-plugin-utils" "^7.20.2" -"@babel/plugin-transform-property-literals@^7.16.7", "@babel/plugin-transform-property-literals@^7.18.6": +"@babel/plugin-transform-property-literals@^7.18.6": version "7.18.6" resolved "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.18.6.tgz" integrity sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg== dependencies: "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-regenerator@^7.16.7", "@babel/plugin-transform-regenerator@^7.18.6": +"@babel/plugin-transform-regenerator@^7.18.6": version "7.20.5" resolved "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.20.5.tgz" integrity sha512-kW/oO7HPBtntbsahzQ0qSE3tFvkFwnbozz3NWFhLGqH75vLEg+sCGngLlhVkePlCs3Jv0dBBHDzCHxNiFAQKCQ== @@ -1325,25 +1099,13 @@ "@babel/helper-plugin-utils" "^7.20.2" regenerator-transform "^0.15.1" -"@babel/plugin-transform-reserved-words@^7.16.7", "@babel/plugin-transform-reserved-words@^7.18.6": +"@babel/plugin-transform-reserved-words@^7.18.6": version "7.18.6" resolved "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.18.6.tgz" integrity sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA== dependencies: "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-runtime@7.16.10": - version "7.16.10" - resolved "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.16.10.tgz" - integrity sha512-9nwTiqETv2G7xI4RvXHNfpGdr8pAA+Q/YtN3yLK7OoK7n9OibVm/xymJ838a9A6E/IciOLPj82lZk0fW6O4O7w== - dependencies: - "@babel/helper-module-imports" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" - babel-plugin-polyfill-corejs2 "^0.3.0" - babel-plugin-polyfill-corejs3 "^0.5.0" - babel-plugin-polyfill-regenerator "^0.3.0" - semver "^6.3.0" - "@babel/plugin-transform-runtime@7.18.10": version "7.18.10" resolved "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.18.10.tgz" @@ -1356,14 +1118,14 @@ babel-plugin-polyfill-regenerator "^0.4.0" semver "^6.3.0" -"@babel/plugin-transform-shorthand-properties@^7.16.7", "@babel/plugin-transform-shorthand-properties@^7.18.6": +"@babel/plugin-transform-shorthand-properties@^7.18.6": version "7.18.6" resolved "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.18.6.tgz" integrity sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw== dependencies: "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-spread@^7.16.7", "@babel/plugin-transform-spread@^7.18.9": +"@babel/plugin-transform-spread@^7.18.9": version "7.20.7" resolved "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.20.7.tgz" integrity sha512-ewBbHQ+1U/VnH1fxltbJqDeWBU1oNLG8Dj11uIv3xVf7nrQu0bPGe5Rf716r7K5Qz+SqtAOVswoVunoiBtGhxw== @@ -1371,35 +1133,35 @@ "@babel/helper-plugin-utils" "^7.20.2" "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" -"@babel/plugin-transform-sticky-regex@^7.16.7", "@babel/plugin-transform-sticky-regex@^7.18.6": +"@babel/plugin-transform-sticky-regex@^7.18.6": version "7.18.6" resolved "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.18.6.tgz" integrity sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q== dependencies: "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-template-literals@^7.16.7", "@babel/plugin-transform-template-literals@^7.18.9": +"@babel/plugin-transform-template-literals@^7.18.9": version "7.18.9" resolved "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.9.tgz" integrity sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA== dependencies: "@babel/helper-plugin-utils" "^7.18.9" -"@babel/plugin-transform-typeof-symbol@^7.16.7", "@babel/plugin-transform-typeof-symbol@^7.18.9": +"@babel/plugin-transform-typeof-symbol@^7.18.9": version "7.18.9" resolved "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.9.tgz" integrity sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw== dependencies: "@babel/helper-plugin-utils" "^7.18.9" -"@babel/plugin-transform-unicode-escapes@^7.16.7", "@babel/plugin-transform-unicode-escapes@^7.18.10": +"@babel/plugin-transform-unicode-escapes@^7.18.10": version "7.18.10" resolved "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.18.10.tgz" integrity sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ== dependencies: "@babel/helper-plugin-utils" "^7.18.9" -"@babel/plugin-transform-unicode-regex@^7.16.7", "@babel/plugin-transform-unicode-regex@^7.18.6": +"@babel/plugin-transform-unicode-regex@^7.18.6": version "7.18.6" resolved "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.18.6.tgz" integrity sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA== @@ -1407,86 +1169,6 @@ "@babel/helper-create-regexp-features-plugin" "^7.18.6" "@babel/helper-plugin-utils" "^7.18.6" -"@babel/preset-env@7.16.11": - version "7.16.11" - resolved "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.16.11.tgz" - integrity sha512-qcmWG8R7ZW6WBRPZK//y+E3Cli151B20W1Rv7ln27vuPaXU/8TKms6jFdiJtF7UDTxcrb7mZd88tAeK9LjdT8g== - dependencies: - "@babel/compat-data" "^7.16.8" - "@babel/helper-compilation-targets" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/helper-validator-option" "^7.16.7" - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.16.7" - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.16.7" - "@babel/plugin-proposal-async-generator-functions" "^7.16.8" - "@babel/plugin-proposal-class-properties" "^7.16.7" - "@babel/plugin-proposal-class-static-block" "^7.16.7" - "@babel/plugin-proposal-dynamic-import" "^7.16.7" - "@babel/plugin-proposal-export-namespace-from" "^7.16.7" - "@babel/plugin-proposal-json-strings" "^7.16.7" - "@babel/plugin-proposal-logical-assignment-operators" "^7.16.7" - "@babel/plugin-proposal-nullish-coalescing-operator" "^7.16.7" - "@babel/plugin-proposal-numeric-separator" "^7.16.7" - "@babel/plugin-proposal-object-rest-spread" "^7.16.7" - "@babel/plugin-proposal-optional-catch-binding" "^7.16.7" - "@babel/plugin-proposal-optional-chaining" "^7.16.7" - "@babel/plugin-proposal-private-methods" "^7.16.11" - "@babel/plugin-proposal-private-property-in-object" "^7.16.7" - "@babel/plugin-proposal-unicode-property-regex" "^7.16.7" - "@babel/plugin-syntax-async-generators" "^7.8.4" - "@babel/plugin-syntax-class-properties" "^7.12.13" - "@babel/plugin-syntax-class-static-block" "^7.14.5" - "@babel/plugin-syntax-dynamic-import" "^7.8.3" - "@babel/plugin-syntax-export-namespace-from" "^7.8.3" - "@babel/plugin-syntax-json-strings" "^7.8.3" - "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" - "@babel/plugin-syntax-numeric-separator" "^7.10.4" - "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" - "@babel/plugin-syntax-optional-chaining" "^7.8.3" - "@babel/plugin-syntax-private-property-in-object" "^7.14.5" - "@babel/plugin-syntax-top-level-await" "^7.14.5" - "@babel/plugin-transform-arrow-functions" "^7.16.7" - "@babel/plugin-transform-async-to-generator" "^7.16.8" - "@babel/plugin-transform-block-scoped-functions" "^7.16.7" - "@babel/plugin-transform-block-scoping" "^7.16.7" - "@babel/plugin-transform-classes" "^7.16.7" - "@babel/plugin-transform-computed-properties" "^7.16.7" - "@babel/plugin-transform-destructuring" "^7.16.7" - "@babel/plugin-transform-dotall-regex" "^7.16.7" - "@babel/plugin-transform-duplicate-keys" "^7.16.7" - "@babel/plugin-transform-exponentiation-operator" "^7.16.7" - "@babel/plugin-transform-for-of" "^7.16.7" - "@babel/plugin-transform-function-name" "^7.16.7" - "@babel/plugin-transform-literals" "^7.16.7" - "@babel/plugin-transform-member-expression-literals" "^7.16.7" - "@babel/plugin-transform-modules-amd" "^7.16.7" - "@babel/plugin-transform-modules-commonjs" "^7.16.8" - "@babel/plugin-transform-modules-systemjs" "^7.16.7" - "@babel/plugin-transform-modules-umd" "^7.16.7" - "@babel/plugin-transform-named-capturing-groups-regex" "^7.16.8" - "@babel/plugin-transform-new-target" "^7.16.7" - "@babel/plugin-transform-object-super" "^7.16.7" - "@babel/plugin-transform-parameters" "^7.16.7" - "@babel/plugin-transform-property-literals" "^7.16.7" - "@babel/plugin-transform-regenerator" "^7.16.7" - "@babel/plugin-transform-reserved-words" "^7.16.7" - "@babel/plugin-transform-shorthand-properties" "^7.16.7" - "@babel/plugin-transform-spread" "^7.16.7" - "@babel/plugin-transform-sticky-regex" "^7.16.7" - "@babel/plugin-transform-template-literals" "^7.16.7" - "@babel/plugin-transform-typeof-symbol" "^7.16.7" - "@babel/plugin-transform-unicode-escapes" "^7.16.7" - "@babel/plugin-transform-unicode-regex" "^7.16.7" - "@babel/preset-modules" "^0.1.5" - "@babel/types" "^7.16.8" - babel-plugin-polyfill-corejs2 "^0.3.0" - babel-plugin-polyfill-corejs3 "^0.5.0" - babel-plugin-polyfill-regenerator "^0.3.0" - core-js-compat "^3.20.2" - semver "^6.3.0" - "@babel/preset-env@7.18.10": version "7.18.10" resolved "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.18.10.tgz" @@ -1599,13 +1281,6 @@ dependencies: regenerator-runtime "^0.13.4" -"@babel/runtime@7.16.7": - version "7.16.7" - resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.16.7.tgz" - integrity sha512-9E9FJowqAsytyOY6LG+1KuueckRL+aQW+mKvXRXnuFGyRAyepJPmEo9vgMfXUA6O9u3IeEdv9MAkppFcaQwogQ== - dependencies: - regenerator-runtime "^0.13.4" - "@babel/runtime@7.18.9": version "7.18.9" resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.18.9.tgz" @@ -1613,15 +1288,6 @@ dependencies: regenerator-runtime "^0.13.4" -"@babel/template@^7.16.7", "@babel/template@7.16.7": - version "7.16.7" - resolved "https://registry.npmjs.org/@babel/template/-/template-7.16.7.tgz" - integrity sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w== - dependencies: - "@babel/code-frame" "^7.16.7" - "@babel/parser" "^7.16.7" - "@babel/types" "^7.16.7" - "@babel/template@^7.18.10", "@babel/template@^7.18.6", "@babel/template@^7.20.7": version "7.20.7" resolved "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz" @@ -1640,7 +1306,7 @@ "@babel/parser" "^7.18.10" "@babel/types" "^7.18.10" -"@babel/traverse@^7.10.3", "@babel/traverse@^7.16.10", "@babel/traverse@^7.17.0", "@babel/traverse@^7.18.10", "@babel/traverse@^7.18.9", "@babel/traverse@^7.20.5", "@babel/traverse@^7.20.7", "@babel/traverse@^7.21.0", "@babel/traverse@^7.21.2": +"@babel/traverse@^7.10.3", "@babel/traverse@^7.18.10", "@babel/traverse@^7.18.9", "@babel/traverse@^7.20.5", "@babel/traverse@^7.20.7", "@babel/traverse@^7.21.0", "@babel/traverse@^7.21.2": version "7.21.4" resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.21.4.tgz" integrity sha512-eyKrRHKdyZxqDm+fV1iqL9UAHMoIg0nDaGqfIOd8rKH17m5snv7Gn4qgjBoFfLz9APvjFU/ICT00NVCv1Epp8Q== @@ -1656,7 +1322,7 @@ debug "^4.1.0" globals "^11.1.0" -"@babel/types@^7.10.3", "@babel/types@^7.16.7", "@babel/types@^7.16.8", "@babel/types@^7.17.0", "@babel/types@^7.18.10", "@babel/types@^7.18.6", "@babel/types@^7.18.9", "@babel/types@^7.20.0", "@babel/types@^7.20.2", "@babel/types@^7.20.5", "@babel/types@^7.20.7", "@babel/types@^7.21.0", "@babel/types@^7.21.2", "@babel/types@^7.21.4", "@babel/types@^7.4.4": +"@babel/types@^7.10.3", "@babel/types@^7.18.10", "@babel/types@^7.18.6", "@babel/types@^7.18.9", "@babel/types@^7.20.0", "@babel/types@^7.20.2", "@babel/types@^7.20.5", "@babel/types@^7.20.7", "@babel/types@^7.21.0", "@babel/types@^7.21.2", "@babel/types@^7.21.4", "@babel/types@^7.4.4": version "7.21.4" resolved "https://registry.npmjs.org/@babel/types/-/types-7.21.4.tgz" integrity sha512-rU2oY501qDxE8Pyo7i/Orqma4ziCOrby0/9mvbDUGEfvZjb279Nk9k19e2fiCxHbRRpY2ZyrgW1eq22mvmOIzA== @@ -1827,7 +1493,7 @@ debug "^3.1.0" lodash.once "^4.1.1" -"@discoveryjs/json-ext@^0.5.0", "@discoveryjs/json-ext@0.5.6": +"@discoveryjs/json-ext@^0.5.0": version "0.5.6" resolved "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.6.tgz" integrity sha512-ws57AidsDvREKrZKYffXddNkyaF14iHNHm8VQnZH6t99E8gczjNN0GpvcGny0imC80yQ0tHz1xVUKk/KFQSUyA== @@ -2142,7 +1808,7 @@ dependencies: tslib "^2.0.0" -"@ngtools/webpack@^13.2.6", "@ngtools/webpack@13.3.11": +"@ngtools/webpack@^13.2.6": version "13.3.11" resolved "https://registry.npmjs.org/@ngtools/webpack/-/webpack-13.3.11.tgz" integrity sha512-gB33hTbc/RJmHyIgSUYj8ErPazhYYm7yfapOnvwHdYhCjrj1TKkR1ierOlhJtpfBYUQg6FChdl2YpyIQNPjWMA== @@ -2748,7 +2414,7 @@ resolved "https://registry.npmjs.org/@types/stacktrace-js/-/stacktrace-js-0.0.33.tgz" integrity sha512-aqJ6QM9QThNL4dHBhwl1f9B0oDqiREkYLn9RldghUKsGeFWWGlCsqsRWxbh+hDvvmptMFqc4aIfFIGz9BBu8Qg== -"@types/ws@^8.2.2", "@types/ws@^8.5.1": +"@types/ws@^8.5.1": version "8.5.4" resolved "https://registry.npmjs.org/@types/ws/-/ws-8.5.4.tgz" integrity sha512-zdQDHKUgcX/zBc4GrwsE/7dVdAD8JR4EuiAXiiUhhfyIJXXb2+PrGshFyeXWQPMmmZ2XxgaqclgpIC7eTXc1mg== @@ -3215,9 +2881,9 @@ ajv@^8.0.0, ajv@8.6.2: uri-js "^4.2.2" ajv@^8.8.0, ajv@^8.8.2: - version "8.12.0" - resolved "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz" - integrity sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA== + version "8.11.0" + resolved "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz" + integrity sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg== dependencies: fast-deep-equal "^3.1.1" json-schema-traverse "^1.0.0" @@ -3234,16 +2900,6 @@ ajv@8.11.0: require-from-string "^2.0.2" uri-js "^4.2.2" -ajv@8.9.0: - version "8.9.0" - resolved "https://registry.npmjs.org/ajv/-/ajv-8.9.0.tgz" - integrity sha512-qOKJyNj/h+OWx7s5DePL6Zu1KeM9jPZhwBqs+7DzP6bGOvqzVCSf0xueYmVuaC/oQ/VtS2zLMLHdQFbkka+XDQ== - dependencies: - fast-deep-equal "^3.1.1" - json-schema-traverse "^1.0.0" - require-from-string "^2.0.2" - uri-js "^4.2.2" - angular-idle-preload@3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/angular-idle-preload/-/angular-idle-preload-3.0.0.tgz" @@ -3261,11 +2917,6 @@ ansi-colors@^4.1.1, ansi-colors@4.1.3: resolved "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz" integrity sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw== -ansi-colors@4.1.1: - version "4.1.1" - resolved "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz" - integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== - ansi-escapes@^4.2.1, ansi-escapes@^4.3.0: version "4.3.2" resolved "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz" @@ -3288,11 +2939,6 @@ ansi-regex@^5.0.1: resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz" integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== -ansi-regex@^6.0.1: - version "6.0.1" - resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz" - integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA== - ansi-styles@^3.2.1: version "3.2.1" resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz" @@ -3373,11 +3019,6 @@ array-buffer-byte-length@^1.0.0: call-bind "^1.0.2" is-array-buffer "^3.0.1" -array-flatten@^2.1.0: - version "2.1.2" - resolved "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz" - integrity sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ== - array-flatten@^2.1.2: version "2.1.2" resolved "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz" @@ -3404,11 +3045,6 @@ array-union@^2.1.0: resolved "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz" integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== -array-union@^3.0.1: - version "3.0.1" - resolved "https://registry.npmjs.org/array-union/-/array-union-3.0.1.tgz" - integrity sha512-1OvF9IbWwaeiM9VhzYXVQacMibxpXOMYVNIvMtKRyX9SImBXpKcFr8XvFDeEslCyuH/t6KRt7HEO94AlP8Iatw== - array.prototype.flat@^1.3.1: version "1.3.1" resolved "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz" @@ -3458,13 +3094,6 @@ async@^2.6.0: dependencies: lodash "^4.17.14" -async@^2.6.4: - version "2.6.4" - resolved "https://registry.npmjs.org/async/-/async-2.6.4.tgz" - integrity sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA== - dependencies: - lodash "^4.17.14" - async@^3.2.0, async@^3.2.3: version "3.2.4" resolved "https://registry.npmjs.org/async/-/async-3.2.4.tgz" @@ -3480,12 +3109,7 @@ at-least-node@^1.0.0: resolved "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz" integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== -atob@^2.1.2: - version "2.1.2" - resolved "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz" - integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== - -autoprefixer@^10.4.13, autoprefixer@^10.4.2, autoprefixer@^10.4.8: +autoprefixer@^10.4.13, autoprefixer@^10.4.8: version "10.4.14" resolved "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.14.tgz" integrity sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ== @@ -3567,7 +3191,7 @@ babel-plugin-istanbul@6.1.1: istanbul-lib-instrument "^5.0.4" test-exclude "^6.0.0" -babel-plugin-polyfill-corejs2@^0.3.0, babel-plugin-polyfill-corejs2@^0.3.2: +babel-plugin-polyfill-corejs2@^0.3.2: version "0.3.3" resolved "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.3.tgz" integrity sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q== @@ -3576,7 +3200,7 @@ babel-plugin-polyfill-corejs2@^0.3.0, babel-plugin-polyfill-corejs2@^0.3.2: "@babel/helper-define-polyfill-provider" "^0.3.3" semver "^6.1.1" -babel-plugin-polyfill-corejs3@^0.5.0, babel-plugin-polyfill-corejs3@^0.5.3: +babel-plugin-polyfill-corejs3@^0.5.3: version "0.5.3" resolved "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.3.tgz" integrity sha512-zKsXDh0XjnrUEW0mxIHLfjBfnXSMr5Q/goMe/fxpQnLm07mcOZiIZHBNWCMx60HmdvjxfXcalac0tfFg0wqxyw== @@ -3584,13 +3208,6 @@ babel-plugin-polyfill-corejs3@^0.5.0, babel-plugin-polyfill-corejs3@^0.5.3: "@babel/helper-define-polyfill-provider" "^0.3.2" core-js-compat "^3.21.0" -babel-plugin-polyfill-regenerator@^0.3.0: - version "0.3.1" - resolved "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.3.1.tgz" - integrity sha512-Y2B06tvgHYt1x0yz17jGkGeeMr5FeKUu+ASJ+N6nB5lQ8Dapfg42i0OVrf8PNGJ3zKL4A23snMi1IRwrqqND7A== - dependencies: - "@babel/helper-define-polyfill-provider" "^0.3.1" - babel-plugin-polyfill-regenerator@^0.4.0: version "0.4.1" resolved "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.4.1.tgz" @@ -3703,18 +3320,6 @@ bonjour-service@^1.0.11: fast-deep-equal "^3.1.3" multicast-dns "^7.2.5" -bonjour@^3.5.0: - version "3.5.0" - resolved "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz" - integrity sha512-RaVTblr+OnEli0r/ud8InrU7D+G0y6aJhlxaLa6Pwty4+xoxboF1BsUI45tujvRpbj9dQVoglChqonGAsjEBYg== - dependencies: - array-flatten "^2.1.0" - deep-equal "^1.0.1" - dns-equal "^1.0.0" - dns-txt "^2.0.2" - multicast-dns "^6.0.1" - multicast-dns-service-types "^1.1.0" - boolbase@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz" @@ -3811,7 +3416,7 @@ browser-sync@^2.26.7: ua-parser-js "^1.0.33" yargs "^17.3.1" -browserslist@^4.14.5, browserslist@^4.19.1, browserslist@^4.21.3, browserslist@^4.21.4, browserslist@^4.21.5, browserslist@^4.9.1, "browserslist@>= 4.21.0": +browserslist@^4.14.5, browserslist@^4.21.3, browserslist@^4.21.4, browserslist@^4.21.5, browserslist@^4.9.1, "browserslist@>= 4.21.0": version "4.21.5" resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz" integrity sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w== @@ -3841,11 +3446,6 @@ buffer-from@^1.0.0: resolved "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz" integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== -buffer-indexof@^1.0.0: - version "1.1.1" - resolved "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz" - integrity sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g== - buffer@^5.5.0, buffer@^5.6.0: version "5.7.1" resolved "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz" @@ -3876,7 +3476,7 @@ bytesish@^0.4.1: resolved "https://registry.npmjs.org/bytesish/-/bytesish-0.4.4.tgz" integrity sha512-i4uu6M4zuMUiyfZN4RU2+i9+peJh//pXhd9x1oSe1LBkZ3LEbCoygu8W0bXTukU1Jme2txKuotpCZRaC3FLxcQ== -cacache@^15.0.5, cacache@15.3.0: +cacache@^15.0.5: version "15.3.0" resolved "https://registry.npmjs.org/cacache/-/cacache-15.3.0.tgz" integrity sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ== @@ -3995,7 +3595,7 @@ camelcase@^5.3.1: resolved "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz" integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== -caniuse-lite@^1.0.30001299, caniuse-lite@^1.0.30001449, caniuse-lite@^1.0.30001464: +caniuse-lite@^1.0.30001449, caniuse-lite@^1.0.30001464: version "1.0.30001477" resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001477.tgz" integrity sha512-lZim4iUHhGcy5p+Ri/G7m84hJwncj+Kz7S5aD4hoQfslKZJgt0tHc/hafVbqHC5bbhHb+mrW2JOUHkI5KH7toQ== @@ -4146,11 +3746,6 @@ ci-info@^3.2.0: resolved "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz" integrity sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw== -circular-dependency-plugin@5.2.2: - version "5.2.2" - resolved "https://registry.npmjs.org/circular-dependency-plugin/-/circular-dependency-plugin-5.2.2.tgz" - integrity sha512-g38K9Cm5WRwlaH6g03B9OEz/0qRizI+2I7n+Gz+L5DxXJAPAiWQvwlYNm1V1jkdpUv95bOe/ASm2vfi/G560jQ== - circular-json@^0.5.0: version "0.5.9" resolved "https://registry.npmjs.org/circular-json/-/circular-json-0.5.9.tgz" @@ -4378,7 +3973,7 @@ concat-map@0.0.1: resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== -connect-history-api-fallback@^1, connect-history-api-fallback@^1.6.0: +connect-history-api-fallback@^1: version "1.6.0" resolved "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz" integrity sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg== @@ -4489,18 +4084,6 @@ copy-webpack-plugin@^6.4.1: serialize-javascript "^5.0.1" webpack-sources "^1.4.3" -copy-webpack-plugin@10.2.1: - version "10.2.1" - resolved "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-10.2.1.tgz" - integrity sha512-nr81NhCAIpAWXGCK5thrKmfCQ6GDY0L5RN0U+BnIn/7Us55+UCex5ANNsNKmIVtDRnk0Ecf+/kzp9SUVrrBMLg== - dependencies: - fast-glob "^3.2.7" - glob-parent "^6.0.1" - globby "^12.0.2" - normalize-path "^3.0.0" - schema-utils "^4.0.0" - serialize-javascript "^6.0.0" - copy-webpack-plugin@11.0.0: version "11.0.0" resolved "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-11.0.0.tgz" @@ -4513,7 +4096,7 @@ copy-webpack-plugin@11.0.0: schema-utils "^4.0.0" serialize-javascript "^6.0.0" -core-js-compat@^3.20.2, core-js-compat@^3.21.0, core-js-compat@^3.22.1: +core-js-compat@^3.21.0, core-js-compat@^3.22.1: version "3.30.0" resolved "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.30.0.tgz" integrity sha512-P5A2h/9mRYZFIAP+5Ab8ns6083IyVpSclU74UNvbGVQ8VM7n3n3/g2yF3AkKQ9NXz2O+ioxLbEWKnDtgsFamhg== @@ -4530,11 +4113,6 @@ core-js@^3.7.0, core-js@^3.8.1: resolved "https://registry.npmjs.org/core-js/-/core-js-3.30.0.tgz" integrity sha512-hQotSSARoNh1mYPi9O2YaWeiq/cEB95kOrFb4NCrO4RIFt1qqNpKsaE+vy/L3oiqvND5cThqXzUU3r9F7Efztg== -core-js@3.20.3: - version "3.20.3" - resolved "https://registry.npmjs.org/core-js/-/core-js-3.20.3.tgz" - integrity sha512-vVl8j8ph6tRS3B8qir40H7yw7voy17xL0piAjlbBUsH7WIfzoedL/ZOr1OV9FyZQLWXsayOJyV4tnRyXR85/ag== - core-util-is@~1.0.0: version "1.0.3" resolved "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz" @@ -4602,7 +4180,7 @@ crypt@0.0.2: resolved "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz" integrity sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow== -css-blank-pseudo@^3.0.2, css-blank-pseudo@^3.0.3: +css-blank-pseudo@^3.0.3: version "3.0.3" resolved "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-3.0.3.tgz" integrity sha512-VS90XWtsHGqoM0t4KpH053c4ehxZ2E6HtGI7x68YFV0pTo/QmkV/YFA+NnlvK8guxZVNWGQhVNJGC39Q8XF4OQ== @@ -4616,27 +4194,13 @@ css-box-model@^1.2.0: dependencies: tiny-invariant "^1.0.6" -css-has-pseudo@^3.0.3, css-has-pseudo@^3.0.4: +css-has-pseudo@^3.0.4: version "3.0.4" resolved "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-3.0.4.tgz" integrity sha512-Vse0xpR1K9MNlp2j5w1pgWIJtm1a8qS0JwS9goFYcImjlHEmywP9VUF05aGBXzGpDJF86QXk4L0ypBmwPhGArw== dependencies: postcss-selector-parser "^6.0.9" -css-loader@6.5.1: - version "6.5.1" - resolved "https://registry.npmjs.org/css-loader/-/css-loader-6.5.1.tgz" - integrity sha512-gEy2w9AnJNnD9Kuo4XAP9VflW/ujKoS9c/syO+uWMlm5igc7LysKzPXaDoR2vroROkSwsTS2tGr1yGGEbZOYZQ== - dependencies: - icss-utils "^5.1.0" - postcss "^8.2.15" - postcss-modules-extract-imports "^3.0.0" - postcss-modules-local-by-default "^4.0.0" - postcss-modules-scope "^3.0.0" - postcss-modules-values "^4.0.0" - postcss-value-parser "^4.1.0" - semver "^7.3.5" - css-loader@6.7.1: version "6.7.1" resolved "https://registry.npmjs.org/css-loader/-/css-loader-6.7.1.tgz" @@ -4651,7 +4215,7 @@ css-loader@6.7.1: postcss-value-parser "^4.2.0" semver "^7.3.5" -css-prefers-color-scheme@^6.0.2, css-prefers-color-scheme@^6.0.3: +css-prefers-color-scheme@^6.0.3: version "6.0.3" resolved "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-6.0.3.tgz" integrity sha512-4BqMbZksRkJQx2zAjrokiGMd07RqOa2IxIrrN10lyBe9xhn9DEvjUK79J6jkeiv9D9hQFXKb6g1jwU62jziJZA== @@ -4680,20 +4244,6 @@ css-what@^6.0.1: resolved "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz" integrity sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw== -css@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/css/-/css-3.0.0.tgz" - integrity sha512-DG9pFfwOrzc+hawpmqX/dHYHJG+Bsdb0klhyi1sDneOgGOXy9wQIC8hzyVp1e4NRYDBdxcylvywPkkXCHAzTyQ== - dependencies: - inherits "^2.0.4" - source-map "^0.6.1" - source-map-resolve "^0.6.0" - -cssdb@^5.0.0: - version "5.1.0" - resolved "https://registry.npmjs.org/cssdb/-/cssdb-5.1.0.tgz" - integrity sha512-/vqjXhv1x9eGkE/zO6o8ZOI7dgdZbLVLUGyVRbPgk6YipXbW87YzUCcO+Jrmi5bwJlAH6oD+MNeZyRgXea1GZw== - cssdb@^7.0.0: version "7.5.4" resolved "https://registry.npmjs.org/cssdb/-/cssdb-7.5.4.tgz" @@ -4898,23 +4448,6 @@ decimal.js@^10.2.1, decimal.js@^10.3.1: resolved "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz" integrity sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA== -decode-uri-component@^0.2.0: - version "0.2.2" - resolved "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz" - integrity sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ== - -deep-equal@^1.0.1: - version "1.1.1" - resolved "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz" - integrity sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g== - dependencies: - is-arguments "^1.0.4" - is-date-object "^1.0.1" - is-regex "^1.0.4" - object-is "^1.0.1" - object-keys "^1.1.1" - regexp.prototype.flags "^1.2.0" - deep-freeze@0.0.1: version "0.0.1" resolved "https://registry.npmjs.org/deep-freeze/-/deep-freeze-0.0.1.tgz" @@ -4957,20 +4490,6 @@ define-properties@^1.1.3, define-properties@^1.1.4: has-property-descriptors "^1.0.0" object-keys "^1.1.1" -del@^6.0.0: - version "6.1.1" - resolved "https://registry.npmjs.org/del/-/del-6.1.1.tgz" - integrity sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg== - dependencies: - globby "^11.0.1" - graceful-fs "^4.2.4" - is-glob "^4.0.1" - is-path-cwd "^2.2.0" - is-path-inside "^3.0.2" - p-map "^4.0.0" - rimraf "^3.0.2" - slash "^3.0.0" - delayed-stream@~1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz" @@ -5052,14 +4571,6 @@ dns-equal@^1.0.0: resolved "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz" integrity sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg== -dns-packet@^1.3.1: - version "1.3.4" - resolved "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.4.tgz" - integrity sha512-BQ6F4vycLXBvdrJZ6S3gZewt6rcrks9KBgM9vrhW+knGRqc8uEdT7fuCwloc7nny5xNoMJ17HGH0R/6fpo8ECA== - dependencies: - ip "^1.1.0" - safe-buffer "^5.0.1" - dns-packet@^5.2.2: version "5.5.0" resolved "https://registry.npmjs.org/dns-packet/-/dns-packet-5.5.0.tgz" @@ -5067,13 +4578,6 @@ dns-packet@^5.2.2: dependencies: "@leichtgewicht/ip-codec" "^2.0.1" -dns-txt@^2.0.2: - version "2.0.2" - resolved "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz" - integrity sha512-Ix5PrWjphuSoUXV/Zv5gaFHjnaJtb02F2+Si3Ht9dyJ87+Z/lMmy+dpNHtTGraNK958ndXq2i+GLkWsWHcKaBQ== - dependencies: - buffer-indexof "^1.0.0" - doctrine@^2.1.0: version "2.1.0" resolved "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz" @@ -5455,51 +4959,16 @@ es6-promisify@^6.0.0: resolved "https://registry.npmjs.org/es6-promisify/-/es6-promisify-6.1.1.tgz" integrity sha512-HBL8I3mIki5C1Cc9QjKUenHtnG0A5/xA8Q/AllRcfiwl2CZFXGK7ddBiCoRwAix4i2KxcQfjtIVcrVbB3vbmwg== -esbuild-darwin-64@0.14.22: - version "0.14.22" - resolved "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.14.22.tgz" - integrity sha512-d8Ceuo6Vw6HM3fW218FB6jTY6O3r2WNcTAU0SGsBkXZ3k8SDoRLd3Nrc//EqzdgYnzDNMNtrWegK2Qsss4THhw== - esbuild-darwin-64@0.15.5: version "0.15.5" resolved "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.15.5.tgz" integrity sha512-Cr0iIqnWKx3ZTvDUAzG0H/u9dWjLE4c2gTtRLz4pqOBGjfjqdcZSfAObFzKTInLLSmD0ZV1I/mshhPoYSBMMCQ== -esbuild-wasm@0.14.22: - version "0.14.22" - resolved "https://registry.npmjs.org/esbuild-wasm/-/esbuild-wasm-0.14.22.tgz" - integrity sha512-FOSAM29GN1fWusw0oLMv6JYhoheDIh5+atC72TkJKfIUMID6yISlicoQSd9gsNSFsNBvABvtE2jR4JB1j4FkFw== - esbuild-wasm@0.15.5: version "0.15.5" resolved "https://registry.npmjs.org/esbuild-wasm/-/esbuild-wasm-0.15.5.tgz" integrity sha512-lTJOEKekN/4JI/eOEq0wLcx53co2N6vaT/XjBz46D1tvIVoUEyM0o2K6txW6gEotf31szFD/J1PbxmnbkGlK9A== -esbuild@0.14.22: - version "0.14.22" - resolved "https://registry.npmjs.org/esbuild/-/esbuild-0.14.22.tgz" - integrity sha512-CjFCFGgYtbFOPrwZNJf7wsuzesx8kqwAffOlbYcFDLFuUtP8xloK1GH+Ai13Qr0RZQf9tE7LMTHJ2iVGJ1SKZA== - optionalDependencies: - esbuild-android-arm64 "0.14.22" - esbuild-darwin-64 "0.14.22" - esbuild-darwin-arm64 "0.14.22" - esbuild-freebsd-64 "0.14.22" - esbuild-freebsd-arm64 "0.14.22" - esbuild-linux-32 "0.14.22" - esbuild-linux-64 "0.14.22" - esbuild-linux-arm "0.14.22" - esbuild-linux-arm64 "0.14.22" - esbuild-linux-mips64le "0.14.22" - esbuild-linux-ppc64le "0.14.22" - esbuild-linux-riscv64 "0.14.22" - esbuild-linux-s390x "0.14.22" - esbuild-netbsd-64 "0.14.22" - esbuild-openbsd-64 "0.14.22" - esbuild-sunos-64 "0.14.22" - esbuild-windows-32 "0.14.22" - esbuild-windows-64 "0.14.22" - esbuild-windows-arm64 "0.14.22" - esbuild@0.15.5: version "0.15.5" resolved "https://registry.npmjs.org/esbuild/-/esbuild-0.15.5.tgz" @@ -5915,7 +5384,7 @@ fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz" integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== -fast-glob@^3.2.11, fast-glob@^3.2.4, fast-glob@^3.2.7, fast-glob@^3.2.9: +fast-glob@^3.2.11, fast-glob@^3.2.4, fast-glob@^3.2.9: version "3.2.12" resolved "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz" integrity sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w== @@ -6363,7 +5832,7 @@ glob-to-regexp@^0.4.1: resolved "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz" integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== -glob@^7.1.3, glob@^7.1.4, glob@^7.1.6, glob@^7.1.7, glob@~7.2.0, glob@7.2.0: +glob@^7.1.3, glob@^7.1.4, glob@^7.1.6, glob@^7.1.7, glob@~7.2.0: version "7.2.0" resolved "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz" integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q== @@ -6460,18 +5929,6 @@ globby@^11.1.0: merge2 "^1.4.1" slash "^3.0.0" -globby@^12.0.2: - version "12.2.0" - resolved "https://registry.npmjs.org/globby/-/globby-12.2.0.tgz" - integrity sha512-wiSuFQLZ+urS9x2gGPl1H5drc5twabmm4m2gTR27XDFyjUHJUNsS8o/2aKyIF6IoBaR630atdher0XJ5g6OMmA== - dependencies: - array-union "^3.0.1" - dir-glob "^3.0.1" - fast-glob "^3.2.7" - ignore "^5.1.9" - merge2 "^1.4.1" - slash "^4.0.0" - globby@^13.1.1: version "13.1.4" resolved "https://registry.npmjs.org/globby/-/globby-13.1.4.tgz" @@ -6782,14 +6239,6 @@ https-proxy-agent@^5.0.0, https-proxy-agent@^5.0.1, https-proxy-agent@5.0.1: agent-base "6" debug "4" -https-proxy-agent@5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz" - integrity sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA== - dependencies: - agent-base "6" - debug "4" - human-signals@^1.1.1: version "1.1.1" resolved "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz" @@ -6833,13 +6282,6 @@ iconv-lite@^0.4.24: dependencies: safer-buffer ">= 2.1.2 < 3" -iconv-lite@^0.4.4: - version "0.4.24" - resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz" - integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== - dependencies: - safer-buffer ">= 2.1.2 < 3" - iconv-lite@^0.6.2, iconv-lite@^0.6.3, iconv-lite@0.6.3: version "0.6.3" resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz" @@ -6876,7 +6318,7 @@ ignore-walk@^5.0.1: dependencies: minimatch "^5.0.1" -ignore@^5.0.4, ignore@^5.1.8, ignore@^5.1.9, ignore@^5.2.0: +ignore@^5.0.4, ignore@^5.1.8, ignore@^5.2.0: version "5.2.4" resolved "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz" integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ== @@ -6965,26 +6407,6 @@ ini@3.0.0: resolved "https://registry.npmjs.org/ini/-/ini-3.0.0.tgz" integrity sha512-TxYQaeNW/N8ymDvwAxPyRbhMBtnEwuvaTYpOQkFx1nSeusgezHniEc/l35Vo4iCq/mMiTJbpD7oYxN98hFlfmw== -inquirer@8.2.0: - version "8.2.0" - resolved "https://registry.npmjs.org/inquirer/-/inquirer-8.2.0.tgz" - integrity sha512-0crLweprevJ02tTuA6ThpoAERAGyVILC4sS74uib58Xf/zSr1/ZWtmm7D5CI+bSQEaA04f0K7idaHpQbSWgiVQ== - dependencies: - ansi-escapes "^4.2.1" - chalk "^4.1.1" - cli-cursor "^3.1.0" - cli-width "^3.0.0" - external-editor "^3.0.3" - figures "^3.0.0" - lodash "^4.17.21" - mute-stream "0.0.8" - ora "^5.4.1" - run-async "^2.4.0" - rxjs "^7.2.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - through "^2.3.6" - inquirer@8.2.4: version "8.2.4" resolved "https://registry.npmjs.org/inquirer/-/inquirer-8.2.4.tgz" @@ -7032,11 +6454,6 @@ invariant@^2.2.4: dependencies: loose-envify "^1.0.0" -ip@^1.1.0: - version "1.1.8" - resolved "https://registry.npmjs.org/ip/-/ip-1.1.8.tgz" - integrity sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg== - ip@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz" @@ -7052,14 +6469,6 @@ ipaddr.js@1.9.1: resolved "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz" integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== -is-arguments@^1.0.4: - version "1.1.1" - resolved "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz" - integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA== - dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" - is-array-buffer@^3.0.1, is-array-buffer@^3.0.2: version "3.0.2" resolved "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz" @@ -7196,11 +6605,6 @@ is-number@^7.0.0: resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz" integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== -is-path-cwd@^2.2.0: - version "2.2.0" - resolved "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz" - integrity sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ== - is-path-inside@^3.0.2, is-path-inside@^3.0.3: version "3.0.3" resolved "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz" @@ -7228,7 +6632,7 @@ is-potential-custom-element-name@^1.0.1: resolved "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz" integrity sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ== -is-regex@^1.0.4, is-regex@^1.1.4: +is-regex@^1.1.4: version "1.1.4" resolved "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz" integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== @@ -7889,13 +7293,6 @@ lazy-ass@^1.6.0: resolved "https://registry.npmjs.org/lazy-ass/-/lazy-ass-1.6.0.tgz" integrity sha512-cc8oEVoctTvsFZ/Oje/kGnHbpWHYBe8IAJe4C0QNc3t8uM/0Y8+erSz/7Y1ALuXTEZTMvxXwO6YbX1ey3ujiZw== -less-loader@10.2.0: - version "10.2.0" - resolved "https://registry.npmjs.org/less-loader/-/less-loader-10.2.0.tgz" - integrity sha512-AV5KHWvCezW27GT90WATaDnfXBv99llDbtaj4bshq6DvAihMdNjaPDcUMa6EXKLRF+P2opFenJp89BXg91XLYg== - dependencies: - klona "^2.0.4" - less-loader@11.0.0: version "11.0.0" resolved "https://registry.npmjs.org/less-loader/-/less-loader-11.0.0.tgz" @@ -7920,23 +7317,6 @@ less-loader@11.0.0: needle "^3.1.0" source-map "~0.6.0" -less@4.1.2: - version "4.1.2" - resolved "https://registry.npmjs.org/less/-/less-4.1.2.tgz" - integrity sha512-EoQp/Et7OSOVu0aJknJOtlXZsnr8XE8KwuzTHOLeVSEx8pVWUICc8Q0VYRHgzyjX78nMEyC/oztWFbgyhtNfDA== - dependencies: - copy-anything "^2.0.1" - parse-node-version "^1.0.1" - tslib "^2.3.0" - optionalDependencies: - errno "^0.1.1" - graceful-fs "^4.1.2" - image-size "~0.5.0" - make-dir "^2.1.0" - mime "^1.4.1" - needle "^2.5.2" - source-map "~0.6.0" - levn@^0.4.1: version "0.4.1" resolved "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz" @@ -8247,7 +7627,7 @@ media-typer@0.3.0: resolved "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz" integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== -memfs@^3.2.2, memfs@^3.4.3: +memfs@^3.4.3: version "3.5.0" resolved "https://registry.npmjs.org/memfs/-/memfs-3.5.0.tgz" integrity sha512-yK6o8xVJlQerz57kvPROwTMgx5WtGwC2ZxDtOUsnGl49rHjYkfQoPNZPCKH73VdLE1BwBu/+Fx/NL8NYMUw2aA== @@ -8334,13 +7714,6 @@ mimic-fn@^2.1.0: resolved "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz" integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== -mini-css-extract-plugin@2.5.3: - version "2.5.3" - resolved "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.5.3.tgz" - integrity sha512-YseMB8cs8U/KCaAGQoqYmfUuhhGW0a9p9XvWXrxVOkE3/IiISTLw4ALNt7JR5B2eYauFM+PQGSbXMDmVbR7Tfw== - dependencies: - schema-utils "^4.0.0" - mini-css-extract-plugin@2.6.1: version "2.6.1" resolved "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.6.1.tgz" @@ -8522,13 +7895,6 @@ mkdirp@^0.5.5: dependencies: minimist "^1.2.6" -mkdirp@^0.5.6: - version "0.5.6" - resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz" - integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== - dependencies: - minimist "^1.2.6" - mkdirp@^1.0.3, mkdirp@^1.0.4: version "1.0.4" resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz" @@ -8565,19 +7931,6 @@ ms@2.1.3: resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== -multicast-dns-service-types@^1.1.0: - version "1.1.0" - resolved "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz" - integrity sha512-cnAsSVxIDsYt0v7HmC0hWZFwwXSh+E6PgCrREDuN/EsjgLwA5XRmlMHhSiDPrt6HxY1gTivEa/Zh7GtODoLevQ== - -multicast-dns@^6.0.1: - version "6.2.3" - resolved "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz" - integrity sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g== - dependencies: - dns-packet "^1.3.1" - thunky "^1.0.2" - multicast-dns@^7.2.5: version "7.2.5" resolved "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz" @@ -8591,7 +7944,7 @@ mute-stream@0.0.8: resolved "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz" integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== -nanoid@^3.1.30, nanoid@^3.3.4: +nanoid@^3.3.4: version "3.3.6" resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz" integrity sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA== @@ -8601,15 +7954,6 @@ natural-compare@^1.4.0: resolved "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz" integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== -needle@^2.5.2: - version "2.9.1" - resolved "https://registry.npmjs.org/needle/-/needle-2.9.1.tgz" - integrity sha512-6R9fqJ5Zcmf+uYaFgdIHmLwNldn5HbK8L5ybn7Uz+ylX/rnOsSp1AHcvQSrCaFN+qNM1wpymHqD7mVasEOlHGQ== - dependencies: - debug "^3.2.6" - iconv-lite "^0.4.4" - sax "^1.2.4" - needle@^3.1.0: version "3.2.0" resolved "https://registry.npmjs.org/needle/-/needle-3.2.0.tgz" @@ -8962,14 +8306,6 @@ object-inspect@^1.12.3, object-inspect@^1.9.0: resolved "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz" integrity sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g== -object-is@^1.0.1: - version "1.1.5" - resolved "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz" - integrity sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - object-keys@^1.1.1: version "1.1.1" resolved "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz" @@ -9386,15 +8722,6 @@ popper.js@1.16.1-lts: resolved "https://registry.npmjs.org/popper.js/-/popper.js-1.16.1-lts.tgz" integrity sha512-Kjw8nKRl1m+VrSFCoVGPph93W/qrSO7ZkqPpTf7F4bk/sqcfWK019dWBUpE/fBOsOQY1dks/Bmcbfn1heM/IsA== -portfinder@^1.0.28: - version "1.0.32" - resolved "https://registry.npmjs.org/portfinder/-/portfinder-1.0.32.tgz" - integrity sha512-on2ZJVVDXRADWE6jnQaX0ioEylzgBpQk8r55NE4wjXW1ZxO+BgDlY6DXwj20i0V8eB4SenDQ00WEaxfiIQPcxg== - dependencies: - async "^2.6.4" - debug "^3.2.7" - mkdirp "^0.5.6" - portscanner@2.2.0: version "2.2.0" resolved "https://registry.npmjs.org/portscanner/-/portscanner-2.2.0.tgz" @@ -9411,7 +8738,7 @@ postcss-apply@0.12.0: balanced-match "^1.0.0" postcss "^7.0.14" -postcss-attribute-case-insensitive@^5.0.0, postcss-attribute-case-insensitive@^5.0.2: +postcss-attribute-case-insensitive@^5.0.2: version "5.0.2" resolved "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-5.0.2.tgz" integrity sha512-XIidXV8fDr0kKt28vqki84fRK8VW8eTuIa4PChv2MqKuT6C9UjmSKzen6KaWhWEoYvwxFCa7n/tC1SZ3tyq4SQ== @@ -9425,56 +8752,56 @@ postcss-clamp@^4.1.0: dependencies: postcss-value-parser "^4.2.0" -postcss-color-functional-notation@^4.2.1, postcss-color-functional-notation@^4.2.4: +postcss-color-functional-notation@^4.2.4: version "4.2.4" resolved "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-4.2.4.tgz" integrity sha512-2yrTAUZUab9s6CpxkxC4rVgFEVaR6/2Pipvi6qcgvnYiVqZcbDHEoBDhrXzyb7Efh2CCfHQNtcqWcIruDTIUeg== dependencies: postcss-value-parser "^4.2.0" -postcss-color-hex-alpha@^8.0.2, postcss-color-hex-alpha@^8.0.4: +postcss-color-hex-alpha@^8.0.4: version "8.0.4" resolved "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-8.0.4.tgz" integrity sha512-nLo2DCRC9eE4w2JmuKgVA3fGL3d01kGq752pVALF68qpGLmx2Qrk91QTKkdUqqp45T1K1XV8IhQpcu1hoAQflQ== dependencies: postcss-value-parser "^4.2.0" -postcss-color-rebeccapurple@^7.0.2, postcss-color-rebeccapurple@^7.1.1: +postcss-color-rebeccapurple@^7.1.1: version "7.1.1" resolved "https://registry.npmjs.org/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-7.1.1.tgz" integrity sha512-pGxkuVEInwLHgkNxUc4sdg4g3py7zUeCQ9sMfwyHAT+Ezk8a4OaaVZ8lIY5+oNqA/BXXgLyXv0+5wHP68R79hg== dependencies: postcss-value-parser "^4.2.0" -postcss-custom-media@^8.0.0, postcss-custom-media@^8.0.2: +postcss-custom-media@^8.0.2: version "8.0.2" resolved "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-8.0.2.tgz" integrity sha512-7yi25vDAoHAkbhAzX9dHx2yc6ntS4jQvejrNcC+csQJAXjj15e7VcWfMgLqBNAbOvqi5uIa9huOVwdHbf+sKqg== dependencies: postcss-value-parser "^4.2.0" -postcss-custom-properties@^12.1.10, postcss-custom-properties@^12.1.2, postcss-custom-properties@^12.1.8: +postcss-custom-properties@^12.1.10, postcss-custom-properties@^12.1.8: version "12.1.11" resolved "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-12.1.11.tgz" integrity sha512-0IDJYhgU8xDv1KY6+VgUwuQkVtmYzRwu+dMjnmdMafXYv86SWqfxkc7qdDvWS38vsjaEtv8e0vGOUQrAiMBLpQ== dependencies: postcss-value-parser "^4.2.0" -postcss-custom-selectors@^6.0.0, postcss-custom-selectors@^6.0.3: +postcss-custom-selectors@^6.0.3: version "6.0.3" resolved "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-6.0.3.tgz" integrity sha512-fgVkmyiWDwmD3JbpCmB45SvvlCD6z9CG6Ie6Iere22W5aHea6oWa7EM2bpnv2Fj3I94L3VbtvX9KqwSi5aFzSg== dependencies: postcss-selector-parser "^6.0.4" -postcss-dir-pseudo-class@^6.0.3, postcss-dir-pseudo-class@^6.0.5: +postcss-dir-pseudo-class@^6.0.5: version "6.0.5" resolved "https://registry.npmjs.org/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-6.0.5.tgz" integrity sha512-eqn4m70P031PF7ZQIvSgy9RSJ5uI2171O/OO/zcRNYpJbvaeKFUlar1aJ7rmgiQtbm0FSPsRewjpdS0Oew7MPA== dependencies: postcss-selector-parser "^6.0.10" -postcss-double-position-gradients@^3.0.4, postcss-double-position-gradients@^3.1.2: +postcss-double-position-gradients@^3.1.2: version "3.1.2" resolved "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-3.1.2.tgz" integrity sha512-GX+FuE/uBR6eskOK+4vkXgT6pDkexLokPaz/AbJna9s5Kzp/yl488pKPjhy0obB475ovfT1Wv8ho7U/cHNaRgQ== @@ -9482,21 +8809,21 @@ postcss-double-position-gradients@^3.0.4, postcss-double-position-gradients@^3.1 "@csstools/postcss-progressive-custom-properties" "^1.1.0" postcss-value-parser "^4.2.0" -postcss-env-function@^4.0.4, postcss-env-function@^4.0.6: +postcss-env-function@^4.0.6: version "4.0.6" resolved "https://registry.npmjs.org/postcss-env-function/-/postcss-env-function-4.0.6.tgz" integrity sha512-kpA6FsLra+NqcFnL81TnsU+Z7orGtDTxcOhl6pwXeEq1yFPpRMkCDpHhrz8CFQDr/Wfm0jLiNQ1OsGGPjlqPwA== dependencies: postcss-value-parser "^4.2.0" -postcss-focus-visible@^6.0.3, postcss-focus-visible@^6.0.4: +postcss-focus-visible@^6.0.4: version "6.0.4" resolved "https://registry.npmjs.org/postcss-focus-visible/-/postcss-focus-visible-6.0.4.tgz" integrity sha512-QcKuUU/dgNsstIK6HELFRT5Y3lbrMLEOwG+A4s5cA+fx3A3y/JTq3X9LaOj3OC3ALH0XqyrgQIgey/MIZ8Wczw== dependencies: postcss-selector-parser "^6.0.9" -postcss-focus-within@^5.0.3, postcss-focus-within@^5.0.4: +postcss-focus-within@^5.0.4: version "5.0.4" resolved "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-5.0.4.tgz" integrity sha512-vvjDN++C0mu8jz4af5d52CB184ogg/sSxAFS+oUJQq2SuCe7T5U2iIsVJtsCp2d6R4j0jr5+q3rPkBVZkXD9fQ== @@ -9508,12 +8835,12 @@ postcss-font-variant@^5.0.0: resolved "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-5.0.0.tgz" integrity sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA== -postcss-gap-properties@^3.0.2, postcss-gap-properties@^3.0.5: +postcss-gap-properties@^3.0.5: version "3.0.5" resolved "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-3.0.5.tgz" integrity sha512-IuE6gKSdoUNcvkGIqdtjtcMtZIFyXZhmFd5RUlg97iVEvp1BZKV5ngsAjCjrVy+14uhGBQl9tzmi1Qwq4kqVOg== -postcss-image-set-function@^4.0.4, postcss-image-set-function@^4.0.7: +postcss-image-set-function@^4.0.7: version "4.0.7" resolved "https://registry.npmjs.org/postcss-image-set-function/-/postcss-image-set-function-4.0.7.tgz" integrity sha512-9T2r9rsvYzm5ndsBE8WgtrMlIT7VbtTfE7b3BQnudUqnBcBo7L758oc+o+pdj/dUV0l5wjwSdjeOH2DZtfv8qw== @@ -9529,15 +8856,6 @@ postcss-import@^14.0.0: read-cache "^1.0.0" resolve "^1.1.7" -postcss-import@14.0.2: - version "14.0.2" - resolved "https://registry.npmjs.org/postcss-import/-/postcss-import-14.0.2.tgz" - integrity sha512-BJ2pVK4KhUyMcqjuKs9RijV5tatNzNa73e/32aBVE/ejYPe37iH+6vAu9WvqUkB5OAYgLHzbSvzHnorybJCm9g== - dependencies: - postcss-value-parser "^4.0.0" - read-cache "^1.0.0" - resolve "^1.1.7" - postcss-import@15.0.0: version "15.0.0" resolved "https://registry.npmjs.org/postcss-import/-/postcss-import-15.0.0.tgz" @@ -9552,7 +8870,7 @@ postcss-initial@^4.0.1: resolved "https://registry.npmjs.org/postcss-initial/-/postcss-initial-4.0.1.tgz" integrity sha512-0ueD7rPqX8Pn1xJIjay0AZeIuDoF+V+VvMt/uOnn+4ezUKhZM/NokDeP6DwMNyIoYByuN/94IQnt5FEkaN59xQ== -postcss-lab-function@^4.0.3, postcss-lab-function@^4.2.1: +postcss-lab-function@^4.2.1: version "4.2.1" resolved "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-4.2.1.tgz" integrity sha512-xuXll4isR03CrQsmxyz92LJB2xX9n+pZJ5jE9JgcnmsCammLyKdlzrBin+25dy6wIjfhJpKBAN80gsTlCgRk2w== @@ -9571,15 +8889,6 @@ postcss-loader@^4.0.3: schema-utils "^3.0.0" semver "^7.3.4" -postcss-loader@6.2.1: - version "6.2.1" - resolved "https://registry.npmjs.org/postcss-loader/-/postcss-loader-6.2.1.tgz" - integrity sha512-WbbYpmAaKcux/P66bZ40bpWsBucjx/TTgVVzRZ9yUO8yQfVBlameJ0ZGVaPfH64hNSBh63a+ICP5nqOpBA0w+Q== - dependencies: - cosmiconfig "^7.0.0" - klona "^2.0.5" - semver "^7.3.5" - postcss-loader@7.0.1: version "7.0.1" resolved "https://registry.npmjs.org/postcss-loader/-/postcss-loader-7.0.1.tgz" @@ -9589,7 +8898,7 @@ postcss-loader@7.0.1: klona "^2.0.5" semver "^7.3.7" -postcss-logical@^5.0.3, postcss-logical@^5.0.4: +postcss-logical@^5.0.4: version "5.0.4" resolved "https://registry.npmjs.org/postcss-logical/-/postcss-logical-5.0.4.tgz" integrity sha512-RHXxplCeLh9VjinvMrZONq7im4wjWGlRJAqmAVLXyZaXwfDWP73/oq4NdIp+OZwhQUMj0zjqDfM5Fj7qby+B4g== @@ -9627,7 +8936,7 @@ postcss-modules-values@^4.0.0: dependencies: icss-utils "^5.0.0" -postcss-nesting@^10.1.10, postcss-nesting@^10.1.2, postcss-nesting@^10.2.0: +postcss-nesting@^10.1.10, postcss-nesting@^10.2.0: version "10.2.0" resolved "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-10.2.0.tgz" integrity sha512-EwMkYchxiDiKUhlJGzWsD9b2zvq/r2SSubcRrgP+jujMXFzqvANLt16lJANC+5uZ6hjI7lpRmI6O8JIl+8l1KA== @@ -9640,7 +8949,7 @@ postcss-opacity-percentage@^1.1.2: resolved "https://registry.npmjs.org/postcss-opacity-percentage/-/postcss-opacity-percentage-1.1.3.tgz" integrity sha512-An6Ba4pHBiDtyVpSLymUUERMo2cU7s+Obz6BTrS+gxkbnSBNKSuD0AVUc+CpBMrpVPKKfoVz0WQCX+Tnst0i4A== -postcss-overflow-shorthand@^3.0.2, postcss-overflow-shorthand@^3.0.4: +postcss-overflow-shorthand@^3.0.4: version "3.0.4" resolved "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-3.0.4.tgz" integrity sha512-otYl/ylHK8Y9bcBnPLo3foYFLL6a6Ak+3EQBPOTR7luMYCOsiVTUk1iLvNf6tVPNGXcoL9Hoz37kpfriRIFb4A== @@ -9652,7 +8961,7 @@ postcss-page-break@^3.0.4: resolved "https://registry.npmjs.org/postcss-page-break/-/postcss-page-break-3.0.4.tgz" integrity sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ== -postcss-place@^7.0.3, postcss-place@^7.0.5: +postcss-place@^7.0.5: version "7.0.5" resolved "https://registry.npmjs.org/postcss-place/-/postcss-place-7.0.5.tgz" integrity sha512-wR8igaZROA6Z4pv0d+bvVrvGY4GVHihBCBQieXFY3kuSuMyOmEnnfFzHl/tQuqHZkfkIVBEbDvYcFfHmpSet9g== @@ -9714,45 +9023,6 @@ postcss-preset-env@^7.4.2: postcss-selector-not "^6.0.1" postcss-value-parser "^4.2.0" -postcss-preset-env@7.2.3: - version "7.2.3" - resolved "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-7.2.3.tgz" - integrity sha512-Ok0DhLfwrcNGrBn8sNdy1uZqWRk/9FId0GiQ39W4ILop5GHtjJs8bu1MY9isPwHInpVEPWjb4CEcEaSbBLpfwA== - dependencies: - autoprefixer "^10.4.2" - browserslist "^4.19.1" - caniuse-lite "^1.0.30001299" - css-blank-pseudo "^3.0.2" - css-has-pseudo "^3.0.3" - css-prefers-color-scheme "^6.0.2" - cssdb "^5.0.0" - postcss-attribute-case-insensitive "^5.0.0" - postcss-color-functional-notation "^4.2.1" - postcss-color-hex-alpha "^8.0.2" - postcss-color-rebeccapurple "^7.0.2" - postcss-custom-media "^8.0.0" - postcss-custom-properties "^12.1.2" - postcss-custom-selectors "^6.0.0" - postcss-dir-pseudo-class "^6.0.3" - postcss-double-position-gradients "^3.0.4" - postcss-env-function "^4.0.4" - postcss-focus-visible "^6.0.3" - postcss-focus-within "^5.0.3" - postcss-font-variant "^5.0.0" - postcss-gap-properties "^3.0.2" - postcss-image-set-function "^4.0.4" - postcss-initial "^4.0.1" - postcss-lab-function "^4.0.3" - postcss-logical "^5.0.3" - postcss-media-minmax "^5.0.0" - postcss-nesting "^10.1.2" - postcss-overflow-shorthand "^3.0.2" - postcss-page-break "^3.0.4" - postcss-place "^7.0.3" - postcss-pseudo-class-any-link "^7.0.2" - postcss-replace-overflow-wrap "^4.0.0" - postcss-selector-not "^5.0.0" - postcss-preset-env@7.8.0: version "7.8.0" resolved "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-7.8.0.tgz" @@ -9808,7 +9078,7 @@ postcss-preset-env@7.8.0: postcss-selector-not "^6.0.1" postcss-value-parser "^4.2.0" -postcss-pseudo-class-any-link@^7.0.2, postcss-pseudo-class-any-link@^7.1.6: +postcss-pseudo-class-any-link@^7.1.6: version "7.1.6" resolved "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-7.1.6.tgz" integrity sha512-9sCtZkO6f/5ML9WcTLcIyV1yz9D1rf0tWc+ulKcvV30s0iZKS/ONyETvoWsr6vnrmW+X+KmuK3gV/w5EWnT37w== @@ -9827,13 +9097,6 @@ postcss-responsive-type@1.0.0: dependencies: postcss "^6.0.6" -postcss-selector-not@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-5.0.0.tgz" - integrity sha512-/2K3A4TCP9orP4TNS7u3tGdRFVKqz/E6pX3aGnriPG0jU78of8wsUcqE4QAhWEU0d+WnMSF93Ah3F//vUtK+iQ== - dependencies: - balanced-match "^1.0.0" - postcss-selector-not@^6.0.1: version "6.0.1" resolved "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-6.0.1.tgz" @@ -9880,15 +9143,6 @@ postcss@^7.0.14: picocolors "^0.2.1" source-map "^0.6.1" -postcss@^8.2.15, postcss@8.4.5: - version "8.4.5" - resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.5.tgz" - integrity sha512-jBDboWM8qpaqwkMwItqTQTiFikhs/67OYVvblFFTM7MrZjt6yMKd6r2kgXizEbTTljacm4NldIlZnhbjr84QYg== - dependencies: - nanoid "^3.1.30" - picocolors "^1.0.0" - source-map-js "^1.0.1" - postcss@8.4.16: version "8.4.16" resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.16.tgz" @@ -10397,7 +9651,7 @@ regex-parser@^2.2.11: resolved "https://registry.npmjs.org/regex-parser/-/regex-parser-2.2.11.tgz" integrity sha512-jbD/FT0+9MBU2XAZluI7w2OBs1RBi6p9M83nkoZayQXXU9e8Robt69FcZc7wU4eJD/YFTjn1JdCk3rbMJajz8Q== -regexp.prototype.flags@^1.2.0, regexp.prototype.flags@^1.4.3: +regexp.prototype.flags@^1.4.3: version "1.4.3" resolved "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz" integrity sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA== @@ -10607,7 +9861,7 @@ rxjs-spy@^8.0.2: rxjs-report-usage "^1.0.4" stacktrace-gps "^3.0.2" -rxjs@^6.0.0, "rxjs@^6.5.3 || ^7.4.0", rxjs@^7.0.0, rxjs@^7.2.0, rxjs@^7.5.1, rxjs@^7.5.5, rxjs@>=6.5.3: +rxjs@^6.0.0, "rxjs@^6.5.3 || ^7.4.0", rxjs@^7.0.0, rxjs@^7.5.1, rxjs@^7.5.5, rxjs@>=6.5.3: version "7.8.0" resolved "https://registry.npmjs.org/rxjs/-/rxjs-7.8.0.tgz" integrity sha512-F2+gxDshqmIub1KdvZkaEfGDwLNpPvk9Fs6LD/MyQxNgMds/WH9OdDDXOmxUZpME+iSK3rQCctkL0DYyytUqMg== @@ -10621,7 +9875,14 @@ rxjs@^6.5.4: dependencies: tslib "^1.9.0" -rxjs@^6.5.5, rxjs@~6.6.0, rxjs@6.6.7: +rxjs@^6.5.5: + version "6.6.7" + resolved "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz" + integrity sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ== + dependencies: + tslib "^1.9.0" + +rxjs@~6.6.0, rxjs@6.6.7: version "6.6.7" resolved "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz" integrity sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ== @@ -10652,7 +9913,7 @@ safe-regex-test@^1.0.0: get-intrinsic "^1.1.3" is-regex "^1.1.4" -safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@^2.1.2, "safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0", safer-buffer@~2.1.0: +safer-buffer@^2.0.2, safer-buffer@^2.1.0, "safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0", safer-buffer@~2.1.0: version "2.1.2" resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== @@ -10677,14 +9938,6 @@ sass-loader@^12.6.0: klona "^2.0.4" neo-async "^2.6.2" -sass-loader@12.4.0: - version "12.4.0" - resolved "https://registry.npmjs.org/sass-loader/-/sass-loader-12.4.0.tgz" - integrity sha512-7xN+8khDIzym1oL9XyS6zP6Ges+Bo2B2xbPrjdMHEYyV3AQYhd/wXeru++3ODHF0zMjYmVadblSKrPrjEkL8mg== - dependencies: - klona "^2.0.4" - neo-async "^2.6.2" - sass-loader@13.0.2: version "13.0.2" resolved "https://registry.npmjs.org/sass-loader/-/sass-loader-13.0.2.tgz" @@ -10710,15 +9963,6 @@ sass@^1.3.0, sass@~1.33.0: dependencies: chokidar ">=3.0.0 <4.0.0" -sass@1.49.9: - version "1.49.9" - resolved "https://registry.npmjs.org/sass/-/sass-1.49.9.tgz" - integrity sha512-YlYWkkHP9fbwaFRZQRXgDi3mXZShslVmmo+FVK3kHLUELHHEYrCmL1x6IUjC7wLS6VuJSAFXRQS/DxdsC4xL1A== - dependencies: - chokidar ">=3.0.0 <4.0.0" - immutable "^4.0.0" - source-map-js ">=0.6.2 <2.0.0" - sass@1.54.4: version "1.54.4" resolved "https://registry.npmjs.org/sass/-/sass-1.54.4.tgz" @@ -10806,7 +10050,7 @@ select-hose@^2.0.0: resolved "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz" integrity sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg== -selfsigned@^2.0.0, selfsigned@^2.0.1, selfsigned@^2.1.1: +selfsigned@^2.0.1, selfsigned@^2.1.1: version "2.1.1" resolved "https://registry.npmjs.org/selfsigned/-/selfsigned-2.1.1.tgz" integrity sha512-GSL3aowiF7wa/WtSFwnUrludWFoNhftq8bUkH9pkzjpN2XSPOAYEgg6e0sS9s0rZwgJzJiQRPU18A6clnoW5wQ== @@ -10828,7 +10072,7 @@ semver@^6.0.0, semver@^6.1.1, semver@^6.1.2, semver@^6.3.0: resolved "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== -semver@^7.0.0, semver@^7.3.5: +semver@^7.0.0: version "7.4.0" resolved "https://registry.npmjs.org/semver/-/semver-7.4.0.tgz" integrity sha512-RgOxM8Mw+7Zus0+zcLEUn8+JfoLpj/huFTItQy2hsM4khuC1HYRDp0cU482Ewn/Fcy6bCjufD8vAj7voC66KQw== @@ -10856,7 +10100,7 @@ semver@^7.3.4: dependencies: lru-cache "^6.0.0" -semver@^7.3.7, semver@7.3.7: +semver@^7.3.5, semver@^7.3.7, semver@7.3.7: version "7.3.7" resolved "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz" integrity sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g== @@ -10882,13 +10126,6 @@ semver@7.3.4: dependencies: lru-cache "^6.0.0" -semver@7.3.5: - version "7.3.5" - resolved "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz" - integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ== - dependencies: - lru-cache "^6.0.0" - send@0.16.2: version "0.16.2" resolved "https://registry.npmjs.org/send/-/send-0.16.2.tgz" @@ -11133,7 +10370,7 @@ socket.io@^4.4.1: socket.io-adapter "~2.5.2" socket.io-parser "~4.2.1" -sockjs@^0.3.21, sockjs@^0.3.24: +sockjs@^0.3.24: version "0.3.24" resolved "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz" integrity sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ== @@ -11169,20 +10406,11 @@ source-list-map@^2.0.0: resolved "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz" integrity sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw== -source-map-js@^1.0.1, source-map-js@^1.0.2, "source-map-js@>=0.6.2 <2.0.0": +source-map-js@^1.0.2, "source-map-js@>=0.6.2 <2.0.0": version "1.0.2" resolved "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz" integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== -source-map-loader@3.0.1: - version "3.0.1" - resolved "https://registry.npmjs.org/source-map-loader/-/source-map-loader-3.0.1.tgz" - integrity sha512-Vp1UsfyPvgujKQzi4pyDiTOnE3E4H+yHvkVRN3c/9PJmQS4CQJExvcDvaX/D+RV+xQben9HJ56jMJS3CgUeWyA== - dependencies: - abab "^2.0.5" - iconv-lite "^0.6.3" - source-map-js "^1.0.1" - source-map-loader@4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/source-map-loader/-/source-map-loader-4.0.0.tgz" @@ -11192,14 +10420,6 @@ source-map-loader@4.0.0: iconv-lite "^0.6.3" source-map-js "^1.0.2" -source-map-resolve@^0.6.0: - version "0.6.0" - resolved "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.6.0.tgz" - integrity sha512-KXBr9d/fO/bWo97NXsPIAW1bFSBOuCnjbNTBMO7N59hsv5i9yzRDfcYwwt0l04+VqnKC+EwzvJZIP/qkuMgR/w== - dependencies: - atob "^2.1.2" - decode-uri-component "^0.2.0" - source-map-support@^0.5.17, source-map-support@^0.5.5, source-map-support@~0.5.20, source-map-support@0.5.21: version "0.5.21" resolved "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz" @@ -11208,11 +10428,6 @@ source-map-support@^0.5.17, source-map-support@^0.5.5, source-map-support@~0.5.2 buffer-from "^1.0.0" source-map "^0.6.0" -source-map@^0.5.0: - version "0.5.7" - resolved "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz" - integrity sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ== - source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1, source-map@0.6.1: version "0.6.1" resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" @@ -11449,13 +10664,6 @@ strip-ansi@^6.0.0, strip-ansi@^6.0.1: dependencies: ansi-regex "^5.0.1" -strip-ansi@^7.0.0: - version "7.0.1" - resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz" - integrity sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw== - dependencies: - ansi-regex "^6.0.1" - strip-bom@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz" @@ -11480,15 +10688,6 @@ strong-log-transformer@^2.1.0: minimist "^1.2.0" through "^2.3.4" -stylus-loader@6.2.0: - version "6.2.0" - resolved "https://registry.npmjs.org/stylus-loader/-/stylus-loader-6.2.0.tgz" - integrity sha512-5dsDc7qVQGRoc6pvCL20eYgRUxepZ9FpeK28XhdXaIPP6kXr6nI1zAAKFQgP5OBkOfKaURp4WUpJzspg1f01Gg== - dependencies: - fast-glob "^3.2.7" - klona "^2.0.4" - normalize-path "^3.0.0" - stylus-loader@7.0.0: version "7.0.0" resolved "https://registry.npmjs.org/stylus-loader/-/stylus-loader-7.0.0.tgz" @@ -11509,18 +10708,6 @@ stylus@>=0.52.4, stylus@0.59.0: sax "~1.2.4" source-map "^0.7.3" -stylus@0.56.0: - version "0.56.0" - resolved "https://registry.npmjs.org/stylus/-/stylus-0.56.0.tgz" - integrity sha512-Ev3fOb4bUElwWu4F9P9WjnnaSpc8XB9OFHSFZSKMFL1CE1oM+oFXWEgAqPmmZIyhBihuqIQlFsVTypiiS9RxeA== - dependencies: - css "^3.0.0" - debug "^4.3.2" - glob "^7.1.6" - safer-buffer "^2.1.2" - sax "~1.2.4" - source-map "^0.7.3" - supports-color@^5.3.0, supports-color@^5.4.0, supports-color@^5.5.0: version "5.5.0" resolved "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz" @@ -11939,11 +11126,6 @@ typescript@^2.5.0: resolved "https://registry.npmjs.org/typescript/-/typescript-2.9.2.tgz" integrity sha512-Gr4p6nFNaoufRIY4NMdpQRNmgxVIGMs4Fcu/ujdYk3nAZqk7supzBE9idmvfZIlH/Cuj//dvi+019qEue9lV0w== -"typescript@>=4.4.2 <4.7": - version "4.6.4" - resolved "https://registry.npmjs.org/typescript/-/typescript-4.6.4.tgz" - integrity sha512-9ia/jWHIEbo49HfjrLGfKbZSuWo9iTMwXO+Ca3pRsSpbsMbc7/IU8NKdCZVRRBafVPGnoJeFL76ZOAA84I9fEg== - ua-parser-js@^0.7.30: version "0.7.35" resolved "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.35.tgz" @@ -12276,17 +11458,6 @@ webpack-cli@^4.2.0, webpack-cli@4.x.x: rechoir "^0.7.0" webpack-merge "^5.7.3" -webpack-dev-middleware@^5.3.0, webpack-dev-middleware@5.3.0: - version "5.3.0" - resolved "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.0.tgz" - integrity sha512-MouJz+rXAm9B1OTOYaJnn6rtD/lWZPy2ufQCH3BPs8Rloh/Du6Jze4p7AeLYHkVi0giJnYLaSGDC7S+GM9arhg== - dependencies: - colorette "^2.0.10" - memfs "^3.2.2" - mime-types "^2.1.31" - range-parser "^1.2.1" - schema-utils "^4.0.0" - webpack-dev-middleware@^5.3.1, webpack-dev-middleware@5.3.3: version "5.3.3" resolved "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz" @@ -12369,41 +11540,6 @@ webpack-dev-server@4.11.0: webpack-dev-middleware "^5.3.1" ws "^8.4.2" -webpack-dev-server@4.7.3: - version "4.7.3" - resolved "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.7.3.tgz" - integrity sha512-mlxq2AsIw2ag016nixkzUkdyOE8ST2GTy34uKSABp1c4nhjZvH90D5ZRR+UOLSsG4Z3TFahAi72a3ymRtfRm+Q== - dependencies: - "@types/bonjour" "^3.5.9" - "@types/connect-history-api-fallback" "^1.3.5" - "@types/serve-index" "^1.9.1" - "@types/sockjs" "^0.3.33" - "@types/ws" "^8.2.2" - ansi-html-community "^0.0.8" - bonjour "^3.5.0" - chokidar "^3.5.2" - colorette "^2.0.10" - compression "^1.7.4" - connect-history-api-fallback "^1.6.0" - default-gateway "^6.0.3" - del "^6.0.0" - express "^4.17.1" - graceful-fs "^4.2.6" - html-entities "^2.3.2" - http-proxy-middleware "^2.0.0" - ipaddr.js "^2.0.1" - open "^8.0.9" - p-retry "^4.5.0" - portfinder "^1.0.28" - schema-utils "^4.0.0" - selfsigned "^2.0.0" - serve-index "^1.9.1" - sockjs "^0.3.21" - spdy "^4.0.2" - strip-ansi "^7.0.0" - webpack-dev-middleware "^5.3.0" - ws "^8.1.0" - webpack-merge@^5.7.3, webpack-merge@5.8.0: version "5.8.0" resolved "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz" @@ -12432,7 +11568,7 @@ webpack-subresource-integrity@5.1.0: dependencies: typed-assert "^1.0.8" -"webpack@^4.0.0 || ^5.0.0", "webpack@^4.37.0 || ^5.0.0", webpack@^5.0.0, webpack@^5.1.0, webpack@^5.12.0, webpack@^5.30.0, webpack@^5.72.1, webpack@^5.76.0, webpack@>=2, webpack@>=4.0.1, "webpack@4.x.x || 5.x.x": +"webpack@^4.0.0 || ^5.0.0", "webpack@^4.37.0 || ^5.0.0", webpack@^5.0.0, webpack@^5.1.0, webpack@^5.12.0, webpack@^5.30.0, webpack@^5.72.1, webpack@^5.76.0, webpack@>=2, "webpack@4.x.x || 5.x.x": version "5.78.0" resolved "https://registry.npmjs.org/webpack/-/webpack-5.78.0.tgz" integrity sha512-gT5DP72KInmE/3azEaQrISjTvLYlSM0j1Ezhht/KLVkrqtv10JoP/RXhwmX/frrutOPuSq3o5Vq0ehR/4Vmd1g== @@ -12655,7 +11791,7 @@ ws@^7.4.6: resolved "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz" integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== -ws@^8.1.0, ws@^8.13.0, ws@^8.2.3, ws@^8.4.2, ws@^8.8.0: +ws@^8.13.0, ws@^8.2.3, ws@^8.4.2, ws@^8.8.0: version "8.13.0" resolved "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz" integrity sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA== From 643e75a838913cdf4757e06c8090d1f1d8f8cb51 Mon Sep 17 00:00:00 2001 From: Kristof De Langhe Date: Tue, 11 Apr 2023 17:50:50 +0200 Subject: [PATCH 074/409] 101108: Angular 14 upgrade - build fixes #1 --- src/app/core/cache/builders/link.service.ts | 6 +++--- src/app/core/cache/builders/remote-data-build.service.ts | 2 +- src/config/app-config.interface.ts | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/app/core/cache/builders/link.service.ts b/src/app/core/cache/builders/link.service.ts index b7af54abf7..afc7ab88e4 100644 --- a/src/app/core/cache/builders/link.service.ts +++ b/src/app/core/cache/builders/link.service.ts @@ -60,7 +60,7 @@ export class LinkService { const provider = this.getDataServiceFor(matchingLinkDef.resourceType); if (hasNoValue(provider)) { - throw new Error(`The @link() for ${linkToFollow.name} on ${model.constructor.name} models uses the resource type ${matchingLinkDef.resourceType.value.toUpperCase()}, but there is no service with an @dataService(${matchingLinkDef.resourceType.value.toUpperCase()}) annotation in order to retrieve it`); + throw new Error(`The @link() for ${String(linkToFollow.name)} on ${model.constructor.name} models uses the resource type ${matchingLinkDef.resourceType.value.toUpperCase()}, but there is no service with an @dataService(${matchingLinkDef.resourceType.value.toUpperCase()}) annotation in order to retrieve it`); } const service: HALDataService = Injector.create({ @@ -79,12 +79,12 @@ export class LinkService { return service.findByHref(href, linkToFollow.useCachedVersionIfAvailable, linkToFollow.reRequestOnStale, ...linkToFollow.linksToFollow); } } catch (e) { - console.error(`Something went wrong when using @dataService(${matchingLinkDef.resourceType.value}) ${hasValue(service) ? '' : '(undefined) '}to resolve link ${linkToFollow.name} at ${href}`); + console.error(`Something went wrong when using @dataService(${matchingLinkDef.resourceType.value}) ${hasValue(service) ? '' : '(undefined) '}to resolve link ${String(linkToFollow.name)} at ${href}`); throw e; } } } else if (!linkToFollow.isOptional) { - throw new Error(`followLink('${linkToFollow.name}') was used as a required link for a ${model.constructor.name}, but there is no property on ${model.constructor.name} models with an @link() for ${linkToFollow.name}`); + throw new Error(`followLink('${String(linkToFollow.name)}') was used as a required link for a ${model.constructor.name}, but there is no property on ${model.constructor.name} models with an @link() for ${String(linkToFollow.name)}`); } return EMPTY; diff --git a/src/app/core/cache/builders/remote-data-build.service.ts b/src/app/core/cache/builders/remote-data-build.service.ts index 76529891d4..1124ecfc7a 100644 --- a/src/app/core/cache/builders/remote-data-build.service.ts +++ b/src/app/core/cache/builders/remote-data-build.service.ts @@ -72,7 +72,7 @@ export class RemoteDataBuildService { if (hasValue(obj)) { if (getResourceTypeValueFor((obj as any).type) === PAGINATED_LIST.value) { return this.buildPaginatedList(obj, ...linksToFollow); - } else if (isNotEmpty(linksToFollow)) { + } else if (isNotEmpty(linksToFollow) && obj instanceof HALResource) { return [this.linkService.resolveLinks(obj, ...linksToFollow)]; } } diff --git a/src/config/app-config.interface.ts b/src/config/app-config.interface.ts index e3f8988744..84a30549a7 100644 --- a/src/config/app-config.interface.ts +++ b/src/config/app-config.interface.ts @@ -56,7 +56,7 @@ interface AppConfig extends Config { */ const APP_CONFIG = new InjectionToken('APP_CONFIG'); -const APP_CONFIG_STATE = makeStateKey('APP_CONFIG_STATE'); +const APP_CONFIG_STATE = makeStateKey('APP_CONFIG_STATE'); export { AppConfig, From 2eb91add4d20adb09ba82c08d0158c07ba565fbd Mon Sep 17 00:00:00 2001 From: Kristof De Langhe Date: Wed, 12 Apr 2023 11:34:26 +0200 Subject: [PATCH 075/409] 101108: Automatic ng update @angular/core@15 @angular/cli@15 --- .browserslistrc | 17 - package.json | 28 +- src/main.server.ts | 2 +- tsconfig.json | 5 +- yarn.lock | 1389 +++++++++++++++++++++++++++++++++----------- 5 files changed, 1070 insertions(+), 371 deletions(-) delete mode 100644 .browserslistrc diff --git a/.browserslistrc b/.browserslistrc deleted file mode 100644 index 427441dc93..0000000000 --- a/.browserslistrc +++ /dev/null @@ -1,17 +0,0 @@ -# This file is used by the build system to adjust CSS and JS output to support the specified browsers below. -# For additional information regarding the format and rule options, please see: -# https://github.com/browserslist/browserslist#queries - -# For the full list of supported browsers by the Angular framework, please see: -# https://angular.io/guide/browser-support - -# You can see what browsers were selected by your queries by running: -# npx browserslist - -last 1 Chrome version -last 1 Firefox version -last 2 Edge major versions -last 2 Safari major versions -last 2 iOS major versions -Firefox ESR -not IE 11 # Angular supports IE 11 only as an opt-in. To opt-in, remove the 'not' prefix on this line. diff --git a/package.json b/package.json index 3f3eff4dfc..1dafe10d95 100644 --- a/package.json +++ b/package.json @@ -55,17 +55,17 @@ "ts-node": "10.2.1" }, "dependencies": { - "@angular/animations": "^14.3.0", + "@angular/animations": "^15.2.6", "@angular/cdk": "^13.2.6", - "@angular/common": "^14.3.0", - "@angular/compiler": "^14.3.0", - "@angular/core": "^14.3.0", - "@angular/forms": "^14.3.0", - "@angular/localize": "14.3.0", - "@angular/platform-browser": "^14.3.0", - "@angular/platform-browser-dynamic": "^14.3.0", - "@angular/platform-server": "^14.3.0", - "@angular/router": "^14.3.0", + "@angular/common": "^15.2.6", + "@angular/compiler": "^15.2.6", + "@angular/core": "^15.2.6", + "@angular/forms": "^15.2.6", + "@angular/localize": "15.2.6", + "@angular/platform-browser": "^15.2.6", + "@angular/platform-browser-dynamic": "^15.2.6", + "@angular/platform-server": "^15.2.6", + "@angular/router": "^15.2.6", "@babel/runtime": "7.17.2", "@kolkov/ngx-gallery": "^2.0.1", "@material-ui/core": "^4.11.0", @@ -135,15 +135,15 @@ }, "devDependencies": { "@angular-builders/custom-webpack": "~14.1.0", - "@angular-devkit/build-angular": "^14.2.11", + "@angular-devkit/build-angular": "^15.2.5", "@angular-eslint/builder": "13.1.0", "@angular-eslint/eslint-plugin": "13.1.0", "@angular-eslint/eslint-plugin-template": "13.1.0", "@angular-eslint/schematics": "13.1.0", "@angular-eslint/template-parser": "13.1.0", - "@angular/cli": "^14.2.11", - "@angular/compiler-cli": "^14.3.0", - "@angular/language-service": "^14.3.0", + "@angular/cli": "^15.2.5", + "@angular/compiler-cli": "^15.2.6", + "@angular/language-service": "^15.2.6", "@cypress/schematic": "^1.5.0", "@fortawesome/fontawesome-free": "^6.2.1", "@ngrx/store-devtools": "^13.0.2", diff --git a/src/main.server.ts b/src/main.server.ts index 91425136f8..95747de6cc 100644 --- a/src/main.server.ts +++ b/src/main.server.ts @@ -17,4 +17,4 @@ if (environment.production) { export { ServerAppModule } from './modules/app/server-app.module'; export { ngExpressEngine } from '@nguniversal/express-engine'; -export { renderModule, renderModuleFactory } from '@angular/platform-server'; +export { renderModuleFactory } from '@angular/platform-server'; diff --git a/tsconfig.json b/tsconfig.json index 46aa25d4a9..11b5a03eaf 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -21,7 +21,7 @@ "skipDefaultLibCheck": true, "pretty": true, "allowSyntheticDefaultImports": true, - "target": "es2020", + "target": "ES2022", "typeRoots": [ "node_modules/@types", "src/typings.d.ts" @@ -39,7 +39,8 @@ "types": [ "node", "jasmine" - ] + ], + "useDefineForClassFields": false }, "angularCompilerOptions": { "fullTemplateTypeCheck": true, diff --git a/yarn.lock b/yarn.lock index dce0951924..77f6c43e5f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -52,7 +52,15 @@ "@angular-devkit/core" "14.2.11" rxjs "6.6.7" -"@angular-devkit/build-angular@^14.0.0", "@angular-devkit/build-angular@^14.2.0", "@angular-devkit/build-angular@^14.2.11": +"@angular-devkit/architect@0.1502.5": + version "0.1502.5" + resolved "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1502.5.tgz" + integrity sha512-6KVrXQ/X7W88WSJvYe69ed/2QzQNlObKpj3BWzmcKnA+IvJB37/mvw8VaGFP9y+pDa/b1D1yCDtAJLeP5QY3xg== + dependencies: + "@angular-devkit/core" "15.2.5" + rxjs "6.6.7" + +"@angular-devkit/build-angular@^14.0.0": version "14.2.11" resolved "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-14.2.11.tgz" integrity sha512-O3X7GXcCBCGceVSHT+GIJ2JrRCg2YcO7HtNavpmPrraNr1o+aCdTkmT5WTS2cqWkZBm/z0wqKR8PsX/ZoD2r1A== @@ -122,6 +130,74 @@ optionalDependencies: esbuild "0.15.5" +"@angular-devkit/build-angular@^14.2.0", "@angular-devkit/build-angular@^15.2.5": + version "15.2.5" + resolved "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-15.2.5.tgz" + integrity sha512-D2LxjBtUlgJnPxybOIN0XsENEGkVkqCGBBii5oK84HvgBHXO/EyP1WXpOdb2lOYSUZyjhOOs0q42LCobJoaxUw== + dependencies: + "@ampproject/remapping" "2.2.0" + "@angular-devkit/architect" "0.1502.5" + "@angular-devkit/build-webpack" "0.1502.5" + "@angular-devkit/core" "15.2.5" + "@babel/core" "7.20.12" + "@babel/generator" "7.20.14" + "@babel/helper-annotate-as-pure" "7.18.6" + "@babel/helper-split-export-declaration" "7.18.6" + "@babel/plugin-proposal-async-generator-functions" "7.20.7" + "@babel/plugin-transform-async-to-generator" "7.20.7" + "@babel/plugin-transform-runtime" "7.19.6" + "@babel/preset-env" "7.20.2" + "@babel/runtime" "7.20.13" + "@babel/template" "7.20.7" + "@discoveryjs/json-ext" "0.5.7" + "@ngtools/webpack" "15.2.5" + ansi-colors "4.1.3" + autoprefixer "10.4.13" + babel-loader "9.1.2" + babel-plugin-istanbul "6.1.1" + browserslist "4.21.5" + cacache "17.0.4" + chokidar "3.5.3" + copy-webpack-plugin "11.0.0" + critters "0.0.16" + css-loader "6.7.3" + esbuild-wasm "0.17.8" + glob "8.1.0" + https-proxy-agent "5.0.1" + inquirer "8.2.4" + jsonc-parser "3.2.0" + karma-source-map-support "1.4.0" + less "4.1.3" + less-loader "11.1.0" + license-webpack-plugin "4.0.2" + loader-utils "3.2.1" + magic-string "0.29.0" + mini-css-extract-plugin "2.7.2" + open "8.4.1" + ora "5.4.1" + parse5-html-rewriting-stream "7.0.0" + piscina "3.2.0" + postcss "8.4.21" + postcss-loader "7.0.2" + resolve-url-loader "5.0.0" + rxjs "6.6.7" + sass "1.58.1" + sass-loader "13.2.0" + semver "7.3.8" + source-map-loader "4.0.1" + source-map-support "0.5.21" + terser "5.16.3" + text-table "0.2.0" + tree-kill "1.2.2" + tslib "2.5.0" + webpack "5.76.1" + webpack-dev-middleware "6.0.1" + webpack-dev-server "4.11.1" + webpack-merge "5.8.0" + webpack-subresource-integrity "5.1.0" + optionalDependencies: + esbuild "0.17.8" + "@angular-devkit/build-webpack@0.1402.11": version "0.1402.11" resolved "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1402.11.tgz" @@ -130,6 +206,14 @@ "@angular-devkit/architect" "0.1402.11" rxjs "6.6.7" +"@angular-devkit/build-webpack@0.1502.5": + version "0.1502.5" + resolved "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1502.5.tgz" + integrity sha512-gPkAa4AvQ7BxU+jmVJqrAO18kw/6iks+VUQ+2BVPyHCdqhroANHYdGbZ/pFlZdPmZVzSpusjd6VIbLhbHr/Ohw== + dependencies: + "@angular-devkit/architect" "0.1502.5" + rxjs "6.6.7" + "@angular-devkit/core@^12.2.17", "@angular-devkit/core@12.2.18": version "12.2.18" resolved "https://registry.npmjs.org/@angular-devkit/core/-/core-12.2.18.tgz" @@ -153,6 +237,17 @@ rxjs "6.6.7" source-map "0.7.4" +"@angular-devkit/core@15.2.5": + version "15.2.5" + resolved "https://registry.npmjs.org/@angular-devkit/core/-/core-15.2.5.tgz" + integrity sha512-ZfjEkAe2yYeekc3xjZ/U4pK9nb+w6BFwAEjou6mE8PWZH7iYskm0YCCXkmu+B+zViEcCLhAkJAxu9MwX4efd8g== + dependencies: + ajv "8.12.0" + ajv-formats "2.1.1" + jsonc-parser "3.2.0" + rxjs "6.6.7" + source-map "0.7.4" + "@angular-devkit/schematics@^12.2.17", "@angular-devkit/schematics@12.2.18": version "12.2.18" resolved "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-12.2.18.tgz" @@ -162,14 +257,14 @@ ora "5.4.1" rxjs "6.6.7" -"@angular-devkit/schematics@14.2.11": - version "14.2.11" - resolved "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-14.2.11.tgz" - integrity sha512-OTEOu4uf3kZDcSGYkuESxf/IOlJSn/GdLt63Sd1QwJu6pJSeFxkANw/WEWICZyJfRLNW6fdLJLEGPM9Zt5ZqAg== +"@angular-devkit/schematics@15.2.5": + version "15.2.5" + resolved "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-15.2.5.tgz" + integrity sha512-zm7chQRQtPXQzzSAvK/mbZ+RJ3eP7hlU53yyJ/i6kjWAh3Y5uiSHNYGmqhhAHFuzw4Jhb4OC2S9iycxrqmI8TA== dependencies: - "@angular-devkit/core" "14.2.11" - jsonc-parser "3.1.0" - magic-string "0.26.2" + "@angular-devkit/core" "15.2.5" + jsonc-parser "3.2.0" + magic-string "0.29.0" ora "5.4.1" rxjs "6.6.7" @@ -230,10 +325,10 @@ "@angular-eslint/bundled-angular-compiler" "13.1.0" "@typescript-eslint/experimental-utils" "5.11.0" -"@angular/animations@^14.3.0", "@angular/animations@>=13.0.0 <14", "@angular/animations@>=5.0.0 <14.0.0", "@angular/animations@14.3.0": - version "14.3.0" - resolved "https://registry.npmjs.org/@angular/animations/-/animations-14.3.0.tgz" - integrity sha512-QoBcIKy1ZiU+4qJsAh5Ls20BupWiXiZzKb0s6L9/dntPt5Msr4Ao289XR2P6O1L+kTsCprH9Kt41zyGQ/bkRqg== +"@angular/animations@^15.2.6", "@angular/animations@>=13.0.0 <14", "@angular/animations@>=5.0.0 <14.0.0", "@angular/animations@15.2.6": + version "15.2.6" + resolved "https://registry.npmjs.org/@angular/animations/-/animations-15.2.6.tgz" + integrity sha512-2fEhhj7xTzWHD61B502eXwDclsurkOK7CU+iRdl8EAtEobLRt62sG/XHmJ71UaaniWyI/H0sUSEJuF8TIPcaoQ== dependencies: tslib "^2.3.0" @@ -246,82 +341,110 @@ optionalDependencies: parse5 "^5.0.0" -"@angular/cli@^14.2.11", "@angular/cli@>= 13.0.0 < 14.0.0", "@angular/cli@>=12": - version "14.2.11" - resolved "https://registry.npmjs.org/@angular/cli/-/cli-14.2.11.tgz" - integrity sha512-k4Epob8Xz+9oyC6Ty9SNntTa2wHAvzxfcCi7itefPMcwEU9pqBcAv4XYfyawb5d7n/S5RBNwdsDpjoh2DPtmow== +"@angular/cli@^15.2.5", "@angular/cli@>= 13.0.0 < 14.0.0", "@angular/cli@>=12": + version "15.2.5" + resolved "https://registry.npmjs.org/@angular/cli/-/cli-15.2.5.tgz" + integrity sha512-TmkkeJkdfDkC6b2SNQcLlr1rsl2anc5rrrY3gawOVXYXBExMxAi2SNJsHZzUXfiitW52aZkAyajF1VFazs8PRw== dependencies: - "@angular-devkit/architect" "0.1402.11" - "@angular-devkit/core" "14.2.11" - "@angular-devkit/schematics" "14.2.11" - "@schematics/angular" "14.2.11" + "@angular-devkit/architect" "0.1502.5" + "@angular-devkit/core" "15.2.5" + "@angular-devkit/schematics" "15.2.5" + "@schematics/angular" "15.2.5" "@yarnpkg/lockfile" "1.1.0" ansi-colors "4.1.3" - debug "4.3.4" - ini "3.0.0" + ini "3.0.1" inquirer "8.2.4" - jsonc-parser "3.1.0" - npm-package-arg "9.1.0" - npm-pick-manifest "7.0.1" - open "8.4.0" + jsonc-parser "3.2.0" + npm-package-arg "10.1.0" + npm-pick-manifest "8.0.1" + open "8.4.1" ora "5.4.1" - pacote "13.6.2" + pacote "15.1.0" resolve "1.22.1" - semver "7.3.7" + semver "7.3.8" symbol-observable "4.0.0" - uuid "8.3.2" - yargs "17.5.1" + yargs "17.6.2" -"@angular/common@*", "@angular/common@^11.0.0", "@angular/common@^13.0.0", "@angular/common@^13.0.0 || ^14.0.0-0", "@angular/common@^13.3.4", "@angular/common@^14.2.0", "@angular/common@^14.3.0", "@angular/common@>=10.0.0", "@angular/common@>=13.0.0 <14", "@angular/common@>=13.0.0-0", "@angular/common@>=2.x", "@angular/common@>=5.0.0", "@angular/common@>=5.0.0 <14.0.0", "@angular/common@14.3.0", "@angular/common@5.0.0-alpha - 5 || 6.0.0-alpha - 6 || 7.0.0-alpha - 7 || 8.0.0-alpha - 8 || 9.0.0-alpha - 9 || 10.0.0-alpha - 10 || 11.0.0-alpha - 11 || 12.0.0-alpha - 12 || 13.0.0-alpha - 13 || 14.0.0-alpha - 14": +"@angular/common@*", "@angular/common@^11.0.0", "@angular/common@^13.0.0", "@angular/common@^13.0.0 || ^14.0.0-0", "@angular/common@^13.3.4", "@angular/common@^15.2.6", "@angular/common@>=10.0.0", "@angular/common@>=13.0.0 <14", "@angular/common@>=13.0.0-0", "@angular/common@>=2.x", "@angular/common@>=5.0.0", "@angular/common@>=5.0.0 <14.0.0", "@angular/common@15.2.6", "@angular/common@5.0.0-alpha - 5 || 6.0.0-alpha - 6 || 7.0.0-alpha - 7 || 8.0.0-alpha - 8 || 9.0.0-alpha - 9 || 10.0.0-alpha - 10 || 11.0.0-alpha - 11 || 12.0.0-alpha - 12 || 13.0.0-alpha - 13 || 14.0.0-alpha - 14": + version "15.2.6" + resolved "https://registry.npmjs.org/@angular/common/-/common-15.2.6.tgz" + integrity sha512-kPGJoSkFPXsIeHzcjlal8JC8/jYK9qAr+wv+HDX8O1J2FEzQjwoX4SYvpnvVk5WTqUkxMkRCTMu2YFAAmU1+qg== + dependencies: + tslib "^2.3.0" + +"@angular/common@^14.2.0": version "14.3.0" resolved "https://registry.npmjs.org/@angular/common/-/common-14.3.0.tgz" integrity sha512-pV9oyG3JhGWeQ+TFB0Qub6a1VZWMNZ6/7zEopvYivdqa5yDLLDSBRWb6P80RuONXyGnM1pa7l5nYopX+r/23GQ== dependencies: tslib "^2.3.0" -"@angular/compiler-cli@^13.0.0", "@angular/compiler-cli@^14.0.0", "@angular/compiler-cli@^14.3.0", "@angular/compiler-cli@14.3.0": - version "14.3.0" - resolved "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-14.3.0.tgz" - integrity sha512-eoKpKdQ2X6axMgzcPUMZVYl3bIlTMzMeTo5V29No4BzgiUB+QoOTYGNJZkGRyqTNpwD9uSBJvmT2vG9+eC4ghQ== +"@angular/compiler-cli@^13.0.0", "@angular/compiler-cli@^14.0.0", "@angular/compiler-cli@^15.0.0", "@angular/compiler-cli@^15.2.6", "@angular/compiler-cli@14.3.0", "@angular/compiler-cli@15.2.6": + version "15.2.6" + resolved "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-15.2.6.tgz" + integrity sha512-GHwL4l+NkaUGGdypF+nMFWCmTqvGusTzIriIwpnp38wc8lpmVME2jVodB6sHAkrxFmaHXU/gOCDFK4AnOi6Gmw== dependencies: - "@babel/core" "^7.17.2" + "@babel/core" "7.19.3" + "@jridgewell/sourcemap-codec" "^1.4.14" chokidar "^3.0.0" convert-source-map "^1.5.1" dependency-graph "^0.11.0" - magic-string "^0.26.0" + magic-string "^0.27.0" reflect-metadata "^0.1.2" semver "^7.0.0" - sourcemap-codec "^1.4.8" tslib "^2.3.0" yargs "^17.2.1" -"@angular/compiler@^14.3.0", "@angular/compiler@14.3.0": +"@angular/compiler@^15.2.6", "@angular/compiler@15.2.6": + version "15.2.6" + resolved "https://registry.npmjs.org/@angular/compiler/-/compiler-15.2.6.tgz" + integrity sha512-6oBAIY5KcC1UNsrnWGLcopZ9RD7c0HzpTCQY46N6HytHtUjBvzLbGWZu5MfahPtIjKz9FMVYBX9hugcbVpWnTA== + dependencies: + tslib "^2.3.0" + +"@angular/compiler@14.3.0": version "14.3.0" resolved "https://registry.npmjs.org/@angular/compiler/-/compiler-14.3.0.tgz" integrity sha512-E15Rh0t3vA+bctbKnBCaDmLvc3ix+ZBt6yFZmhZalReQ+KpOlvOJv+L9oiFEgg+rYVl2QdvN7US1fvT0PqswLw== dependencies: tslib "^2.3.0" -"@angular/core@*", "@angular/core@^11.0.0", "@angular/core@^13.0.0", "@angular/core@^13.0.0 || ^14.0.0-0", "@angular/core@^13.3.4", "@angular/core@^14.2.0", "@angular/core@^14.3.0", "@angular/core@>=10.0.0", "@angular/core@>=12", "@angular/core@>=13.0.0 <14", "@angular/core@>=13.0.0-0", "@angular/core@>=2.x", "@angular/core@>=5.0.0", "@angular/core@>=5.0.0 <14.0.0", "@angular/core@14.3.0", "@angular/core@5.0.0-alpha - 5 || 6.0.0-alpha - 6 || 7.0.0-alpha - 7 || 8.0.0-alpha - 8 || 9.0.0-alpha - 9 || 10.0.0-alpha - 10 || 11.0.0-alpha - 11 || 12.0.0-alpha - 12 || 13.0.0-alpha - 13 || 14.0.0-alpha - 14": +"@angular/core@*", "@angular/core@^11.0.0", "@angular/core@^13.0.0", "@angular/core@^13.0.0 || ^14.0.0-0", "@angular/core@^13.3.4", "@angular/core@^15.2.6", "@angular/core@>=10.0.0", "@angular/core@>=12", "@angular/core@>=13.0.0 <14", "@angular/core@>=13.0.0-0", "@angular/core@>=2.x", "@angular/core@>=5.0.0", "@angular/core@>=5.0.0 <14.0.0", "@angular/core@15.2.6", "@angular/core@5.0.0-alpha - 5 || 6.0.0-alpha - 6 || 7.0.0-alpha - 7 || 8.0.0-alpha - 8 || 9.0.0-alpha - 9 || 10.0.0-alpha - 10 || 11.0.0-alpha - 11 || 12.0.0-alpha - 12 || 13.0.0-alpha - 13 || 14.0.0-alpha - 14": + version "15.2.6" + resolved "https://registry.npmjs.org/@angular/core/-/core-15.2.6.tgz" + integrity sha512-eN46OfSOLQGN6AciUvyHOJ8xQxmiEakkxJeoG1jwcSRXCjwSYYnQ/6drnhUpq5p43XXBAIduKfJXNztEPvLAkA== + dependencies: + tslib "^2.3.0" + +"@angular/core@^14.2.0", "@angular/core@14.3.0": version "14.3.0" resolved "https://registry.npmjs.org/@angular/core/-/core-14.3.0.tgz" integrity sha512-wYiwItc0Uyn4FWZ/OAx/Ubp2/WrD3EgUJ476y1XI7yATGPF8n9Ld5iCXT08HOvc4eBcYlDfh90kTXR6/MfhzdQ== dependencies: tslib "^2.3.0" -"@angular/forms@^13.0.0", "@angular/forms@^14.3.0", "@angular/forms@>=10.0.0", "@angular/forms@>=5.0.0 <14.0.0", "@angular/forms@5.0.0-alpha - 5 || 6.0.0-alpha - 6 || 7.0.0-alpha - 7 || 8.0.0-alpha - 8 || 9.0.0-alpha - 9 || 10.0.0-alpha - 10 || 11.0.0-alpha - 11 || 12.0.0-alpha - 12 || 13.0.0-alpha - 13 || 14.0.0-alpha - 14": - version "14.3.0" - resolved "https://registry.npmjs.org/@angular/forms/-/forms-14.3.0.tgz" - integrity sha512-fBZZC2UFMom2AZPjGQzROPXFWO6kvCsPDKctjJwClVC8PuMrkm+RRyiYRdBbt2qxWHEqOZM2OCQo73xUyZOYHw== +"@angular/forms@^13.0.0", "@angular/forms@^15.2.6", "@angular/forms@>=10.0.0", "@angular/forms@>=5.0.0 <14.0.0", "@angular/forms@5.0.0-alpha - 5 || 6.0.0-alpha - 6 || 7.0.0-alpha - 7 || 8.0.0-alpha - 8 || 9.0.0-alpha - 9 || 10.0.0-alpha - 10 || 11.0.0-alpha - 11 || 12.0.0-alpha - 12 || 13.0.0-alpha - 13 || 14.0.0-alpha - 14": + version "15.2.6" + resolved "https://registry.npmjs.org/@angular/forms/-/forms-15.2.6.tgz" + integrity sha512-SdZxsE9MUOVMz0FjOwtx1RN/SGpObnAyZBqXNrN0c4BmJg+faJzvKIBBN102CKpWZOGRoq2YYrgxow9StMhxTw== dependencies: tslib "^2.3.0" -"@angular/language-service@^14.3.0": - version "14.3.0" - resolved "https://registry.npmjs.org/@angular/language-service/-/language-service-14.3.0.tgz" - integrity sha512-Sij3OQzj1UGs1O8H9PxVAY/o27+oqZwQRnib66rsWvtbIBTjHp4FV3dTs5iVcr62GGv4V4Mff/2I82NP10GPQg== +"@angular/language-service@^15.2.6": + version "15.2.6" + resolved "https://registry.npmjs.org/@angular/language-service/-/language-service-15.2.6.tgz" + integrity sha512-q6u4XhFReJ3GtA7dC5rJaEBQPjJUjOz9PlwHSOxZxugFP99ddDNBBFd0caa446G54kQdZFG7j7w7BiAp2/srmQ== -"@angular/localize@^13.0.0", "@angular/localize@^14.0.0", "@angular/localize@14.3.0": +"@angular/localize@^13.0.0", "@angular/localize@^15.0.0", "@angular/localize@15.2.6": + version "15.2.6" + resolved "https://registry.npmjs.org/@angular/localize/-/localize-15.2.6.tgz" + integrity sha512-2WJBYRJ6aulo0fS9BUGr4fsdyk+5WcbZoiFURgs0sNrJtYCd51I9rQNwl3OGyYReNmFx8GgLc4K7+rEKhKfSbA== + dependencies: + "@babel/core" "7.19.3" + glob "8.1.0" + yargs "^17.2.1" + +"@angular/localize@^14.0.0": version "14.3.0" resolved "https://registry.npmjs.org/@angular/localize/-/localize-14.3.0.tgz" integrity sha512-YmwlOEGnFonfDrIcWqlxXVFFjd0Q6yXeHGZCBFBfwbtjIseiJJ4UBmkTUgFeq7qlWevSFQzHdQnraFRGZpnMig== @@ -330,33 +453,33 @@ glob "8.0.3" yargs "^17.2.1" -"@angular/platform-browser-dynamic@^14.3.0", "@angular/platform-browser-dynamic@14.3.0": - version "14.3.0" - resolved "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-14.3.0.tgz" - integrity sha512-rneZiMrIiYRhrkQvdL40E2ErKRn4Zdo6EtjBM9pAmWeyoM8oMnOZb9gz5vhrkNWg06kVMVg0yKqluP5How7j3A== +"@angular/platform-browser-dynamic@^15.2.6", "@angular/platform-browser-dynamic@15.2.6": + version "15.2.6" + resolved "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-15.2.6.tgz" + integrity sha512-ZSyiigpxBWIM5f8t/a28Y3BCzHn1FtI2KsJysE7di5UUflOzwbxbfycVlpiZp0girbDYRyF18vvefvitNh17Gw== dependencies: tslib "^2.3.0" -"@angular/platform-browser@^14.3.0", "@angular/platform-browser@>=5.0.0 <14.0.0", "@angular/platform-browser@14.3.0", "@angular/platform-browser@5.0.0-alpha - 5 || 6.0.0-alpha - 6 || 7.0.0-alpha - 7 || 8.0.0-alpha - 8 || 9.0.0-alpha - 9 || 10.0.0-alpha - 10 || 11.0.0-alpha - 11 || 12.0.0-alpha - 12 || 13.0.0-alpha - 13 || 14.0.0-alpha - 14": - version "14.3.0" - resolved "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-14.3.0.tgz" - integrity sha512-w9Y3740UmTz44T0Egvc+4QV9sEbO61L+aRHbpkLTJdlEGzHByZvxJmJyBYmdqeyTPwc/Zpy7c02frlpfAlyB7A== +"@angular/platform-browser@^15.2.6", "@angular/platform-browser@>=5.0.0 <14.0.0", "@angular/platform-browser@15.2.6", "@angular/platform-browser@5.0.0-alpha - 5 || 6.0.0-alpha - 6 || 7.0.0-alpha - 7 || 8.0.0-alpha - 8 || 9.0.0-alpha - 9 || 10.0.0-alpha - 10 || 11.0.0-alpha - 11 || 12.0.0-alpha - 12 || 13.0.0-alpha - 13 || 14.0.0-alpha - 14": + version "15.2.6" + resolved "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-15.2.6.tgz" + integrity sha512-8afckDEWfYf+cyxs2SboZBJkiCwFgYE8IH24RUW1t3zLC+wfrTr7UEfrCoD4YJRVJdqnPoRWN5gjz98n3n4zsA== dependencies: tslib "^2.3.0" -"@angular/platform-server@^13.3.4", "@angular/platform-server@^14.3.0": - version "14.3.0" - resolved "https://registry.npmjs.org/@angular/platform-server/-/platform-server-14.3.0.tgz" - integrity sha512-JGeyS5T2bpG1wiRPFpVFU6L8OeYYe1cVDQRi1B1Wzd3hZklF0BCck0BHpYIifuhQGoUpsG7t3aDiqJW2Oj9Vaw== +"@angular/platform-server@^13.3.4", "@angular/platform-server@^15.0.0", "@angular/platform-server@^15.2.6": + version "15.2.6" + resolved "https://registry.npmjs.org/@angular/platform-server/-/platform-server-15.2.6.tgz" + integrity sha512-/2Ez8V+1s8MYSzq9sFUACJaxjYm/NbksGuKbwxV4oydN082vVgh96er5cOCLDzJLYHq+AeAkV3hL1kGHH5FFEg== dependencies: domino "^2.1.2" tslib "^2.3.0" xhr2 "^0.2.0" -"@angular/router@^13.0.0", "@angular/router@^14.3.0": - version "14.3.0" - resolved "https://registry.npmjs.org/@angular/router/-/router-14.3.0.tgz" - integrity sha512-uip0V7w7k7xyxxpTPbr7EuMnYLj3FzJrwkLVJSEw3TMMGHt5VU5t4BBa9veGZOta2C205XFrTAHnp8mD+XYY1w== +"@angular/router@^13.0.0", "@angular/router@^15.2.6": + version "15.2.6" + resolved "https://registry.npmjs.org/@angular/router/-/router-15.2.6.tgz" + integrity sha512-yB9uc9Xi9N0dErsugleywBA1KYG+GQ9WWSlri34oe2VsCqZazImn71n4wKPtrm2Xiy/mI23wJcr+jiCAtzp49Q== dependencies: tslib "^2.3.0" @@ -372,12 +495,12 @@ dependencies: "@babel/highlight" "^7.18.6" -"@babel/compat-data@^7.17.7", "@babel/compat-data@^7.18.8", "@babel/compat-data@^7.20.5", "@babel/compat-data@^7.21.4": +"@babel/compat-data@^7.17.7", "@babel/compat-data@^7.18.8", "@babel/compat-data@^7.20.1", "@babel/compat-data@^7.20.5", "@babel/compat-data@^7.21.4": version "7.21.4" resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.21.4.tgz" integrity sha512-/DYyDpeCfaVinT40FPGdkkb+lYSKvsVuMjDAG7jPOWWiM1ibOaB9CXJAlc4d1QpP/U2q2P9jbrSlClKSErd55g== -"@babel/core@^7.0.0", "@babel/core@^7.0.0-0", "@babel/core@^7.12.0", "@babel/core@^7.12.3", "@babel/core@^7.13.0", "@babel/core@^7.17.2", "@babel/core@^7.4.0-0", "@babel/core@7.18.9": +"@babel/core@^7.0.0", "@babel/core@^7.0.0-0", "@babel/core@^7.12.0", "@babel/core@^7.12.3", "@babel/core@^7.13.0", "@babel/core@^7.4.0-0", "@babel/core@7.18.9": version "7.18.9" resolved "https://registry.npmjs.org/@babel/core/-/core-7.18.9.tgz" integrity sha512-1LIb1eL8APMy91/IMW+31ckrfBM4yCoLaVzoDhZUKSM4cu1L1nIidyxkCgzPAgrC5WEz36IPEr/eSeSF9pIn+g== @@ -419,6 +542,48 @@ json5 "^2.2.1" semver "^6.3.0" +"@babel/core@7.19.3": + version "7.19.3" + resolved "https://registry.npmjs.org/@babel/core/-/core-7.19.3.tgz" + integrity sha512-WneDJxdsjEvyKtXKsaBGbDeiyOjR5vYq4HcShxnIbG0qixpoHjI3MqeZM9NDvsojNCEBItQE4juOo/bU6e72gQ== + dependencies: + "@ampproject/remapping" "^2.1.0" + "@babel/code-frame" "^7.18.6" + "@babel/generator" "^7.19.3" + "@babel/helper-compilation-targets" "^7.19.3" + "@babel/helper-module-transforms" "^7.19.0" + "@babel/helpers" "^7.19.0" + "@babel/parser" "^7.19.3" + "@babel/template" "^7.18.10" + "@babel/traverse" "^7.19.3" + "@babel/types" "^7.19.3" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.2.1" + semver "^6.3.0" + +"@babel/core@7.20.12": + version "7.20.12" + resolved "https://registry.npmjs.org/@babel/core/-/core-7.20.12.tgz" + integrity sha512-XsMfHovsUYHFMdrIHkZphTN/2Hzzi78R08NuHfDBehym2VsPDL6Zn/JAD/JQdnRvbSsbQc4mVaU1m6JgtTEElg== + dependencies: + "@ampproject/remapping" "^2.1.0" + "@babel/code-frame" "^7.18.6" + "@babel/generator" "^7.20.7" + "@babel/helper-compilation-targets" "^7.20.7" + "@babel/helper-module-transforms" "^7.20.11" + "@babel/helpers" "^7.20.7" + "@babel/parser" "^7.20.7" + "@babel/template" "^7.20.7" + "@babel/traverse" "^7.20.12" + "@babel/types" "^7.20.7" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.2.2" + semver "^6.3.0" + "@babel/generator@^7.18.10", "@babel/generator@7.18.12": version "7.18.12" resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.18.12.tgz" @@ -428,7 +593,7 @@ "@jridgewell/gen-mapping" "^0.3.2" jsesc "^2.5.1" -"@babel/generator@^7.18.9", "@babel/generator@^7.21.4": +"@babel/generator@^7.18.9", "@babel/generator@^7.19.3", "@babel/generator@^7.21.4": version "7.21.4" resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.21.4.tgz" integrity sha512-NieM3pVIYW2SwGzKoqfPrQsf4xGs9M9AIG3ThppsSRmO+m7eQhmI6amajKMUeIO37wFfsvnvcxQFx6x6iqxDnA== @@ -438,6 +603,15 @@ "@jridgewell/trace-mapping" "^0.3.17" jsesc "^2.5.1" +"@babel/generator@^7.20.7", "@babel/generator@7.20.14": + version "7.20.14" + resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.20.14.tgz" + integrity sha512-AEmuXHdcD3A52HHXxaTmYlb8q/xMEhoRP67B3T4Oq7lbmSoqroMZzjnGj3+i1io3pdnF8iBYVu4Ilj+c4hBxYg== + dependencies: + "@babel/types" "^7.20.7" + "@jridgewell/gen-mapping" "^0.3.2" + jsesc "^2.5.1" + "@babel/helper-annotate-as-pure@^7.18.6", "@babel/helper-annotate-as-pure@7.18.6": version "7.18.6" resolved "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz" @@ -453,7 +627,7 @@ "@babel/helper-explode-assignable-expression" "^7.18.6" "@babel/types" "^7.18.9" -"@babel/helper-compilation-targets@^7.17.7", "@babel/helper-compilation-targets@^7.18.9", "@babel/helper-compilation-targets@^7.20.7": +"@babel/helper-compilation-targets@^7.17.7", "@babel/helper-compilation-targets@^7.18.9", "@babel/helper-compilation-targets@^7.19.3", "@babel/helper-compilation-targets@^7.20.0", "@babel/helper-compilation-targets@^7.20.7": version "7.21.4" resolved "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.21.4.tgz" integrity sha512-Fa0tTuOXZ1iL8IeDFUWCzjZcn+sJGd9RZdH9esYVjEejGmzf+FFYQpMi/kZUk2kPy/q1H3/GPw7np8qar/stfg== @@ -539,7 +713,7 @@ dependencies: "@babel/types" "^7.21.4" -"@babel/helper-module-transforms@^7.18.6", "@babel/helper-module-transforms@^7.18.9", "@babel/helper-module-transforms@^7.20.11", "@babel/helper-module-transforms@^7.21.2": +"@babel/helper-module-transforms@^7.18.6", "@babel/helper-module-transforms@^7.18.9", "@babel/helper-module-transforms@^7.19.0", "@babel/helper-module-transforms@^7.20.11", "@babel/helper-module-transforms@^7.21.2": version "7.21.2" resolved "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.21.2.tgz" integrity sha512-79yj2AR4U/Oqq/WOV7Lx6hUjau1Zfo4cI+JLAVYeMV5XIlbOhmjEk5ulbTc9fMpmlojzZHkUUxAiK+UKn+hNQQ== @@ -601,7 +775,7 @@ dependencies: "@babel/types" "^7.20.0" -"@babel/helper-split-export-declaration@^7.18.6": +"@babel/helper-split-export-declaration@^7.18.6", "@babel/helper-split-export-declaration@7.18.6": version "7.18.6" resolved "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz" integrity sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA== @@ -633,7 +807,7 @@ "@babel/traverse" "^7.20.5" "@babel/types" "^7.20.5" -"@babel/helpers@^7.18.9": +"@babel/helpers@^7.18.9", "@babel/helpers@^7.19.0", "@babel/helpers@^7.20.7": version "7.21.0" resolved "https://registry.npmjs.org/@babel/helpers/-/helpers-7.21.0.tgz" integrity sha512-XXve0CBtOW0pd7MRzzmoyuSj0e3SEzj8pgyFxnTT1NJZL38BD1MK7yYrm8yefRPIDvNNe14xR4FdbHwpInD4rA== @@ -651,7 +825,7 @@ chalk "^2.0.0" js-tokens "^4.0.0" -"@babel/parser@^7.10.3", "@babel/parser@^7.14.7", "@babel/parser@^7.18.10", "@babel/parser@^7.18.9", "@babel/parser@^7.20.7", "@babel/parser@^7.21.4": +"@babel/parser@^7.10.3", "@babel/parser@^7.14.7", "@babel/parser@^7.18.10", "@babel/parser@^7.18.9", "@babel/parser@^7.19.3", "@babel/parser@^7.20.7", "@babel/parser@^7.21.4": version "7.21.4" resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.21.4.tgz" integrity sha512-alVJj7k7zIxqBZ7BTRhz0IqJFxW1VJbm6N8JbcYhQ186df9ZBPbZBmWSqAMXwHGsCJdYks7z/voa3ibiS5bCIw== @@ -682,6 +856,16 @@ "@babel/helper-remap-async-to-generator" "^7.18.9" "@babel/plugin-syntax-async-generators" "^7.8.4" +"@babel/plugin-proposal-async-generator-functions@^7.20.1", "@babel/plugin-proposal-async-generator-functions@7.20.7": + version "7.20.7" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.7.tgz" + integrity sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA== + dependencies: + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-remap-async-to-generator" "^7.18.9" + "@babel/plugin-syntax-async-generators" "^7.8.4" + "@babel/plugin-proposal-class-properties@^7.18.6": version "7.18.6" resolved "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz" @@ -747,7 +931,7 @@ "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-syntax-numeric-separator" "^7.10.4" -"@babel/plugin-proposal-object-rest-spread@^7.18.9": +"@babel/plugin-proposal-object-rest-spread@^7.18.9", "@babel/plugin-proposal-object-rest-spread@^7.20.2": version "7.20.7" resolved "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz" integrity sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg== @@ -836,7 +1020,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.3" -"@babel/plugin-syntax-import-assertions@^7.18.6": +"@babel/plugin-syntax-import-assertions@^7.18.6", "@babel/plugin-syntax-import-assertions@^7.20.0": version "7.20.0" resolved "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.20.0.tgz" integrity sha512-IUh1vakzNoWalR8ch/areW7qFopR2AEw03JlG7BbrDqmQ4X3q9uuipQwSGrUn7oGiemKjtSLDhNtQHzMHr1JdQ== @@ -913,7 +1097,16 @@ dependencies: "@babel/helper-plugin-utils" "^7.20.2" -"@babel/plugin-transform-async-to-generator@^7.18.6", "@babel/plugin-transform-async-to-generator@7.18.6": +"@babel/plugin-transform-async-to-generator@^7.18.6", "@babel/plugin-transform-async-to-generator@7.20.7": + version "7.20.7" + resolved "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.20.7.tgz" + integrity sha512-Uo5gwHPT9vgnSXQxqGtpdufUiWp96gk7yiP4Mp5bm1QMkEmLXBO7PAGYbKoJ6DhAwiNkcHFBol/x5zZZkL/t0Q== + dependencies: + "@babel/helper-module-imports" "^7.18.6" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-remap-async-to-generator" "^7.18.9" + +"@babel/plugin-transform-async-to-generator@7.18.6": version "7.18.6" resolved "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.18.6.tgz" integrity sha512-ARE5wZLKnTgPW7/1ftQmSi1CmkqqHo2DNmtztFhvgtOWSDfq0Cq9/9L+KnZNYSNrydBekhW3rwShduf59RoXag== @@ -929,14 +1122,14 @@ dependencies: "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-block-scoping@^7.18.9": +"@babel/plugin-transform-block-scoping@^7.18.9", "@babel/plugin-transform-block-scoping@^7.20.2": version "7.21.0" resolved "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.21.0.tgz" integrity sha512-Mdrbunoh9SxwFZapeHVrwFmri16+oYotcZysSzhNIVDwIAb1UV+kvnxULSYq9J3/q5MDG+4X6w8QVgD1zhBXNQ== dependencies: "@babel/helper-plugin-utils" "^7.20.2" -"@babel/plugin-transform-classes@^7.18.9": +"@babel/plugin-transform-classes@^7.18.9", "@babel/plugin-transform-classes@^7.20.2": version "7.21.0" resolved "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.21.0.tgz" integrity sha512-RZhbYTCEUAe6ntPehC4hlslPWosNHDox+vAs4On/mCLRLfoDVHf6hVEd7kuxr1RnHwJmxFfUM3cZiZRmPxJPXQ== @@ -959,7 +1152,7 @@ "@babel/helper-plugin-utils" "^7.20.2" "@babel/template" "^7.20.7" -"@babel/plugin-transform-destructuring@^7.18.9": +"@babel/plugin-transform-destructuring@^7.18.9", "@babel/plugin-transform-destructuring@^7.20.2": version "7.21.3" resolved "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.21.3.tgz" integrity sha512-bp6hwMFzuiE4HqYEyoGJ/V2LeIWn+hLVKc4pnj++E5XQptwhtcGmSayM029d/j2X1bPKGTlsyPwAubuU22KhMA== @@ -1019,7 +1212,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-modules-amd@^7.18.6": +"@babel/plugin-transform-modules-amd@^7.18.6", "@babel/plugin-transform-modules-amd@^7.19.6": version "7.20.11" resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.20.11.tgz" integrity sha512-NuzCt5IIYOW0O30UvqktzHYR2ud5bOWbY0yaxWZ6G+aFzOMJvrs5YHNikrbdaT15+KNO31nPOy5Fim3ku6Zb5g== @@ -1027,7 +1220,7 @@ "@babel/helper-module-transforms" "^7.20.11" "@babel/helper-plugin-utils" "^7.20.2" -"@babel/plugin-transform-modules-commonjs@^7.18.6": +"@babel/plugin-transform-modules-commonjs@^7.18.6", "@babel/plugin-transform-modules-commonjs@^7.19.6": version "7.21.2" resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.21.2.tgz" integrity sha512-Cln+Yy04Gxua7iPdj6nOV96smLGjpElir5YwzF0LBPKoPlLDNJePNlrGGaybAJkd0zKRnOVXOgizSqPYMNYkzA== @@ -1036,7 +1229,7 @@ "@babel/helper-plugin-utils" "^7.20.2" "@babel/helper-simple-access" "^7.20.2" -"@babel/plugin-transform-modules-systemjs@^7.18.9": +"@babel/plugin-transform-modules-systemjs@^7.18.9", "@babel/plugin-transform-modules-systemjs@^7.19.6": version "7.20.11" resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.20.11.tgz" integrity sha512-vVu5g9BPQKSFEmvt2TA4Da5N+QVS66EX21d8uoOihC+OCpUoGvzVsXeqFdtAEfVa5BILAeFt+U7yVmLbQnAJmw== @@ -1054,7 +1247,7 @@ "@babel/helper-module-transforms" "^7.18.6" "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-named-capturing-groups-regex@^7.18.6": +"@babel/plugin-transform-named-capturing-groups-regex@^7.18.6", "@babel/plugin-transform-named-capturing-groups-regex@^7.19.1": version "7.20.5" resolved "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.20.5.tgz" integrity sha512-mOW4tTzi5iTLnw+78iEq3gr8Aoq4WNRGpmSlrogqaiCBoR1HFhpU4JkpQFOHfeYx3ReVIFWOQJS4aZBRvuZ6mA== @@ -1077,7 +1270,7 @@ "@babel/helper-plugin-utils" "^7.18.6" "@babel/helper-replace-supers" "^7.18.6" -"@babel/plugin-transform-parameters@^7.18.8", "@babel/plugin-transform-parameters@^7.20.7": +"@babel/plugin-transform-parameters@^7.18.8", "@babel/plugin-transform-parameters@^7.20.1", "@babel/plugin-transform-parameters@^7.20.7": version "7.21.3" resolved "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.21.3.tgz" integrity sha512-Wxc+TvppQG9xWFYatvCGPvZ6+SIUxQ2ZdiBP+PHYMIjnPXD+uThCshaz4NZOnODAtBjjcVQQ/3OKs9LW28purQ== @@ -1118,6 +1311,18 @@ babel-plugin-polyfill-regenerator "^0.4.0" semver "^6.3.0" +"@babel/plugin-transform-runtime@7.19.6": + version "7.19.6" + resolved "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.19.6.tgz" + integrity sha512-PRH37lz4JU156lYFW1p8OxE5i7d6Sl/zV58ooyr+q1J1lnQPyg5tIiXlIwNVhJaY4W3TmOtdc8jqdXQcB1v5Yw== + dependencies: + "@babel/helper-module-imports" "^7.18.6" + "@babel/helper-plugin-utils" "^7.19.0" + babel-plugin-polyfill-corejs2 "^0.3.3" + babel-plugin-polyfill-corejs3 "^0.6.0" + babel-plugin-polyfill-regenerator "^0.4.1" + semver "^6.3.0" + "@babel/plugin-transform-shorthand-properties@^7.18.6": version "7.18.6" resolved "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.18.6.tgz" @@ -1125,7 +1330,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-spread@^7.18.9": +"@babel/plugin-transform-spread@^7.18.9", "@babel/plugin-transform-spread@^7.19.0": version "7.20.7" resolved "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.20.7.tgz" integrity sha512-ewBbHQ+1U/VnH1fxltbJqDeWBU1oNLG8Dj11uIv3xVf7nrQu0bPGe5Rf716r7K5Qz+SqtAOVswoVunoiBtGhxw== @@ -1250,6 +1455,87 @@ core-js-compat "^3.22.1" semver "^6.3.0" +"@babel/preset-env@7.20.2": + version "7.20.2" + resolved "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.20.2.tgz" + integrity sha512-1G0efQEWR1EHkKvKHqbG+IN/QdgwfByUpM5V5QroDzGV2t3S/WXNQd693cHiHTlCFMpr9B6FkPFXDA2lQcKoDg== + dependencies: + "@babel/compat-data" "^7.20.1" + "@babel/helper-compilation-targets" "^7.20.0" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-validator-option" "^7.18.6" + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.18.6" + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.18.9" + "@babel/plugin-proposal-async-generator-functions" "^7.20.1" + "@babel/plugin-proposal-class-properties" "^7.18.6" + "@babel/plugin-proposal-class-static-block" "^7.18.6" + "@babel/plugin-proposal-dynamic-import" "^7.18.6" + "@babel/plugin-proposal-export-namespace-from" "^7.18.9" + "@babel/plugin-proposal-json-strings" "^7.18.6" + "@babel/plugin-proposal-logical-assignment-operators" "^7.18.9" + "@babel/plugin-proposal-nullish-coalescing-operator" "^7.18.6" + "@babel/plugin-proposal-numeric-separator" "^7.18.6" + "@babel/plugin-proposal-object-rest-spread" "^7.20.2" + "@babel/plugin-proposal-optional-catch-binding" "^7.18.6" + "@babel/plugin-proposal-optional-chaining" "^7.18.9" + "@babel/plugin-proposal-private-methods" "^7.18.6" + "@babel/plugin-proposal-private-property-in-object" "^7.18.6" + "@babel/plugin-proposal-unicode-property-regex" "^7.18.6" + "@babel/plugin-syntax-async-generators" "^7.8.4" + "@babel/plugin-syntax-class-properties" "^7.12.13" + "@babel/plugin-syntax-class-static-block" "^7.14.5" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" + "@babel/plugin-syntax-export-namespace-from" "^7.8.3" + "@babel/plugin-syntax-import-assertions" "^7.20.0" + "@babel/plugin-syntax-json-strings" "^7.8.3" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + "@babel/plugin-syntax-private-property-in-object" "^7.14.5" + "@babel/plugin-syntax-top-level-await" "^7.14.5" + "@babel/plugin-transform-arrow-functions" "^7.18.6" + "@babel/plugin-transform-async-to-generator" "^7.18.6" + "@babel/plugin-transform-block-scoped-functions" "^7.18.6" + "@babel/plugin-transform-block-scoping" "^7.20.2" + "@babel/plugin-transform-classes" "^7.20.2" + "@babel/plugin-transform-computed-properties" "^7.18.9" + "@babel/plugin-transform-destructuring" "^7.20.2" + "@babel/plugin-transform-dotall-regex" "^7.18.6" + "@babel/plugin-transform-duplicate-keys" "^7.18.9" + "@babel/plugin-transform-exponentiation-operator" "^7.18.6" + "@babel/plugin-transform-for-of" "^7.18.8" + "@babel/plugin-transform-function-name" "^7.18.9" + "@babel/plugin-transform-literals" "^7.18.9" + "@babel/plugin-transform-member-expression-literals" "^7.18.6" + "@babel/plugin-transform-modules-amd" "^7.19.6" + "@babel/plugin-transform-modules-commonjs" "^7.19.6" + "@babel/plugin-transform-modules-systemjs" "^7.19.6" + "@babel/plugin-transform-modules-umd" "^7.18.6" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.19.1" + "@babel/plugin-transform-new-target" "^7.18.6" + "@babel/plugin-transform-object-super" "^7.18.6" + "@babel/plugin-transform-parameters" "^7.20.1" + "@babel/plugin-transform-property-literals" "^7.18.6" + "@babel/plugin-transform-regenerator" "^7.18.6" + "@babel/plugin-transform-reserved-words" "^7.18.6" + "@babel/plugin-transform-shorthand-properties" "^7.18.6" + "@babel/plugin-transform-spread" "^7.19.0" + "@babel/plugin-transform-sticky-regex" "^7.18.6" + "@babel/plugin-transform-template-literals" "^7.18.9" + "@babel/plugin-transform-typeof-symbol" "^7.18.9" + "@babel/plugin-transform-unicode-escapes" "^7.18.10" + "@babel/plugin-transform-unicode-regex" "^7.18.6" + "@babel/preset-modules" "^0.1.5" + "@babel/types" "^7.20.2" + babel-plugin-polyfill-corejs2 "^0.3.3" + babel-plugin-polyfill-corejs3 "^0.6.0" + babel-plugin-polyfill-regenerator "^0.4.1" + core-js-compat "^3.25.1" + semver "^6.3.0" + "@babel/preset-modules@^0.1.5": version "0.1.5" resolved "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.5.tgz" @@ -1288,7 +1574,14 @@ dependencies: regenerator-runtime "^0.13.4" -"@babel/template@^7.18.10", "@babel/template@^7.18.6", "@babel/template@^7.20.7": +"@babel/runtime@7.20.13": + version "7.20.13" + resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.20.13.tgz" + integrity sha512-gt3PKXs0DBoL9xCvOIIZ2NEqAGZqHjAnmVbfQtB620V0uReIQutpel14KcneZuer7UioY8ALKZ7iocavvzTNFA== + dependencies: + regenerator-runtime "^0.13.11" + +"@babel/template@^7.18.10", "@babel/template@^7.18.6", "@babel/template@^7.20.7", "@babel/template@7.20.7": version "7.20.7" resolved "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz" integrity sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw== @@ -1306,7 +1599,7 @@ "@babel/parser" "^7.18.10" "@babel/types" "^7.18.10" -"@babel/traverse@^7.10.3", "@babel/traverse@^7.18.10", "@babel/traverse@^7.18.9", "@babel/traverse@^7.20.5", "@babel/traverse@^7.20.7", "@babel/traverse@^7.21.0", "@babel/traverse@^7.21.2": +"@babel/traverse@^7.10.3", "@babel/traverse@^7.18.10", "@babel/traverse@^7.18.9", "@babel/traverse@^7.19.3", "@babel/traverse@^7.20.12", "@babel/traverse@^7.20.5", "@babel/traverse@^7.20.7", "@babel/traverse@^7.21.0", "@babel/traverse@^7.21.2": version "7.21.4" resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.21.4.tgz" integrity sha512-eyKrRHKdyZxqDm+fV1iqL9UAHMoIg0nDaGqfIOd8rKH17m5snv7Gn4qgjBoFfLz9APvjFU/ICT00NVCv1Epp8Q== @@ -1322,7 +1615,7 @@ debug "^4.1.0" globals "^11.1.0" -"@babel/types@^7.10.3", "@babel/types@^7.18.10", "@babel/types@^7.18.6", "@babel/types@^7.18.9", "@babel/types@^7.20.0", "@babel/types@^7.20.2", "@babel/types@^7.20.5", "@babel/types@^7.20.7", "@babel/types@^7.21.0", "@babel/types@^7.21.2", "@babel/types@^7.21.4", "@babel/types@^7.4.4": +"@babel/types@^7.10.3", "@babel/types@^7.18.10", "@babel/types@^7.18.6", "@babel/types@^7.18.9", "@babel/types@^7.19.3", "@babel/types@^7.20.0", "@babel/types@^7.20.2", "@babel/types@^7.20.5", "@babel/types@^7.20.7", "@babel/types@^7.21.0", "@babel/types@^7.21.2", "@babel/types@^7.21.4", "@babel/types@^7.4.4": version "7.21.4" resolved "https://registry.npmjs.org/@babel/types/-/types-7.21.4.tgz" integrity sha512-rU2oY501qDxE8Pyo7i/Orqma4ziCOrby0/9mvbDUGEfvZjb279Nk9k19e2fiCxHbRRpY2ZyrgW1eq22mvmOIzA== @@ -1493,12 +1786,7 @@ debug "^3.1.0" lodash.once "^4.1.1" -"@discoveryjs/json-ext@^0.5.0": - version "0.5.6" - resolved "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.6.tgz" - integrity sha512-ws57AidsDvREKrZKYffXddNkyaF14iHNHm8VQnZH6t99E8gczjNN0GpvcGny0imC80yQ0tHz1xVUKk/KFQSUyA== - -"@discoveryjs/json-ext@0.5.7": +"@discoveryjs/json-ext@^0.5.0", "@discoveryjs/json-ext@0.5.7": version "0.5.7" resolved "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz" integrity sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw== @@ -1522,6 +1810,11 @@ esquery "^1.4.0" jsdoc-type-pratt-parser "~3.1.0" +"@esbuild/darwin-x64@0.17.8": + version "0.17.8" + resolved "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.8.tgz" + integrity sha512-n5WOpyvZ9TIdv2V1K3/iIkkJeKmUpKaCTdun9buhGRWfH//osmUjlv4Z5mmWdPWind/VGcVxTHtLfLCOohsOXw== + "@eslint-community/eslint-utils@^4.2.0": version "4.4.0" resolved "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz" @@ -1639,7 +1932,7 @@ "@jridgewell/gen-mapping" "^0.3.0" "@jridgewell/trace-mapping" "^0.3.9" -"@jridgewell/sourcemap-codec@^1.4.10": +"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.13", "@jridgewell/sourcemap-codec@^1.4.14": version "1.4.15" resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz" integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== @@ -1818,6 +2111,11 @@ resolved "https://registry.npmjs.org/@ngtools/webpack/-/webpack-14.2.11.tgz" integrity sha512-4enbLFAp98uTgWYF6OFceQqLcfv2/0brIrNN4iWT9xe/Mh3zdCt+eH42zvNRsqo9WXNWRSLvnx8I924p83LNlw== +"@ngtools/webpack@15.2.5": + version "15.2.5" + resolved "https://registry.npmjs.org/@ngtools/webpack/-/webpack-15.2.5.tgz" + integrity sha512-wD6GY4xghVK+SQL0dy/M3saGx5pqi7+1VHEr+BBI7IUNYGSqPNzylKNxLBgQiTzfkzvbrZ6MhfaMNkhvSCYr5w== + "@nguniversal/builders@^14.2.3": version "14.2.3" resolved "https://registry.npmjs.org/@nguniversal/builders/-/builders-14.2.3.tgz" @@ -1912,28 +2210,34 @@ "@gar/promisify" "^1.1.3" semver "^7.3.5" -"@npmcli/git@^3.0.0": - version "3.0.2" - resolved "https://registry.npmjs.org/@npmcli/git/-/git-3.0.2.tgz" - integrity sha512-CAcd08y3DWBJqJDpfuVL0uijlq5oaXaOJEKHKc4wqrjd00gkvTZB+nFuLn+doOOKddaQS9JfqtNoFCO2LCvA3w== +"@npmcli/fs@^3.1.0": + version "3.1.0" + resolved "https://registry.npmjs.org/@npmcli/fs/-/fs-3.1.0.tgz" + integrity sha512-7kZUAaLscfgbwBQRbvdMYaZOWyMEcPTH/tJjnyAWJ/dvvs9Ef+CERx/qJb9GExJpl1qipaDGn7KqHnFGGixd0w== dependencies: - "@npmcli/promise-spawn" "^3.0.0" + semver "^7.3.5" + +"@npmcli/git@^4.0.0": + version "4.0.4" + resolved "https://registry.npmjs.org/@npmcli/git/-/git-4.0.4.tgz" + integrity sha512-5yZghx+u5M47LghaybLCkdSyFzV/w4OuH12d96HO389Ik9CDsLaDZJVynSGGVJOLn6gy/k7Dz5XYcplM3uxXRg== + dependencies: + "@npmcli/promise-spawn" "^6.0.0" lru-cache "^7.4.4" - mkdirp "^1.0.4" - npm-pick-manifest "^7.0.0" - proc-log "^2.0.0" + npm-pick-manifest "^8.0.0" + proc-log "^3.0.0" promise-inflight "^1.0.1" promise-retry "^2.0.1" semver "^7.3.5" - which "^2.0.2" + which "^3.0.0" -"@npmcli/installed-package-contents@^1.0.7": - version "1.0.7" - resolved "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-1.0.7.tgz" - integrity sha512-9rufe0wnJusCQoLpV9ZPKIVP55itrM5BxOXs10DmdbRfgWtHy1LDyskbwRnBghuB0PrF7pNPOqREVtpz4HqzKw== +"@npmcli/installed-package-contents@^2.0.1": + version "2.0.2" + resolved "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-2.0.2.tgz" + integrity sha512-xACzLPhnfD51GKvTOOuNX2/V4G4mz9/1I2MfDoye9kBM3RYe5g2YbscsaGoTlaWqkxeiapBWyseULVKpSVHtKQ== dependencies: - npm-bundled "^1.1.1" - npm-normalize-package-bin "^1.0.1" + npm-bundled "^3.0.0" + npm-normalize-package-bin "^3.0.0" "@npmcli/move-file@^1.0.1": version "1.1.2" @@ -1951,28 +2255,28 @@ mkdirp "^1.0.4" rimraf "^3.0.2" -"@npmcli/node-gyp@^2.0.0": - version "2.0.0" - resolved "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-2.0.0.tgz" - integrity sha512-doNI35wIe3bBaEgrlPfdJPaCpUR89pJWep4Hq3aRdh6gKazIVWfs0jHttvSSoq47ZXgC7h73kDsUl8AoIQUB+A== - -"@npmcli/promise-spawn@^3.0.0": +"@npmcli/node-gyp@^3.0.0": version "3.0.0" - resolved "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-3.0.0.tgz" - integrity sha512-s9SgS+p3a9Eohe68cSI3fi+hpcZUmXq5P7w0kMlAsWVtR7XbK3ptkZqKT2cK1zLDObJ3sR+8P59sJE0w/KTL1g== - dependencies: - infer-owner "^1.0.4" + resolved "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-3.0.0.tgz" + integrity sha512-gp8pRXC2oOxu0DUE1/M3bYtb1b3/DbJ5aM113+XJBgfXdussRAsX0YOrOhdd8WvnAR6auDBvJomGAkLKA5ydxA== -"@npmcli/run-script@^4.1.0": - version "4.2.1" - resolved "https://registry.npmjs.org/@npmcli/run-script/-/run-script-4.2.1.tgz" - integrity sha512-7dqywvVudPSrRCW5nTHpHgeWnbBtz8cFkOuKrecm6ih+oO9ciydhWt6OF7HlqupRRmB8Q/gECVdB9LMfToJbRg== +"@npmcli/promise-spawn@^6.0.0", "@npmcli/promise-spawn@^6.0.1": + version "6.0.2" + resolved "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-6.0.2.tgz" + integrity sha512-gGq0NJkIGSwdbUt4yhdF8ZrmkGKVz9vAdVzpOfnom+V8PLSmSOVhZwbNvZZS1EYcJN5hzzKBxmmVVAInM6HQLg== dependencies: - "@npmcli/node-gyp" "^2.0.0" - "@npmcli/promise-spawn" "^3.0.0" + which "^3.0.0" + +"@npmcli/run-script@^6.0.0": + version "6.0.0" + resolved "https://registry.npmjs.org/@npmcli/run-script/-/run-script-6.0.0.tgz" + integrity sha512-ql+AbRur1TeOdl1FY+RAwGW9fcr4ZwiVKabdvm93mujGREVuVLbdkXRJDrkTXSdCjaxYydr1wlA2v67jxWG5BQ== + dependencies: + "@npmcli/node-gyp" "^3.0.0" + "@npmcli/promise-spawn" "^6.0.0" node-gyp "^9.0.0" - read-package-json-fast "^2.0.3" - which "^2.0.2" + read-package-json-fast "^3.0.0" + which "^3.0.0" "@nrwl/cli@*", "@nrwl/cli@15.9.2": version "15.9.2" @@ -2113,14 +2417,19 @@ "@angular-devkit/schematics" "12.2.18" jsonc-parser "3.0.0" -"@schematics/angular@14.2.11": - version "14.2.11" - resolved "https://registry.npmjs.org/@schematics/angular/-/angular-14.2.11.tgz" - integrity sha512-tejU2BOc25bQO34mZmTwmtAfOiFtDE/io/yHqYgUsTn804kyMQbz2QOOXN0epdzRYrkAHvH4KV8c2LDyO6iijA== +"@schematics/angular@15.2.5": + version "15.2.5" + resolved "https://registry.npmjs.org/@schematics/angular/-/angular-15.2.5.tgz" + integrity sha512-YN0A5bzuqEmLdwbcQRop9TFj0QVxTC/XCL0K5DfDymVBS2j09NMyLLVc6TDOs+J/fMQr5EwiT149ikzqiUmAcw== dependencies: - "@angular-devkit/core" "14.2.11" - "@angular-devkit/schematics" "14.2.11" - jsonc-parser "3.1.0" + "@angular-devkit/core" "15.2.5" + "@angular-devkit/schematics" "15.2.5" + jsonc-parser "3.2.0" + +"@sigstore/protobuf-specs@^0.1.0": + version "0.1.0" + resolved "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.1.0.tgz" + integrity sha512-a31EnjuIDSX8IXBUib3cYLDRlPMU36AWX4xS8ysLaNu4ZzUesDiPt83pgrW2X1YLMe5L2HbDyaKK5BrL4cNKaQ== "@socket.io/component-emitter@~3.1.0": version "3.1.0" @@ -2157,6 +2466,19 @@ resolved "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.3.tgz" integrity sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ== +"@tufjs/canonical-json@1.0.0": + version "1.0.0" + resolved "https://registry.npmjs.org/@tufjs/canonical-json/-/canonical-json-1.0.0.tgz" + integrity sha512-QTnf++uxunWvG2z3UFNzAoQPHxnSXOwtaI3iJ+AohhV+5vONuArPjJE7aPXPVXfXJsqrVbZBu9b81AJoSd09IQ== + +"@tufjs/models@1.0.2": + version "1.0.2" + resolved "https://registry.npmjs.org/@tufjs/models/-/models-1.0.2.tgz" + integrity sha512-uxarDtxTIK3f8hJS4yFhW/lvTa3tsiQU5iDCRut+NCnOXvNtEul0Ct58NIIcIx9Rkt7OFEK31Ndpqsd663nsew== + dependencies: + "@tufjs/canonical-json" "1.0.0" + minimatch "^8.0.3" + "@types/body-parser@*": version "1.19.2" resolved "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz" @@ -2881,9 +3203,9 @@ ajv@^8.0.0, ajv@8.6.2: uri-js "^4.2.2" ajv@^8.8.0, ajv@^8.8.2: - version "8.11.0" - resolved "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz" - integrity sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg== + version "8.12.0" + resolved "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz" + integrity sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA== dependencies: fast-deep-equal "^3.1.1" json-schema-traverse "^1.0.0" @@ -2900,6 +3222,16 @@ ajv@8.11.0: require-from-string "^2.0.2" uri-js "^4.2.2" +ajv@8.12.0: + version "8.12.0" + resolved "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz" + integrity sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA== + dependencies: + fast-deep-equal "^3.1.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + uri-js "^4.2.2" + angular-idle-preload@3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/angular-idle-preload/-/angular-idle-preload-3.0.0.tgz" @@ -3121,6 +3453,18 @@ autoprefixer@^10.4.13, autoprefixer@^10.4.8: picocolors "^1.0.0" postcss-value-parser "^4.2.0" +autoprefixer@10.4.13: + version "10.4.13" + resolved "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.13.tgz" + integrity sha512-49vKpMqcZYsJjwotvt4+h/BCjJVnhGwcLpDt5xkcaOG3eLrG/HUYLagrihYsQ+qrIBgIzX1Rw7a6L8I/ZA1Atg== + dependencies: + browserslist "^4.21.4" + caniuse-lite "^1.0.30001426" + fraction.js "^4.2.0" + normalize-range "^0.1.2" + picocolors "^1.0.0" + postcss-value-parser "^4.2.0" + available-typed-arrays@^1.0.5: version "1.0.5" resolved "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz" @@ -3180,6 +3524,14 @@ babel-loader@8.2.5: make-dir "^3.1.0" schema-utils "^2.6.5" +babel-loader@9.1.2: + version "9.1.2" + resolved "https://registry.npmjs.org/babel-loader/-/babel-loader-9.1.2.tgz" + integrity sha512-mN14niXW43tddohGl8HPu5yfQq70iUThvFL/4QzESA7GcZoC0eVOhvWdQ8+3UlSjaDE9MVtsW9mxDY07W7VpVA== + dependencies: + find-cache-dir "^3.3.2" + schema-utils "^4.0.0" + babel-plugin-istanbul@6.1.1: version "6.1.1" resolved "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz" @@ -3191,7 +3543,7 @@ babel-plugin-istanbul@6.1.1: istanbul-lib-instrument "^5.0.4" test-exclude "^6.0.0" -babel-plugin-polyfill-corejs2@^0.3.2: +babel-plugin-polyfill-corejs2@^0.3.2, babel-plugin-polyfill-corejs2@^0.3.3: version "0.3.3" resolved "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.3.tgz" integrity sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q== @@ -3208,7 +3560,15 @@ babel-plugin-polyfill-corejs3@^0.5.3: "@babel/helper-define-polyfill-provider" "^0.3.2" core-js-compat "^3.21.0" -babel-plugin-polyfill-regenerator@^0.4.0: +babel-plugin-polyfill-corejs3@^0.6.0: + version "0.6.0" + resolved "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.6.0.tgz" + integrity sha512-+eHqR6OPcBhJOGgsIar7xoAB1GcSwVUA3XjAd7HJNzOXT4wv6/H7KIdA/Nc60cvUlDbKApmqNvD1B1bzOt4nyA== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.3.3" + core-js-compat "^3.25.1" + +babel-plugin-polyfill-regenerator@^0.4.0, babel-plugin-polyfill-regenerator@^0.4.1: version "0.4.1" resolved "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.4.1.tgz" integrity sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw== @@ -3416,7 +3776,7 @@ browser-sync@^2.26.7: ua-parser-js "^1.0.33" yargs "^17.3.1" -browserslist@^4.14.5, browserslist@^4.21.3, browserslist@^4.21.4, browserslist@^4.21.5, browserslist@^4.9.1, "browserslist@>= 4.21.0": +browserslist@^4.14.5, browserslist@^4.21.3, browserslist@^4.21.4, browserslist@^4.21.5, browserslist@^4.9.1, "browserslist@>= 4.21.0", browserslist@4.21.5: version "4.21.5" resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz" integrity sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w== @@ -3500,30 +3860,6 @@ cacache@^15.0.5: tar "^6.0.2" unique-filename "^1.1.1" -cacache@^16.0.0: - version "16.1.3" - resolved "https://registry.npmjs.org/cacache/-/cacache-16.1.3.tgz" - integrity sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ== - dependencies: - "@npmcli/fs" "^2.1.0" - "@npmcli/move-file" "^2.0.0" - chownr "^2.0.0" - fs-minipass "^2.1.0" - glob "^8.0.1" - infer-owner "^1.0.4" - lru-cache "^7.7.1" - minipass "^3.1.6" - minipass-collect "^1.0.2" - minipass-flush "^1.0.5" - minipass-pipeline "^1.2.4" - mkdirp "^1.0.4" - p-map "^4.0.0" - promise-inflight "^1.0.1" - rimraf "^3.0.2" - ssri "^9.0.0" - tar "^6.1.11" - unique-filename "^2.0.0" - cacache@^16.1.0: version "16.1.3" resolved "https://registry.npmjs.org/cacache/-/cacache-16.1.3.tgz" @@ -3548,6 +3884,25 @@ cacache@^16.1.0: tar "^6.1.11" unique-filename "^2.0.0" +cacache@^17.0.0: + version "17.0.5" + resolved "https://registry.npmjs.org/cacache/-/cacache-17.0.5.tgz" + integrity sha512-Y/PRQevNSsjAPWykl9aeGz8Pr+OI6BYM9fYDNMvOkuUiG9IhG4LEmaYrZZZvioMUEQ+cBCxT0v8wrnCURccyKA== + dependencies: + "@npmcli/fs" "^3.1.0" + fs-minipass "^3.0.0" + glob "^9.3.1" + lru-cache "^7.7.1" + minipass "^4.0.0" + minipass-collect "^1.0.2" + minipass-flush "^1.0.5" + minipass-pipeline "^1.2.4" + p-map "^4.0.0" + promise-inflight "^1.0.1" + ssri "^10.0.0" + tar "^6.1.11" + unique-filename "^3.0.0" + cacache@16.1.2: version "16.1.2" resolved "https://registry.npmjs.org/cacache/-/cacache-16.1.2.tgz" @@ -3572,6 +3927,25 @@ cacache@16.1.2: tar "^6.1.11" unique-filename "^1.1.1" +cacache@17.0.4: + version "17.0.4" + resolved "https://registry.npmjs.org/cacache/-/cacache-17.0.4.tgz" + integrity sha512-Z/nL3gU+zTUjz5pCA5vVjYM8pmaw2kxM7JEiE0fv3w77Wj+sFbi70CrBruUWH0uNcEdvLDixFpgA2JM4F4DBjA== + dependencies: + "@npmcli/fs" "^3.1.0" + fs-minipass "^3.0.0" + glob "^8.0.1" + lru-cache "^7.7.1" + minipass "^4.0.0" + minipass-collect "^1.0.2" + minipass-flush "^1.0.5" + minipass-pipeline "^1.2.4" + p-map "^4.0.0" + promise-inflight "^1.0.1" + ssri "^10.0.0" + tar "^6.1.11" + unique-filename "^3.0.0" + cachedir@^2.3.0: version "2.3.0" resolved "https://registry.npmjs.org/cachedir/-/cachedir-2.3.0.tgz" @@ -3595,7 +3969,7 @@ camelcase@^5.3.1: resolved "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz" integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== -caniuse-lite@^1.0.30001449, caniuse-lite@^1.0.30001464: +caniuse-lite@^1.0.30001426, caniuse-lite@^1.0.30001449, caniuse-lite@^1.0.30001464: version "1.0.30001477" resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001477.tgz" integrity sha512-lZim4iUHhGcy5p+Ri/G7m84hJwncj+Kz7S5aD4hoQfslKZJgt0tHc/hafVbqHC5bbhHb+mrW2JOUHkI5KH7toQ== @@ -3716,7 +4090,7 @@ cheerio@1.0.0-rc.10: parse5-htmlparser2-tree-adapter "^6.0.1" tslib "^2.2.0" -chokidar@^3.0.0, chokidar@^3.5.1, chokidar@^3.5.2, chokidar@^3.5.3, "chokidar@>=3.0.0 <4.0.0": +chokidar@^3.0.0, chokidar@^3.5.1, chokidar@^3.5.2, chokidar@^3.5.3, "chokidar@>=3.0.0 <4.0.0", chokidar@3.5.3: version "3.5.3" resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz" integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== @@ -4096,7 +4470,7 @@ copy-webpack-plugin@11.0.0: schema-utils "^4.0.0" serialize-javascript "^6.0.0" -core-js-compat@^3.21.0, core-js-compat@^3.22.1: +core-js-compat@^3.21.0, core-js-compat@^3.22.1, core-js-compat@^3.25.1: version "3.30.0" resolved "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.30.0.tgz" integrity sha512-P5A2h/9mRYZFIAP+5Ab8ns6083IyVpSclU74UNvbGVQ8VM7n3n3/g2yF3AkKQ9NXz2O+ioxLbEWKnDtgsFamhg== @@ -4215,6 +4589,20 @@ css-loader@6.7.1: postcss-value-parser "^4.2.0" semver "^7.3.5" +css-loader@6.7.3: + version "6.7.3" + resolved "https://registry.npmjs.org/css-loader/-/css-loader-6.7.3.tgz" + integrity sha512-qhOH1KlBMnZP8FzRO6YCH9UHXQhVMcEGLyNdb7Hv2cpcmJbW0YrddO+tG1ab5nT41KpHIYGsbeHqxB9xPu1pKQ== + dependencies: + icss-utils "^5.1.0" + postcss "^8.4.19" + postcss-modules-extract-imports "^3.0.0" + postcss-modules-local-by-default "^4.0.0" + postcss-modules-scope "^3.0.0" + postcss-modules-values "^4.0.0" + postcss-value-parser "^4.2.0" + semver "^7.3.8" + css-prefers-color-scheme@^6.0.3: version "6.0.3" resolved "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-6.0.3.tgz" @@ -4244,12 +4632,7 @@ css-what@^6.0.1: resolved "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz" integrity sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw== -cssdb@^7.0.0: - version "7.5.4" - resolved "https://registry.npmjs.org/cssdb/-/cssdb-7.5.4.tgz" - integrity sha512-fGD+J6Jlq+aurfE1VDXlLS4Pt0VtNlu2+YgfGOdMxRyl/HQ9bDiHTwSck1Yz8A97Dt/82izSK6Bp/4nVqacOsg== - -cssdb@^7.1.0: +cssdb@^7.0.0, cssdb@^7.1.0: version "7.5.4" resolved "https://registry.npmjs.org/cssdb/-/cssdb-7.5.4.tgz" integrity sha512-fGD+J6Jlq+aurfE1VDXlLS4Pt0VtNlu2+YgfGOdMxRyl/HQ9bDiHTwSck1Yz8A97Dt/82izSK6Bp/4nVqacOsg== @@ -4422,7 +4805,7 @@ debug@^3.2.7: dependencies: ms "^2.1.1" -debug@^4.1.0, debug@^4.1.1, debug@^4.3.2, debug@^4.3.3, debug@^4.3.4, debug@~4.3.1, debug@~4.3.2, debug@4, debug@4.3.4: +debug@^4.1.0, debug@^4.1.1, debug@^4.3.2, debug@^4.3.3, debug@^4.3.4, debug@~4.3.1, debug@~4.3.2, debug@4: version "4.3.4" resolved "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz" integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== @@ -4838,7 +5221,7 @@ entities@^2.0.0: resolved "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz" integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A== -entities@^4.2.0, entities@^4.4.0: +entities@^4.2.0, entities@^4.3.0, entities@^4.4.0: version "4.4.0" resolved "https://registry.npmjs.org/entities/-/entities-4.4.0.tgz" integrity sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA== @@ -4969,6 +5352,11 @@ esbuild-wasm@0.15.5: resolved "https://registry.npmjs.org/esbuild-wasm/-/esbuild-wasm-0.15.5.tgz" integrity sha512-lTJOEKekN/4JI/eOEq0wLcx53co2N6vaT/XjBz46D1tvIVoUEyM0o2K6txW6gEotf31szFD/J1PbxmnbkGlK9A== +esbuild-wasm@0.17.8: + version "0.17.8" + resolved "https://registry.npmjs.org/esbuild-wasm/-/esbuild-wasm-0.17.8.tgz" + integrity sha512-zCmpxv95E0FuCmvdw1K836UHnj4EdiQnFfjTby35y3LAjRPtXMj3sbHDRHjbD8Mqg5lTwq3knacr/1qIFU51CQ== + esbuild@0.15.5: version "0.15.5" resolved "https://registry.npmjs.org/esbuild/-/esbuild-0.15.5.tgz" @@ -4996,6 +5384,34 @@ esbuild@0.15.5: esbuild-windows-64 "0.15.5" esbuild-windows-arm64 "0.15.5" +esbuild@0.17.8: + version "0.17.8" + resolved "https://registry.npmjs.org/esbuild/-/esbuild-0.17.8.tgz" + integrity sha512-g24ybC3fWhZddZK6R3uD2iF/RIPnRpwJAqLov6ouX3hMbY4+tKolP0VMF3zuIYCaXun+yHwS5IPQ91N2BT191g== + optionalDependencies: + "@esbuild/android-arm" "0.17.8" + "@esbuild/android-arm64" "0.17.8" + "@esbuild/android-x64" "0.17.8" + "@esbuild/darwin-arm64" "0.17.8" + "@esbuild/darwin-x64" "0.17.8" + "@esbuild/freebsd-arm64" "0.17.8" + "@esbuild/freebsd-x64" "0.17.8" + "@esbuild/linux-arm" "0.17.8" + "@esbuild/linux-arm64" "0.17.8" + "@esbuild/linux-ia32" "0.17.8" + "@esbuild/linux-loong64" "0.17.8" + "@esbuild/linux-mips64el" "0.17.8" + "@esbuild/linux-ppc64" "0.17.8" + "@esbuild/linux-riscv64" "0.17.8" + "@esbuild/linux-s390x" "0.17.8" + "@esbuild/linux-x64" "0.17.8" + "@esbuild/netbsd-x64" "0.17.8" + "@esbuild/openbsd-x64" "0.17.8" + "@esbuild/sunos-x64" "0.17.8" + "@esbuild/win32-arm64" "0.17.8" + "@esbuild/win32-ia32" "0.17.8" + "@esbuild/win32-x64" "0.17.8" + escalade@^3.1.1: version "3.1.1" resolved "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz" @@ -5524,7 +5940,7 @@ finalhandler@1.2.0: statuses "2.0.1" unpipe "~1.0.0" -find-cache-dir@^3.3.1: +find-cache-dir@^3.3.1, find-cache-dir@^3.3.2: version "3.3.2" resolved "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz" integrity sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig== @@ -5675,6 +6091,13 @@ fs-minipass@^2.0.0, fs-minipass@^2.1.0: dependencies: minipass "^3.0.0" +fs-minipass@^3.0.0: + version "3.0.1" + resolved "https://registry.npmjs.org/fs-minipass/-/fs-minipass-3.0.1.tgz" + integrity sha512-MhaJDcFRTuLidHrIttu0RDGyyXs/IYHVmlcxfLAEFIWjc1vdLAkdwT7Ace2u7DbitWC0toKMl5eJZRYNVreIMw== + dependencies: + minipass "^4.0.0" + fs-monkey@^1.0.3: version "1.0.3" resolved "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.3.tgz" @@ -5855,6 +6278,26 @@ glob@^8.0.1, glob@8.0.3: minimatch "^5.0.1" once "^1.3.0" +glob@^9.3.0: + version "9.3.5" + resolved "https://registry.npmjs.org/glob/-/glob-9.3.5.tgz" + integrity sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q== + dependencies: + fs.realpath "^1.0.0" + minimatch "^8.0.2" + minipass "^4.2.4" + path-scurry "^1.6.1" + +glob@^9.3.1: + version "9.3.5" + resolved "https://registry.npmjs.org/glob/-/glob-9.3.5.tgz" + integrity sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q== + dependencies: + fs.realpath "^1.0.0" + minimatch "^8.0.2" + minipass "^4.2.4" + path-scurry "^1.6.1" + glob@7.1.4: version "7.1.4" resolved "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz" @@ -5867,6 +6310,17 @@ glob@7.1.4: once "^1.3.0" path-is-absolute "^1.0.0" +glob@8.1.0: + version "8.1.0" + resolved "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz" + integrity sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^5.0.1" + once "^1.3.0" + global-dirs@^3.0.0: version "3.0.1" resolved "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.1.tgz" @@ -6048,10 +6502,10 @@ hoist-non-react-statics@^3.3.0, hoist-non-react-statics@^3.3.2: dependencies: react-is "^16.7.0" -hosted-git-info@^5.0.0: - version "5.2.1" - resolved "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-5.2.1.tgz" - integrity sha512-xIcQYMnhcx2Nr4JTjsFmwwnr9vldugPy9uVm0o87bjqqWMv9GaqsTeT+i99wTl0mk1uLxJtHxLb8kymqTENQsw== +hosted-git-info@^6.0.0: + version "6.1.1" + resolved "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-6.1.1.tgz" + integrity sha512-r0EI+HBMcXadMrugk0GCQ+6BQV39PiWAZVfq7oIckeGiN7sjRGyQxPdft3nQekFTCQbYxLBH+/axZMeH8UX6+w== dependencies: lru-cache "^7.5.1" @@ -6126,7 +6580,7 @@ htmlparser2@^8.0.0: domutils "^3.0.1" entities "^4.4.0" -http-cache-semantics@^4.1.0: +http-cache-semantics@^4.1.0, http-cache-semantics@^4.1.1: version "4.1.1" resolved "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz" integrity sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ== @@ -6311,12 +6765,12 @@ ignore-by-default@^1.0.1: resolved "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz" integrity sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA== -ignore-walk@^5.0.1: - version "5.0.1" - resolved "https://registry.npmjs.org/ignore-walk/-/ignore-walk-5.0.1.tgz" - integrity sha512-yemi4pMf51WKT7khInJqAvsIGzoqYXblnsz0ql8tM+yi1EKYTY1evX4NAbJrLL/Aanr2HyZeluqU+Oi7MGHokw== +ignore-walk@^6.0.0: + version "6.0.2" + resolved "https://registry.npmjs.org/ignore-walk/-/ignore-walk-6.0.2.tgz" + integrity sha512-ezmQ1Dg2b3jVZh2Dh+ar6Eu2MqNSTkyb32HU2MAQQQX9tKM3q/UQ/9lf03lQ5hW+fOeoMnwxwkleZ0xcNp0/qg== dependencies: - minimatch "^5.0.1" + minimatch "^7.4.2" ignore@^5.0.4, ignore@^5.1.8, ignore@^5.2.0: version "5.2.4" @@ -6402,10 +6856,10 @@ ini@2.0.0: resolved "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz" integrity sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA== -ini@3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/ini/-/ini-3.0.0.tgz" - integrity sha512-TxYQaeNW/N8ymDvwAxPyRbhMBtnEwuvaTYpOQkFx1nSeusgezHniEc/l35Vo4iCq/mMiTJbpD7oYxN98hFlfmw== +ini@3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/ini/-/ini-3.0.1.tgz" + integrity sha512-it4HyVAUTKBc6m8e1iXWvXSTdndF7HbdN713+kvLrymxTaU4AUBWrJ4vEooP+V7fexnVD3LKcBshjGGPefSMUQ== inquirer@8.2.4: version "8.2.4" @@ -6996,6 +7450,11 @@ json-parse-even-better-errors@^2.3.0, json-parse-even-better-errors@^2.3.1: resolved "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz" integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== +json-parse-even-better-errors@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.0.tgz" + integrity sha512-iZbGHafX/59r39gPwVPRBGw0QQKnA7tte5pSMrhWOW7swGsVvVTjmfyAV9pNqk8YGT7tRCdxRu8uzcgZwoDooA== + json-schema-traverse@^0.4.1: version "0.4.1" resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz" @@ -7300,6 +7759,13 @@ less-loader@11.0.0: dependencies: klona "^2.0.4" +less-loader@11.1.0: + version "11.1.0" + resolved "https://registry.npmjs.org/less-loader/-/less-loader-11.1.0.tgz" + integrity sha512-C+uDBV7kS7W5fJlUjq5mPBeBVhYpTIm5gB09APT9o3n/ILeaXVsiSFTbZpTJCJwQ/Crczfn3DmfQFwxYusWFug== + dependencies: + klona "^2.0.4" + "less@^3.5.0 || ^4.0.0", less@4.1.3: version "4.1.3" resolved "https://registry.npmjs.org/less/-/less-4.1.3.tgz" @@ -7506,12 +7972,17 @@ lru-cache@^7.14.1, lru-cache@^7.4.4, lru-cache@^7.5.1, lru-cache@^7.7.1: resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz" integrity sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA== -magic-string@^0.26.0: - version "0.26.7" - resolved "https://registry.npmjs.org/magic-string/-/magic-string-0.26.7.tgz" - integrity sha512-hX9XH3ziStPoPhJxLq1syWuZMxbDvGNbVchfrdCtanC7D13888bMFow61x8axrx+GfHLtVeAx2kxL7tTGRl+Ow== +lru-cache@^9.0.0: + version "9.0.1" + resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-9.0.1.tgz" + integrity sha512-C8QsKIN1UIXeOs3iWmiZ1lQY+EnKDojWd37fXy1aSbJvH4iSma1uy2OWuoB3m4SYRli5+CUjDv3Dij5DVoetmg== + +magic-string@^0.27.0: + version "0.27.0" + resolved "https://registry.npmjs.org/magic-string/-/magic-string-0.27.0.tgz" + integrity sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA== dependencies: - sourcemap-codec "^1.4.8" + "@jridgewell/sourcemap-codec" "^1.4.13" magic-string@0.25.7: version "0.25.7" @@ -7520,12 +7991,12 @@ magic-string@0.25.7: dependencies: sourcemap-codec "^1.4.4" -magic-string@0.26.2: - version "0.26.2" - resolved "https://registry.npmjs.org/magic-string/-/magic-string-0.26.2.tgz" - integrity sha512-NzzlXpclt5zAbmo6h6jNc8zl2gNRGHvmsZW4IvZhTC4W7k4OlLP+S5YLussa/r3ixNT66KOQfNORlXHSOy/X4A== +magic-string@0.29.0: + version "0.29.0" + resolved "https://registry.npmjs.org/magic-string/-/magic-string-0.29.0.tgz" + integrity sha512-WcfidHrDjMY+eLjlU+8OvwREqHwpgCeKVBUpQ3OhYYuvfaYCUgcbuBzappNzZvg/v8onU3oQj+BYpkOJe9Iw4Q== dependencies: - sourcemap-codec "^1.4.8" + "@jridgewell/sourcemap-codec" "^1.4.13" make-dir@^2.1.0: version "2.1.0" @@ -7547,7 +8018,7 @@ make-error@^1.1.1: resolved "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz" integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== -make-fetch-happen@^10.0.3, make-fetch-happen@^10.0.6: +make-fetch-happen@^10.0.3: version "10.2.1" resolved "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-10.2.1.tgz" integrity sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w== @@ -7569,6 +8040,48 @@ make-fetch-happen@^10.0.3, make-fetch-happen@^10.0.6: socks-proxy-agent "^7.0.0" ssri "^9.0.0" +make-fetch-happen@^11.0.0: + version "11.0.3" + resolved "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-11.0.3.tgz" + integrity sha512-oPLh5m10lRNNZDjJ2kP8UpboUx2uFXVaVweVe/lWut4iHWcQEmfqSVJt2ihZsFI8HbpwyyocaXbCAWf0g1ukIA== + dependencies: + agentkeepalive "^4.2.1" + cacache "^17.0.0" + http-cache-semantics "^4.1.1" + http-proxy-agent "^5.0.0" + https-proxy-agent "^5.0.0" + is-lambda "^1.0.1" + lru-cache "^7.7.1" + minipass "^4.0.0" + minipass-fetch "^3.0.0" + minipass-flush "^1.0.5" + minipass-pipeline "^1.2.4" + negotiator "^0.6.3" + promise-retry "^2.0.1" + socks-proxy-agent "^7.0.0" + ssri "^10.0.0" + +make-fetch-happen@^11.0.1: + version "11.0.3" + resolved "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-11.0.3.tgz" + integrity sha512-oPLh5m10lRNNZDjJ2kP8UpboUx2uFXVaVweVe/lWut4iHWcQEmfqSVJt2ihZsFI8HbpwyyocaXbCAWf0g1ukIA== + dependencies: + agentkeepalive "^4.2.1" + cacache "^17.0.0" + http-cache-semantics "^4.1.1" + http-proxy-agent "^5.0.0" + https-proxy-agent "^5.0.0" + is-lambda "^1.0.1" + lru-cache "^7.7.1" + minipass "^4.0.0" + minipass-fetch "^3.0.0" + minipass-flush "^1.0.5" + minipass-pipeline "^1.2.4" + negotiator "^0.6.3" + promise-retry "^2.0.1" + socks-proxy-agent "^7.0.0" + ssri "^10.0.0" + manifesto.js@^4.2.0: version "4.2.17" resolved "https://registry.npmjs.org/manifesto.js/-/manifesto.js-4.2.17.tgz" @@ -7627,7 +8140,7 @@ media-typer@0.3.0: resolved "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz" integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== -memfs@^3.4.3: +memfs@^3.4.12, memfs@^3.4.3: version "3.5.0" resolved "https://registry.npmjs.org/memfs/-/memfs-3.5.0.tgz" integrity sha512-yK6o8xVJlQerz57kvPROwTMgx5WtGwC2ZxDtOUsnGl49rHjYkfQoPNZPCKH73VdLE1BwBu/+Fx/NL8NYMUw2aA== @@ -7721,6 +8234,13 @@ mini-css-extract-plugin@2.6.1: dependencies: schema-utils "^4.0.0" +mini-css-extract-plugin@2.7.2: + version "2.7.2" + resolved "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.7.2.tgz" + integrity sha512-EdlUizq13o0Pd+uCp+WO/JpkLvHRVGt97RqfeGhXqAcorYo1ypJSpkV+WDT0vY/kmh/p7wRdJNJtuyK540PXDw== + dependencies: + schema-utils "^4.0.0" + minimalistic-assert@^1.0.0: version "1.0.1" resolved "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz" @@ -7740,6 +8260,27 @@ minimatch@^5.0.1, minimatch@5.1.0: dependencies: brace-expansion "^2.0.1" +minimatch@^7.4.2: + version "7.4.6" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-7.4.6.tgz" + integrity sha512-sBz8G/YjVniEz6lKPNpKxXwazJe4c19fEfV2GDMX6AjFz+MX9uDWIZW8XreVhkFW3fkIdTv/gxWr/Kks5FFAVw== + dependencies: + brace-expansion "^2.0.1" + +minimatch@^8.0.2: + version "8.0.4" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-8.0.4.tgz" + integrity sha512-W0Wvr9HyFXZRGIDgCicunpQ299OKXs9RgZfaukz4qAW/pJhcpUfupc9c+OObPOFueNy8VSrZgEmDtk6Kh4WzDA== + dependencies: + brace-expansion "^2.0.1" + +minimatch@^8.0.3: + version "8.0.4" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-8.0.4.tgz" + integrity sha512-W0Wvr9HyFXZRGIDgCicunpQ299OKXs9RgZfaukz4qAW/pJhcpUfupc9c+OObPOFueNy8VSrZgEmDtk6Kh4WzDA== + dependencies: + brace-expansion "^2.0.1" + minimatch@3.0.5: version "3.0.5" resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.0.5.tgz" @@ -7770,6 +8311,17 @@ minipass-fetch@^2.0.3: optionalDependencies: encoding "^0.1.13" +minipass-fetch@^3.0.0: + version "3.0.1" + resolved "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.1.tgz" + integrity sha512-t9/wowtf7DYkwz8cfMSt0rMwiyNIBXf5CKZ3S5ZMqRqMYT0oLTp0x1WorMI9WTwvaPg21r1JbFxJMum8JrLGfw== + dependencies: + minipass "^4.0.0" + minipass-sized "^1.0.3" + minizlib "^2.1.2" + optionalDependencies: + encoding "^0.1.13" + minipass-flush@^1.0.5: version "1.0.5" resolved "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz" @@ -7806,10 +8358,15 @@ minipass@^3.0.0, minipass@^3.1.1, minipass@^3.1.6: dependencies: yallist "^4.0.0" -minipass@^4.0.0: - version "4.2.7" - resolved "https://registry.npmjs.org/minipass/-/minipass-4.2.7.tgz" - integrity sha512-ScVIgqHcXRMyfflqHmEW0bm8z8rb5McHyOY3ewX9JBgZaR77G7nxq9L/mtV96/QbAAwtbCAHVVLzD1kkyfFQEw== +minipass@^4.0.0, minipass@^4.2.4: + version "4.2.8" + resolved "https://registry.npmjs.org/minipass/-/minipass-4.2.8.tgz" + integrity sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ== + +minipass@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz" + integrity sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ== minizlib@^2.1.1, minizlib@^2.1.2: version "2.1.2" @@ -8105,12 +8662,12 @@ nopt@~1.0.10: dependencies: abbrev "1" -normalize-package-data@^4.0.0: - version "4.0.1" - resolved "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-4.0.1.tgz" - integrity sha512-EBk5QKKuocMJhB3BILuKhmaPjI8vNRSpIfO9woLC6NyHVkKKdVEdAO1mrT0ZfxNR1lKwCcTkuZfmGIFdizZ8Pg== +normalize-package-data@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-5.0.0.tgz" + integrity sha512-h9iPVIfrVZ9wVYQnxFgtw1ugSvGEMOlyPWWtm8BMJhnwyEL/FLbYbTY3V3PpjI/BUK67n9PEWDu6eHzu1fB15Q== dependencies: - hosted-git-info "^5.0.0" + hosted-git-info "^6.0.0" is-core-module "^2.8.1" semver "^7.3.5" validate-npm-package-license "^3.0.4" @@ -8135,79 +8692,64 @@ nouislider@^14.6.3, nouislider@>=9.x: resolved "https://registry.npmjs.org/nouislider/-/nouislider-14.7.0.tgz" integrity sha512-4RtQ1+LHJKesDCNJrXkQcwXAWCrC2aggdLYMstS/G5fEWL+fXZbUA9pwVNHFghMGuFGRATlDLNInRaPeRKzpFQ== -npm-bundled@^1.1.1: - version "1.1.2" - resolved "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.2.tgz" - integrity sha512-x5DHup0SuyQcmL3s7Rx/YQ8sbw/Hzg0rj48eN0dV7hf5cmQq5PXIeioroH3raV1QC1yh3uTYuMThvEQF3iKgGQ== +npm-bundled@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/npm-bundled/-/npm-bundled-3.0.0.tgz" + integrity sha512-Vq0eyEQy+elFpzsKjMss9kxqb9tG3YHg4dsyWuUENuzvSUWe1TCnW/vV9FkhvBk/brEDoDiVd+M1Btosa6ImdQ== dependencies: - npm-normalize-package-bin "^1.0.1" + npm-normalize-package-bin "^3.0.0" -npm-bundled@^2.0.0: - version "2.0.1" - resolved "https://registry.npmjs.org/npm-bundled/-/npm-bundled-2.0.1.tgz" - integrity sha512-gZLxXdjEzE/+mOstGDqR6b0EkhJ+kM6fxM6vUuckuctuVPh80Q6pw/rSZj9s4Gex9GxWtIicO1pc8DB9KZWudw== - dependencies: - npm-normalize-package-bin "^2.0.0" - -npm-install-checks@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-5.0.0.tgz" - integrity sha512-65lUsMI8ztHCxFz5ckCEC44DRvEGdZX5usQFriauxHEwt7upv1FKaQEmAtU0YnOAdwuNWCmk64xYiQABNrEyLA== +npm-install-checks@^6.0.0: + version "6.1.0" + resolved "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-6.1.0.tgz" + integrity sha512-udSGENih/5xKh3Ex+L0PtZcOt0Pa+6ppDLnpG5D49/EhMja3LupaY9E/DtJTxyFBwE09ot7Fc+H4DywnZNWTVA== dependencies: semver "^7.1.1" -npm-normalize-package-bin@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz" - integrity sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA== +npm-normalize-package-bin@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-3.0.0.tgz" + integrity sha512-g+DPQSkusnk7HYXr75NtzkIP4+N81i3RPsGFidF3DzHd9MT9wWngmqoeg/fnHFz5MNdtG4w03s+QnhewSLTT2Q== -npm-normalize-package-bin@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-2.0.0.tgz" - integrity sha512-awzfKUO7v0FscrSpRoogyNm0sajikhBWpU0QMrW09AMi9n1PoKU6WaIqUzuJSQnpciZZmJ/jMZ2Egfmb/9LiWQ== - -npm-package-arg@^9.0.0, npm-package-arg@^9.0.1, npm-package-arg@9.1.0: - version "9.1.0" - resolved "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-9.1.0.tgz" - integrity sha512-4J0GL+u2Nh6OnhvUKXRr2ZMG4lR8qtLp+kv7UiV00Y+nGiSxtttCyIRHCt5L5BNkXQld/RceYItau3MDOoGiBw== +npm-package-arg@^10.0.0, npm-package-arg@10.1.0: + version "10.1.0" + resolved "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-10.1.0.tgz" + integrity sha512-uFyyCEmgBfZTtrKk/5xDfHp6+MdrqGotX/VoOyEEl3mBwiEE5FlBaePanazJSVMPT7vKepcjYBY2ztg9A3yPIA== dependencies: - hosted-git-info "^5.0.0" - proc-log "^2.0.1" + hosted-git-info "^6.0.0" + proc-log "^3.0.0" semver "^7.3.5" - validate-npm-package-name "^4.0.0" + validate-npm-package-name "^5.0.0" -npm-packlist@^5.1.0: - version "5.1.3" - resolved "https://registry.npmjs.org/npm-packlist/-/npm-packlist-5.1.3.tgz" - integrity sha512-263/0NGrn32YFYi4J533qzrQ/krmmrWwhKkzwTuM4f/07ug51odoaNjUexxO4vxlzURHcmYMH1QjvHjsNDKLVg== +npm-packlist@^7.0.0: + version "7.0.4" + resolved "https://registry.npmjs.org/npm-packlist/-/npm-packlist-7.0.4.tgz" + integrity sha512-d6RGEuRrNS5/N84iglPivjaJPxhDbZmlbTwTDX2IbcRHG5bZCdtysYMhwiPvcF4GisXHGn7xsxv+GQ7T/02M5Q== dependencies: - glob "^8.0.1" - ignore-walk "^5.0.1" - npm-bundled "^2.0.0" - npm-normalize-package-bin "^2.0.0" + ignore-walk "^6.0.0" -npm-pick-manifest@^7.0.0, npm-pick-manifest@7.0.1: - version "7.0.1" - resolved "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-7.0.1.tgz" - integrity sha512-IA8+tuv8KujbsbLQvselW2XQgmXWS47t3CB0ZrzsRZ82DbDfkcFunOaPm4X7qNuhMfq+FmV7hQT4iFVpHqV7mg== +npm-pick-manifest@^8.0.0, npm-pick-manifest@8.0.1: + version "8.0.1" + resolved "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-8.0.1.tgz" + integrity sha512-mRtvlBjTsJvfCCdmPtiu2bdlx8d/KXtF7yNXNWe7G0Z36qWA9Ny5zXsI2PfBZEv7SXgoxTmNaTzGSbbzDZChoA== dependencies: - npm-install-checks "^5.0.0" - npm-normalize-package-bin "^1.0.1" - npm-package-arg "^9.0.0" + npm-install-checks "^6.0.0" + npm-normalize-package-bin "^3.0.0" + npm-package-arg "^10.0.0" semver "^7.3.5" -npm-registry-fetch@^13.0.1: - version "13.3.1" - resolved "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-13.3.1.tgz" - integrity sha512-eukJPi++DKRTjSBRcDZSDDsGqRK3ehbxfFUcgaRd0Yp6kRwOwh2WVn0r+8rMB4nnuzvAk6rQVzl6K5CkYOmnvw== +npm-registry-fetch@^14.0.0: + version "14.0.3" + resolved "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-14.0.3.tgz" + integrity sha512-YaeRbVNpnWvsGOjX2wk5s85XJ7l1qQBGAp724h8e2CZFFhMSuw9enom7K1mWVUtvXO1uUSFIAPofQK0pPN0ZcA== dependencies: - make-fetch-happen "^10.0.6" - minipass "^3.1.6" - minipass-fetch "^2.0.3" + make-fetch-happen "^11.0.0" + minipass "^4.0.0" + minipass-fetch "^3.0.0" minipass-json-stream "^1.0.1" minizlib "^2.1.2" - npm-package-arg "^9.0.1" - proc-log "^2.0.0" + npm-package-arg "^10.0.0" + proc-log "^3.0.0" npm-run-path@^4.0.0, npm-run-path@^4.0.1: version "4.0.1" @@ -8382,6 +8924,15 @@ open@^8.0.9, open@^8.4.0, open@8.4.0: is-docker "^2.1.1" is-wsl "^2.2.0" +open@8.4.1: + version "8.4.1" + resolved "https://registry.npmjs.org/open/-/open-8.4.1.tgz" + integrity sha512-/4b7qZNhv6Uhd7jjnREh1NjnPxlTq+XNWPG88Ydkj5AILcA5m3ajvcg57pB24EQjKv0dK62XnDqk9c/hkIG5Kg== + dependencies: + define-lazy-prop "^2.0.0" + is-docker "^2.1.1" + is-wsl "^2.2.0" + opencollective-postinstall@^2.0.2: version "2.0.3" resolved "https://registry.npmjs.org/opencollective-postinstall/-/opencollective-postinstall-2.0.3.tgz" @@ -8506,31 +9057,28 @@ p-try@^2.0.0: resolved "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz" integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== -pacote@13.6.2: - version "13.6.2" - resolved "https://registry.npmjs.org/pacote/-/pacote-13.6.2.tgz" - integrity sha512-Gu8fU3GsvOPkak2CkbojR7vjs3k3P9cA6uazKTHdsdV0gpCEQq2opelnEv30KRQWgVzP5Vd/5umjcedma3MKtg== +pacote@15.1.0: + version "15.1.0" + resolved "https://registry.npmjs.org/pacote/-/pacote-15.1.0.tgz" + integrity sha512-FFcjtIl+BQNfeliSm7MZz5cpdohvUV1yjGnqgVM4UnVF7JslRY0ImXAygdaCDV0jjUADEWu4y5xsDV8brtrTLg== dependencies: - "@npmcli/git" "^3.0.0" - "@npmcli/installed-package-contents" "^1.0.7" - "@npmcli/promise-spawn" "^3.0.0" - "@npmcli/run-script" "^4.1.0" - cacache "^16.0.0" - chownr "^2.0.0" - fs-minipass "^2.1.0" - infer-owner "^1.0.4" - minipass "^3.1.6" - mkdirp "^1.0.4" - npm-package-arg "^9.0.0" - npm-packlist "^5.1.0" - npm-pick-manifest "^7.0.0" - npm-registry-fetch "^13.0.1" - proc-log "^2.0.0" + "@npmcli/git" "^4.0.0" + "@npmcli/installed-package-contents" "^2.0.1" + "@npmcli/promise-spawn" "^6.0.1" + "@npmcli/run-script" "^6.0.0" + cacache "^17.0.0" + fs-minipass "^3.0.0" + minipass "^4.0.0" + npm-package-arg "^10.0.0" + npm-packlist "^7.0.0" + npm-pick-manifest "^8.0.0" + npm-registry-fetch "^14.0.0" + proc-log "^3.0.0" promise-retry "^2.0.1" - read-package-json "^5.0.0" - read-package-json-fast "^2.0.3" - rimraf "^3.0.2" - ssri "^9.0.0" + read-package-json "^6.0.0" + read-package-json-fast "^3.0.0" + sigstore "^1.0.0" + ssri "^10.0.0" tar "^6.1.11" pako@^1.0.3: @@ -8573,6 +9121,15 @@ parse5-html-rewriting-stream@6.0.1: parse5 "^6.0.1" parse5-sax-parser "^6.0.1" +parse5-html-rewriting-stream@7.0.0: + version "7.0.0" + resolved "https://registry.npmjs.org/parse5-html-rewriting-stream/-/parse5-html-rewriting-stream-7.0.0.tgz" + integrity sha512-mazCyGWkmCRWDI15Zp+UiCqMp/0dgEmkZRvhlsqqKYr4SsVm/TvnSpD9fCvqCA2zoWJcfRym846ejWBBHRiYEg== + dependencies: + entities "^4.3.0" + parse5 "^7.0.0" + parse5-sax-parser "^7.0.0" + parse5-htmlparser2-tree-adapter@^6.0.1: version "6.0.1" resolved "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz" @@ -8587,6 +9144,13 @@ parse5-sax-parser@^6.0.1: dependencies: parse5 "^6.0.1" +parse5-sax-parser@^7.0.0: + version "7.0.0" + resolved "https://registry.npmjs.org/parse5-sax-parser/-/parse5-sax-parser-7.0.0.tgz" + integrity sha512-5A+v2SNsq8T6/mG3ahcz8ZtQ0OUFTatxPbeidoMB7tkJSGDY3tdfl4MHovtLQHkEn5CGxijNWRQHhRQ6IRpXKg== + dependencies: + parse5 "^7.0.0" + parse5@^5.0.0: version "5.1.1" resolved "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz" @@ -8634,6 +9198,14 @@ path-parse@^1.0.7: resolved "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz" integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== +path-scurry@^1.6.1: + version "1.6.4" + resolved "https://registry.npmjs.org/path-scurry/-/path-scurry-1.6.4.tgz" + integrity sha512-Qp/9IHkdNiXJ3/Kon++At2nVpnhRiPq/aSvQN+H3U1WZbvNRK0RIQK/o4HMqPoXjpuGJUEWpHSs6Mnjxqh3TQg== + dependencies: + lru-cache "^9.0.0" + minipass "^5.0.0" + path-to-regexp@0.1.7: version "0.1.7" resolved "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz" @@ -8898,6 +9470,15 @@ postcss-loader@7.0.1: klona "^2.0.5" semver "^7.3.7" +postcss-loader@7.0.2: + version "7.0.2" + resolved "https://registry.npmjs.org/postcss-loader/-/postcss-loader-7.0.2.tgz" + integrity sha512-fUJzV/QH7NXUAqV8dWJ9Lg4aTkDCezpTS5HgJ2DvqznexTbSTxgi/dTECvTZ15BwKTtk8G/bqI/QTu2HPd3ZCg== + dependencies: + cosmiconfig "^7.0.0" + klona "^2.0.5" + semver "^7.3.8" + postcss-logical@^5.0.4: version "5.0.4" resolved "https://registry.npmjs.org/postcss-logical/-/postcss-logical-5.0.4.tgz" @@ -9126,7 +9707,7 @@ postcss@^6.0.6: source-map "^0.6.1" supports-color "^5.4.0" -"postcss@^7.0.0 || ^8.0.1", postcss@^8, postcss@^8.0.0, postcss@^8.0.3, postcss@^8.1, postcss@^8.1.0, postcss@^8.2, postcss@^8.2.14, postcss@^8.3, postcss@^8.3.11, postcss@^8.3.7, postcss@^8.4, postcss@^8.4.6, postcss@^8.4.7: +"postcss@^7.0.0 || ^8.0.1", postcss@^8, postcss@^8.0.0, postcss@^8.0.3, postcss@^8.1, postcss@^8.1.0, postcss@^8.2, postcss@^8.2.14, postcss@^8.3, postcss@^8.3.11, postcss@^8.3.7, postcss@^8.4, postcss@^8.4.19, postcss@^8.4.6, postcss@8.4.21: version "8.4.21" resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.21.tgz" integrity sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg== @@ -9143,7 +9724,7 @@ postcss@^7.0.14: picocolors "^0.2.1" source-map "^0.6.1" -postcss@8.4.16: +postcss@^8.4.7, postcss@8.4.16: version "8.4.16" resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.16.tgz" integrity sha512-ipHE1XBvKzm5xI7hiHCZJCSugxvsdq2mPnsq5+UF+VHCjiBvtDrlxJfMBToWaP9D5XlgNmcFGqoHmUn0EYEaRQ== @@ -9167,10 +9748,10 @@ pretty-bytes@^5.3.0, pretty-bytes@^5.6.0: resolved "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz" integrity sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg== -proc-log@^2.0.0, proc-log@^2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/proc-log/-/proc-log-2.0.1.tgz" - integrity sha512-Kcmo2FhfDTXdcbfDH76N7uBYHINxc/8GW7UAVuVP9I+Va3uHSerrnKV6dLooga/gh7GlgzuCCr/eoldnL1muGw== +proc-log@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/proc-log/-/proc-log-3.0.0.tgz" + integrity sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A== process-nextick-args@~2.0.0: version "2.0.1" @@ -9534,23 +10115,23 @@ read-cache@^1.0.0: dependencies: pify "^2.3.0" -read-package-json-fast@^2.0.3: - version "2.0.3" - resolved "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-2.0.3.tgz" - integrity sha512-W/BKtbL+dUjTuRL2vziuYhp76s5HZ9qQhd/dKfWIZveD0O40453QNyZhC0e63lqZrAQ4jiOapVoeJ7JrszenQQ== +read-package-json-fast@^3.0.0: + version "3.0.2" + resolved "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-3.0.2.tgz" + integrity sha512-0J+Msgym3vrLOUB3hzQCuZHII0xkNGCtz/HJH9xZshwv9DbDwkw1KaE3gx/e2J5rpEY5rtOy6cyhKOPrkP7FZw== dependencies: - json-parse-even-better-errors "^2.3.0" - npm-normalize-package-bin "^1.0.1" + json-parse-even-better-errors "^3.0.0" + npm-normalize-package-bin "^3.0.0" -read-package-json@^5.0.0: - version "5.0.2" - resolved "https://registry.npmjs.org/read-package-json/-/read-package-json-5.0.2.tgz" - integrity sha512-BSzugrt4kQ/Z0krro8zhTwV1Kd79ue25IhNN/VtHFy1mG/6Tluyi+msc0UpwaoQzxSHa28mntAjIZY6kEgfR9Q== +read-package-json@^6.0.0: + version "6.0.1" + resolved "https://registry.npmjs.org/read-package-json/-/read-package-json-6.0.1.tgz" + integrity sha512-AaHqXxfAVa+fNL07x8iAghfKOds/XXsu7zoouIVsbm7PEbQ3nMWXlvjcbrNLjElnUHWQtAo4QEa0RXuvD4XlpA== dependencies: - glob "^8.0.1" - json-parse-even-better-errors "^2.3.1" - normalize-package-data "^4.0.0" - npm-normalize-package-bin "^2.0.0" + glob "^9.3.0" + json-parse-even-better-errors "^3.0.0" + normalize-package-data "^5.0.0" + npm-normalize-package-bin "^3.0.0" readable-stream@^2.0.1: version "2.3.8" @@ -9946,6 +10527,14 @@ sass-loader@13.0.2: klona "^2.0.4" neo-async "^2.6.2" +sass-loader@13.2.0: + version "13.2.0" + resolved "https://registry.npmjs.org/sass-loader/-/sass-loader-13.2.0.tgz" + integrity sha512-JWEp48djQA4nbZxmgC02/Wh0eroSUutulROUusYJO9P9zltRbNN80JCBHqRGzjd4cmZCa/r88xgfkjGD0TXsHg== + dependencies: + klona "^2.0.4" + neo-async "^2.6.2" + sass-resources-loader@^2.1.1: version "2.2.5" resolved "https://registry.npmjs.org/sass-resources-loader/-/sass-resources-loader-2.2.5.tgz" @@ -9972,6 +10561,15 @@ sass@1.54.4: immutable "^4.0.0" source-map-js ">=0.6.2 <2.0.0" +sass@1.58.1: + version "1.58.1" + resolved "https://registry.npmjs.org/sass/-/sass-1.58.1.tgz" + integrity sha512-bnINi6nPXbP1XNRaranMFEBZWUfdW/AF16Ql5+ypRxfTvCRTTKrLsMIakyDcayUt2t/RZotmL4kgJwNH5xO+bg== + dependencies: + chokidar ">=3.0.0 <4.0.0" + immutable "^4.0.0" + source-map-js ">=0.6.2 <2.0.0" + sax@^1.2.4, sax@~1.2.4: version "1.2.4" resolved "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz" @@ -10100,20 +10698,20 @@ semver@^7.3.4: dependencies: lru-cache "^6.0.0" -semver@^7.3.5, semver@^7.3.7, semver@7.3.7: - version "7.3.7" - resolved "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz" - integrity sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g== - dependencies: - lru-cache "^6.0.0" - -semver@^7.3.8: +semver@^7.3.5, 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== dependencies: lru-cache "^6.0.0" +semver@^7.3.8, semver@7.3.8: + version "7.3.8" + resolved "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz" + integrity sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A== + 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" @@ -10126,6 +10724,13 @@ semver@7.3.4: dependencies: lru-cache "^6.0.0" +semver@7.3.7: + version "7.3.7" + resolved "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz" + integrity sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g== + dependencies: + lru-cache "^6.0.0" + send@0.16.2: version "0.16.2" resolved "https://registry.npmjs.org/send/-/send-0.16.2.tgz" @@ -10274,6 +10879,15 @@ signal-exit@^3.0.2, signal-exit@^3.0.3, signal-exit@^3.0.7: resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz" integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== +sigstore@^1.0.0: + version "1.2.0" + resolved "https://registry.npmjs.org/sigstore/-/sigstore-1.2.0.tgz" + integrity sha512-Fr9+W1nkBSIZCkJQR7jDn/zI0UXNsVpp+7mDQkCnZOIxG9p6yNXBx9xntHsfUyYHE55XDkkVV3+rYbrkzAeesA== + dependencies: + "@sigstore/protobuf-specs" "^0.1.0" + make-fetch-happen "^11.0.1" + tuf-js "^1.0.0" + simple-update-notifier@^1.0.7: version "1.1.0" resolved "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-1.1.0.tgz" @@ -10420,6 +11034,15 @@ source-map-loader@4.0.0: iconv-lite "^0.6.3" source-map-js "^1.0.2" +source-map-loader@4.0.1: + version "4.0.1" + resolved "https://registry.npmjs.org/source-map-loader/-/source-map-loader-4.0.1.tgz" + integrity sha512-oqXpzDIByKONVY8g1NUPOTQhe0UTU5bWUl32GSkqK2LjJj0HmwTMVKxcUip0RgAYhY1mqgOxjbQM48a0mmeNfA== + dependencies: + abab "^2.0.6" + iconv-lite "^0.6.3" + source-map-js "^1.0.2" + source-map-support@^0.5.17, source-map-support@^0.5.5, source-map-support@~0.5.20, source-map-support@0.5.21: version "0.5.21" resolved "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz" @@ -10453,7 +11076,7 @@ source-map@0.7.4: resolved "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz" integrity sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA== -sourcemap-codec@^1.4.4, sourcemap-codec@^1.4.8: +sourcemap-codec@^1.4.4: version "1.4.8" resolved "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz" integrity sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA== @@ -10536,6 +11159,13 @@ sshpk@^1.14.1: safer-buffer "^2.0.2" tweetnacl "~0.14.0" +ssri@^10.0.0: + version "10.0.3" + resolved "https://registry.npmjs.org/ssri/-/ssri-10.0.3.tgz" + integrity sha512-lJtX/BFPI/VEtxZmLfeh7pzisIs6micwZ3eruD3+ds9aPsXKlYpwDS2Q7omD6WC42WO9+bnUSzlMmfv8uK8meg== + dependencies: + minipass "^4.0.0" + ssri@^8.0.1: version "8.0.1" resolved "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz" @@ -10810,6 +11440,16 @@ terser@5.14.2: commander "^2.20.0" source-map-support "~0.5.20" +terser@5.16.3: + version "5.16.3" + resolved "https://registry.npmjs.org/terser/-/terser-5.16.3.tgz" + integrity sha512-v8wWLaS/xt3nE9dgKEWhNUFP6q4kngO5B8eYFUuebsu7Dw/UNAnpUod6UHo04jSSkv8TzKHjZDSd7EXdDQAl8Q== + dependencies: + "@jridgewell/source-map" "^0.3.2" + acorn "^8.5.0" + commander "^2.20.0" + source-map-support "~0.5.20" + test-exclude@^6.0.0: version "6.0.0" resolved "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz" @@ -11017,7 +11657,7 @@ tslib@^1.9.0: resolved "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== -tslib@^2.0.0, tslib@^2.0.3, tslib@^2.1.0, tslib@^2.2.0, tslib@^2.3.0, tslib@^2.3.1, tslib@^2.4.0: +tslib@^2.0.0, tslib@^2.0.3, tslib@^2.1.0, tslib@^2.2.0, tslib@^2.3.0, tslib@^2.3.1, tslib@^2.4.0, tslib@2.5.0: version "2.5.0" resolved "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz" integrity sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg== @@ -11039,6 +11679,14 @@ tsutils@^3.21.0: dependencies: tslib "^1.8.1" +tuf-js@^1.0.0: + version "1.1.3" + resolved "https://registry.npmjs.org/tuf-js/-/tuf-js-1.1.3.tgz" + integrity sha512-jGYi5nG/kqgfTFQSdoN6PW9eIn+XRZqdXku+fSwNk6UpWIsWaV7pzAqPgFr85edOPhoyJDyBqCS+DCnHroMvrw== + dependencies: + "@tufjs/models" "1.0.2" + make-fetch-happen "^11.0.1" + tunnel-agent@^0.6.0: version "0.6.0" resolved "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz" @@ -11116,7 +11764,7 @@ typescript-tuple@^2.2.1: dependencies: typescript-compare "^0.0.2" -typescript@*, "typescript@^3.7.5 || ^4.0.0 || ^5.0.0", typescript@>=2.7, "typescript@>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta", "typescript@>=3.2.x || >= 4.x", typescript@>=3.7.5, "typescript@>=4.4.3 <4.7", "typescript@>=4.6.2 <4.9", typescript@~4.8.4: +typescript@*, "typescript@^3.7.5 || ^4.0.0 || ^5.0.0", typescript@>=2.7, "typescript@>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta", "typescript@>=3.2.x || >= 4.x", typescript@>=3.7.5, "typescript@>=4.4.3 <4.7", "typescript@>=4.6.2 <4.9", "typescript@>=4.8.2 <5.0", typescript@~4.8.4: version "4.8.4" resolved "https://registry.npmjs.org/typescript/-/typescript-4.8.4.tgz" integrity sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ== @@ -11198,6 +11846,13 @@ unique-filename@^2.0.0: dependencies: unique-slug "^3.0.0" +unique-filename@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/unique-filename/-/unique-filename-3.0.0.tgz" + integrity sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g== + dependencies: + unique-slug "^4.0.0" + unique-slug@^2.0.0: version "2.0.2" resolved "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz" @@ -11212,6 +11867,13 @@ unique-slug@^3.0.0: dependencies: imurmurhash "^0.1.4" +unique-slug@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/unique-slug/-/unique-slug-4.0.0.tgz" + integrity sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ== + dependencies: + imurmurhash "^0.1.4" + universalify@^0.1.0: version "0.1.2" resolved "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz" @@ -11285,7 +11947,7 @@ uuid@^3.3.2: resolved "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz" integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== -uuid@^8.1.0, uuid@^8.3.2, uuid@8.3.2: +uuid@^8.1.0, uuid@^8.3.2: version "8.3.2" resolved "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz" integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== @@ -11313,10 +11975,10 @@ validate-npm-package-license@^3.0.4: spdx-correct "^3.0.0" spdx-expression-parse "^3.0.0" -validate-npm-package-name@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-4.0.0.tgz" - integrity sha512-mzR0L8ZDktZjpX4OB46KT+56MAhl4EIazWP/+G/HPGuvfdaqg4YsCdtOm6U9+LOFyYDoh4dpnpxZRB9MQQns5Q== +validate-npm-package-name@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-5.0.0.tgz" + integrity sha512-YuKoXDAhBYxY7SfOKxHBDoSyENFeW5VvIIQp2TGQuit8gpK6MnWaQelBKxso72DoxTZfZdcP3W90LqpSkgPzLQ== dependencies: builtins "^5.0.0" @@ -11469,6 +12131,17 @@ webpack-dev-middleware@^5.3.1, webpack-dev-middleware@5.3.3: range-parser "^1.2.1" schema-utils "^4.0.0" +webpack-dev-middleware@6.0.1: + version "6.0.1" + resolved "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-6.0.1.tgz" + integrity sha512-PZPZ6jFinmqVPJZbisfggDiC+2EeGZ1ZByyMP5sOFJcPPWSexalISz+cvm+j+oYPT7FIJyxT76esjnw9DhE5sw== + dependencies: + colorette "^2.0.10" + memfs "^3.4.12" + mime-types "^2.1.31" + range-parser "^1.2.1" + schema-utils "^4.0.0" + webpack-dev-server@^4.0.0, webpack-dev-server@^4.5.0: version "4.13.2" resolved "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.13.2.tgz" @@ -11540,6 +12213,41 @@ webpack-dev-server@4.11.0: webpack-dev-middleware "^5.3.1" ws "^8.4.2" +webpack-dev-server@4.11.1: + version "4.11.1" + resolved "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.11.1.tgz" + integrity sha512-lILVz9tAUy1zGFwieuaQtYiadImb5M3d+H+L1zDYalYoDl0cksAB1UNyuE5MMWJrG6zR1tXkCP2fitl7yoUJiw== + dependencies: + "@types/bonjour" "^3.5.9" + "@types/connect-history-api-fallback" "^1.3.5" + "@types/express" "^4.17.13" + "@types/serve-index" "^1.9.1" + "@types/serve-static" "^1.13.10" + "@types/sockjs" "^0.3.33" + "@types/ws" "^8.5.1" + ansi-html-community "^0.0.8" + bonjour-service "^1.0.11" + chokidar "^3.5.3" + colorette "^2.0.10" + compression "^1.7.4" + connect-history-api-fallback "^2.0.0" + default-gateway "^6.0.3" + express "^4.17.3" + graceful-fs "^4.2.6" + html-entities "^2.3.2" + http-proxy-middleware "^2.0.3" + ipaddr.js "^2.0.1" + open "^8.0.9" + p-retry "^4.5.0" + rimraf "^3.0.2" + schema-utils "^4.0.0" + selfsigned "^2.1.1" + serve-index "^1.9.1" + sockjs "^0.3.24" + spdy "^4.0.2" + webpack-dev-middleware "^5.3.1" + ws "^8.4.2" + webpack-merge@^5.7.3, webpack-merge@5.8.0: version "5.8.0" resolved "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz" @@ -11568,7 +12276,7 @@ webpack-subresource-integrity@5.1.0: dependencies: typed-assert "^1.0.8" -"webpack@^4.0.0 || ^5.0.0", "webpack@^4.37.0 || ^5.0.0", webpack@^5.0.0, webpack@^5.1.0, webpack@^5.12.0, webpack@^5.30.0, webpack@^5.72.1, webpack@^5.76.0, webpack@>=2, "webpack@4.x.x || 5.x.x": +"webpack@^4.0.0 || ^5.0.0", "webpack@^4.37.0 || ^5.0.0", webpack@^5.0.0, webpack@^5.1.0, webpack@^5.12.0, webpack@^5.30.0, webpack@^5.72.1, webpack@^5.76.0, webpack@>=5, "webpack@4.x.x || 5.x.x": version "5.78.0" resolved "https://registry.npmjs.org/webpack/-/webpack-5.78.0.tgz" integrity sha512-gT5DP72KInmE/3azEaQrISjTvLYlSM0j1Ezhht/KLVkrqtv10JoP/RXhwmX/frrutOPuSq3o5Vq0ehR/4Vmd1g== @@ -11598,7 +12306,7 @@ webpack-subresource-integrity@5.1.0: watchpack "^2.4.0" webpack-sources "^3.2.3" -webpack@^5.54.0, webpack@5.76.1: +webpack@^5.54.0, webpack@>=2, webpack@5.76.1: version "5.76.1" resolved "https://registry.npmjs.org/webpack/-/webpack-5.76.1.tgz" integrity sha512-4+YIK4Abzv8172/SGqObnUjaIHjLEuUasz9EwQj/9xmPPkYJy2Mh03Q/lJfSD3YLzbxy5FeTq5Uw0323Oh6SJQ== @@ -11736,6 +12444,13 @@ which@^2.0.1, which@^2.0.2: dependencies: isexe "^2.0.0" +which@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/which/-/which-3.0.0.tgz" + integrity sha512-nla//68K9NU6yRiwDY/Q8aU6siKlSs64aEC7+IV56QoAuyQT2ovsJcgGYGyqMOmI/CGN1BOR6mM5EN0FBO+zyQ== + dependencies: + isexe "^2.0.0" + wicked-good-xpath@1.3.0: version "1.3.0" resolved "https://registry.npmjs.org/wicked-good-xpath/-/wicked-good-xpath-1.3.0.tgz" @@ -11856,7 +12571,7 @@ yargs-parser@^20.2.2: resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz" integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== -yargs-parser@^21.0.0, yargs-parser@^21.1.1, yargs-parser@21.1.1: +yargs-parser@^21.1.1, yargs-parser@21.1.1: version "21.1.1" resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz" integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== @@ -11905,18 +12620,18 @@ yargs@17.1.1: y18n "^5.0.5" yargs-parser "^20.2.2" -yargs@17.5.1: - version "17.5.1" - resolved "https://registry.npmjs.org/yargs/-/yargs-17.5.1.tgz" - integrity sha512-t6YAJcxDkNX7NFYiVtKvWUz8l+PaKTLiL63mJYWR2GnHq2gjEWISzsLp9wg3aY36dY1j+gfIEL3pIF+XlJJfbA== +yargs@17.6.2: + version "17.6.2" + resolved "https://registry.npmjs.org/yargs/-/yargs-17.6.2.tgz" + integrity sha512-1/9UrdHjDZc0eOU0HxOHoS78C69UD3JRMvzlJ7S79S2nTaWRA/whGCTV8o9e/N/1Va9YIV7Q4sOxD8VV4pCWOw== dependencies: - cliui "^7.0.2" + cliui "^8.0.1" escalade "^3.1.1" get-caller-file "^2.0.5" require-directory "^2.1.1" string-width "^4.2.3" y18n "^5.0.5" - yargs-parser "^21.0.0" + yargs-parser "^21.1.1" yauzl@^2.10.0: version "2.10.0" @@ -11936,7 +12651,7 @@ yocto-queue@^0.1.0: resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz" integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== -"zone.js@~0.11.4 || ~0.12.0", zone.js@~0.11.5: +"zone.js@~0.11.4 || ~0.12.0", "zone.js@~0.11.4 || ~0.12.0 || ~0.13.0", zone.js@~0.11.5: version "0.11.8" resolved "https://registry.npmjs.org/zone.js/-/zone.js-0.11.8.tgz" integrity sha512-82bctBg2hKcEJ21humWIkXRlLBBmrc3nN7DFh5LGGhcyycO2S7FN8NmdvlcKaGFDNVL4/9kFLmwmInTavdJERA== From 0327f1d856a793377213709f4a438f7261ba4c0c Mon Sep 17 00:00:00 2001 From: Kristof De Langhe Date: Wed, 12 Apr 2023 11:37:25 +0200 Subject: [PATCH 076/409] 101108: Automatic ng update @nguniversal/builders@15 --- package.json | 2 +- yarn.lock | 142 +++++++++++++++++++++++++++++---------------------- 2 files changed, 82 insertions(+), 62 deletions(-) diff --git a/package.json b/package.json index 1dafe10d95..40cae302d1 100644 --- a/package.json +++ b/package.json @@ -148,7 +148,7 @@ "@fortawesome/fontawesome-free": "^6.2.1", "@ngrx/store-devtools": "^13.0.2", "@ngtools/webpack": "^13.2.6", - "@nguniversal/builders": "^14.2.3", + "@nguniversal/builders": "^15.2.0", "@types/deep-freeze": "0.1.2", "@types/ejs": "^3.1.1", "@types/express": "^4.17.9", diff --git a/yarn.lock b/yarn.lock index 77f6c43e5f..dd3607b994 100644 --- a/yarn.lock +++ b/yarn.lock @@ -44,7 +44,7 @@ "@angular-devkit/core" "12.2.18" rxjs "6.6.7" -"@angular-devkit/architect@^0.1402.0", "@angular-devkit/architect@>=0.1400.0 < 0.1500.0", "@angular-devkit/architect@0.1402.11": +"@angular-devkit/architect@>=0.1400.0 < 0.1500.0", "@angular-devkit/architect@0.1402.11": version "0.1402.11" resolved "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1402.11.tgz" integrity sha512-RuSZrBQ+QbipAESZ4aXCyAMQHaEaDyyV/FDS9J2HJWfEFbRD5oxlEt/tBC8XjmJQsktaUOh07GT8MNJjPKVAQw== @@ -52,6 +52,14 @@ "@angular-devkit/core" "14.2.11" rxjs "6.6.7" +"@angular-devkit/architect@~0.1502.0": + version "0.1502.5" + resolved "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1502.5.tgz" + integrity sha512-6KVrXQ/X7W88WSJvYe69ed/2QzQNlObKpj3BWzmcKnA+IvJB37/mvw8VaGFP9y+pDa/b1D1yCDtAJLeP5QY3xg== + dependencies: + "@angular-devkit/core" "15.2.5" + rxjs "6.6.7" + "@angular-devkit/architect@0.1502.5": version "0.1502.5" resolved "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1502.5.tgz" @@ -130,7 +138,7 @@ optionalDependencies: esbuild "0.15.5" -"@angular-devkit/build-angular@^14.2.0", "@angular-devkit/build-angular@^15.2.5": +"@angular-devkit/build-angular@^15.0.0", "@angular-devkit/build-angular@^15.2.5": version "15.2.5" resolved "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-15.2.5.tgz" integrity sha512-D2LxjBtUlgJnPxybOIN0XsENEGkVkqCGBBii5oK84HvgBHXO/EyP1WXpOdb2lOYSUZyjhOOs0q42LCobJoaxUw== @@ -226,7 +234,7 @@ rxjs "6.6.7" source-map "0.7.3" -"@angular-devkit/core@^14.0.0", "@angular-devkit/core@^14.2.0", "@angular-devkit/core@14.2.11": +"@angular-devkit/core@^14.0.0", "@angular-devkit/core@14.2.11": version "14.2.11" resolved "https://registry.npmjs.org/@angular-devkit/core/-/core-14.2.11.tgz" integrity sha512-cBIGs6y9rykOQqnuAQOB1DgIRyBFYtvKRJb7QNUfIJ0qUfARKkuV/yikv3lrb95ePGkmoRzmjkFqcFZiYU+r7A== @@ -237,7 +245,7 @@ rxjs "6.6.7" source-map "0.7.4" -"@angular-devkit/core@15.2.5": +"@angular-devkit/core@~15.2.0", "@angular-devkit/core@15.2.5": version "15.2.5" resolved "https://registry.npmjs.org/@angular-devkit/core/-/core-15.2.5.tgz" integrity sha512-ZfjEkAe2yYeekc3xjZ/U4pK9nb+w6BFwAEjou6mE8PWZH7iYskm0YCCXkmu+B+zViEcCLhAkJAxu9MwX4efd8g== @@ -365,20 +373,13 @@ symbol-observable "4.0.0" yargs "17.6.2" -"@angular/common@*", "@angular/common@^11.0.0", "@angular/common@^13.0.0", "@angular/common@^13.0.0 || ^14.0.0-0", "@angular/common@^13.3.4", "@angular/common@^15.2.6", "@angular/common@>=10.0.0", "@angular/common@>=13.0.0 <14", "@angular/common@>=13.0.0-0", "@angular/common@>=2.x", "@angular/common@>=5.0.0", "@angular/common@>=5.0.0 <14.0.0", "@angular/common@15.2.6", "@angular/common@5.0.0-alpha - 5 || 6.0.0-alpha - 6 || 7.0.0-alpha - 7 || 8.0.0-alpha - 8 || 9.0.0-alpha - 9 || 10.0.0-alpha - 10 || 11.0.0-alpha - 11 || 12.0.0-alpha - 12 || 13.0.0-alpha - 13 || 14.0.0-alpha - 14": +"@angular/common@*", "@angular/common@^11.0.0", "@angular/common@^13.0.0", "@angular/common@^13.0.0 || ^14.0.0-0", "@angular/common@^13.3.4", "@angular/common@^15.0.0", "@angular/common@^15.2.6", "@angular/common@>=10.0.0", "@angular/common@>=13.0.0 <14", "@angular/common@>=13.0.0-0", "@angular/common@>=2.x", "@angular/common@>=5.0.0", "@angular/common@>=5.0.0 <14.0.0", "@angular/common@15.2.6", "@angular/common@5.0.0-alpha - 5 || 6.0.0-alpha - 6 || 7.0.0-alpha - 7 || 8.0.0-alpha - 8 || 9.0.0-alpha - 9 || 10.0.0-alpha - 10 || 11.0.0-alpha - 11 || 12.0.0-alpha - 12 || 13.0.0-alpha - 13 || 14.0.0-alpha - 14": version "15.2.6" resolved "https://registry.npmjs.org/@angular/common/-/common-15.2.6.tgz" integrity sha512-kPGJoSkFPXsIeHzcjlal8JC8/jYK9qAr+wv+HDX8O1J2FEzQjwoX4SYvpnvVk5WTqUkxMkRCTMu2YFAAmU1+qg== dependencies: tslib "^2.3.0" -"@angular/common@^14.2.0": - version "14.3.0" - resolved "https://registry.npmjs.org/@angular/common/-/common-14.3.0.tgz" - integrity sha512-pV9oyG3JhGWeQ+TFB0Qub6a1VZWMNZ6/7zEopvYivdqa5yDLLDSBRWb6P80RuONXyGnM1pa7l5nYopX+r/23GQ== - dependencies: - tslib "^2.3.0" - "@angular/compiler-cli@^13.0.0", "@angular/compiler-cli@^14.0.0", "@angular/compiler-cli@^15.0.0", "@angular/compiler-cli@^15.2.6", "@angular/compiler-cli@14.3.0", "@angular/compiler-cli@15.2.6": version "15.2.6" resolved "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-15.2.6.tgz" @@ -409,14 +410,14 @@ dependencies: tslib "^2.3.0" -"@angular/core@*", "@angular/core@^11.0.0", "@angular/core@^13.0.0", "@angular/core@^13.0.0 || ^14.0.0-0", "@angular/core@^13.3.4", "@angular/core@^15.2.6", "@angular/core@>=10.0.0", "@angular/core@>=12", "@angular/core@>=13.0.0 <14", "@angular/core@>=13.0.0-0", "@angular/core@>=2.x", "@angular/core@>=5.0.0", "@angular/core@>=5.0.0 <14.0.0", "@angular/core@15.2.6", "@angular/core@5.0.0-alpha - 5 || 6.0.0-alpha - 6 || 7.0.0-alpha - 7 || 8.0.0-alpha - 8 || 9.0.0-alpha - 9 || 10.0.0-alpha - 10 || 11.0.0-alpha - 11 || 12.0.0-alpha - 12 || 13.0.0-alpha - 13 || 14.0.0-alpha - 14": +"@angular/core@*", "@angular/core@^11.0.0", "@angular/core@^13.0.0", "@angular/core@^13.0.0 || ^14.0.0-0", "@angular/core@^13.3.4", "@angular/core@^15.0.0", "@angular/core@^15.2.6", "@angular/core@>=10.0.0", "@angular/core@>=12", "@angular/core@>=13.0.0 <14", "@angular/core@>=13.0.0-0", "@angular/core@>=2.x", "@angular/core@>=5.0.0", "@angular/core@>=5.0.0 <14.0.0", "@angular/core@15.2.6", "@angular/core@5.0.0-alpha - 5 || 6.0.0-alpha - 6 || 7.0.0-alpha - 7 || 8.0.0-alpha - 8 || 9.0.0-alpha - 9 || 10.0.0-alpha - 10 || 11.0.0-alpha - 11 || 12.0.0-alpha - 12 || 13.0.0-alpha - 13 || 14.0.0-alpha - 14": version "15.2.6" resolved "https://registry.npmjs.org/@angular/core/-/core-15.2.6.tgz" integrity sha512-eN46OfSOLQGN6AciUvyHOJ8xQxmiEakkxJeoG1jwcSRXCjwSYYnQ/6drnhUpq5p43XXBAIduKfJXNztEPvLAkA== dependencies: tslib "^2.3.0" -"@angular/core@^14.2.0", "@angular/core@14.3.0": +"@angular/core@14.3.0": version "14.3.0" resolved "https://registry.npmjs.org/@angular/core/-/core-14.3.0.tgz" integrity sha512-wYiwItc0Uyn4FWZ/OAx/Ubp2/WrD3EgUJ476y1XI7yATGPF8n9Ld5iCXT08HOvc4eBcYlDfh90kTXR6/MfhzdQ== @@ -2116,18 +2117,18 @@ resolved "https://registry.npmjs.org/@ngtools/webpack/-/webpack-15.2.5.tgz" integrity sha512-wD6GY4xghVK+SQL0dy/M3saGx5pqi7+1VHEr+BBI7IUNYGSqPNzylKNxLBgQiTzfkzvbrZ6MhfaMNkhvSCYr5w== -"@nguniversal/builders@^14.2.3": - version "14.2.3" - resolved "https://registry.npmjs.org/@nguniversal/builders/-/builders-14.2.3.tgz" - integrity sha512-4WpQ5zMfw4BIH/2ymWchFm2bbN8w0/sC0Rg3IracJ9ESsfTJMaIg8CzVer6NBqC+5As9iLZwau7nrfzt7sQf1A== +"@nguniversal/builders@^15.2.0": + version "15.2.0" + resolved "https://registry.npmjs.org/@nguniversal/builders/-/builders-15.2.0.tgz" + integrity sha512-V+y3gj/yKs2EHXXOSk752yYS60d+Bmhts+l5o4dDi4GJSZbJ7SCcbmocxZNgjYOv3sTJgsE4zLxxiaL7+4MHDQ== dependencies: - "@angular-devkit/architect" "^0.1402.0" - "@angular-devkit/core" "^14.2.0" - "@nguniversal/common" "14.2.3" - browser-sync "^2.26.7" - express "^4.17.1" - guess-parser "^0.4.12" - http-proxy-middleware "^2.0.0" + "@angular-devkit/architect" "~0.1502.0" + "@angular-devkit/core" "~15.2.0" + "@nguniversal/common" "15.2.0" + browser-sync "^2.27.10" + express "^4.18.2" + guess-parser "^0.4.22" + http-proxy-middleware "^2.0.6" ora "^5.1.0" piscina "~3.2.0" rxjs "^6.5.5" @@ -2142,13 +2143,13 @@ jsdom "19.0.0" tslib "^2.3.0" -"@nguniversal/common@14.2.3": - version "14.2.3" - resolved "https://registry.npmjs.org/@nguniversal/common/-/common-14.2.3.tgz" - integrity sha512-FWoZY+DZCNw24tNnnWkgTpNAlshkfiaxiT7V+fx2WFpY0LNXLWk45+hWhl4+wFEknOXr/DT/oU1m/RjR6FgXZQ== +"@nguniversal/common@15.2.0": + version "15.2.0" + resolved "https://registry.npmjs.org/@nguniversal/common/-/common-15.2.0.tgz" + integrity sha512-IfFuqpzK0P3iMdR2DbPWTbjLWsFvAwvMkZnp5k9FRgg20DpdgqDRaoJuw4HV5qSKKhY/JcVXq99GIG6JHaza1A== dependencies: critters "0.0.16" - jsdom "20.0.0" + jsdom "21.1.0" tslib "^2.3.0" "@nguniversal/express-engine@^13.0.2": @@ -3089,6 +3090,14 @@ acorn-globals@^6.0.0: acorn "^7.1.1" acorn-walk "^7.1.1" +acorn-globals@^7.0.0: + version "7.0.1" + resolved "https://registry.npmjs.org/acorn-globals/-/acorn-globals-7.0.1.tgz" + integrity sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q== + dependencies: + acorn "^8.1.0" + acorn-walk "^8.0.2" + acorn-import-assertions@^1.7.6: version "1.8.0" resolved "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz" @@ -3109,12 +3118,17 @@ acorn-walk@^8.0.0: resolved "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz" integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== +acorn-walk@^8.0.2: + version "8.2.0" + resolved "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz" + integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== + acorn-walk@^8.1.1: version "8.2.0" resolved "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz" integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== -"acorn@^6.0.0 || ^7.0.0 || ^8.0.0", acorn@^8, acorn@^8.0.4, acorn@^8.2.4, acorn@^8.4.1, acorn@^8.5.0, acorn@^8.7.1, acorn@^8.8.0: +"acorn@^6.0.0 || ^7.0.0 || ^8.0.0", acorn@^8, acorn@^8.0.4, acorn@^8.1.0, acorn@^8.2.4, acorn@^8.4.1, acorn@^8.5.0, acorn@^8.7.1, acorn@^8.8.0, acorn@^8.8.1: version "8.8.2" resolved "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz" integrity sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw== @@ -3739,7 +3753,7 @@ browser-sync-ui@^2.29.1: socket.io-client "^4.4.1" stream-throttle "^0.1.3" -browser-sync@^2.26.7: +browser-sync@^2.27.10: version "2.29.1" resolved "https://registry.npmjs.org/browser-sync/-/browser-sync-2.29.1.tgz" integrity sha512-WXy9HMJVQaNUTPjmai330E2fnDA6W84l/vBILGkYu9yHXIpWw1gJYjdQWDfEhLFljYUHNTN9jM3GCej2T55m+g== @@ -4826,7 +4840,7 @@ debug@4.3.2: dependencies: ms "2.1.2" -decimal.js@^10.2.1, decimal.js@^10.3.1: +decimal.js@^10.2.1, decimal.js@^10.3.1, decimal.js@^10.4.2: version "10.4.3" resolved "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz" integrity sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA== @@ -5728,7 +5742,7 @@ express-static-gzip@^2.1.5: dependencies: serve-static "^1.14.1" -express@^4.15.2, express@^4.17.1, express@^4.17.3: +express@^4.15.2, express@^4.17.1, express@^4.17.3, express@^4.18.2: version "4.18.2" resolved "https://registry.npmjs.org/express/-/express-4.18.2.tgz" integrity sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ== @@ -6411,7 +6425,7 @@ grapheme-splitter@^1.0.4: resolved "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz" integrity sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ== -guess-parser@^0.4.12: +guess-parser@^0.4.22: version "0.4.22" resolved "https://registry.npmjs.org/guess-parser/-/guess-parser-0.4.22.tgz" integrity sha512-KcUWZ5ACGaBM69SbqwVIuWGoSAgD+9iJnchR9j/IarVI1jHVeXv+bUXBIMeqVMSKt3zrn0Dgf9UpcOEpPBLbSg== @@ -6645,7 +6659,7 @@ http-proxy-middleware@^1.0.5: is-plain-obj "^3.0.0" micromatch "^4.0.2" -http-proxy-middleware@^2.0.0: +http-proxy-middleware@^2.0.3: version "2.0.6" resolved "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz" integrity sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw== @@ -6656,7 +6670,7 @@ http-proxy-middleware@^2.0.0: is-plain-obj "^3.0.0" micromatch "^4.0.2" -http-proxy-middleware@^2.0.3: +http-proxy-middleware@^2.0.6: version "2.0.6" resolved "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz" integrity sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw== @@ -7402,18 +7416,18 @@ jsdom@19.0.0: ws "^8.2.3" xml-name-validator "^4.0.0" -jsdom@20.0.0: - version "20.0.0" - resolved "https://registry.npmjs.org/jsdom/-/jsdom-20.0.0.tgz" - integrity sha512-x4a6CKCgx00uCmP+QakBDFXwjAJ69IkkIWHmtmjd3wvXPcdOS44hfX2vqkOQrVrq8l9DhNNADZRXaCEWvgXtVA== +jsdom@21.1.0: + version "21.1.0" + resolved "https://registry.npmjs.org/jsdom/-/jsdom-21.1.0.tgz" + integrity sha512-m0lzlP7qOtthD918nenK3hdItSd2I+V3W9IrBcB36sqDwG+KnUs66IF5GY7laGWUnlM9vTsD0W1QwSEBYWWcJg== dependencies: abab "^2.0.6" - acorn "^8.7.1" - acorn-globals "^6.0.0" + acorn "^8.8.1" + acorn-globals "^7.0.0" cssom "^0.5.0" cssstyle "^2.3.0" data-urls "^3.0.2" - decimal.js "^10.3.1" + decimal.js "^10.4.2" domexception "^4.0.0" escodegen "^2.0.0" form-data "^4.0.0" @@ -7421,18 +7435,17 @@ jsdom@20.0.0: http-proxy-agent "^5.0.0" https-proxy-agent "^5.0.1" is-potential-custom-element-name "^1.0.1" - nwsapi "^2.2.0" - parse5 "^7.0.0" + nwsapi "^2.2.2" + parse5 "^7.1.1" saxes "^6.0.0" symbol-tree "^3.2.4" - tough-cookie "^4.0.0" - w3c-hr-time "^1.0.2" - w3c-xmlserializer "^3.0.0" + tough-cookie "^4.1.2" + w3c-xmlserializer "^4.0.0" webidl-conversions "^7.0.0" whatwg-encoding "^2.0.0" whatwg-mimetype "^3.0.0" whatwg-url "^11.0.0" - ws "^8.8.0" + ws "^8.11.0" xml-name-validator "^4.0.0" jsesc@^2.5.1: @@ -8775,7 +8788,7 @@ nth-check@^2.0.1: dependencies: boolbase "^1.0.0" -nwsapi@^2.2.0: +nwsapi@^2.2.0, nwsapi@^2.2.2: version "2.2.3" resolved "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.3.tgz" integrity sha512-jscxIO4/VKScHlbmFBdV1Z6LXnLO+ZR4VMtypudUdfwtKxUN3TQcNFIHLwKtrUbDyHN4/GycY9+oRGZ2XMXYPw== @@ -9168,6 +9181,13 @@ parse5@^7.0.0: dependencies: entities "^4.4.0" +parse5@^7.1.1: + version "7.1.2" + resolved "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz" + integrity sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw== + dependencies: + entities "^4.4.0" + parse5@6.0.1: version "6.0.1" resolved "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz" @@ -10456,14 +10476,7 @@ rxjs@^6.5.4: dependencies: tslib "^1.9.0" -rxjs@^6.5.5: - version "6.6.7" - resolved "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz" - integrity sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ== - dependencies: - tslib "^1.9.0" - -rxjs@~6.6.0, rxjs@6.6.7: +rxjs@^6.5.5, rxjs@~6.6.0, rxjs@6.6.7: version "6.6.7" resolved "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz" integrity sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ== @@ -11556,7 +11569,7 @@ touch@^3.1.0: dependencies: nopt "~1.0.10" -tough-cookie@^4.0.0: +tough-cookie@^4.0.0, tough-cookie@^4.1.2: version "4.1.2" resolved "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.2.tgz" integrity sha512-G9fqXWoYFZgTc2z8Q5zaHy/vJMjm+WV0AkAeHxVCQiEB1b+dGvWzFW6QV07cY5jQ5gRkeid2qIkzkxUnmoQZUQ== @@ -12027,6 +12040,13 @@ w3c-xmlserializer@^3.0.0: dependencies: xml-name-validator "^4.0.0" +w3c-xmlserializer@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz" + integrity sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw== + dependencies: + xml-name-validator "^4.0.0" + watchpack@^2.4.0: version "2.4.0" resolved "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz" @@ -12506,7 +12526,7 @@ ws@^7.4.6: resolved "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz" integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== -ws@^8.13.0, ws@^8.2.3, ws@^8.4.2, ws@^8.8.0: +ws@^8.11.0, ws@^8.13.0, ws@^8.2.3, ws@^8.4.2: version "8.13.0" resolved "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz" integrity sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA== From 8c3ec98db3947e6b380a587fab1ebcd184f5edb9 Mon Sep 17 00:00:00 2001 From: Kristof De Langhe Date: Wed, 12 Apr 2023 11:40:05 +0200 Subject: [PATCH 077/409] 101108: Automatic ng update @angular-eslint/schematics@15 --- angular.json | 8 + package.json | 18 +- yarn.lock | 733 +++++++++++++++++++-------------------------------- 3 files changed, 283 insertions(+), 476 deletions(-) diff --git a/angular.json b/angular.json index d5227c4f10..ff31de0111 100644 --- a/angular.json +++ b/angular.json @@ -278,5 +278,13 @@ "schematicCollections": [ "@angular-eslint/schematics" ] + }, + "schematics": { + "@angular-eslint/schematics:application": { + "setParserOptionsProject": true + }, + "@angular-eslint/schematics:library": { + "setParserOptionsProject": true + } } } diff --git a/package.json b/package.json index 40cae302d1..dd8b9c0827 100644 --- a/package.json +++ b/package.json @@ -136,11 +136,11 @@ "devDependencies": { "@angular-builders/custom-webpack": "~14.1.0", "@angular-devkit/build-angular": "^15.2.5", - "@angular-eslint/builder": "13.1.0", - "@angular-eslint/eslint-plugin": "13.1.0", - "@angular-eslint/eslint-plugin-template": "13.1.0", - "@angular-eslint/schematics": "13.1.0", - "@angular-eslint/template-parser": "13.1.0", + "@angular-eslint/builder": "15.2.1", + "@angular-eslint/eslint-plugin": "15.2.1", + "@angular-eslint/eslint-plugin-template": "15.2.1", + "@angular-eslint/schematics": "15.2.1", + "@angular-eslint/template-parser": "15.2.1", "@angular/cli": "^15.2.5", "@angular/compiler-cli": "^15.2.6", "@angular/language-service": "^15.2.6", @@ -157,8 +157,8 @@ "@types/lodash": "^4.14.165", "@types/node": "^14.14.9", "@types/sanitize-html": "^2.6.2", - "@typescript-eslint/eslint-plugin": "5.11.0", - "@typescript-eslint/parser": "5.11.0", + "@typescript-eslint/eslint-plugin": "^5.43.0", + "@typescript-eslint/parser": "^5.43.0", "axe-core": "^4.4.3", "compression-webpack-plugin": "^9.2.0", "copy-webpack-plugin": "^6.4.1", @@ -166,7 +166,7 @@ "cypress": "12.9.0", "cypress-axe": "^1.1.0", "deep-freeze": "0.0.1", - "eslint": "^8.2.0", + "eslint": "^8.28.0", "eslint-plugin-deprecation": "^1.3.2", "eslint-plugin-import": "^2.25.4", "eslint-plugin-jsdoc": "^39.6.4", @@ -203,4 +203,4 @@ "webpack-cli": "^4.2.0", "webpack-dev-server": "^4.5.0" } -} \ No newline at end of file +} diff --git a/yarn.lock b/yarn.lock index dd3607b994..0d9a7242ed 100644 --- a/yarn.lock +++ b/yarn.lock @@ -276,62 +276,62 @@ ora "5.4.1" rxjs "6.6.7" -"@angular-eslint/builder@13.1.0": - version "13.1.0" - resolved "https://registry.npmjs.org/@angular-eslint/builder/-/builder-13.1.0.tgz" - integrity sha512-RdyeetctnipVdCBrU/mipJ2XKiLC1yGmK1Sfbbgwu0s49CAdOArY/b+b8OU3yyy4EO1EGKQMlzs6F3wTYgiZCA== - dependencies: - "@nrwl/devkit" "13.1.3" +"@angular-eslint/builder@15.2.1": + version "15.2.1" + resolved "https://registry.npmjs.org/@angular-eslint/builder/-/builder-15.2.1.tgz" + integrity sha512-7x2DANebLRl997Mj4DhZrnz5+vnSjavGGveJ0mBuU7CEsL0ZYLftdRqL0e0HtU3ksseS7xpchD6OM08nkNgySw== -"@angular-eslint/bundled-angular-compiler@13.1.0": - version "13.1.0" - resolved "https://registry.npmjs.org/@angular-eslint/bundled-angular-compiler/-/bundled-angular-compiler-13.1.0.tgz" - integrity sha512-0VSAZ3zrHkKdbvogQ4GLSf+lKojtPL3LXLlvXU9xNgNsqw68+gSNwaWd595tXoQCmpwWpTerKUbyIsGnPA7EYA== +"@angular-eslint/bundled-angular-compiler@15.2.1": + version "15.2.1" + resolved "https://registry.npmjs.org/@angular-eslint/bundled-angular-compiler/-/bundled-angular-compiler-15.2.1.tgz" + integrity sha512-LO7Am8eVCr7oh6a0VmKSL7K03CnQEQhFO7Wt/YtbfYOxVjrbwmYLwJn+wZPOT7A02t/BttOD/WXuDrOWtSMQ/Q== -"@angular-eslint/eslint-plugin-template@13.1.0": - version "13.1.0" - resolved "https://registry.npmjs.org/@angular-eslint/eslint-plugin-template/-/eslint-plugin-template-13.1.0.tgz" - integrity sha512-ceZAMjufE58aduOW/UwjrbCRWocYC0zOEJ2jUkPt6jlL8yzc+SC6UitO0VmMgUsCizHueav5/3gKy05xqwk/CA== +"@angular-eslint/eslint-plugin-template@15.2.1": + version "15.2.1" + resolved "https://registry.npmjs.org/@angular-eslint/eslint-plugin-template/-/eslint-plugin-template-15.2.1.tgz" + integrity sha512-IeiSLk6YxapFdH2z5o/O3R7VwtBd2T6fWmhLFPwDYMDknrwegnOjwswCdBplOccpUp0wqlCeGUx7LTsuzwaz7w== dependencies: - "@angular-eslint/bundled-angular-compiler" "13.1.0" - "@typescript-eslint/experimental-utils" "5.11.0" - aria-query "^4.2.2" - axobject-query "^2.2.0" + "@angular-eslint/bundled-angular-compiler" "15.2.1" + "@angular-eslint/utils" "15.2.1" + "@typescript-eslint/type-utils" "5.48.2" + "@typescript-eslint/utils" "5.48.2" + aria-query "5.1.3" + axobject-query "3.1.1" -"@angular-eslint/eslint-plugin@13.1.0": - version "13.1.0" - resolved "https://registry.npmjs.org/@angular-eslint/eslint-plugin/-/eslint-plugin-13.1.0.tgz" - integrity sha512-WiggBWPhhpSjcYVHJiawCduCsydM/RPudUE8zxv0Nmj/APuzNgvUr6E//uYTrhNv9EIJoZutRovw7R4Y/yXj4Q== +"@angular-eslint/eslint-plugin@15.2.1": + version "15.2.1" + resolved "https://registry.npmjs.org/@angular-eslint/eslint-plugin/-/eslint-plugin-15.2.1.tgz" + integrity sha512-OM7b1kS4E4CkXjkaWN+lEzawh4VxY6l7FO1Cuk4s7iv3/YpZG3rJxIZBqnFLTixwrBuqw8y4FNBzF3eDgmFAUw== dependencies: - "@angular-eslint/utils" "13.1.0" - "@typescript-eslint/experimental-utils" "5.11.0" + "@angular-eslint/utils" "15.2.1" + "@typescript-eslint/utils" "5.48.2" -"@angular-eslint/schematics@13.1.0": - version "13.1.0" - resolved "https://registry.npmjs.org/@angular-eslint/schematics/-/schematics-13.1.0.tgz" - integrity sha512-/gVtkRP09cGhnUF3tr0phwNA5/ml94V3cqO8X4Z4QmyAaIwxuOJ0mJvWrVN7aurURxh9WoeWD/HXOvtC5igtpQ== +"@angular-eslint/schematics@15.2.1": + version "15.2.1" + resolved "https://registry.npmjs.org/@angular-eslint/schematics/-/schematics-15.2.1.tgz" + integrity sha512-0ZfBCejHWIcgy3J5kFs9sS/jqi8i5AptxggOwFySOlCLJ+CzNrktjD4jff1Zy8K/VLzY0Ci0BSZXvgWfP0k9Rg== dependencies: - "@angular-eslint/eslint-plugin" "13.1.0" - "@angular-eslint/eslint-plugin-template" "13.1.0" - ignore "5.2.0" + "@angular-eslint/eslint-plugin" "15.2.1" + "@angular-eslint/eslint-plugin-template" "15.2.1" + ignore "5.2.4" strip-json-comments "3.1.1" tmp "0.2.1" -"@angular-eslint/template-parser@13.1.0": - version "13.1.0" - resolved "https://registry.npmjs.org/@angular-eslint/template-parser/-/template-parser-13.1.0.tgz" - integrity sha512-gKV+kms+kYm1HdToH3j4HL1RrjvMHscVkhwjoV1WbJColnfDivVAZ6/5/J92/A/8r7vJptQkftsbiaGKDyg47w== +"@angular-eslint/template-parser@15.2.1": + version "15.2.1" + resolved "https://registry.npmjs.org/@angular-eslint/template-parser/-/template-parser-15.2.1.tgz" + integrity sha512-ViCi79gC2aKJecmYLkOT+QlT5WMRNXeYz0Dr9Pr8qXzIbY0oAWE7nOT5jkXwQ9oUk+ybtGCWHma5JVJWVJsIog== dependencies: - "@angular-eslint/bundled-angular-compiler" "13.1.0" - eslint-scope "^5.1.0" + "@angular-eslint/bundled-angular-compiler" "15.2.1" + eslint-scope "^7.0.0" -"@angular-eslint/utils@13.1.0": - version "13.1.0" - resolved "https://registry.npmjs.org/@angular-eslint/utils/-/utils-13.1.0.tgz" - integrity sha512-iLmYMXNk+1sFMIlYXN8/Z5UcNAOno38v10lzo4bMjCpzXKkMa0O2b+4qi+469iUJAU6RAZ5weUL+S2Wtlr0ooA== +"@angular-eslint/utils@15.2.1": + version "15.2.1" + resolved "https://registry.npmjs.org/@angular-eslint/utils/-/utils-15.2.1.tgz" + integrity sha512-++FneAJHxJqcSu0igVN6uOkSoHxlzgLoMBswuovYJy3UKwm33/T6WFku8++753Ca/JucIoR1gdUfO7SoSspMDg== dependencies: - "@angular-eslint/bundled-angular-compiler" "13.1.0" - "@typescript-eslint/experimental-utils" "5.11.0" + "@angular-eslint/bundled-angular-compiler" "15.2.1" + "@typescript-eslint/utils" "5.48.2" "@angular/animations@^15.2.6", "@angular/animations@>=13.0.0 <14", "@angular/animations@>=5.0.0 <14.0.0", "@angular/animations@15.2.6": version "15.2.6" @@ -349,7 +349,7 @@ optionalDependencies: parse5 "^5.0.0" -"@angular/cli@^15.2.5", "@angular/cli@>= 13.0.0 < 14.0.0", "@angular/cli@>=12": +"@angular/cli@^15.2.5", "@angular/cli@>= 15.0.0 < 16.0.0", "@angular/cli@>=12": version "15.2.5" resolved "https://registry.npmjs.org/@angular/cli/-/cli-15.2.5.tgz" integrity sha512-TmkkeJkdfDkC6b2SNQcLlr1rsl2anc5rrrY3gawOVXYXBExMxAi2SNJsHZzUXfiitW52aZkAyajF1VFazs8PRw== @@ -1553,15 +1553,7 @@ resolved "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz" integrity sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA== -"@babel/runtime-corejs3@^7.10.2": - version "7.21.0" - resolved "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.21.0.tgz" - integrity sha512-TDD4UJzos3JJtM+tHX+w2Uc+KWj7GV+VKKFdMVd2Rx8sdA19hcc3P3AHFYd5LVOw+pYuSd5lICC3gm52B6Rwxw== - dependencies: - core-js-pure "^3.25.1" - regenerator-runtime "^0.13.11" - -"@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2", "@babel/runtime@^7.10.2", "@babel/runtime@^7.12.0", "@babel/runtime@^7.14.5", "@babel/runtime@^7.15.4", "@babel/runtime@^7.3.1", "@babel/runtime@^7.4.4", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.3", "@babel/runtime@^7.8.3", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2", "@babel/runtime@>=7", "@babel/runtime@7.17.2": +"@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2", "@babel/runtime@^7.12.0", "@babel/runtime@^7.14.5", "@babel/runtime@^7.15.4", "@babel/runtime@^7.3.1", "@babel/runtime@^7.4.4", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.3", "@babel/runtime@^7.8.3", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2", "@babel/runtime@>=7", "@babel/runtime@7.17.2": version "7.17.2" resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.17.2.tgz" integrity sha512-hzeyJyMA1YGdJTuWU0e/j4wKXrU4OMFvY2MSlaI9B7VQb0r5cxTE3EAIS2Q7Tn2RIcDkRvTA/v2JsAEhxe99uw== @@ -2279,62 +2271,6 @@ read-package-json-fast "^3.0.0" which "^3.0.0" -"@nrwl/cli@*", "@nrwl/cli@15.9.2": - version "15.9.2" - resolved "https://registry.npmjs.org/@nrwl/cli/-/cli-15.9.2.tgz" - integrity sha512-QoCmyrcGakHAYTJaNBbOerRQAmqJHMYGCdqtQidV+aP9p1Dy33XxDELfhd+IYmGqngutXuEWChNpWNhPloLnoA== - dependencies: - nx "15.9.2" - -"@nrwl/devkit@13.1.3": - version "13.1.3" - resolved "https://registry.npmjs.org/@nrwl/devkit/-/devkit-13.1.3.tgz" - integrity sha512-TAAsZJvVc/obeH0rZKY6miVhyM2GHGb8qIWp9MAIdLlXf4VDcNC7rxwb5OrGVSwuTTjqGYBGPUx0yEogOOJthA== - dependencies: - "@nrwl/tao" "13.1.3" - ejs "^3.1.5" - ignore "^5.0.4" - rxjs "^6.5.4" - semver "7.3.4" - tslib "^2.0.0" - -"@nrwl/nx-darwin-x64@15.9.2": - version "15.9.2" - resolved "https://registry.npmjs.org/@nrwl/nx-darwin-x64/-/nx-darwin-x64-15.9.2.tgz" - integrity sha512-qHfdluHlPzV0UHOwj1ZJ+qNEhzfLGiBuy1cOth4BSzDlvMnkuqBWoprfaXoztzYcus2NSILY1/7b3Jw4DAWmMw== - -"@nrwl/tao@13.1.3": - version "13.1.3" - resolved "https://registry.npmjs.org/@nrwl/tao/-/tao-13.1.3.tgz" - integrity sha512-/IwJgSgCBD1SaF+n8RuXX2OxDAh8ut/+P8pMswjm8063ac30UlAHjQ4XTYyskLH8uoUmNi2hNaGgHUrkwt7tQA== - dependencies: - chalk "4.1.0" - enquirer "~2.3.6" - fs-extra "^9.1.0" - jsonc-parser "3.0.0" - nx "13.1.3" - rxjs "^6.5.4" - rxjs-for-await "0.0.2" - semver "7.3.4" - tmp "~0.2.1" - tslib "^2.0.0" - yargs-parser "20.0.0" - -"@nrwl/tao@15.9.2": - version "15.9.2" - resolved "https://registry.npmjs.org/@nrwl/tao/-/tao-15.9.2.tgz" - integrity sha512-+LqNC37w9c6q6Ukdpf0z0tt1PQFNi4gwhHpJvkYQiKRETHjyrrlyqTNEPEyA7PI62RuYC6VrpVw2gzI7ufqZEA== - dependencies: - nx "15.9.2" - -"@parcel/watcher@2.0.4": - version "2.0.4" - resolved "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.0.4.tgz" - integrity sha512-cTDi+FUDBIUOBKEtj+nhiJ71AZVlkAsQFuGQTun5tV9mwQBQgZvhCzG+URPQc8myeN32yRVZEfVAPCs1RW+Jvg== - dependencies: - node-addon-api "^3.2.1" - node-gyp-build "^4.3.0" - "@polka/url@^1.0.0-next.20": version "1.0.0-next.21" resolved "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.21.tgz" @@ -2751,45 +2687,39 @@ dependencies: "@types/node" "*" -"@typescript-eslint/eslint-plugin@^5.0.0", "@typescript-eslint/eslint-plugin@5.11.0": - version "5.11.0" - resolved "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.11.0.tgz" - integrity sha512-HJh33bgzXe6jGRocOj4FmefD7hRY4itgjzOrSs3JPrTNXsX7j5+nQPciAUj/1nZtwo2kAc3C75jZO+T23gzSGw== +"@typescript-eslint/eslint-plugin@^5.0.0", "@typescript-eslint/eslint-plugin@^5.43.0": + version "5.58.0" + resolved "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.58.0.tgz" + integrity sha512-vxHvLhH0qgBd3/tW6/VccptSfc8FxPQIkmNTVLWcCOVqSBvqpnKkBTYrhcGlXfSnd78azwe+PsjYFj0X34/njA== dependencies: - "@typescript-eslint/scope-manager" "5.11.0" - "@typescript-eslint/type-utils" "5.11.0" - "@typescript-eslint/utils" "5.11.0" - debug "^4.3.2" - functional-red-black-tree "^1.0.1" - ignore "^5.1.8" - regexpp "^3.2.0" - semver "^7.3.5" + "@eslint-community/regexpp" "^4.4.0" + "@typescript-eslint/scope-manager" "5.58.0" + "@typescript-eslint/type-utils" "5.58.0" + "@typescript-eslint/utils" "5.58.0" + debug "^4.3.4" + grapheme-splitter "^1.0.4" + ignore "^5.2.0" + natural-compare-lite "^1.4.0" + semver "^7.3.7" tsutils "^3.21.0" -"@typescript-eslint/experimental-utils@5.11.0": - version "5.11.0" - resolved "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.11.0.tgz" - integrity sha512-EPvC/bU2n1LKtzKWP1AjGWkp7r8tJ8giVlZHIODo6q7SAd6J+/9vjtEKHK2G/Qp+D2IGPsQge+oadDR3CZcFtQ== +"@typescript-eslint/parser@^5.0.0", "@typescript-eslint/parser@^5.43.0": + version "5.58.0" + resolved "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.58.0.tgz" + integrity sha512-ixaM3gRtlfrKzP8N6lRhBbjTow1t6ztfBvQNGuRM8qH1bjFFXIJ35XY+FC0RRBKn3C6cT+7VW1y8tNm7DwPHDQ== dependencies: - "@typescript-eslint/utils" "5.11.0" + "@typescript-eslint/scope-manager" "5.58.0" + "@typescript-eslint/types" "5.58.0" + "@typescript-eslint/typescript-estree" "5.58.0" + debug "^4.3.4" -"@typescript-eslint/parser@^5.0.0", "@typescript-eslint/parser@5.11.0": - version "5.11.0" - resolved "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.11.0.tgz" - integrity sha512-x0DCjetHZYBRovJdr3U0zG9OOdNXUaFLJ82ehr1AlkArljJuwEsgnud+Q7umlGDFLFrs8tU8ybQDFocp/eX8mQ== +"@typescript-eslint/scope-manager@5.48.2": + version "5.48.2" + resolved "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.48.2.tgz" + integrity sha512-zEUFfonQid5KRDKoI3O+uP1GnrFd4tIHlvs+sTJXiWuypUWMuDaottkJuR612wQfOkjYbsaskSIURV9xo4f+Fw== dependencies: - "@typescript-eslint/scope-manager" "5.11.0" - "@typescript-eslint/types" "5.11.0" - "@typescript-eslint/typescript-estree" "5.11.0" - debug "^4.3.2" - -"@typescript-eslint/scope-manager@5.11.0": - version "5.11.0" - resolved "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.11.0.tgz" - integrity sha512-z+K4LlahDFVMww20t/0zcA7gq/NgOawaLuxgqGRVKS0PiZlCTIUtX0EJbC0BK1JtR4CelmkPK67zuCgpdlF4EA== - dependencies: - "@typescript-eslint/types" "5.11.0" - "@typescript-eslint/visitor-keys" "5.11.0" + "@typescript-eslint/types" "5.48.2" + "@typescript-eslint/visitor-keys" "5.48.2" "@typescript-eslint/scope-manager@5.58.0": version "5.58.0" @@ -2799,36 +2729,47 @@ "@typescript-eslint/types" "5.58.0" "@typescript-eslint/visitor-keys" "5.58.0" -"@typescript-eslint/type-utils@5.11.0": - version "5.11.0" - resolved "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.11.0.tgz" - integrity sha512-wDqdsYO6ofLaD4DsGZ0jGwxp4HrzD2YKulpEZXmgN3xo4BHJwf7kq49JTRpV0Gx6bxkSUmc9s0EIK1xPbFFpIA== +"@typescript-eslint/type-utils@5.48.2": + version "5.48.2" + resolved "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.48.2.tgz" + integrity sha512-QVWx7J5sPMRiOMJp5dYshPxABRoZV1xbRirqSk8yuIIsu0nvMTZesKErEA3Oix1k+uvsk8Cs8TGJ6kQ0ndAcew== dependencies: - "@typescript-eslint/utils" "5.11.0" - debug "^4.3.2" + "@typescript-eslint/typescript-estree" "5.48.2" + "@typescript-eslint/utils" "5.48.2" + debug "^4.3.4" tsutils "^3.21.0" -"@typescript-eslint/types@5.11.0": - version "5.11.0" - resolved "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.11.0.tgz" - integrity sha512-cxgBFGSRCoBEhvSVLkKw39+kMzUKHlJGVwwMbPcTZX3qEhuXhrjwaZXWMxVfxDgyMm+b5Q5b29Llo2yow8Y7xQ== +"@typescript-eslint/type-utils@5.58.0": + version "5.58.0" + resolved "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.58.0.tgz" + integrity sha512-FF5vP/SKAFJ+LmR9PENql7fQVVgGDOS+dq3j+cKl9iW/9VuZC/8CFmzIP0DLKXfWKpRHawJiG70rVH+xZZbp8w== + dependencies: + "@typescript-eslint/typescript-estree" "5.58.0" + "@typescript-eslint/utils" "5.58.0" + debug "^4.3.4" + tsutils "^3.21.0" + +"@typescript-eslint/types@5.48.2": + version "5.48.2" + resolved "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.48.2.tgz" + integrity sha512-hE7dA77xxu7ByBc6KCzikgfRyBCTst6dZQpwaTy25iMYOnbNljDT4hjhrGEJJ0QoMjrfqrx+j1l1B9/LtKeuqA== "@typescript-eslint/types@5.58.0": version "5.58.0" resolved "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.58.0.tgz" integrity sha512-JYV4eITHPzVQMnHZcYJXl2ZloC7thuUHrcUmxtzvItyKPvQ50kb9QXBkgNAt90OYMqwaodQh2kHutWZl1fc+1g== -"@typescript-eslint/typescript-estree@5.11.0": - version "5.11.0" - resolved "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.11.0.tgz" - integrity sha512-yVH9hKIv3ZN3lw8m/Jy5I4oXO4ZBMqijcXCdA4mY8ull6TPTAoQnKKrcZ0HDXg7Bsl0Unwwx7jcXMuNZc0m4lg== +"@typescript-eslint/typescript-estree@5.48.2": + version "5.48.2" + resolved "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.48.2.tgz" + integrity sha512-bibvD3z6ilnoVxUBFEgkO0k0aFvUc4Cttt0dAreEr+nrAHhWzkO83PEVVuieK3DqcgL6VAK5dkzK8XUVja5Zcg== dependencies: - "@typescript-eslint/types" "5.11.0" - "@typescript-eslint/visitor-keys" "5.11.0" - debug "^4.3.2" - globby "^11.0.4" + "@typescript-eslint/types" "5.48.2" + "@typescript-eslint/visitor-keys" "5.48.2" + debug "^4.3.4" + globby "^11.1.0" is-glob "^4.0.3" - semver "^7.3.5" + semver "^7.3.7" tsutils "^3.21.0" "@typescript-eslint/typescript-estree@5.58.0": @@ -2844,7 +2785,7 @@ semver "^7.3.7" tsutils "^3.21.0" -"@typescript-eslint/utils@^5.57.0": +"@typescript-eslint/utils@^5.57.0", "@typescript-eslint/utils@5.58.0": version "5.58.0" resolved "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.58.0.tgz" integrity sha512-gAmLOTFXMXOC+zP1fsqm3VceKSBQJNzV385Ok3+yzlavNHZoedajjS4UyS21gabJYcobuigQPs/z71A9MdJFqQ== @@ -2858,25 +2799,27 @@ eslint-scope "^5.1.1" semver "^7.3.7" -"@typescript-eslint/utils@5.11.0": - version "5.11.0" - resolved "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.11.0.tgz" - integrity sha512-g2I480tFE1iYRDyMhxPAtLQ9HAn0jjBtipgTCZmd9I9s11OV8CTsG+YfFciuNDcHqm4csbAgC2aVZCHzLxMSUw== +"@typescript-eslint/utils@5.48.2": + version "5.48.2" + resolved "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.48.2.tgz" + integrity sha512-2h18c0d7jgkw6tdKTlNaM7wyopbLRBiit8oAxoP89YnuBOzCZ8g8aBCaCqq7h208qUTroL7Whgzam7UY3HVLow== dependencies: "@types/json-schema" "^7.0.9" - "@typescript-eslint/scope-manager" "5.11.0" - "@typescript-eslint/types" "5.11.0" - "@typescript-eslint/typescript-estree" "5.11.0" + "@types/semver" "^7.3.12" + "@typescript-eslint/scope-manager" "5.48.2" + "@typescript-eslint/types" "5.48.2" + "@typescript-eslint/typescript-estree" "5.48.2" eslint-scope "^5.1.1" eslint-utils "^3.0.0" + semver "^7.3.7" -"@typescript-eslint/visitor-keys@5.11.0": - version "5.11.0" - resolved "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.11.0.tgz" - integrity sha512-E8w/vJReMGuloGxJDkpPlGwhxocxOpSVgSvjiLO5IxZPmxZF30weOeJYyPSEACwM+X4NziYS9q+WkN/2DHYQwA== +"@typescript-eslint/visitor-keys@5.48.2": + version "5.48.2" + resolved "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.48.2.tgz" + integrity sha512-z9njZLSkwmjFWUelGEwEbdf4NwKvfHxvGC0OcGN1Hp/XNDIcJ7D5DpPNPv6x6/mFvc1tQHsaWmpD/a4gOvvCJQ== dependencies: - "@typescript-eslint/types" "5.11.0" - eslint-visitor-keys "^3.0.0" + "@typescript-eslint/types" "5.48.2" + eslint-visitor-keys "^3.3.0" "@typescript-eslint/visitor-keys@5.58.0": version "5.58.0" @@ -3044,26 +2987,11 @@ resolved "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz" integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== -"@yarnpkg/lockfile@^1.1.0", "@yarnpkg/lockfile@1.1.0": +"@yarnpkg/lockfile@1.1.0": version "1.1.0" resolved "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz" integrity sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ== -"@yarnpkg/parsers@^3.0.0-rc.18": - version "3.0.0-rc.42" - resolved "https://registry.npmjs.org/@yarnpkg/parsers/-/parsers-3.0.0-rc.42.tgz" - integrity sha512-eW9Mbegmb5bJjwawJM9ghjUjUqciNMhC6L7XrQPF/clXS5bbP66MstsgCT5hy9VlfUh/CfBT+0Wucf531dMjHA== - dependencies: - js-yaml "^3.10.0" - tslib "^2.4.0" - -"@zkochan/js-yaml@0.0.6": - version "0.0.6" - resolved "https://registry.npmjs.org/@zkochan/js-yaml/-/js-yaml-0.0.6.tgz" - integrity sha512-nzvgl3VfhcELQ8LyVrYOru+UtAy1nrygk2+AGbTm8a5YcO6o8lSjAT+pfg3vJWxIoZKOUhrK6UU7xW/+00kQrg== - dependencies: - argparse "^2.0.1" - abab@^2.0.3, abab@^2.0.5, abab@^2.0.6: version "2.0.6" resolved "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz" @@ -3349,13 +3277,12 @@ argparse@^2.0.1: resolved "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz" integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== -aria-query@^4.2.2: - version "4.2.2" - resolved "https://registry.npmjs.org/aria-query/-/aria-query-4.2.2.tgz" - integrity sha512-o/HelwhuKpTj/frsOsbNLNgnNGVIFsVP/SW2BSF14gVl7kAfMOJ6/8wUAUvG1R1NHKrfG+2sHZTu0yauT1qBrA== +aria-query@5.1.3: + version "5.1.3" + resolved "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz" + integrity sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ== dependencies: - "@babel/runtime" "^7.10.2" - "@babel/runtime-corejs3" "^7.10.2" + deep-equal "^2.0.5" array-buffer-byte-length@^1.0.0: version "1.0.0" @@ -3507,15 +3434,6 @@ axios@^0.27.2: follow-redirects "^1.14.9" form-data "^4.0.0" -axios@^1.0.0: - version "1.3.5" - resolved "https://registry.npmjs.org/axios/-/axios-1.3.5.tgz" - integrity sha512-glL/PvG/E+xCWwV8S6nCHcrfg1exGx7vxyUIivIA1iL7BIh6bePylCfVHwp6k13ao7SATxB6imau2kqY+I67kw== - dependencies: - follow-redirects "^1.15.0" - form-data "^4.0.0" - proxy-from-env "^1.1.0" - axios@0.21.4: version "0.21.4" resolved "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz" @@ -3523,10 +3441,12 @@ axios@0.21.4: dependencies: follow-redirects "^1.14.0" -axobject-query@^2.2.0: - version "2.2.0" - resolved "https://registry.npmjs.org/axobject-query/-/axobject-query-2.2.0.tgz" - integrity sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA== +axobject-query@3.1.1: + version "3.1.1" + resolved "https://registry.npmjs.org/axobject-query/-/axobject-query-3.1.1.tgz" + integrity sha512-goKlv8DZrK9hUh975fnHzhNIO4jUnFCfv/dszV5VwUGDFjI6vQ2VwoyjYjYNEbBE8AH87TduWP5uyDR1D+Iteg== + dependencies: + deep-equal "^2.0.5" babel-loader@8.2.5: version "8.2.5" @@ -3647,7 +3567,7 @@ binary-extensions@^2.0.0: resolved "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz" integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== -bl@^4.0.3, bl@^4.1.0: +bl@^4.1.0: version "4.1.0" resolved "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz" integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== @@ -4049,14 +3969,6 @@ chalk@~4.1.0: ansi-styles "^4.1.0" supports-color "^7.1.0" -chalk@4.1.0: - version "4.1.0" - resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz" - integrity sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - chalk@4.1.2: version "4.1.2" resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" @@ -4149,7 +4061,7 @@ clean-stack@^2.0.0: resolved "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz" integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== -cli-cursor@^3.1.0, cli-cursor@3.1.0: +cli-cursor@^3.1.0: version "3.1.0" resolved "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz" integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== @@ -4168,11 +4080,6 @@ cli-spinners@^2.5.0: resolved "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.8.0.tgz" integrity sha512-/eG5sJcvEIwxcdYM86k5tPwn0MUzkX5YY3eImTGpJOZgVe4SdTMY14vQpcxgBzJ0wXwAYrS8E+c3uHeK4JNyzQ== -cli-spinners@2.6.1: - version "2.6.1" - resolved "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.6.1.tgz" - integrity sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g== - cli-table3@~0.6.1: version "0.6.3" resolved "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.3.tgz" @@ -4491,11 +4398,6 @@ core-js-compat@^3.21.0, core-js-compat@^3.22.1, core-js-compat@^3.25.1: dependencies: browserslist "^4.21.5" -core-js-pure@^3.25.1: - version "3.30.0" - resolved "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.30.0.tgz" - integrity sha512-+2KbMFGeBU0ln/csoPqTe0i/yfHbrd2EUhNMObsGtXMKS/RTtlkYyi+/3twLcevbgNR0yM/r0Psa3TEoQRpFMQ== - core-js@^3.7.0, core-js@^3.8.1: version "3.30.0" resolved "https://registry.npmjs.org/core-js/-/core-js-3.30.0.tgz" @@ -4845,6 +4747,29 @@ decimal.js@^10.2.1, decimal.js@^10.3.1, decimal.js@^10.4.2: resolved "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz" integrity sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA== +deep-equal@^2.0.5: + version "2.2.0" + resolved "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.0.tgz" + integrity sha512-RdpzE0Hv4lhowpIUKKMJfeH6C1pXdtT1/it80ubgWqwI3qpuxUBpC1S4hnHg+zjnuOoDkzUtUCEEkG+XG5l3Mw== + dependencies: + call-bind "^1.0.2" + es-get-iterator "^1.1.2" + get-intrinsic "^1.1.3" + is-arguments "^1.1.1" + is-array-buffer "^3.0.1" + is-date-object "^1.0.5" + is-regex "^1.1.4" + is-shared-array-buffer "^1.0.2" + isarray "^2.0.5" + object-is "^1.1.5" + object-keys "^1.1.1" + object.assign "^4.1.4" + regexp.prototype.flags "^1.4.3" + side-channel "^1.0.4" + which-boxed-primitive "^1.0.2" + which-collection "^1.0.1" + which-typed-array "^1.1.9" + deep-freeze@0.0.1: version "0.0.1" resolved "https://registry.npmjs.org/deep-freeze/-/deep-freeze-0.0.1.tgz" @@ -5093,12 +5018,7 @@ domutils@^3.0.1: domelementtype "^2.3.0" domhandler "^5.0.1" -dotenv@~10.0.0: - version "10.0.0" - resolved "https://registry.npmjs.org/dotenv/-/dotenv-10.0.0.tgz" - integrity sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q== - -duplexer@^0.1.1, duplexer@^0.1.2: +duplexer@^0.1.2: version "0.1.2" resolved "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz" integrity sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg== @@ -5130,7 +5050,7 @@ ee-first@1.1.1: resolved "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz" integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== -ejs@^3.1.5, ejs@^3.1.8: +ejs@^3.1.8: version "3.1.9" resolved "https://registry.npmjs.org/ejs/-/ejs-3.1.9.tgz" integrity sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ== @@ -5171,7 +5091,7 @@ encoding@^0.1.0, encoding@^0.1.13: dependencies: iconv-lite "^0.6.2" -end-of-stream@^1.1.0, end-of-stream@^1.4.1: +end-of-stream@^1.1.0: version "1.4.4" resolved "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz" integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== @@ -5218,7 +5138,7 @@ enhanced-resolve@^5.10.0: graceful-fs "^4.2.4" tapable "^2.2.0" -enquirer@^2.3.6, "enquirer@>= 2.3.0 < 3", enquirer@~2.3.6: +enquirer@^2.3.6, "enquirer@>= 2.3.0 < 3": version "2.3.6" resolved "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz" integrity sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg== @@ -5321,6 +5241,21 @@ es-abstract@^1.19.0, es-abstract@^1.20.4: unbox-primitive "^1.0.2" which-typed-array "^1.1.9" +es-get-iterator@^1.1.2: + version "1.1.3" + resolved "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz" + integrity sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.3" + has-symbols "^1.0.3" + is-arguments "^1.1.1" + is-map "^2.0.2" + is-set "^2.0.2" + is-string "^1.0.7" + isarray "^2.0.5" + stop-iteration-iterator "^1.0.0" + es-module-lexer@^0.9.0: version "0.9.3" resolved "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz" @@ -5541,7 +5476,7 @@ eslint-rule-composer@^0.3.0: resolved "https://registry.npmjs.org/eslint-rule-composer/-/eslint-rule-composer-0.3.0.tgz" integrity sha512-bt+Sh8CtDmn2OajxvNO+BX7Wn4CIWMpTRm3MaiKPCQcnnlm0CS2mhui6QaoeQugs+3Kj2ESKEEGJUdVafwhiCg== -eslint-scope@^5.1.0, eslint-scope@^5.1.1, eslint-scope@5.1.1: +eslint-scope@^5.1.1, eslint-scope@5.1.1: version "5.1.1" resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz" integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== @@ -5549,6 +5484,14 @@ eslint-scope@^5.1.0, eslint-scope@^5.1.1, eslint-scope@5.1.1: esrecurse "^4.3.0" estraverse "^4.1.1" +eslint-scope@^7.0.0: + version "7.1.1" + resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz" + integrity sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw== + dependencies: + esrecurse "^4.3.0" + estraverse "^5.2.0" + eslint-scope@^7.1.1: version "7.1.1" resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz" @@ -5569,12 +5512,12 @@ eslint-visitor-keys@^2.0.0: resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz" integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== -eslint-visitor-keys@^3.0.0, eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.0: +eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.0: version "3.4.0" resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.0.tgz" integrity sha512-HPpKPUBQcAsZOsHAFwTtIKcYlCje62XB7SEAcxjtmW6TD1WVpkS6i6/hOVtTZIl4zGj/mBqpFVGvaDneik+VoQ== -eslint@*, "eslint@^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8", "eslint@^6.0.0 || ^7.0.0 || ^8.0.0", "eslint@^6.0.0 || ^7.0.0 || >=8.0.0", "eslint@^7.0.0 || ^8.0.0", eslint@^8.0.0, eslint@^8.2.0, eslint@>=2, eslint@>=5: +eslint@*, "eslint@^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8", "eslint@^6.0.0 || ^7.0.0 || ^8.0.0", "eslint@^6.0.0 || ^7.0.0 || >=8.0.0", "eslint@^7.0.0 || ^8.0.0", "eslint@^7.20.0 || ^8.0.0", eslint@^8.0.0, eslint@^8.28.0, eslint@>=2, eslint@>=5: version "8.38.0" resolved "https://registry.npmjs.org/eslint/-/eslint-8.38.0.tgz" integrity sha512-pIdsD2jwlUGf/U38Jv97t8lq6HpaU/G9NKbYmpWpZGw3LdTNhZLbJePqxOXGB5+JEKfOPU/XLxYxFh03nr1KTg== @@ -5825,17 +5768,6 @@ fast-glob@^3.2.11, fast-glob@^3.2.4, fast-glob@^3.2.9: merge2 "^1.3.0" micromatch "^4.0.4" -fast-glob@3.2.7: - version "3.2.7" - resolved "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz" - integrity sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q== - dependencies: - "@nodelib/fs.stat" "^2.0.2" - "@nodelib/fs.walk" "^1.2.3" - glob-parent "^5.1.2" - merge2 "^1.3.0" - micromatch "^4.0.4" - fast-json-patch@^3.0.0-1: version "3.1.1" resolved "https://registry.npmjs.org/fast-json-patch/-/fast-json-patch-3.1.1.tgz" @@ -5882,7 +5814,7 @@ fd-slicer@~1.1.0: dependencies: pend "~1.2.0" -figures@^3.0.0, figures@^3.2.0, figures@3.2.0: +figures@^3.0.0, figures@^3.2.0: version "3.2.0" resolved "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz" integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg== @@ -5987,17 +5919,12 @@ flat-cache@^3.0.4: flatted "^3.1.0" rimraf "^3.0.2" -flat@^5.0.2: - version "5.0.2" - resolved "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz" - integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== - flatted@^3.1.0, flatted@^3.2.7: version "3.2.7" resolved "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz" integrity sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ== -follow-redirects@^1.0.0, follow-redirects@^1.14.0, follow-redirects@^1.14.9, follow-redirects@^1.15.0: +follow-redirects@^1.0.0, follow-redirects@^1.14.0, follow-redirects@^1.14.9: version "1.15.2" resolved "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz" integrity sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA== @@ -6056,20 +5983,6 @@ fresh@^0.5.2, fresh@0.5.2: resolved "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz" integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== -fs-constants@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz" - integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== - -fs-extra@^11.1.0: - version "11.1.1" - resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.1.tgz" - integrity sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ== - dependencies: - graceful-fs "^4.2.0" - jsonfile "^6.0.1" - universalify "^2.0.0" - fs-extra@^8.1.0: version "8.1.0" resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz" @@ -6147,11 +6060,6 @@ function.prototype.name@^1.1.5: es-abstract "^1.19.0" functions-have-names "^1.2.2" -functional-red-black-tree@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz" - integrity sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g== - functions-have-names@^1.2.2: version "1.2.3" resolved "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz" @@ -6312,18 +6220,6 @@ glob@^9.3.1: minipass "^4.2.4" path-scurry "^1.6.1" -glob@7.1.4: - version "7.1.4" - resolved "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz" - integrity sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.0.4" - once "^1.3.0" - path-is-absolute "^1.0.0" - glob@8.1.0: version "8.1.0" resolved "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz" @@ -6373,18 +6269,6 @@ globby@^11.0.1: merge2 "^1.4.1" slash "^3.0.0" -globby@^11.0.4: - version "11.1.0" - resolved "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz" - integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== - dependencies: - array-union "^2.1.0" - dir-glob "^3.0.1" - fast-glob "^3.2.9" - ignore "^5.2.0" - merge2 "^1.4.1" - slash "^3.0.0" - globby@^11.1.0: version "11.1.0" resolved "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz" @@ -6786,16 +6670,11 @@ ignore-walk@^6.0.0: dependencies: minimatch "^7.4.2" -ignore@^5.0.4, ignore@^5.1.8, ignore@^5.2.0: +ignore@^5.2.0, ignore@5.2.4: version "5.2.4" resolved "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz" integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ== -ignore@5.2.0: - version "5.2.0" - resolved "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz" - integrity sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ== - image-size@~0.5.0: version "0.5.5" resolved "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz" @@ -6896,7 +6775,7 @@ inquirer@8.2.4: through "^2.3.6" wrap-ansi "^7.0.0" -internal-slot@^1.0.5: +internal-slot@^1.0.4, internal-slot@^1.0.5: version "1.0.5" resolved "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz" integrity sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ== @@ -6937,6 +6816,14 @@ ipaddr.js@1.9.1: resolved "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz" integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== +is-arguments@^1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz" + integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + is-array-buffer@^3.0.1, is-array-buffer@^3.0.2: version "3.0.2" resolved "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz" @@ -6997,7 +6884,7 @@ is-core-module@^2.11.0, is-core-module@^2.8.1, is-core-module@^2.9.0: dependencies: has "^1.0.3" -is-date-object@^1.0.1: +is-date-object@^1.0.1, is-date-object@^1.0.5: version "1.0.5" resolved "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz" integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== @@ -7049,6 +6936,11 @@ is-lambda@^1.0.1: resolved "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz" integrity sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ== +is-map@^2.0.1, is-map@^2.0.2: + version "2.0.2" + resolved "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz" + integrity sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg== + is-negative-zero@^2.0.2: version "2.0.2" resolved "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz" @@ -7108,6 +7000,11 @@ is-regex@^1.1.4: call-bind "^1.0.2" has-tostringtag "^1.0.0" +is-set@^2.0.1, is-set@^2.0.2: + version "2.0.2" + resolved "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz" + integrity sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g== + is-shared-array-buffer@^1.0.2: version "1.0.2" resolved "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz" @@ -7155,6 +7052,11 @@ is-unicode-supported@^0.1.0: resolved "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz" integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== +is-weakmap@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz" + integrity sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA== + is-weakref@^1.0.2: version "1.0.2" resolved "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz" @@ -7162,6 +7064,14 @@ is-weakref@^1.0.2: dependencies: call-bind "^1.0.2" +is-weakset@^2.0.1: + version "2.0.2" + resolved "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.2.tgz" + integrity sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.1" + is-what@^3.14.1: version "3.14.1" resolved "https://registry.npmjs.org/is-what/-/is-what-3.14.1.tgz" @@ -7179,6 +7089,11 @@ is-wsl@^2.2.0: dependencies: is-docker "^2.0.0" +isarray@^2.0.5: + version "2.0.5" + resolved "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz" + integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== + isarray@~1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz" @@ -7317,14 +7232,6 @@ js-sdsl@^4.1.4: resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== -js-yaml@^3.10.0: - version "3.14.1" - resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz" - integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== - dependencies: - argparse "^1.0.7" - esprima "^4.0.0" - js-yaml@^3.13.1: version "3.14.1" resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz" @@ -7333,7 +7240,7 @@ js-yaml@^3.13.1: argparse "^1.0.7" esprima "^4.0.0" -js-yaml@^4.1.0, js-yaml@4.1.0: +js-yaml@^4.1.0: version "4.1.0" resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz" integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== @@ -7829,11 +7736,6 @@ lines-and-columns@^1.1.6: resolved "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz" integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== -lines-and-columns@~2.0.3: - version "2.0.3" - resolved "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-2.0.3.tgz" - integrity sha512-cNOjgCnLB+FnvWWtyRTzmB3POJ+cXxTA81LoW7u8JdmhfXzriropYwpjShnz1QLLWsQwY7nIxoDmcPTwphDK9w== - linkify-it@^4.0.1: version "4.0.1" resolved "https://registry.npmjs.org/linkify-it/-/linkify-it-4.0.1.tgz" @@ -8294,13 +8196,6 @@ minimatch@^8.0.3: dependencies: brace-expansion "^2.0.1" -minimatch@3.0.5: - version "3.0.5" - resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.0.5.tgz" - integrity sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw== - dependencies: - brace-expansion "^1.1.7" - minimist@^1.2.0, minimist@^1.2.6: version "1.2.8" resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz" @@ -8519,6 +8414,11 @@ nanoid@^3.3.4: resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz" integrity sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA== +natural-compare-lite@^1.4.0: + version "1.4.0" + resolved "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz" + integrity sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g== + natural-compare@^1.4.0: version "1.4.0" resolved "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz" @@ -8602,7 +8502,7 @@ nice-napi@^1.0.2: node-addon-api "^3.0.0" node-gyp-build "^4.2.2" -node-addon-api@^3.0.0, node-addon-api@^3.2.1: +node-addon-api@^3.0.0: version "3.2.1" resolved "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.1.tgz" integrity sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A== @@ -8619,7 +8519,7 @@ node-forge@^1: resolved "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz" integrity sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA== -node-gyp-build@^4.2.2, node-gyp-build@^4.3.0: +node-gyp-build@^4.2.2: version "4.6.0" resolved "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.6.0.tgz" integrity sha512-NTZVKn9IylLwUzaKjkas1e4u2DLNcV4rdYagA4PWdPwW87Bi7z+BznyKSRwS/761tV/lzCGXplWsiaMjLqP2zQ== @@ -8793,64 +8693,6 @@ nwsapi@^2.2.0, nwsapi@^2.2.2: resolved "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.3.tgz" integrity sha512-jscxIO4/VKScHlbmFBdV1Z6LXnLO+ZR4VMtypudUdfwtKxUN3TQcNFIHLwKtrUbDyHN4/GycY9+oRGZ2XMXYPw== -nx@13.1.3: - version "13.1.3" - resolved "https://registry.npmjs.org/nx/-/nx-13.1.3.tgz" - integrity sha512-clM0NQhQKYkqcNz2E3uYRMLwhp2L/9dBhJhQi9XBX4IAyA2gWAomhRIlLm5Xxg3g4h1xwSpP3eJ5t89VikY8Pw== - dependencies: - "@nrwl/cli" "*" - -nx@15.9.2: - version "15.9.2" - resolved "https://registry.npmjs.org/nx/-/nx-15.9.2.tgz" - integrity sha512-wtcs+wsuplSckvgk+bV+/XuGlo+sVWzSG0RpgWBjQYeqA3QsVFEAPVY66Z5cSoukDbTV77ddcAjEw+Rz8oOR1A== - dependencies: - "@nrwl/cli" "15.9.2" - "@nrwl/tao" "15.9.2" - "@parcel/watcher" "2.0.4" - "@yarnpkg/lockfile" "^1.1.0" - "@yarnpkg/parsers" "^3.0.0-rc.18" - "@zkochan/js-yaml" "0.0.6" - axios "^1.0.0" - chalk "^4.1.0" - cli-cursor "3.1.0" - cli-spinners "2.6.1" - cliui "^7.0.2" - dotenv "~10.0.0" - enquirer "~2.3.6" - fast-glob "3.2.7" - figures "3.2.0" - flat "^5.0.2" - fs-extra "^11.1.0" - glob "7.1.4" - ignore "^5.0.4" - js-yaml "4.1.0" - jsonc-parser "3.2.0" - lines-and-columns "~2.0.3" - minimatch "3.0.5" - npm-run-path "^4.0.1" - open "^8.4.0" - semver "7.3.4" - string-width "^4.2.3" - strong-log-transformer "^2.1.0" - tar-stream "~2.2.0" - tmp "~0.2.1" - tsconfig-paths "^4.1.2" - tslib "^2.3.0" - v8-compile-cache "2.3.0" - yargs "^17.6.2" - yargs-parser "21.1.1" - optionalDependencies: - "@nrwl/nx-darwin-arm64" "15.9.2" - "@nrwl/nx-darwin-x64" "15.9.2" - "@nrwl/nx-linux-arm-gnueabihf" "15.9.2" - "@nrwl/nx-linux-arm64-gnu" "15.9.2" - "@nrwl/nx-linux-arm64-musl" "15.9.2" - "@nrwl/nx-linux-x64-gnu" "15.9.2" - "@nrwl/nx-linux-x64-musl" "15.9.2" - "@nrwl/nx-win32-arm64-msvc" "15.9.2" - "@nrwl/nx-win32-x64-msvc" "15.9.2" - object-assign@^4, object-assign@^4.1.1: version "4.1.1" resolved "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" @@ -8861,6 +8703,14 @@ object-inspect@^1.12.3, object-inspect@^1.9.0: resolved "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz" integrity sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g== +object-is@^1.1.5: + version "1.1.5" + resolved "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz" + integrity sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + object-keys@^1.1.1: version "1.1.1" resolved "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz" @@ -8928,7 +8778,7 @@ onetime@^5.1.0, onetime@^5.1.2: dependencies: mimic-fn "^2.1.0" -open@^8.0.9, open@^8.4.0, open@8.4.0: +open@^8.0.9, open@8.4.0: version "8.4.0" resolved "https://registry.npmjs.org/open/-/open-8.4.0.tgz" integrity sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q== @@ -9816,11 +9666,6 @@ proxy-addr@~2.0.7: forwarded "0.2.0" ipaddr.js "1.9.1" -proxy-from-env@^1.1.0: - version "1.1.0" - resolved "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz" - integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== - proxy-from-env@1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.0.0.tgz" @@ -10166,7 +10011,7 @@ readable-stream@^2.0.1: string_decoder "~1.1.1" util-deprecate "~1.0.1" -readable-stream@^3.0.6, readable-stream@^3.1.1, readable-stream@^3.4.0, readable-stream@^3.6.0: +readable-stream@^3.0.6, readable-stream@^3.4.0, readable-stream@^3.6.0: version "3.6.2" resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz" integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== @@ -10261,11 +10106,6 @@ regexp.prototype.flags@^1.4.3: define-properties "^1.1.3" functions-have-names "^1.2.2" -regexpp@^3.2.0: - version "3.2.0" - resolved "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz" - integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== - regexpu-core@^5.3.1: version "5.3.2" resolved "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz" @@ -10432,11 +10272,6 @@ rx@4.1.0: resolved "https://registry.npmjs.org/rx/-/rx-4.1.0.tgz" integrity sha512-CiaiuN6gapkdl+cZUr67W6I8jquN4lkak3vtIsIWCl4XIPP8ffsoyN6/+PuGXnQy8Cu8W2y9Xxh31Rq4M6wUug== -rxjs-for-await@0.0.2: - version "0.0.2" - resolved "https://registry.npmjs.org/rxjs-for-await/-/rxjs-for-await-0.0.2.tgz" - integrity sha512-IJ8R/ZCFMHOcDIqoABs82jal00VrZx8Xkgfe7TOKoaRPAW5nH/VFlG23bXpeGdrmtqI9UobFPgUKgCuFc7Lncw== - rxjs-report-usage@^1.0.4: version "1.0.6" resolved "https://registry.npmjs.org/rxjs-report-usage/-/rxjs-report-usage-1.0.6.tgz" @@ -10462,20 +10297,13 @@ rxjs-spy@^8.0.2: rxjs-report-usage "^1.0.4" stacktrace-gps "^3.0.2" -rxjs@^6.0.0, "rxjs@^6.5.3 || ^7.4.0", rxjs@^7.0.0, rxjs@^7.5.1, rxjs@^7.5.5, rxjs@>=6.5.3: +"rxjs@^6.5.3 || ^7.4.0", rxjs@^7.0.0, rxjs@^7.5.1, rxjs@^7.5.5, rxjs@>=6.5.3: version "7.8.0" resolved "https://registry.npmjs.org/rxjs/-/rxjs-7.8.0.tgz" integrity sha512-F2+gxDshqmIub1KdvZkaEfGDwLNpPvk9Fs6LD/MyQxNgMds/WH9OdDDXOmxUZpME+iSK3rQCctkL0DYyytUqMg== dependencies: tslib "^2.1.0" -rxjs@^6.5.4: - version "6.6.7" - resolved "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz" - integrity sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ== - dependencies: - tslib "^1.9.0" - rxjs@^6.5.5, rxjs@~6.6.0, rxjs@6.6.7: version "6.6.7" resolved "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz" @@ -10730,13 +10558,6 @@ semver@~7.0.0: resolved "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz" integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A== -semver@7.3.4: - version "7.3.4" - resolved "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz" - integrity sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw== - dependencies: - lru-cache "^6.0.0" - semver@7.3.7: version "7.3.7" resolved "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz" @@ -11226,6 +11047,13 @@ statuses@2.0.1: resolved "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz" integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== +stop-iteration-iterator@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz" + integrity sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ== + dependencies: + internal-slot "^1.0.4" + stream-throttle@^0.1.3: version "0.1.3" resolved "https://registry.npmjs.org/stream-throttle/-/stream-throttle-0.1.3.tgz" @@ -11322,15 +11150,6 @@ strip-json-comments@^3.1.0, strip-json-comments@^3.1.1, strip-json-comments@3.1. resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== -strong-log-transformer@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/strong-log-transformer/-/strong-log-transformer-2.1.0.tgz" - integrity sha512-B3Hgul+z0L9a236FAUC9iZsL+nVHgoCJnqCbN588DjYxvGXaXaaFbfmQ/JhvKjZwsOukuR72XbHv71Qkug0HxA== - dependencies: - duplexer "^0.1.1" - minimist "^1.2.0" - through "^2.3.4" - stylus-loader@7.0.0: version "7.0.0" resolved "https://registry.npmjs.org/stylus-loader/-/stylus-loader-7.0.0.tgz" @@ -11399,17 +11218,6 @@ tapable@^2.1.1, tapable@^2.2.0: resolved "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz" integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== -tar-stream@~2.2.0: - version "2.2.0" - resolved "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz" - integrity sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ== - dependencies: - bl "^4.0.3" - end-of-stream "^1.4.1" - fs-constants "^1.0.0" - inherits "^2.0.3" - readable-stream "^3.1.1" - tar@^6.0.2, tar@^6.1.11, tar@^6.1.2: version "6.1.13" resolved "https://registry.npmjs.org/tar/-/tar-6.1.13.tgz" @@ -11487,7 +11295,7 @@ throttleit@^1.0.0: resolved "https://registry.npmjs.org/throttleit/-/throttleit-1.0.0.tgz" integrity sha512-rkTVqu6IjfQ/6+uNuuc3sZek4CEYxTJom3IktzgdSxcZqdARuebbA/f4QmAxMQIxqq9ZLEUkSYqvuk1I6VKq4g== -through@^2.3.4, through@^2.3.6, through@^2.3.8: +through@^2.3.6, through@^2.3.8: version "2.3.8" resolved "https://registry.npmjs.org/through/-/through-2.3.8.tgz" integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== @@ -11651,15 +11459,6 @@ tsconfig-paths@^3.14.1, tsconfig-paths@^3.9.0: minimist "^1.2.6" strip-bom "^3.0.0" -tsconfig-paths@^4.1.2: - version "4.2.0" - resolved "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz" - integrity sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg== - dependencies: - json5 "^2.2.2" - minimist "^1.2.6" - strip-bom "^3.0.0" - tslib@^1.8.1: version "1.14.1" resolved "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz" @@ -11670,7 +11469,7 @@ tslib@^1.9.0: resolved "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== -tslib@^2.0.0, tslib@^2.0.3, tslib@^2.1.0, tslib@^2.2.0, tslib@^2.3.0, tslib@^2.3.1, tslib@^2.4.0, tslib@2.5.0: +tslib@^2.0.0, tslib@^2.0.3, tslib@^2.1.0, tslib@^2.2.0, tslib@^2.3.0, tslib@^2.3.1, tslib@2.5.0: version "2.5.0" resolved "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz" integrity sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg== @@ -11970,11 +11769,6 @@ v8-compile-cache-lib@^3.0.1: resolved "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz" integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== -v8-compile-cache@2.3.0: - version "2.3.0" - resolved "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz" - integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA== - valid-data-url@^3.0.0: version "3.0.1" resolved "https://registry.npmjs.org/valid-data-url/-/valid-data-url-3.0.1.tgz" @@ -12438,6 +12232,16 @@ which-boxed-primitive@^1.0.2: is-string "^1.0.5" is-symbol "^1.0.3" +which-collection@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz" + integrity sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A== + dependencies: + is-map "^2.0.1" + is-set "^2.0.1" + is-weakmap "^2.0.1" + is-weakset "^2.0.1" + which-typed-array@^1.1.9: version "1.1.9" resolved "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz" @@ -12591,16 +12395,11 @@ yargs-parser@^20.2.2: resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz" integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== -yargs-parser@^21.1.1, yargs-parser@21.1.1: +yargs-parser@^21.1.1: version "21.1.1" resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz" integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== -yargs-parser@20.0.0: - version "20.0.0" - resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.0.0.tgz" - integrity sha512-8eblPHTL7ZWRkyjIZJjnGf+TijiKJSwA24svzLRVvtgoi/RZiKa9fFQTrlx0OKLnyHSdt/enrdadji6WFfESVA== - yargs@^16.1.1: version "16.2.0" resolved "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz" @@ -12614,7 +12413,7 @@ yargs@^16.1.1: y18n "^5.0.5" yargs-parser "^20.2.2" -yargs@^17.2.1, yargs@^17.3.1, yargs@^17.6.2: +yargs@^17.2.1, yargs@^17.3.1: version "17.7.1" resolved "https://registry.npmjs.org/yargs/-/yargs-17.7.1.tgz" integrity sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw== From 6deba3182867ecab1f0c6bd823643a50234619ae Mon Sep 17 00:00:00 2001 From: Kristof De Langhe Date: Wed, 12 Apr 2023 11:42:16 +0200 Subject: [PATCH 078/409] 101108: Automatic ng update @ngtools/webpack@15 --- package.json | 4 ++-- yarn.lock | 21 ++++++++------------- 2 files changed, 10 insertions(+), 15 deletions(-) diff --git a/package.json b/package.json index dd8b9c0827..04ed4b1a30 100644 --- a/package.json +++ b/package.json @@ -147,7 +147,7 @@ "@cypress/schematic": "^1.5.0", "@fortawesome/fontawesome-free": "^6.2.1", "@ngrx/store-devtools": "^13.0.2", - "@ngtools/webpack": "^13.2.6", + "@ngtools/webpack": "^15.2.5", "@nguniversal/builders": "^15.2.0", "@types/deep-freeze": "0.1.2", "@types/ejs": "^3.1.1", @@ -203,4 +203,4 @@ "webpack-cli": "^4.2.0", "webpack-dev-server": "^4.5.0" } -} +} \ No newline at end of file diff --git a/yarn.lock b/yarn.lock index 0d9a7242ed..5e40456156 100644 --- a/yarn.lock +++ b/yarn.lock @@ -380,7 +380,7 @@ dependencies: tslib "^2.3.0" -"@angular/compiler-cli@^13.0.0", "@angular/compiler-cli@^14.0.0", "@angular/compiler-cli@^15.0.0", "@angular/compiler-cli@^15.2.6", "@angular/compiler-cli@14.3.0", "@angular/compiler-cli@15.2.6": +"@angular/compiler-cli@^14.0.0", "@angular/compiler-cli@^15.0.0", "@angular/compiler-cli@^15.2.6", "@angular/compiler-cli@14.3.0", "@angular/compiler-cli@15.2.6": version "15.2.6" resolved "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-15.2.6.tgz" integrity sha512-GHwL4l+NkaUGGdypF+nMFWCmTqvGusTzIriIwpnp38wc8lpmVME2jVodB6sHAkrxFmaHXU/gOCDFK4AnOi6Gmw== @@ -2094,21 +2094,16 @@ dependencies: tslib "^2.0.0" -"@ngtools/webpack@^13.2.6": - version "13.3.11" - resolved "https://registry.npmjs.org/@ngtools/webpack/-/webpack-13.3.11.tgz" - integrity sha512-gB33hTbc/RJmHyIgSUYj8ErPazhYYm7yfapOnvwHdYhCjrj1TKkR1ierOlhJtpfBYUQg6FChdl2YpyIQNPjWMA== +"@ngtools/webpack@^15.2.5", "@ngtools/webpack@15.2.5": + version "15.2.5" + resolved "https://registry.npmjs.org/@ngtools/webpack/-/webpack-15.2.5.tgz" + integrity sha512-wD6GY4xghVK+SQL0dy/M3saGx5pqi7+1VHEr+BBI7IUNYGSqPNzylKNxLBgQiTzfkzvbrZ6MhfaMNkhvSCYr5w== "@ngtools/webpack@14.2.11": version "14.2.11" resolved "https://registry.npmjs.org/@ngtools/webpack/-/webpack-14.2.11.tgz" integrity sha512-4enbLFAp98uTgWYF6OFceQqLcfv2/0brIrNN4iWT9xe/Mh3zdCt+eH42zvNRsqo9WXNWRSLvnx8I924p83LNlw== -"@ngtools/webpack@15.2.5": - version "15.2.5" - resolved "https://registry.npmjs.org/@ngtools/webpack/-/webpack-15.2.5.tgz" - integrity sha512-wD6GY4xghVK+SQL0dy/M3saGx5pqi7+1VHEr+BBI7IUNYGSqPNzylKNxLBgQiTzfkzvbrZ6MhfaMNkhvSCYr5w== - "@nguniversal/builders@^15.2.0": version "15.2.0" resolved "https://registry.npmjs.org/@nguniversal/builders/-/builders-15.2.0.tgz" @@ -11576,7 +11571,7 @@ typescript-tuple@^2.2.1: dependencies: typescript-compare "^0.0.2" -typescript@*, "typescript@^3.7.5 || ^4.0.0 || ^5.0.0", typescript@>=2.7, "typescript@>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta", "typescript@>=3.2.x || >= 4.x", typescript@>=3.7.5, "typescript@>=4.4.3 <4.7", "typescript@>=4.6.2 <4.9", "typescript@>=4.8.2 <5.0", typescript@~4.8.4: +typescript@*, "typescript@^3.7.5 || ^4.0.0 || ^5.0.0", typescript@>=2.7, "typescript@>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta", "typescript@>=3.2.x || >= 4.x", typescript@>=3.7.5, "typescript@>=4.6.2 <4.9", "typescript@>=4.8.2 <5.0", typescript@~4.8.4: version "4.8.4" resolved "https://registry.npmjs.org/typescript/-/typescript-4.8.4.tgz" integrity sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ== @@ -12090,7 +12085,7 @@ webpack-subresource-integrity@5.1.0: dependencies: typed-assert "^1.0.8" -"webpack@^4.0.0 || ^5.0.0", "webpack@^4.37.0 || ^5.0.0", webpack@^5.0.0, webpack@^5.1.0, webpack@^5.12.0, webpack@^5.30.0, webpack@^5.72.1, webpack@^5.76.0, webpack@>=5, "webpack@4.x.x || 5.x.x": +"webpack@^4.0.0 || ^5.0.0", "webpack@^4.37.0 || ^5.0.0", webpack@^5.0.0, webpack@^5.1.0, webpack@^5.12.0, webpack@^5.30.0, webpack@^5.54.0, webpack@^5.72.1, webpack@^5.76.0, webpack@>=5, "webpack@4.x.x || 5.x.x": version "5.78.0" resolved "https://registry.npmjs.org/webpack/-/webpack-5.78.0.tgz" integrity sha512-gT5DP72KInmE/3azEaQrISjTvLYlSM0j1Ezhht/KLVkrqtv10JoP/RXhwmX/frrutOPuSq3o5Vq0ehR/4Vmd1g== @@ -12120,7 +12115,7 @@ webpack-subresource-integrity@5.1.0: watchpack "^2.4.0" webpack-sources "^3.2.3" -webpack@^5.54.0, webpack@>=2, webpack@5.76.1: +webpack@>=2, webpack@5.76.1: version "5.76.1" resolved "https://registry.npmjs.org/webpack/-/webpack-5.76.1.tgz" integrity sha512-4+YIK4Abzv8172/SGqObnUjaIHjLEuUasz9EwQj/9xmPPkYJy2Mh03Q/lJfSD3YLzbxy5FeTq5Uw0323Oh6SJQ== From d705de1b4fa5501fbeecf60c3cc8a304bbbe65de Mon Sep 17 00:00:00 2001 From: Kristof De Langhe Date: Wed, 12 Apr 2023 11:58:10 +0200 Subject: [PATCH 079/409] 101108: Automatic ng update ngx-ui-switch@14 --- package.json | 2 +- yarn.lock | 18 +++++++++--------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/package.json b/package.json index 04ed4b1a30..acc59b6ecb 100644 --- a/package.json +++ b/package.json @@ -120,7 +120,7 @@ "ngx-infinite-scroll": "^10.0.1", "ngx-pagination": "5.0.0", "ngx-sortablejs": "^11.1.0", - "ngx-ui-switch": "^13.0.2", + "ngx-ui-switch": "^14.0.3", "nouislider": "^14.6.3", "pem": "1.14.4", "prop-types": "^15.7.2", diff --git a/yarn.lock b/yarn.lock index 5e40456156..e2f2808f01 100644 --- a/yarn.lock +++ b/yarn.lock @@ -333,7 +333,7 @@ "@angular-eslint/bundled-angular-compiler" "15.2.1" "@typescript-eslint/utils" "5.48.2" -"@angular/animations@^15.2.6", "@angular/animations@>=13.0.0 <14", "@angular/animations@>=5.0.0 <14.0.0", "@angular/animations@15.2.6": +"@angular/animations@^15.2.6", "@angular/animations@>=10.0.0", "@angular/animations@>=13.0.0 <14", "@angular/animations@15.2.6": version "15.2.6" resolved "https://registry.npmjs.org/@angular/animations/-/animations-15.2.6.tgz" integrity sha512-2fEhhj7xTzWHD61B502eXwDclsurkOK7CU+iRdl8EAtEobLRt62sG/XHmJ71UaaniWyI/H0sUSEJuF8TIPcaoQ== @@ -373,7 +373,7 @@ symbol-observable "4.0.0" yargs "17.6.2" -"@angular/common@*", "@angular/common@^11.0.0", "@angular/common@^13.0.0", "@angular/common@^13.0.0 || ^14.0.0-0", "@angular/common@^13.3.4", "@angular/common@^15.0.0", "@angular/common@^15.2.6", "@angular/common@>=10.0.0", "@angular/common@>=13.0.0 <14", "@angular/common@>=13.0.0-0", "@angular/common@>=2.x", "@angular/common@>=5.0.0", "@angular/common@>=5.0.0 <14.0.0", "@angular/common@15.2.6", "@angular/common@5.0.0-alpha - 5 || 6.0.0-alpha - 6 || 7.0.0-alpha - 7 || 8.0.0-alpha - 8 || 9.0.0-alpha - 9 || 10.0.0-alpha - 10 || 11.0.0-alpha - 11 || 12.0.0-alpha - 12 || 13.0.0-alpha - 13 || 14.0.0-alpha - 14": +"@angular/common@*", "@angular/common@^11.0.0", "@angular/common@^13.0.0", "@angular/common@^13.0.0 || ^14.0.0-0", "@angular/common@^13.3.4", "@angular/common@^15.0.0", "@angular/common@^15.2.6", "@angular/common@>=10.0.0", "@angular/common@>=13.0.0 <14", "@angular/common@>=13.0.0-0", "@angular/common@>=2.x", "@angular/common@>=5.0.0", "@angular/common@15.2.6", "@angular/common@5.0.0-alpha - 5 || 6.0.0-alpha - 6 || 7.0.0-alpha - 7 || 8.0.0-alpha - 8 || 9.0.0-alpha - 9 || 10.0.0-alpha - 10 || 11.0.0-alpha - 11 || 12.0.0-alpha - 12 || 13.0.0-alpha - 13 || 14.0.0-alpha - 14": version "15.2.6" resolved "https://registry.npmjs.org/@angular/common/-/common-15.2.6.tgz" integrity sha512-kPGJoSkFPXsIeHzcjlal8JC8/jYK9qAr+wv+HDX8O1J2FEzQjwoX4SYvpnvVk5WTqUkxMkRCTMu2YFAAmU1+qg== @@ -410,7 +410,7 @@ dependencies: tslib "^2.3.0" -"@angular/core@*", "@angular/core@^11.0.0", "@angular/core@^13.0.0", "@angular/core@^13.0.0 || ^14.0.0-0", "@angular/core@^13.3.4", "@angular/core@^15.0.0", "@angular/core@^15.2.6", "@angular/core@>=10.0.0", "@angular/core@>=12", "@angular/core@>=13.0.0 <14", "@angular/core@>=13.0.0-0", "@angular/core@>=2.x", "@angular/core@>=5.0.0", "@angular/core@>=5.0.0 <14.0.0", "@angular/core@15.2.6", "@angular/core@5.0.0-alpha - 5 || 6.0.0-alpha - 6 || 7.0.0-alpha - 7 || 8.0.0-alpha - 8 || 9.0.0-alpha - 9 || 10.0.0-alpha - 10 || 11.0.0-alpha - 11 || 12.0.0-alpha - 12 || 13.0.0-alpha - 13 || 14.0.0-alpha - 14": +"@angular/core@*", "@angular/core@^11.0.0", "@angular/core@^13.0.0", "@angular/core@^13.0.0 || ^14.0.0-0", "@angular/core@^13.3.4", "@angular/core@^15.0.0", "@angular/core@^15.2.6", "@angular/core@>=10.0.0", "@angular/core@>=12", "@angular/core@>=13.0.0 <14", "@angular/core@>=13.0.0-0", "@angular/core@>=2.x", "@angular/core@>=5.0.0", "@angular/core@15.2.6", "@angular/core@5.0.0-alpha - 5 || 6.0.0-alpha - 6 || 7.0.0-alpha - 7 || 8.0.0-alpha - 8 || 9.0.0-alpha - 9 || 10.0.0-alpha - 10 || 11.0.0-alpha - 11 || 12.0.0-alpha - 12 || 13.0.0-alpha - 13 || 14.0.0-alpha - 14": version "15.2.6" resolved "https://registry.npmjs.org/@angular/core/-/core-15.2.6.tgz" integrity sha512-eN46OfSOLQGN6AciUvyHOJ8xQxmiEakkxJeoG1jwcSRXCjwSYYnQ/6drnhUpq5p43XXBAIduKfJXNztEPvLAkA== @@ -424,7 +424,7 @@ dependencies: tslib "^2.3.0" -"@angular/forms@^13.0.0", "@angular/forms@^15.2.6", "@angular/forms@>=10.0.0", "@angular/forms@>=5.0.0 <14.0.0", "@angular/forms@5.0.0-alpha - 5 || 6.0.0-alpha - 6 || 7.0.0-alpha - 7 || 8.0.0-alpha - 8 || 9.0.0-alpha - 9 || 10.0.0-alpha - 10 || 11.0.0-alpha - 11 || 12.0.0-alpha - 12 || 13.0.0-alpha - 13 || 14.0.0-alpha - 14": +"@angular/forms@^13.0.0", "@angular/forms@^15.2.6", "@angular/forms@>=10.0.0", "@angular/forms@5.0.0-alpha - 5 || 6.0.0-alpha - 6 || 7.0.0-alpha - 7 || 8.0.0-alpha - 8 || 9.0.0-alpha - 9 || 10.0.0-alpha - 10 || 11.0.0-alpha - 11 || 12.0.0-alpha - 12 || 13.0.0-alpha - 13 || 14.0.0-alpha - 14": version "15.2.6" resolved "https://registry.npmjs.org/@angular/forms/-/forms-15.2.6.tgz" integrity sha512-SdZxsE9MUOVMz0FjOwtx1RN/SGpObnAyZBqXNrN0c4BmJg+faJzvKIBBN102CKpWZOGRoq2YYrgxow9StMhxTw== @@ -461,7 +461,7 @@ dependencies: tslib "^2.3.0" -"@angular/platform-browser@^15.2.6", "@angular/platform-browser@>=5.0.0 <14.0.0", "@angular/platform-browser@15.2.6", "@angular/platform-browser@5.0.0-alpha - 5 || 6.0.0-alpha - 6 || 7.0.0-alpha - 7 || 8.0.0-alpha - 8 || 9.0.0-alpha - 9 || 10.0.0-alpha - 10 || 11.0.0-alpha - 11 || 12.0.0-alpha - 12 || 13.0.0-alpha - 13 || 14.0.0-alpha - 14": +"@angular/platform-browser@^15.2.6", "@angular/platform-browser@>=10.0.0", "@angular/platform-browser@15.2.6", "@angular/platform-browser@5.0.0-alpha - 5 || 6.0.0-alpha - 6 || 7.0.0-alpha - 7 || 8.0.0-alpha - 8 || 9.0.0-alpha - 9 || 10.0.0-alpha - 10 || 11.0.0-alpha - 11 || 12.0.0-alpha - 12 || 13.0.0-alpha - 13 || 14.0.0-alpha - 14": version "15.2.6" resolved "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-15.2.6.tgz" integrity sha512-8afckDEWfYf+cyxs2SboZBJkiCwFgYE8IH24RUW1t3zLC+wfrTr7UEfrCoD4YJRVJdqnPoRWN5gjz98n3n4zsA== @@ -8482,10 +8482,10 @@ ngx-sortablejs@^11.1.0: dependencies: tslib "^2.0.0" -ngx-ui-switch@^13.0.2: - version "13.0.2" - resolved "https://registry.npmjs.org/ngx-ui-switch/-/ngx-ui-switch-13.0.2.tgz" - integrity sha512-dhRAQZmrSH8l8VVtce/jD0PIwQjagSYPSln9I6A6gda1HIhvU/M6bqOVJLComWX32aVIBewdJP625wp/S3FdTA== +ngx-ui-switch@^14.0.3: + version "14.0.3" + resolved "https://registry.npmjs.org/ngx-ui-switch/-/ngx-ui-switch-14.0.3.tgz" + integrity sha512-SZ8ZnTCuNJgNWuY3/mOG3TdsRUNPCX3vGdCKKx1ZHVMTUynerJQlTWck2JrYlnrexNnd7wy4P10jDvdtDwoYeg== dependencies: tslib "^2.3.0" From 29fe2ef954381c2fe18a0c665de8476d2dc5b206 Mon Sep 17 00:00:00 2001 From: Kristof De Langhe Date: Wed, 12 Apr 2023 12:02:31 +0200 Subject: [PATCH 080/409] 101108: Automatic ng update @nguniversal/express-engine@14 --- package.json | 2 +- yarn.lock | 62 +++++++++++++++++++++++----------------------------- 2 files changed, 28 insertions(+), 36 deletions(-) diff --git a/package.json b/package.json index acc59b6ecb..fdbc49ce96 100644 --- a/package.json +++ b/package.json @@ -76,7 +76,7 @@ "@ngrx/effects": "^13.0.2", "@ngrx/router-store": "^13.0.2", "@ngrx/store": "^13.0.2", - "@nguniversal/express-engine": "^13.0.2", + "@nguniversal/express-engine": "^14.2.3", "@ngx-translate/core": "^13.0.0", "@nicky-lenaers/ngx-scroll-to": "^13.0.0", "@types/grecaptcha": "^3.0.4", diff --git a/yarn.lock b/yarn.lock index e2f2808f01..1209016bc5 100644 --- a/yarn.lock +++ b/yarn.lock @@ -373,7 +373,7 @@ symbol-observable "4.0.0" yargs "17.6.2" -"@angular/common@*", "@angular/common@^11.0.0", "@angular/common@^13.0.0", "@angular/common@^13.0.0 || ^14.0.0-0", "@angular/common@^13.3.4", "@angular/common@^15.0.0", "@angular/common@^15.2.6", "@angular/common@>=10.0.0", "@angular/common@>=13.0.0 <14", "@angular/common@>=13.0.0-0", "@angular/common@>=2.x", "@angular/common@>=5.0.0", "@angular/common@15.2.6", "@angular/common@5.0.0-alpha - 5 || 6.0.0-alpha - 6 || 7.0.0-alpha - 7 || 8.0.0-alpha - 8 || 9.0.0-alpha - 9 || 10.0.0-alpha - 10 || 11.0.0-alpha - 11 || 12.0.0-alpha - 12 || 13.0.0-alpha - 13 || 14.0.0-alpha - 14": +"@angular/common@*", "@angular/common@^11.0.0", "@angular/common@^13.0.0", "@angular/common@^13.0.0 || ^14.0.0-0", "@angular/common@^14.2.0", "@angular/common@^15.0.0", "@angular/common@^15.2.6", "@angular/common@>=10.0.0", "@angular/common@>=13.0.0 <14", "@angular/common@>=13.0.0-0", "@angular/common@>=2.x", "@angular/common@>=5.0.0", "@angular/common@15.2.6", "@angular/common@5.0.0-alpha - 5 || 6.0.0-alpha - 6 || 7.0.0-alpha - 7 || 8.0.0-alpha - 8 || 9.0.0-alpha - 9 || 10.0.0-alpha - 10 || 11.0.0-alpha - 11 || 12.0.0-alpha - 12 || 13.0.0-alpha - 13 || 14.0.0-alpha - 14": version "15.2.6" resolved "https://registry.npmjs.org/@angular/common/-/common-15.2.6.tgz" integrity sha512-kPGJoSkFPXsIeHzcjlal8JC8/jYK9qAr+wv+HDX8O1J2FEzQjwoX4SYvpnvVk5WTqUkxMkRCTMu2YFAAmU1+qg== @@ -410,7 +410,7 @@ dependencies: tslib "^2.3.0" -"@angular/core@*", "@angular/core@^11.0.0", "@angular/core@^13.0.0", "@angular/core@^13.0.0 || ^14.0.0-0", "@angular/core@^13.3.4", "@angular/core@^15.0.0", "@angular/core@^15.2.6", "@angular/core@>=10.0.0", "@angular/core@>=12", "@angular/core@>=13.0.0 <14", "@angular/core@>=13.0.0-0", "@angular/core@>=2.x", "@angular/core@>=5.0.0", "@angular/core@15.2.6", "@angular/core@5.0.0-alpha - 5 || 6.0.0-alpha - 6 || 7.0.0-alpha - 7 || 8.0.0-alpha - 8 || 9.0.0-alpha - 9 || 10.0.0-alpha - 10 || 11.0.0-alpha - 11 || 12.0.0-alpha - 12 || 13.0.0-alpha - 13 || 14.0.0-alpha - 14": +"@angular/core@*", "@angular/core@^11.0.0", "@angular/core@^13.0.0", "@angular/core@^13.0.0 || ^14.0.0-0", "@angular/core@^14.2.0", "@angular/core@^15.0.0", "@angular/core@^15.2.6", "@angular/core@>=10.0.0", "@angular/core@>=12", "@angular/core@>=13.0.0 <14", "@angular/core@>=13.0.0-0", "@angular/core@>=2.x", "@angular/core@>=5.0.0", "@angular/core@15.2.6", "@angular/core@5.0.0-alpha - 5 || 6.0.0-alpha - 6 || 7.0.0-alpha - 7 || 8.0.0-alpha - 8 || 9.0.0-alpha - 9 || 10.0.0-alpha - 10 || 11.0.0-alpha - 11 || 12.0.0-alpha - 12 || 13.0.0-alpha - 13 || 14.0.0-alpha - 14": version "15.2.6" resolved "https://registry.npmjs.org/@angular/core/-/core-15.2.6.tgz" integrity sha512-eN46OfSOLQGN6AciUvyHOJ8xQxmiEakkxJeoG1jwcSRXCjwSYYnQ/6drnhUpq5p43XXBAIduKfJXNztEPvLAkA== @@ -468,7 +468,7 @@ dependencies: tslib "^2.3.0" -"@angular/platform-server@^13.3.4", "@angular/platform-server@^15.0.0", "@angular/platform-server@^15.2.6": +"@angular/platform-server@^14.2.0", "@angular/platform-server@^15.0.0", "@angular/platform-server@^15.2.6": version "15.2.6" resolved "https://registry.npmjs.org/@angular/platform-server/-/platform-server-15.2.6.tgz" integrity sha512-/2Ez8V+1s8MYSzq9sFUACJaxjYm/NbksGuKbwxV4oydN082vVgh96er5cOCLDzJLYHq+AeAkV3hL1kGHH5FFEg== @@ -2121,13 +2121,13 @@ rxjs "^6.5.5" tree-kill "^1.2.2" -"@nguniversal/common@13.1.1": - version "13.1.1" - resolved "https://registry.npmjs.org/@nguniversal/common/-/common-13.1.1.tgz" - integrity sha512-DoAPA7+kUz+qMgCTUtRPFcMGY0zz8OSkOTZnxqO5sUYntD6mCEQImHU0WF4ud88j71o0Hv+AISJD1evAAANCdw== +"@nguniversal/common@14.2.3": + version "14.2.3" + resolved "https://registry.npmjs.org/@nguniversal/common/-/common-14.2.3.tgz" + integrity sha512-FWoZY+DZCNw24tNnnWkgTpNAlshkfiaxiT7V+fx2WFpY0LNXLWk45+hWhl4+wFEknOXr/DT/oU1m/RjR6FgXZQ== dependencies: critters "0.0.16" - jsdom "19.0.0" + jsdom "20.0.0" tslib "^2.3.0" "@nguniversal/common@15.2.0": @@ -2139,12 +2139,12 @@ jsdom "21.1.0" tslib "^2.3.0" -"@nguniversal/express-engine@^13.0.2": - version "13.1.1" - resolved "https://registry.npmjs.org/@nguniversal/express-engine/-/express-engine-13.1.1.tgz" - integrity sha512-NdiBP0IRbPrNYEMLy3a6os2mNgRNE84tsMn+mV2uF4wv1JNs3YyoXcucWvhgHdODbDtc6z4CGn8t/6KagRqmvA== +"@nguniversal/express-engine@^14.2.3": + version "14.2.3" + resolved "https://registry.npmjs.org/@nguniversal/express-engine/-/express-engine-14.2.3.tgz" + integrity sha512-8G60LgQViz7caJbmL5f0Cw3mUtchVOiLUf9q1PKKhPVYMv9PVs1roKWuq1yAd4ZVMztBo93gyPt8vQGOo+C9WA== dependencies: - "@nguniversal/common" "13.1.1" + "@nguniversal/common" "14.2.3" tslib "^2.3.0" "@ngx-translate/core@^13.0.0": @@ -4659,7 +4659,7 @@ data-urls@^2.0.0: whatwg-mimetype "^2.3.0" whatwg-url "^8.0.0" -data-urls@^3.0.1, data-urls@^3.0.2: +data-urls@^3.0.2: version "3.0.2" resolved "https://registry.npmjs.org/data-urls/-/data-urls-3.0.2.tgz" integrity sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ== @@ -7285,28 +7285,28 @@ jsdom@^16.4.0: ws "^7.4.6" xml-name-validator "^3.0.0" -jsdom@19.0.0: - version "19.0.0" - resolved "https://registry.npmjs.org/jsdom/-/jsdom-19.0.0.tgz" - integrity sha512-RYAyjCbxy/vri/CfnjUWJQQtZ3LKlLnDqj+9XLNnJPgEGeirZs3hllKR20re8LUZ6o1b1X4Jat+Qd26zmP41+A== +jsdom@20.0.0: + version "20.0.0" + resolved "https://registry.npmjs.org/jsdom/-/jsdom-20.0.0.tgz" + integrity sha512-x4a6CKCgx00uCmP+QakBDFXwjAJ69IkkIWHmtmjd3wvXPcdOS44hfX2vqkOQrVrq8l9DhNNADZRXaCEWvgXtVA== dependencies: - abab "^2.0.5" - acorn "^8.5.0" + abab "^2.0.6" + acorn "^8.7.1" acorn-globals "^6.0.0" cssom "^0.5.0" cssstyle "^2.3.0" - data-urls "^3.0.1" + data-urls "^3.0.2" decimal.js "^10.3.1" domexception "^4.0.0" escodegen "^2.0.0" form-data "^4.0.0" html-encoding-sniffer "^3.0.0" http-proxy-agent "^5.0.0" - https-proxy-agent "^5.0.0" + https-proxy-agent "^5.0.1" is-potential-custom-element-name "^1.0.1" nwsapi "^2.2.0" - parse5 "6.0.1" - saxes "^5.0.1" + parse5 "^7.0.0" + saxes "^6.0.0" symbol-tree "^3.2.4" tough-cookie "^4.0.0" w3c-hr-time "^1.0.2" @@ -7314,8 +7314,8 @@ jsdom@19.0.0: webidl-conversions "^7.0.0" whatwg-encoding "^2.0.0" whatwg-mimetype "^3.0.0" - whatwg-url "^10.0.0" - ws "^8.2.3" + whatwg-url "^11.0.0" + ws "^8.8.0" xml-name-validator "^4.0.0" jsdom@21.1.0: @@ -12183,14 +12183,6 @@ whatwg-mimetype@^3.0.0: resolved "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz" integrity sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q== -whatwg-url@^10.0.0: - version "10.0.0" - resolved "https://registry.npmjs.org/whatwg-url/-/whatwg-url-10.0.0.tgz" - integrity sha512-CLxxCmdUby142H5FZzn4D8ikO1cmypvXVQktsgosNy4a4BHrDHeciBBGZhb0bNoR5/MltoCatso+vFjjGx8t0w== - dependencies: - tr46 "^3.0.0" - webidl-conversions "^7.0.0" - whatwg-url@^11.0.0: version "11.0.0" resolved "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz" @@ -12325,7 +12317,7 @@ ws@^7.4.6: resolved "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz" integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== -ws@^8.11.0, ws@^8.13.0, ws@^8.2.3, ws@^8.4.2: +ws@^8.11.0, ws@^8.13.0, ws@^8.4.2, ws@^8.8.0: version "8.13.0" resolved "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz" integrity sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA== From 83acd1f4b4293b76b1600a2604263d9c15b69539 Mon Sep 17 00:00:00 2001 From: Kristof De Langhe Date: Wed, 12 Apr 2023 12:04:32 +0200 Subject: [PATCH 081/409] 101108: Automatic ng update @nguniversal/express-engine@15 --- package.json | 2 +- yarn.lock | 69 ++++++++-------------------------------------------- 2 files changed, 11 insertions(+), 60 deletions(-) diff --git a/package.json b/package.json index fdbc49ce96..78ea8827ec 100644 --- a/package.json +++ b/package.json @@ -76,7 +76,7 @@ "@ngrx/effects": "^13.0.2", "@ngrx/router-store": "^13.0.2", "@ngrx/store": "^13.0.2", - "@nguniversal/express-engine": "^14.2.3", + "@nguniversal/express-engine": "^15.2.0", "@ngx-translate/core": "^13.0.0", "@nicky-lenaers/ngx-scroll-to": "^13.0.0", "@types/grecaptcha": "^3.0.4", diff --git a/yarn.lock b/yarn.lock index 1209016bc5..29e2a58e90 100644 --- a/yarn.lock +++ b/yarn.lock @@ -373,7 +373,7 @@ symbol-observable "4.0.0" yargs "17.6.2" -"@angular/common@*", "@angular/common@^11.0.0", "@angular/common@^13.0.0", "@angular/common@^13.0.0 || ^14.0.0-0", "@angular/common@^14.2.0", "@angular/common@^15.0.0", "@angular/common@^15.2.6", "@angular/common@>=10.0.0", "@angular/common@>=13.0.0 <14", "@angular/common@>=13.0.0-0", "@angular/common@>=2.x", "@angular/common@>=5.0.0", "@angular/common@15.2.6", "@angular/common@5.0.0-alpha - 5 || 6.0.0-alpha - 6 || 7.0.0-alpha - 7 || 8.0.0-alpha - 8 || 9.0.0-alpha - 9 || 10.0.0-alpha - 10 || 11.0.0-alpha - 11 || 12.0.0-alpha - 12 || 13.0.0-alpha - 13 || 14.0.0-alpha - 14": +"@angular/common@*", "@angular/common@^11.0.0", "@angular/common@^13.0.0", "@angular/common@^13.0.0 || ^14.0.0-0", "@angular/common@^15.0.0", "@angular/common@^15.2.6", "@angular/common@>=10.0.0", "@angular/common@>=13.0.0 <14", "@angular/common@>=13.0.0-0", "@angular/common@>=2.x", "@angular/common@>=5.0.0", "@angular/common@15.2.6", "@angular/common@5.0.0-alpha - 5 || 6.0.0-alpha - 6 || 7.0.0-alpha - 7 || 8.0.0-alpha - 8 || 9.0.0-alpha - 9 || 10.0.0-alpha - 10 || 11.0.0-alpha - 11 || 12.0.0-alpha - 12 || 13.0.0-alpha - 13 || 14.0.0-alpha - 14": version "15.2.6" resolved "https://registry.npmjs.org/@angular/common/-/common-15.2.6.tgz" integrity sha512-kPGJoSkFPXsIeHzcjlal8JC8/jYK9qAr+wv+HDX8O1J2FEzQjwoX4SYvpnvVk5WTqUkxMkRCTMu2YFAAmU1+qg== @@ -410,7 +410,7 @@ dependencies: tslib "^2.3.0" -"@angular/core@*", "@angular/core@^11.0.0", "@angular/core@^13.0.0", "@angular/core@^13.0.0 || ^14.0.0-0", "@angular/core@^14.2.0", "@angular/core@^15.0.0", "@angular/core@^15.2.6", "@angular/core@>=10.0.0", "@angular/core@>=12", "@angular/core@>=13.0.0 <14", "@angular/core@>=13.0.0-0", "@angular/core@>=2.x", "@angular/core@>=5.0.0", "@angular/core@15.2.6", "@angular/core@5.0.0-alpha - 5 || 6.0.0-alpha - 6 || 7.0.0-alpha - 7 || 8.0.0-alpha - 8 || 9.0.0-alpha - 9 || 10.0.0-alpha - 10 || 11.0.0-alpha - 11 || 12.0.0-alpha - 12 || 13.0.0-alpha - 13 || 14.0.0-alpha - 14": +"@angular/core@*", "@angular/core@^11.0.0", "@angular/core@^13.0.0", "@angular/core@^13.0.0 || ^14.0.0-0", "@angular/core@^15.0.0", "@angular/core@^15.2.6", "@angular/core@>=10.0.0", "@angular/core@>=12", "@angular/core@>=13.0.0 <14", "@angular/core@>=13.0.0-0", "@angular/core@>=2.x", "@angular/core@>=5.0.0", "@angular/core@15.2.6", "@angular/core@5.0.0-alpha - 5 || 6.0.0-alpha - 6 || 7.0.0-alpha - 7 || 8.0.0-alpha - 8 || 9.0.0-alpha - 9 || 10.0.0-alpha - 10 || 11.0.0-alpha - 11 || 12.0.0-alpha - 12 || 13.0.0-alpha - 13 || 14.0.0-alpha - 14": version "15.2.6" resolved "https://registry.npmjs.org/@angular/core/-/core-15.2.6.tgz" integrity sha512-eN46OfSOLQGN6AciUvyHOJ8xQxmiEakkxJeoG1jwcSRXCjwSYYnQ/6drnhUpq5p43XXBAIduKfJXNztEPvLAkA== @@ -468,7 +468,7 @@ dependencies: tslib "^2.3.0" -"@angular/platform-server@^14.2.0", "@angular/platform-server@^15.0.0", "@angular/platform-server@^15.2.6": +"@angular/platform-server@^15.0.0", "@angular/platform-server@^15.2.6": version "15.2.6" resolved "https://registry.npmjs.org/@angular/platform-server/-/platform-server-15.2.6.tgz" integrity sha512-/2Ez8V+1s8MYSzq9sFUACJaxjYm/NbksGuKbwxV4oydN082vVgh96er5cOCLDzJLYHq+AeAkV3hL1kGHH5FFEg== @@ -2121,15 +2121,6 @@ rxjs "^6.5.5" tree-kill "^1.2.2" -"@nguniversal/common@14.2.3": - version "14.2.3" - resolved "https://registry.npmjs.org/@nguniversal/common/-/common-14.2.3.tgz" - integrity sha512-FWoZY+DZCNw24tNnnWkgTpNAlshkfiaxiT7V+fx2WFpY0LNXLWk45+hWhl4+wFEknOXr/DT/oU1m/RjR6FgXZQ== - dependencies: - critters "0.0.16" - jsdom "20.0.0" - tslib "^2.3.0" - "@nguniversal/common@15.2.0": version "15.2.0" resolved "https://registry.npmjs.org/@nguniversal/common/-/common-15.2.0.tgz" @@ -2139,12 +2130,12 @@ jsdom "21.1.0" tslib "^2.3.0" -"@nguniversal/express-engine@^14.2.3": - version "14.2.3" - resolved "https://registry.npmjs.org/@nguniversal/express-engine/-/express-engine-14.2.3.tgz" - integrity sha512-8G60LgQViz7caJbmL5f0Cw3mUtchVOiLUf9q1PKKhPVYMv9PVs1roKWuq1yAd4ZVMztBo93gyPt8vQGOo+C9WA== +"@nguniversal/express-engine@^15.2.0": + version "15.2.0" + resolved "https://registry.npmjs.org/@nguniversal/express-engine/-/express-engine-15.2.0.tgz" + integrity sha512-WDHx8iouuAlxaYQ/Sn3Qebv8ZH20O73yt9Z7xJvPM/8uPvWn/zk3wuCIWGPxars7KdkUa/NbDkRmgTlwqUPA3A== dependencies: - "@nguniversal/common" "14.2.3" + "@nguniversal/common" "15.2.0" tslib "^2.3.0" "@ngx-translate/core@^13.0.0": @@ -4737,7 +4728,7 @@ debug@4.3.2: dependencies: ms "2.1.2" -decimal.js@^10.2.1, decimal.js@^10.3.1, decimal.js@^10.4.2: +decimal.js@^10.2.1, decimal.js@^10.4.2: version "10.4.3" resolved "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz" integrity sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA== @@ -7285,39 +7276,6 @@ jsdom@^16.4.0: ws "^7.4.6" xml-name-validator "^3.0.0" -jsdom@20.0.0: - version "20.0.0" - resolved "https://registry.npmjs.org/jsdom/-/jsdom-20.0.0.tgz" - integrity sha512-x4a6CKCgx00uCmP+QakBDFXwjAJ69IkkIWHmtmjd3wvXPcdOS44hfX2vqkOQrVrq8l9DhNNADZRXaCEWvgXtVA== - dependencies: - abab "^2.0.6" - acorn "^8.7.1" - acorn-globals "^6.0.0" - cssom "^0.5.0" - cssstyle "^2.3.0" - data-urls "^3.0.2" - decimal.js "^10.3.1" - domexception "^4.0.0" - escodegen "^2.0.0" - form-data "^4.0.0" - html-encoding-sniffer "^3.0.0" - http-proxy-agent "^5.0.0" - https-proxy-agent "^5.0.1" - is-potential-custom-element-name "^1.0.1" - nwsapi "^2.2.0" - parse5 "^7.0.0" - saxes "^6.0.0" - symbol-tree "^3.2.4" - tough-cookie "^4.0.0" - w3c-hr-time "^1.0.2" - w3c-xmlserializer "^3.0.0" - webidl-conversions "^7.0.0" - whatwg-encoding "^2.0.0" - whatwg-mimetype "^3.0.0" - whatwg-url "^11.0.0" - ws "^8.8.0" - xml-name-validator "^4.0.0" - jsdom@21.1.0: version "21.1.0" resolved "https://registry.npmjs.org/jsdom/-/jsdom-21.1.0.tgz" @@ -11822,13 +11780,6 @@ w3c-xmlserializer@^2.0.0: dependencies: xml-name-validator "^3.0.0" -w3c-xmlserializer@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-3.0.0.tgz" - integrity sha512-3WFqGEgSXIyGhOmAFtlicJNMjEps8b1MG31NCA0/vOF9+nKMUW1ckhi9cnNHmf88Rzw5V+dwIwsm2C7X8k9aQg== - dependencies: - xml-name-validator "^4.0.0" - w3c-xmlserializer@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz" @@ -12317,7 +12268,7 @@ ws@^7.4.6: resolved "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz" integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== -ws@^8.11.0, ws@^8.13.0, ws@^8.4.2, ws@^8.8.0: +ws@^8.11.0, ws@^8.13.0, ws@^8.4.2: version "8.13.0" resolved "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz" integrity sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA== From 6d855caa33987fbc2344d507986fb4d248d130e1 Mon Sep 17 00:00:00 2001 From: Kristof De Langhe Date: Wed, 12 Apr 2023 12:07:38 +0200 Subject: [PATCH 082/409] 101108: Automatic ng update @ngrx/router-store@15 --- package.json | 8 ++++---- yarn.lock | 36 ++++++++++++++++++------------------ 2 files changed, 22 insertions(+), 22 deletions(-) diff --git a/package.json b/package.json index 78ea8827ec..dbbf30cd26 100644 --- a/package.json +++ b/package.json @@ -73,9 +73,9 @@ "@ng-bootstrap/ng-bootstrap": "^11.0.0", "@ng-dynamic-forms/core": "^15.0.0", "@ng-dynamic-forms/ui-ng-bootstrap": "^15.0.0", - "@ngrx/effects": "^13.0.2", - "@ngrx/router-store": "^13.0.2", - "@ngrx/store": "^13.0.2", + "@ngrx/effects": "^15.4.0", + "@ngrx/router-store": "^15.4.0", + "@ngrx/store": "^15.4.0", "@nguniversal/express-engine": "^15.2.0", "@ngx-translate/core": "^13.0.0", "@nicky-lenaers/ngx-scroll-to": "^13.0.0", @@ -146,7 +146,7 @@ "@angular/language-service": "^15.2.6", "@cypress/schematic": "^1.5.0", "@fortawesome/fontawesome-free": "^6.2.1", - "@ngrx/store-devtools": "^13.0.2", + "@ngrx/store-devtools": "^15.4.0", "@ngtools/webpack": "^15.2.5", "@nguniversal/builders": "^15.2.0", "@types/deep-freeze": "0.1.2", diff --git a/yarn.lock b/yarn.lock index 29e2a58e90..3f5f4de170 100644 --- a/yarn.lock +++ b/yarn.lock @@ -477,7 +477,7 @@ tslib "^2.3.0" xhr2 "^0.2.0" -"@angular/router@^13.0.0", "@angular/router@^15.2.6": +"@angular/router@^15.0.0", "@angular/router@^15.2.6": version "15.2.6" resolved "https://registry.npmjs.org/@angular/router/-/router-15.2.6.tgz" integrity sha512-yB9uc9Xi9N0dErsugleywBA1KYG+GQ9WWSlri34oe2VsCqZazImn71n4wKPtrm2Xiy/mI23wJcr+jiCAtzp49Q== @@ -2066,31 +2066,31 @@ dependencies: tslib "^2.0.0" -"@ngrx/effects@^13.0.2": - version "13.2.0" - resolved "https://registry.npmjs.org/@ngrx/effects/-/effects-13.2.0.tgz" - integrity sha512-HmWggpl3xGQFfUzON/uel5jSyUWsrGZsR5qR/oFLGjPRWzwKfdHrl0OcBl5IhFgFxT74cAi9F4JTICUytGRbFA== +"@ngrx/effects@^15.4.0": + version "15.4.0" + resolved "https://registry.npmjs.org/@ngrx/effects/-/effects-15.4.0.tgz" + integrity sha512-/8gHhOM9aeGaw8OG2LLwi4I4p84xzG0EU9TqWrvQcW74wn8sFZONjLvUte5YOzJ5502PPFFrfXSOc+lHnVAJUA== dependencies: tslib "^2.0.0" -"@ngrx/router-store@^13.0.2": - version "13.2.0" - resolved "https://registry.npmjs.org/@ngrx/router-store/-/router-store-13.2.0.tgz" - integrity sha512-ojHxsGsHljYWiqv/OUQHFLb4ZNvmsBlF+CHGZ7vCwLYJ2d9TB2y5nOezfaZ1L46MLUp+uM3FD3fpnIFwXYsTNw== +"@ngrx/router-store@^15.4.0": + version "15.4.0" + resolved "https://registry.npmjs.org/@ngrx/router-store/-/router-store-15.4.0.tgz" + integrity sha512-uc8gx+SMr2gyly+WSBmGnpHTPsMVhenUG6skH3Qk67hrwdVG3SABjw3qdP4GibbfwwajMQ67sLaLY8PQZ5Sb2g== dependencies: tslib "^2.0.0" -"@ngrx/store-devtools@^13.0.2": - version "13.2.0" - resolved "https://registry.npmjs.org/@ngrx/store-devtools/-/store-devtools-13.2.0.tgz" - integrity sha512-k1NifkR/4OjbjAxauVZODCsgs2owMJXvEX2XoTWth7zscbHE8L3pLd0k1ox5pMPUEqWIptWTaJDzYqnQSoJaaw== +"@ngrx/store-devtools@^15.4.0": + version "15.4.0" + resolved "https://registry.npmjs.org/@ngrx/store-devtools/-/store-devtools-15.4.0.tgz" + integrity sha512-AqWRprSyS3u/vZlpsBOPMW1/0TZS2LE13/KpZedEY+RMCW+mi53esqgrdNGOB3Wr4vrI82Ar9fgaIm4TQO6LPg== dependencies: tslib "^2.0.0" -"@ngrx/store@^13.0.2", "@ngrx/store@13.2.0": - version "13.2.0" - resolved "https://registry.npmjs.org/@ngrx/store/-/store-13.2.0.tgz" - integrity sha512-3wlGMkfe0EXsiS6E6W0wCksuGapa5Z6JVFvKQMHFpXZ3XeixXKlULnemlcdMT7Yrnry+CGOtRHqkmKxLoQzhTw== +"@ngrx/store@^15.4.0", "@ngrx/store@15.4.0": + version "15.4.0" + resolved "https://registry.npmjs.org/@ngrx/store/-/store-15.4.0.tgz" + integrity sha512-OvCuNBHL8mAUnRTS6QSFm+IunspsYNu2cCwDovBNn7EGhxRuGihBeNoX47jCqWPHBFtokj4BlatDfpJ/yCh4xQ== dependencies: tslib "^2.0.0" @@ -10250,7 +10250,7 @@ rxjs-spy@^8.0.2: rxjs-report-usage "^1.0.4" stacktrace-gps "^3.0.2" -"rxjs@^6.5.3 || ^7.4.0", rxjs@^7.0.0, rxjs@^7.5.1, rxjs@^7.5.5, rxjs@>=6.5.3: +"rxjs@^6.5.3 || ^7.4.0", "rxjs@^6.5.3 || ^7.5.0", rxjs@^7.0.0, rxjs@^7.5.1, rxjs@^7.5.5, rxjs@>=6.5.3: version "7.8.0" resolved "https://registry.npmjs.org/rxjs/-/rxjs-7.8.0.tgz" integrity sha512-F2+gxDshqmIub1KdvZkaEfGDwLNpPvk9Fs6LD/MyQxNgMds/WH9OdDDXOmxUZpME+iSK3rQCctkL0DYyytUqMg== From 585ef372435750077e48e1ea13d526bd2c05f12e Mon Sep 17 00:00:00 2001 From: Kristof De Langhe Date: Wed, 12 Apr 2023 12:17:15 +0200 Subject: [PATCH 083/409] 101108: install fixes --- yarn.lock | 2535 +++++++++++++++++++++++++++-------------------------- 1 file changed, 1307 insertions(+), 1228 deletions(-) diff --git a/yarn.lock b/yarn.lock index 3f5f4de170..ac0b11b001 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7,14 +7,6 @@ resolved "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.2.0.tgz" integrity sha512-E09FiIft46CmH5Qnjb0wsW54/YQd69LsxeKUOWawmws1XWvyFGURnAChH0mlr7YPFR1ofwvUQfcL0J3lMxXqPA== -"@ampproject/remapping@^2.1.0": - version "2.2.1" - resolved "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz" - integrity sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg== - dependencies: - "@jridgewell/gen-mapping" "^0.3.0" - "@jridgewell/trace-mapping" "^0.3.9" - "@ampproject/remapping@2.2.0": version "2.2.0" resolved "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz" @@ -23,6 +15,14 @@ "@jridgewell/gen-mapping" "^0.1.0" "@jridgewell/trace-mapping" "^0.3.9" +"@ampproject/remapping@^2.1.0": + version "2.2.1" + resolved "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz" + integrity sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg== + dependencies: + "@jridgewell/gen-mapping" "^0.3.0" + "@jridgewell/trace-mapping" "^0.3.9" + "@angular-builders/custom-webpack@~14.1.0": version "14.1.0" resolved "https://registry.npmjs.org/@angular-builders/custom-webpack/-/custom-webpack-14.1.0.tgz" @@ -36,15 +36,7 @@ tsconfig-paths "^3.9.0" webpack-merge "^5.7.3" -"@angular-devkit/architect@^0.1202.10": - version "0.1202.18" - resolved "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1202.18.tgz" - integrity sha512-C4ASKe+xBjl91MJyHDLt3z7ICPF9FU6B0CeJ1phwrlSHK9lmFG99WGxEj/Tc82+vHyPhajqS5XJ38KyVAPBGzA== - dependencies: - "@angular-devkit/core" "12.2.18" - rxjs "6.6.7" - -"@angular-devkit/architect@>=0.1400.0 < 0.1500.0", "@angular-devkit/architect@0.1402.11": +"@angular-devkit/architect@0.1402.11", "@angular-devkit/architect@>=0.1400.0 < 0.1500.0": version "0.1402.11" resolved "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1402.11.tgz" integrity sha512-RuSZrBQ+QbipAESZ4aXCyAMQHaEaDyyV/FDS9J2HJWfEFbRD5oxlEt/tBC8XjmJQsktaUOh07GT8MNJjPKVAQw== @@ -52,7 +44,7 @@ "@angular-devkit/core" "14.2.11" rxjs "6.6.7" -"@angular-devkit/architect@~0.1502.0": +"@angular-devkit/architect@0.1502.5", "@angular-devkit/architect@~0.1502.0": version "0.1502.5" resolved "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1502.5.tgz" integrity sha512-6KVrXQ/X7W88WSJvYe69ed/2QzQNlObKpj3BWzmcKnA+IvJB37/mvw8VaGFP9y+pDa/b1D1yCDtAJLeP5QY3xg== @@ -60,12 +52,12 @@ "@angular-devkit/core" "15.2.5" rxjs "6.6.7" -"@angular-devkit/architect@0.1502.5": - version "0.1502.5" - resolved "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1502.5.tgz" - integrity sha512-6KVrXQ/X7W88WSJvYe69ed/2QzQNlObKpj3BWzmcKnA+IvJB37/mvw8VaGFP9y+pDa/b1D1yCDtAJLeP5QY3xg== +"@angular-devkit/architect@^0.1202.10": + version "0.1202.18" + resolved "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1202.18.tgz" + integrity sha512-C4ASKe+xBjl91MJyHDLt3z7ICPF9FU6B0CeJ1phwrlSHK9lmFG99WGxEj/Tc82+vHyPhajqS5XJ38KyVAPBGzA== dependencies: - "@angular-devkit/core" "15.2.5" + "@angular-devkit/core" "12.2.18" rxjs "6.6.7" "@angular-devkit/build-angular@^14.0.0": @@ -138,7 +130,7 @@ optionalDependencies: esbuild "0.15.5" -"@angular-devkit/build-angular@^15.0.0", "@angular-devkit/build-angular@^15.2.5": +"@angular-devkit/build-angular@^15.2.5": version "15.2.5" resolved "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-15.2.5.tgz" integrity sha512-D2LxjBtUlgJnPxybOIN0XsENEGkVkqCGBBii5oK84HvgBHXO/EyP1WXpOdb2lOYSUZyjhOOs0q42LCobJoaxUw== @@ -222,7 +214,7 @@ "@angular-devkit/architect" "0.1502.5" rxjs "6.6.7" -"@angular-devkit/core@^12.2.17", "@angular-devkit/core@12.2.18": +"@angular-devkit/core@12.2.18", "@angular-devkit/core@^12.2.17": version "12.2.18" resolved "https://registry.npmjs.org/@angular-devkit/core/-/core-12.2.18.tgz" integrity sha512-GDLHGe9HEY5SRS+NrKr14C8aHsRCiBFkBFSSbeohgLgcgSXzZHFoU84nDWrl3KZNP8oqcUSv5lHu6dLcf2fnww== @@ -234,7 +226,7 @@ rxjs "6.6.7" source-map "0.7.3" -"@angular-devkit/core@^14.0.0", "@angular-devkit/core@14.2.11": +"@angular-devkit/core@14.2.11", "@angular-devkit/core@^14.0.0": version "14.2.11" resolved "https://registry.npmjs.org/@angular-devkit/core/-/core-14.2.11.tgz" integrity sha512-cBIGs6y9rykOQqnuAQOB1DgIRyBFYtvKRJb7QNUfIJ0qUfARKkuV/yikv3lrb95ePGkmoRzmjkFqcFZiYU+r7A== @@ -245,7 +237,7 @@ rxjs "6.6.7" source-map "0.7.4" -"@angular-devkit/core@~15.2.0", "@angular-devkit/core@15.2.5": +"@angular-devkit/core@15.2.5", "@angular-devkit/core@~15.2.0": version "15.2.5" resolved "https://registry.npmjs.org/@angular-devkit/core/-/core-15.2.5.tgz" integrity sha512-ZfjEkAe2yYeekc3xjZ/U4pK9nb+w6BFwAEjou6mE8PWZH7iYskm0YCCXkmu+B+zViEcCLhAkJAxu9MwX4efd8g== @@ -256,7 +248,7 @@ rxjs "6.6.7" source-map "0.7.4" -"@angular-devkit/schematics@^12.2.17", "@angular-devkit/schematics@12.2.18": +"@angular-devkit/schematics@12.2.18", "@angular-devkit/schematics@^12.2.17": version "12.2.18" resolved "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-12.2.18.tgz" integrity sha512-bZ9NS5PgoVfetRC6WeQBHCY5FqPZ9y2TKHUo12sOB2YSL3tgWgh1oXyP8PtX34gasqsLjNULxEQsAQYEsiX/qQ== @@ -333,7 +325,7 @@ "@angular-eslint/bundled-angular-compiler" "15.2.1" "@typescript-eslint/utils" "5.48.2" -"@angular/animations@^15.2.6", "@angular/animations@>=10.0.0", "@angular/animations@>=13.0.0 <14", "@angular/animations@15.2.6": +"@angular/animations@^15.2.6": version "15.2.6" resolved "https://registry.npmjs.org/@angular/animations/-/animations-15.2.6.tgz" integrity sha512-2fEhhj7xTzWHD61B502eXwDclsurkOK7CU+iRdl8EAtEobLRt62sG/XHmJ71UaaniWyI/H0sUSEJuF8TIPcaoQ== @@ -349,7 +341,7 @@ optionalDependencies: parse5 "^5.0.0" -"@angular/cli@^15.2.5", "@angular/cli@>= 15.0.0 < 16.0.0", "@angular/cli@>=12": +"@angular/cli@^15.2.5": version "15.2.5" resolved "https://registry.npmjs.org/@angular/cli/-/cli-15.2.5.tgz" integrity sha512-TmkkeJkdfDkC6b2SNQcLlr1rsl2anc5rrrY3gawOVXYXBExMxAi2SNJsHZzUXfiitW52aZkAyajF1VFazs8PRw== @@ -373,14 +365,14 @@ symbol-observable "4.0.0" yargs "17.6.2" -"@angular/common@*", "@angular/common@^11.0.0", "@angular/common@^13.0.0", "@angular/common@^13.0.0 || ^14.0.0-0", "@angular/common@^15.0.0", "@angular/common@^15.2.6", "@angular/common@>=10.0.0", "@angular/common@>=13.0.0 <14", "@angular/common@>=13.0.0-0", "@angular/common@>=2.x", "@angular/common@>=5.0.0", "@angular/common@15.2.6", "@angular/common@5.0.0-alpha - 5 || 6.0.0-alpha - 6 || 7.0.0-alpha - 7 || 8.0.0-alpha - 8 || 9.0.0-alpha - 9 || 10.0.0-alpha - 10 || 11.0.0-alpha - 11 || 12.0.0-alpha - 12 || 13.0.0-alpha - 13 || 14.0.0-alpha - 14": +"@angular/common@^15.2.6": version "15.2.6" resolved "https://registry.npmjs.org/@angular/common/-/common-15.2.6.tgz" integrity sha512-kPGJoSkFPXsIeHzcjlal8JC8/jYK9qAr+wv+HDX8O1J2FEzQjwoX4SYvpnvVk5WTqUkxMkRCTMu2YFAAmU1+qg== dependencies: tslib "^2.3.0" -"@angular/compiler-cli@^14.0.0", "@angular/compiler-cli@^15.0.0", "@angular/compiler-cli@^15.2.6", "@angular/compiler-cli@14.3.0", "@angular/compiler-cli@15.2.6": +"@angular/compiler-cli@^15.2.6": version "15.2.6" resolved "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-15.2.6.tgz" integrity sha512-GHwL4l+NkaUGGdypF+nMFWCmTqvGusTzIriIwpnp38wc8lpmVME2jVodB6sHAkrxFmaHXU/gOCDFK4AnOi6Gmw== @@ -396,35 +388,21 @@ tslib "^2.3.0" yargs "^17.2.1" -"@angular/compiler@^15.2.6", "@angular/compiler@15.2.6": +"@angular/compiler@^15.2.6": version "15.2.6" resolved "https://registry.npmjs.org/@angular/compiler/-/compiler-15.2.6.tgz" integrity sha512-6oBAIY5KcC1UNsrnWGLcopZ9RD7c0HzpTCQY46N6HytHtUjBvzLbGWZu5MfahPtIjKz9FMVYBX9hugcbVpWnTA== dependencies: tslib "^2.3.0" -"@angular/compiler@14.3.0": - version "14.3.0" - resolved "https://registry.npmjs.org/@angular/compiler/-/compiler-14.3.0.tgz" - integrity sha512-E15Rh0t3vA+bctbKnBCaDmLvc3ix+ZBt6yFZmhZalReQ+KpOlvOJv+L9oiFEgg+rYVl2QdvN7US1fvT0PqswLw== - dependencies: - tslib "^2.3.0" - -"@angular/core@*", "@angular/core@^11.0.0", "@angular/core@^13.0.0", "@angular/core@^13.0.0 || ^14.0.0-0", "@angular/core@^15.0.0", "@angular/core@^15.2.6", "@angular/core@>=10.0.0", "@angular/core@>=12", "@angular/core@>=13.0.0 <14", "@angular/core@>=13.0.0-0", "@angular/core@>=2.x", "@angular/core@>=5.0.0", "@angular/core@15.2.6", "@angular/core@5.0.0-alpha - 5 || 6.0.0-alpha - 6 || 7.0.0-alpha - 7 || 8.0.0-alpha - 8 || 9.0.0-alpha - 9 || 10.0.0-alpha - 10 || 11.0.0-alpha - 11 || 12.0.0-alpha - 12 || 13.0.0-alpha - 13 || 14.0.0-alpha - 14": +"@angular/core@^15.2.6": version "15.2.6" resolved "https://registry.npmjs.org/@angular/core/-/core-15.2.6.tgz" integrity sha512-eN46OfSOLQGN6AciUvyHOJ8xQxmiEakkxJeoG1jwcSRXCjwSYYnQ/6drnhUpq5p43XXBAIduKfJXNztEPvLAkA== dependencies: tslib "^2.3.0" -"@angular/core@14.3.0": - version "14.3.0" - resolved "https://registry.npmjs.org/@angular/core/-/core-14.3.0.tgz" - integrity sha512-wYiwItc0Uyn4FWZ/OAx/Ubp2/WrD3EgUJ476y1XI7yATGPF8n9Ld5iCXT08HOvc4eBcYlDfh90kTXR6/MfhzdQ== - dependencies: - tslib "^2.3.0" - -"@angular/forms@^13.0.0", "@angular/forms@^15.2.6", "@angular/forms@>=10.0.0", "@angular/forms@5.0.0-alpha - 5 || 6.0.0-alpha - 6 || 7.0.0-alpha - 7 || 8.0.0-alpha - 8 || 9.0.0-alpha - 9 || 10.0.0-alpha - 10 || 11.0.0-alpha - 11 || 12.0.0-alpha - 12 || 13.0.0-alpha - 13 || 14.0.0-alpha - 14": +"@angular/forms@^15.2.6": version "15.2.6" resolved "https://registry.npmjs.org/@angular/forms/-/forms-15.2.6.tgz" integrity sha512-SdZxsE9MUOVMz0FjOwtx1RN/SGpObnAyZBqXNrN0c4BmJg+faJzvKIBBN102CKpWZOGRoq2YYrgxow9StMhxTw== @@ -436,7 +414,7 @@ resolved "https://registry.npmjs.org/@angular/language-service/-/language-service-15.2.6.tgz" integrity sha512-q6u4XhFReJ3GtA7dC5rJaEBQPjJUjOz9PlwHSOxZxugFP99ddDNBBFd0caa446G54kQdZFG7j7w7BiAp2/srmQ== -"@angular/localize@^13.0.0", "@angular/localize@^15.0.0", "@angular/localize@15.2.6": +"@angular/localize@15.2.6": version "15.2.6" resolved "https://registry.npmjs.org/@angular/localize/-/localize-15.2.6.tgz" integrity sha512-2WJBYRJ6aulo0fS9BUGr4fsdyk+5WcbZoiFURgs0sNrJtYCd51I9rQNwl3OGyYReNmFx8GgLc4K7+rEKhKfSbA== @@ -445,30 +423,21 @@ glob "8.1.0" yargs "^17.2.1" -"@angular/localize@^14.0.0": - version "14.3.0" - resolved "https://registry.npmjs.org/@angular/localize/-/localize-14.3.0.tgz" - integrity sha512-YmwlOEGnFonfDrIcWqlxXVFFjd0Q6yXeHGZCBFBfwbtjIseiJJ4UBmkTUgFeq7qlWevSFQzHdQnraFRGZpnMig== - dependencies: - "@babel/core" "7.18.9" - glob "8.0.3" - yargs "^17.2.1" - -"@angular/platform-browser-dynamic@^15.2.6", "@angular/platform-browser-dynamic@15.2.6": +"@angular/platform-browser-dynamic@^15.2.6": version "15.2.6" resolved "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-15.2.6.tgz" integrity sha512-ZSyiigpxBWIM5f8t/a28Y3BCzHn1FtI2KsJysE7di5UUflOzwbxbfycVlpiZp0girbDYRyF18vvefvitNh17Gw== dependencies: tslib "^2.3.0" -"@angular/platform-browser@^15.2.6", "@angular/platform-browser@>=10.0.0", "@angular/platform-browser@15.2.6", "@angular/platform-browser@5.0.0-alpha - 5 || 6.0.0-alpha - 6 || 7.0.0-alpha - 7 || 8.0.0-alpha - 8 || 9.0.0-alpha - 9 || 10.0.0-alpha - 10 || 11.0.0-alpha - 11 || 12.0.0-alpha - 12 || 13.0.0-alpha - 13 || 14.0.0-alpha - 14": +"@angular/platform-browser@^15.2.6": version "15.2.6" resolved "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-15.2.6.tgz" integrity sha512-8afckDEWfYf+cyxs2SboZBJkiCwFgYE8IH24RUW1t3zLC+wfrTr7UEfrCoD4YJRVJdqnPoRWN5gjz98n3n4zsA== dependencies: tslib "^2.3.0" -"@angular/platform-server@^15.0.0", "@angular/platform-server@^15.2.6": +"@angular/platform-server@^15.2.6": version "15.2.6" resolved "https://registry.npmjs.org/@angular/platform-server/-/platform-server-15.2.6.tgz" integrity sha512-/2Ez8V+1s8MYSzq9sFUACJaxjYm/NbksGuKbwxV4oydN082vVgh96er5cOCLDzJLYHq+AeAkV3hL1kGHH5FFEg== @@ -477,7 +446,7 @@ tslib "^2.3.0" xhr2 "^0.2.0" -"@angular/router@^15.0.0", "@angular/router@^15.2.6": +"@angular/router@^15.2.6": version "15.2.6" resolved "https://registry.npmjs.org/@angular/router/-/router-15.2.6.tgz" integrity sha512-yB9uc9Xi9N0dErsugleywBA1KYG+GQ9WWSlri34oe2VsCqZazImn71n4wKPtrm2Xiy/mI23wJcr+jiCAtzp49Q== @@ -501,27 +470,6 @@ resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.21.4.tgz" integrity sha512-/DYyDpeCfaVinT40FPGdkkb+lYSKvsVuMjDAG7jPOWWiM1ibOaB9CXJAlc4d1QpP/U2q2P9jbrSlClKSErd55g== -"@babel/core@^7.0.0", "@babel/core@^7.0.0-0", "@babel/core@^7.12.0", "@babel/core@^7.12.3", "@babel/core@^7.13.0", "@babel/core@^7.4.0-0", "@babel/core@7.18.9": - version "7.18.9" - resolved "https://registry.npmjs.org/@babel/core/-/core-7.18.9.tgz" - integrity sha512-1LIb1eL8APMy91/IMW+31ckrfBM4yCoLaVzoDhZUKSM4cu1L1nIidyxkCgzPAgrC5WEz36IPEr/eSeSF9pIn+g== - dependencies: - "@ampproject/remapping" "^2.1.0" - "@babel/code-frame" "^7.18.6" - "@babel/generator" "^7.18.9" - "@babel/helper-compilation-targets" "^7.18.9" - "@babel/helper-module-transforms" "^7.18.9" - "@babel/helpers" "^7.18.9" - "@babel/parser" "^7.18.9" - "@babel/template" "^7.18.6" - "@babel/traverse" "^7.18.9" - "@babel/types" "^7.18.9" - convert-source-map "^1.7.0" - debug "^4.1.0" - gensync "^1.0.0-beta.2" - json5 "^2.2.1" - semver "^6.3.0" - "@babel/core@7.18.10": version "7.18.10" resolved "https://registry.npmjs.org/@babel/core/-/core-7.18.10.tgz" @@ -585,7 +533,28 @@ json5 "^2.2.2" semver "^6.3.0" -"@babel/generator@^7.18.10", "@babel/generator@7.18.12": +"@babel/core@^7.12.3": + version "7.18.9" + resolved "https://registry.npmjs.org/@babel/core/-/core-7.18.9.tgz" + integrity sha512-1LIb1eL8APMy91/IMW+31ckrfBM4yCoLaVzoDhZUKSM4cu1L1nIidyxkCgzPAgrC5WEz36IPEr/eSeSF9pIn+g== + dependencies: + "@ampproject/remapping" "^2.1.0" + "@babel/code-frame" "^7.18.6" + "@babel/generator" "^7.18.9" + "@babel/helper-compilation-targets" "^7.18.9" + "@babel/helper-module-transforms" "^7.18.9" + "@babel/helpers" "^7.18.9" + "@babel/parser" "^7.18.9" + "@babel/template" "^7.18.6" + "@babel/traverse" "^7.18.9" + "@babel/types" "^7.18.9" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.2.1" + semver "^6.3.0" + +"@babel/generator@7.18.12", "@babel/generator@^7.18.10": version "7.18.12" resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.18.12.tgz" integrity sha512-dfQ8ebCN98SvyL7IxNMCUtZQSq5R7kxgN+r8qYTGDmmSion1hX2C0zq2yo1bsCDhXixokv1SAWTZUMYbO/V5zg== @@ -594,6 +563,15 @@ "@jridgewell/gen-mapping" "^0.3.2" jsesc "^2.5.1" +"@babel/generator@7.20.14", "@babel/generator@^7.20.7": + version "7.20.14" + resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.20.14.tgz" + integrity sha512-AEmuXHdcD3A52HHXxaTmYlb8q/xMEhoRP67B3T4Oq7lbmSoqroMZzjnGj3+i1io3pdnF8iBYVu4Ilj+c4hBxYg== + dependencies: + "@babel/types" "^7.20.7" + "@jridgewell/gen-mapping" "^0.3.2" + jsesc "^2.5.1" + "@babel/generator@^7.18.9", "@babel/generator@^7.19.3", "@babel/generator@^7.21.4": version "7.21.4" resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.21.4.tgz" @@ -604,16 +582,7 @@ "@jridgewell/trace-mapping" "^0.3.17" jsesc "^2.5.1" -"@babel/generator@^7.20.7", "@babel/generator@7.20.14": - version "7.20.14" - resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.20.14.tgz" - integrity sha512-AEmuXHdcD3A52HHXxaTmYlb8q/xMEhoRP67B3T4Oq7lbmSoqroMZzjnGj3+i1io3pdnF8iBYVu4Ilj+c4hBxYg== - dependencies: - "@babel/types" "^7.20.7" - "@jridgewell/gen-mapping" "^0.3.2" - jsesc "^2.5.1" - -"@babel/helper-annotate-as-pure@^7.18.6", "@babel/helper-annotate-as-pure@7.18.6": +"@babel/helper-annotate-as-pure@7.18.6", "@babel/helper-annotate-as-pure@^7.18.6": version "7.18.6" resolved "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz" integrity sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA== @@ -776,7 +745,7 @@ dependencies: "@babel/types" "^7.20.0" -"@babel/helper-split-export-declaration@^7.18.6", "@babel/helper-split-export-declaration@7.18.6": +"@babel/helper-split-export-declaration@7.18.6", "@babel/helper-split-export-declaration@^7.18.6": version "7.18.6" resolved "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz" integrity sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA== @@ -847,7 +816,7 @@ "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" "@babel/plugin-proposal-optional-chaining" "^7.20.7" -"@babel/plugin-proposal-async-generator-functions@^7.18.10", "@babel/plugin-proposal-async-generator-functions@7.18.10": +"@babel/plugin-proposal-async-generator-functions@7.18.10", "@babel/plugin-proposal-async-generator-functions@^7.18.10": version "7.18.10" resolved "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.18.10.tgz" integrity sha512-1mFuY2TOsR1hxbjCo4QL+qlIjV07p4H4EUYw2J/WCqsvFV6V9X9z9YhXbWndc/4fw+hYGlDT7egYxliMp5O6Ew== @@ -857,7 +826,7 @@ "@babel/helper-remap-async-to-generator" "^7.18.9" "@babel/plugin-syntax-async-generators" "^7.8.4" -"@babel/plugin-proposal-async-generator-functions@^7.20.1", "@babel/plugin-proposal-async-generator-functions@7.20.7": +"@babel/plugin-proposal-async-generator-functions@7.20.7", "@babel/plugin-proposal-async-generator-functions@^7.20.1": version "7.20.7" resolved "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.7.tgz" integrity sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA== @@ -1098,15 +1067,6 @@ dependencies: "@babel/helper-plugin-utils" "^7.20.2" -"@babel/plugin-transform-async-to-generator@^7.18.6", "@babel/plugin-transform-async-to-generator@7.20.7": - version "7.20.7" - resolved "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.20.7.tgz" - integrity sha512-Uo5gwHPT9vgnSXQxqGtpdufUiWp96gk7yiP4Mp5bm1QMkEmLXBO7PAGYbKoJ6DhAwiNkcHFBol/x5zZZkL/t0Q== - dependencies: - "@babel/helper-module-imports" "^7.18.6" - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/helper-remap-async-to-generator" "^7.18.9" - "@babel/plugin-transform-async-to-generator@7.18.6": version "7.18.6" resolved "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.18.6.tgz" @@ -1116,6 +1076,15 @@ "@babel/helper-plugin-utils" "^7.18.6" "@babel/helper-remap-async-to-generator" "^7.18.6" +"@babel/plugin-transform-async-to-generator@7.20.7", "@babel/plugin-transform-async-to-generator@^7.18.6": + version "7.20.7" + resolved "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.20.7.tgz" + integrity sha512-Uo5gwHPT9vgnSXQxqGtpdufUiWp96gk7yiP4Mp5bm1QMkEmLXBO7PAGYbKoJ6DhAwiNkcHFBol/x5zZZkL/t0Q== + dependencies: + "@babel/helper-module-imports" "^7.18.6" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-remap-async-to-generator" "^7.18.9" + "@babel/plugin-transform-block-scoped-functions@^7.18.6": version "7.18.6" resolved "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.18.6.tgz" @@ -1553,7 +1522,7 @@ resolved "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz" integrity sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA== -"@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2", "@babel/runtime@^7.12.0", "@babel/runtime@^7.14.5", "@babel/runtime@^7.15.4", "@babel/runtime@^7.3.1", "@babel/runtime@^7.4.4", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.3", "@babel/runtime@^7.8.3", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2", "@babel/runtime@>=7", "@babel/runtime@7.17.2": +"@babel/runtime@7.17.2", "@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2", "@babel/runtime@^7.12.0", "@babel/runtime@^7.14.5", "@babel/runtime@^7.15.4", "@babel/runtime@^7.3.1", "@babel/runtime@^7.4.4", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.3", "@babel/runtime@^7.8.3", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2": version "7.17.2" resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.17.2.tgz" integrity sha512-hzeyJyMA1YGdJTuWU0e/j4wKXrU4OMFvY2MSlaI9B7VQb0r5cxTE3EAIS2Q7Tn2RIcDkRvTA/v2JsAEhxe99uw== @@ -1574,15 +1543,6 @@ dependencies: regenerator-runtime "^0.13.11" -"@babel/template@^7.18.10", "@babel/template@^7.18.6", "@babel/template@^7.20.7", "@babel/template@7.20.7": - version "7.20.7" - resolved "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz" - integrity sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw== - dependencies: - "@babel/code-frame" "^7.18.6" - "@babel/parser" "^7.20.7" - "@babel/types" "^7.20.7" - "@babel/template@7.18.10": version "7.18.10" resolved "https://registry.npmjs.org/@babel/template/-/template-7.18.10.tgz" @@ -1592,6 +1552,15 @@ "@babel/parser" "^7.18.10" "@babel/types" "^7.18.10" +"@babel/template@7.20.7", "@babel/template@^7.18.10", "@babel/template@^7.18.6", "@babel/template@^7.20.7": + version "7.20.7" + resolved "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz" + integrity sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw== + dependencies: + "@babel/code-frame" "^7.18.6" + "@babel/parser" "^7.20.7" + "@babel/types" "^7.20.7" + "@babel/traverse@^7.10.3", "@babel/traverse@^7.18.10", "@babel/traverse@^7.18.9", "@babel/traverse@^7.19.3", "@babel/traverse@^7.20.12", "@babel/traverse@^7.20.5", "@babel/traverse@^7.20.7", "@babel/traverse@^7.21.0", "@babel/traverse@^7.21.2": version "7.21.4" resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.21.4.tgz" @@ -1622,12 +1591,17 @@ resolved "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz" integrity sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ== -"@cspotcode/source-map-support@^0.8.0": - version "0.8.1" - resolved "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz" - integrity sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw== +"@cspotcode/source-map-consumer@0.8.0": + version "0.8.0" + resolved "https://registry.yarnpkg.com/@cspotcode/source-map-consumer/-/source-map-consumer-0.8.0.tgz#33bf4b7b39c178821606f669bbc447a6a629786b" + integrity sha512-41qniHzTU8yAGbCp04ohlmSrZf8bkf/iJsl3V0dRGsQN/5GFfx+LbCSsCpp2gqrqjTVg/K6O8ycoV35JIwAzAg== + +"@cspotcode/source-map-support@0.6.1": + version "0.6.1" + resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.6.1.tgz#118511f316e2e87ee4294761868e254d3da47960" + integrity sha512-DX3Z+T5dt1ockmPdobJS/FAsQPW4V4SrWEhD2iYQT2Cb2tQsiMnYxrcUH9By/Z3B+v0S5LMBkQtV/XOBbpLEOg== dependencies: - "@jridgewell/trace-mapping" "0.3.9" + "@cspotcode/source-map-consumer" "0.8.0" "@csstools/postcss-cascade-layers@^1.0.5", "@csstools/postcss-cascade-layers@^1.1.1": version "1.1.1" @@ -1779,7 +1753,7 @@ debug "^3.1.0" lodash.once "^4.1.1" -"@discoveryjs/json-ext@^0.5.0", "@discoveryjs/json-ext@0.5.7": +"@discoveryjs/json-ext@0.5.7", "@discoveryjs/json-ext@^0.5.0": version "0.5.7" resolved "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz" integrity sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw== @@ -1803,11 +1777,121 @@ esquery "^1.4.0" jsdoc-type-pratt-parser "~3.1.0" +"@esbuild/android-arm64@0.17.8": + version "0.17.8" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.17.8.tgz#b3d5b65a3b2e073a6c7ee36b1f3c30c8f000315b" + integrity sha512-oa/N5j6v1svZQs7EIRPqR8f+Bf8g6HBDjD/xHC02radE/NjKHK7oQmtmLxPs1iVwYyvE+Kolo6lbpfEQ9xnhxQ== + +"@esbuild/android-arm@0.17.8": + version "0.17.8" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.17.8.tgz#c41e496af541e175369d48164d0cf01a5f656cf6" + integrity sha512-0/rb91GYKhrtbeglJXOhAv9RuYimgI8h623TplY2X+vA4EXnk3Zj1fXZreJ0J3OJJu1bwmb0W7g+2cT/d8/l/w== + +"@esbuild/android-x64@0.17.8": + version "0.17.8" + resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.17.8.tgz#080fa67c29be77f5a3ca5ee4cc78d5bf927e3a3b" + integrity sha512-bTliMLqD7pTOoPg4zZkXqCDuzIUguEWLpeqkNfC41ODBHwoUgZ2w5JBeYimv4oP6TDVocoYmEhZrCLQTrH89bg== + +"@esbuild/darwin-arm64@0.17.8": + version "0.17.8" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.17.8.tgz#053622bf9a82f43d5c075b7818e02618f7b4a397" + integrity sha512-ghAbV3ia2zybEefXRRm7+lx8J/rnupZT0gp9CaGy/3iolEXkJ6LYRq4IpQVI9zR97ID80KJVoUlo3LSeA/sMAg== + "@esbuild/darwin-x64@0.17.8": version "0.17.8" resolved "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.8.tgz" integrity sha512-n5WOpyvZ9TIdv2V1K3/iIkkJeKmUpKaCTdun9buhGRWfH//osmUjlv4Z5mmWdPWind/VGcVxTHtLfLCOohsOXw== +"@esbuild/freebsd-arm64@0.17.8": + version "0.17.8" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.8.tgz#e6738d0081ba0721a5c6c674e84c6e7fcea61989" + integrity sha512-a/SATTaOhPIPFWvHZDoZYgxaZRVHn0/LX1fHLGfZ6C13JqFUZ3K6SMD6/HCtwOQ8HnsNaEeokdiDSFLuizqv5A== + +"@esbuild/freebsd-x64@0.17.8": + version "0.17.8" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.17.8.tgz#1855e562f2b730f4483f6e94086e9e2597feb4c3" + integrity sha512-xpFJb08dfXr5+rZc4E+ooZmayBW6R3q59daCpKZ/cDU96/kvDM+vkYzNeTJCGd8rtO6fHWMq5Rcv/1cY6p6/0Q== + +"@esbuild/linux-arm64@0.17.8": + version "0.17.8" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.17.8.tgz#481da38952721a3fdb77c17a36ceaacc4270b5c5" + integrity sha512-v3iwDQuDljLTxpsqQDl3fl/yihjPAyOguxuloON9kFHYwopeJEf1BkDXODzYyXEI19gisEsQlG1bM65YqKSIww== + +"@esbuild/linux-arm@0.17.8": + version "0.17.8" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.17.8.tgz#18127072b270bb6321c6d11be20bfd30e0d6ad17" + integrity sha512-6Ij8gfuGszcEwZpi5jQIJCVIACLS8Tz2chnEBfYjlmMzVsfqBP1iGmHQPp7JSnZg5xxK9tjCc+pJ2WtAmPRFVA== + +"@esbuild/linux-ia32@0.17.8": + version "0.17.8" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.17.8.tgz#ee400af7b3bc69e8ca2e593ca35156ffb9abd54f" + integrity sha512-8svILYKhE5XetuFk/B6raFYIyIqydQi+GngEXJgdPdI7OMKUbSd7uzR02wSY4kb53xBrClLkhH4Xs8P61Q2BaA== + +"@esbuild/linux-loong64@0.15.5": + version "0.15.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.15.5.tgz#91aef76d332cdc7c8942b600fa2307f3387e6f82" + integrity sha512-UHkDFCfSGTuXq08oQltXxSZmH1TXyWsL+4QhZDWvvLl6mEJQqk3u7/wq1LjhrrAXYIllaTtRSzUXl4Olkf2J8A== + +"@esbuild/linux-loong64@0.17.8": + version "0.17.8" + resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.17.8.tgz#8c509d8a454693d39824b83b3f66c400872fce82" + integrity sha512-B6FyMeRJeV0NpyEOYlm5qtQfxbdlgmiGdD+QsipzKfFky0K5HW5Td6dyK3L3ypu1eY4kOmo7wW0o94SBqlqBSA== + +"@esbuild/linux-mips64el@0.17.8": + version "0.17.8" + resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.17.8.tgz#f2b0d36e63fb26bc3f95b203b6a80638292101ca" + integrity sha512-CCb67RKahNobjm/eeEqeD/oJfJlrWyw29fgiyB6vcgyq97YAf3gCOuP6qMShYSPXgnlZe/i4a8WFHBw6N8bYAA== + +"@esbuild/linux-ppc64@0.17.8": + version "0.17.8" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.17.8.tgz#1e628be003e036e90423716028cc884fe5ba25bd" + integrity sha512-bytLJOi55y55+mGSdgwZ5qBm0K9WOCh0rx+vavVPx+gqLLhxtSFU0XbeYy/dsAAD6xECGEv4IQeFILaSS2auXw== + +"@esbuild/linux-riscv64@0.17.8": + version "0.17.8" + resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.17.8.tgz#419a815cb4c3fb9f1b78ef5295f5b48b8bf6427a" + integrity sha512-2YpRyQJmKVBEHSBLa8kBAtbhucaclb6ex4wchfY0Tj3Kg39kpjeJ9vhRU7x4mUpq8ISLXRXH1L0dBYjAeqzZAw== + +"@esbuild/linux-s390x@0.17.8": + version "0.17.8" + resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.17.8.tgz#291c49ae5c3d11d226352755c0835911fe1a9e5c" + integrity sha512-QgbNY/V3IFXvNf11SS6exkpVcX0LJcob+0RWCgV9OiDAmVElnxciHIisoSix9uzYzScPmS6dJFbZULdSAEkQVw== + +"@esbuild/linux-x64@0.17.8": + version "0.17.8" + resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.17.8.tgz#03199d91c76faf80bd54104f5cbf0a489bc39f6a" + integrity sha512-mM/9S0SbAFDBc4OPoyP6SEOo5324LpUxdpeIUUSrSTOfhHU9hEfqRngmKgqILqwx/0DVJBzeNW7HmLEWp9vcOA== + +"@esbuild/netbsd-x64@0.17.8": + version "0.17.8" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.17.8.tgz#b436d767e1b21852f9ed212e2bb57f77203b0ae2" + integrity sha512-eKUYcWaWTaYr9zbj8GertdVtlt1DTS1gNBWov+iQfWuWyuu59YN6gSEJvFzC5ESJ4kMcKR0uqWThKUn5o8We6Q== + +"@esbuild/openbsd-x64@0.17.8": + version "0.17.8" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.17.8.tgz#d1481d8539e21d4729cd04a0450a26c2c8789e89" + integrity sha512-Vc9J4dXOboDyMXKD0eCeW0SIeEzr8K9oTHJU+Ci1mZc5njPfhKAqkRt3B/fUNU7dP+mRyralPu8QUkiaQn7iIg== + +"@esbuild/sunos-x64@0.17.8": + version "0.17.8" + resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.17.8.tgz#2cfb8126e079b2c00fd1bf095541e9f5c47877e4" + integrity sha512-0xvOTNuPXI7ft1LYUgiaXtpCEjp90RuBBYovdd2lqAFxje4sEucurg30M1WIm03+3jxByd3mfo+VUmPtRSVuOw== + +"@esbuild/win32-arm64@0.17.8": + version "0.17.8" + resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.17.8.tgz#7c6ecfd097ca23b82119753bf7072bbaefe51e3a" + integrity sha512-G0JQwUI5WdEFEnYNKzklxtBheCPkuDdu1YrtRrjuQv30WsYbkkoixKxLLv8qhJmNI+ATEWquZe/N0d0rpr55Mg== + +"@esbuild/win32-ia32@0.17.8": + version "0.17.8" + resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.17.8.tgz#cffec63c3cb0ef8563a04df4e09fa71056171d00" + integrity sha512-Fqy63515xl20OHGFykjJsMnoIWS+38fqfg88ClvPXyDbLtgXal2DTlhb1TfTX34qWi3u4I7Cq563QcHpqgLx8w== + +"@esbuild/win32-x64@0.17.8": + version "0.17.8" + resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.17.8.tgz#200a0965cf654ac28b971358ecdca9cc5b44c335" + integrity sha512-1iuezdyDNngPnz8rLRDO2C/ZZ/emJLb72OsZeqQ6gL6Avko/XCXZw+NuxBSNhBAP13Hie418V7VMt9et1FMvpg== + "@eslint-community/eslint-utils@^4.2.0": version "4.4.0" resolved "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz" @@ -1907,7 +1991,7 @@ "@jridgewell/sourcemap-codec" "^1.4.10" "@jridgewell/trace-mapping" "^0.3.9" -"@jridgewell/resolve-uri@^3.0.3", "@jridgewell/resolve-uri@3.1.0": +"@jridgewell/resolve-uri@3.1.0": version "3.1.0" resolved "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz" integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== @@ -1925,16 +2009,16 @@ "@jridgewell/gen-mapping" "^0.3.0" "@jridgewell/trace-mapping" "^0.3.9" -"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.13", "@jridgewell/sourcemap-codec@^1.4.14": - version "1.4.15" - resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz" - integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== - "@jridgewell/sourcemap-codec@1.4.14": version "1.4.14" resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz" integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== +"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.13", "@jridgewell/sourcemap-codec@^1.4.14": + version "1.4.15" + resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz" + integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== + "@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.9": version "0.3.18" resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz" @@ -1943,14 +2027,6 @@ "@jridgewell/resolve-uri" "3.1.0" "@jridgewell/sourcemap-codec" "1.4.14" -"@jridgewell/trace-mapping@0.3.9": - version "0.3.9" - resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz" - integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== - dependencies: - "@jridgewell/resolve-uri" "^3.0.3" - "@jridgewell/sourcemap-codec" "^1.4.10" - "@kolkov/ngx-gallery@^2.0.1": version "2.0.1" resolved "https://registry.npmjs.org/@kolkov/ngx-gallery/-/ngx-gallery-2.0.1.tgz" @@ -1963,7 +2039,7 @@ resolved "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz" integrity sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A== -"@material-ui/core@^4.0.0", "@material-ui/core@^4.11.0", "@material-ui/core@^4.12.1", "@material-ui/core@^4.7.2": +"@material-ui/core@^4.11.0": version "4.12.4" resolved "https://registry.npmjs.org/@material-ui/core/-/core-4.12.4.tgz" integrity sha512-tr7xekNlM9LjA6pagJmL8QCgZXaubWUwkJnoYcMKd4gw/t4XiyvnTkjdGrUVicyB2BsdaAv1tvow45bPM4sSwQ== @@ -1981,7 +2057,7 @@ react-is "^16.8.0 || ^17.0.0" react-transition-group "^4.4.0" -"@material-ui/icons@^4.5.1", "@material-ui/icons@^4.9.1": +"@material-ui/icons@^4.9.1": version "4.11.3" resolved "https://registry.npmjs.org/@material-ui/icons/-/icons-4.11.3.tgz" integrity sha512-IKHlyx6LDh8n19vzwH5RtHIOHl9Tu90aAAxcbWME6kp4dmvODM3UvOHJeMIDzUbd4muuJKHmlNoBN+mDY4XkBA== @@ -2087,23 +2163,23 @@ dependencies: tslib "^2.0.0" -"@ngrx/store@^15.4.0", "@ngrx/store@15.4.0": +"@ngrx/store@^15.4.0": version "15.4.0" resolved "https://registry.npmjs.org/@ngrx/store/-/store-15.4.0.tgz" integrity sha512-OvCuNBHL8mAUnRTS6QSFm+IunspsYNu2cCwDovBNn7EGhxRuGihBeNoX47jCqWPHBFtokj4BlatDfpJ/yCh4xQ== dependencies: tslib "^2.0.0" -"@ngtools/webpack@^15.2.5", "@ngtools/webpack@15.2.5": - version "15.2.5" - resolved "https://registry.npmjs.org/@ngtools/webpack/-/webpack-15.2.5.tgz" - integrity sha512-wD6GY4xghVK+SQL0dy/M3saGx5pqi7+1VHEr+BBI7IUNYGSqPNzylKNxLBgQiTzfkzvbrZ6MhfaMNkhvSCYr5w== - "@ngtools/webpack@14.2.11": version "14.2.11" resolved "https://registry.npmjs.org/@ngtools/webpack/-/webpack-14.2.11.tgz" integrity sha512-4enbLFAp98uTgWYF6OFceQqLcfv2/0brIrNN4iWT9xe/Mh3zdCt+eH42zvNRsqo9WXNWRSLvnx8I924p83LNlw== +"@ngtools/webpack@15.2.5", "@ngtools/webpack@^15.2.5": + version "15.2.5" + resolved "https://registry.npmjs.org/@ngtools/webpack/-/webpack-15.2.5.tgz" + integrity sha512-wD6GY4xghVK+SQL0dy/M3saGx5pqi7+1VHEr+BBI7IUNYGSqPNzylKNxLBgQiTzfkzvbrZ6MhfaMNkhvSCYr5w== + "@nguniversal/builders@^15.2.0": version "15.2.0" resolved "https://registry.npmjs.org/@nguniversal/builders/-/builders-15.2.0.tgz" @@ -2160,7 +2236,7 @@ "@nodelib/fs.stat" "2.0.5" run-parallel "^1.1.9" -"@nodelib/fs.stat@^2.0.2", "@nodelib/fs.stat@2.0.5": +"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": version "2.0.5" resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz" integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== @@ -2331,15 +2407,6 @@ resolved "https://registry.npmjs.org/@scarf/scarf/-/scarf-1.1.1.tgz" integrity sha512-VGbKDbk1RFIaSmdVb0cNjjWJoRWRI/Weo23AjRCC2nryO0iAS8pzsToJfPVPtVs74WHw4L1UTADNdIYRLkirZQ== -"@schematics/angular@^12.2.17": - version "12.2.18" - resolved "https://registry.npmjs.org/@schematics/angular/-/angular-12.2.18.tgz" - integrity sha512-niRS9Ly9y8uI0YmTSbo8KpdqCCiZ/ATMZWeS2id5M8JZvfXbngwiqJvojdSol0SWU+n1W4iA+lJBdt4gSKlD5w== - dependencies: - "@angular-devkit/core" "12.2.18" - "@angular-devkit/schematics" "12.2.18" - jsonc-parser "3.0.0" - "@schematics/angular@15.2.5": version "15.2.5" resolved "https://registry.npmjs.org/@schematics/angular/-/angular-15.2.5.tgz" @@ -2349,6 +2416,15 @@ "@angular-devkit/schematics" "15.2.5" jsonc-parser "3.2.0" +"@schematics/angular@^12.2.17": + version "12.2.18" + resolved "https://registry.npmjs.org/@schematics/angular/-/angular-12.2.18.tgz" + integrity sha512-niRS9Ly9y8uI0YmTSbo8KpdqCCiZ/ATMZWeS2id5M8JZvfXbngwiqJvojdSol0SWU+n1W4iA+lJBdt4gSKlD5w== + dependencies: + "@angular-devkit/core" "12.2.18" + "@angular-devkit/schematics" "12.2.18" + jsonc-parser "3.0.0" + "@sigstore/protobuf-specs@^0.1.0": version "0.1.0" resolved "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.1.0.tgz" @@ -2549,7 +2625,7 @@ resolved "https://registry.npmjs.org/@types/mime/-/mime-3.0.1.tgz" integrity sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA== -"@types/node@*", "@types/node@^14.14.31", "@types/node@^14.14.9", "@types/node@>=10.0.0": +"@types/node@*", "@types/node@>=10.0.0", "@types/node@^14.14.31", "@types/node@^14.14.9": version "14.18.42" resolved "https://registry.npmjs.org/@types/node/-/node-14.18.42.tgz" integrity sha512-xefu+RBie4xWlK8hwAzGh3npDz/4VhF6icY/shU+zv/1fNn+ZVG7T7CRwe9LId9sAYRPxI+59QBPuKL3WpyGRg== @@ -2591,7 +2667,7 @@ dependencies: "@types/react" "*" -"@types/react@*", "@types/react@^16.8.6 || ^17.0.0": +"@types/react@*": version "17.0.57" resolved "https://registry.npmjs.org/@types/react/-/react-17.0.57.tgz" integrity sha512-e4msYpu5QDxzNrXDHunU/VPyv2M1XemGG/p7kfCjUiPtlLDCWLGQfgAMng6YyisWYxZ09mYdQlmMnyS0NfZdEg== @@ -2673,7 +2749,7 @@ dependencies: "@types/node" "*" -"@typescript-eslint/eslint-plugin@^5.0.0", "@typescript-eslint/eslint-plugin@^5.43.0": +"@typescript-eslint/eslint-plugin@^5.43.0": version "5.58.0" resolved "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.58.0.tgz" integrity sha512-vxHvLhH0qgBd3/tW6/VccptSfc8FxPQIkmNTVLWcCOVqSBvqpnKkBTYrhcGlXfSnd78azwe+PsjYFj0X34/njA== @@ -2689,7 +2765,7 @@ semver "^7.3.7" tsutils "^3.21.0" -"@typescript-eslint/parser@^5.0.0", "@typescript-eslint/parser@^5.43.0": +"@typescript-eslint/parser@^5.43.0": version "5.58.0" resolved "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.58.0.tgz" integrity sha512-ixaM3gRtlfrKzP8N6lRhBbjTow1t6ztfBvQNGuRM8qH1bjFFXIJ35XY+FC0RRBKn3C6cT+7VW1y8tNm7DwPHDQ== @@ -2771,20 +2847,6 @@ semver "^7.3.7" tsutils "^3.21.0" -"@typescript-eslint/utils@^5.57.0", "@typescript-eslint/utils@5.58.0": - version "5.58.0" - resolved "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.58.0.tgz" - integrity sha512-gAmLOTFXMXOC+zP1fsqm3VceKSBQJNzV385Ok3+yzlavNHZoedajjS4UyS21gabJYcobuigQPs/z71A9MdJFqQ== - dependencies: - "@eslint-community/eslint-utils" "^4.2.0" - "@types/json-schema" "^7.0.9" - "@types/semver" "^7.3.12" - "@typescript-eslint/scope-manager" "5.58.0" - "@typescript-eslint/types" "5.58.0" - "@typescript-eslint/typescript-estree" "5.58.0" - eslint-scope "^5.1.1" - semver "^7.3.7" - "@typescript-eslint/utils@5.48.2": version "5.48.2" resolved "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.48.2.tgz" @@ -2799,6 +2861,20 @@ eslint-utils "^3.0.0" semver "^7.3.7" +"@typescript-eslint/utils@5.58.0", "@typescript-eslint/utils@^5.57.0": + version "5.58.0" + resolved "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.58.0.tgz" + integrity sha512-gAmLOTFXMXOC+zP1fsqm3VceKSBQJNzV385Ok3+yzlavNHZoedajjS4UyS21gabJYcobuigQPs/z71A9MdJFqQ== + dependencies: + "@eslint-community/eslint-utils" "^4.2.0" + "@types/json-schema" "^7.0.9" + "@types/semver" "^7.3.12" + "@typescript-eslint/scope-manager" "5.58.0" + "@typescript-eslint/types" "5.58.0" + "@typescript-eslint/typescript-estree" "5.58.0" + eslint-scope "^5.1.1" + semver "^7.3.7" + "@typescript-eslint/visitor-keys@5.48.2": version "5.48.2" resolved "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.48.2.tgz" @@ -2983,7 +3059,7 @@ abab@^2.0.3, abab@^2.0.5, abab@^2.0.6: resolved "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz" integrity sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA== -abbrev@^1.0.0, abbrev@1: +abbrev@1, abbrev@^1.0.0: version "1.1.1" resolved "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz" integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== @@ -3027,31 +3103,21 @@ acorn-walk@^7.1.1: resolved "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz" integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA== -acorn-walk@^8.0.0: +acorn-walk@^8.0.0, acorn-walk@^8.0.2, acorn-walk@^8.1.1: version "8.2.0" resolved "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz" integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== -acorn-walk@^8.0.2: - version "8.2.0" - resolved "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz" - integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== - -acorn-walk@^8.1.1: - version "8.2.0" - resolved "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz" - integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== - -"acorn@^6.0.0 || ^7.0.0 || ^8.0.0", acorn@^8, acorn@^8.0.4, acorn@^8.1.0, acorn@^8.2.4, acorn@^8.4.1, acorn@^8.5.0, acorn@^8.7.1, acorn@^8.8.0, acorn@^8.8.1: - version "8.8.2" - resolved "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz" - integrity sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw== - acorn@^7.1.1: version "7.4.1" resolved "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz" integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== +acorn@^8.0.4, acorn@^8.1.0, acorn@^8.2.4, acorn@^8.4.1, acorn@^8.5.0, acorn@^8.7.1, acorn@^8.8.0, acorn@^8.8.1: + version "8.8.2" + resolved "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz" + integrity sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw== + adjust-sourcemap-loader@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-4.0.0.tgz" @@ -3060,7 +3126,12 @@ adjust-sourcemap-loader@^4.0.0: loader-utils "^2.0.0" regex-parser "^2.2.11" -agent-base@^6.0.2, agent-base@6: +adm-zip@^0.5.2: + version "0.5.10" + resolved "https://registry.yarnpkg.com/adm-zip/-/adm-zip-0.5.10.tgz#4a51d5ab544b1f5ce51e1b9043139b639afff45b" + integrity sha512-x0HvcHqVJNTPk/Bw8JbLWlWoo6Wwnsug0fnYYro1HBrjxZ3G7/AZk7Ahv8JwDe1uIcz8eBqvu86FuF1POiG7vQ== + +agent-base@6, agent-base@^6.0.2: version "6.0.2" resolved "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz" integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== @@ -3084,13 +3155,6 @@ aggregate-error@^3.0.0: clean-stack "^2.0.0" indent-string "^4.0.0" -ajv-formats@^2.1.1, ajv-formats@2.1.1: - version "2.1.1" - resolved "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz" - integrity sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA== - dependencies: - ajv "^8.0.0" - ajv-formats@2.1.0: version "2.1.0" resolved "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.0.tgz" @@ -3098,6 +3162,13 @@ ajv-formats@2.1.0: dependencies: ajv "^8.0.0" +ajv-formats@2.1.1, ajv-formats@^2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz" + integrity sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA== + dependencies: + ajv "^8.0.0" + ajv-keywords@^3.5.2: version "3.5.2" resolved "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz" @@ -3110,36 +3181,6 @@ ajv-keywords@^5.0.0: dependencies: fast-deep-equal "^3.1.3" -ajv@^6.10.0, ajv@^6.12.4, ajv@^6.12.5, ajv@^6.9.1: - version "6.12.6" - resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz" - integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== - dependencies: - fast-deep-equal "^3.1.1" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.4.1" - uri-js "^4.2.2" - -ajv@^8.0.0, ajv@8.6.2: - version "8.6.2" - resolved "https://registry.npmjs.org/ajv/-/ajv-8.6.2.tgz" - integrity sha512-9807RlWAgT564wT+DjeyU5OFMPjmzxVobvDFmNAhY+5zD6A2ly3jDp6sgnfyDtlIQ+7H97oc/DGCzzfu9rjw9w== - dependencies: - fast-deep-equal "^3.1.1" - json-schema-traverse "^1.0.0" - require-from-string "^2.0.2" - uri-js "^4.2.2" - -ajv@^8.8.0, ajv@^8.8.2: - version "8.12.0" - resolved "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz" - integrity sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA== - dependencies: - fast-deep-equal "^3.1.1" - json-schema-traverse "^1.0.0" - require-from-string "^2.0.2" - uri-js "^4.2.2" - ajv@8.11.0: version "8.11.0" resolved "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz" @@ -3150,7 +3191,7 @@ ajv@8.11.0: require-from-string "^2.0.2" uri-js "^4.2.2" -ajv@8.12.0: +ajv@8.12.0, ajv@^8.8.0: version "8.12.0" resolved "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz" integrity sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA== @@ -3160,6 +3201,26 @@ ajv@8.12.0: require-from-string "^2.0.2" uri-js "^4.2.2" +ajv@8.6.2, ajv@^8.0.0: + version "8.6.2" + resolved "https://registry.npmjs.org/ajv/-/ajv-8.6.2.tgz" + integrity sha512-9807RlWAgT564wT+DjeyU5OFMPjmzxVobvDFmNAhY+5zD6A2ly3jDp6sgnfyDtlIQ+7H97oc/DGCzzfu9rjw9w== + dependencies: + fast-deep-equal "^3.1.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + uri-js "^4.2.2" + +ajv@^6.10.0, ajv@^6.12.3, ajv@^6.12.4, ajv@^6.12.5: + version "6.12.6" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + angular-idle-preload@3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/angular-idle-preload/-/angular-idle-preload-3.0.0.tgz" @@ -3172,7 +3233,7 @@ angulartics2@^12.0.0: dependencies: tslib "^2.3.0" -ansi-colors@^4.1.1, ansi-colors@4.1.3: +ansi-colors@4.1.3, ansi-colors@^4.1.1: version "4.1.3" resolved "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz" integrity sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw== @@ -3189,6 +3250,11 @@ ansi-html-community@^0.0.8: resolved "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz" integrity sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw== +ansi-regex@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" + integrity sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA== + ansi-regex@^3.0.0: version "3.0.1" resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz" @@ -3199,6 +3265,11 @@ ansi-regex@^5.0.1: resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz" integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== +ansi-styles@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" + integrity sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA== + ansi-styles@^3.2.1: version "3.2.1" resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz" @@ -3206,14 +3277,7 @@ ansi-styles@^3.2.1: dependencies: color-convert "^1.9.0" -ansi-styles@^4.0.0: - version "4.3.0" - resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" - integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== - dependencies: - color-convert "^2.0.1" - -ansi-styles@^4.1.0: +ansi-styles@^4.0.0, ansi-styles@^4.1.0: version "4.3.0" resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== @@ -3278,16 +3342,16 @@ array-buffer-byte-length@^1.0.0: call-bind "^1.0.2" is-array-buffer "^3.0.1" -array-flatten@^2.1.2: - version "2.1.2" - resolved "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz" - integrity sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ== - array-flatten@1.1.1: version "1.1.1" resolved "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz" integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== +array-flatten@^2.1.2: + version "2.1.2" + resolved "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz" + integrity sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ== + array-includes@^3.1.6: version "3.1.6" resolved "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz" @@ -3299,11 +3363,23 @@ array-includes@^3.1.6: get-intrinsic "^1.1.3" is-string "^1.0.7" +array-union@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" + integrity sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng== + dependencies: + array-uniq "^1.0.1" + array-union@^2.1.0: version "2.1.0" resolved "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz" integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== +array-uniq@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" + integrity sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q== + array.prototype.flat@^1.3.1: version "1.3.1" resolved "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz" @@ -3324,6 +3400,11 @@ array.prototype.flatmap@^1.3.1: es-abstract "^1.20.4" es-shim-unscopables "^1.0.0" +arrify@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" + integrity sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA== + asn1@~0.2.3: version "0.2.6" resolved "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz" @@ -3331,7 +3412,7 @@ asn1@~0.2.3: dependencies: safer-buffer "~2.1.0" -assert-plus@^1.0.0, assert-plus@1.0.0: +assert-plus@1.0.0, assert-plus@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz" integrity sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw== @@ -3368,18 +3449,6 @@ at-least-node@^1.0.0: resolved "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz" integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== -autoprefixer@^10.4.13, autoprefixer@^10.4.8: - version "10.4.14" - resolved "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.14.tgz" - integrity sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ== - dependencies: - browserslist "^4.21.5" - caniuse-lite "^1.0.30001464" - fraction.js "^4.2.0" - normalize-range "^0.1.2" - picocolors "^1.0.0" - postcss-value-parser "^4.2.0" - autoprefixer@10.4.13: version "10.4.13" resolved "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.13.tgz" @@ -3392,6 +3461,18 @@ autoprefixer@10.4.13: picocolors "^1.0.0" postcss-value-parser "^4.2.0" +autoprefixer@^10.4.13, autoprefixer@^10.4.8: + version "10.4.14" + resolved "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.14.tgz" + integrity sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ== + dependencies: + browserslist "^4.21.5" + caniuse-lite "^1.0.30001464" + fraction.js "^4.2.0" + normalize-range "^0.1.2" + picocolors "^1.0.0" + postcss-value-parser "^4.2.0" + available-typed-arrays@^1.0.5: version "1.0.5" resolved "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz" @@ -3407,11 +3488,18 @@ aws4@^1.8.0: resolved "https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz" integrity sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg== -"axe-core@^3 || ^4", axe-core@^4.4.3: +axe-core@^4.4.3: version "4.6.3" resolved "https://registry.npmjs.org/axe-core/-/axe-core-4.6.3.tgz" integrity sha512-/BQzOX780JhsxDnPpH4ZiyrJAzcd8AfzFPkv+89veFSr1rcMjuq2JDCwypKaPeB6ljHp9KjXhPpjgCvQlWYuqg== +axios@0.21.4: + version "0.21.4" + resolved "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz" + integrity sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg== + dependencies: + follow-redirects "^1.14.0" + axios@^0.27.2: version "0.27.2" resolved "https://registry.npmjs.org/axios/-/axios-0.27.2.tgz" @@ -3420,13 +3508,6 @@ axios@^0.27.2: follow-redirects "^1.14.9" form-data "^4.0.0" -axios@0.21.4: - version "0.21.4" - resolved "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz" - integrity sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg== - dependencies: - follow-redirects "^1.14.0" - axobject-query@3.1.1: version "3.1.1" resolved "https://registry.npmjs.org/axobject-query/-/axobject-query-3.1.1.tgz" @@ -3505,7 +3586,7 @@ base64-js@^1.2.0, base64-js@^1.3.1: resolved "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz" integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== -base64id@~2.0.0, base64id@2.0.0: +base64id@2.0.0, base64id@~2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz" integrity sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog== @@ -3572,7 +3653,7 @@ bluebird@^3.7.2: resolved "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz" integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== -body-parser@^1.19.0, body-parser@1.20.1: +body-parser@1.20.1, body-parser@^1.19.0: version "1.20.1" resolved "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz" integrity sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw== @@ -3605,7 +3686,7 @@ boolbase@^1.0.0: resolved "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz" integrity sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww== -bootstrap@^4.0.0, bootstrap@^4.6.1: +bootstrap@^4.6.1: version "4.6.2" resolved "https://registry.npmjs.org/bootstrap/-/bootstrap-4.6.2.tgz" integrity sha512-51Bbp/Uxr9aTuy6ca/8FbFloBUJZLHwnhTcnjIeRn2suQWsWzcuJhGjKDB5eppVte/8oCdOL3VuwxvZDUggwGQ== @@ -3696,7 +3777,7 @@ browser-sync@^2.27.10: ua-parser-js "^1.0.33" yargs "^17.3.1" -browserslist@^4.14.5, browserslist@^4.21.3, browserslist@^4.21.4, browserslist@^4.21.5, browserslist@^4.9.1, "browserslist@>= 4.21.0", browserslist@4.21.5: +browserslist@4.21.5, browserslist@^4.14.5, browserslist@^4.21.3, browserslist@^4.21.4, browserslist@^4.21.5, browserslist@^4.9.1: version "4.21.5" resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz" integrity sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w== @@ -3756,6 +3837,49 @@ bytesish@^0.4.1: resolved "https://registry.npmjs.org/bytesish/-/bytesish-0.4.4.tgz" integrity sha512-i4uu6M4zuMUiyfZN4RU2+i9+peJh//pXhd9x1oSe1LBkZ3LEbCoygu8W0bXTukU1Jme2txKuotpCZRaC3FLxcQ== +cacache@16.1.2: + version "16.1.2" + resolved "https://registry.npmjs.org/cacache/-/cacache-16.1.2.tgz" + integrity sha512-Xx+xPlfCZIUHagysjjOAje9nRo8pRDczQCcXb4J2O0BLtH+xeVue6ba4y1kfJfQMAnM2mkcoMIAyOctlaRGWYA== + dependencies: + "@npmcli/fs" "^2.1.0" + "@npmcli/move-file" "^2.0.0" + chownr "^2.0.0" + fs-minipass "^2.1.0" + glob "^8.0.1" + infer-owner "^1.0.4" + lru-cache "^7.7.1" + minipass "^3.1.6" + minipass-collect "^1.0.2" + minipass-flush "^1.0.5" + minipass-pipeline "^1.2.4" + mkdirp "^1.0.4" + p-map "^4.0.0" + promise-inflight "^1.0.1" + rimraf "^3.0.2" + ssri "^9.0.0" + tar "^6.1.11" + unique-filename "^1.1.1" + +cacache@17.0.4: + version "17.0.4" + resolved "https://registry.npmjs.org/cacache/-/cacache-17.0.4.tgz" + integrity sha512-Z/nL3gU+zTUjz5pCA5vVjYM8pmaw2kxM7JEiE0fv3w77Wj+sFbi70CrBruUWH0uNcEdvLDixFpgA2JM4F4DBjA== + dependencies: + "@npmcli/fs" "^3.1.0" + fs-minipass "^3.0.0" + glob "^8.0.1" + lru-cache "^7.7.1" + minipass "^4.0.0" + minipass-collect "^1.0.2" + minipass-flush "^1.0.5" + minipass-pipeline "^1.2.4" + p-map "^4.0.0" + promise-inflight "^1.0.1" + ssri "^10.0.0" + tar "^6.1.11" + unique-filename "^3.0.0" + cacache@^15.0.5: version "15.3.0" resolved "https://registry.npmjs.org/cacache/-/cacache-15.3.0.tgz" @@ -3823,49 +3947,6 @@ cacache@^17.0.0: tar "^6.1.11" unique-filename "^3.0.0" -cacache@16.1.2: - version "16.1.2" - resolved "https://registry.npmjs.org/cacache/-/cacache-16.1.2.tgz" - integrity sha512-Xx+xPlfCZIUHagysjjOAje9nRo8pRDczQCcXb4J2O0BLtH+xeVue6ba4y1kfJfQMAnM2mkcoMIAyOctlaRGWYA== - dependencies: - "@npmcli/fs" "^2.1.0" - "@npmcli/move-file" "^2.0.0" - chownr "^2.0.0" - fs-minipass "^2.1.0" - glob "^8.0.1" - infer-owner "^1.0.4" - lru-cache "^7.7.1" - minipass "^3.1.6" - minipass-collect "^1.0.2" - minipass-flush "^1.0.5" - minipass-pipeline "^1.2.4" - mkdirp "^1.0.4" - p-map "^4.0.0" - promise-inflight "^1.0.1" - rimraf "^3.0.2" - ssri "^9.0.0" - tar "^6.1.11" - unique-filename "^1.1.1" - -cacache@17.0.4: - version "17.0.4" - resolved "https://registry.npmjs.org/cacache/-/cacache-17.0.4.tgz" - integrity sha512-Z/nL3gU+zTUjz5pCA5vVjYM8pmaw2kxM7JEiE0fv3w77Wj+sFbi70CrBruUWH0uNcEdvLDixFpgA2JM4F4DBjA== - dependencies: - "@npmcli/fs" "^3.1.0" - fs-minipass "^3.0.0" - glob "^8.0.1" - lru-cache "^7.7.1" - minipass "^4.0.0" - minipass-collect "^1.0.2" - minipass-flush "^1.0.5" - minipass-pipeline "^1.2.4" - p-map "^4.0.0" - promise-inflight "^1.0.1" - ssri "^10.0.0" - tar "^6.1.11" - unique-filename "^3.0.0" - cachedir@^2.3.0: version "2.3.0" resolved "https://registry.npmjs.org/cachedir/-/cachedir-2.3.0.tgz" @@ -3906,6 +3987,25 @@ cerialize@0.1.18: dependencies: typescript "^2.5.0" +chalk@4.1.2, chalk@^4.0.0, chalk@^4.0.2, chalk@^4.1.0, chalk@^4.1.1, chalk@~4.1.0: + version "4.1.2" + resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +chalk@^1.1.1: + version "1.1.3" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" + integrity sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A== + dependencies: + ansi-styles "^2.2.1" + escape-string-regexp "^1.0.2" + has-ansi "^2.0.0" + strip-ansi "^3.0.0" + supports-color "^2.0.0" + chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.4.1: version "2.4.2" resolved "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz" @@ -3915,54 +4015,6 @@ chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.4.1: escape-string-regexp "^1.0.5" supports-color "^5.3.0" -chalk@^4.0.0: - version "4.1.2" - resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" - integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -chalk@^4.0.2: - version "4.1.2" - resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" - integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -chalk@^4.1.0: - version "4.1.2" - resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" - integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -chalk@^4.1.1: - version "4.1.2" - resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" - integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -chalk@~4.1.0: - version "4.1.2" - resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" - integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -chalk@4.1.2: - version "4.1.2" - resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" - integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - chardet@^0.7.0: version "0.7.0" resolved "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz" @@ -4002,7 +4054,7 @@ cheerio@1.0.0-rc.10: parse5-htmlparser2-tree-adapter "^6.0.1" tslib "^2.2.0" -chokidar@^3.0.0, chokidar@^3.5.1, chokidar@^3.5.2, chokidar@^3.5.3, "chokidar@>=3.0.0 <4.0.0", chokidar@3.5.3: +chokidar@3.5.3, "chokidar@>=3.0.0 <4.0.0", chokidar@^3.0.0, chokidar@^3.5.1, chokidar@^3.5.2, chokidar@^3.5.3: version "3.5.3" resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz" integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== @@ -4139,16 +4191,16 @@ color-convert@^2.0.1: dependencies: color-name "~1.1.4" -color-name@~1.1.4: - version "1.1.4" - resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" - integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== - color-name@1.1.3: version "1.1.3" resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + color-support@^1.1.3: version "1.1.3" resolved "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz" @@ -4171,12 +4223,12 @@ combined-stream@^1.0.6, combined-stream@^1.0.8, combined-stream@~1.0.6: dependencies: delayed-stream "~1.0.0" -commander@^2.2.0: - version "2.20.3" - resolved "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz" - integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== +commander@9.2.0: + version "9.2.0" + resolved "https://registry.npmjs.org/commander/-/commander-9.2.0.tgz" + integrity sha512-e2i4wANQiSXgnrBlIatyHtP1odfUp0BbV5Y5nEGbxtIrStkEOAAzCUirvLBNXHLr7kwLvJl6V+4V3XV9x7Wd9w== -commander@^2.20.0: +commander@^2.2.0, commander@^2.20.0: version "2.20.3" resolved "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz" integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== @@ -4191,21 +4243,11 @@ commander@^6.1.0: resolved "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz" integrity sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA== -commander@^7.0.0: +commander@^7.0.0, commander@^7.2.0: version "7.2.0" resolved "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz" integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== -commander@^7.2.0: - version "7.2.0" - resolved "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz" - integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== - -commander@9.2.0: - version "9.2.0" - resolved "https://registry.npmjs.org/commander/-/commander-9.2.0.tgz" - integrity sha512-e2i4wANQiSXgnrBlIatyHtP1odfUp0BbV5Y5nEGbxtIrStkEOAAzCUirvLBNXHLr7kwLvJl6V+4V3XV9x7Wd9w== - comment-parser@1.3.1: version "1.3.1" resolved "https://registry.npmjs.org/comment-parser/-/comment-parser-1.3.1.tgz" @@ -4264,16 +4306,6 @@ connect-history-api-fallback@^2.0.0: resolved "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz" integrity sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA== -connect@^3.7.0: - version "3.7.0" - resolved "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz" - integrity sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ== - dependencies: - debug "2.6.9" - finalhandler "1.1.2" - parseurl "~1.3.3" - utils-merge "1.0.1" - connect@3.6.6: version "3.6.6" resolved "https://registry.npmjs.org/connect/-/connect-3.6.6.tgz" @@ -4284,6 +4316,16 @@ connect@3.6.6: parseurl "~1.3.2" utils-merge "1.0.1" +connect@^3.7.0: + version "3.7.0" + resolved "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz" + integrity sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ== + dependencies: + debug "2.6.9" + finalhandler "1.1.2" + parseurl "~1.3.3" + utils-merge "1.0.1" + console-control-strings@^1.1.0: version "1.1.0" resolved "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz" @@ -4319,11 +4361,6 @@ cookie-signature@1.0.6: resolved "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz" integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ== -cookie@~0.4.1: - version "0.4.2" - resolved "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz" - integrity sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA== - cookie@0.4.0: version "0.4.0" resolved "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz" @@ -4334,6 +4371,11 @@ cookie@0.5.0: resolved "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz" integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw== +cookie@~0.4.1: + version "0.4.2" + resolved "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz" + integrity sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA== + copy-anything@^2.0.1: version "2.0.6" resolved "https://registry.npmjs.org/copy-anything/-/copy-anything-2.0.6.tgz" @@ -4348,6 +4390,18 @@ copy-to-clipboard@^3.3.1: dependencies: toggle-selection "^1.0.6" +copy-webpack-plugin@11.0.0: + version "11.0.0" + resolved "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-11.0.0.tgz" + integrity sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ== + dependencies: + fast-glob "^3.2.11" + glob-parent "^6.0.1" + globby "^13.1.1" + normalize-path "^3.0.0" + schema-utils "^4.0.0" + serialize-javascript "^6.0.0" + copy-webpack-plugin@^6.4.1: version "6.4.1" resolved "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-6.4.1.tgz" @@ -4365,18 +4419,6 @@ copy-webpack-plugin@^6.4.1: serialize-javascript "^5.0.1" webpack-sources "^1.4.3" -copy-webpack-plugin@11.0.0: - version "11.0.0" - resolved "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-11.0.0.tgz" - integrity sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ== - dependencies: - fast-glob "^3.2.11" - glob-parent "^6.0.1" - globby "^13.1.1" - normalize-path "^3.0.0" - schema-utils "^4.0.0" - serialize-javascript "^6.0.0" - core-js-compat@^3.21.0, core-js-compat@^3.22.1, core-js-compat@^3.25.1: version "3.30.0" resolved "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.30.0.tgz" @@ -4384,21 +4426,21 @@ core-js-compat@^3.21.0, core-js-compat@^3.22.1, core-js-compat@^3.25.1: dependencies: browserslist "^4.21.5" -core-js@^3.7.0, core-js@^3.8.1: +core-js@^3.7.0: version "3.30.0" resolved "https://registry.npmjs.org/core-js/-/core-js-3.30.0.tgz" integrity sha512-hQotSSARoNh1mYPi9O2YaWeiq/cEB95kOrFb4NCrO4RIFt1qqNpKsaE+vy/L3oiqvND5cThqXzUU3r9F7Efztg== -core-util-is@~1.0.0: - version "1.0.3" - resolved "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz" - integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== - core-util-is@1.0.2: version "1.0.2" resolved "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz" integrity sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ== +core-util-is@~1.0.0: + version "1.0.3" + resolved "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz" + integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== + cors@~2.8.5: version "2.8.5" resolved "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz" @@ -4586,7 +4628,7 @@ cypress-axe@^1.1.0: resolved "https://registry.npmjs.org/cypress-axe/-/cypress-axe-1.4.0.tgz" integrity sha512-Ut7NKfzjyKm0BEbt2WxuKtLkIXmx6FD2j0RwdvO/Ykl7GmB/qRQkwbKLk3VP35+83hiIr8GKD04PDdrTK5BnyA== -"cypress@^10 || ^11 || ^12", cypress@12.9.0: +cypress@12.9.0: version "12.9.0" resolved "https://registry.npmjs.org/cypress/-/cypress-12.9.0.tgz" integrity sha512-Ofe09LbHKgSqX89Iy1xen2WvpgbvNxDzsWx3mgU1mfILouELeXYGwIib3ItCwoRrRifoQwcBFmY54Vs0zw7QCg== @@ -4664,7 +4706,7 @@ date-fns-tz@^1.3.7: resolved "https://registry.npmjs.org/date-fns-tz/-/date-fns-tz-1.3.8.tgz" integrity sha512-qwNXUFtMHTTU6CFSFjoJ80W8Fzzp24LntbjFFBgL/faqds4e5mo9mftoRLgr3Vi1trISsg4awSpYVsOQCRnapQ== -date-fns@^2.29.3, date-fns@>=2.0.0: +date-fns@^2.29.3: version "2.29.3" resolved "https://registry.npmjs.org/date-fns/-/date-fns-2.29.3.tgz" integrity sha512-dDCnyH2WnnKusqvZZ6+jA1O51Ibt8ZMRNkDZdyAyK4YfbDwa/cEmuztzG5pk6hqlp9aSBPYcjOlktquahGwGeA== @@ -4679,48 +4721,20 @@ dayjs@^1.10.4: resolved "https://registry.npmjs.org/dayjs/-/dayjs-1.11.7.tgz" integrity sha512-+Yw9U6YO5TQohxLcIkrXBeY73WP3ejHWVvx8XCk3gxvQDCTEmS48ZrSZCKciI7Bhl/uCMyxYtE9UqRILmFphkQ== -debug@^2.2.0: +debug@2.6.9, debug@^2.2.0: version "2.6.9" resolved "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz" integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== dependencies: ms "2.0.0" -debug@^3.1.0: - version "3.2.7" - resolved "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz" - integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== - dependencies: - ms "^2.1.1" - -debug@^3.2.6: - version "3.2.7" - resolved "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz" - integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== - dependencies: - ms "^2.1.1" - -debug@^3.2.7: - version "3.2.7" - resolved "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz" - integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== - dependencies: - ms "^2.1.1" - -debug@^4.1.0, debug@^4.1.1, debug@^4.3.2, debug@^4.3.3, debug@^4.3.4, debug@~4.3.1, debug@~4.3.2, debug@4: +debug@4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.2, debug@^4.3.3, debug@^4.3.4, debug@~4.3.1, debug@~4.3.2: version "4.3.4" resolved "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz" integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== dependencies: ms "2.1.2" -debug@2.6.9: - version "2.6.9" - resolved "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz" - integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== - dependencies: - ms "2.0.0" - debug@4.3.2: version "4.3.2" resolved "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz" @@ -4728,6 +4742,13 @@ debug@4.3.2: dependencies: ms "2.1.2" +debug@^3.1.0, debug@^3.2.6, debug@^3.2.7: + version "3.2.7" + resolved "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz" + integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== + dependencies: + ms "^2.1.1" + decimal.js@^10.2.1, decimal.js@^10.4.2: version "10.4.3" resolved "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz" @@ -4798,6 +4819,19 @@ define-properties@^1.1.3, define-properties@^1.1.4: has-property-descriptors "^1.0.0" object-keys "^1.1.1" +del@^2.2.0: + version "2.2.2" + resolved "https://registry.yarnpkg.com/del/-/del-2.2.2.tgz#c12c981d067846c84bcaf862cff930d907ffd1a8" + integrity sha512-Z4fzpbIRjOu7lO5jCETSWoqUDVe0IPOlfugBsF6suen2LKDlVb4QZpKEM9P+buNJ4KI1eN7I083w/pbKUpsrWQ== + dependencies: + globby "^5.0.0" + is-path-cwd "^1.0.0" + is-path-in-cwd "^1.0.0" + object-assign "^4.0.1" + pify "^2.0.0" + pinkie-promise "^2.0.0" + rimraf "^2.2.8" + delayed-stream@~1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz" @@ -4808,7 +4842,7 @@ delegates@^1.0.0: resolved "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz" integrity sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ== -depd@^2.0.0, depd@~2.0.0, depd@2.0.0: +depd@2.0.0, depd@^2.0.0, depd@~2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz" integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== @@ -4823,16 +4857,16 @@ dependency-graph@^0.11.0: resolved "https://registry.npmjs.org/dependency-graph/-/dependency-graph-0.11.0.tgz" integrity sha512-JeMq7fEshyepOWDfcfHK06N3MhyPhz++vtqWhMT5O9A3K42rdsEDpfdVqjaqaAhsw6a+ZqeDvQVtD0hFHQWrzg== -destroy@~1.0.4: - version "1.0.4" - resolved "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz" - integrity sha512-3NdhDuEXnfun/z7x9GOElY49LoqVHoGScmOKwmxhsS8N5Y+Z8KyPPDnaSzqWgYt/ji4mqwfTS34Htrk0zPIXVg== - destroy@1.2.0: version "1.2.0" resolved "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz" integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== +destroy@~1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz" + integrity sha512-3NdhDuEXnfun/z7x9GOElY49LoqVHoGScmOKwmxhsS8N5Y+Z8KyPPDnaSzqWgYt/ji4mqwfTS34Htrk0zPIXVg== + detect-node@^2.0.4: version "2.1.0" resolved "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz" @@ -5070,7 +5104,7 @@ encodeurl@~1.0.1, encodeurl@~1.0.2: resolved "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz" integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== -encoding@^0.1.0, encoding@^0.1.13: +encoding@^0.1.13: version "0.1.13" resolved "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz" integrity sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A== @@ -5124,7 +5158,7 @@ enhanced-resolve@^5.10.0: graceful-fs "^4.2.4" tapable "^2.2.0" -enquirer@^2.3.6, "enquirer@>= 2.3.0 < 3": +enquirer@^2.3.6: version "2.3.6" resolved "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz" integrity sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg== @@ -5277,11 +5311,91 @@ es6-promisify@^6.0.0: resolved "https://registry.npmjs.org/es6-promisify/-/es6-promisify-6.1.1.tgz" integrity sha512-HBL8I3mIki5C1Cc9QjKUenHtnG0A5/xA8Q/AllRcfiwl2CZFXGK7ddBiCoRwAix4i2KxcQfjtIVcrVbB3vbmwg== +esbuild-android-64@0.15.5: + version "0.15.5" + resolved "https://registry.yarnpkg.com/esbuild-android-64/-/esbuild-android-64-0.15.5.tgz#3c7b2f2a59017dab3f2c0356188a8dd9cbdc91c8" + integrity sha512-dYPPkiGNskvZqmIK29OPxolyY3tp+c47+Fsc2WYSOVjEPWNCHNyqhtFqQadcXMJDQt8eN0NMDukbyQgFcHquXg== + +esbuild-android-arm64@0.15.5: + version "0.15.5" + resolved "https://registry.yarnpkg.com/esbuild-android-arm64/-/esbuild-android-arm64-0.15.5.tgz#e301db818c5a67b786bf3bb7320e414ac0fcf193" + integrity sha512-YyEkaQl08ze3cBzI/4Cm1S+rVh8HMOpCdq8B78JLbNFHhzi4NixVN93xDrHZLztlocEYqi45rHHCgA8kZFidFg== + esbuild-darwin-64@0.15.5: version "0.15.5" resolved "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.15.5.tgz" integrity sha512-Cr0iIqnWKx3ZTvDUAzG0H/u9dWjLE4c2gTtRLz4pqOBGjfjqdcZSfAObFzKTInLLSmD0ZV1I/mshhPoYSBMMCQ== +esbuild-darwin-arm64@0.15.5: + version "0.15.5" + resolved "https://registry.yarnpkg.com/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.5.tgz#ad89dafebb3613fd374f5a245bb0ce4132413997" + integrity sha512-WIfQkocGtFrz7vCu44ypY5YmiFXpsxvz2xqwe688jFfSVCnUsCn2qkEVDo7gT8EpsLOz1J/OmqjExePL1dr1Kg== + +esbuild-freebsd-64@0.15.5: + version "0.15.5" + resolved "https://registry.yarnpkg.com/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.5.tgz#6bfb52b4a0d29c965aa833e04126e95173289c8a" + integrity sha512-M5/EfzV2RsMd/wqwR18CELcenZ8+fFxQAAEO7TJKDmP3knhWSbD72ILzrXFMMwshlPAS1ShCZ90jsxkm+8FlaA== + +esbuild-freebsd-arm64@0.15.5: + version "0.15.5" + resolved "https://registry.yarnpkg.com/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.5.tgz#38a3fed8c6398072f9914856c7c3e3444f9ef4dd" + integrity sha512-2JQQ5Qs9J0440F/n/aUBNvY6lTo4XP/4lt1TwDfHuo0DY3w5++anw+jTjfouLzbJmFFiwmX7SmUhMnysocx96w== + +esbuild-linux-32@0.15.5: + version "0.15.5" + resolved "https://registry.yarnpkg.com/esbuild-linux-32/-/esbuild-linux-32-0.15.5.tgz#942dc70127f0c0a7ea91111baf2806e61fc81b32" + integrity sha512-gO9vNnIN0FTUGjvTFucIXtBSr1Woymmx/aHQtuU+2OllGU6YFLs99960UD4Dib1kFovVgs59MTXwpFdVoSMZoQ== + +esbuild-linux-64@0.15.5: + version "0.15.5" + resolved "https://registry.yarnpkg.com/esbuild-linux-64/-/esbuild-linux-64-0.15.5.tgz#6d748564492d5daaa7e62420862c31ac3a44aed9" + integrity sha512-ne0GFdNLsm4veXbTnYAWjbx3shpNKZJUd6XpNbKNUZaNllDZfYQt0/zRqOg0sc7O8GQ+PjSMv9IpIEULXVTVmg== + +esbuild-linux-arm64@0.15.5: + version "0.15.5" + resolved "https://registry.yarnpkg.com/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.5.tgz#28cd899beb2d2b0a3870fd44f4526835089a318d" + integrity sha512-7EgFyP2zjO065XTfdCxiXVEk+f83RQ1JsryN1X/VSX2li9rnHAt2swRbpoz5Vlrl6qjHrCmq5b6yxD13z6RheA== + +esbuild-linux-arm@0.15.5: + version "0.15.5" + resolved "https://registry.yarnpkg.com/esbuild-linux-arm/-/esbuild-linux-arm-0.15.5.tgz#6441c256225564d8794fdef5b0a69bc1a43051b5" + integrity sha512-wvAoHEN+gJ/22gnvhZnS/+2H14HyAxM07m59RSLn3iXrQsdS518jnEWRBnJz3fR6BJa+VUTo0NxYjGaNt7RA7Q== + +esbuild-linux-mips64le@0.15.5: + version "0.15.5" + resolved "https://registry.yarnpkg.com/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.5.tgz#d4927f817290eaffc062446896b2a553f0e11981" + integrity sha512-KdnSkHxWrJ6Y40ABu+ipTZeRhFtc8dowGyFsZY5prsmMSr1ZTG9zQawguN4/tunJ0wy3+kD54GaGwdcpwWAvZQ== + +esbuild-linux-ppc64le@0.15.5: + version "0.15.5" + resolved "https://registry.yarnpkg.com/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.5.tgz#b6d660dc6d5295f89ac51c675f1a2f639e2fb474" + integrity sha512-QdRHGeZ2ykl5P0KRmfGBZIHmqcwIsUKWmmpZTOq573jRWwmpfRmS7xOhmDHBj9pxv+6qRMH8tLr2fe+ZKQvCYw== + +esbuild-linux-riscv64@0.15.5: + version "0.15.5" + resolved "https://registry.yarnpkg.com/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.5.tgz#2801bf18414dc3d3ad58d1ea83084f00d9d84896" + integrity sha512-p+WE6RX+jNILsf+exR29DwgV6B73khEQV0qWUbzxaycxawZ8NE0wA6HnnTxbiw5f4Gx9sJDUBemh9v49lKOORA== + +esbuild-linux-s390x@0.15.5: + version "0.15.5" + resolved "https://registry.yarnpkg.com/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.5.tgz#12a634ae6d3384cacc2b8f4201047deafe596eae" + integrity sha512-J2ngOB4cNzmqLHh6TYMM/ips8aoZIuzxJnDdWutBw5482jGXiOzsPoEF4j2WJ2mGnm7FBCO4StGcwzOgic70JQ== + +esbuild-netbsd-64@0.15.5: + version "0.15.5" + resolved "https://registry.yarnpkg.com/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.5.tgz#951bbf87600512dfcfbe3b8d9d117d684d26c1b8" + integrity sha512-MmKUYGDizYjFia0Rwt8oOgmiFH7zaYlsoQ3tIOfPxOqLssAsEgG0MUdRDm5lliqjiuoog8LyDu9srQk5YwWF3w== + +esbuild-openbsd-64@0.15.5: + version "0.15.5" + resolved "https://registry.yarnpkg.com/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.5.tgz#26705b61961d525d79a772232e8b8f211fdbb035" + integrity sha512-2mMFfkLk3oPWfopA9Plj4hyhqHNuGyp5KQyTT9Rc8hFd8wAn5ZrbJg+gNcLMo2yzf8Uiu0RT6G9B15YN9WQyMA== + +esbuild-sunos-64@0.15.5: + version "0.15.5" + resolved "https://registry.yarnpkg.com/esbuild-sunos-64/-/esbuild-sunos-64-0.15.5.tgz#d794da1ae60e6e2f6194c44d7b3c66bf66c7a141" + integrity sha512-2sIzhMUfLNoD+rdmV6AacilCHSxZIoGAU2oT7XmJ0lXcZWnCvCtObvO6D4puxX9YRE97GodciRGDLBaiC6x1SA== + esbuild-wasm@0.15.5: version "0.15.5" resolved "https://registry.npmjs.org/esbuild-wasm/-/esbuild-wasm-0.15.5.tgz" @@ -5292,6 +5406,21 @@ esbuild-wasm@0.17.8: resolved "https://registry.npmjs.org/esbuild-wasm/-/esbuild-wasm-0.17.8.tgz" integrity sha512-zCmpxv95E0FuCmvdw1K836UHnj4EdiQnFfjTby35y3LAjRPtXMj3sbHDRHjbD8Mqg5lTwq3knacr/1qIFU51CQ== +esbuild-windows-32@0.15.5: + version "0.15.5" + resolved "https://registry.yarnpkg.com/esbuild-windows-32/-/esbuild-windows-32-0.15.5.tgz#0670326903f421424be86bc03b7f7b3ff86a9db7" + integrity sha512-e+duNED9UBop7Vnlap6XKedA/53lIi12xv2ebeNS4gFmu7aKyTrok7DPIZyU5w/ftHD4MUDs5PJUkQPP9xJRzg== + +esbuild-windows-64@0.15.5: + version "0.15.5" + resolved "https://registry.yarnpkg.com/esbuild-windows-64/-/esbuild-windows-64-0.15.5.tgz#64f32acb7341f3f0a4d10e8ff1998c2d1ebfc0a9" + integrity sha512-v+PjvNtSASHOjPDMIai9Yi+aP+Vwox+3WVdg2JB8N9aivJ7lyhp4NVU+J0MV2OkWFPnVO8AE/7xH+72ibUUEnw== + +esbuild-windows-arm64@0.15.5: + version "0.15.5" + resolved "https://registry.yarnpkg.com/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.5.tgz#4fe7f333ce22a922906b10233c62171673a3854b" + integrity sha512-Yz8w/D8CUPYstvVQujByu6mlf48lKmXkq6bkeSZZxTA626efQOJb26aDGLzmFWx6eg/FwrXgt6SZs9V8Pwy/aA== + esbuild@0.15.5: version "0.15.5" resolved "https://registry.npmjs.org/esbuild/-/esbuild-0.15.5.tgz" @@ -5362,9 +5491,9 @@ escape-html@~1.0.3: resolved "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz" integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== -escape-string-regexp@^1.0.5: +escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: version "1.0.5" - resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== escape-string-regexp@^4.0.0: @@ -5462,7 +5591,7 @@ eslint-rule-composer@^0.3.0: resolved "https://registry.npmjs.org/eslint-rule-composer/-/eslint-rule-composer-0.3.0.tgz" integrity sha512-bt+Sh8CtDmn2OajxvNO+BX7Wn4CIWMpTRm3MaiKPCQcnnlm0CS2mhui6QaoeQugs+3Kj2ESKEEGJUdVafwhiCg== -eslint-scope@^5.1.1, eslint-scope@5.1.1: +eslint-scope@5.1.1, eslint-scope@^5.1.1: version "5.1.1" resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz" integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== @@ -5470,15 +5599,7 @@ eslint-scope@^5.1.1, eslint-scope@5.1.1: esrecurse "^4.3.0" estraverse "^4.1.1" -eslint-scope@^7.0.0: - version "7.1.1" - resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz" - integrity sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw== - dependencies: - esrecurse "^4.3.0" - estraverse "^5.2.0" - -eslint-scope@^7.1.1: +eslint-scope@^7.0.0, eslint-scope@^7.1.1: version "7.1.1" resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz" integrity sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw== @@ -5503,7 +5624,7 @@ eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.0: resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.0.tgz" integrity sha512-HPpKPUBQcAsZOsHAFwTtIKcYlCje62XB7SEAcxjtmW6TD1WVpkS6i6/hOVtTZIl4zGj/mBqpFVGvaDneik+VoQ== -eslint@*, "eslint@^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8", "eslint@^6.0.0 || ^7.0.0 || ^8.0.0", "eslint@^6.0.0 || ^7.0.0 || >=8.0.0", "eslint@^7.0.0 || ^8.0.0", "eslint@^7.20.0 || ^8.0.0", eslint@^8.0.0, eslint@^8.28.0, eslint@>=2, eslint@>=5: +eslint@^8.28.0: version "8.38.0" resolved "https://registry.npmjs.org/eslint/-/eslint-8.38.0.tgz" integrity sha512-pIdsD2jwlUGf/U38Jv97t8lq6HpaU/G9NKbYmpWpZGw3LdTNhZLbJePqxOXGB5+JEKfOPU/XLxYxFh03nr1KTg== @@ -5597,7 +5718,7 @@ esutils@^2.0.2: resolved "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz" integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== -etag@^1.8.1, etag@~1.8.1, etag@1.8.1: +etag@1.8.1, etag@^1.8.1, etag@~1.8.1: version "1.8.1" resolved "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz" integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== @@ -5622,21 +5743,6 @@ events@^3.2.0: resolved "https://registry.npmjs.org/events/-/events-3.3.0.tgz" integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== -execa@^5.0.0: - version "5.1.1" - resolved "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz" - integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== - dependencies: - cross-spawn "^7.0.3" - get-stream "^6.0.0" - human-signals "^2.1.0" - is-stream "^2.0.0" - merge-stream "^2.0.0" - npm-run-path "^4.0.1" - onetime "^5.1.2" - signal-exit "^3.0.3" - strip-final-newline "^2.0.0" - execa@4.1.0: version "4.1.0" resolved "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz" @@ -5652,6 +5758,21 @@ execa@4.1.0: signal-exit "^3.0.2" strip-final-newline "^2.0.0" +execa@^5.0.0: + version "5.1.1" + resolved "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz" + integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== + dependencies: + cross-spawn "^7.0.3" + get-stream "^6.0.0" + human-signals "^2.1.0" + is-stream "^2.0.0" + merge-stream "^2.0.0" + npm-run-path "^4.0.1" + onetime "^5.1.2" + signal-exit "^3.0.3" + strip-final-newline "^2.0.0" + executable@^4.1.1: version "4.1.1" resolved "https://registry.npmjs.org/executable/-/executable-4.1.1.tgz" @@ -5671,7 +5792,7 @@ express-static-gzip@^2.1.5: dependencies: serve-static "^1.14.1" -express@^4.15.2, express@^4.17.1, express@^4.17.3, express@^4.18.2: +express@^4.17.1, express@^4.17.3, express@^4.18.2: version "4.18.2" resolved "https://registry.npmjs.org/express/-/express-4.18.2.tgz" integrity sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ== @@ -5733,7 +5854,7 @@ extract-zip@2.0.1: optionalDependencies: "@types/yauzl" "^2.9.1" -extsprintf@^1.2.0, extsprintf@1.3.0: +extsprintf@1.3.0, extsprintf@^1.2.0: version "1.3.0" resolved "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz" integrity sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g== @@ -5759,7 +5880,7 @@ fast-json-patch@^3.0.0-1: resolved "https://registry.npmjs.org/fast-json-patch/-/fast-json-patch-3.1.1.tgz" integrity sha512-vf6IHUX2SBcA+5/+4883dsIjpBTqmfBjmYiWK1savxQmFk4JfBMLa7ynTYOs1Rolp/T1betJxHiGD3g1Mn8lUQ== -fast-json-stable-stringify@^2.0.0, fast-json-stable-stringify@2.1.0: +fast-json-stable-stringify@2.1.0, fast-json-stable-stringify@^2.0.0: version "2.1.0" resolved "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz" integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== @@ -5964,11 +6085,20 @@ fraction.js@^4.2.0: resolved "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz" integrity sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA== -fresh@^0.5.2, fresh@0.5.2: +fresh@0.5.2, fresh@^0.5.2: version "0.5.2" resolved "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz" integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== +fs-extra@3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-3.0.1.tgz" + integrity sha512-V3Z3WZWVUYd8hoCL5xfXJCaHWYzmtwW5XWYSlLgERi8PWd8bx1kUHUk8L1BT57e49oKnDDD180mjfrHc1yA9rg== + dependencies: + graceful-fs "^4.1.2" + jsonfile "^3.0.0" + universalify "^0.1.0" + fs-extra@^8.1.0: version "8.1.0" resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz" @@ -5988,15 +6118,6 @@ fs-extra@^9.1.0: jsonfile "^6.0.1" universalify "^2.0.0" -fs-extra@3.0.1: - version "3.0.1" - resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-3.0.1.tgz" - integrity sha512-V3Z3WZWVUYd8hoCL5xfXJCaHWYzmtwW5XWYSlLgERi8PWd8bx1kUHUk8L1BT57e49oKnDDD180mjfrHc1yA9rg== - dependencies: - graceful-fs "^4.1.2" - jsonfile "^3.0.0" - universalify "^0.1.0" - fs-minipass@^2.0.0, fs-minipass@^2.1.0: version "2.1.0" resolved "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz" @@ -6089,14 +6210,7 @@ get-package-type@^0.1.0: resolved "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz" integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== -get-stream@^5.0.0: - version "5.2.0" - resolved "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz" - integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== - dependencies: - pump "^3.0.0" - -get-stream@^5.1.0: +get-stream@^5.0.0, get-stream@^5.1.0: version "5.2.0" resolved "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz" integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== @@ -6130,14 +6244,7 @@ getpass@^0.1.1: dependencies: assert-plus "^1.0.0" -glob-parent@^5.1.1: - version "5.1.2" - resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" - integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== - dependencies: - is-glob "^4.0.1" - -glob-parent@^5.1.2: +glob-parent@^5.1.1, glob-parent@^5.1.2, glob-parent@~5.1.2: version "5.1.2" resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== @@ -6151,18 +6258,45 @@ glob-parent@^6.0.1, glob-parent@^6.0.2: dependencies: is-glob "^4.0.3" -glob-parent@~5.1.2: - version "5.1.2" - resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" - integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== - dependencies: - is-glob "^4.0.1" - glob-to-regexp@^0.4.1: version "0.4.1" resolved "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz" integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== +glob@8.0.3, glob@^8.0.1: + version "8.0.3" + resolved "https://registry.npmjs.org/glob/-/glob-8.0.3.tgz" + integrity sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^5.0.1" + once "^1.3.0" + +glob@8.1.0: + version "8.1.0" + resolved "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz" + integrity sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^5.0.1" + once "^1.3.0" + +glob@^7.0.3: + version "7.2.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" + integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.1.1" + once "^1.3.0" + path-is-absolute "^1.0.0" + glob@^7.1.3, glob@^7.1.4, glob@^7.1.6, glob@^7.1.7, glob@~7.2.0: version "7.2.0" resolved "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz" @@ -6175,18 +6309,7 @@ glob@^7.1.3, glob@^7.1.4, glob@^7.1.6, glob@^7.1.7, glob@~7.2.0: once "^1.3.0" path-is-absolute "^1.0.0" -glob@^8.0.1, glob@8.0.3: - version "8.0.3" - resolved "https://registry.npmjs.org/glob/-/glob-8.0.3.tgz" - integrity sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^5.0.1" - once "^1.3.0" - -glob@^9.3.0: +glob@^9.3.0, glob@^9.3.1: version "9.3.5" resolved "https://registry.npmjs.org/glob/-/glob-9.3.5.tgz" integrity sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q== @@ -6196,27 +6319,6 @@ glob@^9.3.0: minipass "^4.2.4" path-scurry "^1.6.1" -glob@^9.3.1: - version "9.3.5" - resolved "https://registry.npmjs.org/glob/-/glob-9.3.5.tgz" - integrity sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q== - dependencies: - fs.realpath "^1.0.0" - minimatch "^8.0.2" - minipass "^4.2.4" - path-scurry "^1.6.1" - -glob@8.1.0: - version "8.1.0" - resolved "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz" - integrity sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^5.0.1" - once "^1.3.0" - global-dirs@^3.0.0: version "3.0.1" resolved "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.1.tgz" @@ -6243,19 +6345,7 @@ globalthis@^1.0.3: dependencies: define-properties "^1.1.3" -globby@^11.0.1: - version "11.1.0" - resolved "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz" - integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== - dependencies: - array-union "^2.1.0" - dir-glob "^3.0.1" - fast-glob "^3.2.9" - ignore "^5.2.0" - merge2 "^1.4.1" - slash "^3.0.0" - -globby@^11.1.0: +globby@^11.0.1, globby@^11.1.0: version "11.1.0" resolved "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz" integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== @@ -6278,6 +6368,18 @@ globby@^13.1.1: merge2 "^1.4.1" slash "^4.0.0" +globby@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-5.0.0.tgz#ebd84667ca0dbb330b99bcfc68eac2bc54370e0d" + integrity sha512-HJRTIH2EeH44ka+LWig+EqT2ONSYpVlNfx6pyd592/VF1TbfljJ7elwie7oSwcViLGqOdWocSdu2txwBF9bjmQ== + dependencies: + array-union "^1.0.1" + arrify "^1.0.0" + glob "^7.0.3" + object-assign "^4.0.1" + pify "^2.0.0" + pinkie-promise "^2.0.0" + gopd@^1.0.1: version "1.0.1" resolved "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz" @@ -6314,6 +6416,26 @@ handle-thing@^2.0.0: resolved "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz" integrity sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg== +har-schema@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" + integrity sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q== + +har-validator@~5.1.3: + version "5.1.5" + resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.5.tgz#1f0803b9f8cb20c0fa13822df1ecddb36bde1efd" + integrity sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w== + dependencies: + ajv "^6.12.3" + har-schema "^2.0.0" + +has-ansi@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" + integrity sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg== + dependencies: + ansi-regex "^2.0.0" + has-bigints@^1.0.1, has-bigints@^1.0.2: version "1.0.2" resolved "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz" @@ -6474,16 +6596,6 @@ http-deceiver@^1.2.7: resolved "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz" integrity sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw== -http-errors@~1.6.2: - version "1.6.3" - resolved "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz" - integrity sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A== - dependencies: - depd "~1.1.2" - inherits "2.0.3" - setprototypeof "1.1.0" - statuses ">= 1.4.0 < 2" - http-errors@2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz" @@ -6495,6 +6607,16 @@ http-errors@2.0.0: statuses "2.0.1" toidentifier "1.0.1" +http-errors@~1.6.2: + version "1.6.3" + resolved "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz" + integrity sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A== + dependencies: + depd "~1.1.2" + inherits "2.0.3" + setprototypeof "1.1.0" + statuses ">= 1.4.0 < 2" + http-parser-js@>=0.5.1: version "0.5.8" resolved "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz" @@ -6529,18 +6651,7 @@ http-proxy-middleware@^1.0.5: is-plain-obj "^3.0.0" micromatch "^4.0.2" -http-proxy-middleware@^2.0.3: - version "2.0.6" - resolved "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz" - integrity sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw== - dependencies: - "@types/http-proxy" "^1.17.8" - http-proxy "^1.18.1" - is-glob "^4.0.1" - is-plain-obj "^3.0.0" - micromatch "^4.0.2" - -http-proxy-middleware@^2.0.6: +http-proxy-middleware@^2.0.3, http-proxy-middleware@^2.0.6: version "2.0.6" resolved "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz" integrity sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw== @@ -6560,6 +6671,15 @@ http-proxy@^1.18.1: follow-redirects "^1.0.0" requires-port "^1.0.0" +http-signature@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" + integrity sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ== + dependencies: + assert-plus "^1.0.0" + jsprim "^1.2.2" + sshpk "^1.7.0" + http-signature@~1.3.6: version "1.3.6" resolved "https://registry.npmjs.org/http-signature/-/http-signature-1.3.6.tgz" @@ -6569,7 +6689,7 @@ http-signature@~1.3.6: jsprim "^2.0.2" sshpk "^1.14.1" -https-proxy-agent@^5.0.0, https-proxy-agent@^5.0.1, https-proxy-agent@5.0.1: +https-proxy-agent@5.0.1, https-proxy-agent@^5.0.0, https-proxy-agent@^5.0.1: version "5.0.1" resolved "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz" integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== @@ -6599,7 +6719,7 @@ hyphenate-style-name@^1.0.3: resolved "https://registry.npmjs.org/hyphenate-style-name/-/hyphenate-style-name-1.0.4.tgz" integrity sha512-ygGZLjmXfPHj+ZWh6LwbC37l43MhfztxetbFCoYTM2VjkIUpeHgSNn7QIyVFj7YQ1Wl9Cbw5sholVJPzWvC2MQ== -i18next@^19.5.0, "i18next@>= 19.0.0": +i18next@^19.5.0: version "19.9.2" resolved "https://registry.npmjs.org/i18next/-/i18next-19.9.2.tgz" integrity sha512-0i6cuo6ER6usEOtKajUUDj92zlG+KArFia0857xxiEHAQcUwh/RtOQocui1LPJwunSYT574Pk64aNva1kwtxZg== @@ -6613,27 +6733,20 @@ icomcom-react@^1.0.1: dependencies: prop-types "^15.6.0" -iconv-lite@^0.4.24: +iconv-lite@0.4.24, iconv-lite@^0.4.24: version "0.4.24" resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz" integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== dependencies: safer-buffer ">= 2.1.2 < 3" -iconv-lite@^0.6.2, iconv-lite@^0.6.3, iconv-lite@0.6.3: +iconv-lite@0.6.3, iconv-lite@^0.6.2, iconv-lite@^0.6.3: version "0.6.3" resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz" integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== dependencies: safer-buffer ">= 2.1.2 < 3.0.0" -iconv-lite@0.4.24: - version "0.4.24" - resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz" - integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== - dependencies: - safer-buffer ">= 2.1.2 < 3" - icss-utils@^5.0.0, icss-utils@^5.1.0: version "5.1.0" resolved "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz" @@ -6656,7 +6769,7 @@ ignore-walk@^6.0.0: dependencies: minimatch "^7.4.2" -ignore@^5.2.0, ignore@5.2.4: +ignore@5.2.4, ignore@^5.2.0: version "5.2.4" resolved "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz" integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ== @@ -6720,7 +6833,7 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3, inherits@2, inherits@2.0.4: +inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3: version "2.0.4" resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== @@ -6740,6 +6853,11 @@ ini@3.0.1: resolved "https://registry.npmjs.org/ini/-/ini-3.0.1.tgz" integrity sha512-it4HyVAUTKBc6m8e1iXWvXSTdndF7HbdN713+kvLrymxTaU4AUBWrJ4vEooP+V7fexnVD3LKcBshjGGPefSMUQ== +ini@^1.3.4: + version "1.3.8" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" + integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== + inquirer@8.2.4: version "8.2.4" resolved "https://registry.npmjs.org/inquirer/-/inquirer-8.2.4.tgz" @@ -6792,16 +6910,16 @@ ip@^2.0.0: resolved "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz" integrity sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ== -ipaddr.js@^2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.0.1.tgz" - integrity sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng== - ipaddr.js@1.9.1: version "1.9.1" resolved "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz" integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== +ipaddr.js@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.0.1.tgz" + integrity sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng== + is-arguments@^1.1.1: version "1.1.1" resolved "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz" @@ -6951,6 +7069,25 @@ is-number@^7.0.0: resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz" integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== +is-path-cwd@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-1.0.0.tgz#d225ec23132e89edd38fda767472e62e65f1106d" + integrity sha512-cnS56eR9SPAscL77ik76ATVqoPARTqPIVkMDVxRaWH06zT+6+CzIroYRJ0VVvm0Z1zfAvxvz9i/D3Ppjaqt5Nw== + +is-path-in-cwd@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz#5ac48b345ef675339bd6c7a48a912110b241cf52" + integrity sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ== + dependencies: + is-path-inside "^1.0.0" + +is-path-inside@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.1.tgz#8ef5b7de50437a3fdca6b4e865ef7aa55cb48036" + integrity sha512-qhsCR/Esx4U4hg/9I19OVUAJkGWtjRYHMRgUMZE2TDdj+Ag+kttZanLupfddNyglzz50cUlmWzUaI37GDfNx/g== + dependencies: + path-is-inside "^1.0.1" + is-path-inside@^3.0.2, is-path-inside@^3.0.3: version "3.0.3" resolved "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz" @@ -7177,7 +7314,7 @@ jake@^10.8.5: filelist "^1.0.1" minimatch "^3.0.4" -jasmine-core@^3.6.0, jasmine-core@^3.8.0, jasmine-core@>=3.8: +jasmine-core@^3.6.0, jasmine-core@^3.8.0: version "3.99.1" resolved "https://registry.npmjs.org/jasmine-core/-/jasmine-core-3.99.1.tgz" integrity sha512-Hu1dmuoGcZ7AfyynN3LsfruwMbxMALMka+YtZeGoLuDEySVmVAPaonkNoBRIw/ectu8b9tVQCJNgp4a4knp+tg== @@ -7198,11 +7335,6 @@ jest-worker@^27.4.5: merge-stream "^2.0.0" supports-color "^8.0.0" -"jquery@1.9.1 - 3": - version "3.6.4" - resolved "https://registry.npmjs.org/jquery/-/jquery-3.6.4.tgz" - integrity sha512-v28EW9DWDFpzcD9O5iyJXg3R3+q+mET5JhnjJzQUZMHOv67bpSIHq81GEYpPNZHG+XXHsfSme3nxp/hndKEcsQ== - js-cookie@2.2.1: version "2.2.1" resolved "https://registry.npmjs.org/js-cookie/-/js-cookie-2.2.1.tgz" @@ -7243,6 +7375,38 @@ jsdoc-type-pratt-parser@~3.1.0: resolved "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-3.1.0.tgz" integrity sha512-MgtD0ZiCDk9B+eI73BextfRrVQl0oyzRG8B2BjORts6jbunj4ScKPcyXGTbB6eXL4y9TzxCm6hyeLq/2ASzNdw== +jsdom@21.1.0: + version "21.1.0" + resolved "https://registry.npmjs.org/jsdom/-/jsdom-21.1.0.tgz" + integrity sha512-m0lzlP7qOtthD918nenK3hdItSd2I+V3W9IrBcB36sqDwG+KnUs66IF5GY7laGWUnlM9vTsD0W1QwSEBYWWcJg== + dependencies: + abab "^2.0.6" + acorn "^8.8.1" + acorn-globals "^7.0.0" + cssom "^0.5.0" + cssstyle "^2.3.0" + data-urls "^3.0.2" + decimal.js "^10.4.2" + domexception "^4.0.0" + escodegen "^2.0.0" + form-data "^4.0.0" + html-encoding-sniffer "^3.0.0" + http-proxy-agent "^5.0.0" + https-proxy-agent "^5.0.1" + is-potential-custom-element-name "^1.0.1" + nwsapi "^2.2.2" + parse5 "^7.1.1" + saxes "^6.0.0" + symbol-tree "^3.2.4" + tough-cookie "^4.1.2" + w3c-xmlserializer "^4.0.0" + webidl-conversions "^7.0.0" + whatwg-encoding "^2.0.0" + whatwg-mimetype "^3.0.0" + whatwg-url "^11.0.0" + ws "^8.11.0" + xml-name-validator "^4.0.0" + jsdom@^16.4.0: version "16.7.0" resolved "https://registry.npmjs.org/jsdom/-/jsdom-16.7.0.tgz" @@ -7276,38 +7440,6 @@ jsdom@^16.4.0: ws "^7.4.6" xml-name-validator "^3.0.0" -jsdom@21.1.0: - version "21.1.0" - resolved "https://registry.npmjs.org/jsdom/-/jsdom-21.1.0.tgz" - integrity sha512-m0lzlP7qOtthD918nenK3hdItSd2I+V3W9IrBcB36sqDwG+KnUs66IF5GY7laGWUnlM9vTsD0W1QwSEBYWWcJg== - dependencies: - abab "^2.0.6" - acorn "^8.8.1" - acorn-globals "^7.0.0" - cssom "^0.5.0" - cssstyle "^2.3.0" - data-urls "^3.0.2" - decimal.js "^10.4.2" - domexception "^4.0.0" - escodegen "^2.0.0" - form-data "^4.0.0" - html-encoding-sniffer "^3.0.0" - http-proxy-agent "^5.0.0" - https-proxy-agent "^5.0.1" - is-potential-custom-element-name "^1.0.1" - nwsapi "^2.2.2" - parse5 "^7.1.1" - saxes "^6.0.0" - symbol-tree "^3.2.4" - tough-cookie "^4.1.2" - w3c-xmlserializer "^4.0.0" - webidl-conversions "^7.0.0" - whatwg-encoding "^2.0.0" - whatwg-mimetype "^3.0.0" - whatwg-url "^11.0.0" - ws "^8.11.0" - xml-name-validator "^4.0.0" - jsesc@^2.5.1: version "2.5.2" resolved "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz" @@ -7365,7 +7497,7 @@ json5@^2.1.2, json5@^2.2.1, json5@^2.2.2: resolved "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz" integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== -jsonc-parser@^3.0.0, jsonc-parser@3.0.0: +jsonc-parser@3.0.0, jsonc-parser@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.0.0.tgz" integrity sha512-fQzRfAbIBnR0IQvftw9FJveWiHp72Fg20giDrHz6TdfB12UH/uue0D3hm57UB5KgAVuniLMCaS8P1IMj9NR7cA== @@ -7413,6 +7545,16 @@ jsonschema@1.4.0: resolved "https://registry.npmjs.org/jsonschema/-/jsonschema-1.4.0.tgz" integrity sha512-/YgW6pRMr6M7C+4o8kS+B/2myEpHCrxO4PEWnqJNBFMjn7EWXqlQ4tGwL6xTHeRplwuZmcAncdvfOad1nT2yMw== +jsprim@^1.2.2: + version "1.4.2" + resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.2.tgz#712c65533a15c878ba59e9ed5f0e26d5b77c5feb" + integrity sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw== + dependencies: + assert-plus "1.0.0" + extsprintf "1.3.0" + json-schema "0.4.0" + verror "1.10.0" + jsprim@^2.0.2: version "2.0.2" resolved "https://registry.npmjs.org/jsprim/-/jsprim-2.0.2.tgz" @@ -7490,7 +7632,7 @@ jss-rtl@^0.3.0: dependencies: rtl-css-js "^1.13.1" -jss@^10.0.0, jss@^10.3.0, jss@^10.5.1, jss@10.10.0: +jss@10.10.0, jss@^10.3.0, jss@^10.5.1: version "10.10.0" resolved "https://registry.npmjs.org/jss/-/jss-10.10.0.tgz" integrity sha512-cqsOTS7jqPsPMjtKYDUpdFC0AbhYFLTcuGRqymgmdJIeQ8cH7+AgX7YSgQy79wXloZq2VvATYxUOUQEvS1V/Zw== @@ -7539,7 +7681,7 @@ karma-jasmine-html-reporter@^1.5.0: resolved "https://registry.npmjs.org/karma-jasmine-html-reporter/-/karma-jasmine-html-reporter-1.7.0.tgz" integrity sha512-pzum1TL7j90DTE86eFt48/s12hqwQuiD+e5aXx2Dc9wDEn2LfGq6RoAxEZZjFiN0RDSCOnosEKRZWxbQ+iMpQQ== -karma-jasmine@>=1.1, karma-jasmine@~4.0.0: +karma-jasmine@~4.0.0: version "4.0.2" resolved "https://registry.npmjs.org/karma-jasmine/-/karma-jasmine-4.0.2.tgz" integrity sha512-ggi84RMNQffSDmWSyyt4zxzh2CQGwsxvYYsprgyR1j8ikzIduEdOlcLvXjZGwXG/0j41KUXOWsUCBfbEHPWP9g== @@ -7562,7 +7704,7 @@ karma-source-map-support@1.4.0: dependencies: source-map-support "^0.5.5" -karma@*, karma@^6.3.0, karma@^6.3.14, karma@>=0.13, karma@>=0.9: +karma@^6.3.14: version "6.4.1" resolved "https://registry.npmjs.org/karma/-/karma-6.4.1.tgz" integrity sha512-Cj57NKOskK7wtFWSlMvZf459iX+kpYIPXmkNUzP2WAFcA7nhr/ALn5R7sw3w+1udFDcpMx/tuB8d5amgm3ijaA== @@ -7639,7 +7781,7 @@ less-loader@11.1.0: dependencies: klona "^2.0.4" -"less@^3.5.0 || ^4.0.0", less@4.1.3: +less@4.1.3: version "4.1.3" resolved "https://registry.npmjs.org/less/-/less-4.1.3.tgz" integrity sha512-w16Xk/Ta9Hhyei0Gpz9m7VS8F28nieJaL/VyShID7cYvP6IL5oHeL6p4TXSDJqZE/lNv0oJ2pGVjJsRkfwm5FA== @@ -7715,6 +7857,11 @@ loader-runner@^4.2.0: resolved "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz" integrity sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg== +loader-utils@3.2.1: + version "3.2.1" + resolved "https://registry.npmjs.org/loader-utils/-/loader-utils-3.2.1.tgz" + integrity sha512-ZvFw1KWS3GVyYBYb7qkmRM/WwL2TQQBxgCK62rlvm4WpVQ23Nb4tYjApUlfjrEGvOs7KHEsmyUn75OHZrJMWPw== + loader-utils@^2.0.0: version "2.0.4" resolved "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz" @@ -7724,11 +7871,6 @@ loader-utils@^2.0.0: emojis-list "^3.0.0" json5 "^2.1.2" -loader-utils@3.2.1: - version "3.2.1" - resolved "https://registry.npmjs.org/loader-utils/-/loader-utils-3.2.1.tgz" - integrity sha512-ZvFw1KWS3GVyYBYb7qkmRM/WwL2TQQBxgCK62rlvm4WpVQ23Nb4tYjApUlfjrEGvOs7KHEsmyUn75OHZrJMWPw== - localtunnel@^2.0.1: version "2.0.2" resolved "https://registry.npmjs.org/localtunnel/-/localtunnel-2.0.2.tgz" @@ -7845,13 +7987,6 @@ lru-cache@^9.0.0: resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-9.0.1.tgz" integrity sha512-C8QsKIN1UIXeOs3iWmiZ1lQY+EnKDojWd37fXy1aSbJvH4iSma1uy2OWuoB3m4SYRli5+CUjDv3Dij5DVoetmg== -magic-string@^0.27.0: - version "0.27.0" - resolved "https://registry.npmjs.org/magic-string/-/magic-string-0.27.0.tgz" - integrity sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA== - dependencies: - "@jridgewell/sourcemap-codec" "^1.4.13" - magic-string@0.25.7: version "0.25.7" resolved "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz" @@ -7866,6 +8001,13 @@ magic-string@0.29.0: dependencies: "@jridgewell/sourcemap-codec" "^1.4.13" +magic-string@^0.27.0: + version "0.27.0" + resolved "https://registry.npmjs.org/magic-string/-/magic-string-0.27.0.tgz" + integrity sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA== + dependencies: + "@jridgewell/sourcemap-codec" "^1.4.13" + make-dir@^2.1.0: version "2.1.0" resolved "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz" @@ -7908,28 +8050,7 @@ make-fetch-happen@^10.0.3: socks-proxy-agent "^7.0.0" ssri "^9.0.0" -make-fetch-happen@^11.0.0: - version "11.0.3" - resolved "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-11.0.3.tgz" - integrity sha512-oPLh5m10lRNNZDjJ2kP8UpboUx2uFXVaVweVe/lWut4iHWcQEmfqSVJt2ihZsFI8HbpwyyocaXbCAWf0g1ukIA== - dependencies: - agentkeepalive "^4.2.1" - cacache "^17.0.0" - http-cache-semantics "^4.1.1" - http-proxy-agent "^5.0.0" - https-proxy-agent "^5.0.0" - is-lambda "^1.0.1" - lru-cache "^7.7.1" - minipass "^4.0.0" - minipass-fetch "^3.0.0" - minipass-flush "^1.0.5" - minipass-pipeline "^1.2.4" - negotiator "^0.6.3" - promise-retry "^2.0.1" - socks-proxy-agent "^7.0.0" - ssri "^10.0.0" - -make-fetch-happen@^11.0.1: +make-fetch-happen@^11.0.0, make-fetch-happen@^11.0.1: version "11.0.3" resolved "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-11.0.3.tgz" integrity sha512-oPLh5m10lRNNZDjJ2kP8UpboUx2uFXVaVweVe/lWut4iHWcQEmfqSVJt2ihZsFI8HbpwyyocaXbCAWf0g1ukIA== @@ -8015,7 +8136,7 @@ memfs@^3.4.12, memfs@^3.4.3: dependencies: fs-monkey "^1.0.3" -memoize-one@^5.1.1, "memoize-one@>=3.1.1 <6": +"memoize-one@>=3.1.1 <6", memoize-one@^5.1.1: version "5.2.1" resolved "https://registry.npmjs.org/memoize-one/-/memoize-one-5.2.1.tgz" integrity sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q== @@ -8058,7 +8179,7 @@ micromatch@^4.0.2, micromatch@^4.0.4: braces "^3.0.2" picomatch "^2.3.1" -"mime-db@>= 1.43.0 < 2", mime-db@1.52.0: +mime-db@1.52.0, "mime-db@>= 1.43.0 < 2": version "1.52.0" resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz" integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== @@ -8070,26 +8191,21 @@ mime-types@^2.1.12, mime-types@^2.1.27, mime-types@^2.1.31, mime-types@~2.1.17, dependencies: mime-db "1.52.0" -mime@^1.4.1, mime@1.6.0: - version "1.6.0" - resolved "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz" - integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== - -mime@^2.4.6: - version "2.6.0" - resolved "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz" - integrity sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg== - -mime@^2.5.2: - version "2.6.0" - resolved "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz" - integrity sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg== - mime@1.4.1: version "1.4.1" resolved "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz" integrity sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ== +mime@1.6.0, mime@^1.4.1: + version "1.6.0" + resolved "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz" + integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== + +mime@^2.4.6, mime@^2.5.2: + version "2.6.0" + resolved "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz" + integrity sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg== + mimic-fn@^2.1.0: version "2.1.0" resolved "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz" @@ -8114,20 +8230,20 @@ minimalistic-assert@^1.0.0: resolved "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz" integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== -minimatch@^3.0.2, minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.2: - version "3.1.2" - resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" - integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== - dependencies: - brace-expansion "^1.1.7" - -minimatch@^5.0.1, minimatch@5.1.0: +minimatch@5.1.0, minimatch@^5.0.1: version "5.1.0" resolved "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz" integrity sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg== dependencies: brace-expansion "^2.0.1" +minimatch@^3.0.2, minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: + version "3.1.2" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + minimatch@^7.4.2: version "7.4.6" resolved "https://registry.npmjs.org/minimatch/-/minimatch-7.4.6.tgz" @@ -8135,23 +8251,16 @@ minimatch@^7.4.2: dependencies: brace-expansion "^2.0.1" -minimatch@^8.0.2: +minimatch@^8.0.2, minimatch@^8.0.3: version "8.0.4" resolved "https://registry.npmjs.org/minimatch/-/minimatch-8.0.4.tgz" integrity sha512-W0Wvr9HyFXZRGIDgCicunpQ299OKXs9RgZfaukz4qAW/pJhcpUfupc9c+OObPOFueNy8VSrZgEmDtk6Kh4WzDA== dependencies: brace-expansion "^2.0.1" -minimatch@^8.0.3: - version "8.0.4" - resolved "https://registry.npmjs.org/minimatch/-/minimatch-8.0.4.tgz" - integrity sha512-W0Wvr9HyFXZRGIDgCicunpQ299OKXs9RgZfaukz4qAW/pJhcpUfupc9c+OObPOFueNy8VSrZgEmDtk6Kh4WzDA== - dependencies: - brace-expansion "^2.0.1" - -minimist@^1.2.0, minimist@^1.2.6: +minimist@^1.2.0, minimist@^1.2.5, minimist@^1.2.6: version "1.2.8" - resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== minipass-collect@^1.0.2: @@ -8247,7 +8356,7 @@ mirador-share-plugin@^0.11.0: resolved "https://registry.npmjs.org/mirador-share-plugin/-/mirador-share-plugin-0.11.0.tgz" integrity sha512-fHcdDXyrtfy5pn1zdQNX9BvE5Tjup66eQwyNippE5PMaP8ImUcrFaSL+mStdn+v6agsHcsdRqLhseZ0XWgEuAw== -mirador@^3.0.0-beta.0, mirador@^3.0.0-rc.7, mirador@^3.3.0: +mirador@^3.3.0: version "3.3.0" resolved "https://registry.npmjs.org/mirador/-/mirador-3.3.0.tgz" integrity sha512-BmGfRnWJ45B+vtiAwcFT7n9nKialfejE9UvuUK0NorO37ShArpsKr3yVSD4jQASwSR4DRRpPEG21jOk4WN7H3w== @@ -8334,16 +8443,16 @@ mrmime@^1.0.0: resolved "https://registry.npmjs.org/mrmime/-/mrmime-1.0.1.tgz" integrity sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw== -ms@^2.0.0, ms@^2.1.1, ms@2.1.2: - version "2.1.2" - resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" - integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== - ms@2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz" integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== +ms@2.1.2, ms@^2.0.0, ms@^2.1.1: + version "2.1.2" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + ms@2.1.3: version "2.1.3" resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz" @@ -8386,7 +8495,7 @@ needle@^3.1.0: iconv-lite "^0.6.3" sax "^1.2.4" -negotiator@^0.6.3, negotiator@0.6.3: +negotiator@0.6.3, negotiator@^0.6.3: version "0.6.3" resolved "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz" integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== @@ -8421,7 +8530,7 @@ ngx-infinite-scroll@^10.0.1: "@scarf/scarf" "^1.1.0" opencollective-postinstall "^2.0.2" -ngx-mask@^13.0.0, ngx-mask@^13.1.7: +ngx-mask@^13.1.7: version "13.1.15" resolved "https://registry.npmjs.org/ngx-mask/-/ngx-mask-13.1.15.tgz" integrity sha512-fplyzkFa6lFTzPo/AHaI3TBQxTMdcqQClR9BLLAWTvCyDZkV28fLqWkpIpy0VvPc9ADogFpJJj7R1356mszjag== @@ -8553,7 +8662,7 @@ normalize-url@^4.5.0: resolved "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz" integrity sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA== -nouislider@^14.6.3, nouislider@>=9.x: +nouislider@^14.6.3: version "14.7.0" resolved "https://registry.npmjs.org/nouislider/-/nouislider-14.7.0.tgz" integrity sha512-4RtQ1+LHJKesDCNJrXkQcwXAWCrC2aggdLYMstS/G5fEWL+fXZbUA9pwVNHFghMGuFGRATlDLNInRaPeRKzpFQ== @@ -8577,7 +8686,7 @@ npm-normalize-package-bin@^3.0.0: resolved "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-3.0.0.tgz" integrity sha512-g+DPQSkusnk7HYXr75NtzkIP4+N81i3RPsGFidF3DzHd9MT9wWngmqoeg/fnHFz5MNdtG4w03s+QnhewSLTT2Q== -npm-package-arg@^10.0.0, npm-package-arg@10.1.0: +npm-package-arg@10.1.0, npm-package-arg@^10.0.0: version "10.1.0" resolved "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-10.1.0.tgz" integrity sha512-uFyyCEmgBfZTtrKk/5xDfHp6+MdrqGotX/VoOyEEl3mBwiEE5FlBaePanazJSVMPT7vKepcjYBY2ztg9A3yPIA== @@ -8594,7 +8703,7 @@ npm-packlist@^7.0.0: dependencies: ignore-walk "^6.0.0" -npm-pick-manifest@^8.0.0, npm-pick-manifest@8.0.1: +npm-pick-manifest@8.0.1, npm-pick-manifest@^8.0.0: version "8.0.1" resolved "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-8.0.1.tgz" integrity sha512-mRtvlBjTsJvfCCdmPtiu2bdlx8d/KXtF7yNXNWe7G0Z36qWA9Ny5zXsI2PfBZEv7SXgoxTmNaTzGSbbzDZChoA== @@ -8646,9 +8755,14 @@ nwsapi@^2.2.0, nwsapi@^2.2.2: resolved "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.3.tgz" integrity sha512-jscxIO4/VKScHlbmFBdV1Z6LXnLO+ZR4VMtypudUdfwtKxUN3TQcNFIHLwKtrUbDyHN4/GycY9+oRGZ2XMXYPw== -object-assign@^4, object-assign@^4.1.1: +oauth-sign@~0.9.0: + version "0.9.0" + resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" + integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== + +object-assign@^4, object-assign@^4.0.1, object-assign@^4.1.1: version "4.1.1" - resolved "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== object-inspect@^1.12.3, object-inspect@^1.9.0: @@ -8698,13 +8812,6 @@ obuf@^1.0.0, obuf@^1.1.2: resolved "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz" integrity sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg== -on-finished@~2.3.0: - version "2.3.0" - resolved "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz" - integrity sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww== - dependencies: - ee-first "1.1.1" - on-finished@2.4.1: version "2.4.1" resolved "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz" @@ -8712,6 +8819,13 @@ on-finished@2.4.1: dependencies: ee-first "1.1.1" +on-finished@~2.3.0: + version "2.3.0" + resolved "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz" + integrity sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww== + dependencies: + ee-first "1.1.1" + on-headers@~1.0.2: version "1.0.2" resolved "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz" @@ -8731,7 +8845,7 @@ onetime@^5.1.0, onetime@^5.1.2: dependencies: mimic-fn "^2.1.0" -open@^8.0.9, open@8.4.0: +open@8.4.0, open@^8.0.9: version "8.4.0" resolved "https://registry.npmjs.org/open/-/open-8.4.0.tgz" integrity sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q== @@ -8800,7 +8914,7 @@ optionator@^0.9.1: type-check "^0.4.0" word-wrap "^1.2.3" -ora@^5.1.0, ora@^5.4.1, ora@5.4.1: +ora@5.4.1, ora@^5.1.0, ora@^5.4.1: version "5.4.1" resolved "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz" integrity sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ== @@ -8967,35 +9081,23 @@ parse5-sax-parser@^7.0.0: dependencies: parse5 "^7.0.0" +parse5@6.0.1, parse5@^6.0.1: + version "6.0.1" + resolved "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz" + integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== + parse5@^5.0.0: version "5.1.1" resolved "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz" integrity sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug== -parse5@^6.0.1: - version "6.0.1" - resolved "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz" - integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== - -parse5@^7.0.0: +parse5@^7.0.0, parse5@^7.1.1: version "7.1.2" resolved "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz" integrity sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw== dependencies: entities "^4.4.0" -parse5@^7.1.1: - version "7.1.2" - resolved "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz" - integrity sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw== - dependencies: - entities "^4.4.0" - -parse5@6.0.1: - version "6.0.1" - resolved "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz" - integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== - parseurl@~1.3.2, parseurl@~1.3.3: version "1.3.3" resolved "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz" @@ -9011,6 +9113,11 @@ path-is-absolute@^1.0.0: resolved "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== +path-is-inside@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" + integrity sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w== + path-key@^3.0.0, path-key@^3.1.0: version "3.1.1" resolved "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz" @@ -9074,14 +9181,9 @@ picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== -pify@^2.2.0: +pify@^2.0.0, pify@^2.2.0, pify@^2.3.0: version "2.3.0" - resolved "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz" - integrity sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog== - -pify@^2.3.0: - version "2.3.0" - resolved "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz" + resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" integrity sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog== pify@^4.0.1: @@ -9089,7 +9191,19 @@ pify@^4.0.1: resolved "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz" integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== -piscina@~3.2.0, piscina@3.2.0: +pinkie-promise@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" + integrity sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw== + dependencies: + pinkie "^2.0.0" + +pinkie@^2.0.0: + version "2.0.4" + resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" + integrity sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg== + +piscina@3.2.0, piscina@~3.2.0: version "3.2.0" resolved "https://registry.npmjs.org/piscina/-/piscina-3.2.0.tgz" integrity sha512-yn/jMdHRw+q2ZJhFhyqsmANcbF6V2QwmD84c6xRau+QpQOmtrBCoRGdvTfeuFDYXB5W2m6MfLkjkvQa9lUSmIA== @@ -9107,11 +9221,6 @@ pkg-dir@^4.1.0, pkg-dir@^4.2.0: dependencies: find-up "^4.0.0" -popper.js@^1.16.1: - version "1.16.1" - resolved "https://registry.npmjs.org/popper.js/-/popper.js-1.16.1.tgz" - integrity sha512-Wb4p1J4zyFTbM+u6WuO4XstYx4Ky9Cewe4DWrel7B0w6VVICvPwdOpotjzcf6eD8TsckVnIMNONQyPIUFOUbCQ== - popper.js@1.16.1-lts: version "1.16.1-lts" resolved "https://registry.npmjs.org/popper.js/-/popper.js-1.16.1-lts.tgz" @@ -9242,19 +9351,19 @@ postcss-image-set-function@^4.0.7: dependencies: postcss-value-parser "^4.2.0" -postcss-import@^14.0.0: - version "14.1.0" - resolved "https://registry.npmjs.org/postcss-import/-/postcss-import-14.1.0.tgz" - integrity sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw== +postcss-import@15.0.0: + version "15.0.0" + resolved "https://registry.npmjs.org/postcss-import/-/postcss-import-15.0.0.tgz" + integrity sha512-Y20shPQ07RitgBGv2zvkEAu9bqvrD77C9axhj/aA1BQj4czape2MdClCExvB27EwYEJdGgKZBpKanb0t1rK2Kg== dependencies: postcss-value-parser "^4.0.0" read-cache "^1.0.0" resolve "^1.1.7" -postcss-import@15.0.0: - version "15.0.0" - resolved "https://registry.npmjs.org/postcss-import/-/postcss-import-15.0.0.tgz" - integrity sha512-Y20shPQ07RitgBGv2zvkEAu9bqvrD77C9axhj/aA1BQj4czape2MdClCExvB27EwYEJdGgKZBpKanb0t1rK2Kg== +postcss-import@^14.0.0: + version "14.1.0" + resolved "https://registry.npmjs.org/postcss-import/-/postcss-import-14.1.0.tgz" + integrity sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw== dependencies: postcss-value-parser "^4.0.0" read-cache "^1.0.0" @@ -9273,17 +9382,6 @@ postcss-lab-function@^4.2.1: "@csstools/postcss-progressive-custom-properties" "^1.1.0" postcss-value-parser "^4.2.0" -postcss-loader@^4.0.3: - version "4.3.0" - resolved "https://registry.npmjs.org/postcss-loader/-/postcss-loader-4.3.0.tgz" - integrity sha512-M/dSoIiNDOo8Rk0mUqoj4kpGq91gcxCfb9PoyZVdZ76/AuhxylHDYZblNE8o+EQ9AMSASeMFEKxZf5aU6wlx1Q== - dependencies: - cosmiconfig "^7.0.0" - klona "^2.0.4" - loader-utils "^2.0.0" - schema-utils "^3.0.0" - semver "^7.3.4" - postcss-loader@7.0.1: version "7.0.1" resolved "https://registry.npmjs.org/postcss-loader/-/postcss-loader-7.0.1.tgz" @@ -9302,6 +9400,17 @@ postcss-loader@7.0.2: klona "^2.0.5" semver "^7.3.8" +postcss-loader@^4.0.3: + version "4.3.0" + resolved "https://registry.npmjs.org/postcss-loader/-/postcss-loader-4.3.0.tgz" + integrity sha512-M/dSoIiNDOo8Rk0mUqoj4kpGq91gcxCfb9PoyZVdZ76/AuhxylHDYZblNE8o+EQ9AMSASeMFEKxZf5aU6wlx1Q== + dependencies: + cosmiconfig "^7.0.0" + klona "^2.0.4" + loader-utils "^2.0.0" + schema-utils "^3.0.0" + semver "^7.3.4" + postcss-logical@^5.0.4: version "5.0.4" resolved "https://registry.npmjs.org/postcss-logical/-/postcss-logical-5.0.4.tgz" @@ -9372,61 +9481,6 @@ postcss-place@^7.0.5: dependencies: postcss-value-parser "^4.2.0" -postcss-preset-env@^7.4.2: - version "7.8.3" - resolved "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-7.8.3.tgz" - integrity sha512-T1LgRm5uEVFSEF83vHZJV2z19lHg4yJuZ6gXZZkqVsqv63nlr6zabMH3l4Pc01FQCyfWVrh2GaUeCVy9Po+Aag== - dependencies: - "@csstools/postcss-cascade-layers" "^1.1.1" - "@csstools/postcss-color-function" "^1.1.1" - "@csstools/postcss-font-format-keywords" "^1.0.1" - "@csstools/postcss-hwb-function" "^1.0.2" - "@csstools/postcss-ic-unit" "^1.0.1" - "@csstools/postcss-is-pseudo-class" "^2.0.7" - "@csstools/postcss-nested-calc" "^1.0.0" - "@csstools/postcss-normalize-display-values" "^1.0.1" - "@csstools/postcss-oklab-function" "^1.1.1" - "@csstools/postcss-progressive-custom-properties" "^1.3.0" - "@csstools/postcss-stepped-value-functions" "^1.0.1" - "@csstools/postcss-text-decoration-shorthand" "^1.0.0" - "@csstools/postcss-trigonometric-functions" "^1.0.2" - "@csstools/postcss-unset-value" "^1.0.2" - autoprefixer "^10.4.13" - browserslist "^4.21.4" - css-blank-pseudo "^3.0.3" - css-has-pseudo "^3.0.4" - css-prefers-color-scheme "^6.0.3" - cssdb "^7.1.0" - postcss-attribute-case-insensitive "^5.0.2" - postcss-clamp "^4.1.0" - postcss-color-functional-notation "^4.2.4" - postcss-color-hex-alpha "^8.0.4" - postcss-color-rebeccapurple "^7.1.1" - postcss-custom-media "^8.0.2" - postcss-custom-properties "^12.1.10" - postcss-custom-selectors "^6.0.3" - postcss-dir-pseudo-class "^6.0.5" - postcss-double-position-gradients "^3.1.2" - postcss-env-function "^4.0.6" - postcss-focus-visible "^6.0.4" - postcss-focus-within "^5.0.4" - postcss-font-variant "^5.0.0" - postcss-gap-properties "^3.0.5" - postcss-image-set-function "^4.0.7" - postcss-initial "^4.0.1" - postcss-lab-function "^4.2.1" - postcss-logical "^5.0.4" - postcss-media-minmax "^5.0.0" - postcss-nesting "^10.2.0" - postcss-opacity-percentage "^1.1.2" - postcss-overflow-shorthand "^3.0.4" - postcss-page-break "^3.0.4" - postcss-place "^7.0.5" - postcss-pseudo-class-any-link "^7.1.6" - postcss-replace-overflow-wrap "^4.0.0" - postcss-selector-not "^6.0.1" - postcss-value-parser "^4.2.0" - postcss-preset-env@7.8.0: version "7.8.0" resolved "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-7.8.0.tgz" @@ -9482,6 +9536,61 @@ postcss-preset-env@7.8.0: postcss-selector-not "^6.0.1" postcss-value-parser "^4.2.0" +postcss-preset-env@^7.4.2: + version "7.8.3" + resolved "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-7.8.3.tgz" + integrity sha512-T1LgRm5uEVFSEF83vHZJV2z19lHg4yJuZ6gXZZkqVsqv63nlr6zabMH3l4Pc01FQCyfWVrh2GaUeCVy9Po+Aag== + dependencies: + "@csstools/postcss-cascade-layers" "^1.1.1" + "@csstools/postcss-color-function" "^1.1.1" + "@csstools/postcss-font-format-keywords" "^1.0.1" + "@csstools/postcss-hwb-function" "^1.0.2" + "@csstools/postcss-ic-unit" "^1.0.1" + "@csstools/postcss-is-pseudo-class" "^2.0.7" + "@csstools/postcss-nested-calc" "^1.0.0" + "@csstools/postcss-normalize-display-values" "^1.0.1" + "@csstools/postcss-oklab-function" "^1.1.1" + "@csstools/postcss-progressive-custom-properties" "^1.3.0" + "@csstools/postcss-stepped-value-functions" "^1.0.1" + "@csstools/postcss-text-decoration-shorthand" "^1.0.0" + "@csstools/postcss-trigonometric-functions" "^1.0.2" + "@csstools/postcss-unset-value" "^1.0.2" + autoprefixer "^10.4.13" + browserslist "^4.21.4" + css-blank-pseudo "^3.0.3" + css-has-pseudo "^3.0.4" + css-prefers-color-scheme "^6.0.3" + cssdb "^7.1.0" + postcss-attribute-case-insensitive "^5.0.2" + postcss-clamp "^4.1.0" + postcss-color-functional-notation "^4.2.4" + postcss-color-hex-alpha "^8.0.4" + postcss-color-rebeccapurple "^7.1.1" + postcss-custom-media "^8.0.2" + postcss-custom-properties "^12.1.10" + postcss-custom-selectors "^6.0.3" + postcss-dir-pseudo-class "^6.0.5" + postcss-double-position-gradients "^3.1.2" + postcss-env-function "^4.0.6" + postcss-focus-visible "^6.0.4" + postcss-focus-within "^5.0.4" + postcss-font-variant "^5.0.0" + postcss-gap-properties "^3.0.5" + postcss-image-set-function "^4.0.7" + postcss-initial "^4.0.1" + postcss-lab-function "^4.2.1" + postcss-logical "^5.0.4" + postcss-media-minmax "^5.0.0" + postcss-nesting "^10.2.0" + postcss-opacity-percentage "^1.1.2" + postcss-overflow-shorthand "^3.0.4" + postcss-page-break "^3.0.4" + postcss-place "^7.0.5" + postcss-pseudo-class-any-link "^7.1.6" + postcss-replace-overflow-wrap "^4.0.0" + postcss-selector-not "^6.0.1" + postcss-value-parser "^4.2.0" + postcss-pseudo-class-any-link@^7.1.6: version "7.1.6" resolved "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-7.1.6.tgz" @@ -9521,6 +9630,24 @@ postcss-value-parser@^4.0.0, postcss-value-parser@^4.1.0, postcss-value-parser@^ resolved "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz" integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== +postcss@8.4.16, postcss@^8.4.7: + version "8.4.16" + resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.16.tgz" + integrity sha512-ipHE1XBvKzm5xI7hiHCZJCSugxvsdq2mPnsq5+UF+VHCjiBvtDrlxJfMBToWaP9D5XlgNmcFGqoHmUn0EYEaRQ== + dependencies: + nanoid "^3.3.4" + picocolors "^1.0.0" + source-map-js "^1.0.2" + +postcss@8.4.21, postcss@^8.1, postcss@^8.2.14, postcss@^8.3.11, postcss@^8.3.7, postcss@^8.4.19: + version "8.4.21" + resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.21.tgz" + integrity sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg== + dependencies: + nanoid "^3.3.4" + picocolors "^1.0.0" + source-map-js "^1.0.2" + postcss@^6.0.6: version "6.0.23" resolved "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz" @@ -9530,15 +9657,6 @@ postcss@^6.0.6: source-map "^0.6.1" supports-color "^5.4.0" -"postcss@^7.0.0 || ^8.0.1", postcss@^8, postcss@^8.0.0, postcss@^8.0.3, postcss@^8.1, postcss@^8.1.0, postcss@^8.2, postcss@^8.2.14, postcss@^8.3, postcss@^8.3.11, postcss@^8.3.7, postcss@^8.4, postcss@^8.4.19, postcss@^8.4.6, postcss@8.4.21: - version "8.4.21" - resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.21.tgz" - integrity sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg== - dependencies: - nanoid "^3.3.4" - picocolors "^1.0.0" - source-map-js "^1.0.2" - postcss@^7.0.14: version "7.0.39" resolved "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz" @@ -9547,15 +9665,6 @@ postcss@^7.0.14: picocolors "^0.2.1" source-map "^0.6.1" -postcss@^8.4.7, postcss@8.4.16: - version "8.4.16" - resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.16.tgz" - integrity sha512-ipHE1XBvKzm5xI7hiHCZJCSugxvsdq2mPnsq5+UF+VHCjiBvtDrlxJfMBToWaP9D5XlgNmcFGqoHmUn0EYEaRQ== - dependencies: - nanoid "^3.3.4" - picocolors "^1.0.0" - source-map-js "^1.0.2" - prelude-ls@^1.2.1: version "1.2.1" resolved "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz" @@ -9602,7 +9711,7 @@ prompts@~2.4.2: kleur "^3.0.3" sisteransi "^1.0.5" -prop-types@^15.5, prop-types@^15.6.0, prop-types@^15.6.2, prop-types@^15.7.2, prop-types@^15.8.1: +prop-types@^15.6.0, prop-types@^15.6.2, prop-types@^15.7.2, prop-types@^15.8.1: version "15.8.1" resolved "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz" integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== @@ -9652,12 +9761,17 @@ punycode@^2.1.0, punycode@^2.1.1: resolved "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz" integrity sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA== +q@^1.4.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" + integrity sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw== + qjobs@^1.2.0: version "1.2.0" resolved "https://registry.npmjs.org/qjobs/-/qjobs-1.2.0.tgz" integrity sha512-8YOJEHtxpySA3fFDyCRxA+UUV+fA+rTWnuWvylOK/NCjhY+b4ocCtmu8TtsWb+mYeU+GCHf/S66KZF/AsteKHg== -qs@^6.11.0, qs@6.11.0: +qs@6.11.0, qs@^6.11.0: version "6.11.0" resolved "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz" integrity sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q== @@ -9671,6 +9785,11 @@ qs@~6.10.3: dependencies: side-channel "^1.0.4" +qs@~6.5.2: + version "6.5.3" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.3.tgz#3aeeffc91967ef6e35c0e488ef46fb296ab76aad" + integrity sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA== + querystringify@^2.1.1: version "2.2.0" resolved "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz" @@ -9698,7 +9817,7 @@ range-parser@^1.2.1, range-parser@~1.2.0, range-parser@~1.2.1: resolved "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz" integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== -raw-body@^2.3.2, raw-body@2.5.1: +raw-body@2.5.1, raw-body@^2.3.2: version "2.5.1" resolved "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz" integrity sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig== @@ -9789,7 +9908,7 @@ react-dnd@^10.0.2: dnd-core "^10.0.2" hoist-non-react-statics "^3.3.0" -"react-dom@^0.14.0 || ^15.0.0-0 || ^16.0.0", "react-dom@^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0", "react-dom@^15.3.0 || ^16.0.0-alpha || ^17.0.0 || ^18.0.0-rc", "react-dom@^16.13.1 || ^17.0.0 || ^18.0.0", react-dom@^16.14.0, react-dom@^16.3.2, "react-dom@^16.8.0 || ^17.0.0", react-dom@^16.8.3, "react-dom@^16.8.5 || ^17.0.0 || ^18.0.0", "react-dom@>= 16.3.0", "react-dom@>= 16.8", react-dom@>=16.3.0, react-dom@>=16.6.0, react-dom@>=16.8, react-dom@16.x: +react-dom@^16.14.0: version "16.14.0" resolved "https://registry.npmjs.org/react-dom/-/react-dom-16.14.0.tgz" integrity sha512-1gCeQXDLoIqMgqD3IO2Ah9bnf0w9kzhwN5q4FGnHZ67hBm9yePzB5JJAIQCc8x3pFnNlwFq4RidZggNAAkzWWw== @@ -9828,12 +9947,7 @@ react-image@^4.0.1: resolved "https://registry.npmjs.org/react-image/-/react-image-4.1.0.tgz" integrity sha512-qwPNlelQe9Zy14K2pGWSwoL+vHsAwmJKS6gkotekDgRpcnRuzXNap00GfibD3eEPYu3WCPlyIUUNzcyHOrLHjw== -react-is@^16.13.1: - version "16.13.1" - resolved "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz" - integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== - -react-is@^16.7.0: +react-is@^16.13.1, react-is@^16.7.0: version "16.13.1" resolved "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz" integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== @@ -9917,7 +10031,7 @@ react-window@^1.8.5: "@babel/runtime" "^7.0.0" memoize-one ">=3.1.1 <6" -"react@^0.14.0 || ^15.0.0-0 || ^16.0.0", "react@^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0", "react@^15.3.0 || ^16.0.0-alpha || ^17.0.0 || ^18.0.0-rc", "react@^15.3.0 || 16 || 17 || 18", "react@^15.6 || ^16", react@^16.0.0, react@^16.13, react@^16.13.1, "react@^16.13.1 || ^17.0.0 || ^18.0.0", react@^16.14.0, react@^16.3.0, react@^16.3.2, react@^16.3.x, "react@^16.8.0 || ^17.0.0", "react@^16.8.0 || ^17.0.0 || ^18.0.0", react@^16.8.3, "react@^16.8.3 || ^17 || ^18", "react@^16.8.5 || ^17.0.0 || ^18.0.0", "react@>= 16.3.0", "react@>= 16.8", "react@>= 16.8.0", react@>=0.14, react@>=16.3.0, react@>=16.6.0, react@>=16.8, react@16.x: +react@^16.14.0: version "16.14.0" resolved "https://registry.npmjs.org/react/-/react-16.14.0.tgz" integrity sha512-0X2CImDkJGApiAlcf0ODKIneSwBPhqJawOa5wCtKbu7ZECrmS26NvtSILynQ66cgkT/RJ4LidJOc3bUESwmU8g== @@ -10004,7 +10118,7 @@ redux-thunk@^2.3.0: resolved "https://registry.npmjs.org/redux-thunk/-/redux-thunk-2.4.2.tgz" integrity sha512-+P3TjtnP0k/FEjcBL5FZpoovtvrTNT/UXd4/sluaSyrURlSlhLSzEdfsTBW7WsKB6yPvgd7q/iZPICFjW4o57Q== -"redux@^3.1.0 || ^4.0.0", redux@^4, redux@^4.0.0, redux@^4.0.4, redux@^4.0.5: +redux@^4.0.0, redux@^4.0.4, redux@^4.0.5: version "4.2.1" resolved "https://registry.npmjs.org/redux/-/redux-4.2.1.tgz" integrity sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w== @@ -10028,16 +10142,16 @@ regenerate@^1.4.2: resolved "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz" integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A== -regenerator-runtime@^0.13.11, regenerator-runtime@^0.13.4: - version "0.13.11" - resolved "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz" - integrity sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg== - regenerator-runtime@0.13.9: version "0.13.9" resolved "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz" integrity sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA== +regenerator-runtime@^0.13.11, regenerator-runtime@^0.13.4: + version "0.13.11" + resolved "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz" + integrity sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg== + regenerator-transform@^0.15.1: version "0.15.1" resolved "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.1.tgz" @@ -10085,6 +10199,32 @@ request-progress@^3.0.0: dependencies: throttleit "^1.0.0" +request@^2.87.0: + version "2.88.2" + resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3" + integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw== + dependencies: + aws-sign2 "~0.7.0" + aws4 "^1.8.0" + caseless "~0.12.0" + combined-stream "~1.0.6" + extend "~3.0.2" + forever-agent "~0.6.1" + form-data "~2.3.2" + har-validator "~5.1.3" + http-signature "~1.2.0" + is-typedarray "~1.0.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" + mime-types "~2.1.19" + oauth-sign "~0.9.0" + performance-now "^2.1.0" + qs "~6.5.2" + safe-buffer "^5.1.2" + tough-cookie "~2.5.0" + tunnel-agent "^0.6.0" + uuid "^3.3.2" + require-directory@^2.1.1: version "2.1.1" resolved "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz" @@ -10100,7 +10240,7 @@ requires-port@^1.0.0: resolved "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz" integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ== -reselect@^4.0.0, reselect@>1.0.0: +reselect@^4.0.0: version "4.1.7" resolved "https://registry.npmjs.org/reselect/-/reselect-4.1.7.tgz" integrity sha512-Zu1xbUt3/OPwsXL46hvOOoQrap2azE7ZQbokq61BQfiXvhewsKDwhMeZjTX9sX0nvw1t/U5Audyn1I9P/m9z0A== @@ -10133,15 +10273,6 @@ resolve-url-loader@5.0.0: postcss "^8.2.14" source-map "0.6.1" -resolve@^1.1.7, resolve@^1.14.2, resolve@^1.22.1, resolve@^1.9.0: - version "1.22.2" - resolved "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz" - integrity sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g== - dependencies: - is-core-module "^2.11.0" - path-parse "^1.0.7" - supports-preserve-symlinks-flag "^1.0.0" - resolve@1.22.1: version "1.22.1" resolved "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz" @@ -10151,6 +10282,15 @@ resolve@1.22.1: path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" +resolve@^1.1.7, resolve@^1.14.2, resolve@^1.22.1, resolve@^1.9.0: + version "1.22.2" + resolved "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz" + integrity sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g== + dependencies: + is-core-module "^2.11.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + resp-modifier@6.0.2: version "6.0.2" resolved "https://registry.npmjs.org/resp-modifier/-/resp-modifier-6.0.2.tgz" @@ -10187,9 +10327,9 @@ rfdc@^1.3.0: resolved "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz" integrity sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA== -rimraf@^2.6.3: +rimraf@^2.2.8, rimraf@^2.5.2, rimraf@^2.6.3: version "2.7.1" - resolved "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== dependencies: glob "^7.1.3" @@ -10250,31 +10390,26 @@ rxjs-spy@^8.0.2: rxjs-report-usage "^1.0.4" stacktrace-gps "^3.0.2" -"rxjs@^6.5.3 || ^7.4.0", "rxjs@^6.5.3 || ^7.5.0", rxjs@^7.0.0, rxjs@^7.5.1, rxjs@^7.5.5, rxjs@>=6.5.3: - version "7.8.0" - resolved "https://registry.npmjs.org/rxjs/-/rxjs-7.8.0.tgz" - integrity sha512-F2+gxDshqmIub1KdvZkaEfGDwLNpPvk9Fs6LD/MyQxNgMds/WH9OdDDXOmxUZpME+iSK3rQCctkL0DYyytUqMg== - dependencies: - tslib "^2.1.0" - -rxjs@^6.5.5, rxjs@~6.6.0, rxjs@6.6.7: +rxjs@6.6.7, rxjs@^6.5.5, rxjs@~6.6.0: version "6.6.7" resolved "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz" integrity sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ== dependencies: tslib "^1.9.0" -safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.2, safe-buffer@>=5.1.0, safe-buffer@~5.1.0, safe-buffer@~5.1.1, safe-buffer@5.1.2: +rxjs@^7.5.1, rxjs@^7.5.5: + version "7.8.0" + resolved "https://registry.npmjs.org/rxjs/-/rxjs-7.8.0.tgz" + integrity sha512-F2+gxDshqmIub1KdvZkaEfGDwLNpPvk9Fs6LD/MyQxNgMds/WH9OdDDXOmxUZpME+iSK3rQCctkL0DYyytUqMg== + dependencies: + tslib "^2.1.0" + +safe-buffer@5.1.2, safe-buffer@>=5.1.0, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.2" resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== -safe-buffer@~5.2.0: - version "5.2.1" - resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" - integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== - -safe-buffer@5.2.1: +safe-buffer@5.2.1, safe-buffer@~5.2.0: version "5.2.1" resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== @@ -10288,7 +10423,7 @@ safe-regex-test@^1.0.0: get-intrinsic "^1.1.3" is-regex "^1.1.4" -safer-buffer@^2.0.2, safer-buffer@^2.1.0, "safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0", safer-buffer@~2.1.0: +"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: version "2.1.2" resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== @@ -10305,14 +10440,6 @@ sanitize-html@^2.7.2: parse-srcset "^1.0.2" postcss "^8.3.11" -sass-loader@^12.6.0: - version "12.6.0" - resolved "https://registry.npmjs.org/sass-loader/-/sass-loader-12.6.0.tgz" - integrity sha512-oLTaH0YCtX4cfnJZxKSLAyglED0naiYfNG1iXfU5w1LNZ+ukoA5DtyDIN5zmKVZwYNJP4KRc5Y3hkWga+7tYfA== - dependencies: - klona "^2.0.4" - neo-async "^2.6.2" - sass-loader@13.0.2: version "13.0.2" resolved "https://registry.npmjs.org/sass-loader/-/sass-loader-13.0.2.tgz" @@ -10329,6 +10456,14 @@ sass-loader@13.2.0: klona "^2.0.4" neo-async "^2.6.2" +sass-loader@^12.6.0: + version "12.6.0" + resolved "https://registry.npmjs.org/sass-loader/-/sass-loader-12.6.0.tgz" + integrity sha512-oLTaH0YCtX4cfnJZxKSLAyglED0naiYfNG1iXfU5w1LNZ+ukoA5DtyDIN5zmKVZwYNJP4KRc5Y3hkWga+7tYfA== + dependencies: + klona "^2.0.4" + neo-async "^2.6.2" + sass-resources-loader@^2.1.1: version "2.2.5" resolved "https://registry.npmjs.org/sass-resources-loader/-/sass-resources-loader-2.2.5.tgz" @@ -10339,13 +10474,6 @@ sass-resources-loader@^2.1.1: glob "^7.1.6" loader-utils "^2.0.0" -sass@^1.3.0, sass@~1.33.0: - version "1.33.0" - resolved "https://registry.npmjs.org/sass/-/sass-1.33.0.tgz" - integrity sha512-9v0MUXnSi62FtfjqcwZ+b8B9FIxdwFEb3FPUkjEPXWd0b5KcnPGSp2XF9WrzcH1ZxedfgJVTdA3A1j4eEj53xg== - dependencies: - chokidar ">=3.0.0 <4.0.0" - sass@1.54.4: version "1.54.4" resolved "https://registry.npmjs.org/sass/-/sass-1.54.4.tgz" @@ -10364,9 +10492,16 @@ sass@1.58.1: immutable "^4.0.0" source-map-js ">=0.6.2 <2.0.0" -sax@^1.2.4, sax@~1.2.4: +sass@~1.33.0: + version "1.33.0" + resolved "https://registry.npmjs.org/sass/-/sass-1.33.0.tgz" + integrity sha512-9v0MUXnSi62FtfjqcwZ+b8B9FIxdwFEb3FPUkjEPXWd0b5KcnPGSp2XF9WrzcH1ZxedfgJVTdA3A1j4eEj53xg== + dependencies: + chokidar ">=3.0.0 <4.0.0" + +sax@>=0.6.0, sax@^1.2.4, sax@~1.2.4: version "1.2.4" - resolved "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz" + resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== saxes@^5.0.1: @@ -10400,25 +10535,7 @@ schema-utils@^2.6.5: ajv "^6.12.4" ajv-keywords "^3.5.2" -schema-utils@^3.0.0: - version "3.1.1" - resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz" - integrity sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw== - dependencies: - "@types/json-schema" "^7.0.8" - ajv "^6.12.5" - ajv-keywords "^3.5.2" - -schema-utils@^3.1.0: - version "3.1.1" - resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz" - integrity sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw== - dependencies: - "@types/json-schema" "^7.0.8" - ajv "^6.12.5" - ajv-keywords "^3.5.2" - -schema-utils@^3.1.1: +schema-utils@^3.0.0, schema-utils@^3.1.0, schema-utils@^3.1.1: version "3.1.1" resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz" integrity sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw== @@ -10449,14 +10566,23 @@ selfsigned@^2.0.1, selfsigned@^2.1.1: dependencies: node-forge "^1" -semver@^5.6.0: - version "5.7.1" - resolved "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz" - integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== +semver@7.3.7: + version "7.3.7" + resolved "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz" + integrity sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g== + dependencies: + lru-cache "^6.0.0" -semver@^5.7.1: +semver@7.3.8, semver@^7.3.8: + version "7.3.8" + resolved "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz" + 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.npmjs.org/semver/-/semver-5.7.1.tgz" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== semver@^6.0.0, semver@^6.1.1, semver@^6.1.2, semver@^6.3.0: @@ -10464,60 +10590,18 @@ semver@^6.0.0, semver@^6.1.1, semver@^6.1.2, semver@^6.3.0: resolved "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== -semver@^7.0.0: +semver@^7.0.0, semver@^7.1.1, semver@^7.3.2, semver@^7.3.4, semver@^7.3.5, 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== dependencies: lru-cache "^6.0.0" -semver@^7.1.1: - version "7.4.0" - resolved "https://registry.npmjs.org/semver/-/semver-7.4.0.tgz" - integrity sha512-RgOxM8Mw+7Zus0+zcLEUn8+JfoLpj/huFTItQy2hsM4khuC1HYRDp0cU482Ewn/Fcy6bCjufD8vAj7voC66KQw== - dependencies: - lru-cache "^6.0.0" - -semver@^7.3.2: - version "7.4.0" - resolved "https://registry.npmjs.org/semver/-/semver-7.4.0.tgz" - integrity sha512-RgOxM8Mw+7Zus0+zcLEUn8+JfoLpj/huFTItQy2hsM4khuC1HYRDp0cU482Ewn/Fcy6bCjufD8vAj7voC66KQw== - dependencies: - lru-cache "^6.0.0" - -semver@^7.3.4: - version "7.4.0" - resolved "https://registry.npmjs.org/semver/-/semver-7.4.0.tgz" - integrity sha512-RgOxM8Mw+7Zus0+zcLEUn8+JfoLpj/huFTItQy2hsM4khuC1HYRDp0cU482Ewn/Fcy6bCjufD8vAj7voC66KQw== - dependencies: - lru-cache "^6.0.0" - -semver@^7.3.5, 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== - dependencies: - lru-cache "^6.0.0" - -semver@^7.3.8, semver@7.3.8: - version "7.3.8" - resolved "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz" - integrity sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A== - 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" integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A== -semver@7.3.7: - version "7.3.7" - resolved "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz" - integrity sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g== - dependencies: - lru-cache "^6.0.0" - send@0.16.2: version "0.16.2" resolved "https://registry.npmjs.org/send/-/send-0.16.2.tgz" @@ -10570,7 +10654,7 @@ serialize-javascript@^6.0.0, serialize-javascript@^6.0.1: dependencies: randombytes "^2.1.0" -serve-index@^1.9.1, serve-index@1.9.1: +serve-index@1.9.1, serve-index@^1.9.1: version "1.9.1" resolved "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz" integrity sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw== @@ -10583,16 +10667,6 @@ serve-index@^1.9.1, serve-index@1.9.1: mime-types "~2.1.17" parseurl "~1.3.2" -serve-static@^1.14.1, serve-static@1.15.0: - version "1.15.0" - resolved "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz" - integrity sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g== - dependencies: - encodeurl "~1.0.2" - escape-html "~1.0.3" - parseurl "~1.3.3" - send "0.18.0" - serve-static@1.13.2: version "1.13.2" resolved "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz" @@ -10603,6 +10677,16 @@ serve-static@1.13.2: parseurl "~1.3.2" send "0.16.2" +serve-static@1.15.0, serve-static@^1.14.1: + version "1.15.0" + resolved "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz" + integrity sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g== + dependencies: + encodeurl "~1.0.2" + escape-html "~1.0.3" + parseurl "~1.3.3" + send "0.18.0" + server-destroy@1.0.1: version "1.0.1" resolved "https://registry.npmjs.org/server-destroy/-/server-destroy-1.0.1.tgz" @@ -10797,7 +10881,7 @@ socks@^2.6.2: ip "^2.0.0" smart-buffer "^4.2.0" -sortablejs@>=1.7.0, sortablejs@1.13.0: +sortablejs@1.13.0: version "1.13.0" resolved "https://registry.npmjs.org/sortablejs/-/sortablejs-1.13.0.tgz" integrity sha512-RBJirPY0spWCrU5yCmWM1eFs/XgX2J5c6b275/YyxFRgnzPhKl/TDeU2hNR8Dt7ITq66NRPM4UlOt+e5O4CFHg== @@ -10807,7 +10891,7 @@ source-list-map@^2.0.0: resolved "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz" integrity sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw== -source-map-js@^1.0.2, "source-map-js@>=0.6.2 <2.0.0": +"source-map-js@>=0.6.2 <2.0.0", source-map-js@^1.0.2: version "1.0.2" resolved "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz" integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== @@ -10830,7 +10914,7 @@ source-map-loader@4.0.1: iconv-lite "^0.6.3" source-map-js "^1.0.2" -source-map-support@^0.5.17, source-map-support@^0.5.5, source-map-support@~0.5.20, source-map-support@0.5.21: +source-map-support@0.5.21, source-map-support@^0.5.17, source-map-support@^0.5.5, source-map-support@~0.5.20: version "0.5.21" resolved "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz" integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== @@ -10838,27 +10922,22 @@ source-map-support@^0.5.17, source-map-support@^0.5.5, source-map-support@~0.5.2 buffer-from "^1.0.0" source-map "^0.6.0" -source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1, source-map@0.6.1: - version "0.6.1" - resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" - integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== - -source-map@^0.7.3: - version "0.7.4" - resolved "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz" - integrity sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA== - source-map@0.5.6: version "0.5.6" resolved "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz" integrity sha512-MjZkVp0NHr5+TPihLcadqnlVoGIoWo4IBHptutGh9wI3ttUYvCG26HkSuDi+K6lsZ25syXJXcctwgyVCt//xqA== +source-map@0.6.1, source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1: + version "0.6.1" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + source-map@0.7.3: version "0.7.3" resolved "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz" integrity sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ== -source-map@0.7.4: +source-map@0.7.4, source-map@^0.7.3: version "0.7.4" resolved "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz" integrity sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA== @@ -10931,9 +11010,9 @@ sprintf-js@~1.0.2: resolved "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz" integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== -sshpk@^1.14.1: +sshpk@^1.14.1, sshpk@^1.7.0: version "1.17.0" - resolved "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz" + resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.17.0.tgz#578082d92d4fe612b13007496e543fa0fbcbe4c5" integrity sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ== dependencies: asn1 "~0.2.3" @@ -10980,6 +11059,11 @@ stacktrace-gps@^3.0.2: source-map "0.5.6" stackframe "^1.3.4" +statuses@2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz" + integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== + "statuses@>= 1.4.0 < 2", statuses@~1.4.0: version "1.4.0" resolved "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz" @@ -10995,11 +11079,6 @@ statuses@~1.5.0: resolved "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz" integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA== -statuses@2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz" - integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== - stop-iteration-iterator@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz" @@ -11024,20 +11103,6 @@ streamroller@^3.1.5: debug "^4.3.4" fs-extra "^8.1.0" -string_decoder@^1.1.1: - version "1.3.0" - resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz" - integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== - dependencies: - safe-buffer "~5.2.0" - -string_decoder@~1.1.1: - version "1.1.1" - resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz" - integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== - dependencies: - safe-buffer "~5.1.0" - "string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: version "4.2.3" resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" @@ -11074,6 +11139,27 @@ string.prototype.trimstart@^1.0.6: define-properties "^1.1.4" es-abstract "^1.20.4" +string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + +strip-ansi@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" + integrity sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg== + dependencies: + ansi-regex "^2.0.0" + strip-ansi@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz" @@ -11098,7 +11184,7 @@ strip-final-newline@^2.0.0: resolved "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz" integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== -strip-json-comments@^3.1.0, strip-json-comments@^3.1.1, strip-json-comments@3.1.1: +strip-json-comments@3.1.1, strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: version "3.1.1" resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== @@ -11112,7 +11198,7 @@ stylus-loader@7.0.0: klona "^2.0.5" normalize-path "^3.0.0" -stylus@>=0.52.4, stylus@0.59.0: +stylus@0.59.0: version "0.59.0" resolved "https://registry.npmjs.org/stylus/-/stylus-0.59.0.tgz" integrity sha512-lQ9w/XIOH5ZHVNuNbWW8D822r+/wBSO/d6XvtyHLF7LW4KaCIDeVbvn5DF8fGCJAUCwVhVi/h6J0NUcnylUEjg== @@ -11123,6 +11209,11 @@ stylus@>=0.52.4, stylus@0.59.0: sax "~1.2.4" source-map "^0.7.3" +supports-color@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" + integrity sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g== + supports-color@^5.3.0, supports-color@^5.4.0, supports-color@^5.5.0: version "5.5.0" resolved "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz" @@ -11137,14 +11228,7 @@ supports-color@^7.1.0: dependencies: has-flag "^4.0.0" -supports-color@^8.0.0: - version "8.1.1" - resolved "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz" - integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== - dependencies: - has-flag "^4.0.0" - -supports-color@^8.1.1: +supports-color@^8.0.0, supports-color@^8.1.1: version "8.1.1" resolved "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz" integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== @@ -11194,16 +11278,6 @@ terser-webpack-plugin@^5.1.3: serialize-javascript "^6.0.1" terser "^5.16.5" -terser@^5.16.5: - version "5.16.9" - resolved "https://registry.npmjs.org/terser/-/terser-5.16.9.tgz" - integrity sha512-HPa/FdTB9XGI2H1/keLFZHxl6WNvAI4YalHGtDQTlMnJcoqSab1UwL4l1hGEhs6/GmLHBZIg/YgB++jcbzoOEg== - dependencies: - "@jridgewell/source-map" "^0.3.2" - acorn "^8.5.0" - commander "^2.20.0" - source-map-support "~0.5.20" - terser@5.14.2: version "5.14.2" resolved "https://registry.npmjs.org/terser/-/terser-5.14.2.tgz" @@ -11224,6 +11298,16 @@ terser@5.16.3: commander "^2.20.0" source-map-support "~0.5.20" +terser@^5.16.5: + version "5.16.9" + resolved "https://registry.npmjs.org/terser/-/terser-5.16.9.tgz" + integrity sha512-HPa/FdTB9XGI2H1/keLFZHxl6WNvAI4YalHGtDQTlMnJcoqSab1UwL4l1hGEhs6/GmLHBZIg/YgB++jcbzoOEg== + dependencies: + "@jridgewell/source-map" "^0.3.2" + acorn "^8.5.0" + commander "^2.20.0" + source-map-support "~0.5.20" + test-exclude@^6.0.0: version "6.0.0" resolved "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz" @@ -11233,7 +11317,7 @@ test-exclude@^6.0.0: glob "^7.1.4" minimatch "^3.0.4" -text-table@^0.2.0, text-table@0.2.0: +text-table@0.2.0, text-table@^0.2.0: version "0.2.0" resolved "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz" integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== @@ -11268,6 +11352,13 @@ tiny-warning@^1.0.2: resolved "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz" integrity sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA== +tmp@0.2.1, tmp@^0.2.1, tmp@~0.2.1: + version "0.2.1" + resolved "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz" + integrity sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ== + dependencies: + rimraf "^3.0.0" + tmp@^0.0.33: version "0.0.33" resolved "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz" @@ -11275,27 +11366,6 @@ tmp@^0.0.33: dependencies: os-tmpdir "~1.0.2" -tmp@^0.2.1: - version "0.2.1" - resolved "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz" - integrity sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ== - dependencies: - rimraf "^3.0.0" - -tmp@~0.2.1: - version "0.2.1" - resolved "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz" - integrity sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ== - dependencies: - rimraf "^3.0.0" - -tmp@0.2.1: - version "0.2.1" - resolved "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz" - integrity sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ== - dependencies: - rimraf "^3.0.0" - to-fast-properties@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz" @@ -11367,17 +11437,17 @@ tr46@~0.0.3: resolved "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz" integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== -tree-kill@^1.2.2, tree-kill@1.2.2: +tree-kill@1.2.2, tree-kill@^1.2.2: version "1.2.2" resolved "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz" integrity sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A== -ts-node@^10.0.0: - version "10.9.1" - resolved "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz" - integrity sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw== +ts-node@10.2.1, ts-node@^10.0.0: + version "10.2.1" + resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.2.1.tgz#4cc93bea0a7aba2179497e65bb08ddfc198b3ab5" + integrity sha512-hCnyOyuGmD5wHleOQX6NIjJtYVIO8bPP8F2acWkB4W06wdlkgyvJtubO/I9NkI88hCFECbsEgoLc0VNkYmcSfw== dependencies: - "@cspotcode/source-map-support" "^0.8.0" + "@cspotcode/source-map-support" "0.6.1" "@tsconfig/node10" "^1.0.7" "@tsconfig/node12" "^1.0.7" "@tsconfig/node14" "^1.0.0" @@ -11388,7 +11458,6 @@ ts-node@^10.0.0: create-require "^1.1.0" diff "^4.0.1" make-error "^1.1.1" - v8-compile-cache-lib "^3.0.1" yn "3.1.1" ts-node@^8.10.2: @@ -11412,21 +11481,6 @@ tsconfig-paths@^3.14.1, tsconfig-paths@^3.9.0: minimist "^1.2.6" strip-bom "^3.0.0" -tslib@^1.8.1: - version "1.14.1" - resolved "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz" - integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== - -tslib@^1.9.0: - version "1.14.1" - resolved "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz" - integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== - -tslib@^2.0.0, tslib@^2.0.3, tslib@^2.1.0, tslib@^2.2.0, tslib@^2.3.0, tslib@^2.3.1, tslib@2.5.0: - version "2.5.0" - resolved "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz" - integrity sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg== - tslib@2.3.1: version "2.3.1" resolved "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz" @@ -11437,6 +11491,16 @@ tslib@2.4.0: resolved "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz" integrity sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ== +tslib@2.5.0, tslib@^2.0.0, tslib@^2.0.3, tslib@^2.1.0, tslib@^2.2.0, tslib@^2.3.0, tslib@^2.3.1: + version "2.5.0" + resolved "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz" + integrity sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg== + +tslib@^1.8.1, tslib@^1.9.0: + version "1.14.1" + resolved "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz" + integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== + tsutils@^3.21.0: version "3.21.0" resolved "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz" @@ -11529,16 +11593,16 @@ typescript-tuple@^2.2.1: dependencies: typescript-compare "^0.0.2" -typescript@*, "typescript@^3.7.5 || ^4.0.0 || ^5.0.0", typescript@>=2.7, "typescript@>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta", "typescript@>=3.2.x || >= 4.x", typescript@>=3.7.5, "typescript@>=4.6.2 <4.9", "typescript@>=4.8.2 <5.0", typescript@~4.8.4: - version "4.8.4" - resolved "https://registry.npmjs.org/typescript/-/typescript-4.8.4.tgz" - integrity sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ== - typescript@^2.5.0: version "2.9.2" resolved "https://registry.npmjs.org/typescript/-/typescript-2.9.2.tgz" integrity sha512-Gr4p6nFNaoufRIY4NMdpQRNmgxVIGMs4Fcu/ujdYk3nAZqk7supzBE9idmvfZIlH/Cuj//dvi+019qEue9lV0w== +typescript@~4.8.4: + version "4.8.4" + resolved "https://registry.npmjs.org/typescript/-/typescript-4.8.4.tgz" + integrity sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ== + ua-parser-js@^0.7.30: version "0.7.35" resolved "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.35.tgz" @@ -11654,7 +11718,7 @@ universalify@^2.0.0: resolved "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz" integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== -unpipe@~1.0.0, unpipe@1.0.0: +unpipe@1.0.0, unpipe@~1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz" integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== @@ -11702,12 +11766,7 @@ utils-merge@1.0.1: resolved "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz" integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== -uuid@^3.2.1: - version "3.4.0" - resolved "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz" - integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== - -uuid@^3.3.2: +uuid@^3.2.1, uuid@^3.3.2: version "3.4.0" resolved "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz" integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== @@ -11717,11 +11776,6 @@ uuid@^8.1.0, uuid@^8.3.2: resolved "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz" integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== -v8-compile-cache-lib@^3.0.1: - version "3.0.1" - resolved "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz" - integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== - valid-data-url@^3.0.0: version "3.0.1" resolved "https://registry.npmjs.org/valid-data-url/-/valid-data-url-3.0.1.tgz" @@ -11756,16 +11810,16 @@ verror@1.10.0: core-util-is "1.0.2" extsprintf "^1.2.0" -void-elements@^2.0.0: - version "2.0.1" - resolved "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz" - integrity sha512-qZKX4RnBzH2ugr8Lxa7x+0V6XD9Sb/ouARtiasEQCHB1EVU4NXtmHsDDrx1dO4ne5fc3J6EW05BP1Dl0z0iung== - void-elements@3.1.0: version "3.1.0" resolved "https://registry.npmjs.org/void-elements/-/void-elements-3.1.0.tgz" integrity sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w== +void-elements@^2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz" + integrity sha512-qZKX4RnBzH2ugr8Lxa7x+0V6XD9Sb/ouARtiasEQCHB1EVU4NXtmHsDDrx1dO4ne5fc3J6EW05BP1Dl0z0iung== + w3c-hr-time@^1.0.2: version "1.0.2" resolved "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz" @@ -11821,6 +11875,23 @@ web-resource-inliner@^6.0.1: node-fetch "^2.6.0" valid-data-url "^3.0.0" +webdriver-manager@^12.1.8: + version "12.1.9" + resolved "https://registry.yarnpkg.com/webdriver-manager/-/webdriver-manager-12.1.9.tgz#8d83543b92711b7217b39fef4cda958a4703d2df" + integrity sha512-Yl113uKm8z4m/KMUVWHq1Sjtla2uxEBtx2Ue3AmIlnlPAKloDn/Lvmy6pqWCUersVISpdMeVpAaGbNnvMuT2LQ== + dependencies: + adm-zip "^0.5.2" + chalk "^1.1.1" + del "^2.2.0" + glob "^7.0.3" + ini "^1.3.4" + minimist "^1.2.0" + q "^1.4.1" + request "^2.87.0" + rimraf "^2.5.2" + semver "^5.3.0" + xml2js "^0.4.17" + webfontloader@1.6.28: version "1.6.28" resolved "https://registry.npmjs.org/webfontloader/-/webfontloader-1.6.28.tgz" @@ -11862,7 +11933,7 @@ webpack-bundle-analyzer@^4.4.0: sirv "^1.0.7" ws "^7.3.1" -webpack-cli@^4.2.0, webpack-cli@4.x.x: +webpack-cli@^4.2.0: version "4.10.0" resolved "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.10.0.tgz" integrity sha512-NLhDfH/h4O6UOy+0LSso42xvYypClINuMNBVVzX4vX98TmTaTUxwRbXdhucbFMd2qLaCTcLq/PdYrvi8onw90w== @@ -11880,7 +11951,7 @@ webpack-cli@^4.2.0, webpack-cli@4.x.x: rechoir "^0.7.0" webpack-merge "^5.7.3" -webpack-dev-middleware@^5.3.1, webpack-dev-middleware@5.3.3: +webpack-dev-middleware@5.3.3, webpack-dev-middleware@^5.3.1: version "5.3.3" resolved "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz" integrity sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA== @@ -11902,42 +11973,6 @@ webpack-dev-middleware@6.0.1: range-parser "^1.2.1" schema-utils "^4.0.0" -webpack-dev-server@^4.0.0, webpack-dev-server@^4.5.0: - version "4.13.2" - resolved "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.13.2.tgz" - integrity sha512-5i6TrGBRxG4vnfDpB6qSQGfnB6skGBXNL5/542w2uRGLimX6qeE5BQMLrzIC3JYV/xlGOv+s+hTleI9AZKUQNw== - dependencies: - "@types/bonjour" "^3.5.9" - "@types/connect-history-api-fallback" "^1.3.5" - "@types/express" "^4.17.13" - "@types/serve-index" "^1.9.1" - "@types/serve-static" "^1.13.10" - "@types/sockjs" "^0.3.33" - "@types/ws" "^8.5.1" - ansi-html-community "^0.0.8" - bonjour-service "^1.0.11" - chokidar "^3.5.3" - colorette "^2.0.10" - compression "^1.7.4" - connect-history-api-fallback "^2.0.0" - default-gateway "^6.0.3" - express "^4.17.3" - graceful-fs "^4.2.6" - html-entities "^2.3.2" - http-proxy-middleware "^2.0.3" - ipaddr.js "^2.0.1" - launch-editor "^2.6.0" - open "^8.0.9" - p-retry "^4.5.0" - rimraf "^3.0.2" - schema-utils "^4.0.0" - selfsigned "^2.1.1" - serve-index "^1.9.1" - sockjs "^0.3.24" - spdy "^4.0.2" - webpack-dev-middleware "^5.3.1" - ws "^8.13.0" - webpack-dev-server@4.11.0: version "4.11.0" resolved "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.11.0.tgz" @@ -12008,7 +12043,43 @@ webpack-dev-server@4.11.1: webpack-dev-middleware "^5.3.1" ws "^8.4.2" -webpack-merge@^5.7.3, webpack-merge@5.8.0: +webpack-dev-server@^4.5.0: + version "4.13.2" + resolved "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.13.2.tgz" + integrity sha512-5i6TrGBRxG4vnfDpB6qSQGfnB6skGBXNL5/542w2uRGLimX6qeE5BQMLrzIC3JYV/xlGOv+s+hTleI9AZKUQNw== + dependencies: + "@types/bonjour" "^3.5.9" + "@types/connect-history-api-fallback" "^1.3.5" + "@types/express" "^4.17.13" + "@types/serve-index" "^1.9.1" + "@types/serve-static" "^1.13.10" + "@types/sockjs" "^0.3.33" + "@types/ws" "^8.5.1" + ansi-html-community "^0.0.8" + bonjour-service "^1.0.11" + chokidar "^3.5.3" + colorette "^2.0.10" + compression "^1.7.4" + connect-history-api-fallback "^2.0.0" + default-gateway "^6.0.3" + express "^4.17.3" + graceful-fs "^4.2.6" + html-entities "^2.3.2" + http-proxy-middleware "^2.0.3" + ipaddr.js "^2.0.1" + launch-editor "^2.6.0" + open "^8.0.9" + p-retry "^4.5.0" + rimraf "^3.0.2" + schema-utils "^4.0.0" + selfsigned "^2.1.1" + serve-index "^1.9.1" + sockjs "^0.3.24" + spdy "^4.0.2" + webpack-dev-middleware "^5.3.1" + ws "^8.13.0" + +webpack-merge@5.8.0, webpack-merge@^5.7.3: version "5.8.0" resolved "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz" integrity sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q== @@ -12036,37 +12107,7 @@ webpack-subresource-integrity@5.1.0: dependencies: typed-assert "^1.0.8" -"webpack@^4.0.0 || ^5.0.0", "webpack@^4.37.0 || ^5.0.0", webpack@^5.0.0, webpack@^5.1.0, webpack@^5.12.0, webpack@^5.30.0, webpack@^5.54.0, webpack@^5.72.1, webpack@^5.76.0, webpack@>=5, "webpack@4.x.x || 5.x.x": - version "5.78.0" - resolved "https://registry.npmjs.org/webpack/-/webpack-5.78.0.tgz" - integrity sha512-gT5DP72KInmE/3azEaQrISjTvLYlSM0j1Ezhht/KLVkrqtv10JoP/RXhwmX/frrutOPuSq3o5Vq0ehR/4Vmd1g== - dependencies: - "@types/eslint-scope" "^3.7.3" - "@types/estree" "^0.0.51" - "@webassemblyjs/ast" "1.11.1" - "@webassemblyjs/wasm-edit" "1.11.1" - "@webassemblyjs/wasm-parser" "1.11.1" - acorn "^8.7.1" - acorn-import-assertions "^1.7.6" - browserslist "^4.14.5" - chrome-trace-event "^1.0.2" - enhanced-resolve "^5.10.0" - es-module-lexer "^0.9.0" - eslint-scope "5.1.1" - events "^3.2.0" - glob-to-regexp "^0.4.1" - graceful-fs "^4.2.9" - json-parse-even-better-errors "^2.3.1" - loader-runner "^4.2.0" - mime-types "^2.1.27" - neo-async "^2.6.2" - schema-utils "^3.1.0" - tapable "^2.1.1" - terser-webpack-plugin "^5.1.3" - watchpack "^2.4.0" - webpack-sources "^3.2.3" - -webpack@>=2, webpack@5.76.1: +webpack@5.76.1: version "5.76.1" resolved "https://registry.npmjs.org/webpack/-/webpack-5.76.1.tgz" integrity sha512-4+YIK4Abzv8172/SGqObnUjaIHjLEuUasz9EwQj/9xmPPkYJy2Mh03Q/lJfSD3YLzbxy5FeTq5Uw0323Oh6SJQ== @@ -12096,7 +12137,37 @@ webpack@>=2, webpack@5.76.1: watchpack "^2.4.0" webpack-sources "^3.2.3" -websocket-driver@^0.7.4, websocket-driver@>=0.5.1: +webpack@^5.76.0: + version "5.78.0" + resolved "https://registry.npmjs.org/webpack/-/webpack-5.78.0.tgz" + integrity sha512-gT5DP72KInmE/3azEaQrISjTvLYlSM0j1Ezhht/KLVkrqtv10JoP/RXhwmX/frrutOPuSq3o5Vq0ehR/4Vmd1g== + dependencies: + "@types/eslint-scope" "^3.7.3" + "@types/estree" "^0.0.51" + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/wasm-edit" "1.11.1" + "@webassemblyjs/wasm-parser" "1.11.1" + acorn "^8.7.1" + acorn-import-assertions "^1.7.6" + browserslist "^4.14.5" + chrome-trace-event "^1.0.2" + enhanced-resolve "^5.10.0" + es-module-lexer "^0.9.0" + eslint-scope "5.1.1" + events "^3.2.0" + glob-to-regexp "^0.4.1" + graceful-fs "^4.2.9" + json-parse-even-better-errors "^2.3.1" + loader-runner "^4.2.0" + mime-types "^2.1.27" + neo-async "^2.6.2" + schema-utils "^3.1.0" + tapable "^2.1.1" + terser-webpack-plugin "^5.1.3" + watchpack "^2.4.0" + webpack-sources "^3.2.3" + +websocket-driver@>=0.5.1, websocket-driver@^0.7.4: version "0.7.4" resolved "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz" integrity sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg== @@ -12258,12 +12329,7 @@ wrappy@1: resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== -ws@^7.3.1: - version "7.5.9" - resolved "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz" - integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== - -ws@^7.4.6: +ws@^7.3.1, ws@^7.4.6: version "7.5.9" resolved "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz" integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== @@ -12293,6 +12359,19 @@ xml-name-validator@^4.0.0: resolved "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz" integrity sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw== +xml2js@^0.4.17: + version "0.4.23" + resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.4.23.tgz#a0c69516752421eb2ac758ee4d4ccf58843eac66" + integrity sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug== + dependencies: + sax ">=0.6.0" + xmlbuilder "~11.0.0" + +xmlbuilder@~11.0.0: + version "11.0.1" + resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-11.0.1.tgz#be9bae1c8a046e76b31127726347d0ad7002beb3" + integrity sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA== + xmlchars@^2.2.0: version "2.2.0" resolved "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz" @@ -12338,32 +12417,6 @@ yargs-parser@^21.1.1: resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz" integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== -yargs@^16.1.1: - version "16.2.0" - resolved "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz" - integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== - dependencies: - cliui "^7.0.2" - escalade "^3.1.1" - get-caller-file "^2.0.5" - require-directory "^2.1.1" - string-width "^4.2.0" - y18n "^5.0.5" - yargs-parser "^20.2.2" - -yargs@^17.2.1, yargs@^17.3.1: - version "17.7.1" - resolved "https://registry.npmjs.org/yargs/-/yargs-17.7.1.tgz" - integrity sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw== - dependencies: - cliui "^8.0.1" - escalade "^3.1.1" - get-caller-file "^2.0.5" - require-directory "^2.1.1" - string-width "^4.2.3" - y18n "^5.0.5" - yargs-parser "^21.1.1" - yargs@17.1.1: version "17.1.1" resolved "https://registry.npmjs.org/yargs/-/yargs-17.1.1.tgz" @@ -12390,6 +12443,32 @@ yargs@17.6.2: y18n "^5.0.5" yargs-parser "^21.1.1" +yargs@^16.1.1: + version "16.2.0" + resolved "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz" + integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== + dependencies: + cliui "^7.0.2" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.0" + y18n "^5.0.5" + yargs-parser "^20.2.2" + +yargs@^17.2.1, yargs@^17.3.1: + version "17.7.1" + resolved "https://registry.npmjs.org/yargs/-/yargs-17.7.1.tgz" + integrity sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw== + dependencies: + cliui "^8.0.1" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.3" + y18n "^5.0.5" + yargs-parser "^21.1.1" + yauzl@^2.10.0: version "2.10.0" resolved "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz" @@ -12408,7 +12487,7 @@ yocto-queue@^0.1.0: resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz" integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== -"zone.js@~0.11.4 || ~0.12.0", "zone.js@~0.11.4 || ~0.12.0 || ~0.13.0", zone.js@~0.11.5: +zone.js@~0.11.5: version "0.11.8" resolved "https://registry.npmjs.org/zone.js/-/zone.js-0.11.8.tgz" integrity sha512-82bctBg2hKcEJ21humWIkXRlLBBmrc3nN7DFh5LGGhcyycO2S7FN8NmdvlcKaGFDNVL4/9kFLmwmInTavdJERA== From 5761698a0db5207adbf8fd2e86be718f64743a3a Mon Sep 17 00:00:00 2001 From: Kristof De Langhe Date: Wed, 12 Apr 2023 12:25:10 +0200 Subject: [PATCH 084/409] 101108: Automatic ng update @angular-devkit/build-angular@15 --- package.json | 2 +- yarn.lock | 2771 +++++++++++++++++++------------------------------- 2 files changed, 1031 insertions(+), 1742 deletions(-) diff --git a/package.json b/package.json index dbbf30cd26..b1b6060eaf 100644 --- a/package.json +++ b/package.json @@ -134,7 +134,7 @@ "zone.js": "~0.11.5" }, "devDependencies": { - "@angular-builders/custom-webpack": "~14.1.0", + "@angular-builders/custom-webpack": "~15.0.0", "@angular-devkit/build-angular": "^15.2.5", "@angular-eslint/builder": "15.2.1", "@angular-eslint/eslint-plugin": "15.2.1", diff --git a/yarn.lock b/yarn.lock index ac0b11b001..70d5b7f49d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,19 +2,6 @@ # yarn lockfile v1 -"@adobe/css-tools@^4.0.1": - version "4.2.0" - resolved "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.2.0.tgz" - integrity sha512-E09FiIft46CmH5Qnjb0wsW54/YQd69LsxeKUOWawmws1XWvyFGURnAChH0mlr7YPFR1ofwvUQfcL0J3lMxXqPA== - -"@ampproject/remapping@2.2.0": - version "2.2.0" - resolved "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz" - integrity sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w== - dependencies: - "@jridgewell/gen-mapping" "^0.1.0" - "@jridgewell/trace-mapping" "^0.3.9" - "@ampproject/remapping@^2.1.0": version "2.2.1" resolved "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz" @@ -23,35 +10,27 @@ "@jridgewell/gen-mapping" "^0.3.0" "@jridgewell/trace-mapping" "^0.3.9" -"@angular-builders/custom-webpack@~14.1.0": - version "14.1.0" - resolved "https://registry.npmjs.org/@angular-builders/custom-webpack/-/custom-webpack-14.1.0.tgz" - integrity sha512-FLGDrBOg04cYvzCudeb15LWY2v91dtJ5+AfmP0aS/0T0D0AYmY4uM3FxZeh4jJcWETLvnHVFBCjan6y2Ct9J3A== +"@ampproject/remapping@2.2.0": + version "2.2.0" + resolved "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz" + integrity sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w== dependencies: - "@angular-devkit/architect" ">=0.1400.0 < 0.1500.0" - "@angular-devkit/build-angular" "^14.0.0" - "@angular-devkit/core" "^14.0.0" + "@jridgewell/gen-mapping" "^0.1.0" + "@jridgewell/trace-mapping" "^0.3.9" + +"@angular-builders/custom-webpack@~15.0.0": + version "15.0.0" + resolved "https://registry.npmjs.org/@angular-builders/custom-webpack/-/custom-webpack-15.0.0.tgz" + integrity sha512-i8ZQ7rJ+RTy73MivvIdNAa8sZpiDy9wHBetAEyYSlGtjaSB3lntEFtBw9edfyRkpbifw53QA/N5haOwox987/Q== + dependencies: + "@angular-devkit/architect" ">=0.1500.0 < 0.1600.0" + "@angular-devkit/build-angular" "^15.0.0" + "@angular-devkit/core" "^15.0.0" lodash "^4.17.15" ts-node "^10.0.0" - tsconfig-paths "^3.9.0" + tsconfig-paths "^4.1.0" webpack-merge "^5.7.3" -"@angular-devkit/architect@0.1402.11", "@angular-devkit/architect@>=0.1400.0 < 0.1500.0": - version "0.1402.11" - resolved "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1402.11.tgz" - integrity sha512-RuSZrBQ+QbipAESZ4aXCyAMQHaEaDyyV/FDS9J2HJWfEFbRD5oxlEt/tBC8XjmJQsktaUOh07GT8MNJjPKVAQw== - dependencies: - "@angular-devkit/core" "14.2.11" - rxjs "6.6.7" - -"@angular-devkit/architect@0.1502.5", "@angular-devkit/architect@~0.1502.0": - version "0.1502.5" - resolved "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1502.5.tgz" - integrity sha512-6KVrXQ/X7W88WSJvYe69ed/2QzQNlObKpj3BWzmcKnA+IvJB37/mvw8VaGFP9y+pDa/b1D1yCDtAJLeP5QY3xg== - dependencies: - "@angular-devkit/core" "15.2.5" - rxjs "6.6.7" - "@angular-devkit/architect@^0.1202.10": version "0.1202.18" resolved "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1202.18.tgz" @@ -60,77 +39,15 @@ "@angular-devkit/core" "12.2.18" rxjs "6.6.7" -"@angular-devkit/build-angular@^14.0.0": - version "14.2.11" - resolved "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-14.2.11.tgz" - integrity sha512-O3X7GXcCBCGceVSHT+GIJ2JrRCg2YcO7HtNavpmPrraNr1o+aCdTkmT5WTS2cqWkZBm/z0wqKR8PsX/ZoD2r1A== +"@angular-devkit/architect@>=0.1500.0 < 0.1600.0", "@angular-devkit/architect@~0.1502.0", "@angular-devkit/architect@0.1502.5": + version "0.1502.5" + resolved "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1502.5.tgz" + integrity sha512-6KVrXQ/X7W88WSJvYe69ed/2QzQNlObKpj3BWzmcKnA+IvJB37/mvw8VaGFP9y+pDa/b1D1yCDtAJLeP5QY3xg== dependencies: - "@ampproject/remapping" "2.2.0" - "@angular-devkit/architect" "0.1402.11" - "@angular-devkit/build-webpack" "0.1402.11" - "@angular-devkit/core" "14.2.11" - "@babel/core" "7.18.10" - "@babel/generator" "7.18.12" - "@babel/helper-annotate-as-pure" "7.18.6" - "@babel/plugin-proposal-async-generator-functions" "7.18.10" - "@babel/plugin-transform-async-to-generator" "7.18.6" - "@babel/plugin-transform-runtime" "7.18.10" - "@babel/preset-env" "7.18.10" - "@babel/runtime" "7.18.9" - "@babel/template" "7.18.10" - "@discoveryjs/json-ext" "0.5.7" - "@ngtools/webpack" "14.2.11" - ansi-colors "4.1.3" - babel-loader "8.2.5" - babel-plugin-istanbul "6.1.1" - browserslist "^4.9.1" - cacache "16.1.2" - copy-webpack-plugin "11.0.0" - critters "0.0.16" - css-loader "6.7.1" - esbuild-wasm "0.15.5" - glob "8.0.3" - https-proxy-agent "5.0.1" - inquirer "8.2.4" - jsonc-parser "3.1.0" - karma-source-map-support "1.4.0" - less "4.1.3" - less-loader "11.0.0" - license-webpack-plugin "4.0.2" - loader-utils "3.2.1" - mini-css-extract-plugin "2.6.1" - minimatch "5.1.0" - open "8.4.0" - ora "5.4.1" - parse5-html-rewriting-stream "6.0.1" - piscina "3.2.0" - postcss "8.4.16" - postcss-import "15.0.0" - postcss-loader "7.0.1" - postcss-preset-env "7.8.0" - regenerator-runtime "0.13.9" - resolve-url-loader "5.0.0" + "@angular-devkit/core" "15.2.5" rxjs "6.6.7" - sass "1.54.4" - sass-loader "13.0.2" - semver "7.3.7" - source-map-loader "4.0.0" - source-map-support "0.5.21" - stylus "0.59.0" - stylus-loader "7.0.0" - terser "5.14.2" - text-table "0.2.0" - tree-kill "1.2.2" - tslib "2.4.0" - webpack "5.76.1" - webpack-dev-middleware "5.3.3" - webpack-dev-server "4.11.0" - webpack-merge "5.8.0" - webpack-subresource-integrity "5.1.0" - optionalDependencies: - esbuild "0.15.5" -"@angular-devkit/build-angular@^15.2.5": +"@angular-devkit/build-angular@^15.0.0", "@angular-devkit/build-angular@^15.2.5": version "15.2.5" resolved "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-15.2.5.tgz" integrity sha512-D2LxjBtUlgJnPxybOIN0XsENEGkVkqCGBBii5oK84HvgBHXO/EyP1WXpOdb2lOYSUZyjhOOs0q42LCobJoaxUw== @@ -198,14 +115,6 @@ optionalDependencies: esbuild "0.17.8" -"@angular-devkit/build-webpack@0.1402.11": - version "0.1402.11" - resolved "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1402.11.tgz" - integrity sha512-Ajyg1O6B6JSHsDlPdh165uy3glW4IiUlRXu8VVAOSA88WIT1Dl17f4Oun0/t27ip0/CNceiVY9MzOqIwGL1E6g== - dependencies: - "@angular-devkit/architect" "0.1402.11" - rxjs "6.6.7" - "@angular-devkit/build-webpack@0.1502.5": version "0.1502.5" resolved "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1502.5.tgz" @@ -214,7 +123,7 @@ "@angular-devkit/architect" "0.1502.5" rxjs "6.6.7" -"@angular-devkit/core@12.2.18", "@angular-devkit/core@^12.2.17": +"@angular-devkit/core@^12.2.17", "@angular-devkit/core@12.2.18": version "12.2.18" resolved "https://registry.npmjs.org/@angular-devkit/core/-/core-12.2.18.tgz" integrity sha512-GDLHGe9HEY5SRS+NrKr14C8aHsRCiBFkBFSSbeohgLgcgSXzZHFoU84nDWrl3KZNP8oqcUSv5lHu6dLcf2fnww== @@ -226,18 +135,7 @@ rxjs "6.6.7" source-map "0.7.3" -"@angular-devkit/core@14.2.11", "@angular-devkit/core@^14.0.0": - version "14.2.11" - resolved "https://registry.npmjs.org/@angular-devkit/core/-/core-14.2.11.tgz" - integrity sha512-cBIGs6y9rykOQqnuAQOB1DgIRyBFYtvKRJb7QNUfIJ0qUfARKkuV/yikv3lrb95ePGkmoRzmjkFqcFZiYU+r7A== - dependencies: - ajv "8.11.0" - ajv-formats "2.1.1" - jsonc-parser "3.1.0" - rxjs "6.6.7" - source-map "0.7.4" - -"@angular-devkit/core@15.2.5", "@angular-devkit/core@~15.2.0": +"@angular-devkit/core@^15.0.0", "@angular-devkit/core@~15.2.0", "@angular-devkit/core@15.2.5": version "15.2.5" resolved "https://registry.npmjs.org/@angular-devkit/core/-/core-15.2.5.tgz" integrity sha512-ZfjEkAe2yYeekc3xjZ/U4pK9nb+w6BFwAEjou6mE8PWZH7iYskm0YCCXkmu+B+zViEcCLhAkJAxu9MwX4efd8g== @@ -248,7 +146,7 @@ rxjs "6.6.7" source-map "0.7.4" -"@angular-devkit/schematics@12.2.18", "@angular-devkit/schematics@^12.2.17": +"@angular-devkit/schematics@^12.2.17", "@angular-devkit/schematics@12.2.18": version "12.2.18" resolved "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-12.2.18.tgz" integrity sha512-bZ9NS5PgoVfetRC6WeQBHCY5FqPZ9y2TKHUo12sOB2YSL3tgWgh1oXyP8PtX34gasqsLjNULxEQsAQYEsiX/qQ== @@ -325,7 +223,7 @@ "@angular-eslint/bundled-angular-compiler" "15.2.1" "@typescript-eslint/utils" "5.48.2" -"@angular/animations@^15.2.6": +"@angular/animations@^15.2.6", "@angular/animations@>=10.0.0", "@angular/animations@>=13.0.0 <14", "@angular/animations@15.2.6": version "15.2.6" resolved "https://registry.npmjs.org/@angular/animations/-/animations-15.2.6.tgz" integrity sha512-2fEhhj7xTzWHD61B502eXwDclsurkOK7CU+iRdl8EAtEobLRt62sG/XHmJ71UaaniWyI/H0sUSEJuF8TIPcaoQ== @@ -341,7 +239,7 @@ optionalDependencies: parse5 "^5.0.0" -"@angular/cli@^15.2.5": +"@angular/cli@^15.2.5", "@angular/cli@>= 15.0.0 < 16.0.0", "@angular/cli@>=12": version "15.2.5" resolved "https://registry.npmjs.org/@angular/cli/-/cli-15.2.5.tgz" integrity sha512-TmkkeJkdfDkC6b2SNQcLlr1rsl2anc5rrrY3gawOVXYXBExMxAi2SNJsHZzUXfiitW52aZkAyajF1VFazs8PRw== @@ -365,14 +263,14 @@ symbol-observable "4.0.0" yargs "17.6.2" -"@angular/common@^15.2.6": +"@angular/common@*", "@angular/common@^11.0.0", "@angular/common@^13.0.0", "@angular/common@^13.0.0 || ^14.0.0-0", "@angular/common@^15.0.0", "@angular/common@^15.2.6", "@angular/common@>=10.0.0", "@angular/common@>=13.0.0 <14", "@angular/common@>=13.0.0-0", "@angular/common@>=2.x", "@angular/common@>=5.0.0", "@angular/common@15.2.6", "@angular/common@5.0.0-alpha - 5 || 6.0.0-alpha - 6 || 7.0.0-alpha - 7 || 8.0.0-alpha - 8 || 9.0.0-alpha - 9 || 10.0.0-alpha - 10 || 11.0.0-alpha - 11 || 12.0.0-alpha - 12 || 13.0.0-alpha - 13 || 14.0.0-alpha - 14": version "15.2.6" resolved "https://registry.npmjs.org/@angular/common/-/common-15.2.6.tgz" integrity sha512-kPGJoSkFPXsIeHzcjlal8JC8/jYK9qAr+wv+HDX8O1J2FEzQjwoX4SYvpnvVk5WTqUkxMkRCTMu2YFAAmU1+qg== dependencies: tslib "^2.3.0" -"@angular/compiler-cli@^15.2.6": +"@angular/compiler-cli@^15.0.0", "@angular/compiler-cli@^15.2.6", "@angular/compiler-cli@15.2.6": version "15.2.6" resolved "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-15.2.6.tgz" integrity sha512-GHwL4l+NkaUGGdypF+nMFWCmTqvGusTzIriIwpnp38wc8lpmVME2jVodB6sHAkrxFmaHXU/gOCDFK4AnOi6Gmw== @@ -388,21 +286,21 @@ tslib "^2.3.0" yargs "^17.2.1" -"@angular/compiler@^15.2.6": +"@angular/compiler@^15.2.6", "@angular/compiler@15.2.6": version "15.2.6" resolved "https://registry.npmjs.org/@angular/compiler/-/compiler-15.2.6.tgz" integrity sha512-6oBAIY5KcC1UNsrnWGLcopZ9RD7c0HzpTCQY46N6HytHtUjBvzLbGWZu5MfahPtIjKz9FMVYBX9hugcbVpWnTA== dependencies: tslib "^2.3.0" -"@angular/core@^15.2.6": +"@angular/core@*", "@angular/core@^11.0.0", "@angular/core@^13.0.0", "@angular/core@^13.0.0 || ^14.0.0-0", "@angular/core@^15.0.0", "@angular/core@^15.2.6", "@angular/core@>=10.0.0", "@angular/core@>=12", "@angular/core@>=13.0.0 <14", "@angular/core@>=13.0.0-0", "@angular/core@>=2.x", "@angular/core@>=5.0.0", "@angular/core@15.2.6", "@angular/core@5.0.0-alpha - 5 || 6.0.0-alpha - 6 || 7.0.0-alpha - 7 || 8.0.0-alpha - 8 || 9.0.0-alpha - 9 || 10.0.0-alpha - 10 || 11.0.0-alpha - 11 || 12.0.0-alpha - 12 || 13.0.0-alpha - 13 || 14.0.0-alpha - 14": version "15.2.6" resolved "https://registry.npmjs.org/@angular/core/-/core-15.2.6.tgz" integrity sha512-eN46OfSOLQGN6AciUvyHOJ8xQxmiEakkxJeoG1jwcSRXCjwSYYnQ/6drnhUpq5p43XXBAIduKfJXNztEPvLAkA== dependencies: tslib "^2.3.0" -"@angular/forms@^15.2.6": +"@angular/forms@^13.0.0", "@angular/forms@^15.2.6", "@angular/forms@>=10.0.0", "@angular/forms@5.0.0-alpha - 5 || 6.0.0-alpha - 6 || 7.0.0-alpha - 7 || 8.0.0-alpha - 8 || 9.0.0-alpha - 9 || 10.0.0-alpha - 10 || 11.0.0-alpha - 11 || 12.0.0-alpha - 12 || 13.0.0-alpha - 13 || 14.0.0-alpha - 14": version "15.2.6" resolved "https://registry.npmjs.org/@angular/forms/-/forms-15.2.6.tgz" integrity sha512-SdZxsE9MUOVMz0FjOwtx1RN/SGpObnAyZBqXNrN0c4BmJg+faJzvKIBBN102CKpWZOGRoq2YYrgxow9StMhxTw== @@ -414,7 +312,7 @@ resolved "https://registry.npmjs.org/@angular/language-service/-/language-service-15.2.6.tgz" integrity sha512-q6u4XhFReJ3GtA7dC5rJaEBQPjJUjOz9PlwHSOxZxugFP99ddDNBBFd0caa446G54kQdZFG7j7w7BiAp2/srmQ== -"@angular/localize@15.2.6": +"@angular/localize@^13.0.0", "@angular/localize@^15.0.0", "@angular/localize@15.2.6": version "15.2.6" resolved "https://registry.npmjs.org/@angular/localize/-/localize-15.2.6.tgz" integrity sha512-2WJBYRJ6aulo0fS9BUGr4fsdyk+5WcbZoiFURgs0sNrJtYCd51I9rQNwl3OGyYReNmFx8GgLc4K7+rEKhKfSbA== @@ -423,21 +321,21 @@ glob "8.1.0" yargs "^17.2.1" -"@angular/platform-browser-dynamic@^15.2.6": +"@angular/platform-browser-dynamic@^15.2.6", "@angular/platform-browser-dynamic@15.2.6": version "15.2.6" resolved "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-15.2.6.tgz" integrity sha512-ZSyiigpxBWIM5f8t/a28Y3BCzHn1FtI2KsJysE7di5UUflOzwbxbfycVlpiZp0girbDYRyF18vvefvitNh17Gw== dependencies: tslib "^2.3.0" -"@angular/platform-browser@^15.2.6": +"@angular/platform-browser@^15.2.6", "@angular/platform-browser@>=10.0.0", "@angular/platform-browser@15.2.6", "@angular/platform-browser@5.0.0-alpha - 5 || 6.0.0-alpha - 6 || 7.0.0-alpha - 7 || 8.0.0-alpha - 8 || 9.0.0-alpha - 9 || 10.0.0-alpha - 10 || 11.0.0-alpha - 11 || 12.0.0-alpha - 12 || 13.0.0-alpha - 13 || 14.0.0-alpha - 14": version "15.2.6" resolved "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-15.2.6.tgz" integrity sha512-8afckDEWfYf+cyxs2SboZBJkiCwFgYE8IH24RUW1t3zLC+wfrTr7UEfrCoD4YJRVJdqnPoRWN5gjz98n3n4zsA== dependencies: tslib "^2.3.0" -"@angular/platform-server@^15.2.6": +"@angular/platform-server@^15.0.0", "@angular/platform-server@^15.2.6": version "15.2.6" resolved "https://registry.npmjs.org/@angular/platform-server/-/platform-server-15.2.6.tgz" integrity sha512-/2Ez8V+1s8MYSzq9sFUACJaxjYm/NbksGuKbwxV4oydN082vVgh96er5cOCLDzJLYHq+AeAkV3hL1kGHH5FFEg== @@ -446,7 +344,7 @@ tslib "^2.3.0" xhr2 "^0.2.0" -"@angular/router@^15.2.6": +"@angular/router@^15.0.0", "@angular/router@^15.2.6": version "15.2.6" resolved "https://registry.npmjs.org/@angular/router/-/router-15.2.6.tgz" integrity sha512-yB9uc9Xi9N0dErsugleywBA1KYG+GQ9WWSlri34oe2VsCqZazImn71n4wKPtrm2Xiy/mI23wJcr+jiCAtzp49Q== @@ -465,26 +363,26 @@ dependencies: "@babel/highlight" "^7.18.6" -"@babel/compat-data@^7.17.7", "@babel/compat-data@^7.18.8", "@babel/compat-data@^7.20.1", "@babel/compat-data@^7.20.5", "@babel/compat-data@^7.21.4": +"@babel/compat-data@^7.17.7", "@babel/compat-data@^7.20.1", "@babel/compat-data@^7.20.5", "@babel/compat-data@^7.21.4": version "7.21.4" resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.21.4.tgz" integrity sha512-/DYyDpeCfaVinT40FPGdkkb+lYSKvsVuMjDAG7jPOWWiM1ibOaB9CXJAlc4d1QpP/U2q2P9jbrSlClKSErd55g== -"@babel/core@7.18.10": - version "7.18.10" - resolved "https://registry.npmjs.org/@babel/core/-/core-7.18.10.tgz" - integrity sha512-JQM6k6ENcBFKVtWvLavlvi/mPcpYZ3+R+2EySDEMSMbp7Mn4FexlbbJVrx2R7Ijhr01T8gyqrOaABWIOgxeUyw== +"@babel/core@^7.0.0", "@babel/core@^7.0.0-0", "@babel/core@^7.12.0", "@babel/core@^7.12.3", "@babel/core@^7.13.0", "@babel/core@^7.4.0-0": + version "7.18.9" + resolved "https://registry.npmjs.org/@babel/core/-/core-7.18.9.tgz" + integrity sha512-1LIb1eL8APMy91/IMW+31ckrfBM4yCoLaVzoDhZUKSM4cu1L1nIidyxkCgzPAgrC5WEz36IPEr/eSeSF9pIn+g== dependencies: "@ampproject/remapping" "^2.1.0" "@babel/code-frame" "^7.18.6" - "@babel/generator" "^7.18.10" + "@babel/generator" "^7.18.9" "@babel/helper-compilation-targets" "^7.18.9" "@babel/helper-module-transforms" "^7.18.9" "@babel/helpers" "^7.18.9" - "@babel/parser" "^7.18.10" - "@babel/template" "^7.18.10" - "@babel/traverse" "^7.18.10" - "@babel/types" "^7.18.10" + "@babel/parser" "^7.18.9" + "@babel/template" "^7.18.6" + "@babel/traverse" "^7.18.9" + "@babel/types" "^7.18.9" convert-source-map "^1.7.0" debug "^4.1.0" gensync "^1.0.0-beta.2" @@ -533,45 +431,6 @@ json5 "^2.2.2" semver "^6.3.0" -"@babel/core@^7.12.3": - version "7.18.9" - resolved "https://registry.npmjs.org/@babel/core/-/core-7.18.9.tgz" - integrity sha512-1LIb1eL8APMy91/IMW+31ckrfBM4yCoLaVzoDhZUKSM4cu1L1nIidyxkCgzPAgrC5WEz36IPEr/eSeSF9pIn+g== - dependencies: - "@ampproject/remapping" "^2.1.0" - "@babel/code-frame" "^7.18.6" - "@babel/generator" "^7.18.9" - "@babel/helper-compilation-targets" "^7.18.9" - "@babel/helper-module-transforms" "^7.18.9" - "@babel/helpers" "^7.18.9" - "@babel/parser" "^7.18.9" - "@babel/template" "^7.18.6" - "@babel/traverse" "^7.18.9" - "@babel/types" "^7.18.9" - convert-source-map "^1.7.0" - debug "^4.1.0" - gensync "^1.0.0-beta.2" - json5 "^2.2.1" - semver "^6.3.0" - -"@babel/generator@7.18.12", "@babel/generator@^7.18.10": - version "7.18.12" - resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.18.12.tgz" - integrity sha512-dfQ8ebCN98SvyL7IxNMCUtZQSq5R7kxgN+r8qYTGDmmSion1hX2C0zq2yo1bsCDhXixokv1SAWTZUMYbO/V5zg== - dependencies: - "@babel/types" "^7.18.10" - "@jridgewell/gen-mapping" "^0.3.2" - jsesc "^2.5.1" - -"@babel/generator@7.20.14", "@babel/generator@^7.20.7": - version "7.20.14" - resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.20.14.tgz" - integrity sha512-AEmuXHdcD3A52HHXxaTmYlb8q/xMEhoRP67B3T4Oq7lbmSoqroMZzjnGj3+i1io3pdnF8iBYVu4Ilj+c4hBxYg== - dependencies: - "@babel/types" "^7.20.7" - "@jridgewell/gen-mapping" "^0.3.2" - jsesc "^2.5.1" - "@babel/generator@^7.18.9", "@babel/generator@^7.19.3", "@babel/generator@^7.21.4": version "7.21.4" resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.21.4.tgz" @@ -582,7 +441,16 @@ "@jridgewell/trace-mapping" "^0.3.17" jsesc "^2.5.1" -"@babel/helper-annotate-as-pure@7.18.6", "@babel/helper-annotate-as-pure@^7.18.6": +"@babel/generator@^7.20.7", "@babel/generator@7.20.14": + version "7.20.14" + resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.20.14.tgz" + integrity sha512-AEmuXHdcD3A52HHXxaTmYlb8q/xMEhoRP67B3T4Oq7lbmSoqroMZzjnGj3+i1io3pdnF8iBYVu4Ilj+c4hBxYg== + dependencies: + "@babel/types" "^7.20.7" + "@jridgewell/gen-mapping" "^0.3.2" + jsesc "^2.5.1" + +"@babel/helper-annotate-as-pure@^7.18.6", "@babel/helper-annotate-as-pure@7.18.6": version "7.18.6" resolved "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz" integrity sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA== @@ -630,7 +498,7 @@ "@babel/helper-annotate-as-pure" "^7.18.6" regexpu-core "^5.3.1" -"@babel/helper-define-polyfill-provider@^0.3.2", "@babel/helper-define-polyfill-provider@^0.3.3": +"@babel/helper-define-polyfill-provider@^0.3.3": version "0.3.3" resolved "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.3.tgz" integrity sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww== @@ -709,7 +577,7 @@ resolved "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz" integrity sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ== -"@babel/helper-remap-async-to-generator@^7.18.6", "@babel/helper-remap-async-to-generator@^7.18.9": +"@babel/helper-remap-async-to-generator@^7.18.9": version "7.18.9" resolved "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.9.tgz" integrity sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA== @@ -745,7 +613,7 @@ dependencies: "@babel/types" "^7.20.0" -"@babel/helper-split-export-declaration@7.18.6", "@babel/helper-split-export-declaration@^7.18.6": +"@babel/helper-split-export-declaration@^7.18.6", "@babel/helper-split-export-declaration@7.18.6": version "7.18.6" resolved "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz" integrity sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA== @@ -795,7 +663,7 @@ chalk "^2.0.0" js-tokens "^4.0.0" -"@babel/parser@^7.10.3", "@babel/parser@^7.14.7", "@babel/parser@^7.18.10", "@babel/parser@^7.18.9", "@babel/parser@^7.19.3", "@babel/parser@^7.20.7", "@babel/parser@^7.21.4": +"@babel/parser@^7.10.3", "@babel/parser@^7.14.7", "@babel/parser@^7.18.9", "@babel/parser@^7.19.3", "@babel/parser@^7.20.7", "@babel/parser@^7.21.4": version "7.21.4" resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.21.4.tgz" integrity sha512-alVJj7k7zIxqBZ7BTRhz0IqJFxW1VJbm6N8JbcYhQ186df9ZBPbZBmWSqAMXwHGsCJdYks7z/voa3ibiS5bCIw== @@ -816,17 +684,7 @@ "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" "@babel/plugin-proposal-optional-chaining" "^7.20.7" -"@babel/plugin-proposal-async-generator-functions@7.18.10", "@babel/plugin-proposal-async-generator-functions@^7.18.10": - version "7.18.10" - resolved "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.18.10.tgz" - integrity sha512-1mFuY2TOsR1hxbjCo4QL+qlIjV07p4H4EUYw2J/WCqsvFV6V9X9z9YhXbWndc/4fw+hYGlDT7egYxliMp5O6Ew== - dependencies: - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-plugin-utils" "^7.18.9" - "@babel/helper-remap-async-to-generator" "^7.18.9" - "@babel/plugin-syntax-async-generators" "^7.8.4" - -"@babel/plugin-proposal-async-generator-functions@7.20.7", "@babel/plugin-proposal-async-generator-functions@^7.20.1": +"@babel/plugin-proposal-async-generator-functions@^7.20.1", "@babel/plugin-proposal-async-generator-functions@7.20.7": version "7.20.7" resolved "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.7.tgz" integrity sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA== @@ -901,7 +759,7 @@ "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-syntax-numeric-separator" "^7.10.4" -"@babel/plugin-proposal-object-rest-spread@^7.18.9", "@babel/plugin-proposal-object-rest-spread@^7.20.2": +"@babel/plugin-proposal-object-rest-spread@^7.20.2": version "7.20.7" resolved "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz" integrity sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg== @@ -990,7 +848,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.3" -"@babel/plugin-syntax-import-assertions@^7.18.6", "@babel/plugin-syntax-import-assertions@^7.20.0": +"@babel/plugin-syntax-import-assertions@^7.20.0": version "7.20.0" resolved "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.20.0.tgz" integrity sha512-IUh1vakzNoWalR8ch/areW7qFopR2AEw03JlG7BbrDqmQ4X3q9uuipQwSGrUn7oGiemKjtSLDhNtQHzMHr1JdQ== @@ -1067,16 +925,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.20.2" -"@babel/plugin-transform-async-to-generator@7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.18.6.tgz" - integrity sha512-ARE5wZLKnTgPW7/1ftQmSi1CmkqqHo2DNmtztFhvgtOWSDfq0Cq9/9L+KnZNYSNrydBekhW3rwShduf59RoXag== - dependencies: - "@babel/helper-module-imports" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/helper-remap-async-to-generator" "^7.18.6" - -"@babel/plugin-transform-async-to-generator@7.20.7", "@babel/plugin-transform-async-to-generator@^7.18.6": +"@babel/plugin-transform-async-to-generator@^7.18.6", "@babel/plugin-transform-async-to-generator@7.20.7": version "7.20.7" resolved "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.20.7.tgz" integrity sha512-Uo5gwHPT9vgnSXQxqGtpdufUiWp96gk7yiP4Mp5bm1QMkEmLXBO7PAGYbKoJ6DhAwiNkcHFBol/x5zZZkL/t0Q== @@ -1092,14 +941,14 @@ dependencies: "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-block-scoping@^7.18.9", "@babel/plugin-transform-block-scoping@^7.20.2": +"@babel/plugin-transform-block-scoping@^7.20.2": version "7.21.0" resolved "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.21.0.tgz" integrity sha512-Mdrbunoh9SxwFZapeHVrwFmri16+oYotcZysSzhNIVDwIAb1UV+kvnxULSYq9J3/q5MDG+4X6w8QVgD1zhBXNQ== dependencies: "@babel/helper-plugin-utils" "^7.20.2" -"@babel/plugin-transform-classes@^7.18.9", "@babel/plugin-transform-classes@^7.20.2": +"@babel/plugin-transform-classes@^7.20.2": version "7.21.0" resolved "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.21.0.tgz" integrity sha512-RZhbYTCEUAe6ntPehC4hlslPWosNHDox+vAs4On/mCLRLfoDVHf6hVEd7kuxr1RnHwJmxFfUM3cZiZRmPxJPXQ== @@ -1122,7 +971,7 @@ "@babel/helper-plugin-utils" "^7.20.2" "@babel/template" "^7.20.7" -"@babel/plugin-transform-destructuring@^7.18.9", "@babel/plugin-transform-destructuring@^7.20.2": +"@babel/plugin-transform-destructuring@^7.20.2": version "7.21.3" resolved "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.21.3.tgz" integrity sha512-bp6hwMFzuiE4HqYEyoGJ/V2LeIWn+hLVKc4pnj++E5XQptwhtcGmSayM029d/j2X1bPKGTlsyPwAubuU22KhMA== @@ -1182,7 +1031,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-modules-amd@^7.18.6", "@babel/plugin-transform-modules-amd@^7.19.6": +"@babel/plugin-transform-modules-amd@^7.19.6": version "7.20.11" resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.20.11.tgz" integrity sha512-NuzCt5IIYOW0O30UvqktzHYR2ud5bOWbY0yaxWZ6G+aFzOMJvrs5YHNikrbdaT15+KNO31nPOy5Fim3ku6Zb5g== @@ -1190,7 +1039,7 @@ "@babel/helper-module-transforms" "^7.20.11" "@babel/helper-plugin-utils" "^7.20.2" -"@babel/plugin-transform-modules-commonjs@^7.18.6", "@babel/plugin-transform-modules-commonjs@^7.19.6": +"@babel/plugin-transform-modules-commonjs@^7.19.6": version "7.21.2" resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.21.2.tgz" integrity sha512-Cln+Yy04Gxua7iPdj6nOV96smLGjpElir5YwzF0LBPKoPlLDNJePNlrGGaybAJkd0zKRnOVXOgizSqPYMNYkzA== @@ -1199,7 +1048,7 @@ "@babel/helper-plugin-utils" "^7.20.2" "@babel/helper-simple-access" "^7.20.2" -"@babel/plugin-transform-modules-systemjs@^7.18.9", "@babel/plugin-transform-modules-systemjs@^7.19.6": +"@babel/plugin-transform-modules-systemjs@^7.19.6": version "7.20.11" resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.20.11.tgz" integrity sha512-vVu5g9BPQKSFEmvt2TA4Da5N+QVS66EX21d8uoOihC+OCpUoGvzVsXeqFdtAEfVa5BILAeFt+U7yVmLbQnAJmw== @@ -1217,7 +1066,7 @@ "@babel/helper-module-transforms" "^7.18.6" "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-named-capturing-groups-regex@^7.18.6", "@babel/plugin-transform-named-capturing-groups-regex@^7.19.1": +"@babel/plugin-transform-named-capturing-groups-regex@^7.19.1": version "7.20.5" resolved "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.20.5.tgz" integrity sha512-mOW4tTzi5iTLnw+78iEq3gr8Aoq4WNRGpmSlrogqaiCBoR1HFhpU4JkpQFOHfeYx3ReVIFWOQJS4aZBRvuZ6mA== @@ -1240,7 +1089,7 @@ "@babel/helper-plugin-utils" "^7.18.6" "@babel/helper-replace-supers" "^7.18.6" -"@babel/plugin-transform-parameters@^7.18.8", "@babel/plugin-transform-parameters@^7.20.1", "@babel/plugin-transform-parameters@^7.20.7": +"@babel/plugin-transform-parameters@^7.20.1", "@babel/plugin-transform-parameters@^7.20.7": version "7.21.3" resolved "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.21.3.tgz" integrity sha512-Wxc+TvppQG9xWFYatvCGPvZ6+SIUxQ2ZdiBP+PHYMIjnPXD+uThCshaz4NZOnODAtBjjcVQQ/3OKs9LW28purQ== @@ -1269,18 +1118,6 @@ dependencies: "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-runtime@7.18.10": - version "7.18.10" - resolved "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.18.10.tgz" - integrity sha512-q5mMeYAdfEbpBAgzl7tBre/la3LeCxmDO1+wMXRdPWbcoMjR3GiXlCLk7JBZVVye0bqTGNMbt0yYVXX1B1jEWQ== - dependencies: - "@babel/helper-module-imports" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.9" - babel-plugin-polyfill-corejs2 "^0.3.2" - babel-plugin-polyfill-corejs3 "^0.5.3" - babel-plugin-polyfill-regenerator "^0.4.0" - semver "^6.3.0" - "@babel/plugin-transform-runtime@7.19.6": version "7.19.6" resolved "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.19.6.tgz" @@ -1300,7 +1137,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-spread@^7.18.9", "@babel/plugin-transform-spread@^7.19.0": +"@babel/plugin-transform-spread@^7.19.0": version "7.20.7" resolved "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.20.7.tgz" integrity sha512-ewBbHQ+1U/VnH1fxltbJqDeWBU1oNLG8Dj11uIv3xVf7nrQu0bPGe5Rf716r7K5Qz+SqtAOVswoVunoiBtGhxw== @@ -1344,87 +1181,6 @@ "@babel/helper-create-regexp-features-plugin" "^7.18.6" "@babel/helper-plugin-utils" "^7.18.6" -"@babel/preset-env@7.18.10": - version "7.18.10" - resolved "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.18.10.tgz" - integrity sha512-wVxs1yjFdW3Z/XkNfXKoblxoHgbtUF7/l3PvvP4m02Qz9TZ6uZGxRVYjSQeR87oQmHco9zWitW5J82DJ7sCjvA== - dependencies: - "@babel/compat-data" "^7.18.8" - "@babel/helper-compilation-targets" "^7.18.9" - "@babel/helper-plugin-utils" "^7.18.9" - "@babel/helper-validator-option" "^7.18.6" - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.18.6" - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.18.9" - "@babel/plugin-proposal-async-generator-functions" "^7.18.10" - "@babel/plugin-proposal-class-properties" "^7.18.6" - "@babel/plugin-proposal-class-static-block" "^7.18.6" - "@babel/plugin-proposal-dynamic-import" "^7.18.6" - "@babel/plugin-proposal-export-namespace-from" "^7.18.9" - "@babel/plugin-proposal-json-strings" "^7.18.6" - "@babel/plugin-proposal-logical-assignment-operators" "^7.18.9" - "@babel/plugin-proposal-nullish-coalescing-operator" "^7.18.6" - "@babel/plugin-proposal-numeric-separator" "^7.18.6" - "@babel/plugin-proposal-object-rest-spread" "^7.18.9" - "@babel/plugin-proposal-optional-catch-binding" "^7.18.6" - "@babel/plugin-proposal-optional-chaining" "^7.18.9" - "@babel/plugin-proposal-private-methods" "^7.18.6" - "@babel/plugin-proposal-private-property-in-object" "^7.18.6" - "@babel/plugin-proposal-unicode-property-regex" "^7.18.6" - "@babel/plugin-syntax-async-generators" "^7.8.4" - "@babel/plugin-syntax-class-properties" "^7.12.13" - "@babel/plugin-syntax-class-static-block" "^7.14.5" - "@babel/plugin-syntax-dynamic-import" "^7.8.3" - "@babel/plugin-syntax-export-namespace-from" "^7.8.3" - "@babel/plugin-syntax-import-assertions" "^7.18.6" - "@babel/plugin-syntax-json-strings" "^7.8.3" - "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" - "@babel/plugin-syntax-numeric-separator" "^7.10.4" - "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" - "@babel/plugin-syntax-optional-chaining" "^7.8.3" - "@babel/plugin-syntax-private-property-in-object" "^7.14.5" - "@babel/plugin-syntax-top-level-await" "^7.14.5" - "@babel/plugin-transform-arrow-functions" "^7.18.6" - "@babel/plugin-transform-async-to-generator" "^7.18.6" - "@babel/plugin-transform-block-scoped-functions" "^7.18.6" - "@babel/plugin-transform-block-scoping" "^7.18.9" - "@babel/plugin-transform-classes" "^7.18.9" - "@babel/plugin-transform-computed-properties" "^7.18.9" - "@babel/plugin-transform-destructuring" "^7.18.9" - "@babel/plugin-transform-dotall-regex" "^7.18.6" - "@babel/plugin-transform-duplicate-keys" "^7.18.9" - "@babel/plugin-transform-exponentiation-operator" "^7.18.6" - "@babel/plugin-transform-for-of" "^7.18.8" - "@babel/plugin-transform-function-name" "^7.18.9" - "@babel/plugin-transform-literals" "^7.18.9" - "@babel/plugin-transform-member-expression-literals" "^7.18.6" - "@babel/plugin-transform-modules-amd" "^7.18.6" - "@babel/plugin-transform-modules-commonjs" "^7.18.6" - "@babel/plugin-transform-modules-systemjs" "^7.18.9" - "@babel/plugin-transform-modules-umd" "^7.18.6" - "@babel/plugin-transform-named-capturing-groups-regex" "^7.18.6" - "@babel/plugin-transform-new-target" "^7.18.6" - "@babel/plugin-transform-object-super" "^7.18.6" - "@babel/plugin-transform-parameters" "^7.18.8" - "@babel/plugin-transform-property-literals" "^7.18.6" - "@babel/plugin-transform-regenerator" "^7.18.6" - "@babel/plugin-transform-reserved-words" "^7.18.6" - "@babel/plugin-transform-shorthand-properties" "^7.18.6" - "@babel/plugin-transform-spread" "^7.18.9" - "@babel/plugin-transform-sticky-regex" "^7.18.6" - "@babel/plugin-transform-template-literals" "^7.18.9" - "@babel/plugin-transform-typeof-symbol" "^7.18.9" - "@babel/plugin-transform-unicode-escapes" "^7.18.10" - "@babel/plugin-transform-unicode-regex" "^7.18.6" - "@babel/preset-modules" "^0.1.5" - "@babel/types" "^7.18.10" - babel-plugin-polyfill-corejs2 "^0.3.2" - babel-plugin-polyfill-corejs3 "^0.5.3" - babel-plugin-polyfill-regenerator "^0.4.0" - core-js-compat "^3.22.1" - semver "^6.3.0" - "@babel/preset-env@7.20.2": version "7.20.2" resolved "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.20.2.tgz" @@ -1522,20 +1278,13 @@ resolved "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz" integrity sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA== -"@babel/runtime@7.17.2", "@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2", "@babel/runtime@^7.12.0", "@babel/runtime@^7.14.5", "@babel/runtime@^7.15.4", "@babel/runtime@^7.3.1", "@babel/runtime@^7.4.4", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.3", "@babel/runtime@^7.8.3", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2": +"@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2", "@babel/runtime@^7.12.0", "@babel/runtime@^7.14.5", "@babel/runtime@^7.15.4", "@babel/runtime@^7.3.1", "@babel/runtime@^7.4.4", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.3", "@babel/runtime@^7.8.3", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2", "@babel/runtime@>=7", "@babel/runtime@7.17.2": version "7.17.2" resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.17.2.tgz" integrity sha512-hzeyJyMA1YGdJTuWU0e/j4wKXrU4OMFvY2MSlaI9B7VQb0r5cxTE3EAIS2Q7Tn2RIcDkRvTA/v2JsAEhxe99uw== dependencies: regenerator-runtime "^0.13.4" -"@babel/runtime@7.18.9": - version "7.18.9" - resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.18.9.tgz" - integrity sha512-lkqXDcvlFT5rvEjiu6+QYO+1GXrEHRo2LOtS7E4GtX5ESIZOgepqsZBVIj6Pv+a6zqsya9VCgiK1KAK4BvJDAw== - dependencies: - regenerator-runtime "^0.13.4" - "@babel/runtime@7.20.13": version "7.20.13" resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.20.13.tgz" @@ -1543,16 +1292,7 @@ dependencies: regenerator-runtime "^0.13.11" -"@babel/template@7.18.10": - version "7.18.10" - resolved "https://registry.npmjs.org/@babel/template/-/template-7.18.10.tgz" - integrity sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA== - dependencies: - "@babel/code-frame" "^7.18.6" - "@babel/parser" "^7.18.10" - "@babel/types" "^7.18.10" - -"@babel/template@7.20.7", "@babel/template@^7.18.10", "@babel/template@^7.18.6", "@babel/template@^7.20.7": +"@babel/template@^7.18.10", "@babel/template@^7.18.6", "@babel/template@^7.20.7", "@babel/template@7.20.7": version "7.20.7" resolved "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz" integrity sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw== @@ -1561,7 +1301,7 @@ "@babel/parser" "^7.20.7" "@babel/types" "^7.20.7" -"@babel/traverse@^7.10.3", "@babel/traverse@^7.18.10", "@babel/traverse@^7.18.9", "@babel/traverse@^7.19.3", "@babel/traverse@^7.20.12", "@babel/traverse@^7.20.5", "@babel/traverse@^7.20.7", "@babel/traverse@^7.21.0", "@babel/traverse@^7.21.2": +"@babel/traverse@^7.10.3", "@babel/traverse@^7.18.9", "@babel/traverse@^7.19.3", "@babel/traverse@^7.20.12", "@babel/traverse@^7.20.5", "@babel/traverse@^7.20.7", "@babel/traverse@^7.21.0", "@babel/traverse@^7.21.2": version "7.21.4" resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.21.4.tgz" integrity sha512-eyKrRHKdyZxqDm+fV1iqL9UAHMoIg0nDaGqfIOd8rKH17m5snv7Gn4qgjBoFfLz9APvjFU/ICT00NVCv1Epp8Q== @@ -1577,7 +1317,7 @@ debug "^4.1.0" globals "^11.1.0" -"@babel/types@^7.10.3", "@babel/types@^7.18.10", "@babel/types@^7.18.6", "@babel/types@^7.18.9", "@babel/types@^7.19.3", "@babel/types@^7.20.0", "@babel/types@^7.20.2", "@babel/types@^7.20.5", "@babel/types@^7.20.7", "@babel/types@^7.21.0", "@babel/types@^7.21.2", "@babel/types@^7.21.4", "@babel/types@^7.4.4": +"@babel/types@^7.10.3", "@babel/types@^7.18.6", "@babel/types@^7.18.9", "@babel/types@^7.19.3", "@babel/types@^7.20.0", "@babel/types@^7.20.2", "@babel/types@^7.20.5", "@babel/types@^7.20.7", "@babel/types@^7.21.0", "@babel/types@^7.21.2", "@babel/types@^7.21.4", "@babel/types@^7.4.4": version "7.21.4" resolved "https://registry.npmjs.org/@babel/types/-/types-7.21.4.tgz" integrity sha512-rU2oY501qDxE8Pyo7i/Orqma4ziCOrby0/9mvbDUGEfvZjb279Nk9k19e2fiCxHbRRpY2ZyrgW1eq22mvmOIzA== @@ -1591,19 +1331,14 @@ resolved "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz" integrity sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ== -"@cspotcode/source-map-consumer@0.8.0": - version "0.8.0" - resolved "https://registry.yarnpkg.com/@cspotcode/source-map-consumer/-/source-map-consumer-0.8.0.tgz#33bf4b7b39c178821606f669bbc447a6a629786b" - integrity sha512-41qniHzTU8yAGbCp04ohlmSrZf8bkf/iJsl3V0dRGsQN/5GFfx+LbCSsCpp2gqrqjTVg/K6O8ycoV35JIwAzAg== - -"@cspotcode/source-map-support@0.6.1": - version "0.6.1" - resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.6.1.tgz#118511f316e2e87ee4294761868e254d3da47960" - integrity sha512-DX3Z+T5dt1ockmPdobJS/FAsQPW4V4SrWEhD2iYQT2Cb2tQsiMnYxrcUH9By/Z3B+v0S5LMBkQtV/XOBbpLEOg== +"@cspotcode/source-map-support@^0.8.0": + version "0.8.1" + resolved "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz" + integrity sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw== dependencies: - "@cspotcode/source-map-consumer" "0.8.0" + "@jridgewell/trace-mapping" "0.3.9" -"@csstools/postcss-cascade-layers@^1.0.5", "@csstools/postcss-cascade-layers@^1.1.1": +"@csstools/postcss-cascade-layers@^1.1.1": version "1.1.1" resolved "https://registry.npmjs.org/@csstools/postcss-cascade-layers/-/postcss-cascade-layers-1.1.1.tgz" integrity sha512-+KdYrpKC5TgomQr2DlZF4lDEpHcoxnj5IGddYYfBWJAKfj1JtuHUIqMa+E1pJJ+z3kvDViWMqyqPlG4Ja7amQA== @@ -1753,7 +1488,7 @@ debug "^3.1.0" lodash.once "^4.1.1" -"@discoveryjs/json-ext@0.5.7", "@discoveryjs/json-ext@^0.5.0": +"@discoveryjs/json-ext@^0.5.0", "@discoveryjs/json-ext@0.5.7": version "0.5.7" resolved "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz" integrity sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw== @@ -1777,121 +1512,11 @@ esquery "^1.4.0" jsdoc-type-pratt-parser "~3.1.0" -"@esbuild/android-arm64@0.17.8": - version "0.17.8" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.17.8.tgz#b3d5b65a3b2e073a6c7ee36b1f3c30c8f000315b" - integrity sha512-oa/N5j6v1svZQs7EIRPqR8f+Bf8g6HBDjD/xHC02radE/NjKHK7oQmtmLxPs1iVwYyvE+Kolo6lbpfEQ9xnhxQ== - -"@esbuild/android-arm@0.17.8": - version "0.17.8" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.17.8.tgz#c41e496af541e175369d48164d0cf01a5f656cf6" - integrity sha512-0/rb91GYKhrtbeglJXOhAv9RuYimgI8h623TplY2X+vA4EXnk3Zj1fXZreJ0J3OJJu1bwmb0W7g+2cT/d8/l/w== - -"@esbuild/android-x64@0.17.8": - version "0.17.8" - resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.17.8.tgz#080fa67c29be77f5a3ca5ee4cc78d5bf927e3a3b" - integrity sha512-bTliMLqD7pTOoPg4zZkXqCDuzIUguEWLpeqkNfC41ODBHwoUgZ2w5JBeYimv4oP6TDVocoYmEhZrCLQTrH89bg== - -"@esbuild/darwin-arm64@0.17.8": - version "0.17.8" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.17.8.tgz#053622bf9a82f43d5c075b7818e02618f7b4a397" - integrity sha512-ghAbV3ia2zybEefXRRm7+lx8J/rnupZT0gp9CaGy/3iolEXkJ6LYRq4IpQVI9zR97ID80KJVoUlo3LSeA/sMAg== - "@esbuild/darwin-x64@0.17.8": version "0.17.8" resolved "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.8.tgz" integrity sha512-n5WOpyvZ9TIdv2V1K3/iIkkJeKmUpKaCTdun9buhGRWfH//osmUjlv4Z5mmWdPWind/VGcVxTHtLfLCOohsOXw== -"@esbuild/freebsd-arm64@0.17.8": - version "0.17.8" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.8.tgz#e6738d0081ba0721a5c6c674e84c6e7fcea61989" - integrity sha512-a/SATTaOhPIPFWvHZDoZYgxaZRVHn0/LX1fHLGfZ6C13JqFUZ3K6SMD6/HCtwOQ8HnsNaEeokdiDSFLuizqv5A== - -"@esbuild/freebsd-x64@0.17.8": - version "0.17.8" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.17.8.tgz#1855e562f2b730f4483f6e94086e9e2597feb4c3" - integrity sha512-xpFJb08dfXr5+rZc4E+ooZmayBW6R3q59daCpKZ/cDU96/kvDM+vkYzNeTJCGd8rtO6fHWMq5Rcv/1cY6p6/0Q== - -"@esbuild/linux-arm64@0.17.8": - version "0.17.8" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.17.8.tgz#481da38952721a3fdb77c17a36ceaacc4270b5c5" - integrity sha512-v3iwDQuDljLTxpsqQDl3fl/yihjPAyOguxuloON9kFHYwopeJEf1BkDXODzYyXEI19gisEsQlG1bM65YqKSIww== - -"@esbuild/linux-arm@0.17.8": - version "0.17.8" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.17.8.tgz#18127072b270bb6321c6d11be20bfd30e0d6ad17" - integrity sha512-6Ij8gfuGszcEwZpi5jQIJCVIACLS8Tz2chnEBfYjlmMzVsfqBP1iGmHQPp7JSnZg5xxK9tjCc+pJ2WtAmPRFVA== - -"@esbuild/linux-ia32@0.17.8": - version "0.17.8" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.17.8.tgz#ee400af7b3bc69e8ca2e593ca35156ffb9abd54f" - integrity sha512-8svILYKhE5XetuFk/B6raFYIyIqydQi+GngEXJgdPdI7OMKUbSd7uzR02wSY4kb53xBrClLkhH4Xs8P61Q2BaA== - -"@esbuild/linux-loong64@0.15.5": - version "0.15.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.15.5.tgz#91aef76d332cdc7c8942b600fa2307f3387e6f82" - integrity sha512-UHkDFCfSGTuXq08oQltXxSZmH1TXyWsL+4QhZDWvvLl6mEJQqk3u7/wq1LjhrrAXYIllaTtRSzUXl4Olkf2J8A== - -"@esbuild/linux-loong64@0.17.8": - version "0.17.8" - resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.17.8.tgz#8c509d8a454693d39824b83b3f66c400872fce82" - integrity sha512-B6FyMeRJeV0NpyEOYlm5qtQfxbdlgmiGdD+QsipzKfFky0K5HW5Td6dyK3L3ypu1eY4kOmo7wW0o94SBqlqBSA== - -"@esbuild/linux-mips64el@0.17.8": - version "0.17.8" - resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.17.8.tgz#f2b0d36e63fb26bc3f95b203b6a80638292101ca" - integrity sha512-CCb67RKahNobjm/eeEqeD/oJfJlrWyw29fgiyB6vcgyq97YAf3gCOuP6qMShYSPXgnlZe/i4a8WFHBw6N8bYAA== - -"@esbuild/linux-ppc64@0.17.8": - version "0.17.8" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.17.8.tgz#1e628be003e036e90423716028cc884fe5ba25bd" - integrity sha512-bytLJOi55y55+mGSdgwZ5qBm0K9WOCh0rx+vavVPx+gqLLhxtSFU0XbeYy/dsAAD6xECGEv4IQeFILaSS2auXw== - -"@esbuild/linux-riscv64@0.17.8": - version "0.17.8" - resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.17.8.tgz#419a815cb4c3fb9f1b78ef5295f5b48b8bf6427a" - integrity sha512-2YpRyQJmKVBEHSBLa8kBAtbhucaclb6ex4wchfY0Tj3Kg39kpjeJ9vhRU7x4mUpq8ISLXRXH1L0dBYjAeqzZAw== - -"@esbuild/linux-s390x@0.17.8": - version "0.17.8" - resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.17.8.tgz#291c49ae5c3d11d226352755c0835911fe1a9e5c" - integrity sha512-QgbNY/V3IFXvNf11SS6exkpVcX0LJcob+0RWCgV9OiDAmVElnxciHIisoSix9uzYzScPmS6dJFbZULdSAEkQVw== - -"@esbuild/linux-x64@0.17.8": - version "0.17.8" - resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.17.8.tgz#03199d91c76faf80bd54104f5cbf0a489bc39f6a" - integrity sha512-mM/9S0SbAFDBc4OPoyP6SEOo5324LpUxdpeIUUSrSTOfhHU9hEfqRngmKgqILqwx/0DVJBzeNW7HmLEWp9vcOA== - -"@esbuild/netbsd-x64@0.17.8": - version "0.17.8" - resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.17.8.tgz#b436d767e1b21852f9ed212e2bb57f77203b0ae2" - integrity sha512-eKUYcWaWTaYr9zbj8GertdVtlt1DTS1gNBWov+iQfWuWyuu59YN6gSEJvFzC5ESJ4kMcKR0uqWThKUn5o8We6Q== - -"@esbuild/openbsd-x64@0.17.8": - version "0.17.8" - resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.17.8.tgz#d1481d8539e21d4729cd04a0450a26c2c8789e89" - integrity sha512-Vc9J4dXOboDyMXKD0eCeW0SIeEzr8K9oTHJU+Ci1mZc5njPfhKAqkRt3B/fUNU7dP+mRyralPu8QUkiaQn7iIg== - -"@esbuild/sunos-x64@0.17.8": - version "0.17.8" - resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.17.8.tgz#2cfb8126e079b2c00fd1bf095541e9f5c47877e4" - integrity sha512-0xvOTNuPXI7ft1LYUgiaXtpCEjp90RuBBYovdd2lqAFxje4sEucurg30M1WIm03+3jxByd3mfo+VUmPtRSVuOw== - -"@esbuild/win32-arm64@0.17.8": - version "0.17.8" - resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.17.8.tgz#7c6ecfd097ca23b82119753bf7072bbaefe51e3a" - integrity sha512-G0JQwUI5WdEFEnYNKzklxtBheCPkuDdu1YrtRrjuQv30WsYbkkoixKxLLv8qhJmNI+ATEWquZe/N0d0rpr55Mg== - -"@esbuild/win32-ia32@0.17.8": - version "0.17.8" - resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.17.8.tgz#cffec63c3cb0ef8563a04df4e09fa71056171d00" - integrity sha512-Fqy63515xl20OHGFykjJsMnoIWS+38fqfg88ClvPXyDbLtgXal2DTlhb1TfTX34qWi3u4I7Cq563QcHpqgLx8w== - -"@esbuild/win32-x64@0.17.8": - version "0.17.8" - resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.17.8.tgz#200a0965cf654ac28b971358ecdca9cc5b44c335" - integrity sha512-1iuezdyDNngPnz8rLRDO2C/ZZ/emJLb72OsZeqQ6gL6Avko/XCXZw+NuxBSNhBAP13Hie418V7VMt9et1FMvpg== - "@eslint-community/eslint-utils@^4.2.0": version "4.4.0" resolved "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz" @@ -1991,7 +1616,7 @@ "@jridgewell/sourcemap-codec" "^1.4.10" "@jridgewell/trace-mapping" "^0.3.9" -"@jridgewell/resolve-uri@3.1.0": +"@jridgewell/resolve-uri@^3.0.3", "@jridgewell/resolve-uri@3.1.0": version "3.1.0" resolved "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz" integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== @@ -2009,16 +1634,16 @@ "@jridgewell/gen-mapping" "^0.3.0" "@jridgewell/trace-mapping" "^0.3.9" -"@jridgewell/sourcemap-codec@1.4.14": - version "1.4.14" - resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz" - integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== - "@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.13", "@jridgewell/sourcemap-codec@^1.4.14": version "1.4.15" resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz" integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== +"@jridgewell/sourcemap-codec@1.4.14": + version "1.4.14" + resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz" + integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== + "@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.9": version "0.3.18" resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz" @@ -2027,6 +1652,14 @@ "@jridgewell/resolve-uri" "3.1.0" "@jridgewell/sourcemap-codec" "1.4.14" +"@jridgewell/trace-mapping@0.3.9": + version "0.3.9" + resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz" + integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== + dependencies: + "@jridgewell/resolve-uri" "^3.0.3" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@kolkov/ngx-gallery@^2.0.1": version "2.0.1" resolved "https://registry.npmjs.org/@kolkov/ngx-gallery/-/ngx-gallery-2.0.1.tgz" @@ -2039,7 +1672,7 @@ resolved "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz" integrity sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A== -"@material-ui/core@^4.11.0": +"@material-ui/core@^4.0.0", "@material-ui/core@^4.11.0", "@material-ui/core@^4.12.1", "@material-ui/core@^4.7.2": version "4.12.4" resolved "https://registry.npmjs.org/@material-ui/core/-/core-4.12.4.tgz" integrity sha512-tr7xekNlM9LjA6pagJmL8QCgZXaubWUwkJnoYcMKd4gw/t4XiyvnTkjdGrUVicyB2BsdaAv1tvow45bPM4sSwQ== @@ -2057,7 +1690,7 @@ react-is "^16.8.0 || ^17.0.0" react-transition-group "^4.4.0" -"@material-ui/icons@^4.9.1": +"@material-ui/icons@^4.5.1", "@material-ui/icons@^4.9.1": version "4.11.3" resolved "https://registry.npmjs.org/@material-ui/icons/-/icons-4.11.3.tgz" integrity sha512-IKHlyx6LDh8n19vzwH5RtHIOHl9Tu90aAAxcbWME6kp4dmvODM3UvOHJeMIDzUbd4muuJKHmlNoBN+mDY4XkBA== @@ -2163,19 +1796,14 @@ dependencies: tslib "^2.0.0" -"@ngrx/store@^15.4.0": +"@ngrx/store@^15.4.0", "@ngrx/store@15.4.0": version "15.4.0" resolved "https://registry.npmjs.org/@ngrx/store/-/store-15.4.0.tgz" integrity sha512-OvCuNBHL8mAUnRTS6QSFm+IunspsYNu2cCwDovBNn7EGhxRuGihBeNoX47jCqWPHBFtokj4BlatDfpJ/yCh4xQ== dependencies: tslib "^2.0.0" -"@ngtools/webpack@14.2.11": - version "14.2.11" - resolved "https://registry.npmjs.org/@ngtools/webpack/-/webpack-14.2.11.tgz" - integrity sha512-4enbLFAp98uTgWYF6OFceQqLcfv2/0brIrNN4iWT9xe/Mh3zdCt+eH42zvNRsqo9WXNWRSLvnx8I924p83LNlw== - -"@ngtools/webpack@15.2.5", "@ngtools/webpack@^15.2.5": +"@ngtools/webpack@^15.2.5", "@ngtools/webpack@15.2.5": version "15.2.5" resolved "https://registry.npmjs.org/@ngtools/webpack/-/webpack-15.2.5.tgz" integrity sha512-wD6GY4xghVK+SQL0dy/M3saGx5pqi7+1VHEr+BBI7IUNYGSqPNzylKNxLBgQiTzfkzvbrZ6MhfaMNkhvSCYr5w== @@ -2236,7 +1864,7 @@ "@nodelib/fs.stat" "2.0.5" run-parallel "^1.1.9" -"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": +"@nodelib/fs.stat@^2.0.2", "@nodelib/fs.stat@2.0.5": version "2.0.5" resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz" integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== @@ -2407,15 +2035,6 @@ resolved "https://registry.npmjs.org/@scarf/scarf/-/scarf-1.1.1.tgz" integrity sha512-VGbKDbk1RFIaSmdVb0cNjjWJoRWRI/Weo23AjRCC2nryO0iAS8pzsToJfPVPtVs74WHw4L1UTADNdIYRLkirZQ== -"@schematics/angular@15.2.5": - version "15.2.5" - resolved "https://registry.npmjs.org/@schematics/angular/-/angular-15.2.5.tgz" - integrity sha512-YN0A5bzuqEmLdwbcQRop9TFj0QVxTC/XCL0K5DfDymVBS2j09NMyLLVc6TDOs+J/fMQr5EwiT149ikzqiUmAcw== - dependencies: - "@angular-devkit/core" "15.2.5" - "@angular-devkit/schematics" "15.2.5" - jsonc-parser "3.2.0" - "@schematics/angular@^12.2.17": version "12.2.18" resolved "https://registry.npmjs.org/@schematics/angular/-/angular-12.2.18.tgz" @@ -2425,6 +2044,15 @@ "@angular-devkit/schematics" "12.2.18" jsonc-parser "3.0.0" +"@schematics/angular@15.2.5": + version "15.2.5" + resolved "https://registry.npmjs.org/@schematics/angular/-/angular-15.2.5.tgz" + integrity sha512-YN0A5bzuqEmLdwbcQRop9TFj0QVxTC/XCL0K5DfDymVBS2j09NMyLLVc6TDOs+J/fMQr5EwiT149ikzqiUmAcw== + dependencies: + "@angular-devkit/core" "15.2.5" + "@angular-devkit/schematics" "15.2.5" + jsonc-parser "3.2.0" + "@sigstore/protobuf-specs@^0.1.0": version "0.1.0" resolved "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.1.0.tgz" @@ -2605,7 +2233,7 @@ resolved "https://registry.npmjs.org/@types/js-cookie/-/js-cookie-2.2.6.tgz" integrity sha512-+oY0FDTO2GYKEV0YPvSshGq9t7YozVkgvXLty7zogQNuCxBhT9/3INX9Q7H1aRZ4SUDRXAKlJuA4EA5nTt7SNw== -"@types/json-schema@*", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": +"@types/json-schema@*", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": version "7.0.11" resolved "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz" integrity sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ== @@ -2625,7 +2253,7 @@ resolved "https://registry.npmjs.org/@types/mime/-/mime-3.0.1.tgz" integrity sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA== -"@types/node@*", "@types/node@>=10.0.0", "@types/node@^14.14.31", "@types/node@^14.14.9": +"@types/node@*", "@types/node@^14.14.31", "@types/node@^14.14.9", "@types/node@>=10.0.0": version "14.18.42" resolved "https://registry.npmjs.org/@types/node/-/node-14.18.42.tgz" integrity sha512-xefu+RBie4xWlK8hwAzGh3npDz/4VhF6icY/shU+zv/1fNn+ZVG7T7CRwe9LId9sAYRPxI+59QBPuKL3WpyGRg== @@ -2667,7 +2295,7 @@ dependencies: "@types/react" "*" -"@types/react@*": +"@types/react@*", "@types/react@^16.8.6 || ^17.0.0": version "17.0.57" resolved "https://registry.npmjs.org/@types/react/-/react-17.0.57.tgz" integrity sha512-e4msYpu5QDxzNrXDHunU/VPyv2M1XemGG/p7kfCjUiPtlLDCWLGQfgAMng6YyisWYxZ09mYdQlmMnyS0NfZdEg== @@ -2749,7 +2377,7 @@ dependencies: "@types/node" "*" -"@typescript-eslint/eslint-plugin@^5.43.0": +"@typescript-eslint/eslint-plugin@^5.0.0", "@typescript-eslint/eslint-plugin@^5.43.0": version "5.58.0" resolved "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.58.0.tgz" integrity sha512-vxHvLhH0qgBd3/tW6/VccptSfc8FxPQIkmNTVLWcCOVqSBvqpnKkBTYrhcGlXfSnd78azwe+PsjYFj0X34/njA== @@ -2765,7 +2393,7 @@ semver "^7.3.7" tsutils "^3.21.0" -"@typescript-eslint/parser@^5.43.0": +"@typescript-eslint/parser@^5.0.0", "@typescript-eslint/parser@^5.43.0": version "5.58.0" resolved "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.58.0.tgz" integrity sha512-ixaM3gRtlfrKzP8N6lRhBbjTow1t6ztfBvQNGuRM8qH1bjFFXIJ35XY+FC0RRBKn3C6cT+7VW1y8tNm7DwPHDQ== @@ -2847,6 +2475,20 @@ semver "^7.3.7" tsutils "^3.21.0" +"@typescript-eslint/utils@^5.57.0", "@typescript-eslint/utils@5.58.0": + version "5.58.0" + resolved "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.58.0.tgz" + integrity sha512-gAmLOTFXMXOC+zP1fsqm3VceKSBQJNzV385Ok3+yzlavNHZoedajjS4UyS21gabJYcobuigQPs/z71A9MdJFqQ== + dependencies: + "@eslint-community/eslint-utils" "^4.2.0" + "@types/json-schema" "^7.0.9" + "@types/semver" "^7.3.12" + "@typescript-eslint/scope-manager" "5.58.0" + "@typescript-eslint/types" "5.58.0" + "@typescript-eslint/typescript-estree" "5.58.0" + eslint-scope "^5.1.1" + semver "^7.3.7" + "@typescript-eslint/utils@5.48.2": version "5.48.2" resolved "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.48.2.tgz" @@ -2861,20 +2503,6 @@ eslint-utils "^3.0.0" semver "^7.3.7" -"@typescript-eslint/utils@5.58.0", "@typescript-eslint/utils@^5.57.0": - version "5.58.0" - resolved "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.58.0.tgz" - integrity sha512-gAmLOTFXMXOC+zP1fsqm3VceKSBQJNzV385Ok3+yzlavNHZoedajjS4UyS21gabJYcobuigQPs/z71A9MdJFqQ== - dependencies: - "@eslint-community/eslint-utils" "^4.2.0" - "@types/json-schema" "^7.0.9" - "@types/semver" "^7.3.12" - "@typescript-eslint/scope-manager" "5.58.0" - "@typescript-eslint/types" "5.58.0" - "@typescript-eslint/typescript-estree" "5.58.0" - eslint-scope "^5.1.1" - semver "^7.3.7" - "@typescript-eslint/visitor-keys@5.48.2": version "5.48.2" resolved "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.48.2.tgz" @@ -3059,7 +2687,7 @@ abab@^2.0.3, abab@^2.0.5, abab@^2.0.6: resolved "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz" integrity sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA== -abbrev@1, abbrev@^1.0.0: +abbrev@^1.0.0, abbrev@1: version "1.1.1" resolved "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz" integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== @@ -3103,21 +2731,31 @@ acorn-walk@^7.1.1: resolved "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz" integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA== -acorn-walk@^8.0.0, acorn-walk@^8.0.2, acorn-walk@^8.1.1: +acorn-walk@^8.0.0: version "8.2.0" resolved "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz" integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== +acorn-walk@^8.0.2: + version "8.2.0" + resolved "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz" + integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== + +acorn-walk@^8.1.1: + version "8.2.0" + resolved "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz" + integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== + +"acorn@^6.0.0 || ^7.0.0 || ^8.0.0", acorn@^8, acorn@^8.0.4, acorn@^8.1.0, acorn@^8.2.4, acorn@^8.4.1, acorn@^8.5.0, acorn@^8.7.1, acorn@^8.8.0, acorn@^8.8.1: + version "8.8.2" + resolved "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz" + integrity sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw== + acorn@^7.1.1: version "7.4.1" resolved "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz" integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== -acorn@^8.0.4, acorn@^8.1.0, acorn@^8.2.4, acorn@^8.4.1, acorn@^8.5.0, acorn@^8.7.1, acorn@^8.8.0, acorn@^8.8.1: - version "8.8.2" - resolved "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz" - integrity sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw== - adjust-sourcemap-loader@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-4.0.0.tgz" @@ -3126,12 +2764,7 @@ adjust-sourcemap-loader@^4.0.0: loader-utils "^2.0.0" regex-parser "^2.2.11" -adm-zip@^0.5.2: - version "0.5.10" - resolved "https://registry.yarnpkg.com/adm-zip/-/adm-zip-0.5.10.tgz#4a51d5ab544b1f5ce51e1b9043139b639afff45b" - integrity sha512-x0HvcHqVJNTPk/Bw8JbLWlWoo6Wwnsug0fnYYro1HBrjxZ3G7/AZk7Ahv8JwDe1uIcz8eBqvu86FuF1POiG7vQ== - -agent-base@6, agent-base@^6.0.2: +agent-base@^6.0.2, agent-base@6: version "6.0.2" resolved "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz" integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== @@ -3155,6 +2788,13 @@ aggregate-error@^3.0.0: clean-stack "^2.0.0" indent-string "^4.0.0" +ajv-formats@^2.1.1, ajv-formats@2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz" + integrity sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA== + dependencies: + ajv "^8.0.0" + ajv-formats@2.1.0: version "2.1.0" resolved "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.0.tgz" @@ -3162,13 +2802,6 @@ ajv-formats@2.1.0: dependencies: ajv "^8.0.0" -ajv-formats@2.1.1, ajv-formats@^2.1.1: - version "2.1.1" - resolved "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz" - integrity sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA== - dependencies: - ajv "^8.0.0" - ajv-keywords@^3.5.2: version "3.5.2" resolved "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz" @@ -3181,27 +2814,17 @@ ajv-keywords@^5.0.0: dependencies: fast-deep-equal "^3.1.3" -ajv@8.11.0: - version "8.11.0" - resolved "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz" - integrity sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg== +ajv@^6.10.0, ajv@^6.12.4, ajv@^6.12.5, ajv@^6.9.1: + version "6.12.6" + resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== dependencies: fast-deep-equal "^3.1.1" - json-schema-traverse "^1.0.0" - require-from-string "^2.0.2" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" uri-js "^4.2.2" -ajv@8.12.0, ajv@^8.8.0: - version "8.12.0" - resolved "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz" - integrity sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA== - dependencies: - fast-deep-equal "^3.1.1" - json-schema-traverse "^1.0.0" - require-from-string "^2.0.2" - uri-js "^4.2.2" - -ajv@8.6.2, ajv@^8.0.0: +ajv@^8.0.0, ajv@8.6.2: version "8.6.2" resolved "https://registry.npmjs.org/ajv/-/ajv-8.6.2.tgz" integrity sha512-9807RlWAgT564wT+DjeyU5OFMPjmzxVobvDFmNAhY+5zD6A2ly3jDp6sgnfyDtlIQ+7H97oc/DGCzzfu9rjw9w== @@ -3211,14 +2834,24 @@ ajv@8.6.2, ajv@^8.0.0: require-from-string "^2.0.2" uri-js "^4.2.2" -ajv@^6.10.0, ajv@^6.12.3, ajv@^6.12.4, ajv@^6.12.5: - version "6.12.6" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" - integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== +ajv@^8.8.0, ajv@^8.8.2: + version "8.12.0" + resolved "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz" + integrity sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA== dependencies: fast-deep-equal "^3.1.1" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.4.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + uri-js "^4.2.2" + +ajv@8.12.0: + version "8.12.0" + resolved "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz" + integrity sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA== + dependencies: + fast-deep-equal "^3.1.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" uri-js "^4.2.2" angular-idle-preload@3.0.0: @@ -3233,7 +2866,7 @@ angulartics2@^12.0.0: dependencies: tslib "^2.3.0" -ansi-colors@4.1.3, ansi-colors@^4.1.1: +ansi-colors@^4.1.1, ansi-colors@4.1.3: version "4.1.3" resolved "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz" integrity sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw== @@ -3250,11 +2883,6 @@ ansi-html-community@^0.0.8: resolved "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz" integrity sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw== -ansi-regex@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" - integrity sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA== - ansi-regex@^3.0.0: version "3.0.1" resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz" @@ -3265,11 +2893,6 @@ ansi-regex@^5.0.1: resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz" integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== -ansi-styles@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" - integrity sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA== - ansi-styles@^3.2.1: version "3.2.1" resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz" @@ -3277,7 +2900,14 @@ ansi-styles@^3.2.1: dependencies: color-convert "^1.9.0" -ansi-styles@^4.0.0, ansi-styles@^4.1.0: +ansi-styles@^4.0.0: + version "4.3.0" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +ansi-styles@^4.1.0: version "4.3.0" resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== @@ -3342,16 +2972,16 @@ array-buffer-byte-length@^1.0.0: call-bind "^1.0.2" is-array-buffer "^3.0.1" -array-flatten@1.1.1: - version "1.1.1" - resolved "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz" - integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== - array-flatten@^2.1.2: version "2.1.2" resolved "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz" integrity sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ== +array-flatten@1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz" + integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== + array-includes@^3.1.6: version "3.1.6" resolved "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz" @@ -3363,23 +2993,11 @@ array-includes@^3.1.6: get-intrinsic "^1.1.3" is-string "^1.0.7" -array-union@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" - integrity sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng== - dependencies: - array-uniq "^1.0.1" - array-union@^2.1.0: version "2.1.0" resolved "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz" integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== -array-uniq@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" - integrity sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q== - array.prototype.flat@^1.3.1: version "1.3.1" resolved "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz" @@ -3400,11 +3018,6 @@ array.prototype.flatmap@^1.3.1: es-abstract "^1.20.4" es-shim-unscopables "^1.0.0" -arrify@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" - integrity sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA== - asn1@~0.2.3: version "0.2.6" resolved "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz" @@ -3412,7 +3025,7 @@ asn1@~0.2.3: dependencies: safer-buffer "~2.1.0" -assert-plus@1.0.0, assert-plus@^1.0.0: +assert-plus@^1.0.0, assert-plus@1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz" integrity sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw== @@ -3449,6 +3062,18 @@ at-least-node@^1.0.0: resolved "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz" integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== +autoprefixer@^10.4.13: + version "10.4.14" + resolved "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.14.tgz" + integrity sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ== + dependencies: + browserslist "^4.21.5" + caniuse-lite "^1.0.30001464" + fraction.js "^4.2.0" + normalize-range "^0.1.2" + picocolors "^1.0.0" + postcss-value-parser "^4.2.0" + autoprefixer@10.4.13: version "10.4.13" resolved "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.13.tgz" @@ -3461,18 +3086,6 @@ autoprefixer@10.4.13: picocolors "^1.0.0" postcss-value-parser "^4.2.0" -autoprefixer@^10.4.13, autoprefixer@^10.4.8: - version "10.4.14" - resolved "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.14.tgz" - integrity sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ== - dependencies: - browserslist "^4.21.5" - caniuse-lite "^1.0.30001464" - fraction.js "^4.2.0" - normalize-range "^0.1.2" - picocolors "^1.0.0" - postcss-value-parser "^4.2.0" - available-typed-arrays@^1.0.5: version "1.0.5" resolved "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz" @@ -3488,18 +3101,11 @@ aws4@^1.8.0: resolved "https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz" integrity sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg== -axe-core@^4.4.3: +"axe-core@^3 || ^4", axe-core@^4.4.3: version "4.6.3" resolved "https://registry.npmjs.org/axe-core/-/axe-core-4.6.3.tgz" integrity sha512-/BQzOX780JhsxDnPpH4ZiyrJAzcd8AfzFPkv+89veFSr1rcMjuq2JDCwypKaPeB6ljHp9KjXhPpjgCvQlWYuqg== -axios@0.21.4: - version "0.21.4" - resolved "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz" - integrity sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg== - dependencies: - follow-redirects "^1.14.0" - axios@^0.27.2: version "0.27.2" resolved "https://registry.npmjs.org/axios/-/axios-0.27.2.tgz" @@ -3508,6 +3114,13 @@ axios@^0.27.2: follow-redirects "^1.14.9" form-data "^4.0.0" +axios@0.21.4: + version "0.21.4" + resolved "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz" + integrity sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg== + dependencies: + follow-redirects "^1.14.0" + axobject-query@3.1.1: version "3.1.1" resolved "https://registry.npmjs.org/axobject-query/-/axobject-query-3.1.1.tgz" @@ -3515,16 +3128,6 @@ axobject-query@3.1.1: dependencies: deep-equal "^2.0.5" -babel-loader@8.2.5: - version "8.2.5" - resolved "https://registry.npmjs.org/babel-loader/-/babel-loader-8.2.5.tgz" - integrity sha512-OSiFfH89LrEMiWd4pLNqGz4CwJDtbs2ZVc+iGu2HrkRfPxId9F2anQj38IxWpmRfsUY0aBZYi1EFcd3mhtRMLQ== - dependencies: - find-cache-dir "^3.3.1" - loader-utils "^2.0.0" - make-dir "^3.1.0" - schema-utils "^2.6.5" - babel-loader@9.1.2: version "9.1.2" resolved "https://registry.npmjs.org/babel-loader/-/babel-loader-9.1.2.tgz" @@ -3544,7 +3147,7 @@ babel-plugin-istanbul@6.1.1: istanbul-lib-instrument "^5.0.4" test-exclude "^6.0.0" -babel-plugin-polyfill-corejs2@^0.3.2, babel-plugin-polyfill-corejs2@^0.3.3: +babel-plugin-polyfill-corejs2@^0.3.3: version "0.3.3" resolved "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.3.tgz" integrity sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q== @@ -3553,14 +3156,6 @@ babel-plugin-polyfill-corejs2@^0.3.2, babel-plugin-polyfill-corejs2@^0.3.3: "@babel/helper-define-polyfill-provider" "^0.3.3" semver "^6.1.1" -babel-plugin-polyfill-corejs3@^0.5.3: - version "0.5.3" - resolved "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.3.tgz" - integrity sha512-zKsXDh0XjnrUEW0mxIHLfjBfnXSMr5Q/goMe/fxpQnLm07mcOZiIZHBNWCMx60HmdvjxfXcalac0tfFg0wqxyw== - dependencies: - "@babel/helper-define-polyfill-provider" "^0.3.2" - core-js-compat "^3.21.0" - babel-plugin-polyfill-corejs3@^0.6.0: version "0.6.0" resolved "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.6.0.tgz" @@ -3569,7 +3164,7 @@ babel-plugin-polyfill-corejs3@^0.6.0: "@babel/helper-define-polyfill-provider" "^0.3.3" core-js-compat "^3.25.1" -babel-plugin-polyfill-regenerator@^0.4.0, babel-plugin-polyfill-regenerator@^0.4.1: +babel-plugin-polyfill-regenerator@^0.4.1: version "0.4.1" resolved "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.4.1.tgz" integrity sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw== @@ -3586,7 +3181,7 @@ base64-js@^1.2.0, base64-js@^1.3.1: resolved "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz" integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== -base64id@2.0.0, base64id@~2.0.0: +base64id@~2.0.0, base64id@2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz" integrity sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog== @@ -3653,7 +3248,7 @@ bluebird@^3.7.2: resolved "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz" integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== -body-parser@1.20.1, body-parser@^1.19.0: +body-parser@^1.19.0, body-parser@1.20.1: version "1.20.1" resolved "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz" integrity sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw== @@ -3686,7 +3281,7 @@ boolbase@^1.0.0: resolved "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz" integrity sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww== -bootstrap@^4.6.1: +bootstrap@^4.0.0, bootstrap@^4.6.1: version "4.6.2" resolved "https://registry.npmjs.org/bootstrap/-/bootstrap-4.6.2.tgz" integrity sha512-51Bbp/Uxr9aTuy6ca/8FbFloBUJZLHwnhTcnjIeRn2suQWsWzcuJhGjKDB5eppVte/8oCdOL3VuwxvZDUggwGQ== @@ -3777,7 +3372,7 @@ browser-sync@^2.27.10: ua-parser-js "^1.0.33" yargs "^17.3.1" -browserslist@4.21.5, browserslist@^4.14.5, browserslist@^4.21.3, browserslist@^4.21.4, browserslist@^4.21.5, browserslist@^4.9.1: +browserslist@^4.14.5, browserslist@^4.21.3, browserslist@^4.21.4, browserslist@^4.21.5, "browserslist@>= 4.21.0", browserslist@4.21.5: version "4.21.5" resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz" integrity sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w== @@ -3837,49 +3432,6 @@ bytesish@^0.4.1: resolved "https://registry.npmjs.org/bytesish/-/bytesish-0.4.4.tgz" integrity sha512-i4uu6M4zuMUiyfZN4RU2+i9+peJh//pXhd9x1oSe1LBkZ3LEbCoygu8W0bXTukU1Jme2txKuotpCZRaC3FLxcQ== -cacache@16.1.2: - version "16.1.2" - resolved "https://registry.npmjs.org/cacache/-/cacache-16.1.2.tgz" - integrity sha512-Xx+xPlfCZIUHagysjjOAje9nRo8pRDczQCcXb4J2O0BLtH+xeVue6ba4y1kfJfQMAnM2mkcoMIAyOctlaRGWYA== - dependencies: - "@npmcli/fs" "^2.1.0" - "@npmcli/move-file" "^2.0.0" - chownr "^2.0.0" - fs-minipass "^2.1.0" - glob "^8.0.1" - infer-owner "^1.0.4" - lru-cache "^7.7.1" - minipass "^3.1.6" - minipass-collect "^1.0.2" - minipass-flush "^1.0.5" - minipass-pipeline "^1.2.4" - mkdirp "^1.0.4" - p-map "^4.0.0" - promise-inflight "^1.0.1" - rimraf "^3.0.2" - ssri "^9.0.0" - tar "^6.1.11" - unique-filename "^1.1.1" - -cacache@17.0.4: - version "17.0.4" - resolved "https://registry.npmjs.org/cacache/-/cacache-17.0.4.tgz" - integrity sha512-Z/nL3gU+zTUjz5pCA5vVjYM8pmaw2kxM7JEiE0fv3w77Wj+sFbi70CrBruUWH0uNcEdvLDixFpgA2JM4F4DBjA== - dependencies: - "@npmcli/fs" "^3.1.0" - fs-minipass "^3.0.0" - glob "^8.0.1" - lru-cache "^7.7.1" - minipass "^4.0.0" - minipass-collect "^1.0.2" - minipass-flush "^1.0.5" - minipass-pipeline "^1.2.4" - p-map "^4.0.0" - promise-inflight "^1.0.1" - ssri "^10.0.0" - tar "^6.1.11" - unique-filename "^3.0.0" - cacache@^15.0.5: version "15.3.0" resolved "https://registry.npmjs.org/cacache/-/cacache-15.3.0.tgz" @@ -3947,6 +3499,25 @@ cacache@^17.0.0: tar "^6.1.11" unique-filename "^3.0.0" +cacache@17.0.4: + version "17.0.4" + resolved "https://registry.npmjs.org/cacache/-/cacache-17.0.4.tgz" + integrity sha512-Z/nL3gU+zTUjz5pCA5vVjYM8pmaw2kxM7JEiE0fv3w77Wj+sFbi70CrBruUWH0uNcEdvLDixFpgA2JM4F4DBjA== + dependencies: + "@npmcli/fs" "^3.1.0" + fs-minipass "^3.0.0" + glob "^8.0.1" + lru-cache "^7.7.1" + minipass "^4.0.0" + minipass-collect "^1.0.2" + minipass-flush "^1.0.5" + minipass-pipeline "^1.2.4" + p-map "^4.0.0" + promise-inflight "^1.0.1" + ssri "^10.0.0" + tar "^6.1.11" + unique-filename "^3.0.0" + cachedir@^2.3.0: version "2.3.0" resolved "https://registry.npmjs.org/cachedir/-/cachedir-2.3.0.tgz" @@ -3987,25 +3558,6 @@ cerialize@0.1.18: dependencies: typescript "^2.5.0" -chalk@4.1.2, chalk@^4.0.0, chalk@^4.0.2, chalk@^4.1.0, chalk@^4.1.1, chalk@~4.1.0: - version "4.1.2" - resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" - integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -chalk@^1.1.1: - version "1.1.3" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" - integrity sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A== - dependencies: - ansi-styles "^2.2.1" - escape-string-regexp "^1.0.2" - has-ansi "^2.0.0" - strip-ansi "^3.0.0" - supports-color "^2.0.0" - chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.4.1: version "2.4.2" resolved "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz" @@ -4015,6 +3567,54 @@ chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.4.1: escape-string-regexp "^1.0.5" supports-color "^5.3.0" +chalk@^4.0.0: + version "4.1.2" + resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +chalk@^4.0.2: + version "4.1.2" + resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +chalk@^4.1.0: + version "4.1.2" + resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +chalk@^4.1.1: + version "4.1.2" + resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +chalk@~4.1.0: + version "4.1.2" + resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +chalk@4.1.2: + version "4.1.2" + resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + chardet@^0.7.0: version "0.7.0" resolved "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz" @@ -4054,7 +3654,7 @@ cheerio@1.0.0-rc.10: parse5-htmlparser2-tree-adapter "^6.0.1" tslib "^2.2.0" -chokidar@3.5.3, "chokidar@>=3.0.0 <4.0.0", chokidar@^3.0.0, chokidar@^3.5.1, chokidar@^3.5.2, chokidar@^3.5.3: +chokidar@^3.0.0, chokidar@^3.5.1, chokidar@^3.5.2, chokidar@^3.5.3, "chokidar@>=3.0.0 <4.0.0", chokidar@3.5.3: version "3.5.3" resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz" integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== @@ -4191,16 +3791,16 @@ color-convert@^2.0.1: dependencies: color-name "~1.1.4" -color-name@1.1.3: - version "1.1.3" - resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" - integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== - color-name@~1.1.4: version "1.1.4" resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" + integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== + color-support@^1.1.3: version "1.1.3" resolved "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz" @@ -4223,12 +3823,12 @@ combined-stream@^1.0.6, combined-stream@^1.0.8, combined-stream@~1.0.6: dependencies: delayed-stream "~1.0.0" -commander@9.2.0: - version "9.2.0" - resolved "https://registry.npmjs.org/commander/-/commander-9.2.0.tgz" - integrity sha512-e2i4wANQiSXgnrBlIatyHtP1odfUp0BbV5Y5nEGbxtIrStkEOAAzCUirvLBNXHLr7kwLvJl6V+4V3XV9x7Wd9w== +commander@^2.2.0: + version "2.20.3" + resolved "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz" + integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== -commander@^2.2.0, commander@^2.20.0: +commander@^2.20.0: version "2.20.3" resolved "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz" integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== @@ -4243,11 +3843,21 @@ commander@^6.1.0: resolved "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz" integrity sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA== -commander@^7.0.0, commander@^7.2.0: +commander@^7.0.0: version "7.2.0" resolved "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz" integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== +commander@^7.2.0: + version "7.2.0" + resolved "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz" + integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== + +commander@9.2.0: + version "9.2.0" + resolved "https://registry.npmjs.org/commander/-/commander-9.2.0.tgz" + integrity sha512-e2i4wANQiSXgnrBlIatyHtP1odfUp0BbV5Y5nEGbxtIrStkEOAAzCUirvLBNXHLr7kwLvJl6V+4V3XV9x7Wd9w== + comment-parser@1.3.1: version "1.3.1" resolved "https://registry.npmjs.org/comment-parser/-/comment-parser-1.3.1.tgz" @@ -4306,16 +3916,6 @@ connect-history-api-fallback@^2.0.0: resolved "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz" integrity sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA== -connect@3.6.6: - version "3.6.6" - resolved "https://registry.npmjs.org/connect/-/connect-3.6.6.tgz" - integrity sha512-OO7axMmPpu/2XuX1+2Yrg0ddju31B6xLZMWkJ5rYBu4YRmRVlOjvlY6kw2FJKiAzyxGwnrDUAG4s1Pf0sbBMCQ== - dependencies: - debug "2.6.9" - finalhandler "1.1.0" - parseurl "~1.3.2" - utils-merge "1.0.1" - connect@^3.7.0: version "3.7.0" resolved "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz" @@ -4326,6 +3926,16 @@ connect@^3.7.0: parseurl "~1.3.3" utils-merge "1.0.1" +connect@3.6.6: + version "3.6.6" + resolved "https://registry.npmjs.org/connect/-/connect-3.6.6.tgz" + integrity sha512-OO7axMmPpu/2XuX1+2Yrg0ddju31B6xLZMWkJ5rYBu4YRmRVlOjvlY6kw2FJKiAzyxGwnrDUAG4s1Pf0sbBMCQ== + dependencies: + debug "2.6.9" + finalhandler "1.1.0" + parseurl "~1.3.2" + utils-merge "1.0.1" + console-control-strings@^1.1.0: version "1.1.0" resolved "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz" @@ -4361,6 +3971,11 @@ cookie-signature@1.0.6: resolved "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz" integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ== +cookie@~0.4.1: + version "0.4.2" + resolved "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz" + integrity sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA== + cookie@0.4.0: version "0.4.0" resolved "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz" @@ -4371,11 +3986,6 @@ cookie@0.5.0: resolved "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz" integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw== -cookie@~0.4.1: - version "0.4.2" - resolved "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz" - integrity sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA== - copy-anything@^2.0.1: version "2.0.6" resolved "https://registry.npmjs.org/copy-anything/-/copy-anything-2.0.6.tgz" @@ -4390,18 +4000,6 @@ copy-to-clipboard@^3.3.1: dependencies: toggle-selection "^1.0.6" -copy-webpack-plugin@11.0.0: - version "11.0.0" - resolved "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-11.0.0.tgz" - integrity sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ== - dependencies: - fast-glob "^3.2.11" - glob-parent "^6.0.1" - globby "^13.1.1" - normalize-path "^3.0.0" - schema-utils "^4.0.0" - serialize-javascript "^6.0.0" - copy-webpack-plugin@^6.4.1: version "6.4.1" resolved "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-6.4.1.tgz" @@ -4419,28 +4017,40 @@ copy-webpack-plugin@^6.4.1: serialize-javascript "^5.0.1" webpack-sources "^1.4.3" -core-js-compat@^3.21.0, core-js-compat@^3.22.1, core-js-compat@^3.25.1: +copy-webpack-plugin@11.0.0: + version "11.0.0" + resolved "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-11.0.0.tgz" + integrity sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ== + dependencies: + fast-glob "^3.2.11" + glob-parent "^6.0.1" + globby "^13.1.1" + normalize-path "^3.0.0" + schema-utils "^4.0.0" + serialize-javascript "^6.0.0" + +core-js-compat@^3.25.1: version "3.30.0" resolved "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.30.0.tgz" integrity sha512-P5A2h/9mRYZFIAP+5Ab8ns6083IyVpSclU74UNvbGVQ8VM7n3n3/g2yF3AkKQ9NXz2O+ioxLbEWKnDtgsFamhg== dependencies: browserslist "^4.21.5" -core-js@^3.7.0: +core-js@^3.7.0, core-js@^3.8.1: version "3.30.0" resolved "https://registry.npmjs.org/core-js/-/core-js-3.30.0.tgz" integrity sha512-hQotSSARoNh1mYPi9O2YaWeiq/cEB95kOrFb4NCrO4RIFt1qqNpKsaE+vy/L3oiqvND5cThqXzUU3r9F7Efztg== -core-util-is@1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz" - integrity sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ== - core-util-is@~1.0.0: version "1.0.3" resolved "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz" integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== +core-util-is@1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz" + integrity sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ== + cors@~2.8.5: version "2.8.5" resolved "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz" @@ -4519,20 +4129,6 @@ css-has-pseudo@^3.0.4: dependencies: postcss-selector-parser "^6.0.9" -css-loader@6.7.1: - version "6.7.1" - resolved "https://registry.npmjs.org/css-loader/-/css-loader-6.7.1.tgz" - integrity sha512-yB5CNFa14MbPJcomwNh3wLThtkZgcNyI2bNMRt8iE5Z8Vwl7f8vQXFAzn2HDOJvtDq2NTZBUGMSUNNyrv3/+cw== - dependencies: - icss-utils "^5.1.0" - postcss "^8.4.7" - postcss-modules-extract-imports "^3.0.0" - postcss-modules-local-by-default "^4.0.0" - postcss-modules-scope "^3.0.0" - postcss-modules-values "^4.0.0" - postcss-value-parser "^4.2.0" - semver "^7.3.5" - css-loader@6.7.3: version "6.7.3" resolved "https://registry.npmjs.org/css-loader/-/css-loader-6.7.3.tgz" @@ -4576,7 +4172,7 @@ css-what@^6.0.1: resolved "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz" integrity sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw== -cssdb@^7.0.0, cssdb@^7.1.0: +cssdb@^7.1.0: version "7.5.4" resolved "https://registry.npmjs.org/cssdb/-/cssdb-7.5.4.tgz" integrity sha512-fGD+J6Jlq+aurfE1VDXlLS4Pt0VtNlu2+YgfGOdMxRyl/HQ9bDiHTwSck1Yz8A97Dt/82izSK6Bp/4nVqacOsg== @@ -4628,7 +4224,7 @@ cypress-axe@^1.1.0: resolved "https://registry.npmjs.org/cypress-axe/-/cypress-axe-1.4.0.tgz" integrity sha512-Ut7NKfzjyKm0BEbt2WxuKtLkIXmx6FD2j0RwdvO/Ykl7GmB/qRQkwbKLk3VP35+83hiIr8GKD04PDdrTK5BnyA== -cypress@12.9.0: +"cypress@^10 || ^11 || ^12", cypress@12.9.0: version "12.9.0" resolved "https://registry.npmjs.org/cypress/-/cypress-12.9.0.tgz" integrity sha512-Ofe09LbHKgSqX89Iy1xen2WvpgbvNxDzsWx3mgU1mfILouELeXYGwIib3ItCwoRrRifoQwcBFmY54Vs0zw7QCg== @@ -4706,7 +4302,7 @@ date-fns-tz@^1.3.7: resolved "https://registry.npmjs.org/date-fns-tz/-/date-fns-tz-1.3.8.tgz" integrity sha512-qwNXUFtMHTTU6CFSFjoJ80W8Fzzp24LntbjFFBgL/faqds4e5mo9mftoRLgr3Vi1trISsg4awSpYVsOQCRnapQ== -date-fns@^2.29.3: +date-fns@^2.29.3, date-fns@>=2.0.0: version "2.29.3" resolved "https://registry.npmjs.org/date-fns/-/date-fns-2.29.3.tgz" integrity sha512-dDCnyH2WnnKusqvZZ6+jA1O51Ibt8ZMRNkDZdyAyK4YfbDwa/cEmuztzG5pk6hqlp9aSBPYcjOlktquahGwGeA== @@ -4721,20 +4317,48 @@ dayjs@^1.10.4: resolved "https://registry.npmjs.org/dayjs/-/dayjs-1.11.7.tgz" integrity sha512-+Yw9U6YO5TQohxLcIkrXBeY73WP3ejHWVvx8XCk3gxvQDCTEmS48ZrSZCKciI7Bhl/uCMyxYtE9UqRILmFphkQ== -debug@2.6.9, debug@^2.2.0: +debug@^2.2.0: version "2.6.9" resolved "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz" integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== dependencies: ms "2.0.0" -debug@4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.2, debug@^4.3.3, debug@^4.3.4, debug@~4.3.1, debug@~4.3.2: +debug@^3.1.0: + version "3.2.7" + resolved "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz" + integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== + dependencies: + ms "^2.1.1" + +debug@^3.2.6: + version "3.2.7" + resolved "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz" + integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== + dependencies: + ms "^2.1.1" + +debug@^3.2.7: + version "3.2.7" + resolved "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz" + integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== + dependencies: + ms "^2.1.1" + +debug@^4.1.0, debug@^4.1.1, debug@^4.3.2, debug@^4.3.3, debug@^4.3.4, debug@~4.3.1, debug@~4.3.2, debug@4: version "4.3.4" resolved "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz" integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== dependencies: ms "2.1.2" +debug@2.6.9: + version "2.6.9" + resolved "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + debug@4.3.2: version "4.3.2" resolved "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz" @@ -4742,13 +4366,6 @@ debug@4.3.2: dependencies: ms "2.1.2" -debug@^3.1.0, debug@^3.2.6, debug@^3.2.7: - version "3.2.7" - resolved "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz" - integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== - dependencies: - ms "^2.1.1" - decimal.js@^10.2.1, decimal.js@^10.4.2: version "10.4.3" resolved "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz" @@ -4819,19 +4436,6 @@ define-properties@^1.1.3, define-properties@^1.1.4: has-property-descriptors "^1.0.0" object-keys "^1.1.1" -del@^2.2.0: - version "2.2.2" - resolved "https://registry.yarnpkg.com/del/-/del-2.2.2.tgz#c12c981d067846c84bcaf862cff930d907ffd1a8" - integrity sha512-Z4fzpbIRjOu7lO5jCETSWoqUDVe0IPOlfugBsF6suen2LKDlVb4QZpKEM9P+buNJ4KI1eN7I083w/pbKUpsrWQ== - dependencies: - globby "^5.0.0" - is-path-cwd "^1.0.0" - is-path-in-cwd "^1.0.0" - object-assign "^4.0.1" - pify "^2.0.0" - pinkie-promise "^2.0.0" - rimraf "^2.2.8" - delayed-stream@~1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz" @@ -4842,7 +4446,7 @@ delegates@^1.0.0: resolved "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz" integrity sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ== -depd@2.0.0, depd@^2.0.0, depd@~2.0.0: +depd@^2.0.0, depd@~2.0.0, depd@2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz" integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== @@ -4857,16 +4461,16 @@ dependency-graph@^0.11.0: resolved "https://registry.npmjs.org/dependency-graph/-/dependency-graph-0.11.0.tgz" integrity sha512-JeMq7fEshyepOWDfcfHK06N3MhyPhz++vtqWhMT5O9A3K42rdsEDpfdVqjaqaAhsw6a+ZqeDvQVtD0hFHQWrzg== -destroy@1.2.0: - version "1.2.0" - resolved "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz" - integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== - destroy@~1.0.4: version "1.0.4" resolved "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz" integrity sha512-3NdhDuEXnfun/z7x9GOElY49LoqVHoGScmOKwmxhsS8N5Y+Z8KyPPDnaSzqWgYt/ji4mqwfTS34Htrk0zPIXVg== +destroy@1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz" + integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== + detect-node@^2.0.4: version "2.1.0" resolved "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz" @@ -5104,7 +4708,7 @@ encodeurl@~1.0.1, encodeurl@~1.0.2: resolved "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz" integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== -encoding@^0.1.13: +encoding@^0.1.0, encoding@^0.1.13: version "0.1.13" resolved "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz" integrity sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A== @@ -5158,7 +4762,7 @@ enhanced-resolve@^5.10.0: graceful-fs "^4.2.4" tapable "^2.2.0" -enquirer@^2.3.6: +enquirer@^2.3.6, "enquirer@>= 2.3.0 < 3": version "2.3.6" resolved "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz" integrity sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg== @@ -5311,143 +4915,11 @@ es6-promisify@^6.0.0: resolved "https://registry.npmjs.org/es6-promisify/-/es6-promisify-6.1.1.tgz" integrity sha512-HBL8I3mIki5C1Cc9QjKUenHtnG0A5/xA8Q/AllRcfiwl2CZFXGK7ddBiCoRwAix4i2KxcQfjtIVcrVbB3vbmwg== -esbuild-android-64@0.15.5: - version "0.15.5" - resolved "https://registry.yarnpkg.com/esbuild-android-64/-/esbuild-android-64-0.15.5.tgz#3c7b2f2a59017dab3f2c0356188a8dd9cbdc91c8" - integrity sha512-dYPPkiGNskvZqmIK29OPxolyY3tp+c47+Fsc2WYSOVjEPWNCHNyqhtFqQadcXMJDQt8eN0NMDukbyQgFcHquXg== - -esbuild-android-arm64@0.15.5: - version "0.15.5" - resolved "https://registry.yarnpkg.com/esbuild-android-arm64/-/esbuild-android-arm64-0.15.5.tgz#e301db818c5a67b786bf3bb7320e414ac0fcf193" - integrity sha512-YyEkaQl08ze3cBzI/4Cm1S+rVh8HMOpCdq8B78JLbNFHhzi4NixVN93xDrHZLztlocEYqi45rHHCgA8kZFidFg== - -esbuild-darwin-64@0.15.5: - version "0.15.5" - resolved "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.15.5.tgz" - integrity sha512-Cr0iIqnWKx3ZTvDUAzG0H/u9dWjLE4c2gTtRLz4pqOBGjfjqdcZSfAObFzKTInLLSmD0ZV1I/mshhPoYSBMMCQ== - -esbuild-darwin-arm64@0.15.5: - version "0.15.5" - resolved "https://registry.yarnpkg.com/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.5.tgz#ad89dafebb3613fd374f5a245bb0ce4132413997" - integrity sha512-WIfQkocGtFrz7vCu44ypY5YmiFXpsxvz2xqwe688jFfSVCnUsCn2qkEVDo7gT8EpsLOz1J/OmqjExePL1dr1Kg== - -esbuild-freebsd-64@0.15.5: - version "0.15.5" - resolved "https://registry.yarnpkg.com/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.5.tgz#6bfb52b4a0d29c965aa833e04126e95173289c8a" - integrity sha512-M5/EfzV2RsMd/wqwR18CELcenZ8+fFxQAAEO7TJKDmP3knhWSbD72ILzrXFMMwshlPAS1ShCZ90jsxkm+8FlaA== - -esbuild-freebsd-arm64@0.15.5: - version "0.15.5" - resolved "https://registry.yarnpkg.com/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.5.tgz#38a3fed8c6398072f9914856c7c3e3444f9ef4dd" - integrity sha512-2JQQ5Qs9J0440F/n/aUBNvY6lTo4XP/4lt1TwDfHuo0DY3w5++anw+jTjfouLzbJmFFiwmX7SmUhMnysocx96w== - -esbuild-linux-32@0.15.5: - version "0.15.5" - resolved "https://registry.yarnpkg.com/esbuild-linux-32/-/esbuild-linux-32-0.15.5.tgz#942dc70127f0c0a7ea91111baf2806e61fc81b32" - integrity sha512-gO9vNnIN0FTUGjvTFucIXtBSr1Woymmx/aHQtuU+2OllGU6YFLs99960UD4Dib1kFovVgs59MTXwpFdVoSMZoQ== - -esbuild-linux-64@0.15.5: - version "0.15.5" - resolved "https://registry.yarnpkg.com/esbuild-linux-64/-/esbuild-linux-64-0.15.5.tgz#6d748564492d5daaa7e62420862c31ac3a44aed9" - integrity sha512-ne0GFdNLsm4veXbTnYAWjbx3shpNKZJUd6XpNbKNUZaNllDZfYQt0/zRqOg0sc7O8GQ+PjSMv9IpIEULXVTVmg== - -esbuild-linux-arm64@0.15.5: - version "0.15.5" - resolved "https://registry.yarnpkg.com/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.5.tgz#28cd899beb2d2b0a3870fd44f4526835089a318d" - integrity sha512-7EgFyP2zjO065XTfdCxiXVEk+f83RQ1JsryN1X/VSX2li9rnHAt2swRbpoz5Vlrl6qjHrCmq5b6yxD13z6RheA== - -esbuild-linux-arm@0.15.5: - version "0.15.5" - resolved "https://registry.yarnpkg.com/esbuild-linux-arm/-/esbuild-linux-arm-0.15.5.tgz#6441c256225564d8794fdef5b0a69bc1a43051b5" - integrity sha512-wvAoHEN+gJ/22gnvhZnS/+2H14HyAxM07m59RSLn3iXrQsdS518jnEWRBnJz3fR6BJa+VUTo0NxYjGaNt7RA7Q== - -esbuild-linux-mips64le@0.15.5: - version "0.15.5" - resolved "https://registry.yarnpkg.com/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.5.tgz#d4927f817290eaffc062446896b2a553f0e11981" - integrity sha512-KdnSkHxWrJ6Y40ABu+ipTZeRhFtc8dowGyFsZY5prsmMSr1ZTG9zQawguN4/tunJ0wy3+kD54GaGwdcpwWAvZQ== - -esbuild-linux-ppc64le@0.15.5: - version "0.15.5" - resolved "https://registry.yarnpkg.com/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.5.tgz#b6d660dc6d5295f89ac51c675f1a2f639e2fb474" - integrity sha512-QdRHGeZ2ykl5P0KRmfGBZIHmqcwIsUKWmmpZTOq573jRWwmpfRmS7xOhmDHBj9pxv+6qRMH8tLr2fe+ZKQvCYw== - -esbuild-linux-riscv64@0.15.5: - version "0.15.5" - resolved "https://registry.yarnpkg.com/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.5.tgz#2801bf18414dc3d3ad58d1ea83084f00d9d84896" - integrity sha512-p+WE6RX+jNILsf+exR29DwgV6B73khEQV0qWUbzxaycxawZ8NE0wA6HnnTxbiw5f4Gx9sJDUBemh9v49lKOORA== - -esbuild-linux-s390x@0.15.5: - version "0.15.5" - resolved "https://registry.yarnpkg.com/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.5.tgz#12a634ae6d3384cacc2b8f4201047deafe596eae" - integrity sha512-J2ngOB4cNzmqLHh6TYMM/ips8aoZIuzxJnDdWutBw5482jGXiOzsPoEF4j2WJ2mGnm7FBCO4StGcwzOgic70JQ== - -esbuild-netbsd-64@0.15.5: - version "0.15.5" - resolved "https://registry.yarnpkg.com/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.5.tgz#951bbf87600512dfcfbe3b8d9d117d684d26c1b8" - integrity sha512-MmKUYGDizYjFia0Rwt8oOgmiFH7zaYlsoQ3tIOfPxOqLssAsEgG0MUdRDm5lliqjiuoog8LyDu9srQk5YwWF3w== - -esbuild-openbsd-64@0.15.5: - version "0.15.5" - resolved "https://registry.yarnpkg.com/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.5.tgz#26705b61961d525d79a772232e8b8f211fdbb035" - integrity sha512-2mMFfkLk3oPWfopA9Plj4hyhqHNuGyp5KQyTT9Rc8hFd8wAn5ZrbJg+gNcLMo2yzf8Uiu0RT6G9B15YN9WQyMA== - -esbuild-sunos-64@0.15.5: - version "0.15.5" - resolved "https://registry.yarnpkg.com/esbuild-sunos-64/-/esbuild-sunos-64-0.15.5.tgz#d794da1ae60e6e2f6194c44d7b3c66bf66c7a141" - integrity sha512-2sIzhMUfLNoD+rdmV6AacilCHSxZIoGAU2oT7XmJ0lXcZWnCvCtObvO6D4puxX9YRE97GodciRGDLBaiC6x1SA== - -esbuild-wasm@0.15.5: - version "0.15.5" - resolved "https://registry.npmjs.org/esbuild-wasm/-/esbuild-wasm-0.15.5.tgz" - integrity sha512-lTJOEKekN/4JI/eOEq0wLcx53co2N6vaT/XjBz46D1tvIVoUEyM0o2K6txW6gEotf31szFD/J1PbxmnbkGlK9A== - esbuild-wasm@0.17.8: version "0.17.8" resolved "https://registry.npmjs.org/esbuild-wasm/-/esbuild-wasm-0.17.8.tgz" integrity sha512-zCmpxv95E0FuCmvdw1K836UHnj4EdiQnFfjTby35y3LAjRPtXMj3sbHDRHjbD8Mqg5lTwq3knacr/1qIFU51CQ== -esbuild-windows-32@0.15.5: - version "0.15.5" - resolved "https://registry.yarnpkg.com/esbuild-windows-32/-/esbuild-windows-32-0.15.5.tgz#0670326903f421424be86bc03b7f7b3ff86a9db7" - integrity sha512-e+duNED9UBop7Vnlap6XKedA/53lIi12xv2ebeNS4gFmu7aKyTrok7DPIZyU5w/ftHD4MUDs5PJUkQPP9xJRzg== - -esbuild-windows-64@0.15.5: - version "0.15.5" - resolved "https://registry.yarnpkg.com/esbuild-windows-64/-/esbuild-windows-64-0.15.5.tgz#64f32acb7341f3f0a4d10e8ff1998c2d1ebfc0a9" - integrity sha512-v+PjvNtSASHOjPDMIai9Yi+aP+Vwox+3WVdg2JB8N9aivJ7lyhp4NVU+J0MV2OkWFPnVO8AE/7xH+72ibUUEnw== - -esbuild-windows-arm64@0.15.5: - version "0.15.5" - resolved "https://registry.yarnpkg.com/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.5.tgz#4fe7f333ce22a922906b10233c62171673a3854b" - integrity sha512-Yz8w/D8CUPYstvVQujByu6mlf48lKmXkq6bkeSZZxTA626efQOJb26aDGLzmFWx6eg/FwrXgt6SZs9V8Pwy/aA== - -esbuild@0.15.5: - version "0.15.5" - resolved "https://registry.npmjs.org/esbuild/-/esbuild-0.15.5.tgz" - integrity sha512-VSf6S1QVqvxfIsSKb3UKr3VhUCis7wgDbtF4Vd9z84UJr05/Sp2fRKmzC+CSPG/dNAPPJZ0BTBLTT1Fhd6N9Gg== - optionalDependencies: - "@esbuild/linux-loong64" "0.15.5" - esbuild-android-64 "0.15.5" - esbuild-android-arm64 "0.15.5" - esbuild-darwin-64 "0.15.5" - esbuild-darwin-arm64 "0.15.5" - esbuild-freebsd-64 "0.15.5" - esbuild-freebsd-arm64 "0.15.5" - esbuild-linux-32 "0.15.5" - esbuild-linux-64 "0.15.5" - esbuild-linux-arm "0.15.5" - esbuild-linux-arm64 "0.15.5" - esbuild-linux-mips64le "0.15.5" - esbuild-linux-ppc64le "0.15.5" - esbuild-linux-riscv64 "0.15.5" - esbuild-linux-s390x "0.15.5" - esbuild-netbsd-64 "0.15.5" - esbuild-openbsd-64 "0.15.5" - esbuild-sunos-64 "0.15.5" - esbuild-windows-32 "0.15.5" - esbuild-windows-64 "0.15.5" - esbuild-windows-arm64 "0.15.5" - esbuild@0.17.8: version "0.17.8" resolved "https://registry.npmjs.org/esbuild/-/esbuild-0.17.8.tgz" @@ -5491,9 +4963,9 @@ escape-html@~1.0.3: resolved "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz" integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== -escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: +escape-string-regexp@^1.0.5: version "1.0.5" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== escape-string-regexp@^4.0.0: @@ -5591,7 +5063,7 @@ eslint-rule-composer@^0.3.0: resolved "https://registry.npmjs.org/eslint-rule-composer/-/eslint-rule-composer-0.3.0.tgz" integrity sha512-bt+Sh8CtDmn2OajxvNO+BX7Wn4CIWMpTRm3MaiKPCQcnnlm0CS2mhui6QaoeQugs+3Kj2ESKEEGJUdVafwhiCg== -eslint-scope@5.1.1, eslint-scope@^5.1.1: +eslint-scope@^5.1.1, eslint-scope@5.1.1: version "5.1.1" resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz" integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== @@ -5599,7 +5071,15 @@ eslint-scope@5.1.1, eslint-scope@^5.1.1: esrecurse "^4.3.0" estraverse "^4.1.1" -eslint-scope@^7.0.0, eslint-scope@^7.1.1: +eslint-scope@^7.0.0: + version "7.1.1" + resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz" + integrity sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw== + dependencies: + esrecurse "^4.3.0" + estraverse "^5.2.0" + +eslint-scope@^7.1.1: version "7.1.1" resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz" integrity sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw== @@ -5624,7 +5104,7 @@ eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.0: resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.0.tgz" integrity sha512-HPpKPUBQcAsZOsHAFwTtIKcYlCje62XB7SEAcxjtmW6TD1WVpkS6i6/hOVtTZIl4zGj/mBqpFVGvaDneik+VoQ== -eslint@^8.28.0: +eslint@*, "eslint@^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8", "eslint@^6.0.0 || ^7.0.0 || ^8.0.0", "eslint@^6.0.0 || ^7.0.0 || >=8.0.0", "eslint@^7.0.0 || ^8.0.0", "eslint@^7.20.0 || ^8.0.0", eslint@^8.0.0, eslint@^8.28.0, eslint@>=2, eslint@>=5: version "8.38.0" resolved "https://registry.npmjs.org/eslint/-/eslint-8.38.0.tgz" integrity sha512-pIdsD2jwlUGf/U38Jv97t8lq6HpaU/G9NKbYmpWpZGw3LdTNhZLbJePqxOXGB5+JEKfOPU/XLxYxFh03nr1KTg== @@ -5718,7 +5198,7 @@ esutils@^2.0.2: resolved "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz" integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== -etag@1.8.1, etag@^1.8.1, etag@~1.8.1: +etag@^1.8.1, etag@~1.8.1, etag@1.8.1: version "1.8.1" resolved "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz" integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== @@ -5743,21 +5223,6 @@ events@^3.2.0: resolved "https://registry.npmjs.org/events/-/events-3.3.0.tgz" integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== -execa@4.1.0: - version "4.1.0" - resolved "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz" - integrity sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA== - dependencies: - cross-spawn "^7.0.0" - get-stream "^5.0.0" - human-signals "^1.1.1" - is-stream "^2.0.0" - merge-stream "^2.0.0" - npm-run-path "^4.0.0" - onetime "^5.1.0" - signal-exit "^3.0.2" - strip-final-newline "^2.0.0" - execa@^5.0.0: version "5.1.1" resolved "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz" @@ -5773,6 +5238,21 @@ execa@^5.0.0: signal-exit "^3.0.3" strip-final-newline "^2.0.0" +execa@4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz" + integrity sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA== + dependencies: + cross-spawn "^7.0.0" + get-stream "^5.0.0" + human-signals "^1.1.1" + is-stream "^2.0.0" + merge-stream "^2.0.0" + npm-run-path "^4.0.0" + onetime "^5.1.0" + signal-exit "^3.0.2" + strip-final-newline "^2.0.0" + executable@^4.1.1: version "4.1.1" resolved "https://registry.npmjs.org/executable/-/executable-4.1.1.tgz" @@ -5792,7 +5272,7 @@ express-static-gzip@^2.1.5: dependencies: serve-static "^1.14.1" -express@^4.17.1, express@^4.17.3, express@^4.18.2: +express@^4.15.2, express@^4.17.1, express@^4.17.3, express@^4.18.2: version "4.18.2" resolved "https://registry.npmjs.org/express/-/express-4.18.2.tgz" integrity sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ== @@ -5854,7 +5334,7 @@ extract-zip@2.0.1: optionalDependencies: "@types/yauzl" "^2.9.1" -extsprintf@1.3.0, extsprintf@^1.2.0: +extsprintf@^1.2.0, extsprintf@1.3.0: version "1.3.0" resolved "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz" integrity sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g== @@ -5880,7 +5360,7 @@ fast-json-patch@^3.0.0-1: resolved "https://registry.npmjs.org/fast-json-patch/-/fast-json-patch-3.1.1.tgz" integrity sha512-vf6IHUX2SBcA+5/+4883dsIjpBTqmfBjmYiWK1savxQmFk4JfBMLa7ynTYOs1Rolp/T1betJxHiGD3g1Mn8lUQ== -fast-json-stable-stringify@2.1.0, fast-json-stable-stringify@^2.0.0: +fast-json-stable-stringify@^2.0.0, fast-json-stable-stringify@2.1.0: version "2.1.0" resolved "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz" integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== @@ -6085,20 +5565,11 @@ fraction.js@^4.2.0: resolved "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz" integrity sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA== -fresh@0.5.2, fresh@^0.5.2: +fresh@^0.5.2, fresh@0.5.2: version "0.5.2" resolved "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz" integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== -fs-extra@3.0.1: - version "3.0.1" - resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-3.0.1.tgz" - integrity sha512-V3Z3WZWVUYd8hoCL5xfXJCaHWYzmtwW5XWYSlLgERi8PWd8bx1kUHUk8L1BT57e49oKnDDD180mjfrHc1yA9rg== - dependencies: - graceful-fs "^4.1.2" - jsonfile "^3.0.0" - universalify "^0.1.0" - fs-extra@^8.1.0: version "8.1.0" resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz" @@ -6118,6 +5589,15 @@ fs-extra@^9.1.0: jsonfile "^6.0.1" universalify "^2.0.0" +fs-extra@3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-3.0.1.tgz" + integrity sha512-V3Z3WZWVUYd8hoCL5xfXJCaHWYzmtwW5XWYSlLgERi8PWd8bx1kUHUk8L1BT57e49oKnDDD180mjfrHc1yA9rg== + dependencies: + graceful-fs "^4.1.2" + jsonfile "^3.0.0" + universalify "^0.1.0" + fs-minipass@^2.0.0, fs-minipass@^2.1.0: version "2.1.0" resolved "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz" @@ -6210,7 +5690,14 @@ get-package-type@^0.1.0: resolved "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz" integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== -get-stream@^5.0.0, get-stream@^5.1.0: +get-stream@^5.0.0: + version "5.2.0" + resolved "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz" + integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== + dependencies: + pump "^3.0.0" + +get-stream@^5.1.0: version "5.2.0" resolved "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz" integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== @@ -6244,7 +5731,14 @@ getpass@^0.1.1: dependencies: assert-plus "^1.0.0" -glob-parent@^5.1.1, glob-parent@^5.1.2, glob-parent@~5.1.2: +glob-parent@^5.1.1: + version "5.1.2" + resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + +glob-parent@^5.1.2: version "5.1.2" resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== @@ -6258,45 +5752,18 @@ glob-parent@^6.0.1, glob-parent@^6.0.2: dependencies: is-glob "^4.0.3" +glob-parent@~5.1.2: + version "5.1.2" + resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + glob-to-regexp@^0.4.1: version "0.4.1" resolved "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz" integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== -glob@8.0.3, glob@^8.0.1: - version "8.0.3" - resolved "https://registry.npmjs.org/glob/-/glob-8.0.3.tgz" - integrity sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^5.0.1" - once "^1.3.0" - -glob@8.1.0: - version "8.1.0" - resolved "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz" - integrity sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^5.0.1" - once "^1.3.0" - -glob@^7.0.3: - version "7.2.3" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" - integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.1.1" - once "^1.3.0" - path-is-absolute "^1.0.0" - glob@^7.1.3, glob@^7.1.4, glob@^7.1.6, glob@^7.1.7, glob@~7.2.0: version "7.2.0" resolved "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz" @@ -6309,7 +5776,28 @@ glob@^7.1.3, glob@^7.1.4, glob@^7.1.6, glob@^7.1.7, glob@~7.2.0: once "^1.3.0" path-is-absolute "^1.0.0" -glob@^9.3.0, glob@^9.3.1: +glob@^8.0.1, glob@8.1.0: + version "8.1.0" + resolved "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz" + integrity sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^5.0.1" + once "^1.3.0" + +glob@^9.3.0: + version "9.3.5" + resolved "https://registry.npmjs.org/glob/-/glob-9.3.5.tgz" + integrity sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q== + dependencies: + fs.realpath "^1.0.0" + minimatch "^8.0.2" + minipass "^4.2.4" + path-scurry "^1.6.1" + +glob@^9.3.1: version "9.3.5" resolved "https://registry.npmjs.org/glob/-/glob-9.3.5.tgz" integrity sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q== @@ -6345,7 +5833,19 @@ globalthis@^1.0.3: dependencies: define-properties "^1.1.3" -globby@^11.0.1, globby@^11.1.0: +globby@^11.0.1: + version "11.1.0" + resolved "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz" + integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== + dependencies: + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.2.9" + ignore "^5.2.0" + merge2 "^1.4.1" + slash "^3.0.0" + +globby@^11.1.0: version "11.1.0" resolved "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz" integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== @@ -6368,18 +5868,6 @@ globby@^13.1.1: merge2 "^1.4.1" slash "^4.0.0" -globby@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/globby/-/globby-5.0.0.tgz#ebd84667ca0dbb330b99bcfc68eac2bc54370e0d" - integrity sha512-HJRTIH2EeH44ka+LWig+EqT2ONSYpVlNfx6pyd592/VF1TbfljJ7elwie7oSwcViLGqOdWocSdu2txwBF9bjmQ== - dependencies: - array-union "^1.0.1" - arrify "^1.0.0" - glob "^7.0.3" - object-assign "^4.0.1" - pify "^2.0.0" - pinkie-promise "^2.0.0" - gopd@^1.0.1: version "1.0.1" resolved "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz" @@ -6416,26 +5904,6 @@ handle-thing@^2.0.0: resolved "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz" integrity sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg== -har-schema@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" - integrity sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q== - -har-validator@~5.1.3: - version "5.1.5" - resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.5.tgz#1f0803b9f8cb20c0fa13822df1ecddb36bde1efd" - integrity sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w== - dependencies: - ajv "^6.12.3" - har-schema "^2.0.0" - -has-ansi@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" - integrity sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg== - dependencies: - ansi-regex "^2.0.0" - has-bigints@^1.0.1, has-bigints@^1.0.2: version "1.0.2" resolved "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz" @@ -6596,6 +6064,16 @@ http-deceiver@^1.2.7: resolved "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz" integrity sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw== +http-errors@~1.6.2: + version "1.6.3" + resolved "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz" + integrity sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A== + dependencies: + depd "~1.1.2" + inherits "2.0.3" + setprototypeof "1.1.0" + statuses ">= 1.4.0 < 2" + http-errors@2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz" @@ -6607,16 +6085,6 @@ http-errors@2.0.0: statuses "2.0.1" toidentifier "1.0.1" -http-errors@~1.6.2: - version "1.6.3" - resolved "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz" - integrity sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A== - dependencies: - depd "~1.1.2" - inherits "2.0.3" - setprototypeof "1.1.0" - statuses ">= 1.4.0 < 2" - http-parser-js@>=0.5.1: version "0.5.8" resolved "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz" @@ -6651,7 +6119,18 @@ http-proxy-middleware@^1.0.5: is-plain-obj "^3.0.0" micromatch "^4.0.2" -http-proxy-middleware@^2.0.3, http-proxy-middleware@^2.0.6: +http-proxy-middleware@^2.0.3: + version "2.0.6" + resolved "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz" + integrity sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw== + dependencies: + "@types/http-proxy" "^1.17.8" + http-proxy "^1.18.1" + is-glob "^4.0.1" + is-plain-obj "^3.0.0" + micromatch "^4.0.2" + +http-proxy-middleware@^2.0.6: version "2.0.6" resolved "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz" integrity sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw== @@ -6671,15 +6150,6 @@ http-proxy@^1.18.1: follow-redirects "^1.0.0" requires-port "^1.0.0" -http-signature@~1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" - integrity sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ== - dependencies: - assert-plus "^1.0.0" - jsprim "^1.2.2" - sshpk "^1.7.0" - http-signature@~1.3.6: version "1.3.6" resolved "https://registry.npmjs.org/http-signature/-/http-signature-1.3.6.tgz" @@ -6689,7 +6159,7 @@ http-signature@~1.3.6: jsprim "^2.0.2" sshpk "^1.14.1" -https-proxy-agent@5.0.1, https-proxy-agent@^5.0.0, https-proxy-agent@^5.0.1: +https-proxy-agent@^5.0.0, https-proxy-agent@^5.0.1, https-proxy-agent@5.0.1: version "5.0.1" resolved "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz" integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== @@ -6719,7 +6189,7 @@ hyphenate-style-name@^1.0.3: resolved "https://registry.npmjs.org/hyphenate-style-name/-/hyphenate-style-name-1.0.4.tgz" integrity sha512-ygGZLjmXfPHj+ZWh6LwbC37l43MhfztxetbFCoYTM2VjkIUpeHgSNn7QIyVFj7YQ1Wl9Cbw5sholVJPzWvC2MQ== -i18next@^19.5.0: +i18next@^19.5.0, "i18next@>= 19.0.0": version "19.9.2" resolved "https://registry.npmjs.org/i18next/-/i18next-19.9.2.tgz" integrity sha512-0i6cuo6ER6usEOtKajUUDj92zlG+KArFia0857xxiEHAQcUwh/RtOQocui1LPJwunSYT574Pk64aNva1kwtxZg== @@ -6733,20 +6203,27 @@ icomcom-react@^1.0.1: dependencies: prop-types "^15.6.0" -iconv-lite@0.4.24, iconv-lite@^0.4.24: +iconv-lite@^0.4.24: version "0.4.24" resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz" integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== dependencies: safer-buffer ">= 2.1.2 < 3" -iconv-lite@0.6.3, iconv-lite@^0.6.2, iconv-lite@^0.6.3: +iconv-lite@^0.6.2, iconv-lite@^0.6.3, iconv-lite@0.6.3: version "0.6.3" resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz" integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== dependencies: safer-buffer ">= 2.1.2 < 3.0.0" +iconv-lite@0.4.24: + version "0.4.24" + resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + icss-utils@^5.0.0, icss-utils@^5.1.0: version "5.1.0" resolved "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz" @@ -6769,7 +6246,7 @@ ignore-walk@^6.0.0: dependencies: minimatch "^7.4.2" -ignore@5.2.4, ignore@^5.2.0: +ignore@^5.2.0, ignore@5.2.4: version "5.2.4" resolved "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz" integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ== @@ -6833,7 +6310,7 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3: +inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3, inherits@2, inherits@2.0.4: version "2.0.4" resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== @@ -6853,11 +6330,6 @@ ini@3.0.1: resolved "https://registry.npmjs.org/ini/-/ini-3.0.1.tgz" integrity sha512-it4HyVAUTKBc6m8e1iXWvXSTdndF7HbdN713+kvLrymxTaU4AUBWrJ4vEooP+V7fexnVD3LKcBshjGGPefSMUQ== -ini@^1.3.4: - version "1.3.8" - resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" - integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== - inquirer@8.2.4: version "8.2.4" resolved "https://registry.npmjs.org/inquirer/-/inquirer-8.2.4.tgz" @@ -6910,16 +6382,16 @@ ip@^2.0.0: resolved "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz" integrity sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ== -ipaddr.js@1.9.1: - version "1.9.1" - resolved "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz" - integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== - ipaddr.js@^2.0.1: version "2.0.1" resolved "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.0.1.tgz" integrity sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng== +ipaddr.js@1.9.1: + version "1.9.1" + resolved "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz" + integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== + is-arguments@^1.1.1: version "1.1.1" resolved "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz" @@ -7069,25 +6541,6 @@ is-number@^7.0.0: resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz" integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== -is-path-cwd@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-1.0.0.tgz#d225ec23132e89edd38fda767472e62e65f1106d" - integrity sha512-cnS56eR9SPAscL77ik76ATVqoPARTqPIVkMDVxRaWH06zT+6+CzIroYRJ0VVvm0Z1zfAvxvz9i/D3Ppjaqt5Nw== - -is-path-in-cwd@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz#5ac48b345ef675339bd6c7a48a912110b241cf52" - integrity sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ== - dependencies: - is-path-inside "^1.0.0" - -is-path-inside@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.1.tgz#8ef5b7de50437a3fdca6b4e865ef7aa55cb48036" - integrity sha512-qhsCR/Esx4U4hg/9I19OVUAJkGWtjRYHMRgUMZE2TDdj+Ag+kttZanLupfddNyglzz50cUlmWzUaI37GDfNx/g== - dependencies: - path-is-inside "^1.0.1" - is-path-inside@^3.0.2, is-path-inside@^3.0.3: version "3.0.3" resolved "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz" @@ -7314,7 +6767,7 @@ jake@^10.8.5: filelist "^1.0.1" minimatch "^3.0.4" -jasmine-core@^3.6.0, jasmine-core@^3.8.0: +jasmine-core@^3.6.0, jasmine-core@^3.8.0, jasmine-core@>=3.8: version "3.99.1" resolved "https://registry.npmjs.org/jasmine-core/-/jasmine-core-3.99.1.tgz" integrity sha512-Hu1dmuoGcZ7AfyynN3LsfruwMbxMALMka+YtZeGoLuDEySVmVAPaonkNoBRIw/ectu8b9tVQCJNgp4a4knp+tg== @@ -7335,6 +6788,11 @@ jest-worker@^27.4.5: merge-stream "^2.0.0" supports-color "^8.0.0" +"jquery@1.9.1 - 3": + version "3.6.4" + resolved "https://registry.npmjs.org/jquery/-/jquery-3.6.4.tgz" + integrity sha512-v28EW9DWDFpzcD9O5iyJXg3R3+q+mET5JhnjJzQUZMHOv67bpSIHq81GEYpPNZHG+XXHsfSme3nxp/hndKEcsQ== + js-cookie@2.2.1: version "2.2.1" resolved "https://registry.npmjs.org/js-cookie/-/js-cookie-2.2.1.tgz" @@ -7375,38 +6833,6 @@ jsdoc-type-pratt-parser@~3.1.0: resolved "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-3.1.0.tgz" integrity sha512-MgtD0ZiCDk9B+eI73BextfRrVQl0oyzRG8B2BjORts6jbunj4ScKPcyXGTbB6eXL4y9TzxCm6hyeLq/2ASzNdw== -jsdom@21.1.0: - version "21.1.0" - resolved "https://registry.npmjs.org/jsdom/-/jsdom-21.1.0.tgz" - integrity sha512-m0lzlP7qOtthD918nenK3hdItSd2I+V3W9IrBcB36sqDwG+KnUs66IF5GY7laGWUnlM9vTsD0W1QwSEBYWWcJg== - dependencies: - abab "^2.0.6" - acorn "^8.8.1" - acorn-globals "^7.0.0" - cssom "^0.5.0" - cssstyle "^2.3.0" - data-urls "^3.0.2" - decimal.js "^10.4.2" - domexception "^4.0.0" - escodegen "^2.0.0" - form-data "^4.0.0" - html-encoding-sniffer "^3.0.0" - http-proxy-agent "^5.0.0" - https-proxy-agent "^5.0.1" - is-potential-custom-element-name "^1.0.1" - nwsapi "^2.2.2" - parse5 "^7.1.1" - saxes "^6.0.0" - symbol-tree "^3.2.4" - tough-cookie "^4.1.2" - w3c-xmlserializer "^4.0.0" - webidl-conversions "^7.0.0" - whatwg-encoding "^2.0.0" - whatwg-mimetype "^3.0.0" - whatwg-url "^11.0.0" - ws "^8.11.0" - xml-name-validator "^4.0.0" - jsdom@^16.4.0: version "16.7.0" resolved "https://registry.npmjs.org/jsdom/-/jsdom-16.7.0.tgz" @@ -7440,6 +6866,38 @@ jsdom@^16.4.0: ws "^7.4.6" xml-name-validator "^3.0.0" +jsdom@21.1.0: + version "21.1.0" + resolved "https://registry.npmjs.org/jsdom/-/jsdom-21.1.0.tgz" + integrity sha512-m0lzlP7qOtthD918nenK3hdItSd2I+V3W9IrBcB36sqDwG+KnUs66IF5GY7laGWUnlM9vTsD0W1QwSEBYWWcJg== + dependencies: + abab "^2.0.6" + acorn "^8.8.1" + acorn-globals "^7.0.0" + cssom "^0.5.0" + cssstyle "^2.3.0" + data-urls "^3.0.2" + decimal.js "^10.4.2" + domexception "^4.0.0" + escodegen "^2.0.0" + form-data "^4.0.0" + html-encoding-sniffer "^3.0.0" + http-proxy-agent "^5.0.0" + https-proxy-agent "^5.0.1" + is-potential-custom-element-name "^1.0.1" + nwsapi "^2.2.2" + parse5 "^7.1.1" + saxes "^6.0.0" + symbol-tree "^3.2.4" + tough-cookie "^4.1.2" + w3c-xmlserializer "^4.0.0" + webidl-conversions "^7.0.0" + whatwg-encoding "^2.0.0" + whatwg-mimetype "^3.0.0" + whatwg-url "^11.0.0" + ws "^8.11.0" + xml-name-validator "^4.0.0" + jsesc@^2.5.1: version "2.5.2" resolved "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz" @@ -7497,16 +6955,11 @@ json5@^2.1.2, json5@^2.2.1, json5@^2.2.2: resolved "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz" integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== -jsonc-parser@3.0.0, jsonc-parser@^3.0.0: +jsonc-parser@^3.0.0, jsonc-parser@3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.0.0.tgz" integrity sha512-fQzRfAbIBnR0IQvftw9FJveWiHp72Fg20giDrHz6TdfB12UH/uue0D3hm57UB5KgAVuniLMCaS8P1IMj9NR7cA== -jsonc-parser@3.1.0: - version "3.1.0" - resolved "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.1.0.tgz" - integrity sha512-DRf0QjnNeCUds3xTjKlQQ3DpJD51GvDjJfnxUVWg6PZTo2otSm+slzNAxU/35hF8/oJIKoG9slq30JYOsF2azg== - jsonc-parser@3.2.0: version "3.2.0" resolved "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz" @@ -7545,16 +6998,6 @@ jsonschema@1.4.0: resolved "https://registry.npmjs.org/jsonschema/-/jsonschema-1.4.0.tgz" integrity sha512-/YgW6pRMr6M7C+4o8kS+B/2myEpHCrxO4PEWnqJNBFMjn7EWXqlQ4tGwL6xTHeRplwuZmcAncdvfOad1nT2yMw== -jsprim@^1.2.2: - version "1.4.2" - resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.2.tgz#712c65533a15c878ba59e9ed5f0e26d5b77c5feb" - integrity sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw== - dependencies: - assert-plus "1.0.0" - extsprintf "1.3.0" - json-schema "0.4.0" - verror "1.10.0" - jsprim@^2.0.2: version "2.0.2" resolved "https://registry.npmjs.org/jsprim/-/jsprim-2.0.2.tgz" @@ -7632,7 +7075,7 @@ jss-rtl@^0.3.0: dependencies: rtl-css-js "^1.13.1" -jss@10.10.0, jss@^10.3.0, jss@^10.5.1: +jss@^10.0.0, jss@^10.3.0, jss@^10.5.1, jss@10.10.0: version "10.10.0" resolved "https://registry.npmjs.org/jss/-/jss-10.10.0.tgz" integrity sha512-cqsOTS7jqPsPMjtKYDUpdFC0AbhYFLTcuGRqymgmdJIeQ8cH7+AgX7YSgQy79wXloZq2VvATYxUOUQEvS1V/Zw== @@ -7681,7 +7124,7 @@ karma-jasmine-html-reporter@^1.5.0: resolved "https://registry.npmjs.org/karma-jasmine-html-reporter/-/karma-jasmine-html-reporter-1.7.0.tgz" integrity sha512-pzum1TL7j90DTE86eFt48/s12hqwQuiD+e5aXx2Dc9wDEn2LfGq6RoAxEZZjFiN0RDSCOnosEKRZWxbQ+iMpQQ== -karma-jasmine@~4.0.0: +karma-jasmine@>=1.1, karma-jasmine@~4.0.0: version "4.0.2" resolved "https://registry.npmjs.org/karma-jasmine/-/karma-jasmine-4.0.2.tgz" integrity sha512-ggi84RMNQffSDmWSyyt4zxzh2CQGwsxvYYsprgyR1j8ikzIduEdOlcLvXjZGwXG/0j41KUXOWsUCBfbEHPWP9g== @@ -7704,7 +7147,7 @@ karma-source-map-support@1.4.0: dependencies: source-map-support "^0.5.5" -karma@^6.3.14: +karma@*, karma@^6.3.0, karma@^6.3.14, karma@>=0.13, karma@>=0.9: version "6.4.1" resolved "https://registry.npmjs.org/karma/-/karma-6.4.1.tgz" integrity sha512-Cj57NKOskK7wtFWSlMvZf459iX+kpYIPXmkNUzP2WAFcA7nhr/ALn5R7sw3w+1udFDcpMx/tuB8d5amgm3ijaA== @@ -7767,13 +7210,6 @@ lazy-ass@^1.6.0: resolved "https://registry.npmjs.org/lazy-ass/-/lazy-ass-1.6.0.tgz" integrity sha512-cc8oEVoctTvsFZ/Oje/kGnHbpWHYBe8IAJe4C0QNc3t8uM/0Y8+erSz/7Y1ALuXTEZTMvxXwO6YbX1ey3ujiZw== -less-loader@11.0.0: - version "11.0.0" - resolved "https://registry.npmjs.org/less-loader/-/less-loader-11.0.0.tgz" - integrity sha512-9+LOWWjuoectIEx3zrfN83NAGxSUB5pWEabbbidVQVgZhN+wN68pOvuyirVlH1IK4VT1f3TmlyvAnCXh8O5KEw== - dependencies: - klona "^2.0.4" - less-loader@11.1.0: version "11.1.0" resolved "https://registry.npmjs.org/less-loader/-/less-loader-11.1.0.tgz" @@ -7781,7 +7217,7 @@ less-loader@11.1.0: dependencies: klona "^2.0.4" -less@4.1.3: +"less@^3.5.0 || ^4.0.0", less@4.1.3: version "4.1.3" resolved "https://registry.npmjs.org/less/-/less-4.1.3.tgz" integrity sha512-w16Xk/Ta9Hhyei0Gpz9m7VS8F28nieJaL/VyShID7cYvP6IL5oHeL6p4TXSDJqZE/lNv0oJ2pGVjJsRkfwm5FA== @@ -7857,11 +7293,6 @@ loader-runner@^4.2.0: resolved "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz" integrity sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg== -loader-utils@3.2.1: - version "3.2.1" - resolved "https://registry.npmjs.org/loader-utils/-/loader-utils-3.2.1.tgz" - integrity sha512-ZvFw1KWS3GVyYBYb7qkmRM/WwL2TQQBxgCK62rlvm4WpVQ23Nb4tYjApUlfjrEGvOs7KHEsmyUn75OHZrJMWPw== - loader-utils@^2.0.0: version "2.0.4" resolved "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz" @@ -7871,6 +7302,11 @@ loader-utils@^2.0.0: emojis-list "^3.0.0" json5 "^2.1.2" +loader-utils@3.2.1: + version "3.2.1" + resolved "https://registry.npmjs.org/loader-utils/-/loader-utils-3.2.1.tgz" + integrity sha512-ZvFw1KWS3GVyYBYb7qkmRM/WwL2TQQBxgCK62rlvm4WpVQ23Nb4tYjApUlfjrEGvOs7KHEsmyUn75OHZrJMWPw== + localtunnel@^2.0.1: version "2.0.2" resolved "https://registry.npmjs.org/localtunnel/-/localtunnel-2.0.2.tgz" @@ -7987,6 +7423,13 @@ lru-cache@^9.0.0: resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-9.0.1.tgz" integrity sha512-C8QsKIN1UIXeOs3iWmiZ1lQY+EnKDojWd37fXy1aSbJvH4iSma1uy2OWuoB3m4SYRli5+CUjDv3Dij5DVoetmg== +magic-string@^0.27.0: + version "0.27.0" + resolved "https://registry.npmjs.org/magic-string/-/magic-string-0.27.0.tgz" + integrity sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA== + dependencies: + "@jridgewell/sourcemap-codec" "^1.4.13" + magic-string@0.25.7: version "0.25.7" resolved "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz" @@ -8001,13 +7444,6 @@ magic-string@0.29.0: dependencies: "@jridgewell/sourcemap-codec" "^1.4.13" -magic-string@^0.27.0: - version "0.27.0" - resolved "https://registry.npmjs.org/magic-string/-/magic-string-0.27.0.tgz" - integrity sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA== - dependencies: - "@jridgewell/sourcemap-codec" "^1.4.13" - make-dir@^2.1.0: version "2.1.0" resolved "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz" @@ -8016,7 +7452,7 @@ make-dir@^2.1.0: pify "^4.0.1" semver "^5.6.0" -make-dir@^3.0.0, make-dir@^3.0.2, make-dir@^3.1.0: +make-dir@^3.0.0, make-dir@^3.0.2: version "3.1.0" resolved "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz" integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== @@ -8050,7 +7486,28 @@ make-fetch-happen@^10.0.3: socks-proxy-agent "^7.0.0" ssri "^9.0.0" -make-fetch-happen@^11.0.0, make-fetch-happen@^11.0.1: +make-fetch-happen@^11.0.0: + version "11.0.3" + resolved "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-11.0.3.tgz" + integrity sha512-oPLh5m10lRNNZDjJ2kP8UpboUx2uFXVaVweVe/lWut4iHWcQEmfqSVJt2ihZsFI8HbpwyyocaXbCAWf0g1ukIA== + dependencies: + agentkeepalive "^4.2.1" + cacache "^17.0.0" + http-cache-semantics "^4.1.1" + http-proxy-agent "^5.0.0" + https-proxy-agent "^5.0.0" + is-lambda "^1.0.1" + lru-cache "^7.7.1" + minipass "^4.0.0" + minipass-fetch "^3.0.0" + minipass-flush "^1.0.5" + minipass-pipeline "^1.2.4" + negotiator "^0.6.3" + promise-retry "^2.0.1" + socks-proxy-agent "^7.0.0" + ssri "^10.0.0" + +make-fetch-happen@^11.0.1: version "11.0.3" resolved "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-11.0.3.tgz" integrity sha512-oPLh5m10lRNNZDjJ2kP8UpboUx2uFXVaVweVe/lWut4iHWcQEmfqSVJt2ihZsFI8HbpwyyocaXbCAWf0g1ukIA== @@ -8136,7 +7593,7 @@ memfs@^3.4.12, memfs@^3.4.3: dependencies: fs-monkey "^1.0.3" -"memoize-one@>=3.1.1 <6", memoize-one@^5.1.1: +memoize-one@^5.1.1, "memoize-one@>=3.1.1 <6": version "5.2.1" resolved "https://registry.npmjs.org/memoize-one/-/memoize-one-5.2.1.tgz" integrity sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q== @@ -8179,7 +7636,7 @@ micromatch@^4.0.2, micromatch@^4.0.4: braces "^3.0.2" picomatch "^2.3.1" -mime-db@1.52.0, "mime-db@>= 1.43.0 < 2": +"mime-db@>= 1.43.0 < 2", mime-db@1.52.0: version "1.52.0" resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz" integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== @@ -8191,33 +7648,31 @@ mime-types@^2.1.12, mime-types@^2.1.27, mime-types@^2.1.31, mime-types@~2.1.17, dependencies: mime-db "1.52.0" +mime@^1.4.1, mime@1.6.0: + version "1.6.0" + resolved "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz" + integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== + +mime@^2.4.6: + version "2.6.0" + resolved "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz" + integrity sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg== + +mime@^2.5.2: + version "2.6.0" + resolved "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz" + integrity sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg== + mime@1.4.1: version "1.4.1" resolved "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz" integrity sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ== -mime@1.6.0, mime@^1.4.1: - version "1.6.0" - resolved "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz" - integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== - -mime@^2.4.6, mime@^2.5.2: - version "2.6.0" - resolved "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz" - integrity sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg== - mimic-fn@^2.1.0: version "2.1.0" resolved "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz" integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== -mini-css-extract-plugin@2.6.1: - version "2.6.1" - resolved "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.6.1.tgz" - integrity sha512-wd+SD57/K6DiV7jIR34P+s3uckTRuQvx0tKPcvjFlrEylk6P4mQ2KSWk1hblj1Kxaqok7LogKOieygXqBczNlg== - dependencies: - schema-utils "^4.0.0" - mini-css-extract-plugin@2.7.2: version "2.7.2" resolved "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.7.2.tgz" @@ -8230,20 +7685,20 @@ minimalistic-assert@^1.0.0: resolved "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz" integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== -minimatch@5.1.0, minimatch@^5.0.1: - version "5.1.0" - resolved "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz" - integrity sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg== - dependencies: - brace-expansion "^2.0.1" - -minimatch@^3.0.2, minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: +minimatch@^3.0.2, minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.2: version "3.1.2" resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== dependencies: brace-expansion "^1.1.7" +minimatch@^5.0.1: + version "5.1.6" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz" + integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g== + dependencies: + brace-expansion "^2.0.1" + minimatch@^7.4.2: version "7.4.6" resolved "https://registry.npmjs.org/minimatch/-/minimatch-7.4.6.tgz" @@ -8251,16 +7706,23 @@ minimatch@^7.4.2: dependencies: brace-expansion "^2.0.1" -minimatch@^8.0.2, minimatch@^8.0.3: +minimatch@^8.0.2: version "8.0.4" resolved "https://registry.npmjs.org/minimatch/-/minimatch-8.0.4.tgz" integrity sha512-W0Wvr9HyFXZRGIDgCicunpQ299OKXs9RgZfaukz4qAW/pJhcpUfupc9c+OObPOFueNy8VSrZgEmDtk6Kh4WzDA== dependencies: brace-expansion "^2.0.1" -minimist@^1.2.0, minimist@^1.2.5, minimist@^1.2.6: +minimatch@^8.0.3: + version "8.0.4" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-8.0.4.tgz" + integrity sha512-W0Wvr9HyFXZRGIDgCicunpQ299OKXs9RgZfaukz4qAW/pJhcpUfupc9c+OObPOFueNy8VSrZgEmDtk6Kh4WzDA== + dependencies: + brace-expansion "^2.0.1" + +minimist@^1.2.0, minimist@^1.2.6: version "1.2.8" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" + resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz" integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== minipass-collect@^1.0.2: @@ -8356,7 +7818,7 @@ mirador-share-plugin@^0.11.0: resolved "https://registry.npmjs.org/mirador-share-plugin/-/mirador-share-plugin-0.11.0.tgz" integrity sha512-fHcdDXyrtfy5pn1zdQNX9BvE5Tjup66eQwyNippE5PMaP8ImUcrFaSL+mStdn+v6agsHcsdRqLhseZ0XWgEuAw== -mirador@^3.3.0: +mirador@^3.0.0-beta.0, mirador@^3.0.0-rc.7, mirador@^3.3.0: version "3.3.0" resolved "https://registry.npmjs.org/mirador/-/mirador-3.3.0.tgz" integrity sha512-BmGfRnWJ45B+vtiAwcFT7n9nKialfejE9UvuUK0NorO37ShArpsKr3yVSD4jQASwSR4DRRpPEG21jOk4WN7H3w== @@ -8443,16 +7905,16 @@ mrmime@^1.0.0: resolved "https://registry.npmjs.org/mrmime/-/mrmime-1.0.1.tgz" integrity sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw== +ms@^2.0.0, ms@^2.1.1, ms@2.1.2: + version "2.1.2" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + ms@2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz" integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== -ms@2.1.2, ms@^2.0.0, ms@^2.1.1: - version "2.1.2" - resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" - integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== - ms@2.1.3: version "2.1.3" resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz" @@ -8495,7 +7957,7 @@ needle@^3.1.0: iconv-lite "^0.6.3" sax "^1.2.4" -negotiator@0.6.3, negotiator@^0.6.3: +negotiator@^0.6.3, negotiator@0.6.3: version "0.6.3" resolved "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz" integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== @@ -8530,7 +7992,7 @@ ngx-infinite-scroll@^10.0.1: "@scarf/scarf" "^1.1.0" opencollective-postinstall "^2.0.2" -ngx-mask@^13.1.7: +ngx-mask@^13.0.0, ngx-mask@^13.1.7: version "13.1.15" resolved "https://registry.npmjs.org/ngx-mask/-/ngx-mask-13.1.15.tgz" integrity sha512-fplyzkFa6lFTzPo/AHaI3TBQxTMdcqQClR9BLLAWTvCyDZkV28fLqWkpIpy0VvPc9ADogFpJJj7R1356mszjag== @@ -8662,7 +8124,7 @@ normalize-url@^4.5.0: resolved "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz" integrity sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA== -nouislider@^14.6.3: +nouislider@^14.6.3, nouislider@>=9.x: version "14.7.0" resolved "https://registry.npmjs.org/nouislider/-/nouislider-14.7.0.tgz" integrity sha512-4RtQ1+LHJKesDCNJrXkQcwXAWCrC2aggdLYMstS/G5fEWL+fXZbUA9pwVNHFghMGuFGRATlDLNInRaPeRKzpFQ== @@ -8686,7 +8148,7 @@ npm-normalize-package-bin@^3.0.0: resolved "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-3.0.0.tgz" integrity sha512-g+DPQSkusnk7HYXr75NtzkIP4+N81i3RPsGFidF3DzHd9MT9wWngmqoeg/fnHFz5MNdtG4w03s+QnhewSLTT2Q== -npm-package-arg@10.1.0, npm-package-arg@^10.0.0: +npm-package-arg@^10.0.0, npm-package-arg@10.1.0: version "10.1.0" resolved "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-10.1.0.tgz" integrity sha512-uFyyCEmgBfZTtrKk/5xDfHp6+MdrqGotX/VoOyEEl3mBwiEE5FlBaePanazJSVMPT7vKepcjYBY2ztg9A3yPIA== @@ -8703,7 +8165,7 @@ npm-packlist@^7.0.0: dependencies: ignore-walk "^6.0.0" -npm-pick-manifest@8.0.1, npm-pick-manifest@^8.0.0: +npm-pick-manifest@^8.0.0, npm-pick-manifest@8.0.1: version "8.0.1" resolved "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-8.0.1.tgz" integrity sha512-mRtvlBjTsJvfCCdmPtiu2bdlx8d/KXtF7yNXNWe7G0Z36qWA9Ny5zXsI2PfBZEv7SXgoxTmNaTzGSbbzDZChoA== @@ -8755,14 +8217,9 @@ nwsapi@^2.2.0, nwsapi@^2.2.2: resolved "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.3.tgz" integrity sha512-jscxIO4/VKScHlbmFBdV1Z6LXnLO+ZR4VMtypudUdfwtKxUN3TQcNFIHLwKtrUbDyHN4/GycY9+oRGZ2XMXYPw== -oauth-sign@~0.9.0: - version "0.9.0" - resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" - integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== - -object-assign@^4, object-assign@^4.0.1, object-assign@^4.1.1: +object-assign@^4, object-assign@^4.1.1: version "4.1.1" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + resolved "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== object-inspect@^1.12.3, object-inspect@^1.9.0: @@ -8812,13 +8269,6 @@ obuf@^1.0.0, obuf@^1.1.2: resolved "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz" integrity sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg== -on-finished@2.4.1: - version "2.4.1" - resolved "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz" - integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== - dependencies: - ee-first "1.1.1" - on-finished@~2.3.0: version "2.3.0" resolved "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz" @@ -8826,6 +8276,13 @@ on-finished@~2.3.0: dependencies: ee-first "1.1.1" +on-finished@2.4.1: + version "2.4.1" + resolved "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz" + integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== + dependencies: + ee-first "1.1.1" + on-headers@~1.0.2: version "1.0.2" resolved "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz" @@ -8845,7 +8302,7 @@ onetime@^5.1.0, onetime@^5.1.2: dependencies: mimic-fn "^2.1.0" -open@8.4.0, open@^8.0.9: +open@^8.0.9: version "8.4.0" resolved "https://registry.npmjs.org/open/-/open-8.4.0.tgz" integrity sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q== @@ -8914,7 +8371,7 @@ optionator@^0.9.1: type-check "^0.4.0" word-wrap "^1.2.3" -ora@5.4.1, ora@^5.1.0, ora@^5.4.1: +ora@^5.1.0, ora@^5.4.1, ora@5.4.1: version "5.4.1" resolved "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz" integrity sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ== @@ -9043,14 +8500,6 @@ parse-srcset@^1.0.2: resolved "https://registry.npmjs.org/parse-srcset/-/parse-srcset-1.0.2.tgz" integrity sha512-/2qh0lav6CmI15FzA3i/2Bzk2zCgQhGMkvhOhKNcBVQ1ldgpbfiNTVslmooUmWJcADi1f1kIeynbDRVzNlfR6Q== -parse5-html-rewriting-stream@6.0.1: - version "6.0.1" - resolved "https://registry.npmjs.org/parse5-html-rewriting-stream/-/parse5-html-rewriting-stream-6.0.1.tgz" - integrity sha512-vwLQzynJVEfUlURxgnf51yAJDQTtVpNyGD8tKi2Za7m+akukNHxCcUQMAa/mUGLhCeicFdpy7Tlvj8ZNKadprg== - dependencies: - parse5 "^6.0.1" - parse5-sax-parser "^6.0.1" - parse5-html-rewriting-stream@7.0.0: version "7.0.0" resolved "https://registry.npmjs.org/parse5-html-rewriting-stream/-/parse5-html-rewriting-stream-7.0.0.tgz" @@ -9067,13 +8516,6 @@ parse5-htmlparser2-tree-adapter@^6.0.1: dependencies: parse5 "^6.0.1" -parse5-sax-parser@^6.0.1: - version "6.0.1" - resolved "https://registry.npmjs.org/parse5-sax-parser/-/parse5-sax-parser-6.0.1.tgz" - integrity sha512-kXX+5S81lgESA0LsDuGjAlBybImAChYRMT+/uKCEXFBFOeEhS52qUCydGhU3qLRD8D9DVjaUo821WK7DM4iCeg== - dependencies: - parse5 "^6.0.1" - parse5-sax-parser@^7.0.0: version "7.0.0" resolved "https://registry.npmjs.org/parse5-sax-parser/-/parse5-sax-parser-7.0.0.tgz" @@ -9081,23 +8523,35 @@ parse5-sax-parser@^7.0.0: dependencies: parse5 "^7.0.0" -parse5@6.0.1, parse5@^6.0.1: - version "6.0.1" - resolved "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz" - integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== - parse5@^5.0.0: version "5.1.1" resolved "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz" integrity sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug== -parse5@^7.0.0, parse5@^7.1.1: +parse5@^6.0.1: + version "6.0.1" + resolved "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz" + integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== + +parse5@^7.0.0: version "7.1.2" resolved "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz" integrity sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw== dependencies: entities "^4.4.0" +parse5@^7.1.1: + version "7.1.2" + resolved "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz" + integrity sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw== + dependencies: + entities "^4.4.0" + +parse5@6.0.1: + version "6.0.1" + resolved "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz" + integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== + parseurl@~1.3.2, parseurl@~1.3.3: version "1.3.3" resolved "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz" @@ -9113,11 +8567,6 @@ path-is-absolute@^1.0.0: resolved "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== -path-is-inside@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" - integrity sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w== - path-key@^3.0.0, path-key@^3.1.0: version "3.1.1" resolved "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz" @@ -9181,9 +8630,14 @@ picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== -pify@^2.0.0, pify@^2.2.0, pify@^2.3.0: +pify@^2.2.0: version "2.3.0" - resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" + resolved "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz" + integrity sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog== + +pify@^2.3.0: + version "2.3.0" + resolved "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz" integrity sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog== pify@^4.0.1: @@ -9191,19 +8645,7 @@ pify@^4.0.1: resolved "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz" integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== -pinkie-promise@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" - integrity sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw== - dependencies: - pinkie "^2.0.0" - -pinkie@^2.0.0: - version "2.0.4" - resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" - integrity sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg== - -piscina@3.2.0, piscina@~3.2.0: +piscina@~3.2.0, piscina@3.2.0: version "3.2.0" resolved "https://registry.npmjs.org/piscina/-/piscina-3.2.0.tgz" integrity sha512-yn/jMdHRw+q2ZJhFhyqsmANcbF6V2QwmD84c6xRau+QpQOmtrBCoRGdvTfeuFDYXB5W2m6MfLkjkvQa9lUSmIA== @@ -9221,6 +8663,11 @@ pkg-dir@^4.1.0, pkg-dir@^4.2.0: dependencies: find-up "^4.0.0" +popper.js@^1.16.1: + version "1.16.1" + resolved "https://registry.npmjs.org/popper.js/-/popper.js-1.16.1.tgz" + integrity sha512-Wb4p1J4zyFTbM+u6WuO4XstYx4Ky9Cewe4DWrel7B0w6VVICvPwdOpotjzcf6eD8TsckVnIMNONQyPIUFOUbCQ== + popper.js@1.16.1-lts: version "1.16.1-lts" resolved "https://registry.npmjs.org/popper.js/-/popper.js-1.16.1-lts.tgz" @@ -9284,7 +8731,7 @@ postcss-custom-media@^8.0.2: dependencies: postcss-value-parser "^4.2.0" -postcss-custom-properties@^12.1.10, postcss-custom-properties@^12.1.8: +postcss-custom-properties@^12.1.10: version "12.1.11" resolved "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-12.1.11.tgz" integrity sha512-0IDJYhgU8xDv1KY6+VgUwuQkVtmYzRwu+dMjnmdMafXYv86SWqfxkc7qdDvWS38vsjaEtv8e0vGOUQrAiMBLpQ== @@ -9351,15 +8798,6 @@ postcss-image-set-function@^4.0.7: dependencies: postcss-value-parser "^4.2.0" -postcss-import@15.0.0: - version "15.0.0" - resolved "https://registry.npmjs.org/postcss-import/-/postcss-import-15.0.0.tgz" - integrity sha512-Y20shPQ07RitgBGv2zvkEAu9bqvrD77C9axhj/aA1BQj4czape2MdClCExvB27EwYEJdGgKZBpKanb0t1rK2Kg== - dependencies: - postcss-value-parser "^4.0.0" - read-cache "^1.0.0" - resolve "^1.1.7" - postcss-import@^14.0.0: version "14.1.0" resolved "https://registry.npmjs.org/postcss-import/-/postcss-import-14.1.0.tgz" @@ -9382,24 +8820,6 @@ postcss-lab-function@^4.2.1: "@csstools/postcss-progressive-custom-properties" "^1.1.0" postcss-value-parser "^4.2.0" -postcss-loader@7.0.1: - version "7.0.1" - resolved "https://registry.npmjs.org/postcss-loader/-/postcss-loader-7.0.1.tgz" - integrity sha512-VRviFEyYlLjctSM93gAZtcJJ/iSkPZ79zWbN/1fSH+NisBByEiVLqpdVDrPLVSi8DX0oJo12kL/GppTBdKVXiQ== - dependencies: - cosmiconfig "^7.0.0" - klona "^2.0.5" - semver "^7.3.7" - -postcss-loader@7.0.2: - version "7.0.2" - resolved "https://registry.npmjs.org/postcss-loader/-/postcss-loader-7.0.2.tgz" - integrity sha512-fUJzV/QH7NXUAqV8dWJ9Lg4aTkDCezpTS5HgJ2DvqznexTbSTxgi/dTECvTZ15BwKTtk8G/bqI/QTu2HPd3ZCg== - dependencies: - cosmiconfig "^7.0.0" - klona "^2.0.5" - semver "^7.3.8" - postcss-loader@^4.0.3: version "4.3.0" resolved "https://registry.npmjs.org/postcss-loader/-/postcss-loader-4.3.0.tgz" @@ -9411,6 +8831,15 @@ postcss-loader@^4.0.3: schema-utils "^3.0.0" semver "^7.3.4" +postcss-loader@7.0.2: + version "7.0.2" + resolved "https://registry.npmjs.org/postcss-loader/-/postcss-loader-7.0.2.tgz" + integrity sha512-fUJzV/QH7NXUAqV8dWJ9Lg4aTkDCezpTS5HgJ2DvqznexTbSTxgi/dTECvTZ15BwKTtk8G/bqI/QTu2HPd3ZCg== + dependencies: + cosmiconfig "^7.0.0" + klona "^2.0.5" + semver "^7.3.8" + postcss-logical@^5.0.4: version "5.0.4" resolved "https://registry.npmjs.org/postcss-logical/-/postcss-logical-5.0.4.tgz" @@ -9449,7 +8878,7 @@ postcss-modules-values@^4.0.0: dependencies: icss-utils "^5.0.0" -postcss-nesting@^10.1.10, postcss-nesting@^10.2.0: +postcss-nesting@^10.2.0: version "10.2.0" resolved "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-10.2.0.tgz" integrity sha512-EwMkYchxiDiKUhlJGzWsD9b2zvq/r2SSubcRrgP+jujMXFzqvANLt16lJANC+5uZ6hjI7lpRmI6O8JIl+8l1KA== @@ -9481,61 +8910,6 @@ postcss-place@^7.0.5: dependencies: postcss-value-parser "^4.2.0" -postcss-preset-env@7.8.0: - version "7.8.0" - resolved "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-7.8.0.tgz" - integrity sha512-leqiqLOellpLKfbHkD06E04P6d9ZQ24mat6hu4NSqun7WG0UhspHR5Myiv/510qouCjoo4+YJtNOqg5xHaFnCA== - dependencies: - "@csstools/postcss-cascade-layers" "^1.0.5" - "@csstools/postcss-color-function" "^1.1.1" - "@csstools/postcss-font-format-keywords" "^1.0.1" - "@csstools/postcss-hwb-function" "^1.0.2" - "@csstools/postcss-ic-unit" "^1.0.1" - "@csstools/postcss-is-pseudo-class" "^2.0.7" - "@csstools/postcss-nested-calc" "^1.0.0" - "@csstools/postcss-normalize-display-values" "^1.0.1" - "@csstools/postcss-oklab-function" "^1.1.1" - "@csstools/postcss-progressive-custom-properties" "^1.3.0" - "@csstools/postcss-stepped-value-functions" "^1.0.1" - "@csstools/postcss-text-decoration-shorthand" "^1.0.0" - "@csstools/postcss-trigonometric-functions" "^1.0.2" - "@csstools/postcss-unset-value" "^1.0.2" - autoprefixer "^10.4.8" - browserslist "^4.21.3" - css-blank-pseudo "^3.0.3" - css-has-pseudo "^3.0.4" - css-prefers-color-scheme "^6.0.3" - cssdb "^7.0.0" - postcss-attribute-case-insensitive "^5.0.2" - postcss-clamp "^4.1.0" - postcss-color-functional-notation "^4.2.4" - postcss-color-hex-alpha "^8.0.4" - postcss-color-rebeccapurple "^7.1.1" - postcss-custom-media "^8.0.2" - postcss-custom-properties "^12.1.8" - postcss-custom-selectors "^6.0.3" - postcss-dir-pseudo-class "^6.0.5" - postcss-double-position-gradients "^3.1.2" - postcss-env-function "^4.0.6" - postcss-focus-visible "^6.0.4" - postcss-focus-within "^5.0.4" - postcss-font-variant "^5.0.0" - postcss-gap-properties "^3.0.5" - postcss-image-set-function "^4.0.7" - postcss-initial "^4.0.1" - postcss-lab-function "^4.2.1" - postcss-logical "^5.0.4" - postcss-media-minmax "^5.0.0" - postcss-nesting "^10.1.10" - postcss-opacity-percentage "^1.1.2" - postcss-overflow-shorthand "^3.0.4" - postcss-page-break "^3.0.4" - postcss-place "^7.0.5" - postcss-pseudo-class-any-link "^7.1.6" - postcss-replace-overflow-wrap "^4.0.0" - postcss-selector-not "^6.0.1" - postcss-value-parser "^4.2.0" - postcss-preset-env@^7.4.2: version "7.8.3" resolved "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-7.8.3.tgz" @@ -9630,24 +9004,6 @@ postcss-value-parser@^4.0.0, postcss-value-parser@^4.1.0, postcss-value-parser@^ resolved "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz" integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== -postcss@8.4.16, postcss@^8.4.7: - version "8.4.16" - resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.16.tgz" - integrity sha512-ipHE1XBvKzm5xI7hiHCZJCSugxvsdq2mPnsq5+UF+VHCjiBvtDrlxJfMBToWaP9D5XlgNmcFGqoHmUn0EYEaRQ== - dependencies: - nanoid "^3.3.4" - picocolors "^1.0.0" - source-map-js "^1.0.2" - -postcss@8.4.21, postcss@^8.1, postcss@^8.2.14, postcss@^8.3.11, postcss@^8.3.7, postcss@^8.4.19: - version "8.4.21" - resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.21.tgz" - integrity sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg== - dependencies: - nanoid "^3.3.4" - picocolors "^1.0.0" - source-map-js "^1.0.2" - postcss@^6.0.6: version "6.0.23" resolved "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz" @@ -9657,6 +9013,15 @@ postcss@^6.0.6: source-map "^0.6.1" supports-color "^5.4.0" +"postcss@^7.0.0 || ^8.0.1", postcss@^8, postcss@^8.0.0, postcss@^8.0.3, postcss@^8.1, postcss@^8.1.0, postcss@^8.2, postcss@^8.2.14, postcss@^8.3, postcss@^8.3.11, postcss@^8.3.7, postcss@^8.4, postcss@^8.4.19, postcss@^8.4.6, postcss@8.4.21: + version "8.4.21" + resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.21.tgz" + integrity sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg== + dependencies: + nanoid "^3.3.4" + picocolors "^1.0.0" + source-map-js "^1.0.2" + postcss@^7.0.14: version "7.0.39" resolved "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz" @@ -9711,7 +9076,7 @@ prompts@~2.4.2: kleur "^3.0.3" sisteransi "^1.0.5" -prop-types@^15.6.0, prop-types@^15.6.2, prop-types@^15.7.2, prop-types@^15.8.1: +prop-types@^15.5, prop-types@^15.6.0, prop-types@^15.6.2, prop-types@^15.7.2, prop-types@^15.8.1: version "15.8.1" resolved "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz" integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== @@ -9761,17 +9126,12 @@ punycode@^2.1.0, punycode@^2.1.1: resolved "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz" integrity sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA== -q@^1.4.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" - integrity sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw== - qjobs@^1.2.0: version "1.2.0" resolved "https://registry.npmjs.org/qjobs/-/qjobs-1.2.0.tgz" integrity sha512-8YOJEHtxpySA3fFDyCRxA+UUV+fA+rTWnuWvylOK/NCjhY+b4ocCtmu8TtsWb+mYeU+GCHf/S66KZF/AsteKHg== -qs@6.11.0, qs@^6.11.0: +qs@^6.11.0, qs@6.11.0: version "6.11.0" resolved "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz" integrity sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q== @@ -9785,11 +9145,6 @@ qs@~6.10.3: dependencies: side-channel "^1.0.4" -qs@~6.5.2: - version "6.5.3" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.3.tgz#3aeeffc91967ef6e35c0e488ef46fb296ab76aad" - integrity sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA== - querystringify@^2.1.1: version "2.2.0" resolved "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz" @@ -9817,7 +9172,7 @@ range-parser@^1.2.1, range-parser@~1.2.0, range-parser@~1.2.1: resolved "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz" integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== -raw-body@2.5.1, raw-body@^2.3.2: +raw-body@^2.3.2, raw-body@2.5.1: version "2.5.1" resolved "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz" integrity sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig== @@ -9908,7 +9263,7 @@ react-dnd@^10.0.2: dnd-core "^10.0.2" hoist-non-react-statics "^3.3.0" -react-dom@^16.14.0: +"react-dom@^0.14.0 || ^15.0.0-0 || ^16.0.0", "react-dom@^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0", "react-dom@^15.3.0 || ^16.0.0-alpha || ^17.0.0 || ^18.0.0-rc", "react-dom@^16.13.1 || ^17.0.0 || ^18.0.0", react-dom@^16.14.0, react-dom@^16.3.2, "react-dom@^16.8.0 || ^17.0.0", react-dom@^16.8.3, "react-dom@^16.8.5 || ^17.0.0 || ^18.0.0", "react-dom@>= 16.3.0", "react-dom@>= 16.8", react-dom@>=16.3.0, react-dom@>=16.6.0, react-dom@>=16.8, react-dom@16.x: version "16.14.0" resolved "https://registry.npmjs.org/react-dom/-/react-dom-16.14.0.tgz" integrity sha512-1gCeQXDLoIqMgqD3IO2Ah9bnf0w9kzhwN5q4FGnHZ67hBm9yePzB5JJAIQCc8x3pFnNlwFq4RidZggNAAkzWWw== @@ -9947,7 +9302,12 @@ react-image@^4.0.1: resolved "https://registry.npmjs.org/react-image/-/react-image-4.1.0.tgz" integrity sha512-qwPNlelQe9Zy14K2pGWSwoL+vHsAwmJKS6gkotekDgRpcnRuzXNap00GfibD3eEPYu3WCPlyIUUNzcyHOrLHjw== -react-is@^16.13.1, react-is@^16.7.0: +react-is@^16.13.1: + version "16.13.1" + resolved "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz" + integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== + +react-is@^16.7.0: version "16.13.1" resolved "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz" integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== @@ -10031,7 +9391,7 @@ react-window@^1.8.5: "@babel/runtime" "^7.0.0" memoize-one ">=3.1.1 <6" -react@^16.14.0: +"react@^0.14.0 || ^15.0.0-0 || ^16.0.0", "react@^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0", "react@^15.3.0 || ^16.0.0-alpha || ^17.0.0 || ^18.0.0-rc", "react@^15.3.0 || 16 || 17 || 18", "react@^15.6 || ^16", react@^16.0.0, react@^16.13, react@^16.13.1, "react@^16.13.1 || ^17.0.0 || ^18.0.0", react@^16.14.0, react@^16.3.0, react@^16.3.2, react@^16.3.x, "react@^16.8.0 || ^17.0.0", "react@^16.8.0 || ^17.0.0 || ^18.0.0", react@^16.8.3, "react@^16.8.3 || ^17 || ^18", "react@^16.8.5 || ^17.0.0 || ^18.0.0", "react@>= 16.3.0", "react@>= 16.8", "react@>= 16.8.0", react@>=0.14, react@>=16.3.0, react@>=16.6.0, react@>=16.8, react@16.x: version "16.14.0" resolved "https://registry.npmjs.org/react/-/react-16.14.0.tgz" integrity sha512-0X2CImDkJGApiAlcf0ODKIneSwBPhqJawOa5wCtKbu7ZECrmS26NvtSILynQ66cgkT/RJ4LidJOc3bUESwmU8g== @@ -10118,7 +9478,7 @@ redux-thunk@^2.3.0: resolved "https://registry.npmjs.org/redux-thunk/-/redux-thunk-2.4.2.tgz" integrity sha512-+P3TjtnP0k/FEjcBL5FZpoovtvrTNT/UXd4/sluaSyrURlSlhLSzEdfsTBW7WsKB6yPvgd7q/iZPICFjW4o57Q== -redux@^4.0.0, redux@^4.0.4, redux@^4.0.5: +"redux@^3.1.0 || ^4.0.0", redux@^4, redux@^4.0.0, redux@^4.0.4, redux@^4.0.5: version "4.2.1" resolved "https://registry.npmjs.org/redux/-/redux-4.2.1.tgz" integrity sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w== @@ -10142,11 +9502,6 @@ regenerate@^1.4.2: resolved "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz" integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A== -regenerator-runtime@0.13.9: - version "0.13.9" - resolved "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz" - integrity sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA== - regenerator-runtime@^0.13.11, regenerator-runtime@^0.13.4: version "0.13.11" resolved "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz" @@ -10199,32 +9554,6 @@ request-progress@^3.0.0: dependencies: throttleit "^1.0.0" -request@^2.87.0: - version "2.88.2" - resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3" - integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw== - dependencies: - aws-sign2 "~0.7.0" - aws4 "^1.8.0" - caseless "~0.12.0" - combined-stream "~1.0.6" - extend "~3.0.2" - forever-agent "~0.6.1" - form-data "~2.3.2" - har-validator "~5.1.3" - http-signature "~1.2.0" - is-typedarray "~1.0.0" - isstream "~0.1.2" - json-stringify-safe "~5.0.1" - mime-types "~2.1.19" - oauth-sign "~0.9.0" - performance-now "^2.1.0" - qs "~6.5.2" - safe-buffer "^5.1.2" - tough-cookie "~2.5.0" - tunnel-agent "^0.6.0" - uuid "^3.3.2" - require-directory@^2.1.1: version "2.1.1" resolved "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz" @@ -10240,7 +9569,7 @@ requires-port@^1.0.0: resolved "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz" integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ== -reselect@^4.0.0: +reselect@^4.0.0, reselect@>1.0.0: version "4.1.7" resolved "https://registry.npmjs.org/reselect/-/reselect-4.1.7.tgz" integrity sha512-Zu1xbUt3/OPwsXL46hvOOoQrap2azE7ZQbokq61BQfiXvhewsKDwhMeZjTX9sX0nvw1t/U5Audyn1I9P/m9z0A== @@ -10273,15 +9602,6 @@ resolve-url-loader@5.0.0: postcss "^8.2.14" source-map "0.6.1" -resolve@1.22.1: - version "1.22.1" - resolved "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz" - integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw== - dependencies: - is-core-module "^2.9.0" - path-parse "^1.0.7" - supports-preserve-symlinks-flag "^1.0.0" - resolve@^1.1.7, resolve@^1.14.2, resolve@^1.22.1, resolve@^1.9.0: version "1.22.2" resolved "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz" @@ -10291,6 +9611,15 @@ resolve@^1.1.7, resolve@^1.14.2, resolve@^1.22.1, resolve@^1.9.0: path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" +resolve@1.22.1: + version "1.22.1" + resolved "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz" + integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw== + dependencies: + is-core-module "^2.9.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + resp-modifier@6.0.2: version "6.0.2" resolved "https://registry.npmjs.org/resp-modifier/-/resp-modifier-6.0.2.tgz" @@ -10327,9 +9656,9 @@ rfdc@^1.3.0: resolved "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz" integrity sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA== -rimraf@^2.2.8, rimraf@^2.5.2, rimraf@^2.6.3: +rimraf@^2.6.3: version "2.7.1" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" + resolved "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz" integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== dependencies: glob "^7.1.3" @@ -10390,26 +9719,38 @@ rxjs-spy@^8.0.2: rxjs-report-usage "^1.0.4" stacktrace-gps "^3.0.2" -rxjs@6.6.7, rxjs@^6.5.5, rxjs@~6.6.0: - version "6.6.7" - resolved "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz" - integrity sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ== - dependencies: - tslib "^1.9.0" - -rxjs@^7.5.1, rxjs@^7.5.5: +"rxjs@^6.5.3 || ^7.4.0", "rxjs@^6.5.3 || ^7.5.0", rxjs@^7.0.0, rxjs@^7.5.1, rxjs@^7.5.5, rxjs@>=6.5.3: version "7.8.0" resolved "https://registry.npmjs.org/rxjs/-/rxjs-7.8.0.tgz" integrity sha512-F2+gxDshqmIub1KdvZkaEfGDwLNpPvk9Fs6LD/MyQxNgMds/WH9OdDDXOmxUZpME+iSK3rQCctkL0DYyytUqMg== dependencies: tslib "^2.1.0" -safe-buffer@5.1.2, safe-buffer@>=5.1.0, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: +rxjs@^6.5.5: + version "6.6.7" + resolved "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz" + integrity sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ== + dependencies: + tslib "^1.9.0" + +rxjs@~6.6.0, rxjs@6.6.7: + version "6.6.7" + resolved "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz" + integrity sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ== + dependencies: + tslib "^1.9.0" + +safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.2, safe-buffer@>=5.1.0, safe-buffer@~5.1.0, safe-buffer@~5.1.1, safe-buffer@5.1.2: version "5.1.2" resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== -safe-buffer@5.2.1, safe-buffer@~5.2.0: +safe-buffer@~5.2.0: + version "5.2.1" + resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +safe-buffer@5.2.1: version "5.2.1" resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== @@ -10423,7 +9764,7 @@ safe-regex-test@^1.0.0: get-intrinsic "^1.1.3" is-regex "^1.1.4" -"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: +safer-buffer@^2.0.2, safer-buffer@^2.1.0, "safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0", safer-buffer@~2.1.0: version "2.1.2" resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== @@ -10440,10 +9781,10 @@ sanitize-html@^2.7.2: parse-srcset "^1.0.2" postcss "^8.3.11" -sass-loader@13.0.2: - version "13.0.2" - resolved "https://registry.npmjs.org/sass-loader/-/sass-loader-13.0.2.tgz" - integrity sha512-BbiqbVmbfJaWVeOOAu2o7DhYWtcNmTfvroVgFXa6k2hHheMxNAeDHLNoDy/Q5aoaVlz0LH+MbMktKwm9vN/j8Q== +sass-loader@^12.6.0: + version "12.6.0" + resolved "https://registry.npmjs.org/sass-loader/-/sass-loader-12.6.0.tgz" + integrity sha512-oLTaH0YCtX4cfnJZxKSLAyglED0naiYfNG1iXfU5w1LNZ+ukoA5DtyDIN5zmKVZwYNJP4KRc5Y3hkWga+7tYfA== dependencies: klona "^2.0.4" neo-async "^2.6.2" @@ -10456,14 +9797,6 @@ sass-loader@13.2.0: klona "^2.0.4" neo-async "^2.6.2" -sass-loader@^12.6.0: - version "12.6.0" - resolved "https://registry.npmjs.org/sass-loader/-/sass-loader-12.6.0.tgz" - integrity sha512-oLTaH0YCtX4cfnJZxKSLAyglED0naiYfNG1iXfU5w1LNZ+ukoA5DtyDIN5zmKVZwYNJP4KRc5Y3hkWga+7tYfA== - dependencies: - klona "^2.0.4" - neo-async "^2.6.2" - sass-resources-loader@^2.1.1: version "2.2.5" resolved "https://registry.npmjs.org/sass-resources-loader/-/sass-resources-loader-2.2.5.tgz" @@ -10474,14 +9807,12 @@ sass-resources-loader@^2.1.1: glob "^7.1.6" loader-utils "^2.0.0" -sass@1.54.4: - version "1.54.4" - resolved "https://registry.npmjs.org/sass/-/sass-1.54.4.tgz" - integrity sha512-3tmF16yvnBwtlPrNBHw/H907j8MlOX8aTBnlNX1yrKx24RKcJGPyLhFUwkoKBKesR3unP93/2z14Ll8NicwQUA== +sass@^1.3.0, sass@~1.33.0: + version "1.33.0" + resolved "https://registry.npmjs.org/sass/-/sass-1.33.0.tgz" + integrity sha512-9v0MUXnSi62FtfjqcwZ+b8B9FIxdwFEb3FPUkjEPXWd0b5KcnPGSp2XF9WrzcH1ZxedfgJVTdA3A1j4eEj53xg== dependencies: chokidar ">=3.0.0 <4.0.0" - immutable "^4.0.0" - source-map-js ">=0.6.2 <2.0.0" sass@1.58.1: version "1.58.1" @@ -10492,16 +9823,9 @@ sass@1.58.1: immutable "^4.0.0" source-map-js ">=0.6.2 <2.0.0" -sass@~1.33.0: - version "1.33.0" - resolved "https://registry.npmjs.org/sass/-/sass-1.33.0.tgz" - integrity sha512-9v0MUXnSi62FtfjqcwZ+b8B9FIxdwFEb3FPUkjEPXWd0b5KcnPGSp2XF9WrzcH1ZxedfgJVTdA3A1j4eEj53xg== - dependencies: - chokidar ">=3.0.0 <4.0.0" - -sax@>=0.6.0, sax@^1.2.4, sax@~1.2.4: +sax@^1.2.4: version "1.2.4" - resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" + resolved "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz" integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== saxes@^5.0.1: @@ -10526,16 +9850,25 @@ scheduler@^0.19.1: loose-envify "^1.1.0" object-assign "^4.1.1" -schema-utils@^2.6.5: - version "2.7.1" - resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz" - integrity sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg== +schema-utils@^3.0.0: + version "3.1.1" + resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz" + integrity sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw== dependencies: - "@types/json-schema" "^7.0.5" - ajv "^6.12.4" + "@types/json-schema" "^7.0.8" + ajv "^6.12.5" ajv-keywords "^3.5.2" -schema-utils@^3.0.0, schema-utils@^3.1.0, schema-utils@^3.1.1: +schema-utils@^3.1.0: + version "3.1.1" + resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz" + integrity sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw== + dependencies: + "@types/json-schema" "^7.0.8" + ajv "^6.12.5" + ajv-keywords "^3.5.2" + +schema-utils@^3.1.1: version "3.1.1" resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz" integrity sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw== @@ -10559,30 +9892,21 @@ select-hose@^2.0.0: resolved "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz" integrity sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg== -selfsigned@^2.0.1, selfsigned@^2.1.1: +selfsigned@^2.1.1: version "2.1.1" resolved "https://registry.npmjs.org/selfsigned/-/selfsigned-2.1.1.tgz" integrity sha512-GSL3aowiF7wa/WtSFwnUrludWFoNhftq8bUkH9pkzjpN2XSPOAYEgg6e0sS9s0rZwgJzJiQRPU18A6clnoW5wQ== dependencies: node-forge "^1" -semver@7.3.7: - version "7.3.7" - resolved "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz" - integrity sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g== - dependencies: - lru-cache "^6.0.0" - -semver@7.3.8, semver@^7.3.8: - version "7.3.8" - resolved "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz" - integrity sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A== - dependencies: - lru-cache "^6.0.0" - -semver@^5.3.0, semver@^5.6.0, semver@^5.7.1: +semver@^5.6.0: version "5.7.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" + resolved "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz" + integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== + +semver@^5.7.1: + version "5.7.1" + resolved "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz" integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== semver@^6.0.0, semver@^6.1.1, semver@^6.1.2, semver@^6.3.0: @@ -10590,7 +9914,42 @@ semver@^6.0.0, semver@^6.1.1, semver@^6.1.2, semver@^6.3.0: resolved "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== -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.0.0: + version "7.4.0" + resolved "https://registry.npmjs.org/semver/-/semver-7.4.0.tgz" + integrity sha512-RgOxM8Mw+7Zus0+zcLEUn8+JfoLpj/huFTItQy2hsM4khuC1HYRDp0cU482Ewn/Fcy6bCjufD8vAj7voC66KQw== + dependencies: + lru-cache "^6.0.0" + +semver@^7.1.1: + version "7.4.0" + resolved "https://registry.npmjs.org/semver/-/semver-7.4.0.tgz" + integrity sha512-RgOxM8Mw+7Zus0+zcLEUn8+JfoLpj/huFTItQy2hsM4khuC1HYRDp0cU482Ewn/Fcy6bCjufD8vAj7voC66KQw== + dependencies: + lru-cache "^6.0.0" + +semver@^7.3.2: + version "7.4.0" + resolved "https://registry.npmjs.org/semver/-/semver-7.4.0.tgz" + integrity sha512-RgOxM8Mw+7Zus0+zcLEUn8+JfoLpj/huFTItQy2hsM4khuC1HYRDp0cU482Ewn/Fcy6bCjufD8vAj7voC66KQw== + dependencies: + lru-cache "^6.0.0" + +semver@^7.3.4: + version "7.4.0" + resolved "https://registry.npmjs.org/semver/-/semver-7.4.0.tgz" + integrity sha512-RgOxM8Mw+7Zus0+zcLEUn8+JfoLpj/huFTItQy2hsM4khuC1HYRDp0cU482Ewn/Fcy6bCjufD8vAj7voC66KQw== + dependencies: + lru-cache "^6.0.0" + +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" + integrity sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A== + dependencies: + lru-cache "^6.0.0" + +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== @@ -10654,7 +10013,7 @@ serialize-javascript@^6.0.0, serialize-javascript@^6.0.1: dependencies: randombytes "^2.1.0" -serve-index@1.9.1, serve-index@^1.9.1: +serve-index@^1.9.1, serve-index@1.9.1: version "1.9.1" resolved "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz" integrity sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw== @@ -10667,6 +10026,16 @@ serve-index@1.9.1, serve-index@^1.9.1: mime-types "~2.1.17" parseurl "~1.3.2" +serve-static@^1.14.1, serve-static@1.15.0: + version "1.15.0" + resolved "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz" + integrity sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g== + dependencies: + encodeurl "~1.0.2" + escape-html "~1.0.3" + parseurl "~1.3.3" + send "0.18.0" + serve-static@1.13.2: version "1.13.2" resolved "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz" @@ -10677,16 +10046,6 @@ serve-static@1.13.2: parseurl "~1.3.2" send "0.16.2" -serve-static@1.15.0, serve-static@^1.14.1: - version "1.15.0" - resolved "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz" - integrity sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g== - dependencies: - encodeurl "~1.0.2" - escape-html "~1.0.3" - parseurl "~1.3.3" - send "0.18.0" - server-destroy@1.0.1: version "1.0.1" resolved "https://registry.npmjs.org/server-destroy/-/server-destroy-1.0.1.tgz" @@ -10881,7 +10240,7 @@ socks@^2.6.2: ip "^2.0.0" smart-buffer "^4.2.0" -sortablejs@1.13.0: +sortablejs@>=1.7.0, sortablejs@1.13.0: version "1.13.0" resolved "https://registry.npmjs.org/sortablejs/-/sortablejs-1.13.0.tgz" integrity sha512-RBJirPY0spWCrU5yCmWM1eFs/XgX2J5c6b275/YyxFRgnzPhKl/TDeU2hNR8Dt7ITq66NRPM4UlOt+e5O4CFHg== @@ -10891,20 +10250,11 @@ source-list-map@^2.0.0: resolved "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz" integrity sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw== -"source-map-js@>=0.6.2 <2.0.0", source-map-js@^1.0.2: +source-map-js@^1.0.2, "source-map-js@>=0.6.2 <2.0.0": version "1.0.2" resolved "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz" integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== -source-map-loader@4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/source-map-loader/-/source-map-loader-4.0.0.tgz" - integrity sha512-i3KVgM3+QPAHNbGavK+VBq03YoJl24m9JWNbLgsjTj8aJzXG9M61bantBTNBt7CNwY2FYf+RJRYJ3pzalKjIrw== - dependencies: - abab "^2.0.6" - iconv-lite "^0.6.3" - source-map-js "^1.0.2" - source-map-loader@4.0.1: version "4.0.1" resolved "https://registry.npmjs.org/source-map-loader/-/source-map-loader-4.0.1.tgz" @@ -10914,7 +10264,7 @@ source-map-loader@4.0.1: iconv-lite "^0.6.3" source-map-js "^1.0.2" -source-map-support@0.5.21, source-map-support@^0.5.17, source-map-support@^0.5.5, source-map-support@~0.5.20: +source-map-support@^0.5.17, source-map-support@^0.5.5, source-map-support@~0.5.20, source-map-support@0.5.21: version "0.5.21" resolved "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz" integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== @@ -10922,22 +10272,22 @@ source-map-support@0.5.21, source-map-support@^0.5.17, source-map-support@^0.5.5 buffer-from "^1.0.0" source-map "^0.6.0" +source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1, source-map@0.6.1: + version "0.6.1" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + source-map@0.5.6: version "0.5.6" resolved "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz" integrity sha512-MjZkVp0NHr5+TPihLcadqnlVoGIoWo4IBHptutGh9wI3ttUYvCG26HkSuDi+K6lsZ25syXJXcctwgyVCt//xqA== -source-map@0.6.1, source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1: - version "0.6.1" - resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" - integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== - source-map@0.7.3: version "0.7.3" resolved "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz" integrity sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ== -source-map@0.7.4, source-map@^0.7.3: +source-map@0.7.4: version "0.7.4" resolved "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz" integrity sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA== @@ -11010,9 +10360,9 @@ sprintf-js@~1.0.2: resolved "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz" integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== -sshpk@^1.14.1, sshpk@^1.7.0: +sshpk@^1.14.1: version "1.17.0" - resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.17.0.tgz#578082d92d4fe612b13007496e543fa0fbcbe4c5" + resolved "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz" integrity sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ== dependencies: asn1 "~0.2.3" @@ -11059,11 +10409,6 @@ stacktrace-gps@^3.0.2: source-map "0.5.6" stackframe "^1.3.4" -statuses@2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz" - integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== - "statuses@>= 1.4.0 < 2", statuses@~1.4.0: version "1.4.0" resolved "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz" @@ -11079,6 +10424,11 @@ statuses@~1.5.0: resolved "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz" integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA== +statuses@2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz" + integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== + stop-iteration-iterator@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz" @@ -11103,6 +10453,20 @@ streamroller@^3.1.5: debug "^4.3.4" fs-extra "^8.1.0" +string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + "string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: version "4.2.3" resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" @@ -11139,27 +10503,6 @@ string.prototype.trimstart@^1.0.6: define-properties "^1.1.4" es-abstract "^1.20.4" -string_decoder@^1.1.1: - version "1.3.0" - resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz" - integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== - dependencies: - safe-buffer "~5.2.0" - -string_decoder@~1.1.1: - version "1.1.1" - resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz" - integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== - dependencies: - safe-buffer "~5.1.0" - -strip-ansi@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" - integrity sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg== - dependencies: - ansi-regex "^2.0.0" - strip-ansi@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz" @@ -11184,36 +10527,11 @@ strip-final-newline@^2.0.0: resolved "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz" integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== -strip-json-comments@3.1.1, strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: +strip-json-comments@^3.1.0, strip-json-comments@^3.1.1, strip-json-comments@3.1.1: version "3.1.1" resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== -stylus-loader@7.0.0: - version "7.0.0" - resolved "https://registry.npmjs.org/stylus-loader/-/stylus-loader-7.0.0.tgz" - integrity sha512-WTbtLrNfOfLgzTaR9Lj/BPhQroKk/LC1hfTXSUbrxmxgfUo3Y3LpmKRVA2R1XbjvTAvOfaian9vOyfv1z99E+A== - dependencies: - fast-glob "^3.2.11" - klona "^2.0.5" - normalize-path "^3.0.0" - -stylus@0.59.0: - version "0.59.0" - resolved "https://registry.npmjs.org/stylus/-/stylus-0.59.0.tgz" - integrity sha512-lQ9w/XIOH5ZHVNuNbWW8D822r+/wBSO/d6XvtyHLF7LW4KaCIDeVbvn5DF8fGCJAUCwVhVi/h6J0NUcnylUEjg== - dependencies: - "@adobe/css-tools" "^4.0.1" - debug "^4.3.2" - glob "^7.1.6" - sax "~1.2.4" - source-map "^0.7.3" - -supports-color@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" - integrity sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g== - supports-color@^5.3.0, supports-color@^5.4.0, supports-color@^5.5.0: version "5.5.0" resolved "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz" @@ -11228,7 +10546,14 @@ supports-color@^7.1.0: dependencies: has-flag "^4.0.0" -supports-color@^8.0.0, supports-color@^8.1.1: +supports-color@^8.0.0: + version "8.1.1" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz" + integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== + dependencies: + has-flag "^4.0.0" + +supports-color@^8.1.1: version "8.1.1" resolved "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz" integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== @@ -11278,10 +10603,10 @@ terser-webpack-plugin@^5.1.3: serialize-javascript "^6.0.1" terser "^5.16.5" -terser@5.14.2: - version "5.14.2" - resolved "https://registry.npmjs.org/terser/-/terser-5.14.2.tgz" - integrity sha512-oL0rGeM/WFQCUd0y2QrWxYnq7tfSuKBiqTjRPWrRgB46WD/kiwHwF8T23z78H6Q6kGCuuHcPB+KULHRdxvVGQA== +terser@^5.16.5: + version "5.16.9" + resolved "https://registry.npmjs.org/terser/-/terser-5.16.9.tgz" + integrity sha512-HPa/FdTB9XGI2H1/keLFZHxl6WNvAI4YalHGtDQTlMnJcoqSab1UwL4l1hGEhs6/GmLHBZIg/YgB++jcbzoOEg== dependencies: "@jridgewell/source-map" "^0.3.2" acorn "^8.5.0" @@ -11298,16 +10623,6 @@ terser@5.16.3: commander "^2.20.0" source-map-support "~0.5.20" -terser@^5.16.5: - version "5.16.9" - resolved "https://registry.npmjs.org/terser/-/terser-5.16.9.tgz" - integrity sha512-HPa/FdTB9XGI2H1/keLFZHxl6WNvAI4YalHGtDQTlMnJcoqSab1UwL4l1hGEhs6/GmLHBZIg/YgB++jcbzoOEg== - dependencies: - "@jridgewell/source-map" "^0.3.2" - acorn "^8.5.0" - commander "^2.20.0" - source-map-support "~0.5.20" - test-exclude@^6.0.0: version "6.0.0" resolved "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz" @@ -11317,7 +10632,7 @@ test-exclude@^6.0.0: glob "^7.1.4" minimatch "^3.0.4" -text-table@0.2.0, text-table@^0.2.0: +text-table@^0.2.0, text-table@0.2.0: version "0.2.0" resolved "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz" integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== @@ -11352,13 +10667,6 @@ tiny-warning@^1.0.2: resolved "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz" integrity sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA== -tmp@0.2.1, tmp@^0.2.1, tmp@~0.2.1: - version "0.2.1" - resolved "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz" - integrity sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ== - dependencies: - rimraf "^3.0.0" - tmp@^0.0.33: version "0.0.33" resolved "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz" @@ -11366,6 +10674,27 @@ tmp@^0.0.33: dependencies: os-tmpdir "~1.0.2" +tmp@^0.2.1: + version "0.2.1" + resolved "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz" + integrity sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ== + dependencies: + rimraf "^3.0.0" + +tmp@~0.2.1: + version "0.2.1" + resolved "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz" + integrity sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ== + dependencies: + rimraf "^3.0.0" + +tmp@0.2.1: + version "0.2.1" + resolved "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz" + integrity sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ== + dependencies: + rimraf "^3.0.0" + to-fast-properties@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz" @@ -11437,17 +10766,17 @@ tr46@~0.0.3: resolved "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz" integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== -tree-kill@1.2.2, tree-kill@^1.2.2: +tree-kill@^1.2.2, tree-kill@1.2.2: version "1.2.2" resolved "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz" integrity sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A== -ts-node@10.2.1, ts-node@^10.0.0: - version "10.2.1" - resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.2.1.tgz#4cc93bea0a7aba2179497e65bb08ddfc198b3ab5" - integrity sha512-hCnyOyuGmD5wHleOQX6NIjJtYVIO8bPP8F2acWkB4W06wdlkgyvJtubO/I9NkI88hCFECbsEgoLc0VNkYmcSfw== +ts-node@^10.0.0: + version "10.9.1" + resolved "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz" + integrity sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw== dependencies: - "@cspotcode/source-map-support" "0.6.1" + "@cspotcode/source-map-support" "^0.8.0" "@tsconfig/node10" "^1.0.7" "@tsconfig/node12" "^1.0.7" "@tsconfig/node14" "^1.0.0" @@ -11458,6 +10787,7 @@ ts-node@10.2.1, ts-node@^10.0.0: create-require "^1.1.0" diff "^4.0.1" make-error "^1.1.1" + v8-compile-cache-lib "^3.0.1" yn "3.1.1" ts-node@^8.10.2: @@ -11471,7 +10801,7 @@ ts-node@^8.10.2: source-map-support "^0.5.17" yn "3.1.1" -tsconfig-paths@^3.14.1, tsconfig-paths@^3.9.0: +tsconfig-paths@^3.14.1: version "3.14.2" resolved "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz" integrity sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g== @@ -11481,25 +10811,34 @@ tsconfig-paths@^3.14.1, tsconfig-paths@^3.9.0: minimist "^1.2.6" strip-bom "^3.0.0" -tslib@2.3.1: - version "2.3.1" - resolved "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz" - integrity sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw== +tsconfig-paths@^4.1.0: + version "4.2.0" + resolved "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz" + integrity sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg== + dependencies: + json5 "^2.2.2" + minimist "^1.2.6" + strip-bom "^3.0.0" -tslib@2.4.0: - version "2.4.0" - resolved "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz" - integrity sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ== +tslib@^1.8.1: + version "1.14.1" + resolved "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz" + integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== -tslib@2.5.0, tslib@^2.0.0, tslib@^2.0.3, tslib@^2.1.0, tslib@^2.2.0, tslib@^2.3.0, tslib@^2.3.1: +tslib@^1.9.0: + version "1.14.1" + resolved "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz" + integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== + +tslib@^2.0.0, tslib@^2.0.3, tslib@^2.1.0, tslib@^2.2.0, tslib@^2.3.0, tslib@^2.3.1, tslib@2.5.0: version "2.5.0" resolved "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz" integrity sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg== -tslib@^1.8.1, tslib@^1.9.0: - version "1.14.1" - resolved "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz" - integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== +tslib@2.3.1: + version "2.3.1" + resolved "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz" + integrity sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw== tsutils@^3.21.0: version "3.21.0" @@ -11593,16 +10932,16 @@ typescript-tuple@^2.2.1: dependencies: typescript-compare "^0.0.2" +typescript@*, "typescript@^3.7.5 || ^4.0.0 || ^5.0.0", typescript@>=2.7, "typescript@>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta", "typescript@>=3.2.x || >= 4.x", typescript@>=3.7.5, "typescript@>=4.8.2 <5.0", typescript@~4.8.4: + version "4.8.4" + resolved "https://registry.npmjs.org/typescript/-/typescript-4.8.4.tgz" + integrity sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ== + typescript@^2.5.0: version "2.9.2" resolved "https://registry.npmjs.org/typescript/-/typescript-2.9.2.tgz" integrity sha512-Gr4p6nFNaoufRIY4NMdpQRNmgxVIGMs4Fcu/ujdYk3nAZqk7supzBE9idmvfZIlH/Cuj//dvi+019qEue9lV0w== -typescript@~4.8.4: - version "4.8.4" - resolved "https://registry.npmjs.org/typescript/-/typescript-4.8.4.tgz" - integrity sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ== - ua-parser-js@^0.7.30: version "0.7.35" resolved "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.35.tgz" @@ -11718,7 +11057,7 @@ universalify@^2.0.0: resolved "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz" integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== -unpipe@1.0.0, unpipe@~1.0.0: +unpipe@~1.0.0, unpipe@1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz" integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== @@ -11766,7 +11105,12 @@ utils-merge@1.0.1: resolved "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz" integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== -uuid@^3.2.1, uuid@^3.3.2: +uuid@^3.2.1: + version "3.4.0" + resolved "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz" + integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== + +uuid@^3.3.2: version "3.4.0" resolved "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz" integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== @@ -11776,6 +11120,11 @@ uuid@^8.1.0, uuid@^8.3.2: resolved "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz" integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== +v8-compile-cache-lib@^3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz" + integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== + valid-data-url@^3.0.0: version "3.0.1" resolved "https://registry.npmjs.org/valid-data-url/-/valid-data-url-3.0.1.tgz" @@ -11810,16 +11159,16 @@ verror@1.10.0: core-util-is "1.0.2" extsprintf "^1.2.0" -void-elements@3.1.0: - version "3.1.0" - resolved "https://registry.npmjs.org/void-elements/-/void-elements-3.1.0.tgz" - integrity sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w== - void-elements@^2.0.0: version "2.0.1" resolved "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz" integrity sha512-qZKX4RnBzH2ugr8Lxa7x+0V6XD9Sb/ouARtiasEQCHB1EVU4NXtmHsDDrx1dO4ne5fc3J6EW05BP1Dl0z0iung== +void-elements@3.1.0: + version "3.1.0" + resolved "https://registry.npmjs.org/void-elements/-/void-elements-3.1.0.tgz" + integrity sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w== + w3c-hr-time@^1.0.2: version "1.0.2" resolved "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz" @@ -11875,23 +11224,6 @@ web-resource-inliner@^6.0.1: node-fetch "^2.6.0" valid-data-url "^3.0.0" -webdriver-manager@^12.1.8: - version "12.1.9" - resolved "https://registry.yarnpkg.com/webdriver-manager/-/webdriver-manager-12.1.9.tgz#8d83543b92711b7217b39fef4cda958a4703d2df" - integrity sha512-Yl113uKm8z4m/KMUVWHq1Sjtla2uxEBtx2Ue3AmIlnlPAKloDn/Lvmy6pqWCUersVISpdMeVpAaGbNnvMuT2LQ== - dependencies: - adm-zip "^0.5.2" - chalk "^1.1.1" - del "^2.2.0" - glob "^7.0.3" - ini "^1.3.4" - minimist "^1.2.0" - q "^1.4.1" - request "^2.87.0" - rimraf "^2.5.2" - semver "^5.3.0" - xml2js "^0.4.17" - webfontloader@1.6.28: version "1.6.28" resolved "https://registry.npmjs.org/webfontloader/-/webfontloader-1.6.28.tgz" @@ -11933,7 +11265,7 @@ webpack-bundle-analyzer@^4.4.0: sirv "^1.0.7" ws "^7.3.1" -webpack-cli@^4.2.0: +webpack-cli@^4.2.0, webpack-cli@4.x.x: version "4.10.0" resolved "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.10.0.tgz" integrity sha512-NLhDfH/h4O6UOy+0LSso42xvYypClINuMNBVVzX4vX98TmTaTUxwRbXdhucbFMd2qLaCTcLq/PdYrvi8onw90w== @@ -11951,7 +11283,7 @@ webpack-cli@^4.2.0: rechoir "^0.7.0" webpack-merge "^5.7.3" -webpack-dev-middleware@5.3.3, webpack-dev-middleware@^5.3.1: +webpack-dev-middleware@^5.3.1: version "5.3.3" resolved "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz" integrity sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA== @@ -11973,10 +11305,10 @@ webpack-dev-middleware@6.0.1: range-parser "^1.2.1" schema-utils "^4.0.0" -webpack-dev-server@4.11.0: - version "4.11.0" - resolved "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.11.0.tgz" - integrity sha512-L5S4Q2zT57SK7tazgzjMiSMBdsw+rGYIX27MgPgx7LDhWO0lViPrHKoLS7jo5In06PWYAhlYu3PbyoC6yAThbw== +webpack-dev-server@^4.0.0, webpack-dev-server@^4.5.0: + version "4.13.2" + resolved "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.13.2.tgz" + integrity sha512-5i6TrGBRxG4vnfDpB6qSQGfnB6skGBXNL5/542w2uRGLimX6qeE5BQMLrzIC3JYV/xlGOv+s+hTleI9AZKUQNw== dependencies: "@types/bonjour" "^3.5.9" "@types/connect-history-api-fallback" "^1.3.5" @@ -11997,16 +11329,17 @@ webpack-dev-server@4.11.0: html-entities "^2.3.2" http-proxy-middleware "^2.0.3" ipaddr.js "^2.0.1" + launch-editor "^2.6.0" open "^8.0.9" p-retry "^4.5.0" rimraf "^3.0.2" schema-utils "^4.0.0" - selfsigned "^2.0.1" + selfsigned "^2.1.1" serve-index "^1.9.1" sockjs "^0.3.24" spdy "^4.0.2" webpack-dev-middleware "^5.3.1" - ws "^8.4.2" + ws "^8.13.0" webpack-dev-server@4.11.1: version "4.11.1" @@ -12043,43 +11376,7 @@ webpack-dev-server@4.11.1: webpack-dev-middleware "^5.3.1" ws "^8.4.2" -webpack-dev-server@^4.5.0: - version "4.13.2" - resolved "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.13.2.tgz" - integrity sha512-5i6TrGBRxG4vnfDpB6qSQGfnB6skGBXNL5/542w2uRGLimX6qeE5BQMLrzIC3JYV/xlGOv+s+hTleI9AZKUQNw== - dependencies: - "@types/bonjour" "^3.5.9" - "@types/connect-history-api-fallback" "^1.3.5" - "@types/express" "^4.17.13" - "@types/serve-index" "^1.9.1" - "@types/serve-static" "^1.13.10" - "@types/sockjs" "^0.3.33" - "@types/ws" "^8.5.1" - ansi-html-community "^0.0.8" - bonjour-service "^1.0.11" - chokidar "^3.5.3" - colorette "^2.0.10" - compression "^1.7.4" - connect-history-api-fallback "^2.0.0" - default-gateway "^6.0.3" - express "^4.17.3" - graceful-fs "^4.2.6" - html-entities "^2.3.2" - http-proxy-middleware "^2.0.3" - ipaddr.js "^2.0.1" - launch-editor "^2.6.0" - open "^8.0.9" - p-retry "^4.5.0" - rimraf "^3.0.2" - schema-utils "^4.0.0" - selfsigned "^2.1.1" - serve-index "^1.9.1" - sockjs "^0.3.24" - spdy "^4.0.2" - webpack-dev-middleware "^5.3.1" - ws "^8.13.0" - -webpack-merge@5.8.0, webpack-merge@^5.7.3: +webpack-merge@^5.7.3, webpack-merge@5.8.0: version "5.8.0" resolved "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz" integrity sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q== @@ -12107,6 +11404,36 @@ webpack-subresource-integrity@5.1.0: dependencies: typed-assert "^1.0.8" +"webpack@^4.0.0 || ^5.0.0", "webpack@^4.37.0 || ^5.0.0", webpack@^5.0.0, webpack@^5.1.0, webpack@^5.12.0, webpack@^5.30.0, webpack@^5.54.0, webpack@^5.72.1, webpack@^5.76.0, webpack@>=5, "webpack@4.x.x || 5.x.x": + version "5.78.0" + resolved "https://registry.npmjs.org/webpack/-/webpack-5.78.0.tgz" + integrity sha512-gT5DP72KInmE/3azEaQrISjTvLYlSM0j1Ezhht/KLVkrqtv10JoP/RXhwmX/frrutOPuSq3o5Vq0ehR/4Vmd1g== + dependencies: + "@types/eslint-scope" "^3.7.3" + "@types/estree" "^0.0.51" + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/wasm-edit" "1.11.1" + "@webassemblyjs/wasm-parser" "1.11.1" + acorn "^8.7.1" + acorn-import-assertions "^1.7.6" + browserslist "^4.14.5" + chrome-trace-event "^1.0.2" + enhanced-resolve "^5.10.0" + es-module-lexer "^0.9.0" + eslint-scope "5.1.1" + events "^3.2.0" + glob-to-regexp "^0.4.1" + graceful-fs "^4.2.9" + json-parse-even-better-errors "^2.3.1" + loader-runner "^4.2.0" + mime-types "^2.1.27" + neo-async "^2.6.2" + schema-utils "^3.1.0" + tapable "^2.1.1" + terser-webpack-plugin "^5.1.3" + watchpack "^2.4.0" + webpack-sources "^3.2.3" + webpack@5.76.1: version "5.76.1" resolved "https://registry.npmjs.org/webpack/-/webpack-5.76.1.tgz" @@ -12137,37 +11464,7 @@ webpack@5.76.1: watchpack "^2.4.0" webpack-sources "^3.2.3" -webpack@^5.76.0: - version "5.78.0" - resolved "https://registry.npmjs.org/webpack/-/webpack-5.78.0.tgz" - integrity sha512-gT5DP72KInmE/3azEaQrISjTvLYlSM0j1Ezhht/KLVkrqtv10JoP/RXhwmX/frrutOPuSq3o5Vq0ehR/4Vmd1g== - dependencies: - "@types/eslint-scope" "^3.7.3" - "@types/estree" "^0.0.51" - "@webassemblyjs/ast" "1.11.1" - "@webassemblyjs/wasm-edit" "1.11.1" - "@webassemblyjs/wasm-parser" "1.11.1" - acorn "^8.7.1" - acorn-import-assertions "^1.7.6" - browserslist "^4.14.5" - chrome-trace-event "^1.0.2" - enhanced-resolve "^5.10.0" - es-module-lexer "^0.9.0" - eslint-scope "5.1.1" - events "^3.2.0" - glob-to-regexp "^0.4.1" - graceful-fs "^4.2.9" - json-parse-even-better-errors "^2.3.1" - loader-runner "^4.2.0" - mime-types "^2.1.27" - neo-async "^2.6.2" - schema-utils "^3.1.0" - tapable "^2.1.1" - terser-webpack-plugin "^5.1.3" - watchpack "^2.4.0" - webpack-sources "^3.2.3" - -websocket-driver@>=0.5.1, websocket-driver@^0.7.4: +websocket-driver@^0.7.4, websocket-driver@>=0.5.1: version "0.7.4" resolved "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz" integrity sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg== @@ -12329,7 +11626,12 @@ wrappy@1: resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== -ws@^7.3.1, ws@^7.4.6: +ws@^7.3.1: + version "7.5.9" + resolved "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz" + integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== + +ws@^7.4.6: version "7.5.9" resolved "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz" integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== @@ -12359,19 +11661,6 @@ xml-name-validator@^4.0.0: resolved "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz" integrity sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw== -xml2js@^0.4.17: - version "0.4.23" - resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.4.23.tgz#a0c69516752421eb2ac758ee4d4ccf58843eac66" - integrity sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug== - dependencies: - sax ">=0.6.0" - xmlbuilder "~11.0.0" - -xmlbuilder@~11.0.0: - version "11.0.1" - resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-11.0.1.tgz#be9bae1c8a046e76b31127726347d0ad7002beb3" - integrity sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA== - xmlchars@^2.2.0: version "2.2.0" resolved "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz" @@ -12417,32 +11706,6 @@ yargs-parser@^21.1.1: resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz" integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== -yargs@17.1.1: - version "17.1.1" - resolved "https://registry.npmjs.org/yargs/-/yargs-17.1.1.tgz" - integrity sha512-c2k48R0PwKIqKhPMWjeiF6y2xY/gPMUlro0sgxqXpbOIohWiLNXWslsootttv7E1e73QPAMQSg5FeySbVcpsPQ== - dependencies: - cliui "^7.0.2" - escalade "^3.1.1" - get-caller-file "^2.0.5" - require-directory "^2.1.1" - string-width "^4.2.0" - y18n "^5.0.5" - yargs-parser "^20.2.2" - -yargs@17.6.2: - version "17.6.2" - resolved "https://registry.npmjs.org/yargs/-/yargs-17.6.2.tgz" - integrity sha512-1/9UrdHjDZc0eOU0HxOHoS78C69UD3JRMvzlJ7S79S2nTaWRA/whGCTV8o9e/N/1Va9YIV7Q4sOxD8VV4pCWOw== - dependencies: - cliui "^8.0.1" - escalade "^3.1.1" - get-caller-file "^2.0.5" - require-directory "^2.1.1" - string-width "^4.2.3" - y18n "^5.0.5" - yargs-parser "^21.1.1" - yargs@^16.1.1: version "16.2.0" resolved "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz" @@ -12469,6 +11732,32 @@ yargs@^17.2.1, yargs@^17.3.1: y18n "^5.0.5" yargs-parser "^21.1.1" +yargs@17.1.1: + version "17.1.1" + resolved "https://registry.npmjs.org/yargs/-/yargs-17.1.1.tgz" + integrity sha512-c2k48R0PwKIqKhPMWjeiF6y2xY/gPMUlro0sgxqXpbOIohWiLNXWslsootttv7E1e73QPAMQSg5FeySbVcpsPQ== + dependencies: + cliui "^7.0.2" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.0" + y18n "^5.0.5" + yargs-parser "^20.2.2" + +yargs@17.6.2: + version "17.6.2" + resolved "https://registry.npmjs.org/yargs/-/yargs-17.6.2.tgz" + integrity sha512-1/9UrdHjDZc0eOU0HxOHoS78C69UD3JRMvzlJ7S79S2nTaWRA/whGCTV8o9e/N/1Va9YIV7Q4sOxD8VV4pCWOw== + dependencies: + cliui "^8.0.1" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.3" + y18n "^5.0.5" + yargs-parser "^21.1.1" + yauzl@^2.10.0: version "2.10.0" resolved "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz" @@ -12487,7 +11776,7 @@ yocto-queue@^0.1.0: resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz" integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== -zone.js@~0.11.5: +"zone.js@~0.11.4 || ~0.12.0 || ~0.13.0", zone.js@~0.11.5: version "0.11.8" resolved "https://registry.npmjs.org/zone.js/-/zone.js-0.11.8.tgz" integrity sha512-82bctBg2hKcEJ21humWIkXRlLBBmrc3nN7DFh5LGGhcyycO2S7FN8NmdvlcKaGFDNVL4/9kFLmwmInTavdJERA== From 84f1fcbb352212292f6129ed114f38765cb2c3f0 Mon Sep 17 00:00:00 2001 From: Kristof De Langhe Date: Wed, 12 Apr 2023 17:29:54 +0200 Subject: [PATCH 085/409] 101108: Angular 15 upgrade - resolve fix --- src/app/core/cache/builders/remote-data-build.service.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/app/core/cache/builders/remote-data-build.service.ts b/src/app/core/cache/builders/remote-data-build.service.ts index 1124ecfc7a..075bf3ca0c 100644 --- a/src/app/core/cache/builders/remote-data-build.service.ts +++ b/src/app/core/cache/builders/remote-data-build.service.ts @@ -72,8 +72,8 @@ export class RemoteDataBuildService { if (hasValue(obj)) { if (getResourceTypeValueFor((obj as any).type) === PAGINATED_LIST.value) { return this.buildPaginatedList(obj, ...linksToFollow); - } else if (isNotEmpty(linksToFollow) && obj instanceof HALResource) { - return [this.linkService.resolveLinks(obj, ...linksToFollow)]; + } else if (isNotEmpty(linksToFollow)) { + return [this.linkService.resolveLinks(obj as any, ...linksToFollow)]; } } return [obj]; From 4ed6ccebff164113e98d061243f567e50d44f65e Mon Sep 17 00:00:00 2001 From: Kristof De Langhe Date: Wed, 12 Apr 2023 17:47:40 +0200 Subject: [PATCH 086/409] 101108: Angular 15 upgrade - test build & run fixes --- package.json | 8 ++++---- src/app/shared/testing/utils.test.ts | 2 +- src/test.ts | 7 ------- 3 files changed, 5 insertions(+), 12 deletions(-) diff --git a/package.json b/package.json index b1b6060eaf..b7ed6e3d3e 100644 --- a/package.json +++ b/package.json @@ -17,9 +17,9 @@ "build:stats": "ng build --stats-json", "build:prod": "yarn run build:ssr", "build:ssr": "ng build --configuration production && ng run dspace-angular:server:production", - "test": "ng test --sourceMap=true --watch=false --configuration test", - "test:watch": "nodemon --exec \"ng test --sourceMap=true --watch=true --configuration test\"", - "test:headless": "ng test --sourceMap=true --watch=false --configuration test --browsers=ChromeHeadless --code-coverage", + "test": "ng test --source-map=true --watch=false --configuration test", + "test:watch": "nodemon --exec \"ng test --source-map=true --watch=true --configuration test\"", + "test:headless": "ng test --source-map=true --watch=false --configuration test --browsers=ChromeHeadless --code-coverage", "lint": "ng lint", "lint-fix": "ng lint --fix=true", "e2e": "ng e2e", @@ -203,4 +203,4 @@ "webpack-cli": "^4.2.0", "webpack-dev-server": "^4.5.0" } -} \ No newline at end of file +} diff --git a/src/app/shared/testing/utils.test.ts b/src/app/shared/testing/utils.test.ts index 2f3b85d791..e5130d6182 100644 --- a/src/app/shared/testing/utils.test.ts +++ b/src/app/shared/testing/utils.test.ts @@ -72,7 +72,7 @@ export function createPaginatedList(objects?: T[]): PaginatedList { * @param prop The property/function to spy on */ export function spyOnExported(target: T, prop: keyof T): jasmine.Spy { - const spy = jasmine.createSpy(`${prop}Spy`); + const spy = jasmine.createSpy(`${String(prop)}Spy`); spyOnProperty(target, prop).and.returnValue(spy); return spy; } diff --git a/src/test.ts b/src/test.ts index 477195418b..2f07cf0d1d 100644 --- a/src/test.ts +++ b/src/test.ts @@ -9,8 +9,6 @@ import { } from '@angular/platform-browser-dynamic/testing'; import { NgbModal } from '@ng-bootstrap/ng-bootstrap'; -declare const require: any; - // First, initialize the Angular testing environment. getTestBed().initTestEnvironment( BrowserDynamicTestingModule, @@ -24,8 +22,3 @@ jasmine.getEnv().afterEach(() => { // Close any leftover modals getTestBed().inject(NgbModal, null)?.dismissAll?.(); }); - -// Then we find all the tests. -const context = require.context('./', true, /\.spec\.ts$/); -// And load the modules. -context.keys().map(context); From 8136826c6d6c979d6c20a8c2b0ec3d0936dcf064 Mon Sep 17 00:00:00 2001 From: lotte Date: Thu, 13 Apr 2023 16:12:49 +0200 Subject: [PATCH 087/409] Added missing typedoc --- .../shared/badges/badges.component.ts | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/src/app/shared/object-collection/shared/badges/badges.component.ts b/src/app/shared/object-collection/shared/badges/badges.component.ts index f1e2302815..c66fed35fc 100644 --- a/src/app/shared/object-collection/shared/badges/badges.component.ts +++ b/src/app/shared/object-collection/shared/badges/badges.component.ts @@ -2,6 +2,9 @@ import { Component, Input } from '@angular/core'; import { Context } from 'src/app/core/shared/context.model'; import { DSpaceObject } from '../../../../core/shared/dspace-object.model'; +/** + * List of MyDSpace Status Contexts + */ const MY_DSPACE_STATUS_CONTEXTS = [ Context.MyDSpaceArchived, Context.MyDSpaceWorkspace, @@ -11,15 +14,33 @@ const MY_DSPACE_STATUS_CONTEXTS = [ Context.MyDSpaceWaitingController, Context.MyDSpaceValidation ]; + +/** + * Component that renders all the badges for a listable object + */ @Component({ selector: 'ds-badges', templateUrl: './badges.component.html', styleUrls: ['./badges.component.scss'] }) export class BadgesComponent { + /** + * The DSpaceObject to render the badge for + */ @Input() object: DSpaceObject; + /** + * The context that the badge is rendered in + */ @Input() context?: Context; + + /** + * Whether or not to show the access status + */ @Input() showAccessStatus = false; + + /** + * Returns whether or not this context is a MyDSpace status context + */ get isMyDSpaceStatus(): boolean { return MY_DSPACE_STATUS_CONTEXTS.includes(this.context); } From f4efe00671aed5cbff39571d45cf5ce49d60c631 Mon Sep 17 00:00:00 2001 From: Nona Luypaert Date: Fri, 14 Apr 2023 17:02:06 +0200 Subject: [PATCH 088/409] 101127: Create BrowseByTaxonomyPageComponent --- src/app/browse-by/browse-by-routing.module.ts | 8 ++++++ .../browse-by-taxonomy-page.component.html | 1 + .../browse-by-taxonomy-page.component.scss | 0 .../browse-by-taxonomy-page.component.spec.ts | 25 +++++++++++++++++++ .../browse-by-taxonomy-page.component.ts | 13 ++++++++++ src/app/browse-by/browse-by.module.ts | 6 ++++- 6 files changed, 52 insertions(+), 1 deletion(-) create mode 100644 src/app/browse-by/browse-by-taxonomy-page/browse-by-taxonomy-page.component.html create mode 100644 src/app/browse-by/browse-by-taxonomy-page/browse-by-taxonomy-page.component.scss create mode 100644 src/app/browse-by/browse-by-taxonomy-page/browse-by-taxonomy-page.component.spec.ts create mode 100644 src/app/browse-by/browse-by-taxonomy-page/browse-by-taxonomy-page.component.ts diff --git a/src/app/browse-by/browse-by-routing.module.ts b/src/app/browse-by/browse-by-routing.module.ts index 5788d3cc70..0bf61957ef 100644 --- a/src/app/browse-by/browse-by-routing.module.ts +++ b/src/app/browse-by/browse-by-routing.module.ts @@ -4,6 +4,7 @@ import { BrowseByGuard } from './browse-by-guard'; import { BrowseByDSOBreadcrumbResolver } from './browse-by-dso-breadcrumb.resolver'; import { BrowseByI18nBreadcrumbResolver } from './browse-by-i18n-breadcrumb.resolver'; import { ThemedBrowseBySwitcherComponent } from './browse-by-switcher/themed-browse-by-switcher.component'; +import { BrowseByTaxonomyPageComponent } from './browse-by-taxonomy-page/browse-by-taxonomy-page.component'; @NgModule({ imports: [ @@ -12,6 +13,13 @@ import { ThemedBrowseBySwitcherComponent } from './browse-by-switcher/themed-bro path: '', resolve: { breadcrumb: BrowseByDSOBreadcrumbResolver }, children: [ + { + path: 'srsc', + component: BrowseByTaxonomyPageComponent, + canActivate: [BrowseByGuard], + resolve: { breadcrumb: BrowseByI18nBreadcrumbResolver }, + data: { title: 'browse.title.page', breadcrumbKey: 'browse.metadata' } + }, { path: ':id', component: ThemedBrowseBySwitcherComponent, diff --git a/src/app/browse-by/browse-by-taxonomy-page/browse-by-taxonomy-page.component.html b/src/app/browse-by/browse-by-taxonomy-page/browse-by-taxonomy-page.component.html new file mode 100644 index 0000000000..04f39bf727 --- /dev/null +++ b/src/app/browse-by/browse-by-taxonomy-page/browse-by-taxonomy-page.component.html @@ -0,0 +1 @@ +

browse-by-taxonomy-page works!

diff --git a/src/app/browse-by/browse-by-taxonomy-page/browse-by-taxonomy-page.component.scss b/src/app/browse-by/browse-by-taxonomy-page/browse-by-taxonomy-page.component.scss new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/app/browse-by/browse-by-taxonomy-page/browse-by-taxonomy-page.component.spec.ts b/src/app/browse-by/browse-by-taxonomy-page/browse-by-taxonomy-page.component.spec.ts new file mode 100644 index 0000000000..b1ce257ef6 --- /dev/null +++ b/src/app/browse-by/browse-by-taxonomy-page/browse-by-taxonomy-page.component.spec.ts @@ -0,0 +1,25 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { BrowseByTaxonomyPageComponent } from './browse-by-taxonomy-page.component'; + +describe('BrowseByTaxonomyPageComponent', () => { + let component: BrowseByTaxonomyPageComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [ BrowseByTaxonomyPageComponent ] + }) + .compileComponents(); + }); + + beforeEach(() => { + fixture = TestBed.createComponent(BrowseByTaxonomyPageComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/browse-by/browse-by-taxonomy-page/browse-by-taxonomy-page.component.ts b/src/app/browse-by/browse-by-taxonomy-page/browse-by-taxonomy-page.component.ts new file mode 100644 index 0000000000..97402843f5 --- /dev/null +++ b/src/app/browse-by/browse-by-taxonomy-page/browse-by-taxonomy-page.component.ts @@ -0,0 +1,13 @@ +import { Component } from '@angular/core'; + +@Component({ + selector: 'ds-browse-by-taxonomy-page', + templateUrl: './browse-by-taxonomy-page.component.html', + styleUrls: ['./browse-by-taxonomy-page.component.scss'] +}) +/** + * Component for browsing items by metadata in a hierarchical controlled vocabulary + */ +export class BrowseByTaxonomyPageComponent { + +} diff --git a/src/app/browse-by/browse-by.module.ts b/src/app/browse-by/browse-by.module.ts index 14e21f8b4c..8cd52c887d 100644 --- a/src/app/browse-by/browse-by.module.ts +++ b/src/app/browse-by/browse-by.module.ts @@ -5,11 +5,13 @@ import { SharedModule } from '../shared/shared.module'; import { BrowseByMetadataPageComponent } from './browse-by-metadata-page/browse-by-metadata-page.component'; import { BrowseByDatePageComponent } from './browse-by-date-page/browse-by-date-page.component'; import { BrowseBySwitcherComponent } from './browse-by-switcher/browse-by-switcher.component'; +import { BrowseByTaxonomyPageComponent } from './browse-by-taxonomy-page/browse-by-taxonomy-page.component'; import { ThemedBrowseBySwitcherComponent } from './browse-by-switcher/themed-browse-by-switcher.component'; import { ComcolModule } from '../shared/comcol/comcol.module'; import { ThemedBrowseByMetadataPageComponent } from './browse-by-metadata-page/themed-browse-by-metadata-page.component'; import { ThemedBrowseByDatePageComponent } from './browse-by-date-page/themed-browse-by-date-page.component'; import { ThemedBrowseByTitlePageComponent } from './browse-by-title-page/themed-browse-by-title-page.component'; +import { FormModule } from '../shared/form/form.module'; const ENTRY_COMPONENTS = [ // put only entry components that use custom decorator @@ -27,11 +29,13 @@ const ENTRY_COMPONENTS = [ imports: [ CommonModule, ComcolModule, - SharedModule + SharedModule, + FormModule, ], declarations: [ BrowseBySwitcherComponent, ThemedBrowseBySwitcherComponent, + BrowseByTaxonomyPageComponent, ...ENTRY_COMPONENTS ], exports: [ From 3da2b3c0ef9f8f47a2cb3ad79f5dd3d76a5030c4 Mon Sep 17 00:00:00 2001 From: Nona Luypaert Date: Mon, 17 Apr 2023 10:13:14 +0200 Subject: [PATCH 089/409] 101127: Put modal from VocabularyTreeview in VocabularyTreeviewModal --- .../models/onebox/dynamic-onebox.component.ts | 4 +- src/app/shared/form/form.module.ts | 4 +- .../vocabulary-treeview-modal.component.html | 15 ++ .../vocabulary-treeview-modal.component.scss | 0 ...ocabulary-treeview-modal.component.spec.ts | 25 ++++ .../vocabulary-treeview-modal.component.ts | 38 +++++ .../vocabulary-treeview.component.html | 136 ++++++++---------- .../vocabulary-treeview.component.ts | 9 +- .../search-hierarchy-filter.component.ts | 8 +- 9 files changed, 156 insertions(+), 83 deletions(-) create mode 100644 src/app/shared/form/vocabulary-treeview-modal/vocabulary-treeview-modal.component.html create mode 100644 src/app/shared/form/vocabulary-treeview-modal/vocabulary-treeview-modal.component.scss create mode 100644 src/app/shared/form/vocabulary-treeview-modal/vocabulary-treeview-modal.component.spec.ts create mode 100644 src/app/shared/form/vocabulary-treeview-modal/vocabulary-treeview-modal.component.ts diff --git a/src/app/shared/form/builder/ds-dynamic-form-ui/models/onebox/dynamic-onebox.component.ts b/src/app/shared/form/builder/ds-dynamic-form-ui/models/onebox/dynamic-onebox.component.ts index 008328bf73..63eca80dfe 100644 --- a/src/app/shared/form/builder/ds-dynamic-form-ui/models/onebox/dynamic-onebox.component.ts +++ b/src/app/shared/form/builder/ds-dynamic-form-ui/models/onebox/dynamic-onebox.component.ts @@ -30,8 +30,8 @@ import { VocabularyEntry } from '../../../../../../core/submission/vocabularies/ import { PageInfo } from '../../../../../../core/shared/page-info.model'; import { DsDynamicVocabularyComponent } from '../dynamic-vocabulary.component'; import { Vocabulary } from '../../../../../../core/submission/vocabularies/models/vocabulary.model'; -import { VocabularyTreeviewComponent } from '../../../../vocabulary-treeview/vocabulary-treeview.component'; import { VocabularyEntryDetail } from '../../../../../../core/submission/vocabularies/models/vocabulary-entry-detail.model'; +import { VocabularyTreeviewModalComponent } from '../../../../vocabulary-treeview-modal/vocabulary-treeview-modal.component'; /** * Component representing a onebox input field. @@ -222,7 +222,7 @@ export class DsDynamicOneboxComponent extends DsDynamicVocabularyComponent imple map((vocabulary: Vocabulary) => vocabulary.preloadLevel), take(1) ).subscribe((preloadLevel) => { - const modalRef: NgbModalRef = this.modalService.open(VocabularyTreeviewComponent, { size: 'lg', windowClass: 'treeview' }); + const modalRef: NgbModalRef = this.modalService.open(VocabularyTreeviewModalComponent, { size: 'lg', windowClass: 'treeview' }); modalRef.componentInstance.vocabularyOptions = this.model.vocabularyOptions; modalRef.componentInstance.preloadLevel = preloadLevel; modalRef.componentInstance.selectedItem = this.currentValue ? this.currentValue : ''; diff --git a/src/app/shared/form/form.module.ts b/src/app/shared/form/form.module.ts index 61fc7e3c39..6e3fc33832 100644 --- a/src/app/shared/form/form.module.ts +++ b/src/app/shared/form/form.module.ts @@ -33,6 +33,7 @@ import { AuthorityConfidenceStateDirective } from './directives/authority-confid import { SortablejsModule } from 'ngx-sortablejs'; import { VocabularyTreeviewComponent } from './vocabulary-treeview/vocabulary-treeview.component'; import { VocabularyTreeviewService } from './vocabulary-treeview/vocabulary-treeview.service'; +import { VocabularyTreeviewModalComponent } from './vocabulary-treeview-modal/vocabulary-treeview-modal.component'; import { FormBuilderService } from './builder/form-builder.service'; import { DsDynamicTypeBindRelationService } from './builder/ds-dynamic-form-ui/ds-dynamic-type-bind-relation.service'; import { FormService } from './form.service'; @@ -67,7 +68,8 @@ const COMPONENTS = [ ChipsComponent, NumberPickerComponent, VocabularyTreeviewComponent, - ThemedExternalSourceEntryImportModalComponent + VocabularyTreeviewModalComponent, + ThemedExternalSourceEntryImportModalComponent, ]; const DIRECTIVES = [ diff --git a/src/app/shared/form/vocabulary-treeview-modal/vocabulary-treeview-modal.component.html b/src/app/shared/form/vocabulary-treeview-modal/vocabulary-treeview-modal.component.html new file mode 100644 index 0000000000..55f5ab5092 --- /dev/null +++ b/src/app/shared/form/vocabulary-treeview-modal/vocabulary-treeview-modal.component.html @@ -0,0 +1,15 @@ + + diff --git a/src/app/shared/form/vocabulary-treeview-modal/vocabulary-treeview-modal.component.scss b/src/app/shared/form/vocabulary-treeview-modal/vocabulary-treeview-modal.component.scss new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/app/shared/form/vocabulary-treeview-modal/vocabulary-treeview-modal.component.spec.ts b/src/app/shared/form/vocabulary-treeview-modal/vocabulary-treeview-modal.component.spec.ts new file mode 100644 index 0000000000..989375fd13 --- /dev/null +++ b/src/app/shared/form/vocabulary-treeview-modal/vocabulary-treeview-modal.component.spec.ts @@ -0,0 +1,25 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { VocabularyTreeviewModalComponent } from './vocabulary-treeview-modal.component'; + +describe('VocabularyTreeviewModalComponent', () => { + let component: VocabularyTreeviewModalComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [ VocabularyTreeviewModalComponent ] + }) + .compileComponents(); + }); + + beforeEach(() => { + fixture = TestBed.createComponent(VocabularyTreeviewModalComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/shared/form/vocabulary-treeview-modal/vocabulary-treeview-modal.component.ts b/src/app/shared/form/vocabulary-treeview-modal/vocabulary-treeview-modal.component.ts new file mode 100644 index 0000000000..48ff82f499 --- /dev/null +++ b/src/app/shared/form/vocabulary-treeview-modal/vocabulary-treeview-modal.component.ts @@ -0,0 +1,38 @@ +import { Component, Input } from '@angular/core'; +import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap'; +import { VocabularyOptions } from '../../../core/submission/vocabularies/models/vocabulary-options.model'; + +@Component({ + selector: 'ds-vocabulary-treeview-modal', + templateUrl: './vocabulary-treeview-modal.component.html', + styleUrls: ['./vocabulary-treeview-modal.component.scss'] +}) +/** + * Component that contains a modal to display a VocabularyTreeviewComponent + */ +export class VocabularyTreeviewModalComponent { + + /** + * The {@link VocabularyOptions} object + */ + @Input() vocabularyOptions: VocabularyOptions; + + /** + * Representing how many tree level load at initialization + */ + @Input() preloadLevel = 2; + + /** + * The vocabulary entry already selected, if any + */ + @Input() selectedItem: any = null; + + /** + * Initialize instance variables + * + * @param {NgbActiveModal} activeModal + */ + constructor( + public activeModal: NgbActiveModal, + ) { } +} diff --git a/src/app/shared/form/vocabulary-treeview/vocabulary-treeview.component.html b/src/app/shared/form/vocabulary-treeview/vocabulary-treeview.component.html index 39c62d6e53..18a61b73d7 100644 --- a/src/app/shared/form/vocabulary-treeview/vocabulary-treeview.component.html +++ b/src/app/shared/form/vocabulary-treeview/vocabulary-treeview.component.html @@ -1,77 +1,67 @@ - -
diff --git a/src/app/search-navbar/search-navbar.component.scss b/src/app/search-navbar/search-navbar.component.scss index c1ccd289b2..d5bef9bc47 100644 --- a/src/app/search-navbar/search-navbar.component.scss +++ b/src/app/search-navbar/search-navbar.component.scss @@ -10,7 +10,7 @@ input[type="text"] { } } -a.submit-icon { +.submit-icon { cursor: pointer; position: sticky; top: 0; diff --git a/src/styles/_global-styles.scss b/src/styles/_global-styles.scss index 930384cf64..b030928815 100644 --- a/src/styles/_global-styles.scss +++ b/src/styles/_global-styles.scss @@ -1,206 +1,222 @@ html { - position: relative; - min-height: 100%; + position: relative; + min-height: 100%; } body { - overflow-x: hidden; + overflow-x: hidden; } // Sticky Footer .outer-wrapper { - display: flex; - margin: 0; + display: flex; + margin: 0; } .inner-wrapper { - flex: 1 1 auto; - flex-flow: column nowrap; - display: flex; - min-height: 100vh; - flex-direction: column; - width: 100%; - position: relative; + flex: 1 1 auto; + flex-flow: column nowrap; + display: flex; + min-height: 100vh; + flex-direction: column; + width: 100%; + position: relative; } .main-content { - z-index: var(--ds-main-z-index); - flex: 1 1 100%; - margin-top: var(--ds-content-spacing); - margin-bottom: var(--ds-content-spacing); + z-index: var(--ds-main-z-index); + flex: 1 1 100%; + margin-top: var(--ds-content-spacing); + margin-bottom: var(--ds-content-spacing); } .alert.hide { - padding: 0; - margin: 0; + padding: 0; + margin: 0; } ds-admin-sidebar { - position: fixed; - z-index: var(--ds-sidebar-z-index); + position: fixed; + z-index: var(--ds-sidebar-z-index); } .sticky-top { - z-index: 0; + z-index: 0; } .media-viewer - .change-gallery - .ngx-gallery - ngx-gallery-preview.ngx-gallery-active { - right: 0; - left: auto; - width: calc(100% - 53px); +.change-gallery +.ngx-gallery +ngx-gallery-preview.ngx-gallery-active { + right: 0; + left: auto; + width: calc(100% - 53px); } .ds-submission-reorder-dragging { - .ds-hint, - button { - display: none; - } + .ds-hint, + button { + display: none; + } } ngb-modal-backdrop { - // ng-bootsrap animates opacity, causing the fully opaque background to flash briefly before the transition starts - // animating background-color between transparent & a RGBA color instead looks smoother - &.fade { - opacity: 1 !important; - background-color: transparent; - transition: background-color 0.15s linear; + // ng-bootsrap animates opacity, causing the fully opaque background to flash briefly before the transition starts + // animating background-color between transparent & a RGBA color instead looks smoother + &.fade { + opacity: 1 !important; + background-color: transparent; + transition: background-color 0.15s linear; - &.show { - background-color: rgba(0, 0, 0, 0.5); + &.show { + background-color: rgba(0, 0, 0, 0.5); + } } - } } .dont-break-out { - /* These are technically the same, but use both */ - overflow-wrap: break-word; - word-wrap: break-word; + /* These are technically the same, but use both */ + overflow-wrap: break-word; + word-wrap: break-word; - -ms-word-break: break-all; - /* This is the dangerous one in WebKit, as it breaks things wherever */ - word-break: break-all; - /* Instead use this non-standard one: */ - word-break: break-word; + -ms-word-break: break-all; + /* This is the dangerous one in WebKit, as it breaks things wherever */ + word-break: break-all; + /* Instead use this non-standard one: */ + word-break: break-word; - /* Adds a hyphen where the word breaks, if supported (No Blink) */ - -ms-hyphens: auto; - -moz-hyphens: auto; - -webkit-hyphens: auto; - hyphens: auto; + /* Adds a hyphen where the word breaks, if supported (No Blink) */ + -ms-hyphens: auto; + -moz-hyphens: auto; + -webkit-hyphens: auto; + hyphens: auto; } -.researcher-profile-switch button:focus{ - outline: none !important; +.researcher-profile-switch button:focus { + outline: none !important; } -.researcher-profile-switch .switch.checked{ - color: #fff; + +.researcher-profile-switch .switch.checked { + color: #fff; } /* Replicate default spacing look ~ preserveWhitespace=true To be used e.g. on a div containing buttons that should have a bit of spacing in between */ .space-children-mr > :not(:last-child) { - margin-right: var(--ds-gap); + margin-right: var(--ds-gap); } /* Complement .space-children-mr when spaced elements are not on the same level */ .mr-gap { - margin-right: var(--ds-gap); + margin-right: var(--ds-gap); } .ml-gap { - margin-left: var(--ds-gap); + margin-left: var(--ds-gap); } .custom-accordion .card-header button { - -webkit-box-shadow: none!important; - box-shadow: none!important; - width: 100%; + -webkit-box-shadow: none !important; + box-shadow: none !important; + width: 100%; } + .custom-accordion .card:first-of-type { - border-bottom: var(--bs-card-border-width) solid var(--bs-card-border-color) !important; - border-bottom-left-radius: var(--bs-card-border-radius) !important; - border-bottom-right-radius: var(--bs-card-border-radius) !important; + border-bottom: var(--bs-card-border-width) solid var(--bs-card-border-color) !important; + border-bottom-left-radius: var(--bs-card-border-radius) !important; + border-bottom-right-radius: var(--bs-card-border-radius) !important; } ds-dynamic-form-control-container.d-none { - /* Ensures that form-control containers hidden and disabled by type binding collapse and let other fields in - the same row expand accordingly - */ - visibility: collapse; + /* Ensures that form-control containers hidden and disabled by type binding collapse and let other fields in + the same row expand accordingly + */ + visibility: collapse; } /* Used for dso administrative functionality */ .btn-dark { - background-color: var(--ds-admin-sidebar-bg); + background-color: var(--ds-admin-sidebar-bg); } .preserve-line-breaks { - white-space: pre-line; + white-space: pre-line; } /* Thumbnail styles */ .hide-placeholder-text { - .thumbnail-placeholder { - color: transparent !important; - } + .thumbnail-placeholder { + color: transparent !important; + } } /* Used to hide the thumbnail column in modals. */ .hide-modal-thumbnail-column { - .modal-body ds-listable-object-component-loader div.row > div:first-child { - display: none; - } - .modal-body ds-listable-object-component-loader div.row > div:nth-child(2) { - flex: 0 0 100%; - max-width: 100%; - } + .modal-body ds-listable-object-component-loader div.row > div:first-child { + display: none; + } + + .modal-body ds-listable-object-component-loader div.row > div:nth-child(2) { + flex: 0 0 100%; + max-width: 100%; + } } /* The font sizes used in "no thumbnail" placeholder */ .thumb-font-0 { - .thumbnail-placeholder { - @media screen and (max-width: map-get($grid-breakpoints, lg)) { - font-size: 0.7rem; - padding: 0.2rem; + .thumbnail-placeholder { + @media screen and (max-width: map-get($grid-breakpoints, lg)) { + font-size: 0.7rem; + padding: 0.2rem; + } + @media screen and (max-width: map-get($grid-breakpoints, sm)) { + font-size: 0.6rem; + padding: 0.1rem; + } + font-size: 0.4rem; + padding: 0.1rem; } - @media screen and (max-width: map-get($grid-breakpoints, sm)) { - font-size: 0.6rem; - padding: 0.1rem; - } - font-size: 0.4rem; - padding: 0.1rem; - } } + .thumb-font-1 { - .thumbnail-placeholder { - @media screen and (max-width: map-get($grid-breakpoints, sm)) { - font-size: 0.9rem; - padding: 0.1rem; + .thumbnail-placeholder { + @media screen and (max-width: map-get($grid-breakpoints, sm)) { + font-size: 0.9rem; + padding: 0.1rem; + } + @media screen and (max-width: 950px) { + font-size: 0.4rem; + padding: 0.1rem; + } + font-size: 0.5rem; + padding: 0.125rem; } - @media screen and (max-width: 950px) { - font-size: 0.4rem; - padding: 0.1rem; - } - font-size: 0.5rem; - padding: 0.125rem; - } } + .thumb-font-2 { - .thumbnail-placeholder { - font-size: 0.9rem; - padding: 0.125rem; - } + .thumbnail-placeholder { + font-size: 0.9rem; + padding: 0.125rem; + } } + .thumb-font-3 { - .thumbnail-placeholder { - font-size: 1.25rem; - padding: 0.5rem; - } + .thumbnail-placeholder { + font-size: 1.25rem; + padding: 0.5rem; + } } +.btn.btn-link.btn-link-inline { + display: inline; + padding: 0; + &:not(:disabled){ + &:hover, &:focus { + box-shadow: none; + } + } + +} From 73b2c0b29fc724cd92080891c348bc92860e185d Mon Sep 17 00:00:00 2001 From: Sean Kalynuk Date: Wed, 19 Apr 2023 16:44:04 -0500 Subject: [PATCH 093/409] Fix #2197 authority key lookup Avoid an authority key lookup when it starts with "will be generated::" --- .../models/dynamic-vocabulary.component.ts | 2 +- .../builder/models/form-field-metadata-value.model.ts | 11 +++++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/src/app/shared/form/builder/ds-dynamic-form-ui/models/dynamic-vocabulary.component.ts b/src/app/shared/form/builder/ds-dynamic-form-ui/models/dynamic-vocabulary.component.ts index 4c24443633..a58e674462 100644 --- a/src/app/shared/form/builder/ds-dynamic-form-ui/models/dynamic-vocabulary.component.ts +++ b/src/app/shared/form/builder/ds-dynamic-form-ui/models/dynamic-vocabulary.component.ts @@ -53,7 +53,7 @@ export abstract class DsDynamicVocabularyComponent extends DynamicFormControlCom */ getInitValueFromModel(): Observable { let initValue$: Observable; - if (isNotEmpty(this.model.value) && (this.model.value instanceof FormFieldMetadataValueObject)) { + if (isNotEmpty(this.model.value) && (this.model.value instanceof FormFieldMetadataValueObject) && !this.model.value.hasAuthorityToGenerate()) { let initEntry$: Observable; if (this.model.value.hasAuthority()) { initEntry$ = this.vocabularyService.getVocabularyEntryByID(this.model.value.authority, this.model.vocabularyOptions); diff --git a/src/app/shared/form/builder/models/form-field-metadata-value.model.ts b/src/app/shared/form/builder/models/form-field-metadata-value.model.ts index b58844a537..9b18084e40 100644 --- a/src/app/shared/form/builder/models/form-field-metadata-value.model.ts +++ b/src/app/shared/form/builder/models/form-field-metadata-value.model.ts @@ -11,6 +11,10 @@ export interface OtherInformation { * A class representing a specific input-form field's value */ export class FormFieldMetadataValueObject implements MetadataValueInterface { + + static readonly AUTHORITY_SPLIT: string = '::'; + static readonly AUTHORITY_GENERATE: string = 'will be generated' + FormFieldMetadataValueObject.AUTHORITY_SPLIT; + metadata?: string; value: any; display: string; @@ -58,6 +62,13 @@ export class FormFieldMetadataValueObject implements MetadataValueInterface { return isNotEmpty(this.authority); } + /** + * Returns true if this object has an authority value that needs to be generated + */ + hasAuthorityToGenerate(): boolean { + return isNotEmpty(this.authority) && this.authority.startsWith(FormFieldMetadataValueObject.AUTHORITY_GENERATE); + } + /** * Returns true if this this object has a value */ From 41e4e870619e1c5a30b9d740dafa693107e4d88d Mon Sep 17 00:00:00 2001 From: Kristof De Langhe Date: Thu, 20 Apr 2023 10:13:55 +0200 Subject: [PATCH 094/409] 100414: Add entities to allowed object route --- src/app/search-page/search-tracker.component.ts | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/app/search-page/search-tracker.component.ts b/src/app/search-page/search-tracker.component.ts index eb7ac6fcc3..6aa043cb54 100644 --- a/src/app/search-page/search-tracker.component.ts +++ b/src/app/search-page/search-tracker.component.ts @@ -42,6 +42,13 @@ export class SearchTrackerComponent extends SearchComponent implements OnInit, O */ uuidRegex = /\b[0-9a-f]{8}\b-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-\b[0-9a-f]{12}\b/g; + /** + * List of paths that are considered to be the start of a route to an object page (excluding "/", e.g. "items") + * These are expected to end on an object UUID + * If they match the route we're navigating to, an object property will be added to the search event sent + */ + allowedObjectPaths: string[] = ['entities', ITEM_MODULE_PATH, COLLECTION_MODULE_PATH, COMMUNITY_MODULE_PATH]; + /** * Array to track all subscriptions and unsubscribe them onDestroy * @type {Array} @@ -142,12 +149,12 @@ export class SearchTrackerComponent extends SearchComponent implements OnInit, O /** * Get the UUID from a DSO url - * Return null if the url isn't a community, collection or item page or the UUID couldn't be found + * Return null if the url isn't an object page (allowedObjectPaths) or the UUID couldn't be found * @param url */ getDsoUUIDFromUrl(url: string): string { if (isNotEmpty(url)) { - if (url.startsWith(`/${ITEM_MODULE_PATH}`) || url.startsWith(`/${COLLECTION_MODULE_PATH}`) || url.startsWith(`/${COMMUNITY_MODULE_PATH}`)) { + if (this.allowedObjectPaths.some((path) => url.startsWith(`/${path}`))) { const uuid = url.substring(url.lastIndexOf('/') + 1); if (uuid.match(this.uuidRegex)) { return uuid; From 9de002120dc9fdcf90fe992d21e5c4f02dd9ec51 Mon Sep 17 00:00:00 2001 From: aroman-arvo Date: Thu, 20 Apr 2023 11:12:37 +0200 Subject: [PATCH 095/409] #8636 Request a Copy's "helpdesk" strategy requires authentication to respond --- src/app/app-routing.module.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/app-routing.module.ts b/src/app/app-routing.module.ts index b69e47c82c..deb68f1ea9 100644 --- a/src/app/app-routing.module.ts +++ b/src/app/app-routing.module.ts @@ -209,7 +209,7 @@ import { ThemedPageErrorComponent } from './page-error/themed-page-error.compone { path: REQUEST_COPY_MODULE_PATH, loadChildren: () => import('./request-copy/request-copy.module').then((m) => m.RequestCopyModule), - canActivate: [AuthenticatedGuard, EndUserAgreementCurrentUserGuard] + canActivate: [EndUserAgreementCurrentUserGuard] }, { path: FORBIDDEN_PATH, From e0fb0e14a345c71d83fcb9aeb6cdb93d07bb3fcb Mon Sep 17 00:00:00 2001 From: Alexandre Vryghem Date: Wed, 19 Apr 2023 21:17:04 +0200 Subject: [PATCH 096/409] Show N/A when submitter has been removed --- .../item-submitter.component.html | 11 +++++++++-- .../item-submitter.component.spec.ts | 18 +++++++++++++----- src/assets/i18n/en.json5 | 1 + 3 files changed, 23 insertions(+), 7 deletions(-) diff --git a/src/app/shared/object-collection/shared/mydspace-item-submitter/item-submitter.component.html b/src/app/shared/object-collection/shared/mydspace-item-submitter/item-submitter.component.html index f259fed7e9..0f9cdf846e 100644 --- a/src/app/shared/object-collection/shared/mydspace-item-submitter/item-submitter.component.html +++ b/src/app/shared/object-collection/shared/mydspace-item-submitter/item-submitter.component.html @@ -1,6 +1,13 @@ -
+
{{'submission.workflow.tasks.generic.submitter' | translate}}: - {{ dsoNameService.getName(submitter$ | async)}} + + + {{ dsoNameService.getName(submitter) }} + + + {{ 'submitter.empty' | translate }} + +
diff --git a/src/app/shared/object-collection/shared/mydspace-item-submitter/item-submitter.component.spec.ts b/src/app/shared/object-collection/shared/mydspace-item-submitter/item-submitter.component.spec.ts index cf1de597f6..abaf029155 100644 --- a/src/app/shared/object-collection/shared/mydspace-item-submitter/item-submitter.component.spec.ts +++ b/src/app/shared/object-collection/shared/mydspace-item-submitter/item-submitter.component.spec.ts @@ -1,4 +1,4 @@ -import { ChangeDetectionStrategy, NO_ERRORS_SCHEMA } from '@angular/core'; +import { ChangeDetectionStrategy, NO_ERRORS_SCHEMA, DebugElement } from '@angular/core'; import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; import { of as observableOf } from 'rxjs'; @@ -60,10 +60,18 @@ describe('ItemSubmitterComponent', () => { })); }); - it('should show a badge with submitter name', () => { - const badge = fixture.debugElement.query(By.css('.badge')); + it('should show N/A when submitter is null', () => { + component.submitter$ = observableOf(null); + fixture.detectChanges(); - expect(badge).not.toBeNull(); - expect(badge.nativeElement.innerHTML).toBe(EPersonMock.name); + const badge: DebugElement = fixture.debugElement.query(By.css('.badge')); + + expect(badge.nativeElement.innerText).toBe('submitter.empty'); + }); + + it('should show a badge with submitter name', () => { + const badge: DebugElement = fixture.debugElement.query(By.css('.badge')); + + expect(badge.nativeElement.innerText).toBe(EPersonMock.name); }); }); diff --git a/src/assets/i18n/en.json5 b/src/assets/i18n/en.json5 index dc096b2031..61c950e267 100644 --- a/src/assets/i18n/en.json5 +++ b/src/assets/i18n/en.json5 @@ -4776,6 +4776,7 @@ "submission.workspace.generic.view-help": "Select this option to view the item's metadata.", + "submitter.empty": "N/A", "subscriptions.title": "Subscriptions", From 7f7ed17d6e54e965b899f472ffa9689fc3665af9 Mon Sep 17 00:00:00 2001 From: Nona Luypaert Date: Fri, 21 Apr 2023 09:11:28 +0200 Subject: [PATCH 097/409] 101127: Add multiSelect tests in VocabularyTreeviewComponent --- .../vocabulary-treeview.component.spec.ts | 60 ++++++++++++++++--- 1 file changed, 53 insertions(+), 7 deletions(-) diff --git a/src/app/shared/form/vocabulary-treeview/vocabulary-treeview.component.spec.ts b/src/app/shared/form/vocabulary-treeview/vocabulary-treeview.component.spec.ts index 043ff9ea56..29e80cfc94 100644 --- a/src/app/shared/form/vocabulary-treeview/vocabulary-treeview.component.spec.ts +++ b/src/app/shared/form/vocabulary-treeview/vocabulary-treeview.component.spec.ts @@ -12,7 +12,7 @@ import { createTestComponent } from '../../testing/utils.test'; import { VocabularyTreeviewComponent } from './vocabulary-treeview.component'; import { VocabularyTreeviewService } from './vocabulary-treeview.service'; import { VocabularyEntryDetail } from '../../../core/submission/vocabularies/models/vocabulary-entry-detail.model'; -import { TreeviewFlatNode } from './vocabulary-treeview-node.model'; +import { TreeviewFlatNode, TreeviewNode } from './vocabulary-treeview-node.model'; import { FormFieldMetadataValueObject } from '../builder/models/form-field-metadata-value.model'; import { VocabularyOptions } from '../../../core/submission/vocabularies/models/vocabulary-options.model'; import { PageInfo } from '../../../core/shared/page-info.model'; @@ -20,6 +20,7 @@ import { VocabularyEntry } from '../../../core/submission/vocabularies/models/vo import { AuthTokenInfo } from '../../../core/auth/models/auth-token-info.model'; import { authReducer } from '../../../core/auth/auth.reducer'; import { storeModuleConfig } from '../../../app.reducer'; +import { By } from '@angular/platform-browser'; describe('VocabularyTreeviewComponent test suite', () => { @@ -27,6 +28,7 @@ describe('VocabularyTreeviewComponent test suite', () => { let compAsAny: any; let fixture: ComponentFixture; let initialState; + let de; const item = new VocabularyEntryDetail(); item.id = 'node1'; @@ -87,6 +89,12 @@ describe('VocabularyTreeviewComponent test suite', () => { }); })); + afterEach(() => { + fixture.destroy(); + comp = null; + compAsAny = null; + }); + describe('', () => { let testComp: TestComponent; let testFixture: ComponentFixture; @@ -120,12 +128,6 @@ describe('VocabularyTreeviewComponent test suite', () => { comp.selectedItems = []; }); - afterEach(() => { - fixture.destroy(); - comp = null; - compAsAny = null; - }); - it('should should init component properly', () => { fixture.detectChanges(); expect(comp.dataSource.data).toEqual([]); @@ -229,6 +231,50 @@ describe('VocabularyTreeviewComponent test suite', () => { expect(vocabularyTreeviewServiceStub.cleanTree).toHaveBeenCalled(); }); }); + + describe('', () => { + beforeEach(() => { + vocabularyTreeviewServiceStub.getData.and.returnValue(observableOf([ + { + 'item': { + 'id': 'srsc:SCB11', + 'display': 'HUMANITIES and RELIGION' + } + } as TreeviewNode, + { + 'item': { + 'id': 'srsc:SCB12', + 'display': 'LAW/JURISPRUDENCE' + } + } as TreeviewNode, + { + 'item': { + 'id': 'srsc:SCB13', + 'display': 'SOCIAL SCIENCES' + } + } as TreeviewNode, + ])); + fixture = TestBed.createComponent(VocabularyTreeviewComponent); + comp = fixture.componentInstance; + compAsAny = comp; + comp.vocabularyOptions = vocabularyOptions; + comp.selectedItems = []; + de = fixture.debugElement; + }); + + it('should not display checkboxes by default', async () => { + fixture.detectChanges(); + expect(de.query(By.css('input[checkbox]'))).toBeNull(); + expect(de.queryAll(By.css('cdk-tree-node')).length).toEqual(3); + }); + + it('should display checkboxes if multiSelect is true', async () => { + comp.multiSelect = true; + fixture.detectChanges(); + expect(de.queryAll(By.css('#leaf-node-checkbox')).length).toEqual(3); + expect(de.queryAll(By.css('cdk-tree-node')).length).toEqual(3); + }); + }); }); // declare a test component From 4f83eaa53d0df45b01d9465512d8435a42fe65d4 Mon Sep 17 00:00:00 2001 From: "Mark H. Wood" Date: Fri, 21 Apr 2023 09:47:18 -0400 Subject: [PATCH 098/409] Tidy up interface declarations. --- .../sections/upload/file/section-upload-file.component.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/app/submission/sections/upload/file/section-upload-file.component.ts b/src/app/submission/sections/upload/file/section-upload-file.component.ts index a8e05fcf40..fb6f499833 100644 --- a/src/app/submission/sections/upload/file/section-upload-file.component.ts +++ b/src/app/submission/sections/upload/file/section-upload-file.component.ts @@ -1,4 +1,4 @@ -import { ChangeDetectorRef, Component, Input, OnChanges, OnInit, ViewChild } from '@angular/core'; +import { ChangeDetectorRef, Component, Input, OnChanges, OnDestroy, OnInit, ViewChild } from '@angular/core'; import { BehaviorSubject, Subscription } from 'rxjs'; import { filter } from 'rxjs/operators'; @@ -27,7 +27,7 @@ import { NgbModalOptions } from '@ng-bootstrap/ng-bootstrap/modal/modal-config'; styleUrls: ['./section-upload-file.component.scss'], templateUrl: './section-upload-file.component.html', }) -export class SubmissionSectionUploadFileComponent implements OnChanges, OnInit { +export class SubmissionSectionUploadFileComponent implements OnChanges, OnInit, OnDestroy { /** * The list of available access condition From 6adc9a1742b24bcf22da14bf73aad53161e97098 Mon Sep 17 00:00:00 2001 From: "Mark H. Wood" Date: Fri, 21 Apr 2023 09:55:18 -0400 Subject: [PATCH 099/409] Make theme-able. --- .../themed-section-upload-file.component.ts | 93 +++++++++++++++++++ .../upload/section-upload.component.html | 4 +- src/app/submission/submission.module.ts | 2 + 3 files changed, 97 insertions(+), 2 deletions(-) create mode 100644 src/app/submission/sections/upload/file/themed-section-upload-file.component.ts diff --git a/src/app/submission/sections/upload/file/themed-section-upload-file.component.ts b/src/app/submission/sections/upload/file/themed-section-upload-file.component.ts new file mode 100644 index 0000000000..9e0a265c3c --- /dev/null +++ b/src/app/submission/sections/upload/file/themed-section-upload-file.component.ts @@ -0,0 +1,93 @@ +import { Component, Input } from '@angular/core'; +import { SubmissionFormsModel } from 'src/app/core/config/models/config-submission-forms.model'; +import { ThemedComponent } from 'src/app/shared/theme-support/themed.component'; +import { SubmissionSectionUploadFileComponent } from './section-upload-file.component'; + +@Component({ + selector: 'ds-themed-submission-upload-section-file', + styleUrls: [], + templateUrl: '../../../../shared/theme-support/themed.component.html' +}) +export class ThemedSubmissionSectionUploadFileComponent + extends ThemedComponent { + + /** + * The list of available access condition + * @type {Array} + */ + @Input() availableAccessConditionOptions: any[]; + + /** + * The submission id + * @type {string} + */ + @Input() collectionId: string; + + /** + * Define if collection access conditions policy type : + * POLICY_DEFAULT_NO_LIST : is not possible to define additional access group/s for the single file + * POLICY_DEFAULT_WITH_LIST : is possible to define additional access group/s for the single file + * @type {number} + */ + @Input() collectionPolicyType: number; + + /** + * The configuration for the bitstream's metadata form + * @type {SubmissionFormsModel} + */ + @Input() configMetadataForm: SubmissionFormsModel; + + /** + * The bitstream id + * @type {string} + */ + @Input() fileId: string; + + /** + * The bitstream array key + * @type {string} + */ + @Input() fileIndex: string; + + /** + * The bitstream id + * @type {string} + */ + @Input() fileName: string; + + /** + * The section id + * @type {string} + */ + @Input() sectionId: string; + + /** + * The submission id + * @type {string} + */ + @Input() submissionId: string; + + protected inAndOutputNames: (keyof SubmissionSectionUploadFileComponent & keyof this)[] = [ + 'availableAccessConditionOptions', + 'collectionId', + 'collectionPolicyType', + 'configMetadataForm', + 'fileId', + 'fileIndex', + 'fileName', + 'sectionId', + 'submissionId' + ]; + + protected getComponentName(): string { + return 'SubmissionSectionUploadFileComponent'; + } + + protected importThemedComponent(themeName: string): Promise { + return import(`../../../../../themes/${themeName}/app/submission/sections/upload/file/section-upload-file.component`); + } + + protected importUnthemedComponent(): Promise { + return import(`./section-upload-file.component`); + } +} diff --git a/src/app/submission/sections/upload/section-upload.component.html b/src/app/submission/sections/upload/section-upload.component.html index 8a19f66220..b57b454288 100644 --- a/src/app/submission/sections/upload/section-upload.component.html +++ b/src/app/submission/sections/upload/section-upload.component.html @@ -28,7 +28,7 @@
- + [submissionId]="submissionId">

diff --git a/src/app/submission/submission.module.ts b/src/app/submission/submission.module.ts index 91f782225a..cf0ab2b369 100644 --- a/src/app/submission/submission.module.ts +++ b/src/app/submission/submission.module.ts @@ -49,6 +49,7 @@ import { ResearchEntitiesModule } from '../entity-groups/research-entities/resea import { ThemedSubmissionEditComponent } from './edit/themed-submission-edit.component'; import { ThemedSubmissionSubmitComponent } from './submit/themed-submission-submit.component'; import { ThemedSubmissionImportExternalComponent } from './import-external/themed-submission-import-external.component'; +import { ThemedSubmissionSectionUploadFileComponent } from './sections/upload/file/themed-section-upload-file.component'; import { FormModule } from '../shared/form/form.module'; import { NgbAccordionModule, NgbCollapseModule, NgbModalModule } from '@ng-bootstrap/ng-bootstrap'; import { SubmissionSectionAccessesComponent } from './sections/accesses/section-accesses.component'; @@ -104,6 +105,7 @@ const DECLARATIONS = [ PublisherPolicyComponent, PublicationInformationComponent, MetadataInformationComponent, + ThemedSubmissionSectionUploadFileComponent, ]; @NgModule({ From 1ba642719d4939d3c9788a4a56320b8ef63a6a68 Mon Sep 17 00:00:00 2001 From: Kristof De Langhe Date: Mon, 24 Apr 2023 10:31:37 +0200 Subject: [PATCH 100/409] 101108: Automatic ng update ng-mocks --- package.json | 4 +- yarn.lock | 2112 +++++++++++++++++++++++++------------------------- 2 files changed, 1062 insertions(+), 1054 deletions(-) diff --git a/package.json b/package.json index b7ed6e3d3e..d3085d1d07 100644 --- a/package.json +++ b/package.json @@ -114,7 +114,7 @@ "mirador-dl-plugin": "^0.13.0", "mirador-share-plugin": "^0.11.0", "morgan": "^1.10.0", - "ng-mocks": "^13.1.1", + "ng-mocks": "^14.10.0", "ng2-file-upload": "1.4.0", "ng2-nouislider": "^1.8.3", "ngx-infinite-scroll": "^10.0.1", @@ -203,4 +203,4 @@ "webpack-cli": "^4.2.0", "webpack-dev-server": "^4.5.0" } -} +} \ No newline at end of file diff --git a/yarn.lock b/yarn.lock index 70d5b7f49d..edf28de782 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,14 +2,6 @@ # yarn lockfile v1 -"@ampproject/remapping@^2.1.0": - version "2.2.1" - resolved "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz" - integrity sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg== - dependencies: - "@jridgewell/gen-mapping" "^0.3.0" - "@jridgewell/trace-mapping" "^0.3.9" - "@ampproject/remapping@2.2.0": version "2.2.0" resolved "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz" @@ -18,6 +10,14 @@ "@jridgewell/gen-mapping" "^0.1.0" "@jridgewell/trace-mapping" "^0.3.9" +"@ampproject/remapping@^2.1.0": + version "2.2.1" + resolved "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz" + integrity sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg== + dependencies: + "@jridgewell/gen-mapping" "^0.3.0" + "@jridgewell/trace-mapping" "^0.3.9" + "@angular-builders/custom-webpack@~15.0.0": version "15.0.0" resolved "https://registry.npmjs.org/@angular-builders/custom-webpack/-/custom-webpack-15.0.0.tgz" @@ -31,6 +31,14 @@ tsconfig-paths "^4.1.0" webpack-merge "^5.7.3" +"@angular-devkit/architect@0.1502.5", "@angular-devkit/architect@>=0.1500.0 < 0.1600.0", "@angular-devkit/architect@~0.1502.0": + version "0.1502.5" + resolved "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1502.5.tgz" + integrity sha512-6KVrXQ/X7W88WSJvYe69ed/2QzQNlObKpj3BWzmcKnA+IvJB37/mvw8VaGFP9y+pDa/b1D1yCDtAJLeP5QY3xg== + dependencies: + "@angular-devkit/core" "15.2.5" + rxjs "6.6.7" + "@angular-devkit/architect@^0.1202.10": version "0.1202.18" resolved "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1202.18.tgz" @@ -39,14 +47,6 @@ "@angular-devkit/core" "12.2.18" rxjs "6.6.7" -"@angular-devkit/architect@>=0.1500.0 < 0.1600.0", "@angular-devkit/architect@~0.1502.0", "@angular-devkit/architect@0.1502.5": - version "0.1502.5" - resolved "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1502.5.tgz" - integrity sha512-6KVrXQ/X7W88WSJvYe69ed/2QzQNlObKpj3BWzmcKnA+IvJB37/mvw8VaGFP9y+pDa/b1D1yCDtAJLeP5QY3xg== - dependencies: - "@angular-devkit/core" "15.2.5" - rxjs "6.6.7" - "@angular-devkit/build-angular@^15.0.0", "@angular-devkit/build-angular@^15.2.5": version "15.2.5" resolved "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-15.2.5.tgz" @@ -123,7 +123,7 @@ "@angular-devkit/architect" "0.1502.5" rxjs "6.6.7" -"@angular-devkit/core@^12.2.17", "@angular-devkit/core@12.2.18": +"@angular-devkit/core@12.2.18", "@angular-devkit/core@^12.2.17": version "12.2.18" resolved "https://registry.npmjs.org/@angular-devkit/core/-/core-12.2.18.tgz" integrity sha512-GDLHGe9HEY5SRS+NrKr14C8aHsRCiBFkBFSSbeohgLgcgSXzZHFoU84nDWrl3KZNP8oqcUSv5lHu6dLcf2fnww== @@ -135,7 +135,7 @@ rxjs "6.6.7" source-map "0.7.3" -"@angular-devkit/core@^15.0.0", "@angular-devkit/core@~15.2.0", "@angular-devkit/core@15.2.5": +"@angular-devkit/core@15.2.5", "@angular-devkit/core@^15.0.0", "@angular-devkit/core@~15.2.0": version "15.2.5" resolved "https://registry.npmjs.org/@angular-devkit/core/-/core-15.2.5.tgz" integrity sha512-ZfjEkAe2yYeekc3xjZ/U4pK9nb+w6BFwAEjou6mE8PWZH7iYskm0YCCXkmu+B+zViEcCLhAkJAxu9MwX4efd8g== @@ -146,7 +146,7 @@ rxjs "6.6.7" source-map "0.7.4" -"@angular-devkit/schematics@^12.2.17", "@angular-devkit/schematics@12.2.18": +"@angular-devkit/schematics@12.2.18", "@angular-devkit/schematics@^12.2.17": version "12.2.18" resolved "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-12.2.18.tgz" integrity sha512-bZ9NS5PgoVfetRC6WeQBHCY5FqPZ9y2TKHUo12sOB2YSL3tgWgh1oXyP8PtX34gasqsLjNULxEQsAQYEsiX/qQ== @@ -223,7 +223,7 @@ "@angular-eslint/bundled-angular-compiler" "15.2.1" "@typescript-eslint/utils" "5.48.2" -"@angular/animations@^15.2.6", "@angular/animations@>=10.0.0", "@angular/animations@>=13.0.0 <14", "@angular/animations@15.2.6": +"@angular/animations@^15.2.6": version "15.2.6" resolved "https://registry.npmjs.org/@angular/animations/-/animations-15.2.6.tgz" integrity sha512-2fEhhj7xTzWHD61B502eXwDclsurkOK7CU+iRdl8EAtEobLRt62sG/XHmJ71UaaniWyI/H0sUSEJuF8TIPcaoQ== @@ -239,7 +239,7 @@ optionalDependencies: parse5 "^5.0.0" -"@angular/cli@^15.2.5", "@angular/cli@>= 15.0.0 < 16.0.0", "@angular/cli@>=12": +"@angular/cli@^15.2.5": version "15.2.5" resolved "https://registry.npmjs.org/@angular/cli/-/cli-15.2.5.tgz" integrity sha512-TmkkeJkdfDkC6b2SNQcLlr1rsl2anc5rrrY3gawOVXYXBExMxAi2SNJsHZzUXfiitW52aZkAyajF1VFazs8PRw== @@ -263,14 +263,14 @@ symbol-observable "4.0.0" yargs "17.6.2" -"@angular/common@*", "@angular/common@^11.0.0", "@angular/common@^13.0.0", "@angular/common@^13.0.0 || ^14.0.0-0", "@angular/common@^15.0.0", "@angular/common@^15.2.6", "@angular/common@>=10.0.0", "@angular/common@>=13.0.0 <14", "@angular/common@>=13.0.0-0", "@angular/common@>=2.x", "@angular/common@>=5.0.0", "@angular/common@15.2.6", "@angular/common@5.0.0-alpha - 5 || 6.0.0-alpha - 6 || 7.0.0-alpha - 7 || 8.0.0-alpha - 8 || 9.0.0-alpha - 9 || 10.0.0-alpha - 10 || 11.0.0-alpha - 11 || 12.0.0-alpha - 12 || 13.0.0-alpha - 13 || 14.0.0-alpha - 14": +"@angular/common@^15.2.6": version "15.2.6" resolved "https://registry.npmjs.org/@angular/common/-/common-15.2.6.tgz" integrity sha512-kPGJoSkFPXsIeHzcjlal8JC8/jYK9qAr+wv+HDX8O1J2FEzQjwoX4SYvpnvVk5WTqUkxMkRCTMu2YFAAmU1+qg== dependencies: tslib "^2.3.0" -"@angular/compiler-cli@^15.0.0", "@angular/compiler-cli@^15.2.6", "@angular/compiler-cli@15.2.6": +"@angular/compiler-cli@^15.2.6": version "15.2.6" resolved "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-15.2.6.tgz" integrity sha512-GHwL4l+NkaUGGdypF+nMFWCmTqvGusTzIriIwpnp38wc8lpmVME2jVodB6sHAkrxFmaHXU/gOCDFK4AnOi6Gmw== @@ -286,21 +286,21 @@ tslib "^2.3.0" yargs "^17.2.1" -"@angular/compiler@^15.2.6", "@angular/compiler@15.2.6": +"@angular/compiler@^15.2.6": version "15.2.6" resolved "https://registry.npmjs.org/@angular/compiler/-/compiler-15.2.6.tgz" integrity sha512-6oBAIY5KcC1UNsrnWGLcopZ9RD7c0HzpTCQY46N6HytHtUjBvzLbGWZu5MfahPtIjKz9FMVYBX9hugcbVpWnTA== dependencies: tslib "^2.3.0" -"@angular/core@*", "@angular/core@^11.0.0", "@angular/core@^13.0.0", "@angular/core@^13.0.0 || ^14.0.0-0", "@angular/core@^15.0.0", "@angular/core@^15.2.6", "@angular/core@>=10.0.0", "@angular/core@>=12", "@angular/core@>=13.0.0 <14", "@angular/core@>=13.0.0-0", "@angular/core@>=2.x", "@angular/core@>=5.0.0", "@angular/core@15.2.6", "@angular/core@5.0.0-alpha - 5 || 6.0.0-alpha - 6 || 7.0.0-alpha - 7 || 8.0.0-alpha - 8 || 9.0.0-alpha - 9 || 10.0.0-alpha - 10 || 11.0.0-alpha - 11 || 12.0.0-alpha - 12 || 13.0.0-alpha - 13 || 14.0.0-alpha - 14": +"@angular/core@^15.2.6": version "15.2.6" resolved "https://registry.npmjs.org/@angular/core/-/core-15.2.6.tgz" integrity sha512-eN46OfSOLQGN6AciUvyHOJ8xQxmiEakkxJeoG1jwcSRXCjwSYYnQ/6drnhUpq5p43XXBAIduKfJXNztEPvLAkA== dependencies: tslib "^2.3.0" -"@angular/forms@^13.0.0", "@angular/forms@^15.2.6", "@angular/forms@>=10.0.0", "@angular/forms@5.0.0-alpha - 5 || 6.0.0-alpha - 6 || 7.0.0-alpha - 7 || 8.0.0-alpha - 8 || 9.0.0-alpha - 9 || 10.0.0-alpha - 10 || 11.0.0-alpha - 11 || 12.0.0-alpha - 12 || 13.0.0-alpha - 13 || 14.0.0-alpha - 14": +"@angular/forms@^15.2.6": version "15.2.6" resolved "https://registry.npmjs.org/@angular/forms/-/forms-15.2.6.tgz" integrity sha512-SdZxsE9MUOVMz0FjOwtx1RN/SGpObnAyZBqXNrN0c4BmJg+faJzvKIBBN102CKpWZOGRoq2YYrgxow9StMhxTw== @@ -312,7 +312,7 @@ resolved "https://registry.npmjs.org/@angular/language-service/-/language-service-15.2.6.tgz" integrity sha512-q6u4XhFReJ3GtA7dC5rJaEBQPjJUjOz9PlwHSOxZxugFP99ddDNBBFd0caa446G54kQdZFG7j7w7BiAp2/srmQ== -"@angular/localize@^13.0.0", "@angular/localize@^15.0.0", "@angular/localize@15.2.6": +"@angular/localize@15.2.6": version "15.2.6" resolved "https://registry.npmjs.org/@angular/localize/-/localize-15.2.6.tgz" integrity sha512-2WJBYRJ6aulo0fS9BUGr4fsdyk+5WcbZoiFURgs0sNrJtYCd51I9rQNwl3OGyYReNmFx8GgLc4K7+rEKhKfSbA== @@ -321,21 +321,21 @@ glob "8.1.0" yargs "^17.2.1" -"@angular/platform-browser-dynamic@^15.2.6", "@angular/platform-browser-dynamic@15.2.6": +"@angular/platform-browser-dynamic@^15.2.6": version "15.2.6" resolved "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-15.2.6.tgz" integrity sha512-ZSyiigpxBWIM5f8t/a28Y3BCzHn1FtI2KsJysE7di5UUflOzwbxbfycVlpiZp0girbDYRyF18vvefvitNh17Gw== dependencies: tslib "^2.3.0" -"@angular/platform-browser@^15.2.6", "@angular/platform-browser@>=10.0.0", "@angular/platform-browser@15.2.6", "@angular/platform-browser@5.0.0-alpha - 5 || 6.0.0-alpha - 6 || 7.0.0-alpha - 7 || 8.0.0-alpha - 8 || 9.0.0-alpha - 9 || 10.0.0-alpha - 10 || 11.0.0-alpha - 11 || 12.0.0-alpha - 12 || 13.0.0-alpha - 13 || 14.0.0-alpha - 14": +"@angular/platform-browser@^15.2.6": version "15.2.6" resolved "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-15.2.6.tgz" integrity sha512-8afckDEWfYf+cyxs2SboZBJkiCwFgYE8IH24RUW1t3zLC+wfrTr7UEfrCoD4YJRVJdqnPoRWN5gjz98n3n4zsA== dependencies: tslib "^2.3.0" -"@angular/platform-server@^15.0.0", "@angular/platform-server@^15.2.6": +"@angular/platform-server@^15.2.6": version "15.2.6" resolved "https://registry.npmjs.org/@angular/platform-server/-/platform-server-15.2.6.tgz" integrity sha512-/2Ez8V+1s8MYSzq9sFUACJaxjYm/NbksGuKbwxV4oydN082vVgh96er5cOCLDzJLYHq+AeAkV3hL1kGHH5FFEg== @@ -344,7 +344,7 @@ tslib "^2.3.0" xhr2 "^0.2.0" -"@angular/router@^15.0.0", "@angular/router@^15.2.6": +"@angular/router@^15.2.6": version "15.2.6" resolved "https://registry.npmjs.org/@angular/router/-/router-15.2.6.tgz" integrity sha512-yB9uc9Xi9N0dErsugleywBA1KYG+GQ9WWSlri34oe2VsCqZazImn71n4wKPtrm2Xiy/mI23wJcr+jiCAtzp49Q== @@ -368,27 +368,6 @@ resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.21.4.tgz" integrity sha512-/DYyDpeCfaVinT40FPGdkkb+lYSKvsVuMjDAG7jPOWWiM1ibOaB9CXJAlc4d1QpP/U2q2P9jbrSlClKSErd55g== -"@babel/core@^7.0.0", "@babel/core@^7.0.0-0", "@babel/core@^7.12.0", "@babel/core@^7.12.3", "@babel/core@^7.13.0", "@babel/core@^7.4.0-0": - version "7.18.9" - resolved "https://registry.npmjs.org/@babel/core/-/core-7.18.9.tgz" - integrity sha512-1LIb1eL8APMy91/IMW+31ckrfBM4yCoLaVzoDhZUKSM4cu1L1nIidyxkCgzPAgrC5WEz36IPEr/eSeSF9pIn+g== - dependencies: - "@ampproject/remapping" "^2.1.0" - "@babel/code-frame" "^7.18.6" - "@babel/generator" "^7.18.9" - "@babel/helper-compilation-targets" "^7.18.9" - "@babel/helper-module-transforms" "^7.18.9" - "@babel/helpers" "^7.18.9" - "@babel/parser" "^7.18.9" - "@babel/template" "^7.18.6" - "@babel/traverse" "^7.18.9" - "@babel/types" "^7.18.9" - convert-source-map "^1.7.0" - debug "^4.1.0" - gensync "^1.0.0-beta.2" - json5 "^2.2.1" - semver "^6.3.0" - "@babel/core@7.19.3": version "7.19.3" resolved "https://registry.npmjs.org/@babel/core/-/core-7.19.3.tgz" @@ -431,6 +410,36 @@ json5 "^2.2.2" semver "^6.3.0" +"@babel/core@^7.12.3": + version "7.18.9" + resolved "https://registry.npmjs.org/@babel/core/-/core-7.18.9.tgz" + integrity sha512-1LIb1eL8APMy91/IMW+31ckrfBM4yCoLaVzoDhZUKSM4cu1L1nIidyxkCgzPAgrC5WEz36IPEr/eSeSF9pIn+g== + dependencies: + "@ampproject/remapping" "^2.1.0" + "@babel/code-frame" "^7.18.6" + "@babel/generator" "^7.18.9" + "@babel/helper-compilation-targets" "^7.18.9" + "@babel/helper-module-transforms" "^7.18.9" + "@babel/helpers" "^7.18.9" + "@babel/parser" "^7.18.9" + "@babel/template" "^7.18.6" + "@babel/traverse" "^7.18.9" + "@babel/types" "^7.18.9" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.2.1" + semver "^6.3.0" + +"@babel/generator@7.20.14", "@babel/generator@^7.20.7": + version "7.20.14" + resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.20.14.tgz" + integrity sha512-AEmuXHdcD3A52HHXxaTmYlb8q/xMEhoRP67B3T4Oq7lbmSoqroMZzjnGj3+i1io3pdnF8iBYVu4Ilj+c4hBxYg== + dependencies: + "@babel/types" "^7.20.7" + "@jridgewell/gen-mapping" "^0.3.2" + jsesc "^2.5.1" + "@babel/generator@^7.18.9", "@babel/generator@^7.19.3", "@babel/generator@^7.21.4": version "7.21.4" resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.21.4.tgz" @@ -441,16 +450,7 @@ "@jridgewell/trace-mapping" "^0.3.17" jsesc "^2.5.1" -"@babel/generator@^7.20.7", "@babel/generator@7.20.14": - version "7.20.14" - resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.20.14.tgz" - integrity sha512-AEmuXHdcD3A52HHXxaTmYlb8q/xMEhoRP67B3T4Oq7lbmSoqroMZzjnGj3+i1io3pdnF8iBYVu4Ilj+c4hBxYg== - dependencies: - "@babel/types" "^7.20.7" - "@jridgewell/gen-mapping" "^0.3.2" - jsesc "^2.5.1" - -"@babel/helper-annotate-as-pure@^7.18.6", "@babel/helper-annotate-as-pure@7.18.6": +"@babel/helper-annotate-as-pure@7.18.6", "@babel/helper-annotate-as-pure@^7.18.6": version "7.18.6" resolved "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz" integrity sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA== @@ -613,7 +613,7 @@ dependencies: "@babel/types" "^7.20.0" -"@babel/helper-split-export-declaration@^7.18.6", "@babel/helper-split-export-declaration@7.18.6": +"@babel/helper-split-export-declaration@7.18.6", "@babel/helper-split-export-declaration@^7.18.6": version "7.18.6" resolved "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz" integrity sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA== @@ -684,7 +684,7 @@ "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" "@babel/plugin-proposal-optional-chaining" "^7.20.7" -"@babel/plugin-proposal-async-generator-functions@^7.20.1", "@babel/plugin-proposal-async-generator-functions@7.20.7": +"@babel/plugin-proposal-async-generator-functions@7.20.7", "@babel/plugin-proposal-async-generator-functions@^7.20.1": version "7.20.7" resolved "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.7.tgz" integrity sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA== @@ -925,7 +925,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.20.2" -"@babel/plugin-transform-async-to-generator@^7.18.6", "@babel/plugin-transform-async-to-generator@7.20.7": +"@babel/plugin-transform-async-to-generator@7.20.7", "@babel/plugin-transform-async-to-generator@^7.18.6": version "7.20.7" resolved "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.20.7.tgz" integrity sha512-Uo5gwHPT9vgnSXQxqGtpdufUiWp96gk7yiP4Mp5bm1QMkEmLXBO7PAGYbKoJ6DhAwiNkcHFBol/x5zZZkL/t0Q== @@ -1278,7 +1278,7 @@ resolved "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz" integrity sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA== -"@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2", "@babel/runtime@^7.12.0", "@babel/runtime@^7.14.5", "@babel/runtime@^7.15.4", "@babel/runtime@^7.3.1", "@babel/runtime@^7.4.4", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.3", "@babel/runtime@^7.8.3", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2", "@babel/runtime@>=7", "@babel/runtime@7.17.2": +"@babel/runtime@7.17.2", "@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2", "@babel/runtime@^7.12.0", "@babel/runtime@^7.14.5", "@babel/runtime@^7.15.4", "@babel/runtime@^7.3.1", "@babel/runtime@^7.4.4", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.3", "@babel/runtime@^7.8.3", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2": version "7.17.2" resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.17.2.tgz" integrity sha512-hzeyJyMA1YGdJTuWU0e/j4wKXrU4OMFvY2MSlaI9B7VQb0r5cxTE3EAIS2Q7Tn2RIcDkRvTA/v2JsAEhxe99uw== @@ -1292,7 +1292,7 @@ dependencies: regenerator-runtime "^0.13.11" -"@babel/template@^7.18.10", "@babel/template@^7.18.6", "@babel/template@^7.20.7", "@babel/template@7.20.7": +"@babel/template@7.20.7", "@babel/template@^7.18.10", "@babel/template@^7.18.6", "@babel/template@^7.20.7": version "7.20.7" resolved "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz" integrity sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw== @@ -1331,12 +1331,17 @@ resolved "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz" integrity sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ== -"@cspotcode/source-map-support@^0.8.0": - version "0.8.1" - resolved "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz" - integrity sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw== +"@cspotcode/source-map-consumer@0.8.0": + version "0.8.0" + resolved "https://registry.yarnpkg.com/@cspotcode/source-map-consumer/-/source-map-consumer-0.8.0.tgz#33bf4b7b39c178821606f669bbc447a6a629786b" + integrity sha512-41qniHzTU8yAGbCp04ohlmSrZf8bkf/iJsl3V0dRGsQN/5GFfx+LbCSsCpp2gqrqjTVg/K6O8ycoV35JIwAzAg== + +"@cspotcode/source-map-support@0.6.1": + version "0.6.1" + resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.6.1.tgz#118511f316e2e87ee4294761868e254d3da47960" + integrity sha512-DX3Z+T5dt1ockmPdobJS/FAsQPW4V4SrWEhD2iYQT2Cb2tQsiMnYxrcUH9By/Z3B+v0S5LMBkQtV/XOBbpLEOg== dependencies: - "@jridgewell/trace-mapping" "0.3.9" + "@cspotcode/source-map-consumer" "0.8.0" "@csstools/postcss-cascade-layers@^1.1.1": version "1.1.1" @@ -1488,7 +1493,7 @@ debug "^3.1.0" lodash.once "^4.1.1" -"@discoveryjs/json-ext@^0.5.0", "@discoveryjs/json-ext@0.5.7": +"@discoveryjs/json-ext@0.5.7", "@discoveryjs/json-ext@^0.5.0": version "0.5.7" resolved "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz" integrity sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw== @@ -1512,11 +1517,116 @@ esquery "^1.4.0" jsdoc-type-pratt-parser "~3.1.0" +"@esbuild/android-arm64@0.17.8": + version "0.17.8" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.17.8.tgz#b3d5b65a3b2e073a6c7ee36b1f3c30c8f000315b" + integrity sha512-oa/N5j6v1svZQs7EIRPqR8f+Bf8g6HBDjD/xHC02radE/NjKHK7oQmtmLxPs1iVwYyvE+Kolo6lbpfEQ9xnhxQ== + +"@esbuild/android-arm@0.17.8": + version "0.17.8" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.17.8.tgz#c41e496af541e175369d48164d0cf01a5f656cf6" + integrity sha512-0/rb91GYKhrtbeglJXOhAv9RuYimgI8h623TplY2X+vA4EXnk3Zj1fXZreJ0J3OJJu1bwmb0W7g+2cT/d8/l/w== + +"@esbuild/android-x64@0.17.8": + version "0.17.8" + resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.17.8.tgz#080fa67c29be77f5a3ca5ee4cc78d5bf927e3a3b" + integrity sha512-bTliMLqD7pTOoPg4zZkXqCDuzIUguEWLpeqkNfC41ODBHwoUgZ2w5JBeYimv4oP6TDVocoYmEhZrCLQTrH89bg== + +"@esbuild/darwin-arm64@0.17.8": + version "0.17.8" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.17.8.tgz#053622bf9a82f43d5c075b7818e02618f7b4a397" + integrity sha512-ghAbV3ia2zybEefXRRm7+lx8J/rnupZT0gp9CaGy/3iolEXkJ6LYRq4IpQVI9zR97ID80KJVoUlo3LSeA/sMAg== + "@esbuild/darwin-x64@0.17.8": version "0.17.8" resolved "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.8.tgz" integrity sha512-n5WOpyvZ9TIdv2V1K3/iIkkJeKmUpKaCTdun9buhGRWfH//osmUjlv4Z5mmWdPWind/VGcVxTHtLfLCOohsOXw== +"@esbuild/freebsd-arm64@0.17.8": + version "0.17.8" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.8.tgz#e6738d0081ba0721a5c6c674e84c6e7fcea61989" + integrity sha512-a/SATTaOhPIPFWvHZDoZYgxaZRVHn0/LX1fHLGfZ6C13JqFUZ3K6SMD6/HCtwOQ8HnsNaEeokdiDSFLuizqv5A== + +"@esbuild/freebsd-x64@0.17.8": + version "0.17.8" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.17.8.tgz#1855e562f2b730f4483f6e94086e9e2597feb4c3" + integrity sha512-xpFJb08dfXr5+rZc4E+ooZmayBW6R3q59daCpKZ/cDU96/kvDM+vkYzNeTJCGd8rtO6fHWMq5Rcv/1cY6p6/0Q== + +"@esbuild/linux-arm64@0.17.8": + version "0.17.8" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.17.8.tgz#481da38952721a3fdb77c17a36ceaacc4270b5c5" + integrity sha512-v3iwDQuDljLTxpsqQDl3fl/yihjPAyOguxuloON9kFHYwopeJEf1BkDXODzYyXEI19gisEsQlG1bM65YqKSIww== + +"@esbuild/linux-arm@0.17.8": + version "0.17.8" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.17.8.tgz#18127072b270bb6321c6d11be20bfd30e0d6ad17" + integrity sha512-6Ij8gfuGszcEwZpi5jQIJCVIACLS8Tz2chnEBfYjlmMzVsfqBP1iGmHQPp7JSnZg5xxK9tjCc+pJ2WtAmPRFVA== + +"@esbuild/linux-ia32@0.17.8": + version "0.17.8" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.17.8.tgz#ee400af7b3bc69e8ca2e593ca35156ffb9abd54f" + integrity sha512-8svILYKhE5XetuFk/B6raFYIyIqydQi+GngEXJgdPdI7OMKUbSd7uzR02wSY4kb53xBrClLkhH4Xs8P61Q2BaA== + +"@esbuild/linux-loong64@0.17.8": + version "0.17.8" + resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.17.8.tgz#8c509d8a454693d39824b83b3f66c400872fce82" + integrity sha512-B6FyMeRJeV0NpyEOYlm5qtQfxbdlgmiGdD+QsipzKfFky0K5HW5Td6dyK3L3ypu1eY4kOmo7wW0o94SBqlqBSA== + +"@esbuild/linux-mips64el@0.17.8": + version "0.17.8" + resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.17.8.tgz#f2b0d36e63fb26bc3f95b203b6a80638292101ca" + integrity sha512-CCb67RKahNobjm/eeEqeD/oJfJlrWyw29fgiyB6vcgyq97YAf3gCOuP6qMShYSPXgnlZe/i4a8WFHBw6N8bYAA== + +"@esbuild/linux-ppc64@0.17.8": + version "0.17.8" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.17.8.tgz#1e628be003e036e90423716028cc884fe5ba25bd" + integrity sha512-bytLJOi55y55+mGSdgwZ5qBm0K9WOCh0rx+vavVPx+gqLLhxtSFU0XbeYy/dsAAD6xECGEv4IQeFILaSS2auXw== + +"@esbuild/linux-riscv64@0.17.8": + version "0.17.8" + resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.17.8.tgz#419a815cb4c3fb9f1b78ef5295f5b48b8bf6427a" + integrity sha512-2YpRyQJmKVBEHSBLa8kBAtbhucaclb6ex4wchfY0Tj3Kg39kpjeJ9vhRU7x4mUpq8ISLXRXH1L0dBYjAeqzZAw== + +"@esbuild/linux-s390x@0.17.8": + version "0.17.8" + resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.17.8.tgz#291c49ae5c3d11d226352755c0835911fe1a9e5c" + integrity sha512-QgbNY/V3IFXvNf11SS6exkpVcX0LJcob+0RWCgV9OiDAmVElnxciHIisoSix9uzYzScPmS6dJFbZULdSAEkQVw== + +"@esbuild/linux-x64@0.17.8": + version "0.17.8" + resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.17.8.tgz#03199d91c76faf80bd54104f5cbf0a489bc39f6a" + integrity sha512-mM/9S0SbAFDBc4OPoyP6SEOo5324LpUxdpeIUUSrSTOfhHU9hEfqRngmKgqILqwx/0DVJBzeNW7HmLEWp9vcOA== + +"@esbuild/netbsd-x64@0.17.8": + version "0.17.8" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.17.8.tgz#b436d767e1b21852f9ed212e2bb57f77203b0ae2" + integrity sha512-eKUYcWaWTaYr9zbj8GertdVtlt1DTS1gNBWov+iQfWuWyuu59YN6gSEJvFzC5ESJ4kMcKR0uqWThKUn5o8We6Q== + +"@esbuild/openbsd-x64@0.17.8": + version "0.17.8" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.17.8.tgz#d1481d8539e21d4729cd04a0450a26c2c8789e89" + integrity sha512-Vc9J4dXOboDyMXKD0eCeW0SIeEzr8K9oTHJU+Ci1mZc5njPfhKAqkRt3B/fUNU7dP+mRyralPu8QUkiaQn7iIg== + +"@esbuild/sunos-x64@0.17.8": + version "0.17.8" + resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.17.8.tgz#2cfb8126e079b2c00fd1bf095541e9f5c47877e4" + integrity sha512-0xvOTNuPXI7ft1LYUgiaXtpCEjp90RuBBYovdd2lqAFxje4sEucurg30M1WIm03+3jxByd3mfo+VUmPtRSVuOw== + +"@esbuild/win32-arm64@0.17.8": + version "0.17.8" + resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.17.8.tgz#7c6ecfd097ca23b82119753bf7072bbaefe51e3a" + integrity sha512-G0JQwUI5WdEFEnYNKzklxtBheCPkuDdu1YrtRrjuQv30WsYbkkoixKxLLv8qhJmNI+ATEWquZe/N0d0rpr55Mg== + +"@esbuild/win32-ia32@0.17.8": + version "0.17.8" + resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.17.8.tgz#cffec63c3cb0ef8563a04df4e09fa71056171d00" + integrity sha512-Fqy63515xl20OHGFykjJsMnoIWS+38fqfg88ClvPXyDbLtgXal2DTlhb1TfTX34qWi3u4I7Cq563QcHpqgLx8w== + +"@esbuild/win32-x64@0.17.8": + version "0.17.8" + resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.17.8.tgz#200a0965cf654ac28b971358ecdca9cc5b44c335" + integrity sha512-1iuezdyDNngPnz8rLRDO2C/ZZ/emJLb72OsZeqQ6gL6Avko/XCXZw+NuxBSNhBAP13Hie418V7VMt9et1FMvpg== + "@eslint-community/eslint-utils@^4.2.0": version "4.4.0" resolved "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz" @@ -1616,7 +1726,7 @@ "@jridgewell/sourcemap-codec" "^1.4.10" "@jridgewell/trace-mapping" "^0.3.9" -"@jridgewell/resolve-uri@^3.0.3", "@jridgewell/resolve-uri@3.1.0": +"@jridgewell/resolve-uri@3.1.0": version "3.1.0" resolved "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz" integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== @@ -1634,16 +1744,16 @@ "@jridgewell/gen-mapping" "^0.3.0" "@jridgewell/trace-mapping" "^0.3.9" -"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.13", "@jridgewell/sourcemap-codec@^1.4.14": - version "1.4.15" - resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz" - integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== - "@jridgewell/sourcemap-codec@1.4.14": version "1.4.14" resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz" integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== +"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.13", "@jridgewell/sourcemap-codec@^1.4.14": + version "1.4.15" + resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz" + integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== + "@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.9": version "0.3.18" resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz" @@ -1652,14 +1762,6 @@ "@jridgewell/resolve-uri" "3.1.0" "@jridgewell/sourcemap-codec" "1.4.14" -"@jridgewell/trace-mapping@0.3.9": - version "0.3.9" - resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz" - integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== - dependencies: - "@jridgewell/resolve-uri" "^3.0.3" - "@jridgewell/sourcemap-codec" "^1.4.10" - "@kolkov/ngx-gallery@^2.0.1": version "2.0.1" resolved "https://registry.npmjs.org/@kolkov/ngx-gallery/-/ngx-gallery-2.0.1.tgz" @@ -1672,7 +1774,7 @@ resolved "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz" integrity sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A== -"@material-ui/core@^4.0.0", "@material-ui/core@^4.11.0", "@material-ui/core@^4.12.1", "@material-ui/core@^4.7.2": +"@material-ui/core@^4.11.0": version "4.12.4" resolved "https://registry.npmjs.org/@material-ui/core/-/core-4.12.4.tgz" integrity sha512-tr7xekNlM9LjA6pagJmL8QCgZXaubWUwkJnoYcMKd4gw/t4XiyvnTkjdGrUVicyB2BsdaAv1tvow45bPM4sSwQ== @@ -1690,7 +1792,7 @@ react-is "^16.8.0 || ^17.0.0" react-transition-group "^4.4.0" -"@material-ui/icons@^4.5.1", "@material-ui/icons@^4.9.1": +"@material-ui/icons@^4.9.1": version "4.11.3" resolved "https://registry.npmjs.org/@material-ui/icons/-/icons-4.11.3.tgz" integrity sha512-IKHlyx6LDh8n19vzwH5RtHIOHl9Tu90aAAxcbWME6kp4dmvODM3UvOHJeMIDzUbd4muuJKHmlNoBN+mDY4XkBA== @@ -1796,14 +1898,14 @@ dependencies: tslib "^2.0.0" -"@ngrx/store@^15.4.0", "@ngrx/store@15.4.0": +"@ngrx/store@^15.4.0": version "15.4.0" resolved "https://registry.npmjs.org/@ngrx/store/-/store-15.4.0.tgz" integrity sha512-OvCuNBHL8mAUnRTS6QSFm+IunspsYNu2cCwDovBNn7EGhxRuGihBeNoX47jCqWPHBFtokj4BlatDfpJ/yCh4xQ== dependencies: tslib "^2.0.0" -"@ngtools/webpack@^15.2.5", "@ngtools/webpack@15.2.5": +"@ngtools/webpack@15.2.5", "@ngtools/webpack@^15.2.5": version "15.2.5" resolved "https://registry.npmjs.org/@ngtools/webpack/-/webpack-15.2.5.tgz" integrity sha512-wD6GY4xghVK+SQL0dy/M3saGx5pqi7+1VHEr+BBI7IUNYGSqPNzylKNxLBgQiTzfkzvbrZ6MhfaMNkhvSCYr5w== @@ -1864,7 +1966,7 @@ "@nodelib/fs.stat" "2.0.5" run-parallel "^1.1.9" -"@nodelib/fs.stat@^2.0.2", "@nodelib/fs.stat@2.0.5": +"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": version "2.0.5" resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz" integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== @@ -2035,15 +2137,6 @@ resolved "https://registry.npmjs.org/@scarf/scarf/-/scarf-1.1.1.tgz" integrity sha512-VGbKDbk1RFIaSmdVb0cNjjWJoRWRI/Weo23AjRCC2nryO0iAS8pzsToJfPVPtVs74WHw4L1UTADNdIYRLkirZQ== -"@schematics/angular@^12.2.17": - version "12.2.18" - resolved "https://registry.npmjs.org/@schematics/angular/-/angular-12.2.18.tgz" - integrity sha512-niRS9Ly9y8uI0YmTSbo8KpdqCCiZ/ATMZWeS2id5M8JZvfXbngwiqJvojdSol0SWU+n1W4iA+lJBdt4gSKlD5w== - dependencies: - "@angular-devkit/core" "12.2.18" - "@angular-devkit/schematics" "12.2.18" - jsonc-parser "3.0.0" - "@schematics/angular@15.2.5": version "15.2.5" resolved "https://registry.npmjs.org/@schematics/angular/-/angular-15.2.5.tgz" @@ -2053,6 +2146,15 @@ "@angular-devkit/schematics" "15.2.5" jsonc-parser "3.2.0" +"@schematics/angular@^12.2.17": + version "12.2.18" + resolved "https://registry.npmjs.org/@schematics/angular/-/angular-12.2.18.tgz" + integrity sha512-niRS9Ly9y8uI0YmTSbo8KpdqCCiZ/ATMZWeS2id5M8JZvfXbngwiqJvojdSol0SWU+n1W4iA+lJBdt4gSKlD5w== + dependencies: + "@angular-devkit/core" "12.2.18" + "@angular-devkit/schematics" "12.2.18" + jsonc-parser "3.0.0" + "@sigstore/protobuf-specs@^0.1.0": version "0.1.0" resolved "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.1.0.tgz" @@ -2253,7 +2355,7 @@ resolved "https://registry.npmjs.org/@types/mime/-/mime-3.0.1.tgz" integrity sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA== -"@types/node@*", "@types/node@^14.14.31", "@types/node@^14.14.9", "@types/node@>=10.0.0": +"@types/node@*", "@types/node@>=10.0.0", "@types/node@^14.14.31", "@types/node@^14.14.9": version "14.18.42" resolved "https://registry.npmjs.org/@types/node/-/node-14.18.42.tgz" integrity sha512-xefu+RBie4xWlK8hwAzGh3npDz/4VhF6icY/shU+zv/1fNn+ZVG7T7CRwe9LId9sAYRPxI+59QBPuKL3WpyGRg== @@ -2295,7 +2397,7 @@ dependencies: "@types/react" "*" -"@types/react@*", "@types/react@^16.8.6 || ^17.0.0": +"@types/react@*": version "17.0.57" resolved "https://registry.npmjs.org/@types/react/-/react-17.0.57.tgz" integrity sha512-e4msYpu5QDxzNrXDHunU/VPyv2M1XemGG/p7kfCjUiPtlLDCWLGQfgAMng6YyisWYxZ09mYdQlmMnyS0NfZdEg== @@ -2377,7 +2479,7 @@ dependencies: "@types/node" "*" -"@typescript-eslint/eslint-plugin@^5.0.0", "@typescript-eslint/eslint-plugin@^5.43.0": +"@typescript-eslint/eslint-plugin@^5.43.0": version "5.58.0" resolved "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.58.0.tgz" integrity sha512-vxHvLhH0qgBd3/tW6/VccptSfc8FxPQIkmNTVLWcCOVqSBvqpnKkBTYrhcGlXfSnd78azwe+PsjYFj0X34/njA== @@ -2393,7 +2495,7 @@ semver "^7.3.7" tsutils "^3.21.0" -"@typescript-eslint/parser@^5.0.0", "@typescript-eslint/parser@^5.43.0": +"@typescript-eslint/parser@^5.43.0": version "5.58.0" resolved "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.58.0.tgz" integrity sha512-ixaM3gRtlfrKzP8N6lRhBbjTow1t6ztfBvQNGuRM8qH1bjFFXIJ35XY+FC0RRBKn3C6cT+7VW1y8tNm7DwPHDQ== @@ -2475,20 +2577,6 @@ semver "^7.3.7" tsutils "^3.21.0" -"@typescript-eslint/utils@^5.57.0", "@typescript-eslint/utils@5.58.0": - version "5.58.0" - resolved "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.58.0.tgz" - integrity sha512-gAmLOTFXMXOC+zP1fsqm3VceKSBQJNzV385Ok3+yzlavNHZoedajjS4UyS21gabJYcobuigQPs/z71A9MdJFqQ== - dependencies: - "@eslint-community/eslint-utils" "^4.2.0" - "@types/json-schema" "^7.0.9" - "@types/semver" "^7.3.12" - "@typescript-eslint/scope-manager" "5.58.0" - "@typescript-eslint/types" "5.58.0" - "@typescript-eslint/typescript-estree" "5.58.0" - eslint-scope "^5.1.1" - semver "^7.3.7" - "@typescript-eslint/utils@5.48.2": version "5.48.2" resolved "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.48.2.tgz" @@ -2503,6 +2591,20 @@ eslint-utils "^3.0.0" semver "^7.3.7" +"@typescript-eslint/utils@5.58.0", "@typescript-eslint/utils@^5.57.0": + version "5.58.0" + resolved "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.58.0.tgz" + integrity sha512-gAmLOTFXMXOC+zP1fsqm3VceKSBQJNzV385Ok3+yzlavNHZoedajjS4UyS21gabJYcobuigQPs/z71A9MdJFqQ== + dependencies: + "@eslint-community/eslint-utils" "^4.2.0" + "@types/json-schema" "^7.0.9" + "@types/semver" "^7.3.12" + "@typescript-eslint/scope-manager" "5.58.0" + "@typescript-eslint/types" "5.58.0" + "@typescript-eslint/typescript-estree" "5.58.0" + eslint-scope "^5.1.1" + semver "^7.3.7" + "@typescript-eslint/visitor-keys@5.48.2": version "5.48.2" resolved "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.48.2.tgz" @@ -2687,7 +2789,7 @@ abab@^2.0.3, abab@^2.0.5, abab@^2.0.6: resolved "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz" integrity sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA== -abbrev@^1.0.0, abbrev@1: +abbrev@1, abbrev@^1.0.0: version "1.1.1" resolved "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz" integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== @@ -2731,31 +2833,21 @@ acorn-walk@^7.1.1: resolved "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz" integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA== -acorn-walk@^8.0.0: +acorn-walk@^8.0.0, acorn-walk@^8.0.2, acorn-walk@^8.1.1: version "8.2.0" resolved "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz" integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== -acorn-walk@^8.0.2: - version "8.2.0" - resolved "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz" - integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== - -acorn-walk@^8.1.1: - version "8.2.0" - resolved "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz" - integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== - -"acorn@^6.0.0 || ^7.0.0 || ^8.0.0", acorn@^8, acorn@^8.0.4, acorn@^8.1.0, acorn@^8.2.4, acorn@^8.4.1, acorn@^8.5.0, acorn@^8.7.1, acorn@^8.8.0, acorn@^8.8.1: - version "8.8.2" - resolved "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz" - integrity sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw== - acorn@^7.1.1: version "7.4.1" resolved "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz" integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== +acorn@^8.0.4, acorn@^8.1.0, acorn@^8.2.4, acorn@^8.4.1, acorn@^8.5.0, acorn@^8.7.1, acorn@^8.8.0, acorn@^8.8.1: + version "8.8.2" + resolved "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz" + integrity sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw== + adjust-sourcemap-loader@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-4.0.0.tgz" @@ -2764,7 +2856,12 @@ adjust-sourcemap-loader@^4.0.0: loader-utils "^2.0.0" regex-parser "^2.2.11" -agent-base@^6.0.2, agent-base@6: +adm-zip@^0.5.2: + version "0.5.10" + resolved "https://registry.yarnpkg.com/adm-zip/-/adm-zip-0.5.10.tgz#4a51d5ab544b1f5ce51e1b9043139b639afff45b" + integrity sha512-x0HvcHqVJNTPk/Bw8JbLWlWoo6Wwnsug0fnYYro1HBrjxZ3G7/AZk7Ahv8JwDe1uIcz8eBqvu86FuF1POiG7vQ== + +agent-base@6, agent-base@^6.0.2: version "6.0.2" resolved "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz" integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== @@ -2788,13 +2885,6 @@ aggregate-error@^3.0.0: clean-stack "^2.0.0" indent-string "^4.0.0" -ajv-formats@^2.1.1, ajv-formats@2.1.1: - version "2.1.1" - resolved "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz" - integrity sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA== - dependencies: - ajv "^8.0.0" - ajv-formats@2.1.0: version "2.1.0" resolved "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.0.tgz" @@ -2802,6 +2892,13 @@ ajv-formats@2.1.0: dependencies: ajv "^8.0.0" +ajv-formats@2.1.1, ajv-formats@^2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz" + integrity sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA== + dependencies: + ajv "^8.0.0" + ajv-keywords@^3.5.2: version "3.5.2" resolved "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz" @@ -2814,17 +2911,17 @@ ajv-keywords@^5.0.0: dependencies: fast-deep-equal "^3.1.3" -ajv@^6.10.0, ajv@^6.12.4, ajv@^6.12.5, ajv@^6.9.1: - version "6.12.6" - resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz" - integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== +ajv@8.12.0, ajv@^8.8.0: + version "8.12.0" + resolved "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz" + integrity sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA== dependencies: fast-deep-equal "^3.1.1" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.4.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" uri-js "^4.2.2" -ajv@^8.0.0, ajv@8.6.2: +ajv@8.6.2, ajv@^8.0.0: version "8.6.2" resolved "https://registry.npmjs.org/ajv/-/ajv-8.6.2.tgz" integrity sha512-9807RlWAgT564wT+DjeyU5OFMPjmzxVobvDFmNAhY+5zD6A2ly3jDp6sgnfyDtlIQ+7H97oc/DGCzzfu9rjw9w== @@ -2834,24 +2931,14 @@ ajv@^8.0.0, ajv@8.6.2: require-from-string "^2.0.2" uri-js "^4.2.2" -ajv@^8.8.0, ajv@^8.8.2: - version "8.12.0" - resolved "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz" - integrity sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA== +ajv@^6.10.0, ajv@^6.12.3, ajv@^6.12.4, ajv@^6.12.5: + version "6.12.6" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== dependencies: fast-deep-equal "^3.1.1" - json-schema-traverse "^1.0.0" - require-from-string "^2.0.2" - uri-js "^4.2.2" - -ajv@8.12.0: - version "8.12.0" - resolved "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz" - integrity sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA== - dependencies: - fast-deep-equal "^3.1.1" - json-schema-traverse "^1.0.0" - require-from-string "^2.0.2" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" uri-js "^4.2.2" angular-idle-preload@3.0.0: @@ -2866,7 +2953,7 @@ angulartics2@^12.0.0: dependencies: tslib "^2.3.0" -ansi-colors@^4.1.1, ansi-colors@4.1.3: +ansi-colors@4.1.3, ansi-colors@^4.1.1: version "4.1.3" resolved "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz" integrity sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw== @@ -2883,6 +2970,11 @@ ansi-html-community@^0.0.8: resolved "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz" integrity sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw== +ansi-regex@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" + integrity sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA== + ansi-regex@^3.0.0: version "3.0.1" resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz" @@ -2893,6 +2985,11 @@ ansi-regex@^5.0.1: resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz" integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== +ansi-styles@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" + integrity sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA== + ansi-styles@^3.2.1: version "3.2.1" resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz" @@ -2900,14 +2997,7 @@ ansi-styles@^3.2.1: dependencies: color-convert "^1.9.0" -ansi-styles@^4.0.0: - version "4.3.0" - resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" - integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== - dependencies: - color-convert "^2.0.1" - -ansi-styles@^4.1.0: +ansi-styles@^4.0.0, ansi-styles@^4.1.0: version "4.3.0" resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== @@ -2972,16 +3062,16 @@ array-buffer-byte-length@^1.0.0: call-bind "^1.0.2" is-array-buffer "^3.0.1" -array-flatten@^2.1.2: - version "2.1.2" - resolved "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz" - integrity sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ== - array-flatten@1.1.1: version "1.1.1" resolved "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz" integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== +array-flatten@^2.1.2: + version "2.1.2" + resolved "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz" + integrity sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ== + array-includes@^3.1.6: version "3.1.6" resolved "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz" @@ -2993,11 +3083,23 @@ array-includes@^3.1.6: get-intrinsic "^1.1.3" is-string "^1.0.7" +array-union@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" + integrity sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng== + dependencies: + array-uniq "^1.0.1" + array-union@^2.1.0: version "2.1.0" resolved "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz" integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== +array-uniq@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" + integrity sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q== + array.prototype.flat@^1.3.1: version "1.3.1" resolved "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz" @@ -3018,6 +3120,11 @@ array.prototype.flatmap@^1.3.1: es-abstract "^1.20.4" es-shim-unscopables "^1.0.0" +arrify@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" + integrity sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA== + asn1@~0.2.3: version "0.2.6" resolved "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz" @@ -3025,7 +3132,7 @@ asn1@~0.2.3: dependencies: safer-buffer "~2.1.0" -assert-plus@^1.0.0, assert-plus@1.0.0: +assert-plus@1.0.0, assert-plus@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz" integrity sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw== @@ -3062,18 +3169,6 @@ at-least-node@^1.0.0: resolved "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz" integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== -autoprefixer@^10.4.13: - version "10.4.14" - resolved "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.14.tgz" - integrity sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ== - dependencies: - browserslist "^4.21.5" - caniuse-lite "^1.0.30001464" - fraction.js "^4.2.0" - normalize-range "^0.1.2" - picocolors "^1.0.0" - postcss-value-parser "^4.2.0" - autoprefixer@10.4.13: version "10.4.13" resolved "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.13.tgz" @@ -3086,6 +3181,18 @@ autoprefixer@10.4.13: picocolors "^1.0.0" postcss-value-parser "^4.2.0" +autoprefixer@^10.4.13: + version "10.4.14" + resolved "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.14.tgz" + integrity sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ== + dependencies: + browserslist "^4.21.5" + caniuse-lite "^1.0.30001464" + fraction.js "^4.2.0" + normalize-range "^0.1.2" + picocolors "^1.0.0" + postcss-value-parser "^4.2.0" + available-typed-arrays@^1.0.5: version "1.0.5" resolved "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz" @@ -3101,11 +3208,18 @@ aws4@^1.8.0: resolved "https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz" integrity sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg== -"axe-core@^3 || ^4", axe-core@^4.4.3: +axe-core@^4.4.3: version "4.6.3" resolved "https://registry.npmjs.org/axe-core/-/axe-core-4.6.3.tgz" integrity sha512-/BQzOX780JhsxDnPpH4ZiyrJAzcd8AfzFPkv+89veFSr1rcMjuq2JDCwypKaPeB6ljHp9KjXhPpjgCvQlWYuqg== +axios@0.21.4: + version "0.21.4" + resolved "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz" + integrity sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg== + dependencies: + follow-redirects "^1.14.0" + axios@^0.27.2: version "0.27.2" resolved "https://registry.npmjs.org/axios/-/axios-0.27.2.tgz" @@ -3114,13 +3228,6 @@ axios@^0.27.2: follow-redirects "^1.14.9" form-data "^4.0.0" -axios@0.21.4: - version "0.21.4" - resolved "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz" - integrity sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg== - dependencies: - follow-redirects "^1.14.0" - axobject-query@3.1.1: version "3.1.1" resolved "https://registry.npmjs.org/axobject-query/-/axobject-query-3.1.1.tgz" @@ -3181,7 +3288,7 @@ base64-js@^1.2.0, base64-js@^1.3.1: resolved "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz" integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== -base64id@~2.0.0, base64id@2.0.0: +base64id@2.0.0, base64id@~2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz" integrity sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog== @@ -3248,7 +3355,7 @@ bluebird@^3.7.2: resolved "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz" integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== -body-parser@^1.19.0, body-parser@1.20.1: +body-parser@1.20.1, body-parser@^1.19.0: version "1.20.1" resolved "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz" integrity sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw== @@ -3281,7 +3388,7 @@ boolbase@^1.0.0: resolved "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz" integrity sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww== -bootstrap@^4.0.0, bootstrap@^4.6.1: +bootstrap@^4.6.1: version "4.6.2" resolved "https://registry.npmjs.org/bootstrap/-/bootstrap-4.6.2.tgz" integrity sha512-51Bbp/Uxr9aTuy6ca/8FbFloBUJZLHwnhTcnjIeRn2suQWsWzcuJhGjKDB5eppVte/8oCdOL3VuwxvZDUggwGQ== @@ -3372,7 +3479,7 @@ browser-sync@^2.27.10: ua-parser-js "^1.0.33" yargs "^17.3.1" -browserslist@^4.14.5, browserslist@^4.21.3, browserslist@^4.21.4, browserslist@^4.21.5, "browserslist@>= 4.21.0", browserslist@4.21.5: +browserslist@4.21.5, browserslist@^4.14.5, browserslist@^4.21.3, browserslist@^4.21.4, browserslist@^4.21.5: version "4.21.5" resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz" integrity sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w== @@ -3432,6 +3539,25 @@ bytesish@^0.4.1: resolved "https://registry.npmjs.org/bytesish/-/bytesish-0.4.4.tgz" integrity sha512-i4uu6M4zuMUiyfZN4RU2+i9+peJh//pXhd9x1oSe1LBkZ3LEbCoygu8W0bXTukU1Jme2txKuotpCZRaC3FLxcQ== +cacache@17.0.4: + version "17.0.4" + resolved "https://registry.npmjs.org/cacache/-/cacache-17.0.4.tgz" + integrity sha512-Z/nL3gU+zTUjz5pCA5vVjYM8pmaw2kxM7JEiE0fv3w77Wj+sFbi70CrBruUWH0uNcEdvLDixFpgA2JM4F4DBjA== + dependencies: + "@npmcli/fs" "^3.1.0" + fs-minipass "^3.0.0" + glob "^8.0.1" + lru-cache "^7.7.1" + minipass "^4.0.0" + minipass-collect "^1.0.2" + minipass-flush "^1.0.5" + minipass-pipeline "^1.2.4" + p-map "^4.0.0" + promise-inflight "^1.0.1" + ssri "^10.0.0" + tar "^6.1.11" + unique-filename "^3.0.0" + cacache@^15.0.5: version "15.3.0" resolved "https://registry.npmjs.org/cacache/-/cacache-15.3.0.tgz" @@ -3499,25 +3625,6 @@ cacache@^17.0.0: tar "^6.1.11" unique-filename "^3.0.0" -cacache@17.0.4: - version "17.0.4" - resolved "https://registry.npmjs.org/cacache/-/cacache-17.0.4.tgz" - integrity sha512-Z/nL3gU+zTUjz5pCA5vVjYM8pmaw2kxM7JEiE0fv3w77Wj+sFbi70CrBruUWH0uNcEdvLDixFpgA2JM4F4DBjA== - dependencies: - "@npmcli/fs" "^3.1.0" - fs-minipass "^3.0.0" - glob "^8.0.1" - lru-cache "^7.7.1" - minipass "^4.0.0" - minipass-collect "^1.0.2" - minipass-flush "^1.0.5" - minipass-pipeline "^1.2.4" - p-map "^4.0.0" - promise-inflight "^1.0.1" - ssri "^10.0.0" - tar "^6.1.11" - unique-filename "^3.0.0" - cachedir@^2.3.0: version "2.3.0" resolved "https://registry.npmjs.org/cachedir/-/cachedir-2.3.0.tgz" @@ -3558,6 +3665,25 @@ cerialize@0.1.18: dependencies: typescript "^2.5.0" +chalk@4.1.2, chalk@^4.0.0, chalk@^4.0.2, chalk@^4.1.0, chalk@^4.1.1, chalk@~4.1.0: + version "4.1.2" + resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +chalk@^1.1.1: + version "1.1.3" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" + integrity sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A== + dependencies: + ansi-styles "^2.2.1" + escape-string-regexp "^1.0.2" + has-ansi "^2.0.0" + strip-ansi "^3.0.0" + supports-color "^2.0.0" + chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.4.1: version "2.4.2" resolved "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz" @@ -3567,54 +3693,6 @@ chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.4.1: escape-string-regexp "^1.0.5" supports-color "^5.3.0" -chalk@^4.0.0: - version "4.1.2" - resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" - integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -chalk@^4.0.2: - version "4.1.2" - resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" - integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -chalk@^4.1.0: - version "4.1.2" - resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" - integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -chalk@^4.1.1: - version "4.1.2" - resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" - integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -chalk@~4.1.0: - version "4.1.2" - resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" - integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -chalk@4.1.2: - version "4.1.2" - resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" - integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - chardet@^0.7.0: version "0.7.0" resolved "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz" @@ -3654,7 +3732,7 @@ cheerio@1.0.0-rc.10: parse5-htmlparser2-tree-adapter "^6.0.1" tslib "^2.2.0" -chokidar@^3.0.0, chokidar@^3.5.1, chokidar@^3.5.2, chokidar@^3.5.3, "chokidar@>=3.0.0 <4.0.0", chokidar@3.5.3: +chokidar@3.5.3, "chokidar@>=3.0.0 <4.0.0", chokidar@^3.0.0, chokidar@^3.5.1, chokidar@^3.5.2, chokidar@^3.5.3: version "3.5.3" resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz" integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== @@ -3791,16 +3869,16 @@ color-convert@^2.0.1: dependencies: color-name "~1.1.4" -color-name@~1.1.4: - version "1.1.4" - resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" - integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== - color-name@1.1.3: version "1.1.3" resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + color-support@^1.1.3: version "1.1.3" resolved "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz" @@ -3823,12 +3901,12 @@ combined-stream@^1.0.6, combined-stream@^1.0.8, combined-stream@~1.0.6: dependencies: delayed-stream "~1.0.0" -commander@^2.2.0: - version "2.20.3" - resolved "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz" - integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== +commander@9.2.0: + version "9.2.0" + resolved "https://registry.npmjs.org/commander/-/commander-9.2.0.tgz" + integrity sha512-e2i4wANQiSXgnrBlIatyHtP1odfUp0BbV5Y5nEGbxtIrStkEOAAzCUirvLBNXHLr7kwLvJl6V+4V3XV9x7Wd9w== -commander@^2.20.0: +commander@^2.2.0, commander@^2.20.0: version "2.20.3" resolved "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz" integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== @@ -3843,21 +3921,11 @@ commander@^6.1.0: resolved "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz" integrity sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA== -commander@^7.0.0: +commander@^7.0.0, commander@^7.2.0: version "7.2.0" resolved "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz" integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== -commander@^7.2.0: - version "7.2.0" - resolved "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz" - integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== - -commander@9.2.0: - version "9.2.0" - resolved "https://registry.npmjs.org/commander/-/commander-9.2.0.tgz" - integrity sha512-e2i4wANQiSXgnrBlIatyHtP1odfUp0BbV5Y5nEGbxtIrStkEOAAzCUirvLBNXHLr7kwLvJl6V+4V3XV9x7Wd9w== - comment-parser@1.3.1: version "1.3.1" resolved "https://registry.npmjs.org/comment-parser/-/comment-parser-1.3.1.tgz" @@ -3916,16 +3984,6 @@ connect-history-api-fallback@^2.0.0: resolved "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz" integrity sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA== -connect@^3.7.0: - version "3.7.0" - resolved "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz" - integrity sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ== - dependencies: - debug "2.6.9" - finalhandler "1.1.2" - parseurl "~1.3.3" - utils-merge "1.0.1" - connect@3.6.6: version "3.6.6" resolved "https://registry.npmjs.org/connect/-/connect-3.6.6.tgz" @@ -3936,6 +3994,16 @@ connect@3.6.6: parseurl "~1.3.2" utils-merge "1.0.1" +connect@^3.7.0: + version "3.7.0" + resolved "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz" + integrity sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ== + dependencies: + debug "2.6.9" + finalhandler "1.1.2" + parseurl "~1.3.3" + utils-merge "1.0.1" + console-control-strings@^1.1.0: version "1.1.0" resolved "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz" @@ -3971,11 +4039,6 @@ cookie-signature@1.0.6: resolved "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz" integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ== -cookie@~0.4.1: - version "0.4.2" - resolved "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz" - integrity sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA== - cookie@0.4.0: version "0.4.0" resolved "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz" @@ -3986,6 +4049,11 @@ cookie@0.5.0: resolved "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz" integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw== +cookie@~0.4.1: + version "0.4.2" + resolved "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz" + integrity sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA== + copy-anything@^2.0.1: version "2.0.6" resolved "https://registry.npmjs.org/copy-anything/-/copy-anything-2.0.6.tgz" @@ -4000,6 +4068,18 @@ copy-to-clipboard@^3.3.1: dependencies: toggle-selection "^1.0.6" +copy-webpack-plugin@11.0.0: + version "11.0.0" + resolved "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-11.0.0.tgz" + integrity sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ== + dependencies: + fast-glob "^3.2.11" + glob-parent "^6.0.1" + globby "^13.1.1" + normalize-path "^3.0.0" + schema-utils "^4.0.0" + serialize-javascript "^6.0.0" + copy-webpack-plugin@^6.4.1: version "6.4.1" resolved "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-6.4.1.tgz" @@ -4017,18 +4097,6 @@ copy-webpack-plugin@^6.4.1: serialize-javascript "^5.0.1" webpack-sources "^1.4.3" -copy-webpack-plugin@11.0.0: - version "11.0.0" - resolved "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-11.0.0.tgz" - integrity sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ== - dependencies: - fast-glob "^3.2.11" - glob-parent "^6.0.1" - globby "^13.1.1" - normalize-path "^3.0.0" - schema-utils "^4.0.0" - serialize-javascript "^6.0.0" - core-js-compat@^3.25.1: version "3.30.0" resolved "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.30.0.tgz" @@ -4036,21 +4104,21 @@ core-js-compat@^3.25.1: dependencies: browserslist "^4.21.5" -core-js@^3.7.0, core-js@^3.8.1: +core-js@^3.7.0: version "3.30.0" resolved "https://registry.npmjs.org/core-js/-/core-js-3.30.0.tgz" integrity sha512-hQotSSARoNh1mYPi9O2YaWeiq/cEB95kOrFb4NCrO4RIFt1qqNpKsaE+vy/L3oiqvND5cThqXzUU3r9F7Efztg== -core-util-is@~1.0.0: - version "1.0.3" - resolved "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz" - integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== - core-util-is@1.0.2: version "1.0.2" resolved "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz" integrity sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ== +core-util-is@~1.0.0: + version "1.0.3" + resolved "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz" + integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== + cors@~2.8.5: version "2.8.5" resolved "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz" @@ -4224,7 +4292,7 @@ cypress-axe@^1.1.0: resolved "https://registry.npmjs.org/cypress-axe/-/cypress-axe-1.4.0.tgz" integrity sha512-Ut7NKfzjyKm0BEbt2WxuKtLkIXmx6FD2j0RwdvO/Ykl7GmB/qRQkwbKLk3VP35+83hiIr8GKD04PDdrTK5BnyA== -"cypress@^10 || ^11 || ^12", cypress@12.9.0: +cypress@12.9.0: version "12.9.0" resolved "https://registry.npmjs.org/cypress/-/cypress-12.9.0.tgz" integrity sha512-Ofe09LbHKgSqX89Iy1xen2WvpgbvNxDzsWx3mgU1mfILouELeXYGwIib3ItCwoRrRifoQwcBFmY54Vs0zw7QCg== @@ -4302,7 +4370,7 @@ date-fns-tz@^1.3.7: resolved "https://registry.npmjs.org/date-fns-tz/-/date-fns-tz-1.3.8.tgz" integrity sha512-qwNXUFtMHTTU6CFSFjoJ80W8Fzzp24LntbjFFBgL/faqds4e5mo9mftoRLgr3Vi1trISsg4awSpYVsOQCRnapQ== -date-fns@^2.29.3, date-fns@>=2.0.0: +date-fns@^2.29.3: version "2.29.3" resolved "https://registry.npmjs.org/date-fns/-/date-fns-2.29.3.tgz" integrity sha512-dDCnyH2WnnKusqvZZ6+jA1O51Ibt8ZMRNkDZdyAyK4YfbDwa/cEmuztzG5pk6hqlp9aSBPYcjOlktquahGwGeA== @@ -4317,48 +4385,20 @@ dayjs@^1.10.4: resolved "https://registry.npmjs.org/dayjs/-/dayjs-1.11.7.tgz" integrity sha512-+Yw9U6YO5TQohxLcIkrXBeY73WP3ejHWVvx8XCk3gxvQDCTEmS48ZrSZCKciI7Bhl/uCMyxYtE9UqRILmFphkQ== -debug@^2.2.0: +debug@2.6.9, debug@^2.2.0: version "2.6.9" resolved "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz" integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== dependencies: ms "2.0.0" -debug@^3.1.0: - version "3.2.7" - resolved "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz" - integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== - dependencies: - ms "^2.1.1" - -debug@^3.2.6: - version "3.2.7" - resolved "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz" - integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== - dependencies: - ms "^2.1.1" - -debug@^3.2.7: - version "3.2.7" - resolved "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz" - integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== - dependencies: - ms "^2.1.1" - -debug@^4.1.0, debug@^4.1.1, debug@^4.3.2, debug@^4.3.3, debug@^4.3.4, debug@~4.3.1, debug@~4.3.2, debug@4: +debug@4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.2, debug@^4.3.3, debug@^4.3.4, debug@~4.3.1, debug@~4.3.2: version "4.3.4" resolved "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz" integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== dependencies: ms "2.1.2" -debug@2.6.9: - version "2.6.9" - resolved "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz" - integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== - dependencies: - ms "2.0.0" - debug@4.3.2: version "4.3.2" resolved "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz" @@ -4366,6 +4406,13 @@ debug@4.3.2: dependencies: ms "2.1.2" +debug@^3.1.0, debug@^3.2.6, debug@^3.2.7: + version "3.2.7" + resolved "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz" + integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== + dependencies: + ms "^2.1.1" + decimal.js@^10.2.1, decimal.js@^10.4.2: version "10.4.3" resolved "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz" @@ -4436,6 +4483,19 @@ define-properties@^1.1.3, define-properties@^1.1.4: has-property-descriptors "^1.0.0" object-keys "^1.1.1" +del@^2.2.0: + version "2.2.2" + resolved "https://registry.yarnpkg.com/del/-/del-2.2.2.tgz#c12c981d067846c84bcaf862cff930d907ffd1a8" + integrity sha512-Z4fzpbIRjOu7lO5jCETSWoqUDVe0IPOlfugBsF6suen2LKDlVb4QZpKEM9P+buNJ4KI1eN7I083w/pbKUpsrWQ== + dependencies: + globby "^5.0.0" + is-path-cwd "^1.0.0" + is-path-in-cwd "^1.0.0" + object-assign "^4.0.1" + pify "^2.0.0" + pinkie-promise "^2.0.0" + rimraf "^2.2.8" + delayed-stream@~1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz" @@ -4446,7 +4506,7 @@ delegates@^1.0.0: resolved "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz" integrity sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ== -depd@^2.0.0, depd@~2.0.0, depd@2.0.0: +depd@2.0.0, depd@^2.0.0, depd@~2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz" integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== @@ -4461,16 +4521,16 @@ dependency-graph@^0.11.0: resolved "https://registry.npmjs.org/dependency-graph/-/dependency-graph-0.11.0.tgz" integrity sha512-JeMq7fEshyepOWDfcfHK06N3MhyPhz++vtqWhMT5O9A3K42rdsEDpfdVqjaqaAhsw6a+ZqeDvQVtD0hFHQWrzg== -destroy@~1.0.4: - version "1.0.4" - resolved "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz" - integrity sha512-3NdhDuEXnfun/z7x9GOElY49LoqVHoGScmOKwmxhsS8N5Y+Z8KyPPDnaSzqWgYt/ji4mqwfTS34Htrk0zPIXVg== - destroy@1.2.0: version "1.2.0" resolved "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz" integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== +destroy@~1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz" + integrity sha512-3NdhDuEXnfun/z7x9GOElY49LoqVHoGScmOKwmxhsS8N5Y+Z8KyPPDnaSzqWgYt/ji4mqwfTS34Htrk0zPIXVg== + detect-node@^2.0.4: version "2.1.0" resolved "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz" @@ -4708,7 +4768,7 @@ encodeurl@~1.0.1, encodeurl@~1.0.2: resolved "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz" integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== -encoding@^0.1.0, encoding@^0.1.13: +encoding@^0.1.13: version "0.1.13" resolved "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz" integrity sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A== @@ -4762,7 +4822,7 @@ enhanced-resolve@^5.10.0: graceful-fs "^4.2.4" tapable "^2.2.0" -enquirer@^2.3.6, "enquirer@>= 2.3.0 < 3": +enquirer@^2.3.6: version "2.3.6" resolved "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz" integrity sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg== @@ -4963,9 +5023,9 @@ escape-html@~1.0.3: resolved "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz" integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== -escape-string-regexp@^1.0.5: +escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: version "1.0.5" - resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== escape-string-regexp@^4.0.0: @@ -5063,7 +5123,7 @@ eslint-rule-composer@^0.3.0: resolved "https://registry.npmjs.org/eslint-rule-composer/-/eslint-rule-composer-0.3.0.tgz" integrity sha512-bt+Sh8CtDmn2OajxvNO+BX7Wn4CIWMpTRm3MaiKPCQcnnlm0CS2mhui6QaoeQugs+3Kj2ESKEEGJUdVafwhiCg== -eslint-scope@^5.1.1, eslint-scope@5.1.1: +eslint-scope@5.1.1, eslint-scope@^5.1.1: version "5.1.1" resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz" integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== @@ -5071,15 +5131,7 @@ eslint-scope@^5.1.1, eslint-scope@5.1.1: esrecurse "^4.3.0" estraverse "^4.1.1" -eslint-scope@^7.0.0: - version "7.1.1" - resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz" - integrity sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw== - dependencies: - esrecurse "^4.3.0" - estraverse "^5.2.0" - -eslint-scope@^7.1.1: +eslint-scope@^7.0.0, eslint-scope@^7.1.1: version "7.1.1" resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz" integrity sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw== @@ -5104,7 +5156,7 @@ eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.0: resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.0.tgz" integrity sha512-HPpKPUBQcAsZOsHAFwTtIKcYlCje62XB7SEAcxjtmW6TD1WVpkS6i6/hOVtTZIl4zGj/mBqpFVGvaDneik+VoQ== -eslint@*, "eslint@^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8", "eslint@^6.0.0 || ^7.0.0 || ^8.0.0", "eslint@^6.0.0 || ^7.0.0 || >=8.0.0", "eslint@^7.0.0 || ^8.0.0", "eslint@^7.20.0 || ^8.0.0", eslint@^8.0.0, eslint@^8.28.0, eslint@>=2, eslint@>=5: +eslint@^8.28.0: version "8.38.0" resolved "https://registry.npmjs.org/eslint/-/eslint-8.38.0.tgz" integrity sha512-pIdsD2jwlUGf/U38Jv97t8lq6HpaU/G9NKbYmpWpZGw3LdTNhZLbJePqxOXGB5+JEKfOPU/XLxYxFh03nr1KTg== @@ -5198,7 +5250,7 @@ esutils@^2.0.2: resolved "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz" integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== -etag@^1.8.1, etag@~1.8.1, etag@1.8.1: +etag@1.8.1, etag@^1.8.1, etag@~1.8.1: version "1.8.1" resolved "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz" integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== @@ -5223,21 +5275,6 @@ events@^3.2.0: resolved "https://registry.npmjs.org/events/-/events-3.3.0.tgz" integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== -execa@^5.0.0: - version "5.1.1" - resolved "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz" - integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== - dependencies: - cross-spawn "^7.0.3" - get-stream "^6.0.0" - human-signals "^2.1.0" - is-stream "^2.0.0" - merge-stream "^2.0.0" - npm-run-path "^4.0.1" - onetime "^5.1.2" - signal-exit "^3.0.3" - strip-final-newline "^2.0.0" - execa@4.1.0: version "4.1.0" resolved "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz" @@ -5253,6 +5290,21 @@ execa@4.1.0: signal-exit "^3.0.2" strip-final-newline "^2.0.0" +execa@^5.0.0: + version "5.1.1" + resolved "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz" + integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== + dependencies: + cross-spawn "^7.0.3" + get-stream "^6.0.0" + human-signals "^2.1.0" + is-stream "^2.0.0" + merge-stream "^2.0.0" + npm-run-path "^4.0.1" + onetime "^5.1.2" + signal-exit "^3.0.3" + strip-final-newline "^2.0.0" + executable@^4.1.1: version "4.1.1" resolved "https://registry.npmjs.org/executable/-/executable-4.1.1.tgz" @@ -5272,7 +5324,7 @@ express-static-gzip@^2.1.5: dependencies: serve-static "^1.14.1" -express@^4.15.2, express@^4.17.1, express@^4.17.3, express@^4.18.2: +express@^4.17.1, express@^4.17.3, express@^4.18.2: version "4.18.2" resolved "https://registry.npmjs.org/express/-/express-4.18.2.tgz" integrity sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ== @@ -5334,7 +5386,7 @@ extract-zip@2.0.1: optionalDependencies: "@types/yauzl" "^2.9.1" -extsprintf@^1.2.0, extsprintf@1.3.0: +extsprintf@1.3.0, extsprintf@^1.2.0: version "1.3.0" resolved "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz" integrity sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g== @@ -5360,7 +5412,7 @@ fast-json-patch@^3.0.0-1: resolved "https://registry.npmjs.org/fast-json-patch/-/fast-json-patch-3.1.1.tgz" integrity sha512-vf6IHUX2SBcA+5/+4883dsIjpBTqmfBjmYiWK1savxQmFk4JfBMLa7ynTYOs1Rolp/T1betJxHiGD3g1Mn8lUQ== -fast-json-stable-stringify@^2.0.0, fast-json-stable-stringify@2.1.0: +fast-json-stable-stringify@2.1.0, fast-json-stable-stringify@^2.0.0: version "2.1.0" resolved "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz" integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== @@ -5565,11 +5617,20 @@ fraction.js@^4.2.0: resolved "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz" integrity sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA== -fresh@^0.5.2, fresh@0.5.2: +fresh@0.5.2, fresh@^0.5.2: version "0.5.2" resolved "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz" integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== +fs-extra@3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-3.0.1.tgz" + integrity sha512-V3Z3WZWVUYd8hoCL5xfXJCaHWYzmtwW5XWYSlLgERi8PWd8bx1kUHUk8L1BT57e49oKnDDD180mjfrHc1yA9rg== + dependencies: + graceful-fs "^4.1.2" + jsonfile "^3.0.0" + universalify "^0.1.0" + fs-extra@^8.1.0: version "8.1.0" resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz" @@ -5589,15 +5650,6 @@ fs-extra@^9.1.0: jsonfile "^6.0.1" universalify "^2.0.0" -fs-extra@3.0.1: - version "3.0.1" - resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-3.0.1.tgz" - integrity sha512-V3Z3WZWVUYd8hoCL5xfXJCaHWYzmtwW5XWYSlLgERi8PWd8bx1kUHUk8L1BT57e49oKnDDD180mjfrHc1yA9rg== - dependencies: - graceful-fs "^4.1.2" - jsonfile "^3.0.0" - universalify "^0.1.0" - fs-minipass@^2.0.0, fs-minipass@^2.1.0: version "2.1.0" resolved "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz" @@ -5690,14 +5742,7 @@ get-package-type@^0.1.0: resolved "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz" integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== -get-stream@^5.0.0: - version "5.2.0" - resolved "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz" - integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== - dependencies: - pump "^3.0.0" - -get-stream@^5.1.0: +get-stream@^5.0.0, get-stream@^5.1.0: version "5.2.0" resolved "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz" integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== @@ -5731,14 +5776,7 @@ getpass@^0.1.1: dependencies: assert-plus "^1.0.0" -glob-parent@^5.1.1: - version "5.1.2" - resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" - integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== - dependencies: - is-glob "^4.0.1" - -glob-parent@^5.1.2: +glob-parent@^5.1.1, glob-parent@^5.1.2, glob-parent@~5.1.2: version "5.1.2" resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== @@ -5752,18 +5790,34 @@ glob-parent@^6.0.1, glob-parent@^6.0.2: dependencies: is-glob "^4.0.3" -glob-parent@~5.1.2: - version "5.1.2" - resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" - integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== - dependencies: - is-glob "^4.0.1" - glob-to-regexp@^0.4.1: version "0.4.1" resolved "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz" integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== +glob@8.1.0, glob@^8.0.1: + version "8.1.0" + resolved "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz" + integrity sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^5.0.1" + once "^1.3.0" + +glob@^7.0.3: + version "7.2.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" + integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.1.1" + once "^1.3.0" + path-is-absolute "^1.0.0" + glob@^7.1.3, glob@^7.1.4, glob@^7.1.6, glob@^7.1.7, glob@~7.2.0: version "7.2.0" resolved "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz" @@ -5776,28 +5830,7 @@ glob@^7.1.3, glob@^7.1.4, glob@^7.1.6, glob@^7.1.7, glob@~7.2.0: once "^1.3.0" path-is-absolute "^1.0.0" -glob@^8.0.1, glob@8.1.0: - version "8.1.0" - resolved "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz" - integrity sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^5.0.1" - once "^1.3.0" - -glob@^9.3.0: - version "9.3.5" - resolved "https://registry.npmjs.org/glob/-/glob-9.3.5.tgz" - integrity sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q== - dependencies: - fs.realpath "^1.0.0" - minimatch "^8.0.2" - minipass "^4.2.4" - path-scurry "^1.6.1" - -glob@^9.3.1: +glob@^9.3.0, glob@^9.3.1: version "9.3.5" resolved "https://registry.npmjs.org/glob/-/glob-9.3.5.tgz" integrity sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q== @@ -5833,19 +5866,7 @@ globalthis@^1.0.3: dependencies: define-properties "^1.1.3" -globby@^11.0.1: - version "11.1.0" - resolved "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz" - integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== - dependencies: - array-union "^2.1.0" - dir-glob "^3.0.1" - fast-glob "^3.2.9" - ignore "^5.2.0" - merge2 "^1.4.1" - slash "^3.0.0" - -globby@^11.1.0: +globby@^11.0.1, globby@^11.1.0: version "11.1.0" resolved "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz" integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== @@ -5868,6 +5889,18 @@ globby@^13.1.1: merge2 "^1.4.1" slash "^4.0.0" +globby@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-5.0.0.tgz#ebd84667ca0dbb330b99bcfc68eac2bc54370e0d" + integrity sha512-HJRTIH2EeH44ka+LWig+EqT2ONSYpVlNfx6pyd592/VF1TbfljJ7elwie7oSwcViLGqOdWocSdu2txwBF9bjmQ== + dependencies: + array-union "^1.0.1" + arrify "^1.0.0" + glob "^7.0.3" + object-assign "^4.0.1" + pify "^2.0.0" + pinkie-promise "^2.0.0" + gopd@^1.0.1: version "1.0.1" resolved "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz" @@ -5904,6 +5937,26 @@ handle-thing@^2.0.0: resolved "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz" integrity sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg== +har-schema@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" + integrity sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q== + +har-validator@~5.1.3: + version "5.1.5" + resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.5.tgz#1f0803b9f8cb20c0fa13822df1ecddb36bde1efd" + integrity sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w== + dependencies: + ajv "^6.12.3" + har-schema "^2.0.0" + +has-ansi@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" + integrity sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg== + dependencies: + ansi-regex "^2.0.0" + has-bigints@^1.0.1, has-bigints@^1.0.2: version "1.0.2" resolved "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz" @@ -6064,16 +6117,6 @@ http-deceiver@^1.2.7: resolved "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz" integrity sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw== -http-errors@~1.6.2: - version "1.6.3" - resolved "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz" - integrity sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A== - dependencies: - depd "~1.1.2" - inherits "2.0.3" - setprototypeof "1.1.0" - statuses ">= 1.4.0 < 2" - http-errors@2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz" @@ -6085,6 +6128,16 @@ http-errors@2.0.0: statuses "2.0.1" toidentifier "1.0.1" +http-errors@~1.6.2: + version "1.6.3" + resolved "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz" + integrity sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A== + dependencies: + depd "~1.1.2" + inherits "2.0.3" + setprototypeof "1.1.0" + statuses ">= 1.4.0 < 2" + http-parser-js@>=0.5.1: version "0.5.8" resolved "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz" @@ -6119,18 +6172,7 @@ http-proxy-middleware@^1.0.5: is-plain-obj "^3.0.0" micromatch "^4.0.2" -http-proxy-middleware@^2.0.3: - version "2.0.6" - resolved "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz" - integrity sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw== - dependencies: - "@types/http-proxy" "^1.17.8" - http-proxy "^1.18.1" - is-glob "^4.0.1" - is-plain-obj "^3.0.0" - micromatch "^4.0.2" - -http-proxy-middleware@^2.0.6: +http-proxy-middleware@^2.0.3, http-proxy-middleware@^2.0.6: version "2.0.6" resolved "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz" integrity sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw== @@ -6150,6 +6192,15 @@ http-proxy@^1.18.1: follow-redirects "^1.0.0" requires-port "^1.0.0" +http-signature@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" + integrity sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ== + dependencies: + assert-plus "^1.0.0" + jsprim "^1.2.2" + sshpk "^1.7.0" + http-signature@~1.3.6: version "1.3.6" resolved "https://registry.npmjs.org/http-signature/-/http-signature-1.3.6.tgz" @@ -6159,7 +6210,7 @@ http-signature@~1.3.6: jsprim "^2.0.2" sshpk "^1.14.1" -https-proxy-agent@^5.0.0, https-proxy-agent@^5.0.1, https-proxy-agent@5.0.1: +https-proxy-agent@5.0.1, https-proxy-agent@^5.0.0, https-proxy-agent@^5.0.1: version "5.0.1" resolved "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz" integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== @@ -6189,7 +6240,7 @@ hyphenate-style-name@^1.0.3: resolved "https://registry.npmjs.org/hyphenate-style-name/-/hyphenate-style-name-1.0.4.tgz" integrity sha512-ygGZLjmXfPHj+ZWh6LwbC37l43MhfztxetbFCoYTM2VjkIUpeHgSNn7QIyVFj7YQ1Wl9Cbw5sholVJPzWvC2MQ== -i18next@^19.5.0, "i18next@>= 19.0.0": +i18next@^19.5.0: version "19.9.2" resolved "https://registry.npmjs.org/i18next/-/i18next-19.9.2.tgz" integrity sha512-0i6cuo6ER6usEOtKajUUDj92zlG+KArFia0857xxiEHAQcUwh/RtOQocui1LPJwunSYT574Pk64aNva1kwtxZg== @@ -6203,27 +6254,20 @@ icomcom-react@^1.0.1: dependencies: prop-types "^15.6.0" -iconv-lite@^0.4.24: +iconv-lite@0.4.24, iconv-lite@^0.4.24: version "0.4.24" resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz" integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== dependencies: safer-buffer ">= 2.1.2 < 3" -iconv-lite@^0.6.2, iconv-lite@^0.6.3, iconv-lite@0.6.3: +iconv-lite@0.6.3, iconv-lite@^0.6.2, iconv-lite@^0.6.3: version "0.6.3" resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz" integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== dependencies: safer-buffer ">= 2.1.2 < 3.0.0" -iconv-lite@0.4.24: - version "0.4.24" - resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz" - integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== - dependencies: - safer-buffer ">= 2.1.2 < 3" - icss-utils@^5.0.0, icss-utils@^5.1.0: version "5.1.0" resolved "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz" @@ -6246,7 +6290,7 @@ ignore-walk@^6.0.0: dependencies: minimatch "^7.4.2" -ignore@^5.2.0, ignore@5.2.4: +ignore@5.2.4, ignore@^5.2.0: version "5.2.4" resolved "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz" integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ== @@ -6310,7 +6354,7 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3, inherits@2, inherits@2.0.4: +inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3: version "2.0.4" resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== @@ -6330,6 +6374,11 @@ ini@3.0.1: resolved "https://registry.npmjs.org/ini/-/ini-3.0.1.tgz" integrity sha512-it4HyVAUTKBc6m8e1iXWvXSTdndF7HbdN713+kvLrymxTaU4AUBWrJ4vEooP+V7fexnVD3LKcBshjGGPefSMUQ== +ini@^1.3.4: + version "1.3.8" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" + integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== + inquirer@8.2.4: version "8.2.4" resolved "https://registry.npmjs.org/inquirer/-/inquirer-8.2.4.tgz" @@ -6382,16 +6431,16 @@ ip@^2.0.0: resolved "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz" integrity sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ== -ipaddr.js@^2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.0.1.tgz" - integrity sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng== - ipaddr.js@1.9.1: version "1.9.1" resolved "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz" integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== +ipaddr.js@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.0.1.tgz" + integrity sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng== + is-arguments@^1.1.1: version "1.1.1" resolved "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz" @@ -6541,6 +6590,25 @@ is-number@^7.0.0: resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz" integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== +is-path-cwd@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-1.0.0.tgz#d225ec23132e89edd38fda767472e62e65f1106d" + integrity sha512-cnS56eR9SPAscL77ik76ATVqoPARTqPIVkMDVxRaWH06zT+6+CzIroYRJ0VVvm0Z1zfAvxvz9i/D3Ppjaqt5Nw== + +is-path-in-cwd@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz#5ac48b345ef675339bd6c7a48a912110b241cf52" + integrity sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ== + dependencies: + is-path-inside "^1.0.0" + +is-path-inside@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.1.tgz#8ef5b7de50437a3fdca6b4e865ef7aa55cb48036" + integrity sha512-qhsCR/Esx4U4hg/9I19OVUAJkGWtjRYHMRgUMZE2TDdj+Ag+kttZanLupfddNyglzz50cUlmWzUaI37GDfNx/g== + dependencies: + path-is-inside "^1.0.1" + is-path-inside@^3.0.2, is-path-inside@^3.0.3: version "3.0.3" resolved "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz" @@ -6767,7 +6835,7 @@ jake@^10.8.5: filelist "^1.0.1" minimatch "^3.0.4" -jasmine-core@^3.6.0, jasmine-core@^3.8.0, jasmine-core@>=3.8: +jasmine-core@^3.6.0, jasmine-core@^3.8.0: version "3.99.1" resolved "https://registry.npmjs.org/jasmine-core/-/jasmine-core-3.99.1.tgz" integrity sha512-Hu1dmuoGcZ7AfyynN3LsfruwMbxMALMka+YtZeGoLuDEySVmVAPaonkNoBRIw/ectu8b9tVQCJNgp4a4knp+tg== @@ -6788,11 +6856,6 @@ jest-worker@^27.4.5: merge-stream "^2.0.0" supports-color "^8.0.0" -"jquery@1.9.1 - 3": - version "3.6.4" - resolved "https://registry.npmjs.org/jquery/-/jquery-3.6.4.tgz" - integrity sha512-v28EW9DWDFpzcD9O5iyJXg3R3+q+mET5JhnjJzQUZMHOv67bpSIHq81GEYpPNZHG+XXHsfSme3nxp/hndKEcsQ== - js-cookie@2.2.1: version "2.2.1" resolved "https://registry.npmjs.org/js-cookie/-/js-cookie-2.2.1.tgz" @@ -6833,6 +6896,38 @@ jsdoc-type-pratt-parser@~3.1.0: resolved "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-3.1.0.tgz" integrity sha512-MgtD0ZiCDk9B+eI73BextfRrVQl0oyzRG8B2BjORts6jbunj4ScKPcyXGTbB6eXL4y9TzxCm6hyeLq/2ASzNdw== +jsdom@21.1.0: + version "21.1.0" + resolved "https://registry.npmjs.org/jsdom/-/jsdom-21.1.0.tgz" + integrity sha512-m0lzlP7qOtthD918nenK3hdItSd2I+V3W9IrBcB36sqDwG+KnUs66IF5GY7laGWUnlM9vTsD0W1QwSEBYWWcJg== + dependencies: + abab "^2.0.6" + acorn "^8.8.1" + acorn-globals "^7.0.0" + cssom "^0.5.0" + cssstyle "^2.3.0" + data-urls "^3.0.2" + decimal.js "^10.4.2" + domexception "^4.0.0" + escodegen "^2.0.0" + form-data "^4.0.0" + html-encoding-sniffer "^3.0.0" + http-proxy-agent "^5.0.0" + https-proxy-agent "^5.0.1" + is-potential-custom-element-name "^1.0.1" + nwsapi "^2.2.2" + parse5 "^7.1.1" + saxes "^6.0.0" + symbol-tree "^3.2.4" + tough-cookie "^4.1.2" + w3c-xmlserializer "^4.0.0" + webidl-conversions "^7.0.0" + whatwg-encoding "^2.0.0" + whatwg-mimetype "^3.0.0" + whatwg-url "^11.0.0" + ws "^8.11.0" + xml-name-validator "^4.0.0" + jsdom@^16.4.0: version "16.7.0" resolved "https://registry.npmjs.org/jsdom/-/jsdom-16.7.0.tgz" @@ -6866,38 +6961,6 @@ jsdom@^16.4.0: ws "^7.4.6" xml-name-validator "^3.0.0" -jsdom@21.1.0: - version "21.1.0" - resolved "https://registry.npmjs.org/jsdom/-/jsdom-21.1.0.tgz" - integrity sha512-m0lzlP7qOtthD918nenK3hdItSd2I+V3W9IrBcB36sqDwG+KnUs66IF5GY7laGWUnlM9vTsD0W1QwSEBYWWcJg== - dependencies: - abab "^2.0.6" - acorn "^8.8.1" - acorn-globals "^7.0.0" - cssom "^0.5.0" - cssstyle "^2.3.0" - data-urls "^3.0.2" - decimal.js "^10.4.2" - domexception "^4.0.0" - escodegen "^2.0.0" - form-data "^4.0.0" - html-encoding-sniffer "^3.0.0" - http-proxy-agent "^5.0.0" - https-proxy-agent "^5.0.1" - is-potential-custom-element-name "^1.0.1" - nwsapi "^2.2.2" - parse5 "^7.1.1" - saxes "^6.0.0" - symbol-tree "^3.2.4" - tough-cookie "^4.1.2" - w3c-xmlserializer "^4.0.0" - webidl-conversions "^7.0.0" - whatwg-encoding "^2.0.0" - whatwg-mimetype "^3.0.0" - whatwg-url "^11.0.0" - ws "^8.11.0" - xml-name-validator "^4.0.0" - jsesc@^2.5.1: version "2.5.2" resolved "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz" @@ -6955,7 +7018,7 @@ json5@^2.1.2, json5@^2.2.1, json5@^2.2.2: resolved "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz" integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== -jsonc-parser@^3.0.0, jsonc-parser@3.0.0: +jsonc-parser@3.0.0, jsonc-parser@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.0.0.tgz" integrity sha512-fQzRfAbIBnR0IQvftw9FJveWiHp72Fg20giDrHz6TdfB12UH/uue0D3hm57UB5KgAVuniLMCaS8P1IMj9NR7cA== @@ -6998,6 +7061,16 @@ jsonschema@1.4.0: resolved "https://registry.npmjs.org/jsonschema/-/jsonschema-1.4.0.tgz" integrity sha512-/YgW6pRMr6M7C+4o8kS+B/2myEpHCrxO4PEWnqJNBFMjn7EWXqlQ4tGwL6xTHeRplwuZmcAncdvfOad1nT2yMw== +jsprim@^1.2.2: + version "1.4.2" + resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.2.tgz#712c65533a15c878ba59e9ed5f0e26d5b77c5feb" + integrity sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw== + dependencies: + assert-plus "1.0.0" + extsprintf "1.3.0" + json-schema "0.4.0" + verror "1.10.0" + jsprim@^2.0.2: version "2.0.2" resolved "https://registry.npmjs.org/jsprim/-/jsprim-2.0.2.tgz" @@ -7075,7 +7148,7 @@ jss-rtl@^0.3.0: dependencies: rtl-css-js "^1.13.1" -jss@^10.0.0, jss@^10.3.0, jss@^10.5.1, jss@10.10.0: +jss@10.10.0, jss@^10.3.0, jss@^10.5.1: version "10.10.0" resolved "https://registry.npmjs.org/jss/-/jss-10.10.0.tgz" integrity sha512-cqsOTS7jqPsPMjtKYDUpdFC0AbhYFLTcuGRqymgmdJIeQ8cH7+AgX7YSgQy79wXloZq2VvATYxUOUQEvS1V/Zw== @@ -7124,7 +7197,7 @@ karma-jasmine-html-reporter@^1.5.0: resolved "https://registry.npmjs.org/karma-jasmine-html-reporter/-/karma-jasmine-html-reporter-1.7.0.tgz" integrity sha512-pzum1TL7j90DTE86eFt48/s12hqwQuiD+e5aXx2Dc9wDEn2LfGq6RoAxEZZjFiN0RDSCOnosEKRZWxbQ+iMpQQ== -karma-jasmine@>=1.1, karma-jasmine@~4.0.0: +karma-jasmine@~4.0.0: version "4.0.2" resolved "https://registry.npmjs.org/karma-jasmine/-/karma-jasmine-4.0.2.tgz" integrity sha512-ggi84RMNQffSDmWSyyt4zxzh2CQGwsxvYYsprgyR1j8ikzIduEdOlcLvXjZGwXG/0j41KUXOWsUCBfbEHPWP9g== @@ -7147,7 +7220,7 @@ karma-source-map-support@1.4.0: dependencies: source-map-support "^0.5.5" -karma@*, karma@^6.3.0, karma@^6.3.14, karma@>=0.13, karma@>=0.9: +karma@^6.3.14: version "6.4.1" resolved "https://registry.npmjs.org/karma/-/karma-6.4.1.tgz" integrity sha512-Cj57NKOskK7wtFWSlMvZf459iX+kpYIPXmkNUzP2WAFcA7nhr/ALn5R7sw3w+1udFDcpMx/tuB8d5amgm3ijaA== @@ -7217,7 +7290,7 @@ less-loader@11.1.0: dependencies: klona "^2.0.4" -"less@^3.5.0 || ^4.0.0", less@4.1.3: +less@4.1.3: version "4.1.3" resolved "https://registry.npmjs.org/less/-/less-4.1.3.tgz" integrity sha512-w16Xk/Ta9Hhyei0Gpz9m7VS8F28nieJaL/VyShID7cYvP6IL5oHeL6p4TXSDJqZE/lNv0oJ2pGVjJsRkfwm5FA== @@ -7293,6 +7366,11 @@ loader-runner@^4.2.0: resolved "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz" integrity sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg== +loader-utils@3.2.1: + version "3.2.1" + resolved "https://registry.npmjs.org/loader-utils/-/loader-utils-3.2.1.tgz" + integrity sha512-ZvFw1KWS3GVyYBYb7qkmRM/WwL2TQQBxgCK62rlvm4WpVQ23Nb4tYjApUlfjrEGvOs7KHEsmyUn75OHZrJMWPw== + loader-utils@^2.0.0: version "2.0.4" resolved "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz" @@ -7302,11 +7380,6 @@ loader-utils@^2.0.0: emojis-list "^3.0.0" json5 "^2.1.2" -loader-utils@3.2.1: - version "3.2.1" - resolved "https://registry.npmjs.org/loader-utils/-/loader-utils-3.2.1.tgz" - integrity sha512-ZvFw1KWS3GVyYBYb7qkmRM/WwL2TQQBxgCK62rlvm4WpVQ23Nb4tYjApUlfjrEGvOs7KHEsmyUn75OHZrJMWPw== - localtunnel@^2.0.1: version "2.0.2" resolved "https://registry.npmjs.org/localtunnel/-/localtunnel-2.0.2.tgz" @@ -7423,13 +7496,6 @@ lru-cache@^9.0.0: resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-9.0.1.tgz" integrity sha512-C8QsKIN1UIXeOs3iWmiZ1lQY+EnKDojWd37fXy1aSbJvH4iSma1uy2OWuoB3m4SYRli5+CUjDv3Dij5DVoetmg== -magic-string@^0.27.0: - version "0.27.0" - resolved "https://registry.npmjs.org/magic-string/-/magic-string-0.27.0.tgz" - integrity sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA== - dependencies: - "@jridgewell/sourcemap-codec" "^1.4.13" - magic-string@0.25.7: version "0.25.7" resolved "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz" @@ -7444,6 +7510,13 @@ magic-string@0.29.0: dependencies: "@jridgewell/sourcemap-codec" "^1.4.13" +magic-string@^0.27.0: + version "0.27.0" + resolved "https://registry.npmjs.org/magic-string/-/magic-string-0.27.0.tgz" + integrity sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA== + dependencies: + "@jridgewell/sourcemap-codec" "^1.4.13" + make-dir@^2.1.0: version "2.1.0" resolved "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz" @@ -7486,28 +7559,7 @@ make-fetch-happen@^10.0.3: socks-proxy-agent "^7.0.0" ssri "^9.0.0" -make-fetch-happen@^11.0.0: - version "11.0.3" - resolved "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-11.0.3.tgz" - integrity sha512-oPLh5m10lRNNZDjJ2kP8UpboUx2uFXVaVweVe/lWut4iHWcQEmfqSVJt2ihZsFI8HbpwyyocaXbCAWf0g1ukIA== - dependencies: - agentkeepalive "^4.2.1" - cacache "^17.0.0" - http-cache-semantics "^4.1.1" - http-proxy-agent "^5.0.0" - https-proxy-agent "^5.0.0" - is-lambda "^1.0.1" - lru-cache "^7.7.1" - minipass "^4.0.0" - minipass-fetch "^3.0.0" - minipass-flush "^1.0.5" - minipass-pipeline "^1.2.4" - negotiator "^0.6.3" - promise-retry "^2.0.1" - socks-proxy-agent "^7.0.0" - ssri "^10.0.0" - -make-fetch-happen@^11.0.1: +make-fetch-happen@^11.0.0, make-fetch-happen@^11.0.1: version "11.0.3" resolved "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-11.0.3.tgz" integrity sha512-oPLh5m10lRNNZDjJ2kP8UpboUx2uFXVaVweVe/lWut4iHWcQEmfqSVJt2ihZsFI8HbpwyyocaXbCAWf0g1ukIA== @@ -7593,7 +7645,7 @@ memfs@^3.4.12, memfs@^3.4.3: dependencies: fs-monkey "^1.0.3" -memoize-one@^5.1.1, "memoize-one@>=3.1.1 <6": +"memoize-one@>=3.1.1 <6", memoize-one@^5.1.1: version "5.2.1" resolved "https://registry.npmjs.org/memoize-one/-/memoize-one-5.2.1.tgz" integrity sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q== @@ -7636,7 +7688,7 @@ micromatch@^4.0.2, micromatch@^4.0.4: braces "^3.0.2" picomatch "^2.3.1" -"mime-db@>= 1.43.0 < 2", mime-db@1.52.0: +mime-db@1.52.0, "mime-db@>= 1.43.0 < 2": version "1.52.0" resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz" integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== @@ -7648,26 +7700,21 @@ mime-types@^2.1.12, mime-types@^2.1.27, mime-types@^2.1.31, mime-types@~2.1.17, dependencies: mime-db "1.52.0" -mime@^1.4.1, mime@1.6.0: - version "1.6.0" - resolved "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz" - integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== - -mime@^2.4.6: - version "2.6.0" - resolved "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz" - integrity sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg== - -mime@^2.5.2: - version "2.6.0" - resolved "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz" - integrity sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg== - mime@1.4.1: version "1.4.1" resolved "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz" integrity sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ== +mime@1.6.0, mime@^1.4.1: + version "1.6.0" + resolved "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz" + integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== + +mime@^2.4.6, mime@^2.5.2: + version "2.6.0" + resolved "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz" + integrity sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg== + mimic-fn@^2.1.0: version "2.1.0" resolved "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz" @@ -7685,7 +7732,7 @@ minimalistic-assert@^1.0.0: resolved "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz" integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== -minimatch@^3.0.2, minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.2: +minimatch@^3.0.2, minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: version "3.1.2" resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== @@ -7706,23 +7753,16 @@ minimatch@^7.4.2: dependencies: brace-expansion "^2.0.1" -minimatch@^8.0.2: +minimatch@^8.0.2, minimatch@^8.0.3: version "8.0.4" resolved "https://registry.npmjs.org/minimatch/-/minimatch-8.0.4.tgz" integrity sha512-W0Wvr9HyFXZRGIDgCicunpQ299OKXs9RgZfaukz4qAW/pJhcpUfupc9c+OObPOFueNy8VSrZgEmDtk6Kh4WzDA== dependencies: brace-expansion "^2.0.1" -minimatch@^8.0.3: - version "8.0.4" - resolved "https://registry.npmjs.org/minimatch/-/minimatch-8.0.4.tgz" - integrity sha512-W0Wvr9HyFXZRGIDgCicunpQ299OKXs9RgZfaukz4qAW/pJhcpUfupc9c+OObPOFueNy8VSrZgEmDtk6Kh4WzDA== - dependencies: - brace-expansion "^2.0.1" - -minimist@^1.2.0, minimist@^1.2.6: +minimist@^1.2.0, minimist@^1.2.5, minimist@^1.2.6: version "1.2.8" - resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== minipass-collect@^1.0.2: @@ -7818,7 +7858,7 @@ mirador-share-plugin@^0.11.0: resolved "https://registry.npmjs.org/mirador-share-plugin/-/mirador-share-plugin-0.11.0.tgz" integrity sha512-fHcdDXyrtfy5pn1zdQNX9BvE5Tjup66eQwyNippE5PMaP8ImUcrFaSL+mStdn+v6agsHcsdRqLhseZ0XWgEuAw== -mirador@^3.0.0-beta.0, mirador@^3.0.0-rc.7, mirador@^3.3.0: +mirador@^3.3.0: version "3.3.0" resolved "https://registry.npmjs.org/mirador/-/mirador-3.3.0.tgz" integrity sha512-BmGfRnWJ45B+vtiAwcFT7n9nKialfejE9UvuUK0NorO37ShArpsKr3yVSD4jQASwSR4DRRpPEG21jOk4WN7H3w== @@ -7905,16 +7945,16 @@ mrmime@^1.0.0: resolved "https://registry.npmjs.org/mrmime/-/mrmime-1.0.1.tgz" integrity sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw== -ms@^2.0.0, ms@^2.1.1, ms@2.1.2: - version "2.1.2" - resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" - integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== - ms@2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz" integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== +ms@2.1.2, ms@^2.0.0, ms@^2.1.1: + version "2.1.2" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + ms@2.1.3: version "2.1.3" resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz" @@ -7957,7 +7997,7 @@ needle@^3.1.0: iconv-lite "^0.6.3" sax "^1.2.4" -negotiator@^0.6.3, negotiator@0.6.3: +negotiator@0.6.3, negotiator@^0.6.3: version "0.6.3" resolved "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz" integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== @@ -7967,10 +8007,10 @@ neo-async@^2.6.2: resolved "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz" integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== -ng-mocks@^13.1.1: - version "13.5.2" - resolved "https://registry.npmjs.org/ng-mocks/-/ng-mocks-13.5.2.tgz" - integrity sha512-mn9qkef166cKmg5k1/jY4AlXEGEPx/cdWXKDdSrs/Fett+nLEAx70uD1LJrpQ35PY6k0v6AUd4fbZX5OaoFNRg== +ng-mocks@^14.10.0: + version "14.10.0" + resolved "https://registry.yarnpkg.com/ng-mocks/-/ng-mocks-14.10.0.tgz#36064650c52f6e01be5c810228a0c9585109bb27" + integrity sha512-gUnrSH4ejlkSpd9wgEe7PNKEyADJCriemSIbyebS0SQjyotSZfp/8jBuMl7Euvk0sPanV2IGhOv6W9e6hNRe/A== ng2-file-upload@1.4.0: version "1.4.0" @@ -7992,7 +8032,7 @@ ngx-infinite-scroll@^10.0.1: "@scarf/scarf" "^1.1.0" opencollective-postinstall "^2.0.2" -ngx-mask@^13.0.0, ngx-mask@^13.1.7: +ngx-mask@^13.1.7: version "13.1.15" resolved "https://registry.npmjs.org/ngx-mask/-/ngx-mask-13.1.15.tgz" integrity sha512-fplyzkFa6lFTzPo/AHaI3TBQxTMdcqQClR9BLLAWTvCyDZkV28fLqWkpIpy0VvPc9ADogFpJJj7R1356mszjag== @@ -8124,7 +8164,7 @@ normalize-url@^4.5.0: resolved "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz" integrity sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA== -nouislider@^14.6.3, nouislider@>=9.x: +nouislider@^14.6.3: version "14.7.0" resolved "https://registry.npmjs.org/nouislider/-/nouislider-14.7.0.tgz" integrity sha512-4RtQ1+LHJKesDCNJrXkQcwXAWCrC2aggdLYMstS/G5fEWL+fXZbUA9pwVNHFghMGuFGRATlDLNInRaPeRKzpFQ== @@ -8148,7 +8188,7 @@ npm-normalize-package-bin@^3.0.0: resolved "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-3.0.0.tgz" integrity sha512-g+DPQSkusnk7HYXr75NtzkIP4+N81i3RPsGFidF3DzHd9MT9wWngmqoeg/fnHFz5MNdtG4w03s+QnhewSLTT2Q== -npm-package-arg@^10.0.0, npm-package-arg@10.1.0: +npm-package-arg@10.1.0, npm-package-arg@^10.0.0: version "10.1.0" resolved "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-10.1.0.tgz" integrity sha512-uFyyCEmgBfZTtrKk/5xDfHp6+MdrqGotX/VoOyEEl3mBwiEE5FlBaePanazJSVMPT7vKepcjYBY2ztg9A3yPIA== @@ -8165,7 +8205,7 @@ npm-packlist@^7.0.0: dependencies: ignore-walk "^6.0.0" -npm-pick-manifest@^8.0.0, npm-pick-manifest@8.0.1: +npm-pick-manifest@8.0.1, npm-pick-manifest@^8.0.0: version "8.0.1" resolved "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-8.0.1.tgz" integrity sha512-mRtvlBjTsJvfCCdmPtiu2bdlx8d/KXtF7yNXNWe7G0Z36qWA9Ny5zXsI2PfBZEv7SXgoxTmNaTzGSbbzDZChoA== @@ -8217,9 +8257,14 @@ nwsapi@^2.2.0, nwsapi@^2.2.2: resolved "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.3.tgz" integrity sha512-jscxIO4/VKScHlbmFBdV1Z6LXnLO+ZR4VMtypudUdfwtKxUN3TQcNFIHLwKtrUbDyHN4/GycY9+oRGZ2XMXYPw== -object-assign@^4, object-assign@^4.1.1: +oauth-sign@~0.9.0: + version "0.9.0" + resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" + integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== + +object-assign@^4, object-assign@^4.0.1, object-assign@^4.1.1: version "4.1.1" - resolved "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== object-inspect@^1.12.3, object-inspect@^1.9.0: @@ -8269,13 +8314,6 @@ obuf@^1.0.0, obuf@^1.1.2: resolved "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz" integrity sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg== -on-finished@~2.3.0: - version "2.3.0" - resolved "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz" - integrity sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww== - dependencies: - ee-first "1.1.1" - on-finished@2.4.1: version "2.4.1" resolved "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz" @@ -8283,6 +8321,13 @@ on-finished@2.4.1: dependencies: ee-first "1.1.1" +on-finished@~2.3.0: + version "2.3.0" + resolved "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz" + integrity sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww== + dependencies: + ee-first "1.1.1" + on-headers@~1.0.2: version "1.0.2" resolved "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz" @@ -8302,19 +8347,19 @@ onetime@^5.1.0, onetime@^5.1.2: dependencies: mimic-fn "^2.1.0" -open@^8.0.9: - version "8.4.0" - resolved "https://registry.npmjs.org/open/-/open-8.4.0.tgz" - integrity sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q== +open@8.4.1: + version "8.4.1" + resolved "https://registry.npmjs.org/open/-/open-8.4.1.tgz" + integrity sha512-/4b7qZNhv6Uhd7jjnREh1NjnPxlTq+XNWPG88Ydkj5AILcA5m3ajvcg57pB24EQjKv0dK62XnDqk9c/hkIG5Kg== dependencies: define-lazy-prop "^2.0.0" is-docker "^2.1.1" is-wsl "^2.2.0" -open@8.4.1: - version "8.4.1" - resolved "https://registry.npmjs.org/open/-/open-8.4.1.tgz" - integrity sha512-/4b7qZNhv6Uhd7jjnREh1NjnPxlTq+XNWPG88Ydkj5AILcA5m3ajvcg57pB24EQjKv0dK62XnDqk9c/hkIG5Kg== +open@^8.0.9: + version "8.4.0" + resolved "https://registry.npmjs.org/open/-/open-8.4.0.tgz" + integrity sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q== dependencies: define-lazy-prop "^2.0.0" is-docker "^2.1.1" @@ -8371,7 +8416,7 @@ optionator@^0.9.1: type-check "^0.4.0" word-wrap "^1.2.3" -ora@^5.1.0, ora@^5.4.1, ora@5.4.1: +ora@5.4.1, ora@^5.1.0, ora@^5.4.1: version "5.4.1" resolved "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz" integrity sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ== @@ -8523,35 +8568,23 @@ parse5-sax-parser@^7.0.0: dependencies: parse5 "^7.0.0" +parse5@6.0.1, parse5@^6.0.1: + version "6.0.1" + resolved "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz" + integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== + parse5@^5.0.0: version "5.1.1" resolved "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz" integrity sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug== -parse5@^6.0.1: - version "6.0.1" - resolved "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz" - integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== - -parse5@^7.0.0: +parse5@^7.0.0, parse5@^7.1.1: version "7.1.2" resolved "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz" integrity sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw== dependencies: entities "^4.4.0" -parse5@^7.1.1: - version "7.1.2" - resolved "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz" - integrity sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw== - dependencies: - entities "^4.4.0" - -parse5@6.0.1: - version "6.0.1" - resolved "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz" - integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== - parseurl@~1.3.2, parseurl@~1.3.3: version "1.3.3" resolved "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz" @@ -8567,6 +8600,11 @@ path-is-absolute@^1.0.0: resolved "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== +path-is-inside@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" + integrity sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w== + path-key@^3.0.0, path-key@^3.1.0: version "3.1.1" resolved "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz" @@ -8630,14 +8668,9 @@ picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== -pify@^2.2.0: +pify@^2.0.0, pify@^2.2.0, pify@^2.3.0: version "2.3.0" - resolved "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz" - integrity sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog== - -pify@^2.3.0: - version "2.3.0" - resolved "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz" + resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" integrity sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog== pify@^4.0.1: @@ -8645,7 +8678,19 @@ pify@^4.0.1: resolved "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz" integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== -piscina@~3.2.0, piscina@3.2.0: +pinkie-promise@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" + integrity sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw== + dependencies: + pinkie "^2.0.0" + +pinkie@^2.0.0: + version "2.0.4" + resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" + integrity sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg== + +piscina@3.2.0, piscina@~3.2.0: version "3.2.0" resolved "https://registry.npmjs.org/piscina/-/piscina-3.2.0.tgz" integrity sha512-yn/jMdHRw+q2ZJhFhyqsmANcbF6V2QwmD84c6xRau+QpQOmtrBCoRGdvTfeuFDYXB5W2m6MfLkjkvQa9lUSmIA== @@ -8663,11 +8708,6 @@ pkg-dir@^4.1.0, pkg-dir@^4.2.0: dependencies: find-up "^4.0.0" -popper.js@^1.16.1: - version "1.16.1" - resolved "https://registry.npmjs.org/popper.js/-/popper.js-1.16.1.tgz" - integrity sha512-Wb4p1J4zyFTbM+u6WuO4XstYx4Ky9Cewe4DWrel7B0w6VVICvPwdOpotjzcf6eD8TsckVnIMNONQyPIUFOUbCQ== - popper.js@1.16.1-lts: version "1.16.1-lts" resolved "https://registry.npmjs.org/popper.js/-/popper.js-1.16.1-lts.tgz" @@ -8820,6 +8860,15 @@ postcss-lab-function@^4.2.1: "@csstools/postcss-progressive-custom-properties" "^1.1.0" postcss-value-parser "^4.2.0" +postcss-loader@7.0.2: + version "7.0.2" + resolved "https://registry.npmjs.org/postcss-loader/-/postcss-loader-7.0.2.tgz" + integrity sha512-fUJzV/QH7NXUAqV8dWJ9Lg4aTkDCezpTS5HgJ2DvqznexTbSTxgi/dTECvTZ15BwKTtk8G/bqI/QTu2HPd3ZCg== + dependencies: + cosmiconfig "^7.0.0" + klona "^2.0.5" + semver "^7.3.8" + postcss-loader@^4.0.3: version "4.3.0" resolved "https://registry.npmjs.org/postcss-loader/-/postcss-loader-4.3.0.tgz" @@ -8831,15 +8880,6 @@ postcss-loader@^4.0.3: schema-utils "^3.0.0" semver "^7.3.4" -postcss-loader@7.0.2: - version "7.0.2" - resolved "https://registry.npmjs.org/postcss-loader/-/postcss-loader-7.0.2.tgz" - integrity sha512-fUJzV/QH7NXUAqV8dWJ9Lg4aTkDCezpTS5HgJ2DvqznexTbSTxgi/dTECvTZ15BwKTtk8G/bqI/QTu2HPd3ZCg== - dependencies: - cosmiconfig "^7.0.0" - klona "^2.0.5" - semver "^7.3.8" - postcss-logical@^5.0.4: version "5.0.4" resolved "https://registry.npmjs.org/postcss-logical/-/postcss-logical-5.0.4.tgz" @@ -9004,6 +9044,15 @@ postcss-value-parser@^4.0.0, postcss-value-parser@^4.1.0, postcss-value-parser@^ resolved "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz" integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== +postcss@8.4.21, postcss@^8.1, postcss@^8.2.14, postcss@^8.3.11, postcss@^8.3.7, postcss@^8.4.19: + version "8.4.21" + resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.21.tgz" + integrity sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg== + dependencies: + nanoid "^3.3.4" + picocolors "^1.0.0" + source-map-js "^1.0.2" + postcss@^6.0.6: version "6.0.23" resolved "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz" @@ -9013,15 +9062,6 @@ postcss@^6.0.6: source-map "^0.6.1" supports-color "^5.4.0" -"postcss@^7.0.0 || ^8.0.1", postcss@^8, postcss@^8.0.0, postcss@^8.0.3, postcss@^8.1, postcss@^8.1.0, postcss@^8.2, postcss@^8.2.14, postcss@^8.3, postcss@^8.3.11, postcss@^8.3.7, postcss@^8.4, postcss@^8.4.19, postcss@^8.4.6, postcss@8.4.21: - version "8.4.21" - resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.21.tgz" - integrity sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg== - dependencies: - nanoid "^3.3.4" - picocolors "^1.0.0" - source-map-js "^1.0.2" - postcss@^7.0.14: version "7.0.39" resolved "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz" @@ -9076,7 +9116,7 @@ prompts@~2.4.2: kleur "^3.0.3" sisteransi "^1.0.5" -prop-types@^15.5, prop-types@^15.6.0, prop-types@^15.6.2, prop-types@^15.7.2, prop-types@^15.8.1: +prop-types@^15.6.0, prop-types@^15.6.2, prop-types@^15.7.2, prop-types@^15.8.1: version "15.8.1" resolved "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz" integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== @@ -9126,12 +9166,17 @@ punycode@^2.1.0, punycode@^2.1.1: resolved "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz" integrity sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA== +q@^1.4.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" + integrity sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw== + qjobs@^1.2.0: version "1.2.0" resolved "https://registry.npmjs.org/qjobs/-/qjobs-1.2.0.tgz" integrity sha512-8YOJEHtxpySA3fFDyCRxA+UUV+fA+rTWnuWvylOK/NCjhY+b4ocCtmu8TtsWb+mYeU+GCHf/S66KZF/AsteKHg== -qs@^6.11.0, qs@6.11.0: +qs@6.11.0, qs@^6.11.0: version "6.11.0" resolved "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz" integrity sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q== @@ -9145,6 +9190,11 @@ qs@~6.10.3: dependencies: side-channel "^1.0.4" +qs@~6.5.2: + version "6.5.3" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.3.tgz#3aeeffc91967ef6e35c0e488ef46fb296ab76aad" + integrity sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA== + querystringify@^2.1.1: version "2.2.0" resolved "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz" @@ -9172,7 +9222,7 @@ range-parser@^1.2.1, range-parser@~1.2.0, range-parser@~1.2.1: resolved "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz" integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== -raw-body@^2.3.2, raw-body@2.5.1: +raw-body@2.5.1, raw-body@^2.3.2: version "2.5.1" resolved "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz" integrity sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig== @@ -9263,7 +9313,7 @@ react-dnd@^10.0.2: dnd-core "^10.0.2" hoist-non-react-statics "^3.3.0" -"react-dom@^0.14.0 || ^15.0.0-0 || ^16.0.0", "react-dom@^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0", "react-dom@^15.3.0 || ^16.0.0-alpha || ^17.0.0 || ^18.0.0-rc", "react-dom@^16.13.1 || ^17.0.0 || ^18.0.0", react-dom@^16.14.0, react-dom@^16.3.2, "react-dom@^16.8.0 || ^17.0.0", react-dom@^16.8.3, "react-dom@^16.8.5 || ^17.0.0 || ^18.0.0", "react-dom@>= 16.3.0", "react-dom@>= 16.8", react-dom@>=16.3.0, react-dom@>=16.6.0, react-dom@>=16.8, react-dom@16.x: +react-dom@^16.14.0: version "16.14.0" resolved "https://registry.npmjs.org/react-dom/-/react-dom-16.14.0.tgz" integrity sha512-1gCeQXDLoIqMgqD3IO2Ah9bnf0w9kzhwN5q4FGnHZ67hBm9yePzB5JJAIQCc8x3pFnNlwFq4RidZggNAAkzWWw== @@ -9302,12 +9352,7 @@ react-image@^4.0.1: resolved "https://registry.npmjs.org/react-image/-/react-image-4.1.0.tgz" integrity sha512-qwPNlelQe9Zy14K2pGWSwoL+vHsAwmJKS6gkotekDgRpcnRuzXNap00GfibD3eEPYu3WCPlyIUUNzcyHOrLHjw== -react-is@^16.13.1: - version "16.13.1" - resolved "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz" - integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== - -react-is@^16.7.0: +react-is@^16.13.1, react-is@^16.7.0: version "16.13.1" resolved "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz" integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== @@ -9391,7 +9436,7 @@ react-window@^1.8.5: "@babel/runtime" "^7.0.0" memoize-one ">=3.1.1 <6" -"react@^0.14.0 || ^15.0.0-0 || ^16.0.0", "react@^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0", "react@^15.3.0 || ^16.0.0-alpha || ^17.0.0 || ^18.0.0-rc", "react@^15.3.0 || 16 || 17 || 18", "react@^15.6 || ^16", react@^16.0.0, react@^16.13, react@^16.13.1, "react@^16.13.1 || ^17.0.0 || ^18.0.0", react@^16.14.0, react@^16.3.0, react@^16.3.2, react@^16.3.x, "react@^16.8.0 || ^17.0.0", "react@^16.8.0 || ^17.0.0 || ^18.0.0", react@^16.8.3, "react@^16.8.3 || ^17 || ^18", "react@^16.8.5 || ^17.0.0 || ^18.0.0", "react@>= 16.3.0", "react@>= 16.8", "react@>= 16.8.0", react@>=0.14, react@>=16.3.0, react@>=16.6.0, react@>=16.8, react@16.x: +react@^16.14.0: version "16.14.0" resolved "https://registry.npmjs.org/react/-/react-16.14.0.tgz" integrity sha512-0X2CImDkJGApiAlcf0ODKIneSwBPhqJawOa5wCtKbu7ZECrmS26NvtSILynQ66cgkT/RJ4LidJOc3bUESwmU8g== @@ -9478,7 +9523,7 @@ redux-thunk@^2.3.0: resolved "https://registry.npmjs.org/redux-thunk/-/redux-thunk-2.4.2.tgz" integrity sha512-+P3TjtnP0k/FEjcBL5FZpoovtvrTNT/UXd4/sluaSyrURlSlhLSzEdfsTBW7WsKB6yPvgd7q/iZPICFjW4o57Q== -"redux@^3.1.0 || ^4.0.0", redux@^4, redux@^4.0.0, redux@^4.0.4, redux@^4.0.5: +redux@^4.0.0, redux@^4.0.4, redux@^4.0.5: version "4.2.1" resolved "https://registry.npmjs.org/redux/-/redux-4.2.1.tgz" integrity sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w== @@ -9554,6 +9599,32 @@ request-progress@^3.0.0: dependencies: throttleit "^1.0.0" +request@^2.87.0: + version "2.88.2" + resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3" + integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw== + dependencies: + aws-sign2 "~0.7.0" + aws4 "^1.8.0" + caseless "~0.12.0" + combined-stream "~1.0.6" + extend "~3.0.2" + forever-agent "~0.6.1" + form-data "~2.3.2" + har-validator "~5.1.3" + http-signature "~1.2.0" + is-typedarray "~1.0.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" + mime-types "~2.1.19" + oauth-sign "~0.9.0" + performance-now "^2.1.0" + qs "~6.5.2" + safe-buffer "^5.1.2" + tough-cookie "~2.5.0" + tunnel-agent "^0.6.0" + uuid "^3.3.2" + require-directory@^2.1.1: version "2.1.1" resolved "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz" @@ -9569,7 +9640,7 @@ requires-port@^1.0.0: resolved "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz" integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ== -reselect@^4.0.0, reselect@>1.0.0: +reselect@^4.0.0: version "4.1.7" resolved "https://registry.npmjs.org/reselect/-/reselect-4.1.7.tgz" integrity sha512-Zu1xbUt3/OPwsXL46hvOOoQrap2azE7ZQbokq61BQfiXvhewsKDwhMeZjTX9sX0nvw1t/U5Audyn1I9P/m9z0A== @@ -9602,15 +9673,6 @@ resolve-url-loader@5.0.0: postcss "^8.2.14" source-map "0.6.1" -resolve@^1.1.7, resolve@^1.14.2, resolve@^1.22.1, resolve@^1.9.0: - version "1.22.2" - resolved "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz" - integrity sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g== - dependencies: - is-core-module "^2.11.0" - path-parse "^1.0.7" - supports-preserve-symlinks-flag "^1.0.0" - resolve@1.22.1: version "1.22.1" resolved "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz" @@ -9620,6 +9682,15 @@ resolve@1.22.1: path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" +resolve@^1.1.7, resolve@^1.14.2, resolve@^1.22.1, resolve@^1.9.0: + version "1.22.2" + resolved "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz" + integrity sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g== + dependencies: + is-core-module "^2.11.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + resp-modifier@6.0.2: version "6.0.2" resolved "https://registry.npmjs.org/resp-modifier/-/resp-modifier-6.0.2.tgz" @@ -9656,9 +9727,9 @@ rfdc@^1.3.0: resolved "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz" integrity sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA== -rimraf@^2.6.3: +rimraf@^2.2.8, rimraf@^2.5.2, rimraf@^2.6.3: version "2.7.1" - resolved "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== dependencies: glob "^7.1.3" @@ -9719,38 +9790,26 @@ rxjs-spy@^8.0.2: rxjs-report-usage "^1.0.4" stacktrace-gps "^3.0.2" -"rxjs@^6.5.3 || ^7.4.0", "rxjs@^6.5.3 || ^7.5.0", rxjs@^7.0.0, rxjs@^7.5.1, rxjs@^7.5.5, rxjs@>=6.5.3: +rxjs@6.6.7, rxjs@^6.5.5, rxjs@~6.6.0: + version "6.6.7" + resolved "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz" + integrity sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ== + dependencies: + tslib "^1.9.0" + +rxjs@^7.5.1, rxjs@^7.5.5: version "7.8.0" resolved "https://registry.npmjs.org/rxjs/-/rxjs-7.8.0.tgz" integrity sha512-F2+gxDshqmIub1KdvZkaEfGDwLNpPvk9Fs6LD/MyQxNgMds/WH9OdDDXOmxUZpME+iSK3rQCctkL0DYyytUqMg== dependencies: tslib "^2.1.0" -rxjs@^6.5.5: - version "6.6.7" - resolved "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz" - integrity sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ== - dependencies: - tslib "^1.9.0" - -rxjs@~6.6.0, rxjs@6.6.7: - version "6.6.7" - resolved "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz" - integrity sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ== - dependencies: - tslib "^1.9.0" - -safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.2, safe-buffer@>=5.1.0, safe-buffer@~5.1.0, safe-buffer@~5.1.1, safe-buffer@5.1.2: +safe-buffer@5.1.2, safe-buffer@>=5.1.0, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.2" resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== -safe-buffer@~5.2.0: - version "5.2.1" - resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" - integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== - -safe-buffer@5.2.1: +safe-buffer@5.2.1, safe-buffer@~5.2.0: version "5.2.1" resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== @@ -9764,7 +9823,7 @@ safe-regex-test@^1.0.0: get-intrinsic "^1.1.3" is-regex "^1.1.4" -safer-buffer@^2.0.2, safer-buffer@^2.1.0, "safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0", safer-buffer@~2.1.0: +"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: version "2.1.2" resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== @@ -9781,14 +9840,6 @@ sanitize-html@^2.7.2: parse-srcset "^1.0.2" postcss "^8.3.11" -sass-loader@^12.6.0: - version "12.6.0" - resolved "https://registry.npmjs.org/sass-loader/-/sass-loader-12.6.0.tgz" - integrity sha512-oLTaH0YCtX4cfnJZxKSLAyglED0naiYfNG1iXfU5w1LNZ+ukoA5DtyDIN5zmKVZwYNJP4KRc5Y3hkWga+7tYfA== - dependencies: - klona "^2.0.4" - neo-async "^2.6.2" - sass-loader@13.2.0: version "13.2.0" resolved "https://registry.npmjs.org/sass-loader/-/sass-loader-13.2.0.tgz" @@ -9797,6 +9848,14 @@ sass-loader@13.2.0: klona "^2.0.4" neo-async "^2.6.2" +sass-loader@^12.6.0: + version "12.6.0" + resolved "https://registry.npmjs.org/sass-loader/-/sass-loader-12.6.0.tgz" + integrity sha512-oLTaH0YCtX4cfnJZxKSLAyglED0naiYfNG1iXfU5w1LNZ+ukoA5DtyDIN5zmKVZwYNJP4KRc5Y3hkWga+7tYfA== + dependencies: + klona "^2.0.4" + neo-async "^2.6.2" + sass-resources-loader@^2.1.1: version "2.2.5" resolved "https://registry.npmjs.org/sass-resources-loader/-/sass-resources-loader-2.2.5.tgz" @@ -9807,13 +9866,6 @@ sass-resources-loader@^2.1.1: glob "^7.1.6" loader-utils "^2.0.0" -sass@^1.3.0, sass@~1.33.0: - version "1.33.0" - resolved "https://registry.npmjs.org/sass/-/sass-1.33.0.tgz" - integrity sha512-9v0MUXnSi62FtfjqcwZ+b8B9FIxdwFEb3FPUkjEPXWd0b5KcnPGSp2XF9WrzcH1ZxedfgJVTdA3A1j4eEj53xg== - dependencies: - chokidar ">=3.0.0 <4.0.0" - sass@1.58.1: version "1.58.1" resolved "https://registry.npmjs.org/sass/-/sass-1.58.1.tgz" @@ -9823,9 +9875,16 @@ sass@1.58.1: immutable "^4.0.0" source-map-js ">=0.6.2 <2.0.0" -sax@^1.2.4: +sass@~1.33.0: + version "1.33.0" + resolved "https://registry.npmjs.org/sass/-/sass-1.33.0.tgz" + integrity sha512-9v0MUXnSi62FtfjqcwZ+b8B9FIxdwFEb3FPUkjEPXWd0b5KcnPGSp2XF9WrzcH1ZxedfgJVTdA3A1j4eEj53xg== + dependencies: + chokidar ">=3.0.0 <4.0.0" + +sax@>=0.6.0, sax@^1.2.4: version "1.2.4" - resolved "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz" + resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== saxes@^5.0.1: @@ -9850,25 +9909,7 @@ scheduler@^0.19.1: loose-envify "^1.1.0" object-assign "^4.1.1" -schema-utils@^3.0.0: - version "3.1.1" - resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz" - integrity sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw== - dependencies: - "@types/json-schema" "^7.0.8" - ajv "^6.12.5" - ajv-keywords "^3.5.2" - -schema-utils@^3.1.0: - version "3.1.1" - resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz" - integrity sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw== - dependencies: - "@types/json-schema" "^7.0.8" - ajv "^6.12.5" - ajv-keywords "^3.5.2" - -schema-utils@^3.1.1: +schema-utils@^3.0.0, schema-utils@^3.1.0, schema-utils@^3.1.1: version "3.1.1" resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz" integrity sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw== @@ -9899,14 +9940,16 @@ selfsigned@^2.1.1: dependencies: node-forge "^1" -semver@^5.6.0: - version "5.7.1" - resolved "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz" - integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== +semver@7.3.8, semver@^7.3.5, semver@^7.3.8: + version "7.3.8" + resolved "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz" + integrity sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A== + dependencies: + lru-cache "^6.0.0" -semver@^5.7.1: +semver@^5.3.0, semver@^5.6.0, semver@^5.7.1: version "5.7.1" - resolved "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== semver@^6.0.0, semver@^6.1.1, semver@^6.1.2, semver@^6.3.0: @@ -9914,42 +9957,7 @@ semver@^6.0.0, semver@^6.1.1, semver@^6.1.2, semver@^6.3.0: resolved "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== -semver@^7.0.0: - version "7.4.0" - resolved "https://registry.npmjs.org/semver/-/semver-7.4.0.tgz" - integrity sha512-RgOxM8Mw+7Zus0+zcLEUn8+JfoLpj/huFTItQy2hsM4khuC1HYRDp0cU482Ewn/Fcy6bCjufD8vAj7voC66KQw== - dependencies: - lru-cache "^6.0.0" - -semver@^7.1.1: - version "7.4.0" - resolved "https://registry.npmjs.org/semver/-/semver-7.4.0.tgz" - integrity sha512-RgOxM8Mw+7Zus0+zcLEUn8+JfoLpj/huFTItQy2hsM4khuC1HYRDp0cU482Ewn/Fcy6bCjufD8vAj7voC66KQw== - dependencies: - lru-cache "^6.0.0" - -semver@^7.3.2: - version "7.4.0" - resolved "https://registry.npmjs.org/semver/-/semver-7.4.0.tgz" - integrity sha512-RgOxM8Mw+7Zus0+zcLEUn8+JfoLpj/huFTItQy2hsM4khuC1HYRDp0cU482Ewn/Fcy6bCjufD8vAj7voC66KQw== - dependencies: - lru-cache "^6.0.0" - -semver@^7.3.4: - version "7.4.0" - resolved "https://registry.npmjs.org/semver/-/semver-7.4.0.tgz" - integrity sha512-RgOxM8Mw+7Zus0+zcLEUn8+JfoLpj/huFTItQy2hsM4khuC1HYRDp0cU482Ewn/Fcy6bCjufD8vAj7voC66KQw== - dependencies: - lru-cache "^6.0.0" - -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" - integrity sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A== - dependencies: - lru-cache "^6.0.0" - -semver@^7.3.7: +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== @@ -10013,7 +10021,7 @@ serialize-javascript@^6.0.0, serialize-javascript@^6.0.1: dependencies: randombytes "^2.1.0" -serve-index@^1.9.1, serve-index@1.9.1: +serve-index@1.9.1, serve-index@^1.9.1: version "1.9.1" resolved "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz" integrity sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw== @@ -10026,16 +10034,6 @@ serve-index@^1.9.1, serve-index@1.9.1: mime-types "~2.1.17" parseurl "~1.3.2" -serve-static@^1.14.1, serve-static@1.15.0: - version "1.15.0" - resolved "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz" - integrity sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g== - dependencies: - encodeurl "~1.0.2" - escape-html "~1.0.3" - parseurl "~1.3.3" - send "0.18.0" - serve-static@1.13.2: version "1.13.2" resolved "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz" @@ -10046,6 +10044,16 @@ serve-static@1.13.2: parseurl "~1.3.2" send "0.16.2" +serve-static@1.15.0, serve-static@^1.14.1: + version "1.15.0" + resolved "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz" + integrity sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g== + dependencies: + encodeurl "~1.0.2" + escape-html "~1.0.3" + parseurl "~1.3.3" + send "0.18.0" + server-destroy@1.0.1: version "1.0.1" resolved "https://registry.npmjs.org/server-destroy/-/server-destroy-1.0.1.tgz" @@ -10240,7 +10248,7 @@ socks@^2.6.2: ip "^2.0.0" smart-buffer "^4.2.0" -sortablejs@>=1.7.0, sortablejs@1.13.0: +sortablejs@1.13.0: version "1.13.0" resolved "https://registry.npmjs.org/sortablejs/-/sortablejs-1.13.0.tgz" integrity sha512-RBJirPY0spWCrU5yCmWM1eFs/XgX2J5c6b275/YyxFRgnzPhKl/TDeU2hNR8Dt7ITq66NRPM4UlOt+e5O4CFHg== @@ -10250,7 +10258,7 @@ source-list-map@^2.0.0: resolved "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz" integrity sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw== -source-map-js@^1.0.2, "source-map-js@>=0.6.2 <2.0.0": +"source-map-js@>=0.6.2 <2.0.0", source-map-js@^1.0.2: version "1.0.2" resolved "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz" integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== @@ -10264,7 +10272,7 @@ source-map-loader@4.0.1: iconv-lite "^0.6.3" source-map-js "^1.0.2" -source-map-support@^0.5.17, source-map-support@^0.5.5, source-map-support@~0.5.20, source-map-support@0.5.21: +source-map-support@0.5.21, source-map-support@^0.5.17, source-map-support@^0.5.5, source-map-support@~0.5.20: version "0.5.21" resolved "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz" integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== @@ -10272,16 +10280,16 @@ source-map-support@^0.5.17, source-map-support@^0.5.5, source-map-support@~0.5.2 buffer-from "^1.0.0" source-map "^0.6.0" -source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1, source-map@0.6.1: - version "0.6.1" - resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" - integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== - source-map@0.5.6: version "0.5.6" resolved "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz" integrity sha512-MjZkVp0NHr5+TPihLcadqnlVoGIoWo4IBHptutGh9wI3ttUYvCG26HkSuDi+K6lsZ25syXJXcctwgyVCt//xqA== +source-map@0.6.1, source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1: + version "0.6.1" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + source-map@0.7.3: version "0.7.3" resolved "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz" @@ -10360,9 +10368,9 @@ sprintf-js@~1.0.2: resolved "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz" integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== -sshpk@^1.14.1: +sshpk@^1.14.1, sshpk@^1.7.0: version "1.17.0" - resolved "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz" + resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.17.0.tgz#578082d92d4fe612b13007496e543fa0fbcbe4c5" integrity sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ== dependencies: asn1 "~0.2.3" @@ -10409,6 +10417,11 @@ stacktrace-gps@^3.0.2: source-map "0.5.6" stackframe "^1.3.4" +statuses@2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz" + integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== + "statuses@>= 1.4.0 < 2", statuses@~1.4.0: version "1.4.0" resolved "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz" @@ -10424,11 +10437,6 @@ statuses@~1.5.0: resolved "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz" integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA== -statuses@2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz" - integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== - stop-iteration-iterator@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz" @@ -10453,20 +10461,6 @@ streamroller@^3.1.5: debug "^4.3.4" fs-extra "^8.1.0" -string_decoder@^1.1.1: - version "1.3.0" - resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz" - integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== - dependencies: - safe-buffer "~5.2.0" - -string_decoder@~1.1.1: - version "1.1.1" - resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz" - integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== - dependencies: - safe-buffer "~5.1.0" - "string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: version "4.2.3" resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" @@ -10503,6 +10497,27 @@ string.prototype.trimstart@^1.0.6: define-properties "^1.1.4" es-abstract "^1.20.4" +string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + +strip-ansi@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" + integrity sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg== + dependencies: + ansi-regex "^2.0.0" + strip-ansi@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz" @@ -10527,11 +10542,16 @@ strip-final-newline@^2.0.0: resolved "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz" integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== -strip-json-comments@^3.1.0, strip-json-comments@^3.1.1, strip-json-comments@3.1.1: +strip-json-comments@3.1.1, strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: version "3.1.1" resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== +supports-color@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" + integrity sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g== + supports-color@^5.3.0, supports-color@^5.4.0, supports-color@^5.5.0: version "5.5.0" resolved "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz" @@ -10546,14 +10566,7 @@ supports-color@^7.1.0: dependencies: has-flag "^4.0.0" -supports-color@^8.0.0: - version "8.1.1" - resolved "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz" - integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== - dependencies: - has-flag "^4.0.0" - -supports-color@^8.1.1: +supports-color@^8.0.0, supports-color@^8.1.1: version "8.1.1" resolved "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz" integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== @@ -10603,20 +10616,20 @@ terser-webpack-plugin@^5.1.3: serialize-javascript "^6.0.1" terser "^5.16.5" -terser@^5.16.5: - version "5.16.9" - resolved "https://registry.npmjs.org/terser/-/terser-5.16.9.tgz" - integrity sha512-HPa/FdTB9XGI2H1/keLFZHxl6WNvAI4YalHGtDQTlMnJcoqSab1UwL4l1hGEhs6/GmLHBZIg/YgB++jcbzoOEg== +terser@5.16.3: + version "5.16.3" + resolved "https://registry.npmjs.org/terser/-/terser-5.16.3.tgz" + integrity sha512-v8wWLaS/xt3nE9dgKEWhNUFP6q4kngO5B8eYFUuebsu7Dw/UNAnpUod6UHo04jSSkv8TzKHjZDSd7EXdDQAl8Q== dependencies: "@jridgewell/source-map" "^0.3.2" acorn "^8.5.0" commander "^2.20.0" source-map-support "~0.5.20" -terser@5.16.3: - version "5.16.3" - resolved "https://registry.npmjs.org/terser/-/terser-5.16.3.tgz" - integrity sha512-v8wWLaS/xt3nE9dgKEWhNUFP6q4kngO5B8eYFUuebsu7Dw/UNAnpUod6UHo04jSSkv8TzKHjZDSd7EXdDQAl8Q== +terser@^5.16.5: + version "5.16.9" + resolved "https://registry.npmjs.org/terser/-/terser-5.16.9.tgz" + integrity sha512-HPa/FdTB9XGI2H1/keLFZHxl6WNvAI4YalHGtDQTlMnJcoqSab1UwL4l1hGEhs6/GmLHBZIg/YgB++jcbzoOEg== dependencies: "@jridgewell/source-map" "^0.3.2" acorn "^8.5.0" @@ -10632,7 +10645,7 @@ test-exclude@^6.0.0: glob "^7.1.4" minimatch "^3.0.4" -text-table@^0.2.0, text-table@0.2.0: +text-table@0.2.0, text-table@^0.2.0: version "0.2.0" resolved "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz" integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== @@ -10667,6 +10680,13 @@ tiny-warning@^1.0.2: resolved "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz" integrity sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA== +tmp@0.2.1, tmp@^0.2.1, tmp@~0.2.1: + version "0.2.1" + resolved "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz" + integrity sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ== + dependencies: + rimraf "^3.0.0" + tmp@^0.0.33: version "0.0.33" resolved "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz" @@ -10674,27 +10694,6 @@ tmp@^0.0.33: dependencies: os-tmpdir "~1.0.2" -tmp@^0.2.1: - version "0.2.1" - resolved "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz" - integrity sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ== - dependencies: - rimraf "^3.0.0" - -tmp@~0.2.1: - version "0.2.1" - resolved "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz" - integrity sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ== - dependencies: - rimraf "^3.0.0" - -tmp@0.2.1: - version "0.2.1" - resolved "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz" - integrity sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ== - dependencies: - rimraf "^3.0.0" - to-fast-properties@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz" @@ -10766,17 +10765,17 @@ tr46@~0.0.3: resolved "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz" integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== -tree-kill@^1.2.2, tree-kill@1.2.2: +tree-kill@1.2.2, tree-kill@^1.2.2: version "1.2.2" resolved "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz" integrity sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A== -ts-node@^10.0.0: - version "10.9.1" - resolved "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz" - integrity sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw== +ts-node@10.2.1, ts-node@^10.0.0: + version "10.2.1" + resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.2.1.tgz#4cc93bea0a7aba2179497e65bb08ddfc198b3ab5" + integrity sha512-hCnyOyuGmD5wHleOQX6NIjJtYVIO8bPP8F2acWkB4W06wdlkgyvJtubO/I9NkI88hCFECbsEgoLc0VNkYmcSfw== dependencies: - "@cspotcode/source-map-support" "^0.8.0" + "@cspotcode/source-map-support" "0.6.1" "@tsconfig/node10" "^1.0.7" "@tsconfig/node12" "^1.0.7" "@tsconfig/node14" "^1.0.0" @@ -10787,7 +10786,6 @@ ts-node@^10.0.0: create-require "^1.1.0" diff "^4.0.1" make-error "^1.1.1" - v8-compile-cache-lib "^3.0.1" yn "3.1.1" ts-node@^8.10.2: @@ -10820,26 +10818,21 @@ tsconfig-paths@^4.1.0: minimist "^1.2.6" strip-bom "^3.0.0" -tslib@^1.8.1: - version "1.14.1" - resolved "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz" - integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== - -tslib@^1.9.0: - version "1.14.1" - resolved "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz" - integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== - -tslib@^2.0.0, tslib@^2.0.3, tslib@^2.1.0, tslib@^2.2.0, tslib@^2.3.0, tslib@^2.3.1, tslib@2.5.0: - version "2.5.0" - resolved "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz" - integrity sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg== - tslib@2.3.1: version "2.3.1" resolved "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz" integrity sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw== +tslib@2.5.0, tslib@^2.0.0, tslib@^2.0.3, tslib@^2.1.0, tslib@^2.2.0, tslib@^2.3.0, tslib@^2.3.1: + version "2.5.0" + resolved "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz" + integrity sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg== + +tslib@^1.8.1, tslib@^1.9.0: + version "1.14.1" + resolved "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz" + integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== + tsutils@^3.21.0: version "3.21.0" resolved "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz" @@ -10932,16 +10925,16 @@ typescript-tuple@^2.2.1: dependencies: typescript-compare "^0.0.2" -typescript@*, "typescript@^3.7.5 || ^4.0.0 || ^5.0.0", typescript@>=2.7, "typescript@>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta", "typescript@>=3.2.x || >= 4.x", typescript@>=3.7.5, "typescript@>=4.8.2 <5.0", typescript@~4.8.4: - version "4.8.4" - resolved "https://registry.npmjs.org/typescript/-/typescript-4.8.4.tgz" - integrity sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ== - typescript@^2.5.0: version "2.9.2" resolved "https://registry.npmjs.org/typescript/-/typescript-2.9.2.tgz" integrity sha512-Gr4p6nFNaoufRIY4NMdpQRNmgxVIGMs4Fcu/ujdYk3nAZqk7supzBE9idmvfZIlH/Cuj//dvi+019qEue9lV0w== +typescript@~4.8.4: + version "4.8.4" + resolved "https://registry.npmjs.org/typescript/-/typescript-4.8.4.tgz" + integrity sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ== + ua-parser-js@^0.7.30: version "0.7.35" resolved "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.35.tgz" @@ -11057,7 +11050,7 @@ universalify@^2.0.0: resolved "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz" integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== -unpipe@~1.0.0, unpipe@1.0.0: +unpipe@1.0.0, unpipe@~1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz" integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== @@ -11105,12 +11098,7 @@ utils-merge@1.0.1: resolved "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz" integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== -uuid@^3.2.1: - version "3.4.0" - resolved "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz" - integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== - -uuid@^3.3.2: +uuid@^3.2.1, uuid@^3.3.2: version "3.4.0" resolved "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz" integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== @@ -11120,11 +11108,6 @@ uuid@^8.1.0, uuid@^8.3.2: resolved "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz" integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== -v8-compile-cache-lib@^3.0.1: - version "3.0.1" - resolved "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz" - integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== - valid-data-url@^3.0.0: version "3.0.1" resolved "https://registry.npmjs.org/valid-data-url/-/valid-data-url-3.0.1.tgz" @@ -11159,16 +11142,16 @@ verror@1.10.0: core-util-is "1.0.2" extsprintf "^1.2.0" -void-elements@^2.0.0: - version "2.0.1" - resolved "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz" - integrity sha512-qZKX4RnBzH2ugr8Lxa7x+0V6XD9Sb/ouARtiasEQCHB1EVU4NXtmHsDDrx1dO4ne5fc3J6EW05BP1Dl0z0iung== - void-elements@3.1.0: version "3.1.0" resolved "https://registry.npmjs.org/void-elements/-/void-elements-3.1.0.tgz" integrity sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w== +void-elements@^2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz" + integrity sha512-qZKX4RnBzH2ugr8Lxa7x+0V6XD9Sb/ouARtiasEQCHB1EVU4NXtmHsDDrx1dO4ne5fc3J6EW05BP1Dl0z0iung== + w3c-hr-time@^1.0.2: version "1.0.2" resolved "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz" @@ -11224,6 +11207,23 @@ web-resource-inliner@^6.0.1: node-fetch "^2.6.0" valid-data-url "^3.0.0" +webdriver-manager@^12.1.8: + version "12.1.9" + resolved "https://registry.yarnpkg.com/webdriver-manager/-/webdriver-manager-12.1.9.tgz#8d83543b92711b7217b39fef4cda958a4703d2df" + integrity sha512-Yl113uKm8z4m/KMUVWHq1Sjtla2uxEBtx2Ue3AmIlnlPAKloDn/Lvmy6pqWCUersVISpdMeVpAaGbNnvMuT2LQ== + dependencies: + adm-zip "^0.5.2" + chalk "^1.1.1" + del "^2.2.0" + glob "^7.0.3" + ini "^1.3.4" + minimist "^1.2.0" + q "^1.4.1" + request "^2.87.0" + rimraf "^2.5.2" + semver "^5.3.0" + xml2js "^0.4.17" + webfontloader@1.6.28: version "1.6.28" resolved "https://registry.npmjs.org/webfontloader/-/webfontloader-1.6.28.tgz" @@ -11265,7 +11265,7 @@ webpack-bundle-analyzer@^4.4.0: sirv "^1.0.7" ws "^7.3.1" -webpack-cli@^4.2.0, webpack-cli@4.x.x: +webpack-cli@^4.2.0: version "4.10.0" resolved "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.10.0.tgz" integrity sha512-NLhDfH/h4O6UOy+0LSso42xvYypClINuMNBVVzX4vX98TmTaTUxwRbXdhucbFMd2qLaCTcLq/PdYrvi8onw90w== @@ -11283,17 +11283,6 @@ webpack-cli@^4.2.0, webpack-cli@4.x.x: rechoir "^0.7.0" webpack-merge "^5.7.3" -webpack-dev-middleware@^5.3.1: - version "5.3.3" - resolved "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz" - integrity sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA== - dependencies: - colorette "^2.0.10" - memfs "^3.4.3" - mime-types "^2.1.31" - range-parser "^1.2.1" - schema-utils "^4.0.0" - webpack-dev-middleware@6.0.1: version "6.0.1" resolved "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-6.0.1.tgz" @@ -11305,41 +11294,16 @@ webpack-dev-middleware@6.0.1: range-parser "^1.2.1" schema-utils "^4.0.0" -webpack-dev-server@^4.0.0, webpack-dev-server@^4.5.0: - version "4.13.2" - resolved "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.13.2.tgz" - integrity sha512-5i6TrGBRxG4vnfDpB6qSQGfnB6skGBXNL5/542w2uRGLimX6qeE5BQMLrzIC3JYV/xlGOv+s+hTleI9AZKUQNw== +webpack-dev-middleware@^5.3.1: + version "5.3.3" + resolved "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz" + integrity sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA== dependencies: - "@types/bonjour" "^3.5.9" - "@types/connect-history-api-fallback" "^1.3.5" - "@types/express" "^4.17.13" - "@types/serve-index" "^1.9.1" - "@types/serve-static" "^1.13.10" - "@types/sockjs" "^0.3.33" - "@types/ws" "^8.5.1" - ansi-html-community "^0.0.8" - bonjour-service "^1.0.11" - chokidar "^3.5.3" colorette "^2.0.10" - compression "^1.7.4" - connect-history-api-fallback "^2.0.0" - default-gateway "^6.0.3" - express "^4.17.3" - graceful-fs "^4.2.6" - html-entities "^2.3.2" - http-proxy-middleware "^2.0.3" - ipaddr.js "^2.0.1" - launch-editor "^2.6.0" - open "^8.0.9" - p-retry "^4.5.0" - rimraf "^3.0.2" + memfs "^3.4.3" + mime-types "^2.1.31" + range-parser "^1.2.1" schema-utils "^4.0.0" - selfsigned "^2.1.1" - serve-index "^1.9.1" - sockjs "^0.3.24" - spdy "^4.0.2" - webpack-dev-middleware "^5.3.1" - ws "^8.13.0" webpack-dev-server@4.11.1: version "4.11.1" @@ -11376,7 +11340,43 @@ webpack-dev-server@4.11.1: webpack-dev-middleware "^5.3.1" ws "^8.4.2" -webpack-merge@^5.7.3, webpack-merge@5.8.0: +webpack-dev-server@^4.5.0: + version "4.13.2" + resolved "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.13.2.tgz" + integrity sha512-5i6TrGBRxG4vnfDpB6qSQGfnB6skGBXNL5/542w2uRGLimX6qeE5BQMLrzIC3JYV/xlGOv+s+hTleI9AZKUQNw== + dependencies: + "@types/bonjour" "^3.5.9" + "@types/connect-history-api-fallback" "^1.3.5" + "@types/express" "^4.17.13" + "@types/serve-index" "^1.9.1" + "@types/serve-static" "^1.13.10" + "@types/sockjs" "^0.3.33" + "@types/ws" "^8.5.1" + ansi-html-community "^0.0.8" + bonjour-service "^1.0.11" + chokidar "^3.5.3" + colorette "^2.0.10" + compression "^1.7.4" + connect-history-api-fallback "^2.0.0" + default-gateway "^6.0.3" + express "^4.17.3" + graceful-fs "^4.2.6" + html-entities "^2.3.2" + http-proxy-middleware "^2.0.3" + ipaddr.js "^2.0.1" + launch-editor "^2.6.0" + open "^8.0.9" + p-retry "^4.5.0" + rimraf "^3.0.2" + schema-utils "^4.0.0" + selfsigned "^2.1.1" + serve-index "^1.9.1" + sockjs "^0.3.24" + spdy "^4.0.2" + webpack-dev-middleware "^5.3.1" + ws "^8.13.0" + +webpack-merge@5.8.0, webpack-merge@^5.7.3: version "5.8.0" resolved "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz" integrity sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q== @@ -11404,36 +11404,6 @@ webpack-subresource-integrity@5.1.0: dependencies: typed-assert "^1.0.8" -"webpack@^4.0.0 || ^5.0.0", "webpack@^4.37.0 || ^5.0.0", webpack@^5.0.0, webpack@^5.1.0, webpack@^5.12.0, webpack@^5.30.0, webpack@^5.54.0, webpack@^5.72.1, webpack@^5.76.0, webpack@>=5, "webpack@4.x.x || 5.x.x": - version "5.78.0" - resolved "https://registry.npmjs.org/webpack/-/webpack-5.78.0.tgz" - integrity sha512-gT5DP72KInmE/3azEaQrISjTvLYlSM0j1Ezhht/KLVkrqtv10JoP/RXhwmX/frrutOPuSq3o5Vq0ehR/4Vmd1g== - dependencies: - "@types/eslint-scope" "^3.7.3" - "@types/estree" "^0.0.51" - "@webassemblyjs/ast" "1.11.1" - "@webassemblyjs/wasm-edit" "1.11.1" - "@webassemblyjs/wasm-parser" "1.11.1" - acorn "^8.7.1" - acorn-import-assertions "^1.7.6" - browserslist "^4.14.5" - chrome-trace-event "^1.0.2" - enhanced-resolve "^5.10.0" - es-module-lexer "^0.9.0" - eslint-scope "5.1.1" - events "^3.2.0" - glob-to-regexp "^0.4.1" - graceful-fs "^4.2.9" - json-parse-even-better-errors "^2.3.1" - loader-runner "^4.2.0" - mime-types "^2.1.27" - neo-async "^2.6.2" - schema-utils "^3.1.0" - tapable "^2.1.1" - terser-webpack-plugin "^5.1.3" - watchpack "^2.4.0" - webpack-sources "^3.2.3" - webpack@5.76.1: version "5.76.1" resolved "https://registry.npmjs.org/webpack/-/webpack-5.76.1.tgz" @@ -11464,7 +11434,37 @@ webpack@5.76.1: watchpack "^2.4.0" webpack-sources "^3.2.3" -websocket-driver@^0.7.4, websocket-driver@>=0.5.1: +webpack@^5.76.0: + version "5.78.0" + resolved "https://registry.npmjs.org/webpack/-/webpack-5.78.0.tgz" + integrity sha512-gT5DP72KInmE/3azEaQrISjTvLYlSM0j1Ezhht/KLVkrqtv10JoP/RXhwmX/frrutOPuSq3o5Vq0ehR/4Vmd1g== + dependencies: + "@types/eslint-scope" "^3.7.3" + "@types/estree" "^0.0.51" + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/wasm-edit" "1.11.1" + "@webassemblyjs/wasm-parser" "1.11.1" + acorn "^8.7.1" + acorn-import-assertions "^1.7.6" + browserslist "^4.14.5" + chrome-trace-event "^1.0.2" + enhanced-resolve "^5.10.0" + es-module-lexer "^0.9.0" + eslint-scope "5.1.1" + events "^3.2.0" + glob-to-regexp "^0.4.1" + graceful-fs "^4.2.9" + json-parse-even-better-errors "^2.3.1" + loader-runner "^4.2.0" + mime-types "^2.1.27" + neo-async "^2.6.2" + schema-utils "^3.1.0" + tapable "^2.1.1" + terser-webpack-plugin "^5.1.3" + watchpack "^2.4.0" + webpack-sources "^3.2.3" + +websocket-driver@>=0.5.1, websocket-driver@^0.7.4: version "0.7.4" resolved "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz" integrity sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg== @@ -11626,12 +11626,7 @@ wrappy@1: resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== -ws@^7.3.1: - version "7.5.9" - resolved "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz" - integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== - -ws@^7.4.6: +ws@^7.3.1, ws@^7.4.6: version "7.5.9" resolved "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz" integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== @@ -11661,6 +11656,19 @@ xml-name-validator@^4.0.0: resolved "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz" integrity sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw== +xml2js@^0.4.17: + version "0.4.23" + resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.4.23.tgz#a0c69516752421eb2ac758ee4d4ccf58843eac66" + integrity sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug== + dependencies: + sax ">=0.6.0" + xmlbuilder "~11.0.0" + +xmlbuilder@~11.0.0: + version "11.0.1" + resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-11.0.1.tgz#be9bae1c8a046e76b31127726347d0ad7002beb3" + integrity sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA== + xmlchars@^2.2.0: version "2.2.0" resolved "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz" @@ -11706,32 +11714,6 @@ yargs-parser@^21.1.1: resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz" integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== -yargs@^16.1.1: - version "16.2.0" - resolved "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz" - integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== - dependencies: - cliui "^7.0.2" - escalade "^3.1.1" - get-caller-file "^2.0.5" - require-directory "^2.1.1" - string-width "^4.2.0" - y18n "^5.0.5" - yargs-parser "^20.2.2" - -yargs@^17.2.1, yargs@^17.3.1: - version "17.7.1" - resolved "https://registry.npmjs.org/yargs/-/yargs-17.7.1.tgz" - integrity sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw== - dependencies: - cliui "^8.0.1" - escalade "^3.1.1" - get-caller-file "^2.0.5" - require-directory "^2.1.1" - string-width "^4.2.3" - y18n "^5.0.5" - yargs-parser "^21.1.1" - yargs@17.1.1: version "17.1.1" resolved "https://registry.npmjs.org/yargs/-/yargs-17.1.1.tgz" @@ -11758,6 +11740,32 @@ yargs@17.6.2: y18n "^5.0.5" yargs-parser "^21.1.1" +yargs@^16.1.1: + version "16.2.0" + resolved "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz" + integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== + dependencies: + cliui "^7.0.2" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.0" + y18n "^5.0.5" + yargs-parser "^20.2.2" + +yargs@^17.2.1, yargs@^17.3.1: + version "17.7.1" + resolved "https://registry.npmjs.org/yargs/-/yargs-17.7.1.tgz" + integrity sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw== + dependencies: + cliui "^8.0.1" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.3" + y18n "^5.0.5" + yargs-parser "^21.1.1" + yauzl@^2.10.0: version "2.10.0" resolved "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz" @@ -11776,7 +11784,7 @@ yocto-queue@^0.1.0: resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz" integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== -"zone.js@~0.11.4 || ~0.12.0 || ~0.13.0", zone.js@~0.11.5: +zone.js@~0.11.5: version "0.11.8" resolved "https://registry.npmjs.org/zone.js/-/zone.js-0.11.8.tgz" integrity sha512-82bctBg2hKcEJ21humWIkXRlLBBmrc3nN7DFh5LGGhcyycO2S7FN8NmdvlcKaGFDNVL4/9kFLmwmInTavdJERA== From ee4da3f541c62d5f018401a1f8d50f9908a287da Mon Sep 17 00:00:00 2001 From: Kristof De Langhe Date: Mon, 24 Apr 2023 10:34:49 +0200 Subject: [PATCH 101/409] 101108: Automatic ng update @ngx-translate/core --- package.json | 2 +- yarn.lock | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index d3085d1d07..46dc18e7bd 100644 --- a/package.json +++ b/package.json @@ -77,7 +77,7 @@ "@ngrx/router-store": "^15.4.0", "@ngrx/store": "^15.4.0", "@nguniversal/express-engine": "^15.2.0", - "@ngx-translate/core": "^13.0.0", + "@ngx-translate/core": "^14.0.0", "@nicky-lenaers/ngx-scroll-to": "^13.0.0", "@types/grecaptcha": "^3.0.4", "angular-idle-preload": "3.0.0", diff --git a/yarn.lock b/yarn.lock index edf28de782..89ba40ce95 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1944,12 +1944,12 @@ "@nguniversal/common" "15.2.0" tslib "^2.3.0" -"@ngx-translate/core@^13.0.0": - version "13.0.0" - resolved "https://registry.npmjs.org/@ngx-translate/core/-/core-13.0.0.tgz" - integrity sha512-+tzEp8wlqEnw0Gc7jtVRAJ6RteUjXw6JJR4O65KlnxOmJrCGPI0xjV/lKRnQeU0w4i96PQs/jtpL921Wrb7PWg== +"@ngx-translate/core@^14.0.0": + version "14.0.0" + resolved "https://registry.yarnpkg.com/@ngx-translate/core/-/core-14.0.0.tgz#af421d0e1a28376843f0fed375cd2fae7630a5ff" + integrity sha512-UevdwNCXMRCdJv//0kC8h2eSfmi02r29xeE8E9gJ1Al4D4jEJ7eiLPdjslTMc21oJNGguqqWeEVjf64SFtvw2w== dependencies: - tslib "^2.0.0" + tslib "^2.3.0" "@nicky-lenaers/ngx-scroll-to@^13.0.0": version "13.0.0" From d6da06506864e9a5c8c428e058a971436f24f418 Mon Sep 17 00:00:00 2001 From: Kristof De Langhe Date: Mon, 24 Apr 2023 11:54:35 +0200 Subject: [PATCH 102/409] 101108: Automatic ng update ngx-pagination --- package.json | 2 +- yarn.lock | 10 ++++++---- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 46dc18e7bd..0e130e1faf 100644 --- a/package.json +++ b/package.json @@ -118,7 +118,7 @@ "ng2-file-upload": "1.4.0", "ng2-nouislider": "^1.8.3", "ngx-infinite-scroll": "^10.0.1", - "ngx-pagination": "5.0.0", + "ngx-pagination": "6.0.3", "ngx-sortablejs": "^11.1.0", "ngx-ui-switch": "^14.0.3", "nouislider": "^14.6.3", diff --git a/yarn.lock b/yarn.lock index 89ba40ce95..c5c6e705fd 100644 --- a/yarn.lock +++ b/yarn.lock @@ -8039,10 +8039,12 @@ ngx-mask@^13.1.7: dependencies: tslib "^2.3.0" -ngx-pagination@5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/ngx-pagination/-/ngx-pagination-5.0.0.tgz" - integrity sha512-Ur0pTWRe2ZXoJ8impEzo0IZKxY5aEcQfSmL5uBqW1rHI2J6nfzgZAHsSLagKHFGchXq0PkRlDVVMcIaNxYJwvQ== +ngx-pagination@6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/ngx-pagination/-/ngx-pagination-6.0.3.tgz#083f77a5c9c3ebf5800fb57a280da71aacc10a18" + integrity sha512-lONjTQ7hFPh1SyhwDrRd5ZwM4NMGQ7bNR6vLrs6mrU0Z8Q1zCcWbf/pvyp4DOlGyd9uyZxRy2wUsSZLeIPjbAw== + dependencies: + tslib "^2.3.0" ngx-sortablejs@^11.1.0: version "11.1.0" From 0ceeeaf33fdbc5437d77ca8efedeb66a8d9d0e71 Mon Sep 17 00:00:00 2001 From: Kristof De Langhe Date: Tue, 25 Apr 2023 10:35:40 +0200 Subject: [PATCH 103/409] 101108: Automatic ng update @angular/cdk@14 --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 0e130e1faf..48c4904a1c 100644 --- a/package.json +++ b/package.json @@ -56,7 +56,7 @@ }, "dependencies": { "@angular/animations": "^15.2.6", - "@angular/cdk": "^13.2.6", + "@angular/cdk": "^14.2.7", "@angular/common": "^15.2.6", "@angular/compiler": "^15.2.6", "@angular/core": "^15.2.6", diff --git a/yarn.lock b/yarn.lock index c5c6e705fd..8d290dc82f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -230,10 +230,10 @@ dependencies: tslib "^2.3.0" -"@angular/cdk@^13.2.6": - version "13.3.9" - resolved "https://registry.npmjs.org/@angular/cdk/-/cdk-13.3.9.tgz" - integrity sha512-XCuCbeuxWFyo3EYrgEYx7eHzwl76vaWcxtWXl00ka8d+WAOtMQ6Tf1D98ybYT5uwF9889fFpXAPw98mVnlo3MA== +"@angular/cdk@^14.2.7": + version "14.2.7" + resolved "https://registry.yarnpkg.com/@angular/cdk/-/cdk-14.2.7.tgz#65eb6fbbeed6120fad4e3913aa66f8b74c853ac3" + integrity sha512-/tEsYaUbDSnfEmKVvAMramIptmhI67O+9STjOV0i+74XR2NospeK0fkbywIANu1n3w6AHGMotvRWJrjmbCElFg== dependencies: tslib "^2.3.0" optionalDependencies: From 41a265f75599f1243b8a249056781283553c60b6 Mon Sep 17 00:00:00 2001 From: Kristof De Langhe Date: Tue, 25 Apr 2023 10:38:18 +0200 Subject: [PATCH 104/409] 101108: Automatic ng update @angular/cdk@15 --- package.json | 2 +- yarn.lock | 19 +++++++------------ 2 files changed, 8 insertions(+), 13 deletions(-) diff --git a/package.json b/package.json index 48c4904a1c..7142c66bac 100644 --- a/package.json +++ b/package.json @@ -56,7 +56,7 @@ }, "dependencies": { "@angular/animations": "^15.2.6", - "@angular/cdk": "^14.2.7", + "@angular/cdk": "^15.2.8", "@angular/common": "^15.2.6", "@angular/compiler": "^15.2.6", "@angular/core": "^15.2.6", diff --git a/yarn.lock b/yarn.lock index 8d290dc82f..9516e9196a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -230,14 +230,14 @@ dependencies: tslib "^2.3.0" -"@angular/cdk@^14.2.7": - version "14.2.7" - resolved "https://registry.yarnpkg.com/@angular/cdk/-/cdk-14.2.7.tgz#65eb6fbbeed6120fad4e3913aa66f8b74c853ac3" - integrity sha512-/tEsYaUbDSnfEmKVvAMramIptmhI67O+9STjOV0i+74XR2NospeK0fkbywIANu1n3w6AHGMotvRWJrjmbCElFg== +"@angular/cdk@^15.2.8": + version "15.2.8" + resolved "https://registry.yarnpkg.com/@angular/cdk/-/cdk-15.2.8.tgz#f7da13abd6fb6a1355c02f5c02dc32bc679c4b1d" + integrity sha512-jiCoxfBFMH29IZIiPmVUzIWetfUNpMIvC20xYVF8RMM819vPogoObzwK4DN/sXcp/6oVbBzZFaYdijhhIt9soQ== dependencies: tslib "^2.3.0" optionalDependencies: - parse5 "^5.0.0" + parse5 "^7.1.2" "@angular/cli@^15.2.5": version "15.2.5" @@ -8575,14 +8575,9 @@ parse5@6.0.1, parse5@^6.0.1: resolved "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz" integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== -parse5@^5.0.0: - version "5.1.1" - resolved "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz" - integrity sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug== - -parse5@^7.0.0, parse5@^7.1.1: +parse5@^7.0.0, parse5@^7.1.1, parse5@^7.1.2: version "7.1.2" - resolved "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-7.1.2.tgz#0736bebbfd77793823240a23b7fc5e010b7f8e32" integrity sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw== dependencies: entities "^4.4.0" From e037d8708411d2cf95e7976ee7c619f443274518 Mon Sep 17 00:00:00 2001 From: Kristof De Langhe Date: Tue, 25 Apr 2023 11:24:11 +0200 Subject: [PATCH 105/409] 101108: Automatic ng update ngx-infinite-scroll --- package.json | 2 +- yarn.lock | 21 +++++---------------- 2 files changed, 6 insertions(+), 17 deletions(-) diff --git a/package.json b/package.json index 7142c66bac..6105902db6 100644 --- a/package.json +++ b/package.json @@ -117,7 +117,7 @@ "ng-mocks": "^14.10.0", "ng2-file-upload": "1.4.0", "ng2-nouislider": "^1.8.3", - "ngx-infinite-scroll": "^10.0.1", + "ngx-infinite-scroll": "^15.0.0", "ngx-pagination": "6.0.3", "ngx-sortablejs": "^11.1.0", "ngx-ui-switch": "^14.0.3", diff --git a/yarn.lock b/yarn.lock index 9516e9196a..dac4be1cdf 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2132,11 +2132,6 @@ resolved "https://registry.npmjs.org/@researchgate/react-intersection-observer/-/react-intersection-observer-1.3.5.tgz" integrity sha512-aYlsex5Dd6BAHMJvJrUoFp8gzgMSL27xFvrxkVYW0bV1RMAapVsO+QeYLtTaSF/QCflktODodvv+wJm49oMnnQ== -"@scarf/scarf@^1.1.0": - version "1.1.1" - resolved "https://registry.npmjs.org/@scarf/scarf/-/scarf-1.1.1.tgz" - integrity sha512-VGbKDbk1RFIaSmdVb0cNjjWJoRWRI/Weo23AjRCC2nryO0iAS8pzsToJfPVPtVs74WHw4L1UTADNdIYRLkirZQ== - "@schematics/angular@15.2.5": version "15.2.5" resolved "https://registry.npmjs.org/@schematics/angular/-/angular-15.2.5.tgz" @@ -8024,13 +8019,12 @@ ng2-nouislider@^1.8.3: resolved "https://registry.npmjs.org/ng2-nouislider/-/ng2-nouislider-1.8.3.tgz" integrity sha512-Vl8tHCcJ/ioJLAs2t6FBC35sZq1P/O5ZdqdFwYxOCOMVbILGWNg+2gWZIjFstvv9pqb/mVvVUYe6qGG/mA/RBQ== -ngx-infinite-scroll@^10.0.1: - version "10.0.1" - resolved "https://registry.npmjs.org/ngx-infinite-scroll/-/ngx-infinite-scroll-10.0.1.tgz" - integrity sha512-7is0eJZ9kJPsaHohRmMhJ/QFHAW9jp9twO5HcHRvFM/Yl/R8QCiokgjwmH0/CR3MuxUanxfHZMfO3PbYTwlBEg== +ngx-infinite-scroll@^15.0.0: + version "15.0.0" + resolved "https://registry.yarnpkg.com/ngx-infinite-scroll/-/ngx-infinite-scroll-15.0.0.tgz#61bbf89f121a796880a4ad67fe785b406532b220" + integrity sha512-FSP5UphRdl47vW8f/dRnPAU+napzruAKizBX2HS7MH292Ca+va6IU0J5+UQQmO5rXod2RZV7UhJ6+7g4xLfs1A== dependencies: - "@scarf/scarf" "^1.1.0" - opencollective-postinstall "^2.0.2" + tslib "^2.3.0" ngx-mask@^13.1.7: version "13.1.15" @@ -8367,11 +8361,6 @@ open@^8.0.9: is-docker "^2.1.1" is-wsl "^2.2.0" -opencollective-postinstall@^2.0.2: - version "2.0.3" - resolved "https://registry.npmjs.org/opencollective-postinstall/-/opencollective-postinstall-2.0.3.tgz" - integrity sha512-8AV/sCtuzUeTo8gQK5qDZzARrulB3egtLzFgteqB2tcT4Mw7B8Kt7JcDHmltjz6FOAHsvTevk70gZEbhM4ZS9Q== - opener@^1.5.2: version "1.5.2" resolved "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz" From 36f6110e5851fdb5513530b0900a94743cd775d6 Mon Sep 17 00:00:00 2001 From: Kristof De Langhe Date: Tue, 25 Apr 2023 11:35:41 +0200 Subject: [PATCH 106/409] 101108: Automatic ng update @nicky-lenaers/ngx-scroll-to --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 6105902db6..3be96cb993 100644 --- a/package.json +++ b/package.json @@ -78,7 +78,7 @@ "@ngrx/store": "^15.4.0", "@nguniversal/express-engine": "^15.2.0", "@ngx-translate/core": "^14.0.0", - "@nicky-lenaers/ngx-scroll-to": "^13.0.0", + "@nicky-lenaers/ngx-scroll-to": "^14.0.0", "@types/grecaptcha": "^3.0.4", "angular-idle-preload": "3.0.0", "angulartics2": "^12.0.0", diff --git a/yarn.lock b/yarn.lock index dac4be1cdf..a657aad0ba 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1951,10 +1951,10 @@ dependencies: tslib "^2.3.0" -"@nicky-lenaers/ngx-scroll-to@^13.0.0": - version "13.0.0" - resolved "https://registry.npmjs.org/@nicky-lenaers/ngx-scroll-to/-/ngx-scroll-to-13.0.0.tgz" - integrity sha512-sF/F4yoHvOtEGkt58VJYbQVITbW0ivmQA+CJGzc9mnJS6XHFnc4be9rlCX3mz7mOn3FfEs+K80MnUivZ/EHfkQ== +"@nicky-lenaers/ngx-scroll-to@^14.0.0": + version "14.0.0" + resolved "https://registry.yarnpkg.com/@nicky-lenaers/ngx-scroll-to/-/ngx-scroll-to-14.0.0.tgz#178cb2c1781dd565841d940e1a678d6eda0796fc" + integrity sha512-nORagPmAQYDjB5jyQ3awGhbnKTKVARZUCK8FJIe46XjPQX2CI9+WBYvsdqq0CsNWVzCjhnC0Om6krzjOTrTHYQ== dependencies: tslib "^2.3.0" From 051b17e0e4be320f801db801bc8b2745c29b34a4 Mon Sep 17 00:00:00 2001 From: Kristof De Langhe Date: Tue, 25 Apr 2023 14:38:49 +0200 Subject: [PATCH 107/409] 101108: Automatic npx npm-check-updates --interactive --- package.json | 122 ++++---- yarn.lock | 833 +++++++++++++++++++++++++++++++++++---------------- 2 files changed, 636 insertions(+), 319 deletions(-) diff --git a/package.json b/package.json index 3be96cb993..4035fea1ad 100644 --- a/package.json +++ b/package.json @@ -55,61 +55,61 @@ "ts-node": "10.2.1" }, "dependencies": { - "@angular/animations": "^15.2.6", + "@angular/animations": "^15.2.8", "@angular/cdk": "^15.2.8", - "@angular/common": "^15.2.6", - "@angular/compiler": "^15.2.6", - "@angular/core": "^15.2.6", - "@angular/forms": "^15.2.6", - "@angular/localize": "15.2.6", - "@angular/platform-browser": "^15.2.6", - "@angular/platform-browser-dynamic": "^15.2.6", - "@angular/platform-server": "^15.2.6", - "@angular/router": "^15.2.6", - "@babel/runtime": "7.17.2", + "@angular/common": "^15.2.8", + "@angular/compiler": "^15.2.8", + "@angular/core": "^15.2.8", + "@angular/forms": "^15.2.8", + "@angular/localize": "15.2.8", + "@angular/platform-browser": "^15.2.8", + "@angular/platform-browser-dynamic": "^15.2.8", + "@angular/platform-server": "^15.2.8", + "@angular/router": "^15.2.8", + "@babel/runtime": "7.21.0", "@kolkov/ngx-gallery": "^2.0.1", "@material-ui/core": "^4.11.0", - "@material-ui/icons": "^4.9.1", + "@material-ui/icons": "^4.11.3", "@ng-bootstrap/ng-bootstrap": "^11.0.0", "@ng-dynamic-forms/core": "^15.0.0", "@ng-dynamic-forms/ui-ng-bootstrap": "^15.0.0", "@ngrx/effects": "^15.4.0", "@ngrx/router-store": "^15.4.0", "@ngrx/store": "^15.4.0", - "@nguniversal/express-engine": "^15.2.0", + "@nguniversal/express-engine": "^15.2.1", "@ngx-translate/core": "^14.0.0", "@nicky-lenaers/ngx-scroll-to": "^14.0.0", "@types/grecaptcha": "^3.0.4", "angular-idle-preload": "3.0.0", - "angulartics2": "^12.0.0", + "angulartics2": "^12.2.0", "axios": "^0.27.2", "bootstrap": "^4.6.1", "cerialize": "0.1.18", - "cli-progress": "^3.8.0", + "cli-progress": "^3.12.0", "colors": "^1.4.0", "compression": "^1.7.4", - "cookie-parser": "1.4.5", - "core-js": "^3.7.0", + "cookie-parser": "1.4.6", + "core-js": "^3.30.1", "date-fns": "^2.29.3", "date-fns-tz": "^1.3.7", - "deepmerge": "^4.2.2", - "ejs": "^3.1.8", - "express": "^4.17.1", + "deepmerge": "^4.3.1", + "ejs": "^3.1.9", + "express": "^4.18.2", "express-rate-limit": "^5.1.3", - "fast-json-patch": "^3.0.0-1", + "fast-json-patch": "^3.1.1", "filesize": "^6.1.0", "http-proxy-middleware": "^1.0.5", - "isbot": "^3.6.5", + "isbot": "^3.6.10", "js-cookie": "2.2.1", "js-yaml": "^4.1.0", - "json5": "^2.2.2", - "jsonschema": "1.4.0", + "json5": "^2.2.3", + "jsonschema": "1.4.1", "jwt-decode": "^3.1.2", "klaro": "^0.7.18", "lodash": "^4.17.21", "lru-cache": "^7.14.1", "markdown-it": "^13.0.1", - "markdown-it-mathjax3": "^4.3.1", + "markdown-it-mathjax3": "^4.3.2", "mirador": "^3.3.0", "mirador-dl-plugin": "^0.13.0", "mirador-share-plugin": "^0.11.0", @@ -122,68 +122,68 @@ "ngx-sortablejs": "^11.1.0", "ngx-ui-switch": "^14.0.3", "nouislider": "^14.6.3", - "pem": "1.14.4", - "prop-types": "^15.7.2", - "react-copy-to-clipboard": "^5.0.1", + "pem": "1.14.7", + "prop-types": "^15.8.1", + "react-copy-to-clipboard": "^5.1.0", "reflect-metadata": "^0.1.13", - "rxjs": "^7.5.5", - "sanitize-html": "^2.7.2", - "sortablejs": "1.13.0", + "rxjs": "^7.8.0", + "sanitize-html": "^2.10.0", + "sortablejs": "1.15.0", "uuid": "^8.3.2", "webfontloader": "1.6.28", "zone.js": "~0.11.5" }, "devDependencies": { "@angular-builders/custom-webpack": "~15.0.0", - "@angular-devkit/build-angular": "^15.2.5", + "@angular-devkit/build-angular": "^15.2.6", "@angular-eslint/builder": "15.2.1", "@angular-eslint/eslint-plugin": "15.2.1", "@angular-eslint/eslint-plugin-template": "15.2.1", "@angular-eslint/schematics": "15.2.1", "@angular-eslint/template-parser": "15.2.1", - "@angular/cli": "^15.2.5", - "@angular/compiler-cli": "^15.2.6", - "@angular/language-service": "^15.2.6", + "@angular/cli": "^15.2.6", + "@angular/compiler-cli": "^15.2.8", + "@angular/language-service": "^15.2.8", "@cypress/schematic": "^1.5.0", - "@fortawesome/fontawesome-free": "^6.2.1", + "@fortawesome/fontawesome-free": "^6.4.0", "@ngrx/store-devtools": "^15.4.0", - "@ngtools/webpack": "^15.2.5", - "@nguniversal/builders": "^15.2.0", + "@ngtools/webpack": "^15.2.6", + "@nguniversal/builders": "^15.2.1", "@types/deep-freeze": "0.1.2", - "@types/ejs": "^3.1.1", - "@types/express": "^4.17.9", + "@types/ejs": "^3.1.2", + "@types/express": "^4.17.17", "@types/jasmine": "~3.6.0", "@types/js-cookie": "2.2.6", - "@types/lodash": "^4.14.165", + "@types/lodash": "^4.14.194", "@types/node": "^14.14.9", - "@types/sanitize-html": "^2.6.2", - "@typescript-eslint/eslint-plugin": "^5.43.0", - "@typescript-eslint/parser": "^5.43.0", - "axe-core": "^4.4.3", + "@types/sanitize-html": "^2.9.0", + "@typescript-eslint/eslint-plugin": "^5.59.1", + "@typescript-eslint/parser": "^5.59.1", + "axe-core": "^4.7.0", "compression-webpack-plugin": "^9.2.0", "copy-webpack-plugin": "^6.4.1", "cross-env": "^7.0.3", - "cypress": "12.9.0", - "cypress-axe": "^1.1.0", + "cypress": "12.10.0", + "cypress-axe": "^1.4.0", "deep-freeze": "0.0.1", - "eslint": "^8.28.0", - "eslint-plugin-deprecation": "^1.3.2", - "eslint-plugin-import": "^2.25.4", + "eslint": "^8.39.0", + "eslint-plugin-deprecation": "^1.4.1", + "eslint-plugin-import": "^2.27.5", "eslint-plugin-jsdoc": "^39.6.4", "eslint-plugin-lodash": "^7.4.0", "eslint-plugin-unused-imports": "^2.0.0", - "express-static-gzip": "^2.1.5", + "express-static-gzip": "^2.1.7", "jasmine-core": "^3.8.0", "jasmine-marbles": "0.9.2", - "karma": "^6.3.14", - "karma-chrome-launcher": "~3.1.0", - "karma-coverage-istanbul-reporter": "~3.0.2", + "karma": "^6.4.2", + "karma-chrome-launcher": "~3.2.0", + "karma-coverage-istanbul-reporter": "~3.0.3", "karma-jasmine": "~4.0.0", "karma-jasmine-html-reporter": "^1.5.0", "karma-mocha-reporter": "2.2.5", "ngx-mask": "^13.1.7", - "nodemon": "^2.0.20", - "postcss": "^8.1", + "nodemon": "^2.0.22", + "postcss": "^8.4", "postcss-apply": "0.12.0", "postcss-import": "^14.0.0", "postcss-loader": "^4.0.3", @@ -193,14 +193,14 @@ "react-dom": "^16.14.0", "rimraf": "^3.0.2", "rxjs-spy": "^8.0.2", - "sass": "~1.33.0", + "sass": "~1.62.0", "sass-loader": "^12.6.0", - "sass-resources-loader": "^2.1.1", + "sass-resources-loader": "^2.2.5", "ts-node": "^8.10.2", "typescript": "~4.8.4", - "webpack": "^5.76.0", - "webpack-bundle-analyzer": "^4.4.0", + "webpack": "^5.80.0", + "webpack-bundle-analyzer": "^4.8.0", "webpack-cli": "^4.2.0", - "webpack-dev-server": "^4.5.0" + "webpack-dev-server": "^4.13.3" } } \ No newline at end of file diff --git a/yarn.lock b/yarn.lock index a657aad0ba..51a236e219 100644 --- a/yarn.lock +++ b/yarn.lock @@ -39,6 +39,14 @@ "@angular-devkit/core" "15.2.5" rxjs "6.6.7" +"@angular-devkit/architect@0.1502.6": + version "0.1502.6" + resolved "https://registry.yarnpkg.com/@angular-devkit/architect/-/architect-0.1502.6.tgz#bf9452610f128ee312ee836510700152993a2447" + integrity sha512-n4oJ9vzFWwabf+AfgqqevVzdJhNKNCav7ytefjD/Y01vkNwlXqWnHcvyyHCLkVibJ6WR8J9lK4t77j/HFlDvWQ== + dependencies: + "@angular-devkit/core" "15.2.6" + rxjs "6.6.7" + "@angular-devkit/architect@^0.1202.10": version "0.1202.18" resolved "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1202.18.tgz" @@ -47,7 +55,7 @@ "@angular-devkit/core" "12.2.18" rxjs "6.6.7" -"@angular-devkit/build-angular@^15.0.0", "@angular-devkit/build-angular@^15.2.5": +"@angular-devkit/build-angular@^15.0.0": version "15.2.5" resolved "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-15.2.5.tgz" integrity sha512-D2LxjBtUlgJnPxybOIN0XsENEGkVkqCGBBii5oK84HvgBHXO/EyP1WXpOdb2lOYSUZyjhOOs0q42LCobJoaxUw== @@ -115,6 +123,74 @@ optionalDependencies: esbuild "0.17.8" +"@angular-devkit/build-angular@^15.2.6": + version "15.2.6" + resolved "https://registry.yarnpkg.com/@angular-devkit/build-angular/-/build-angular-15.2.6.tgz#15f15c27eed465c8becc7a313d4909a7ee66f959" + integrity sha512-OmMcdXXUrAdZNxwxDE8SUx1FMcq9FyMnrSv1PmP9sHPBoxAdBVc/qNdGA9V7C5yHvWHGgzsx7ZK5TDuvifzS5g== + dependencies: + "@ampproject/remapping" "2.2.0" + "@angular-devkit/architect" "0.1502.6" + "@angular-devkit/build-webpack" "0.1502.6" + "@angular-devkit/core" "15.2.6" + "@babel/core" "7.20.12" + "@babel/generator" "7.20.14" + "@babel/helper-annotate-as-pure" "7.18.6" + "@babel/helper-split-export-declaration" "7.18.6" + "@babel/plugin-proposal-async-generator-functions" "7.20.7" + "@babel/plugin-transform-async-to-generator" "7.20.7" + "@babel/plugin-transform-runtime" "7.19.6" + "@babel/preset-env" "7.20.2" + "@babel/runtime" "7.20.13" + "@babel/template" "7.20.7" + "@discoveryjs/json-ext" "0.5.7" + "@ngtools/webpack" "15.2.6" + ansi-colors "4.1.3" + autoprefixer "10.4.13" + babel-loader "9.1.2" + babel-plugin-istanbul "6.1.1" + browserslist "4.21.5" + cacache "17.0.4" + chokidar "3.5.3" + copy-webpack-plugin "11.0.0" + critters "0.0.16" + css-loader "6.7.3" + esbuild-wasm "0.17.8" + glob "8.1.0" + https-proxy-agent "5.0.1" + inquirer "8.2.4" + jsonc-parser "3.2.0" + karma-source-map-support "1.4.0" + less "4.1.3" + less-loader "11.1.0" + license-webpack-plugin "4.0.2" + loader-utils "3.2.1" + magic-string "0.29.0" + mini-css-extract-plugin "2.7.2" + open "8.4.1" + ora "5.4.1" + parse5-html-rewriting-stream "7.0.0" + piscina "3.2.0" + postcss "8.4.21" + postcss-loader "7.0.2" + resolve-url-loader "5.0.0" + rxjs "6.6.7" + sass "1.58.1" + sass-loader "13.2.0" + semver "7.3.8" + source-map-loader "4.0.1" + source-map-support "0.5.21" + terser "5.16.3" + text-table "0.2.0" + tree-kill "1.2.2" + tslib "2.5.0" + webpack "5.76.1" + webpack-dev-middleware "6.0.1" + webpack-dev-server "4.11.1" + webpack-merge "5.8.0" + webpack-subresource-integrity "5.1.0" + optionalDependencies: + esbuild "0.17.8" + "@angular-devkit/build-webpack@0.1502.5": version "0.1502.5" resolved "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1502.5.tgz" @@ -123,6 +199,14 @@ "@angular-devkit/architect" "0.1502.5" rxjs "6.6.7" +"@angular-devkit/build-webpack@0.1502.6": + version "0.1502.6" + resolved "https://registry.yarnpkg.com/@angular-devkit/build-webpack/-/build-webpack-0.1502.6.tgz#5fb444fc54d816e57458d36f3c280b522e5f5cfc" + integrity sha512-X7XQ11QDz2Bs5qpJ3a5glIytvI+S74ORQxdzvT6a6KB8ayW0SgZEhTwD+GF7pa5My8draIaXBGzzQR1qmpWK5Q== + dependencies: + "@angular-devkit/architect" "0.1502.6" + rxjs "6.6.7" + "@angular-devkit/core@12.2.18", "@angular-devkit/core@^12.2.17": version "12.2.18" resolved "https://registry.npmjs.org/@angular-devkit/core/-/core-12.2.18.tgz" @@ -146,6 +230,17 @@ rxjs "6.6.7" source-map "0.7.4" +"@angular-devkit/core@15.2.6": + version "15.2.6" + resolved "https://registry.yarnpkg.com/@angular-devkit/core/-/core-15.2.6.tgz#9118faadbc5e3613283da1774826d2b41883330f" + integrity sha512-YVTWZ+M+xNKdFX4EnY9QX49PZraawiaA0iTd2CUW8ZoTUvU7yOGMKZLSdz6aokTMRVfm0449wt6YL994ibOo1g== + dependencies: + ajv "8.12.0" + ajv-formats "2.1.1" + jsonc-parser "3.2.0" + rxjs "6.6.7" + source-map "0.7.4" + "@angular-devkit/schematics@12.2.18", "@angular-devkit/schematics@^12.2.17": version "12.2.18" resolved "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-12.2.18.tgz" @@ -155,12 +250,12 @@ ora "5.4.1" rxjs "6.6.7" -"@angular-devkit/schematics@15.2.5": - version "15.2.5" - resolved "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-15.2.5.tgz" - integrity sha512-zm7chQRQtPXQzzSAvK/mbZ+RJ3eP7hlU53yyJ/i6kjWAh3Y5uiSHNYGmqhhAHFuzw4Jhb4OC2S9iycxrqmI8TA== +"@angular-devkit/schematics@15.2.6": + version "15.2.6" + resolved "https://registry.yarnpkg.com/@angular-devkit/schematics/-/schematics-15.2.6.tgz#fb5b7530f21586dbdec45cac56f8a418bcfd053d" + integrity sha512-f7VgnAcok7AwR/DhX0ZWskB0rFBo/KsvtIUA2qZSrpKMf8eFiwu03dv/b2mI0vnf+1FBfIQzJvO0ww45zRp6dA== dependencies: - "@angular-devkit/core" "15.2.5" + "@angular-devkit/core" "15.2.6" jsonc-parser "3.2.0" magic-string "0.29.0" ora "5.4.1" @@ -223,10 +318,10 @@ "@angular-eslint/bundled-angular-compiler" "15.2.1" "@typescript-eslint/utils" "5.48.2" -"@angular/animations@^15.2.6": - version "15.2.6" - resolved "https://registry.npmjs.org/@angular/animations/-/animations-15.2.6.tgz" - integrity sha512-2fEhhj7xTzWHD61B502eXwDclsurkOK7CU+iRdl8EAtEobLRt62sG/XHmJ71UaaniWyI/H0sUSEJuF8TIPcaoQ== +"@angular/animations@^15.2.8": + version "15.2.8" + resolved "https://registry.yarnpkg.com/@angular/animations/-/animations-15.2.8.tgz#11de2b0e7fc50918056bdc6d7545ea1864a8592d" + integrity sha512-I3xh8EASQ04s3qXQYpIORI0jFiFmvBQERBqS70TieTCIML7banOf9R3K7sAWB9frG5J0CEUwr+wtF47DCs/7eQ== dependencies: tslib "^2.3.0" @@ -239,15 +334,15 @@ optionalDependencies: parse5 "^7.1.2" -"@angular/cli@^15.2.5": - version "15.2.5" - resolved "https://registry.npmjs.org/@angular/cli/-/cli-15.2.5.tgz" - integrity sha512-TmkkeJkdfDkC6b2SNQcLlr1rsl2anc5rrrY3gawOVXYXBExMxAi2SNJsHZzUXfiitW52aZkAyajF1VFazs8PRw== +"@angular/cli@^15.2.6": + version "15.2.6" + resolved "https://registry.yarnpkg.com/@angular/cli/-/cli-15.2.6.tgz#d5994fbd4d02e71017d4dd28ba06dc1c3cb7a976" + integrity sha512-wNkQ/qCVbd4pERaGVagKJPifEvjRNY5otwsd4iRVubY/XOcIHcYChUThZwgQdVfNAImfJPMZNrhbGxejuWLA9w== dependencies: - "@angular-devkit/architect" "0.1502.5" - "@angular-devkit/core" "15.2.5" - "@angular-devkit/schematics" "15.2.5" - "@schematics/angular" "15.2.5" + "@angular-devkit/architect" "0.1502.6" + "@angular-devkit/core" "15.2.6" + "@angular-devkit/schematics" "15.2.6" + "@schematics/angular" "15.2.6" "@yarnpkg/lockfile" "1.1.0" ansi-colors "4.1.3" ini "3.0.1" @@ -263,17 +358,17 @@ symbol-observable "4.0.0" yargs "17.6.2" -"@angular/common@^15.2.6": - version "15.2.6" - resolved "https://registry.npmjs.org/@angular/common/-/common-15.2.6.tgz" - integrity sha512-kPGJoSkFPXsIeHzcjlal8JC8/jYK9qAr+wv+HDX8O1J2FEzQjwoX4SYvpnvVk5WTqUkxMkRCTMu2YFAAmU1+qg== +"@angular/common@^15.2.8": + version "15.2.8" + resolved "https://registry.yarnpkg.com/@angular/common/-/common-15.2.8.tgz#7d60a4d906b41a852f31c63116ede1b87c84a7ad" + integrity sha512-yLDQihiRcVl38HrWMPbqgzOaSUw85AQH5BsGdjbS6BpoBQj3EXOpccCMFsuxOKxPG4toatgawNqrEnK0Jpv9Mw== dependencies: tslib "^2.3.0" -"@angular/compiler-cli@^15.2.6": - version "15.2.6" - resolved "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-15.2.6.tgz" - integrity sha512-GHwL4l+NkaUGGdypF+nMFWCmTqvGusTzIriIwpnp38wc8lpmVME2jVodB6sHAkrxFmaHXU/gOCDFK4AnOi6Gmw== +"@angular/compiler-cli@^15.2.8": + version "15.2.8" + resolved "https://registry.yarnpkg.com/@angular/compiler-cli/-/compiler-cli-15.2.8.tgz#6535a34b51d143970aa046593d5289883a40fea8" + integrity sha512-fFxaDlbILo0t2t662qA0cjgn+kWItGlc1tFYKU6X7bvYb3t2e0cd9FzrFPLXUQVboGis83ULcJ2zkDxScnuPuQ== dependencies: "@babel/core" "7.19.3" "@jridgewell/sourcemap-codec" "^1.4.14" @@ -286,68 +381,68 @@ tslib "^2.3.0" yargs "^17.2.1" -"@angular/compiler@^15.2.6": - version "15.2.6" - resolved "https://registry.npmjs.org/@angular/compiler/-/compiler-15.2.6.tgz" - integrity sha512-6oBAIY5KcC1UNsrnWGLcopZ9RD7c0HzpTCQY46N6HytHtUjBvzLbGWZu5MfahPtIjKz9FMVYBX9hugcbVpWnTA== +"@angular/compiler@^15.2.8": + version "15.2.8" + resolved "https://registry.yarnpkg.com/@angular/compiler/-/compiler-15.2.8.tgz#7d8f3274e9f011b7b972ba616cd536a66d1e52ea" + integrity sha512-+dvspIDvuGoYqdL7r/3o9ojkR3fH1zevgC0ISJivcIrMi+WcJ0FV2JmJdnm8V52oNsHy+sMF9eEZGEbCbACE/A== dependencies: tslib "^2.3.0" -"@angular/core@^15.2.6": - version "15.2.6" - resolved "https://registry.npmjs.org/@angular/core/-/core-15.2.6.tgz" - integrity sha512-eN46OfSOLQGN6AciUvyHOJ8xQxmiEakkxJeoG1jwcSRXCjwSYYnQ/6drnhUpq5p43XXBAIduKfJXNztEPvLAkA== +"@angular/core@^15.2.8": + version "15.2.8" + resolved "https://registry.yarnpkg.com/@angular/core/-/core-15.2.8.tgz#6d7f8afa61be44b91e4b8737b39d7fdcb256a6ae" + integrity sha512-NDs+g4uM4EhyCvluf8a0YBCFXsDAEfCMHOD5cS00Bl+liTQ7JwtmepkWXMyjLB92irC9JaR79kdy4BoIKOh8WA== dependencies: tslib "^2.3.0" -"@angular/forms@^15.2.6": - version "15.2.6" - resolved "https://registry.npmjs.org/@angular/forms/-/forms-15.2.6.tgz" - integrity sha512-SdZxsE9MUOVMz0FjOwtx1RN/SGpObnAyZBqXNrN0c4BmJg+faJzvKIBBN102CKpWZOGRoq2YYrgxow9StMhxTw== +"@angular/forms@^15.2.8": + version "15.2.8" + resolved "https://registry.yarnpkg.com/@angular/forms/-/forms-15.2.8.tgz#f62a3ede067ddac24ed1b7dc5cefe9b4b0370be7" + integrity sha512-VyevVj20DdQWjAQUyiFTe+DAzqG9GqfAOWn376Y/lhPcwxAojXePTGNgtQud566/urDrNrP5haaLD6O36/3n+w== dependencies: tslib "^2.3.0" -"@angular/language-service@^15.2.6": - version "15.2.6" - resolved "https://registry.npmjs.org/@angular/language-service/-/language-service-15.2.6.tgz" - integrity sha512-q6u4XhFReJ3GtA7dC5rJaEBQPjJUjOz9PlwHSOxZxugFP99ddDNBBFd0caa446G54kQdZFG7j7w7BiAp2/srmQ== +"@angular/language-service@^15.2.8": + version "15.2.8" + resolved "https://registry.yarnpkg.com/@angular/language-service/-/language-service-15.2.8.tgz#f37fb8b020c9d0fccf1bb5b46db525b67084cc9c" + integrity sha512-3wlaJrpxe8ZLe7ZGIOs/Z++kgJMOHZCUvdXLyp/4t1ejULgUgW9yi7nGsemWnSzsUCjf7595BP1Cp1gA/J/1QQ== -"@angular/localize@15.2.6": - version "15.2.6" - resolved "https://registry.npmjs.org/@angular/localize/-/localize-15.2.6.tgz" - integrity sha512-2WJBYRJ6aulo0fS9BUGr4fsdyk+5WcbZoiFURgs0sNrJtYCd51I9rQNwl3OGyYReNmFx8GgLc4K7+rEKhKfSbA== +"@angular/localize@15.2.8": + version "15.2.8" + resolved "https://registry.yarnpkg.com/@angular/localize/-/localize-15.2.8.tgz#fa44efa7d3f84d4767b3b3ca586e7d36929aff54" + integrity sha512-wJLBp0MUnET9kHzBtqIlZ3RQ56JFItXSgmBXagQq+MU+uJZmGvuw6fez0i5wkgv9Rgnr25oCULVtpTF+T5RGYA== dependencies: "@babel/core" "7.19.3" glob "8.1.0" yargs "^17.2.1" -"@angular/platform-browser-dynamic@^15.2.6": - version "15.2.6" - resolved "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-15.2.6.tgz" - integrity sha512-ZSyiigpxBWIM5f8t/a28Y3BCzHn1FtI2KsJysE7di5UUflOzwbxbfycVlpiZp0girbDYRyF18vvefvitNh17Gw== +"@angular/platform-browser-dynamic@^15.2.8": + version "15.2.8" + resolved "https://registry.yarnpkg.com/@angular/platform-browser-dynamic/-/platform-browser-dynamic-15.2.8.tgz#158d28298a6f38dc8a17c416eb2779afcafc16a7" + integrity sha512-75HyoZNibA3u/FvdK4Aw5KMzUmS/nDk5N8s7gfM09fe1resSPgFiW8JJEkr1xiUdA2WtSRbHs34y5rHLDe7n1Q== dependencies: tslib "^2.3.0" -"@angular/platform-browser@^15.2.6": - version "15.2.6" - resolved "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-15.2.6.tgz" - integrity sha512-8afckDEWfYf+cyxs2SboZBJkiCwFgYE8IH24RUW1t3zLC+wfrTr7UEfrCoD4YJRVJdqnPoRWN5gjz98n3n4zsA== +"@angular/platform-browser@^15.2.8": + version "15.2.8" + resolved "https://registry.yarnpkg.com/@angular/platform-browser/-/platform-browser-15.2.8.tgz#2400f732a020d59f17b9bf8c6c3f1fb065147328" + integrity sha512-8sKFUld54inj0FnQ1ydhFxnDgsbbf43W9FALye/5uEtLgwwE/ZvkNYMaQ7hq1JPuQRMDj3gJkFqaLeFjplpHDA== dependencies: tslib "^2.3.0" -"@angular/platform-server@^15.2.6": - version "15.2.6" - resolved "https://registry.npmjs.org/@angular/platform-server/-/platform-server-15.2.6.tgz" - integrity sha512-/2Ez8V+1s8MYSzq9sFUACJaxjYm/NbksGuKbwxV4oydN082vVgh96er5cOCLDzJLYHq+AeAkV3hL1kGHH5FFEg== +"@angular/platform-server@^15.2.8": + version "15.2.8" + resolved "https://registry.yarnpkg.com/@angular/platform-server/-/platform-server-15.2.8.tgz#b850cd70baabd986e0d94f27bff1dc44f958f3af" + integrity sha512-YfPAoK2zp3mTO6ubDe0C9Vzg9Vi4BxXkxHCPG0k8IM3Ivjedkv5PZ+vC0a+GjV2xR/0YqiVE3FCwXk4X6m6LuQ== dependencies: domino "^2.1.2" tslib "^2.3.0" xhr2 "^0.2.0" -"@angular/router@^15.2.6": - version "15.2.6" - resolved "https://registry.npmjs.org/@angular/router/-/router-15.2.6.tgz" - integrity sha512-yB9uc9Xi9N0dErsugleywBA1KYG+GQ9WWSlri34oe2VsCqZazImn71n4wKPtrm2Xiy/mI23wJcr+jiCAtzp49Q== +"@angular/router@^15.2.8": + version "15.2.8" + resolved "https://registry.yarnpkg.com/@angular/router/-/router-15.2.8.tgz#99ebf83d34dae3ebe61097b43aded3743b49c5db" + integrity sha512-C62QBEeJSBTNTrQHZiklPrxwJwuENoZzWX22MMJ7dxl+7VjRgnmj8J7mcX9fLjHlL+mC3RvesMlX7sGZRQV1cg== dependencies: tslib "^2.3.0" @@ -1278,13 +1373,6 @@ resolved "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz" integrity sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA== -"@babel/runtime@7.17.2", "@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2", "@babel/runtime@^7.12.0", "@babel/runtime@^7.14.5", "@babel/runtime@^7.15.4", "@babel/runtime@^7.3.1", "@babel/runtime@^7.4.4", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.3", "@babel/runtime@^7.8.3", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2": - version "7.17.2" - resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.17.2.tgz" - integrity sha512-hzeyJyMA1YGdJTuWU0e/j4wKXrU4OMFvY2MSlaI9B7VQb0r5cxTE3EAIS2Q7Tn2RIcDkRvTA/v2JsAEhxe99uw== - dependencies: - regenerator-runtime "^0.13.4" - "@babel/runtime@7.20.13": version "7.20.13" resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.20.13.tgz" @@ -1292,6 +1380,20 @@ dependencies: regenerator-runtime "^0.13.11" +"@babel/runtime@7.21.0": + version "7.21.0" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.21.0.tgz#5b55c9d394e5fcf304909a8b00c07dc217b56673" + integrity sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw== + dependencies: + regenerator-runtime "^0.13.11" + +"@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2", "@babel/runtime@^7.12.0", "@babel/runtime@^7.14.5", "@babel/runtime@^7.15.4", "@babel/runtime@^7.3.1", "@babel/runtime@^7.4.4", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.3", "@babel/runtime@^7.8.3", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2": + version "7.17.2" + resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.17.2.tgz" + integrity sha512-hzeyJyMA1YGdJTuWU0e/j4wKXrU4OMFvY2MSlaI9B7VQb0r5cxTE3EAIS2Q7Tn2RIcDkRvTA/v2JsAEhxe99uw== + dependencies: + regenerator-runtime "^0.13.4" + "@babel/template@7.20.7", "@babel/template@^7.18.10", "@babel/template@^7.18.6", "@babel/template@^7.20.7": version "7.20.7" resolved "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz" @@ -1654,14 +1756,14 @@ minimatch "^3.1.2" strip-json-comments "^3.1.1" -"@eslint/js@8.38.0": - version "8.38.0" - resolved "https://registry.npmjs.org/@eslint/js/-/js-8.38.0.tgz" - integrity sha512-IoD2MfUnOV58ghIHCiil01PcohxjbYR/qCxsoC+xNgUwh1EY8jOOrYmu3d3a71+tJJ23uscEV4X2HJWMsPJu4g== +"@eslint/js@8.39.0": + version "8.39.0" + resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.39.0.tgz#58b536bcc843f4cd1e02a7e6171da5c040f4d44b" + integrity sha512-kf9RB0Fg7NZfap83B3QOqOGg9QmD9yBudqQXzzOtn3i4y7ZUXe5ONeW34Gwi+TxhH4mvj72R1Zc300KUMa9Bng== -"@fortawesome/fontawesome-free@^6.2.1": +"@fortawesome/fontawesome-free@^6.4.0": version "6.4.0" - resolved "https://registry.npmjs.org/@fortawesome/fontawesome-free/-/fontawesome-free-6.4.0.tgz" + resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-free/-/fontawesome-free-6.4.0.tgz#1ee0c174e472c84b23cb46c995154dc383e3b4fe" integrity sha512-0NyytTlPJwB/BF5LtRV8rrABDbe3TdTXqNB3PdZ+UUUZAEIrdOJdmABqKjt4AXwIoJNaRVVZEXxpNrqvE1GAYQ== "@gar/promisify@^1.0.1", "@gar/promisify@^1.1.3": @@ -1792,9 +1894,9 @@ react-is "^16.8.0 || ^17.0.0" react-transition-group "^4.4.0" -"@material-ui/icons@^4.9.1": +"@material-ui/icons@^4.11.3", "@material-ui/icons@^4.9.1": version "4.11.3" - resolved "https://registry.npmjs.org/@material-ui/icons/-/icons-4.11.3.tgz" + resolved "https://registry.yarnpkg.com/@material-ui/icons/-/icons-4.11.3.tgz#b0693709f9b161ce9ccde276a770d968484ecff1" integrity sha512-IKHlyx6LDh8n19vzwH5RtHIOHl9Tu90aAAxcbWME6kp4dmvODM3UvOHJeMIDzUbd4muuJKHmlNoBN+mDY4XkBA== dependencies: "@babel/runtime" "^7.4.4" @@ -1905,19 +2007,24 @@ dependencies: tslib "^2.0.0" -"@ngtools/webpack@15.2.5", "@ngtools/webpack@^15.2.5": +"@ngtools/webpack@15.2.5": version "15.2.5" resolved "https://registry.npmjs.org/@ngtools/webpack/-/webpack-15.2.5.tgz" integrity sha512-wD6GY4xghVK+SQL0dy/M3saGx5pqi7+1VHEr+BBI7IUNYGSqPNzylKNxLBgQiTzfkzvbrZ6MhfaMNkhvSCYr5w== -"@nguniversal/builders@^15.2.0": - version "15.2.0" - resolved "https://registry.npmjs.org/@nguniversal/builders/-/builders-15.2.0.tgz" - integrity sha512-V+y3gj/yKs2EHXXOSk752yYS60d+Bmhts+l5o4dDi4GJSZbJ7SCcbmocxZNgjYOv3sTJgsE4zLxxiaL7+4MHDQ== +"@ngtools/webpack@15.2.6", "@ngtools/webpack@^15.2.6": + version "15.2.6" + resolved "https://registry.yarnpkg.com/@ngtools/webpack/-/webpack-15.2.6.tgz#9000eafbcb74508ad8300d4f92cc3640f86f0810" + integrity sha512-I+kekKItfsCLdX+ZjjmsWqd0AyoYGTQPjlbQAiPtmdH73/rfPOF4Q/3AU4tzTdn0n0GXqZWv6VOs91w99ydi0A== + +"@nguniversal/builders@^15.2.1": + version "15.2.1" + resolved "https://registry.yarnpkg.com/@nguniversal/builders/-/builders-15.2.1.tgz#0fe86d0f5af92910c728e44aa81620002857531b" + integrity sha512-6UbnJlgFv0KcEmYtw8lJ4B9DVpQcTyQd7vEpuvlOJ7RtcKwY+yUbmsEFnUusxM7y6NgZqiFDziAdJ796agySTQ== dependencies: "@angular-devkit/architect" "~0.1502.0" "@angular-devkit/core" "~15.2.0" - "@nguniversal/common" "15.2.0" + "@nguniversal/common" "15.2.1" browser-sync "^2.27.10" express "^4.18.2" guess-parser "^0.4.22" @@ -1927,21 +2034,21 @@ rxjs "^6.5.5" tree-kill "^1.2.2" -"@nguniversal/common@15.2.0": - version "15.2.0" - resolved "https://registry.npmjs.org/@nguniversal/common/-/common-15.2.0.tgz" - integrity sha512-IfFuqpzK0P3iMdR2DbPWTbjLWsFvAwvMkZnp5k9FRgg20DpdgqDRaoJuw4HV5qSKKhY/JcVXq99GIG6JHaza1A== +"@nguniversal/common@15.2.1": + version "15.2.1" + resolved "https://registry.yarnpkg.com/@nguniversal/common/-/common-15.2.1.tgz#6e3f6b3f46394c02e20a93f7721bcd660810c1a7" + integrity sha512-1m/YFx5FLJAm/ll7YZfUTFGPqsOaHkhwEv8aHIp8oc1CWf6K+agrfLIwzY39n18T3J0lrCL/8/9vR1tnId3A9g== dependencies: critters "0.0.16" jsdom "21.1.0" tslib "^2.3.0" -"@nguniversal/express-engine@^15.2.0": - version "15.2.0" - resolved "https://registry.npmjs.org/@nguniversal/express-engine/-/express-engine-15.2.0.tgz" - integrity sha512-WDHx8iouuAlxaYQ/Sn3Qebv8ZH20O73yt9Z7xJvPM/8uPvWn/zk3wuCIWGPxars7KdkUa/NbDkRmgTlwqUPA3A== +"@nguniversal/express-engine@^15.2.1": + version "15.2.1" + resolved "https://registry.yarnpkg.com/@nguniversal/express-engine/-/express-engine-15.2.1.tgz#4c99b77cc690e44aa6f25ea857838590c71e8237" + integrity sha512-LHQfntApCGvKREJ0MvhioM1TdWnYxqnYRgX3JoWaNVFPdVryhWLPv4RCjqV8QiMe5DQKd6Pc5J+VIhYX5hwjPQ== dependencies: - "@nguniversal/common" "15.2.0" + "@nguniversal/common" "15.2.1" tslib "^2.3.0" "@ngx-translate/core@^14.0.0": @@ -2132,13 +2239,13 @@ resolved "https://registry.npmjs.org/@researchgate/react-intersection-observer/-/react-intersection-observer-1.3.5.tgz" integrity sha512-aYlsex5Dd6BAHMJvJrUoFp8gzgMSL27xFvrxkVYW0bV1RMAapVsO+QeYLtTaSF/QCflktODodvv+wJm49oMnnQ== -"@schematics/angular@15.2.5": - version "15.2.5" - resolved "https://registry.npmjs.org/@schematics/angular/-/angular-15.2.5.tgz" - integrity sha512-YN0A5bzuqEmLdwbcQRop9TFj0QVxTC/XCL0K5DfDymVBS2j09NMyLLVc6TDOs+J/fMQr5EwiT149ikzqiUmAcw== +"@schematics/angular@15.2.6": + version "15.2.6" + resolved "https://registry.yarnpkg.com/@schematics/angular/-/angular-15.2.6.tgz#5a0face51806f6b2adf67eef73b08c31744b07bc" + integrity sha512-OcBUvVAxZEMBX+fi0ytybeAdmStra+GwtlvipS70yOxcAgJ84ZrnZGN7a072cCVQcq7AgqUfssnyqCx1wu+yCg== dependencies: - "@angular-devkit/core" "15.2.5" - "@angular-devkit/schematics" "15.2.5" + "@angular-devkit/core" "15.2.6" + "@angular-devkit/schematics" "15.2.6" jsonc-parser "3.2.0" "@schematics/angular@^12.2.17": @@ -2255,9 +2362,9 @@ resolved "https://registry.npmjs.org/@types/deep-freeze/-/deep-freeze-0.1.2.tgz" integrity sha512-M6x29Vk4681dght4IMnPIcF1SNmeEm0c4uatlTFhp+++H1oDK1THEIzuCC2WeCBVhX+gU0NndsseDS3zaCtlcQ== -"@types/ejs@^3.1.1": +"@types/ejs@^3.1.2": version "3.1.2" - resolved "https://registry.npmjs.org/@types/ejs/-/ejs-3.1.2.tgz" + resolved "https://registry.yarnpkg.com/@types/ejs/-/ejs-3.1.2.tgz#75d277b030bc11b3be38c807e10071f45ebc78d9" integrity sha512-ZmiaE3wglXVWBM9fyVC17aGPkLo/UgaOjEiI2FXQfyczrCefORPxIe+2dVmnmk3zkVIbizjrlQzmPGhSYGXG5g== "@types/eslint-scope@^3.7.3": @@ -2281,6 +2388,11 @@ resolved "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz" integrity sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ== +"@types/estree@^1.0.0": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.1.tgz#aa22750962f3bf0e79d753d3cc067f010c95f194" + integrity sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA== + "@types/express-serve-static-core@*", "@types/express-serve-static-core@^4.17.33": version "4.17.33" resolved "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.33.tgz" @@ -2290,7 +2402,7 @@ "@types/qs" "*" "@types/range-parser" "*" -"@types/express@*", "@types/express@^4.17.13", "@types/express@^4.17.9": +"@types/express@*", "@types/express@^4.17.13", "@types/express@^4.17.17": version "4.17.17" resolved "https://registry.npmjs.org/@types/express/-/express-4.17.17.tgz" integrity sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q== @@ -2340,10 +2452,10 @@ resolved "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz" integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== -"@types/lodash@^4.14.165": - version "4.14.192" - resolved "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.192.tgz" - integrity sha512-km+Vyn3BYm5ytMO13k9KTp27O75rbQ0NFw+U//g+PX7VZyjCioXaRFisqSIJRECljcTv73G3i6BpglNGHgUQ5A== +"@types/lodash@^4.14.194": + version "4.14.194" + resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.194.tgz#b71eb6f7a0ff11bff59fc987134a093029258a76" + integrity sha512-r22s9tAS7imvBt2lyHC9B8AGwWnXaYb1tY09oyLkXDs4vArpYJzw09nj8MLx5VfciBPGIb+ZwG0ssYnEPJxn/g== "@types/mime@*": version "3.0.1" @@ -2406,9 +2518,9 @@ resolved "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz" integrity sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA== -"@types/sanitize-html@^2.6.2": +"@types/sanitize-html@^2.9.0": version "2.9.0" - resolved "https://registry.npmjs.org/@types/sanitize-html/-/sanitize-html-2.9.0.tgz" + resolved "https://registry.yarnpkg.com/@types/sanitize-html/-/sanitize-html-2.9.0.tgz#5b609f7592de22ef80a0930c39670329753dca1b" integrity sha512-4fP/kEcKNj2u39IzrxWYuf/FnCCwwQCpif6wwY6ROUS1EPRIfWJjGkY3HIowY1EX/VbX5e86yq8AAE7UPMgATg== dependencies: htmlparser2 "^8.0.0" @@ -2474,15 +2586,15 @@ dependencies: "@types/node" "*" -"@typescript-eslint/eslint-plugin@^5.43.0": - version "5.58.0" - resolved "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.58.0.tgz" - integrity sha512-vxHvLhH0qgBd3/tW6/VccptSfc8FxPQIkmNTVLWcCOVqSBvqpnKkBTYrhcGlXfSnd78azwe+PsjYFj0X34/njA== +"@typescript-eslint/eslint-plugin@^5.59.1": + version "5.59.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.59.1.tgz#9b09ee1541bff1d2cebdcb87e7ce4a4003acde08" + integrity sha512-AVi0uazY5quFB9hlp2Xv+ogpfpk77xzsgsIEWyVS7uK/c7MZ5tw7ZPbapa0SbfkqE0fsAMkz5UwtgMLVk2BQAg== dependencies: "@eslint-community/regexpp" "^4.4.0" - "@typescript-eslint/scope-manager" "5.58.0" - "@typescript-eslint/type-utils" "5.58.0" - "@typescript-eslint/utils" "5.58.0" + "@typescript-eslint/scope-manager" "5.59.1" + "@typescript-eslint/type-utils" "5.59.1" + "@typescript-eslint/utils" "5.59.1" debug "^4.3.4" grapheme-splitter "^1.0.4" ignore "^5.2.0" @@ -2490,14 +2602,14 @@ semver "^7.3.7" tsutils "^3.21.0" -"@typescript-eslint/parser@^5.43.0": - version "5.58.0" - resolved "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.58.0.tgz" - integrity sha512-ixaM3gRtlfrKzP8N6lRhBbjTow1t6ztfBvQNGuRM8qH1bjFFXIJ35XY+FC0RRBKn3C6cT+7VW1y8tNm7DwPHDQ== +"@typescript-eslint/parser@^5.59.1": + version "5.59.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.59.1.tgz#73c2c12127c5c1182d2e5b71a8fa2a85d215cbb4" + integrity sha512-nzjFAN8WEu6yPRDizIFyzAfgK7nybPodMNFGNH0M9tei2gYnYszRDqVA0xlnRjkl7Hkx2vYrEdb6fP2a21cG1g== dependencies: - "@typescript-eslint/scope-manager" "5.58.0" - "@typescript-eslint/types" "5.58.0" - "@typescript-eslint/typescript-estree" "5.58.0" + "@typescript-eslint/scope-manager" "5.59.1" + "@typescript-eslint/types" "5.59.1" + "@typescript-eslint/typescript-estree" "5.59.1" debug "^4.3.4" "@typescript-eslint/scope-manager@5.48.2": @@ -2516,6 +2628,14 @@ "@typescript-eslint/types" "5.58.0" "@typescript-eslint/visitor-keys" "5.58.0" +"@typescript-eslint/scope-manager@5.59.1": + version "5.59.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.59.1.tgz#8a20222719cebc5198618a5d44113705b51fd7fe" + integrity sha512-mau0waO5frJctPuAzcxiNWqJR5Z8V0190FTSqRw1Q4Euop6+zTwHAf8YIXNwDOT29tyUDrQ65jSg9aTU/H0omA== + dependencies: + "@typescript-eslint/types" "5.59.1" + "@typescript-eslint/visitor-keys" "5.59.1" + "@typescript-eslint/type-utils@5.48.2": version "5.48.2" resolved "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.48.2.tgz" @@ -2526,13 +2646,13 @@ debug "^4.3.4" tsutils "^3.21.0" -"@typescript-eslint/type-utils@5.58.0": - version "5.58.0" - resolved "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.58.0.tgz" - integrity sha512-FF5vP/SKAFJ+LmR9PENql7fQVVgGDOS+dq3j+cKl9iW/9VuZC/8CFmzIP0DLKXfWKpRHawJiG70rVH+xZZbp8w== +"@typescript-eslint/type-utils@5.59.1": + version "5.59.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.59.1.tgz#63981d61684fd24eda2f9f08c0a47ecb000a2111" + integrity sha512-ZMWQ+Oh82jWqWzvM3xU+9y5U7MEMVv6GLioM3R5NJk6uvP47kZ7YvlgSHJ7ERD6bOY7Q4uxWm25c76HKEwIjZw== dependencies: - "@typescript-eslint/typescript-estree" "5.58.0" - "@typescript-eslint/utils" "5.58.0" + "@typescript-eslint/typescript-estree" "5.59.1" + "@typescript-eslint/utils" "5.59.1" debug "^4.3.4" tsutils "^3.21.0" @@ -2546,6 +2666,11 @@ resolved "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.58.0.tgz" integrity sha512-JYV4eITHPzVQMnHZcYJXl2ZloC7thuUHrcUmxtzvItyKPvQ50kb9QXBkgNAt90OYMqwaodQh2kHutWZl1fc+1g== +"@typescript-eslint/types@5.59.1": + version "5.59.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.59.1.tgz#03f3fedd1c044cb336ebc34cc7855f121991f41d" + integrity sha512-dg0ICB+RZwHlysIy/Dh1SP+gnXNzwd/KS0JprD3Lmgmdq+dJAJnUPe1gNG34p0U19HvRlGX733d/KqscrGC1Pg== + "@typescript-eslint/typescript-estree@5.48.2": version "5.48.2" resolved "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.48.2.tgz" @@ -2572,6 +2697,19 @@ semver "^7.3.7" tsutils "^3.21.0" +"@typescript-eslint/typescript-estree@5.59.1": + version "5.59.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.1.tgz#4aa546d27fd0d477c618f0ca00b483f0ec84c43c" + integrity sha512-lYLBBOCsFltFy7XVqzX0Ju+Lh3WPIAWxYpmH/Q7ZoqzbscLiCW00LeYCdsUnnfnj29/s1WovXKh2gwCoinHNGA== + dependencies: + "@typescript-eslint/types" "5.59.1" + "@typescript-eslint/visitor-keys" "5.59.1" + debug "^4.3.4" + globby "^11.1.0" + is-glob "^4.0.3" + semver "^7.3.7" + tsutils "^3.21.0" + "@typescript-eslint/utils@5.48.2": version "5.48.2" resolved "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.48.2.tgz" @@ -2586,7 +2724,21 @@ eslint-utils "^3.0.0" semver "^7.3.7" -"@typescript-eslint/utils@5.58.0", "@typescript-eslint/utils@^5.57.0": +"@typescript-eslint/utils@5.59.1": + version "5.59.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.59.1.tgz#d89fc758ad23d2157cfae53f0b429bdf15db9473" + integrity sha512-MkTe7FE+K1/GxZkP5gRj3rCztg45bEhsd8HYjczBuYm+qFHP5vtZmjx3B0yUCDotceQ4sHgTyz60Ycl225njmA== + dependencies: + "@eslint-community/eslint-utils" "^4.2.0" + "@types/json-schema" "^7.0.9" + "@types/semver" "^7.3.12" + "@typescript-eslint/scope-manager" "5.59.1" + "@typescript-eslint/types" "5.59.1" + "@typescript-eslint/typescript-estree" "5.59.1" + eslint-scope "^5.1.1" + semver "^7.3.7" + +"@typescript-eslint/utils@^5.57.0": version "5.58.0" resolved "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.58.0.tgz" integrity sha512-gAmLOTFXMXOC+zP1fsqm3VceKSBQJNzV385Ok3+yzlavNHZoedajjS4UyS21gabJYcobuigQPs/z71A9MdJFqQ== @@ -2616,6 +2768,14 @@ "@typescript-eslint/types" "5.58.0" eslint-visitor-keys "^3.3.0" +"@typescript-eslint/visitor-keys@5.59.1": + version "5.59.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.1.tgz#0d96c36efb6560d7fb8eb85de10442c10d8f6058" + integrity sha512-6waEYwBTCWryx0VJmP7JaM4FpipLsFl9CvYf2foAE8Qh/Y0s+bxWysciwOs0LTBED4JCaNxTZ5rGadB14M6dwA== + dependencies: + "@typescript-eslint/types" "5.59.1" + eslint-visitor-keys "^3.3.0" + "@webassemblyjs/ast@1.11.1": version "1.11.1" resolved "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz" @@ -2624,21 +2784,44 @@ "@webassemblyjs/helper-numbers" "1.11.1" "@webassemblyjs/helper-wasm-bytecode" "1.11.1" +"@webassemblyjs/ast@1.11.5", "@webassemblyjs/ast@^1.11.5": + version "1.11.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.11.5.tgz#6e818036b94548c1fb53b754b5cae3c9b208281c" + integrity sha512-LHY/GSAZZRpsNQH+/oHqhRQ5FT7eoULcBqgfyTB5nQHogFnK3/7QoN7dLnwSE/JkUAF0SrRuclT7ODqMFtWxxQ== + dependencies: + "@webassemblyjs/helper-numbers" "1.11.5" + "@webassemblyjs/helper-wasm-bytecode" "1.11.5" + "@webassemblyjs/floating-point-hex-parser@1.11.1": version "1.11.1" resolved "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz" integrity sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ== +"@webassemblyjs/floating-point-hex-parser@1.11.5": + version "1.11.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.5.tgz#e85dfdb01cad16b812ff166b96806c050555f1b4" + integrity sha512-1j1zTIC5EZOtCplMBG/IEwLtUojtwFVwdyVMbL/hwWqbzlQoJsWCOavrdnLkemwNoC/EOwtUFch3fuo+cbcXYQ== + "@webassemblyjs/helper-api-error@1.11.1": version "1.11.1" resolved "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz" integrity sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg== +"@webassemblyjs/helper-api-error@1.11.5": + version "1.11.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.5.tgz#1e82fa7958c681ddcf4eabef756ce09d49d442d1" + integrity sha512-L65bDPmfpY0+yFrsgz8b6LhXmbbs38OnwDCf6NpnMUYqa+ENfE5Dq9E42ny0qz/PdR0LJyq/T5YijPnU8AXEpA== + "@webassemblyjs/helper-buffer@1.11.1": version "1.11.1" resolved "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz" integrity sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA== +"@webassemblyjs/helper-buffer@1.11.5": + version "1.11.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.5.tgz#91381652ea95bb38bbfd270702351c0c89d69fba" + integrity sha512-fDKo1gstwFFSfacIeH5KfwzjykIE6ldh1iH9Y/8YkAZrhmu4TctqYjSh7t0K2VyDSXOZJ1MLhht/k9IvYGcIxg== + "@webassemblyjs/helper-numbers@1.11.1": version "1.11.1" resolved "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz" @@ -2648,11 +2831,25 @@ "@webassemblyjs/helper-api-error" "1.11.1" "@xtuc/long" "4.2.2" +"@webassemblyjs/helper-numbers@1.11.5": + version "1.11.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.5.tgz#23380c910d56764957292839006fecbe05e135a9" + integrity sha512-DhykHXM0ZABqfIGYNv93A5KKDw/+ywBFnuWybZZWcuzWHfbp21wUfRkbtz7dMGwGgT4iXjWuhRMA2Mzod6W4WA== + dependencies: + "@webassemblyjs/floating-point-hex-parser" "1.11.5" + "@webassemblyjs/helper-api-error" "1.11.5" + "@xtuc/long" "4.2.2" + "@webassemblyjs/helper-wasm-bytecode@1.11.1": version "1.11.1" resolved "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz" integrity sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q== +"@webassemblyjs/helper-wasm-bytecode@1.11.5": + version "1.11.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.5.tgz#e258a25251bc69a52ef817da3001863cc1c24b9f" + integrity sha512-oC4Qa0bNcqnjAowFn7MPCETQgDYytpsfvz4ujZz63Zu/a/v71HeCAAmZsgZ3YVKec3zSPYytG3/PrRCqbtcAvA== + "@webassemblyjs/helper-wasm-section@1.11.1": version "1.11.1" resolved "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz" @@ -2663,6 +2860,16 @@ "@webassemblyjs/helper-wasm-bytecode" "1.11.1" "@webassemblyjs/wasm-gen" "1.11.1" +"@webassemblyjs/helper-wasm-section@1.11.5": + version "1.11.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.5.tgz#966e855a6fae04d5570ad4ec87fbcf29b42ba78e" + integrity sha512-uEoThA1LN2NA+K3B9wDo3yKlBfVtC6rh0i4/6hvbz071E8gTNZD/pT0MsBf7MeD6KbApMSkaAK0XeKyOZC7CIA== + dependencies: + "@webassemblyjs/ast" "1.11.5" + "@webassemblyjs/helper-buffer" "1.11.5" + "@webassemblyjs/helper-wasm-bytecode" "1.11.5" + "@webassemblyjs/wasm-gen" "1.11.5" + "@webassemblyjs/ieee754@1.11.1": version "1.11.1" resolved "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz" @@ -2670,6 +2877,13 @@ dependencies: "@xtuc/ieee754" "^1.2.0" +"@webassemblyjs/ieee754@1.11.5": + version "1.11.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.11.5.tgz#b2db1b33ce9c91e34236194c2b5cba9b25ca9d60" + integrity sha512-37aGq6qVL8A8oPbPrSGMBcp38YZFXcHfiROflJn9jxSdSMMM5dS5P/9e2/TpaJuhE+wFrbukN2WI6Hw9MH5acg== + dependencies: + "@xtuc/ieee754" "^1.2.0" + "@webassemblyjs/leb128@1.11.1": version "1.11.1" resolved "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz" @@ -2677,11 +2891,23 @@ dependencies: "@xtuc/long" "4.2.2" +"@webassemblyjs/leb128@1.11.5": + version "1.11.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.11.5.tgz#482e44d26b6b949edf042a8525a66c649e38935a" + integrity sha512-ajqrRSXaTJoPW+xmkfYN6l8VIeNnR4vBOTQO9HzR7IygoCcKWkICbKFbVTNMjMgMREqXEr0+2M6zukzM47ZUfQ== + dependencies: + "@xtuc/long" "4.2.2" + "@webassemblyjs/utf8@1.11.1": version "1.11.1" resolved "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz" integrity sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ== +"@webassemblyjs/utf8@1.11.5": + version "1.11.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.11.5.tgz#83bef94856e399f3740e8df9f63bc47a987eae1a" + integrity sha512-WiOhulHKTZU5UPlRl53gHR8OxdGsSOxqfpqWeA2FmcwBMaoEdz6b2x2si3IwC9/fSPLfe8pBMRTHVMk5nlwnFQ== + "@webassemblyjs/wasm-edit@1.11.1": version "1.11.1" resolved "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz" @@ -2696,6 +2922,20 @@ "@webassemblyjs/wasm-parser" "1.11.1" "@webassemblyjs/wast-printer" "1.11.1" +"@webassemblyjs/wasm-edit@^1.11.5": + version "1.11.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.5.tgz#93ee10a08037657e21c70de31c47fdad6b522b2d" + integrity sha512-C0p9D2fAu3Twwqvygvf42iGCQ4av8MFBLiTb+08SZ4cEdwzWx9QeAHDo1E2k+9s/0w1DM40oflJOpkZ8jW4HCQ== + dependencies: + "@webassemblyjs/ast" "1.11.5" + "@webassemblyjs/helper-buffer" "1.11.5" + "@webassemblyjs/helper-wasm-bytecode" "1.11.5" + "@webassemblyjs/helper-wasm-section" "1.11.5" + "@webassemblyjs/wasm-gen" "1.11.5" + "@webassemblyjs/wasm-opt" "1.11.5" + "@webassemblyjs/wasm-parser" "1.11.5" + "@webassemblyjs/wast-printer" "1.11.5" + "@webassemblyjs/wasm-gen@1.11.1": version "1.11.1" resolved "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz" @@ -2707,6 +2947,17 @@ "@webassemblyjs/leb128" "1.11.1" "@webassemblyjs/utf8" "1.11.1" +"@webassemblyjs/wasm-gen@1.11.5": + version "1.11.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.5.tgz#ceb1c82b40bf0cf67a492c53381916756ef7f0b1" + integrity sha512-14vteRlRjxLK9eSyYFvw1K8Vv+iPdZU0Aebk3j6oB8TQiQYuO6hj9s4d7qf6f2HJr2khzvNldAFG13CgdkAIfA== + dependencies: + "@webassemblyjs/ast" "1.11.5" + "@webassemblyjs/helper-wasm-bytecode" "1.11.5" + "@webassemblyjs/ieee754" "1.11.5" + "@webassemblyjs/leb128" "1.11.5" + "@webassemblyjs/utf8" "1.11.5" + "@webassemblyjs/wasm-opt@1.11.1": version "1.11.1" resolved "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz" @@ -2717,6 +2968,16 @@ "@webassemblyjs/wasm-gen" "1.11.1" "@webassemblyjs/wasm-parser" "1.11.1" +"@webassemblyjs/wasm-opt@1.11.5": + version "1.11.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.5.tgz#b52bac29681fa62487e16d3bb7f0633d5e62ca0a" + integrity sha512-tcKwlIXstBQgbKy1MlbDMlXaxpucn42eb17H29rawYLxm5+MsEmgPzeCP8B1Cl69hCice8LeKgZpRUAPtqYPgw== + dependencies: + "@webassemblyjs/ast" "1.11.5" + "@webassemblyjs/helper-buffer" "1.11.5" + "@webassemblyjs/wasm-gen" "1.11.5" + "@webassemblyjs/wasm-parser" "1.11.5" + "@webassemblyjs/wasm-parser@1.11.1": version "1.11.1" resolved "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz" @@ -2729,6 +2990,18 @@ "@webassemblyjs/leb128" "1.11.1" "@webassemblyjs/utf8" "1.11.1" +"@webassemblyjs/wasm-parser@1.11.5", "@webassemblyjs/wasm-parser@^1.11.5": + version "1.11.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.5.tgz#7ba0697ca74c860ea13e3ba226b29617046982e2" + integrity sha512-SVXUIwsLQlc8srSD7jejsfTU83g7pIGr2YYNb9oHdtldSxaOhvA5xwvIiWIfcX8PlSakgqMXsLpLfbbJ4cBYew== + dependencies: + "@webassemblyjs/ast" "1.11.5" + "@webassemblyjs/helper-api-error" "1.11.5" + "@webassemblyjs/helper-wasm-bytecode" "1.11.5" + "@webassemblyjs/ieee754" "1.11.5" + "@webassemblyjs/leb128" "1.11.5" + "@webassemblyjs/utf8" "1.11.5" + "@webassemblyjs/wast-printer@1.11.1": version "1.11.1" resolved "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz" @@ -2737,6 +3010,14 @@ "@webassemblyjs/ast" "1.11.1" "@xtuc/long" "4.2.2" +"@webassemblyjs/wast-printer@1.11.5": + version "1.11.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.11.5.tgz#7a5e9689043f3eca82d544d7be7a8e6373a6fa98" + integrity sha512-f7Pq3wvg3GSPUPzR0F6bmI89Hdb+u9WXrSKc4v+N0aV0q6r42WoF92Jp2jEorBEBRoRNXgjp53nBniDXcqZYPA== + dependencies: + "@webassemblyjs/ast" "1.11.5" + "@xtuc/long" "4.2.2" + "@webpack-cli/configtest@^1.2.0": version "1.2.0" resolved "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.2.0.tgz" @@ -2941,9 +3222,9 @@ angular-idle-preload@3.0.0: resolved "https://registry.npmjs.org/angular-idle-preload/-/angular-idle-preload-3.0.0.tgz" integrity sha512-W3P2m2B6MHdt1DVunH6H3VWkAZrG3ZwxGcPjedVvIyRhg/LmMtILoizHSxTXw3fsKIEdAPwGObXGpML9WD1jJA== -angulartics2@^12.0.0: +angulartics2@^12.2.0: version "12.2.0" - resolved "https://registry.npmjs.org/angulartics2/-/angulartics2-12.2.0.tgz" + resolved "https://registry.yarnpkg.com/angulartics2/-/angulartics2-12.2.0.tgz#79159693b4436905391e3b1e7d549c900408e175" integrity sha512-1wl/cPA4PGYj42z80VIR+A0Hy3+rt13POzfTfZ83NUDx2KKbHjtTKS0O7u3umi10cqvi5tn4NTSYIFFJ1fI2Tw== dependencies: tslib "^2.3.0" @@ -3203,10 +3484,10 @@ aws4@^1.8.0: resolved "https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz" integrity sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg== -axe-core@^4.4.3: - version "4.6.3" - resolved "https://registry.npmjs.org/axe-core/-/axe-core-4.6.3.tgz" - integrity sha512-/BQzOX780JhsxDnPpH4ZiyrJAzcd8AfzFPkv+89veFSr1rcMjuq2JDCwypKaPeB6ljHp9KjXhPpjgCvQlWYuqg== +axe-core@^4.7.0: + version "4.7.0" + resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.7.0.tgz#34ba5a48a8b564f67e103f0aa5768d76e15bbbbf" + integrity sha512-M0JtH+hlOL5pLQwHOLNYZaXuhqmvS8oExsqB1SBYgA4Dk7u/xx+YdGHXaK5pyUfed5mYXdlYiphWq3G8cRi5JQ== axios@0.21.4: version "0.21.4" @@ -3779,9 +4060,9 @@ cli-cursor@^3.1.0: dependencies: restore-cursor "^3.1.0" -cli-progress@^3.8.0: +cli-progress@^3.12.0: version "3.12.0" - resolved "https://registry.npmjs.org/cli-progress/-/cli-progress-3.12.0.tgz" + resolved "https://registry.yarnpkg.com/cli-progress/-/cli-progress-3.12.0.tgz#807ee14b66bcc086258e444ad0f19e7d42577942" integrity sha512-tRkV3HJ1ASwm19THiiLIXLO7Im7wlTuKnvkYaTkyoAPefqjNg7W7DHKUlGRxy9vxDvbyCYQkQozvptuMkGCg8A== dependencies: string-width "^4.2.3" @@ -3906,12 +4187,7 @@ commander@^2.2.0, commander@^2.20.0: resolved "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz" integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== -commander@^5.1.0: - version "5.1.0" - resolved "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz" - integrity sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg== - -commander@^6.1.0: +commander@^6.1.0, commander@^6.2.1: version "6.2.1" resolved "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz" integrity sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA== @@ -4021,12 +4297,12 @@ convert-source-map@^1.5.1, convert-source-map@^1.7.0: resolved "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz" integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A== -cookie-parser@1.4.5: - version "1.4.5" - resolved "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.4.5.tgz" - integrity sha512-f13bPUj/gG/5mDr+xLmSxxDsB9DQiTIfhJS/sqjrmfAWiAN+x2O4i/XguTL9yDZ+/IFDanJ+5x7hC4CXT9Tdzw== +cookie-parser@1.4.6: + version "1.4.6" + resolved "https://registry.yarnpkg.com/cookie-parser/-/cookie-parser-1.4.6.tgz#3ac3a7d35a7a03bbc7e365073a26074824214594" + integrity sha512-z3IzaNjdwUC2olLIB5/ITd0/setiaFMLYiZJle7xg5Fe9KWAceil7xszYfHHBtDFYLSgJduS2Ty0P1uJdPDJeA== dependencies: - cookie "0.4.0" + cookie "0.4.1" cookie-signature "1.0.6" cookie-signature@1.0.6: @@ -4034,10 +4310,10 @@ cookie-signature@1.0.6: resolved "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz" integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ== -cookie@0.4.0: - version "0.4.0" - resolved "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz" - integrity sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg== +cookie@0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.1.tgz#afd713fe26ebd21ba95ceb61f9a8116e50a537d1" + integrity sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA== cookie@0.5.0: version "0.5.0" @@ -4099,10 +4375,10 @@ core-js-compat@^3.25.1: dependencies: browserslist "^4.21.5" -core-js@^3.7.0: - version "3.30.0" - resolved "https://registry.npmjs.org/core-js/-/core-js-3.30.0.tgz" - integrity sha512-hQotSSARoNh1mYPi9O2YaWeiq/cEB95kOrFb4NCrO4RIFt1qqNpKsaE+vy/L3oiqvND5cThqXzUU3r9F7Efztg== +core-js@^3.30.1: + version "3.30.1" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.30.1.tgz#fc9c5adcc541d8e9fa3e381179433cbf795628ba" + integrity sha512-ZNS5nbiSwDTq4hFosEDqm65izl2CWmLz0hARJMyNQBgkUZMIF51cQiMvIQKA6hvuaeWxQDP3hEedM1JZIgTldQ== core-util-is@1.0.2: version "1.0.2" @@ -4282,15 +4558,15 @@ custom-event@~1.0.0: resolved "https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz" integrity sha512-GAj5FOq0Hd+RsCGVJxZuKaIDXDf3h6GQoNEjFgbLLI/trgtavwUbSnZ5pVfg27DVCaWjIohryS0JFwIJyT2cMg== -cypress-axe@^1.1.0: +cypress-axe@^1.4.0: version "1.4.0" - resolved "https://registry.npmjs.org/cypress-axe/-/cypress-axe-1.4.0.tgz" + resolved "https://registry.yarnpkg.com/cypress-axe/-/cypress-axe-1.4.0.tgz#e67482bfe9e740796bf77c7823f19781a8a2faff" integrity sha512-Ut7NKfzjyKm0BEbt2WxuKtLkIXmx6FD2j0RwdvO/Ykl7GmB/qRQkwbKLk3VP35+83hiIr8GKD04PDdrTK5BnyA== -cypress@12.9.0: - version "12.9.0" - resolved "https://registry.npmjs.org/cypress/-/cypress-12.9.0.tgz" - integrity sha512-Ofe09LbHKgSqX89Iy1xen2WvpgbvNxDzsWx3mgU1mfILouELeXYGwIib3ItCwoRrRifoQwcBFmY54Vs0zw7QCg== +cypress@12.10.0: + version "12.10.0" + resolved "https://registry.yarnpkg.com/cypress/-/cypress-12.10.0.tgz#b6264f77c214d63530ebac2b33c4d099bd40b715" + integrity sha512-Y0wPc221xKKW1/4iAFCphkrG2jNR4MjOne3iGn4mcuCaE7Y5EtXL83N8BzRsAht7GYfWVjJ/UeTqEdDKHz39HQ== dependencies: "@cypress/request" "^2.88.10" "@cypress/xvfb" "^1.2.4" @@ -4306,7 +4582,7 @@ cypress@12.9.0: check-more-types "^2.24.0" cli-cursor "^3.1.0" cli-table3 "~0.6.1" - commander "^5.1.0" + commander "^6.2.1" common-tags "^1.8.0" dayjs "^1.10.4" debug "^4.3.4" @@ -4324,7 +4600,7 @@ cypress@12.9.0: listr2 "^3.8.3" lodash "^4.17.21" log-symbols "^4.0.0" - minimist "^1.2.6" + minimist "^1.2.8" ospath "^1.2.2" pretty-bytes "^5.6.0" proxy-from-env "1.0.0" @@ -4446,9 +4722,9 @@ deep-is@^0.1.3, deep-is@~0.1.3: resolved "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz" integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== -deepmerge@^4.2.2: +deepmerge@^4.2.2, deepmerge@^4.3.1: version "4.3.1" - resolved "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz" + resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a" integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== default-gateway@^6.0.3: @@ -4729,9 +5005,9 @@ ee-first@1.1.1: resolved "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz" integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== -ejs@^3.1.8: +ejs@^3.1.9: version "3.1.9" - resolved "https://registry.npmjs.org/ejs/-/ejs-3.1.9.tgz" + resolved "https://registry.yarnpkg.com/ejs/-/ejs-3.1.9.tgz#03c9e8777fe12686a9effcef22303ca3d8eeb361" integrity sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ== dependencies: jake "^10.8.5" @@ -4817,6 +5093,14 @@ enhanced-resolve@^5.10.0: graceful-fs "^4.2.4" tapable "^2.2.0" +enhanced-resolve@^5.13.0: + version "5.13.0" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.13.0.tgz#26d1ecc448c02de997133217b5c1053f34a0a275" + integrity sha512-eyV8f0y1+bzyfh8xAwW/WTSZpLbjhqc4ne9eGSH4Zo2ejdyiNG9pU6mf9DG8a7+Auk6MFTlNOT4Y2y/9k8GKVg== + dependencies: + graceful-fs "^4.2.4" + tapable "^2.2.0" + enquirer@^2.3.6: version "2.3.6" resolved "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz" @@ -4940,6 +5224,11 @@ es-module-lexer@^0.9.0: resolved "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz" integrity sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ== +es-module-lexer@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-1.2.1.tgz#ba303831f63e6a394983fde2f97ad77b22324527" + integrity sha512-9978wrXM50Y4rTMmW5kXIC09ZdXQZqkE4mxhwkd8VbzsGkXGPgV4zWuqQJgCEzYngdo2dYDa0l8xhX4fkSwJSg== + es-set-tostringtag@^2.0.1: version "2.0.1" resolved "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz" @@ -4965,10 +5254,10 @@ es-to-primitive@^1.2.1: is-date-object "^1.0.1" is-symbol "^1.0.2" -es6-promisify@^6.0.0: - version "6.1.1" - resolved "https://registry.npmjs.org/es6-promisify/-/es6-promisify-6.1.1.tgz" - integrity sha512-HBL8I3mIki5C1Cc9QjKUenHtnG0A5/xA8Q/AllRcfiwl2CZFXGK7ddBiCoRwAix4i2KxcQfjtIVcrVbB3vbmwg== +es6-promisify@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/es6-promisify/-/es6-promisify-7.0.0.tgz#9a710008dd6a4ab75a89e280bad787bfb749927b" + integrity sha512-ginqzK3J90Rd4/Yz7qRrqUeIpe3TwSXTPPZtPne7tGBPeAaQiU8qt4fpKApnxHcq1AwtUdHVg5P77x/yrggG8Q== esbuild-wasm@0.17.8: version "0.17.8" @@ -5056,18 +5345,18 @@ eslint-module-utils@^2.7.4: dependencies: debug "^3.2.7" -eslint-plugin-deprecation@^1.3.2: +eslint-plugin-deprecation@^1.4.1: version "1.4.1" - resolved "https://registry.npmjs.org/eslint-plugin-deprecation/-/eslint-plugin-deprecation-1.4.1.tgz" + resolved "https://registry.yarnpkg.com/eslint-plugin-deprecation/-/eslint-plugin-deprecation-1.4.1.tgz#09a2889210955fd1a5c37703922c01724aba80eb" integrity sha512-4vxTghWzxsBukPJVQupi6xlTuDc8Pyi1QlRCrFiLgwLPMJQW3cJCNaehJUKQqQFvuue5m4W27e179Y3Qjzeghg== dependencies: "@typescript-eslint/utils" "^5.57.0" tslib "^2.3.1" tsutils "^3.21.0" -eslint-plugin-import@^2.25.4: +eslint-plugin-import@^2.27.5: version "2.27.5" - resolved "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.27.5.tgz" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.27.5.tgz#876a6d03f52608a3e5bb439c2550588e51dd6c65" integrity sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow== dependencies: array-includes "^3.1.6" @@ -5126,7 +5415,7 @@ eslint-scope@5.1.1, eslint-scope@^5.1.1: esrecurse "^4.3.0" estraverse "^4.1.1" -eslint-scope@^7.0.0, eslint-scope@^7.1.1: +eslint-scope@^7.0.0: version "7.1.1" resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz" integrity sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw== @@ -5134,6 +5423,14 @@ eslint-scope@^7.0.0, eslint-scope@^7.1.1: esrecurse "^4.3.0" estraverse "^5.2.0" +eslint-scope@^7.2.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.2.0.tgz#f21ebdafda02352f103634b96dd47d9f81ca117b" + integrity sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw== + dependencies: + esrecurse "^4.3.0" + estraverse "^5.2.0" + eslint-utils@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz" @@ -5151,15 +5448,15 @@ eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.0: resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.0.tgz" integrity sha512-HPpKPUBQcAsZOsHAFwTtIKcYlCje62XB7SEAcxjtmW6TD1WVpkS6i6/hOVtTZIl4zGj/mBqpFVGvaDneik+VoQ== -eslint@^8.28.0: - version "8.38.0" - resolved "https://registry.npmjs.org/eslint/-/eslint-8.38.0.tgz" - integrity sha512-pIdsD2jwlUGf/U38Jv97t8lq6HpaU/G9NKbYmpWpZGw3LdTNhZLbJePqxOXGB5+JEKfOPU/XLxYxFh03nr1KTg== +eslint@^8.39.0: + version "8.39.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.39.0.tgz#7fd20a295ef92d43809e914b70c39fd5a23cf3f1" + integrity sha512-mwiok6cy7KTW7rBpo05k6+p4YVZByLNjAZ/ACB9DRCu4YDRwjXI01tWHp6KAUWelsBetTxKK/2sHB0vdS8Z2Og== dependencies: "@eslint-community/eslint-utils" "^4.2.0" "@eslint-community/regexpp" "^4.4.0" "@eslint/eslintrc" "^2.0.2" - "@eslint/js" "8.38.0" + "@eslint/js" "8.39.0" "@humanwhocodes/config-array" "^0.11.8" "@humanwhocodes/module-importer" "^1.0.1" "@nodelib/fs.walk" "^1.2.8" @@ -5169,7 +5466,7 @@ eslint@^8.28.0: debug "^4.3.2" doctrine "^3.0.0" escape-string-regexp "^4.0.0" - eslint-scope "^7.1.1" + eslint-scope "^7.2.0" eslint-visitor-keys "^3.4.0" espree "^9.5.1" esquery "^1.4.2" @@ -5312,14 +5609,14 @@ express-rate-limit@^5.1.3: resolved "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-5.5.1.tgz" integrity sha512-MTjE2eIbHv5DyfuFz4zLYWxpqVhEhkTiwFGuB74Q9CSou2WHO52nlE5y3Zlg6SIsiYUIPj6ifFxnkPz6O3sIUg== -express-static-gzip@^2.1.5: +express-static-gzip@^2.1.7: version "2.1.7" - resolved "https://registry.npmjs.org/express-static-gzip/-/express-static-gzip-2.1.7.tgz" + resolved "https://registry.yarnpkg.com/express-static-gzip/-/express-static-gzip-2.1.7.tgz#5904824a07950ba741ec3a23a21839dd04c63506" integrity sha512-QOCZUC+lhPPCjIJKpQGu1Oa61Axg9Mq09Qvit8Of7kzpMuwDeMSqjjQteQS3OVw/GkENBoSBheuQDWPlngImvw== dependencies: serve-static "^1.14.1" -express@^4.17.1, express@^4.17.3, express@^4.18.2: +express@^4.17.3, express@^4.18.2: version "4.18.2" resolved "https://registry.npmjs.org/express/-/express-4.18.2.tgz" integrity sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ== @@ -5402,9 +5699,9 @@ fast-glob@^3.2.11, fast-glob@^3.2.4, fast-glob@^3.2.9: merge2 "^1.3.0" micromatch "^4.0.4" -fast-json-patch@^3.0.0-1: +fast-json-patch@^3.1.1: version "3.1.1" - resolved "https://registry.npmjs.org/fast-json-patch/-/fast-json-patch-3.1.1.tgz" + resolved "https://registry.yarnpkg.com/fast-json-patch/-/fast-json-patch-3.1.1.tgz#85064ea1b1ebf97a3f7ad01e23f9337e72c66947" integrity sha512-vf6IHUX2SBcA+5/+4883dsIjpBTqmfBjmYiWK1savxQmFk4JfBMLa7ynTYOs1Rolp/T1betJxHiGD3g1Mn8lUQ== fast-json-stable-stringify@2.1.0, fast-json-stable-stringify@^2.0.0: @@ -6743,10 +7040,10 @@ isbinaryfile@^4.0.8: resolved "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.10.tgz" integrity sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw== -isbot@^3.6.5: - version "3.6.8" - resolved "https://registry.npmjs.org/isbot/-/isbot-3.6.8.tgz" - integrity sha512-V8XUXN0/UYxfgrui4o38pmOve2eO/1KjluxR1G8Qnu5gqlUiNrvtX06t1W5n8vFtrtKfHj96iFYuPL39jXUe8g== +isbot@^3.6.10: + version "3.6.10" + resolved "https://registry.yarnpkg.com/isbot/-/isbot-3.6.10.tgz#7b66334e81794f0461794debb567975cf08eaf2b" + integrity sha512-+I+2998oyP4oW9+OTQD8TS1r9P6wv10yejukj+Ksj3+UR5pUhsZN3f8W7ysq0p1qxpOVNbl5mCuv0bCaF8y5iQ== isexe@^2.0.0: version "2.0.0" @@ -7008,7 +7305,7 @@ json5@^1.0.2: dependencies: minimist "^1.2.0" -json5@^2.1.2, json5@^2.2.1, json5@^2.2.2: +json5@^2.1.2, json5@^2.2.1, json5@^2.2.2, json5@^2.2.3: version "2.2.3" resolved "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz" integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== @@ -7051,10 +7348,10 @@ jsonparse@^1.3.1: resolved "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz" integrity sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg== -jsonschema@1.4.0: - version "1.4.0" - resolved "https://registry.npmjs.org/jsonschema/-/jsonschema-1.4.0.tgz" - integrity sha512-/YgW6pRMr6M7C+4o8kS+B/2myEpHCrxO4PEWnqJNBFMjn7EWXqlQ4tGwL6xTHeRplwuZmcAncdvfOad1nT2yMw== +jsonschema@1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/jsonschema/-/jsonschema-1.4.1.tgz#cc4c3f0077fb4542982973d8a083b6b34f482dab" + integrity sha512-S6cATIPVv1z0IlxdN+zUk5EPjkGCdnhN4wVSBlvoUO1tOLJootbo9CquNJmbIh4yikWHiUedhRYrNPn1arpEmQ== jsprim@^1.2.2: version "1.4.2" @@ -7169,16 +7466,16 @@ jwt-decode@^3.1.2: resolved "https://registry.npmjs.org/jwt-decode/-/jwt-decode-3.1.2.tgz" integrity sha512-UfpWE/VZn0iP50d8cz9NrZLM9lSWhcJ+0Gt/nm4by88UL+J1SiKN8/5dkjMmbEzwL2CAe+67GsegCbIKtbp75A== -karma-chrome-launcher@~3.1.0: - version "3.1.1" - resolved "https://registry.npmjs.org/karma-chrome-launcher/-/karma-chrome-launcher-3.1.1.tgz" - integrity sha512-hsIglcq1vtboGPAN+DGCISCFOxW+ZVnIqhDQcCMqqCp+4dmJ0Qpq5QAjkbA0X2L9Mi6OBkHi2Srrbmm7pUKkzQ== +karma-chrome-launcher@~3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/karma-chrome-launcher/-/karma-chrome-launcher-3.2.0.tgz#eb9c95024f2d6dfbb3748d3415ac9b381906b9a9" + integrity sha512-rE9RkUPI7I9mAxByQWkGJFXfFD6lE4gC5nPuZdobf/QdTEJI6EU4yIay/cfU/xV4ZxlM5JiTv7zWYgA64NpS5Q== dependencies: which "^1.2.1" -karma-coverage-istanbul-reporter@~3.0.2: +karma-coverage-istanbul-reporter@~3.0.3: version "3.0.3" - resolved "https://registry.npmjs.org/karma-coverage-istanbul-reporter/-/karma-coverage-istanbul-reporter-3.0.3.tgz" + resolved "https://registry.yarnpkg.com/karma-coverage-istanbul-reporter/-/karma-coverage-istanbul-reporter-3.0.3.tgz#f3b5303553aadc8e681d40d360dfdc19bc7e9fe9" integrity sha512-wE4VFhG/QZv2Y4CdAYWDbMmcAHeS926ZIji4z+FkB2aF/EposRb6DP6G5ncT/wXhqUfAb/d7kZrNKPonbvsATw== dependencies: istanbul-lib-coverage "^3.0.0" @@ -7215,10 +7512,10 @@ karma-source-map-support@1.4.0: dependencies: source-map-support "^0.5.5" -karma@^6.3.14: - version "6.4.1" - resolved "https://registry.npmjs.org/karma/-/karma-6.4.1.tgz" - integrity sha512-Cj57NKOskK7wtFWSlMvZf459iX+kpYIPXmkNUzP2WAFcA7nhr/ALn5R7sw3w+1udFDcpMx/tuB8d5amgm3ijaA== +karma@^6.4.2: + version "6.4.2" + resolved "https://registry.yarnpkg.com/karma/-/karma-6.4.2.tgz#a983f874cee6f35990c4b2dcc3d274653714de8e" + integrity sha512-C6SU/53LB31BEgRg+omznBEMY4SjHU3ricV6zBcAe1EeILKkeScr+fZXtaI5WyDbkVowJxxAI6h73NcFPmXolQ== dependencies: "@colors/colors" "1.5.0" body-parser "^1.19.0" @@ -7585,9 +7882,9 @@ manifesto.js@^4.2.0: isomorphic-unfetch "^3.0.0" lodash "^4.17.21" -markdown-it-mathjax3@^4.3.1: +markdown-it-mathjax3@^4.3.2: version "4.3.2" - resolved "https://registry.npmjs.org/markdown-it-mathjax3/-/markdown-it-mathjax3-4.3.2.tgz" + resolved "https://registry.yarnpkg.com/markdown-it-mathjax3/-/markdown-it-mathjax3-4.3.2.tgz#1e34aa86f8560b283fd283008334adc2d6b05a37" integrity sha512-TX3GW5NjmupgFtMJGRauioMbbkGsOXAAt1DZ/rzzYmTHqzkO1rNAdiMD4NiruurToPApn2kYy76x02QN26qr2w== dependencies: juice "^8.0.0" @@ -7614,9 +7911,9 @@ mathjax-full@^3.2.0: mj-context-menu "^0.6.1" speech-rule-engine "^4.0.6" -md5@^2.2.1: +md5@^2.3.0: version "2.3.0" - resolved "https://registry.npmjs.org/md5/-/md5-2.3.0.tgz" + resolved "https://registry.yarnpkg.com/md5/-/md5-2.3.0.tgz#c3da9a6aae3a30b46b7b0c349b87b110dc3bda4f" integrity sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g== dependencies: charenc "0.0.2" @@ -7755,7 +8052,7 @@ minimatch@^8.0.2, minimatch@^8.0.3: dependencies: brace-expansion "^2.0.1" -minimist@^1.2.0, minimist@^1.2.5, minimist@^1.2.6: +minimist@^1.2.0, minimist@^1.2.5, minimist@^1.2.6, minimist@^1.2.8: version "1.2.8" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== @@ -7968,7 +8265,7 @@ mute-stream@0.0.8: resolved "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz" integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== -nanoid@^3.3.4: +nanoid@^3.3.4, nanoid@^3.3.6: version "3.3.6" resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz" integrity sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA== @@ -8105,9 +8402,9 @@ node-releases@^2.0.8: resolved "https://registry.npmjs.org/node-releases/-/node-releases-2.0.10.tgz" integrity sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w== -nodemon@^2.0.20: +nodemon@^2.0.22: version "2.0.22" - resolved "https://registry.npmjs.org/nodemon/-/nodemon-2.0.22.tgz" + resolved "https://registry.yarnpkg.com/nodemon/-/nodemon-2.0.22.tgz#182c45c3a78da486f673d6c1702e00728daf5258" integrity sha512-B8YqaKMmyuCO7BowF1Z1/mkPqLk6cs/l63Ojtd6otKjMx47Dq1utxfRxcavH1I7VSaL8n5BUaoutadnsX3AAVQ== dependencies: chokidar "^3.5.2" @@ -8422,9 +8719,9 @@ ora@5.4.1, ora@^5.1.0, ora@^5.4.1: strip-ansi "^6.0.0" wcwidth "^1.0.1" -os-tmpdir@^1.0.1, os-tmpdir@~1.0.2: +os-tmpdir@^1.0.2, os-tmpdir@~1.0.2: version "1.0.2" - resolved "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz" + resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" integrity sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g== ospath@^1.2.2: @@ -8619,14 +8916,14 @@ path-type@^4.0.0: resolved "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz" integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== -pem@1.14.4: - version "1.14.4" - resolved "https://registry.npmjs.org/pem/-/pem-1.14.4.tgz" - integrity sha512-v8lH3NpirgiEmbOqhx0vwQTxwi0ExsiWBGYh0jYNq7K6mQuO4gI6UEFlr6fLAdv9TPXRt6GqiwE37puQdIDS8g== +pem@1.14.7: + version "1.14.7" + resolved "https://registry.yarnpkg.com/pem/-/pem-1.14.7.tgz#dae9831ee5fa7c88547327fb7738898cd76412c6" + integrity sha512-tN5+bp2/Yh/2yuv/JFXXHXrd5RVfsEBwlV7BshuYPX0OJWbR/MeAr89CKWcIp/W0cEnaTPT44haXyaEz1T6XeA== dependencies: - es6-promisify "^6.0.0" - md5 "^2.2.1" - os-tmpdir "^1.0.1" + es6-promisify "^7.0.0" + md5 "^2.3.0" + os-tmpdir "^1.0.2" which "^2.0.2" pend@~1.2.0: @@ -9030,7 +9327,7 @@ postcss-value-parser@^4.0.0, postcss-value-parser@^4.1.0, postcss-value-parser@^ resolved "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz" integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== -postcss@8.4.21, postcss@^8.1, postcss@^8.2.14, postcss@^8.3.11, postcss@^8.3.7, postcss@^8.4.19: +postcss@8.4.21, postcss@^8.2.14, postcss@^8.3.11, postcss@^8.3.7, postcss@^8.4.19: version "8.4.21" resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.21.tgz" integrity sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg== @@ -9056,6 +9353,15 @@ postcss@^7.0.14: picocolors "^0.2.1" source-map "^0.6.1" +postcss@^8.4: + version "8.4.23" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.23.tgz#df0aee9ac7c5e53e1075c24a3613496f9e6552ab" + integrity sha512-bQ3qMcpF6A/YjR55xtoTr0jGOlnPOKAIMdOWiv0EIT6HVPEaJiJB4NLljSbiHoC2RX7DN5Uvjtpbg1NPdwv1oA== + dependencies: + nanoid "^3.3.6" + picocolors "^1.0.0" + source-map-js "^1.0.2" + prelude-ls@^1.2.1: version "1.2.1" resolved "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz" @@ -9250,7 +9556,7 @@ react-beautiful-dnd@^13.0.0: redux "^4.0.4" use-memo-one "^1.1.1" -react-copy-to-clipboard@^5.0.1: +react-copy-to-clipboard@^5.0.1, react-copy-to-clipboard@^5.1.0: version "5.1.0" resolved "https://registry.npmjs.org/react-copy-to-clipboard/-/react-copy-to-clipboard-5.1.0.tgz" integrity sha512-k61RsNgAayIJNoy9yDsYzDe/yAZAzEbEgcz3DZMhF686LEyukcE1hzurxe85JandPUG+yTfGVFzuEw3xt8WP/A== @@ -9783,9 +10089,9 @@ rxjs@6.6.7, rxjs@^6.5.5, rxjs@~6.6.0: dependencies: tslib "^1.9.0" -rxjs@^7.5.1, rxjs@^7.5.5: +rxjs@^7.5.1, rxjs@^7.5.5, rxjs@^7.8.0: version "7.8.0" - resolved "https://registry.npmjs.org/rxjs/-/rxjs-7.8.0.tgz" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.8.0.tgz#90a938862a82888ff4c7359811a595e14e1e09a4" integrity sha512-F2+gxDshqmIub1KdvZkaEfGDwLNpPvk9Fs6LD/MyQxNgMds/WH9OdDDXOmxUZpME+iSK3rQCctkL0DYyytUqMg== dependencies: tslib "^2.1.0" @@ -9814,9 +10120,9 @@ safe-regex-test@^1.0.0: resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== -sanitize-html@^2.7.2: +sanitize-html@^2.10.0: version "2.10.0" - resolved "https://registry.npmjs.org/sanitize-html/-/sanitize-html-2.10.0.tgz" + resolved "https://registry.yarnpkg.com/sanitize-html/-/sanitize-html-2.10.0.tgz#74d28848dfcf72c39693139131895c78900ab452" integrity sha512-JqdovUd81dG4k87vZt6uA6YhDfWkUGruUu/aPmXLxXi45gZExnt9Bnw/qeQU8oGf82vPyaE0vO4aH0PbobB9JQ== dependencies: deepmerge "^4.2.2" @@ -9842,9 +10148,9 @@ sass-loader@^12.6.0: klona "^2.0.4" neo-async "^2.6.2" -sass-resources-loader@^2.1.1: +sass-resources-loader@^2.2.5: version "2.2.5" - resolved "https://registry.npmjs.org/sass-resources-loader/-/sass-resources-loader-2.2.5.tgz" + resolved "https://registry.yarnpkg.com/sass-resources-loader/-/sass-resources-loader-2.2.5.tgz#75131cdb26bae51fcffc007d8155d57b5e825ca7" integrity sha512-po8rfETH9cOQACWxubT/1CCu77KjxwRtCDm6QAXZH99aUHBydwSoxdIjC40SGp/dcS/FkSNJl0j1VEojGZqlvQ== dependencies: async "^3.2.3" @@ -9861,12 +10167,14 @@ sass@1.58.1: immutable "^4.0.0" source-map-js ">=0.6.2 <2.0.0" -sass@~1.33.0: - version "1.33.0" - resolved "https://registry.npmjs.org/sass/-/sass-1.33.0.tgz" - integrity sha512-9v0MUXnSi62FtfjqcwZ+b8B9FIxdwFEb3FPUkjEPXWd0b5KcnPGSp2XF9WrzcH1ZxedfgJVTdA3A1j4eEj53xg== +sass@~1.62.0: + version "1.62.0" + resolved "https://registry.yarnpkg.com/sass/-/sass-1.62.0.tgz#3686b2195b93295d20765135e562366b33ece37d" + integrity sha512-Q4USplo4pLYgCi+XlipZCWUQz5pkg/ruSSgJ0WRDSb/+3z9tXUOkQ7QPYn4XrhZKYAK4HlpaQecRwKLJX6+DBg== dependencies: chokidar ">=3.0.0 <4.0.0" + immutable "^4.0.0" + source-map-js ">=0.6.2 <2.0.0" sax@>=0.6.0, sax@^1.2.4: version "1.2.4" @@ -9904,6 +10212,15 @@ schema-utils@^3.0.0, schema-utils@^3.1.0, schema-utils@^3.1.1: ajv "^6.12.5" ajv-keywords "^3.5.2" +schema-utils@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.1.2.tgz#36c10abca6f7577aeae136c804b0c741edeadc99" + integrity sha512-pvjEHOgWc9OWA/f/DE3ohBWTD6EleVLf7iFUkoSwAxttdBhB9QUebQgxER2kWueOvRJXPHNnyrvvh9eZINB8Eg== + dependencies: + "@types/json-schema" "^7.0.8" + ajv "^6.12.5" + ajv-keywords "^3.5.2" + schema-utils@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz" @@ -10234,10 +10551,10 @@ socks@^2.6.2: ip "^2.0.0" smart-buffer "^4.2.0" -sortablejs@1.13.0: - version "1.13.0" - resolved "https://registry.npmjs.org/sortablejs/-/sortablejs-1.13.0.tgz" - integrity sha512-RBJirPY0spWCrU5yCmWM1eFs/XgX2J5c6b275/YyxFRgnzPhKl/TDeU2hNR8Dt7ITq66NRPM4UlOt+e5O4CFHg== +sortablejs@1.15.0: + version "1.15.0" + resolved "https://registry.yarnpkg.com/sortablejs/-/sortablejs-1.15.0.tgz#53230b8aa3502bb77a29e2005808ffdb4a5f7e2a" + integrity sha512-bv9qgVMjUMf89wAvM6AxVvS/4MX3sPeN0+agqShejLU5z5GX4C75ow1O2e5k4L6XItUyAK3gH6AxSbXrOM5e8w== source-list-map@^2.0.0: version "2.0.1" @@ -10591,7 +10908,7 @@ tar@^6.0.2, tar@^6.1.11, tar@^6.1.2: mkdirp "^1.0.3" yallist "^4.0.0" -terser-webpack-plugin@^5.1.3: +terser-webpack-plugin@^5.1.3, terser-webpack-plugin@^5.3.7: version "5.3.7" resolved "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.7.tgz" integrity sha512-AfKwIktyP7Cu50xNjXF/6Qb5lBNzYaWpU6YfoX3uZicTx0zTy0stDDCsvjDapKsSDvOeWo5MEq4TmdBy2cNoHw== @@ -11235,9 +11552,9 @@ webidl-conversions@^7.0.0: resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz" integrity sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g== -webpack-bundle-analyzer@^4.4.0: +webpack-bundle-analyzer@^4.8.0: version "4.8.0" - resolved "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.8.0.tgz" + resolved "https://registry.yarnpkg.com/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.8.0.tgz#951b8aaf491f665d2ae325d8b84da229157b1d04" integrity sha512-ZzoSBePshOKhr+hd8u6oCkZVwpVaXgpw23ScGLFpR6SjYI7+7iIWYarjN6OEYOfRt8o7ZyZZQk0DuMizJ+LEIg== dependencies: "@discoveryjs/json-ext" "0.5.7" @@ -11326,10 +11643,10 @@ webpack-dev-server@4.11.1: webpack-dev-middleware "^5.3.1" ws "^8.4.2" -webpack-dev-server@^4.5.0: - version "4.13.2" - resolved "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.13.2.tgz" - integrity sha512-5i6TrGBRxG4vnfDpB6qSQGfnB6skGBXNL5/542w2uRGLimX6qeE5BQMLrzIC3JYV/xlGOv+s+hTleI9AZKUQNw== +webpack-dev-server@^4.13.3: + version "4.13.3" + resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-4.13.3.tgz#9feb740b8b56b886260bae1360286818a221bae8" + integrity sha512-KqqzrzMRSRy5ePz10VhjyL27K2dxqwXQLP5rAKwRJBPUahe7Z2bBWzHw37jeb8GCPKxZRO79ZdQUAPesMh/Nug== dependencies: "@types/bonjour" "^3.5.9" "@types/connect-history-api-fallback" "^1.3.5" @@ -11420,22 +11737,22 @@ webpack@5.76.1: watchpack "^2.4.0" webpack-sources "^3.2.3" -webpack@^5.76.0: - version "5.78.0" - resolved "https://registry.npmjs.org/webpack/-/webpack-5.78.0.tgz" - integrity sha512-gT5DP72KInmE/3azEaQrISjTvLYlSM0j1Ezhht/KLVkrqtv10JoP/RXhwmX/frrutOPuSq3o5Vq0ehR/4Vmd1g== +webpack@^5.80.0: + version "5.80.0" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.80.0.tgz#3e660b4ab572be38c5e954bdaae7e2bf76010fdc" + integrity sha512-OIMiq37XK1rWO8mH9ssfFKZsXg4n6klTEDL7S8/HqbAOBBaiy8ABvXvz0dDCXeEF9gqwxSvVk611zFPjS8hJxA== dependencies: "@types/eslint-scope" "^3.7.3" - "@types/estree" "^0.0.51" - "@webassemblyjs/ast" "1.11.1" - "@webassemblyjs/wasm-edit" "1.11.1" - "@webassemblyjs/wasm-parser" "1.11.1" + "@types/estree" "^1.0.0" + "@webassemblyjs/ast" "^1.11.5" + "@webassemblyjs/wasm-edit" "^1.11.5" + "@webassemblyjs/wasm-parser" "^1.11.5" acorn "^8.7.1" acorn-import-assertions "^1.7.6" browserslist "^4.14.5" chrome-trace-event "^1.0.2" - enhanced-resolve "^5.10.0" - es-module-lexer "^0.9.0" + enhanced-resolve "^5.13.0" + es-module-lexer "^1.2.1" eslint-scope "5.1.1" events "^3.2.0" glob-to-regexp "^0.4.1" @@ -11444,9 +11761,9 @@ webpack@^5.76.0: loader-runner "^4.2.0" mime-types "^2.1.27" neo-async "^2.6.2" - schema-utils "^3.1.0" + schema-utils "^3.1.2" tapable "^2.1.1" - terser-webpack-plugin "^5.1.3" + terser-webpack-plugin "^5.3.7" watchpack "^2.4.0" webpack-sources "^3.2.3" From 18e7de81d9a621d6e326555bb1d92edd4fc7cb0b Mon Sep 17 00:00:00 2001 From: Kristof De Langhe Date: Tue, 25 Apr 2023 15:51:41 +0200 Subject: [PATCH 108/409] 101108: Removal of webpack devDependency to solve conflict with @angular-devkit/build-angular --- package.json | 3 +- yarn.lock | 180 +-------------------------------------------------- 2 files changed, 2 insertions(+), 181 deletions(-) diff --git a/package.json b/package.json index 6dc675de2d..2118237c77 100644 --- a/package.json +++ b/package.json @@ -199,9 +199,8 @@ "sass-resources-loader": "^2.2.5", "ts-node": "^8.10.2", "typescript": "~4.8.4", - "webpack": "^5.80.0", "webpack-bundle-analyzer": "^4.8.0", "webpack-cli": "^4.2.0", "webpack-dev-server": "^4.13.3" } -} \ No newline at end of file +} diff --git a/yarn.lock b/yarn.lock index a2de44cdb9..563ec741c2 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2388,11 +2388,6 @@ resolved "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz" integrity sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ== -"@types/estree@^1.0.0": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.1.tgz#aa22750962f3bf0e79d753d3cc067f010c95f194" - integrity sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA== - "@types/express-serve-static-core@*", "@types/express-serve-static-core@^4.17.33": version "4.17.33" resolved "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.33.tgz" @@ -2784,44 +2779,21 @@ "@webassemblyjs/helper-numbers" "1.11.1" "@webassemblyjs/helper-wasm-bytecode" "1.11.1" -"@webassemblyjs/ast@1.11.5", "@webassemblyjs/ast@^1.11.5": - version "1.11.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.11.5.tgz#6e818036b94548c1fb53b754b5cae3c9b208281c" - integrity sha512-LHY/GSAZZRpsNQH+/oHqhRQ5FT7eoULcBqgfyTB5nQHogFnK3/7QoN7dLnwSE/JkUAF0SrRuclT7ODqMFtWxxQ== - dependencies: - "@webassemblyjs/helper-numbers" "1.11.5" - "@webassemblyjs/helper-wasm-bytecode" "1.11.5" - "@webassemblyjs/floating-point-hex-parser@1.11.1": version "1.11.1" resolved "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz" integrity sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ== -"@webassemblyjs/floating-point-hex-parser@1.11.5": - version "1.11.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.5.tgz#e85dfdb01cad16b812ff166b96806c050555f1b4" - integrity sha512-1j1zTIC5EZOtCplMBG/IEwLtUojtwFVwdyVMbL/hwWqbzlQoJsWCOavrdnLkemwNoC/EOwtUFch3fuo+cbcXYQ== - "@webassemblyjs/helper-api-error@1.11.1": version "1.11.1" resolved "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz" integrity sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg== -"@webassemblyjs/helper-api-error@1.11.5": - version "1.11.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.5.tgz#1e82fa7958c681ddcf4eabef756ce09d49d442d1" - integrity sha512-L65bDPmfpY0+yFrsgz8b6LhXmbbs38OnwDCf6NpnMUYqa+ENfE5Dq9E42ny0qz/PdR0LJyq/T5YijPnU8AXEpA== - "@webassemblyjs/helper-buffer@1.11.1": version "1.11.1" resolved "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz" integrity sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA== -"@webassemblyjs/helper-buffer@1.11.5": - version "1.11.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.5.tgz#91381652ea95bb38bbfd270702351c0c89d69fba" - integrity sha512-fDKo1gstwFFSfacIeH5KfwzjykIE6ldh1iH9Y/8YkAZrhmu4TctqYjSh7t0K2VyDSXOZJ1MLhht/k9IvYGcIxg== - "@webassemblyjs/helper-numbers@1.11.1": version "1.11.1" resolved "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz" @@ -2831,25 +2803,11 @@ "@webassemblyjs/helper-api-error" "1.11.1" "@xtuc/long" "4.2.2" -"@webassemblyjs/helper-numbers@1.11.5": - version "1.11.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.5.tgz#23380c910d56764957292839006fecbe05e135a9" - integrity sha512-DhykHXM0ZABqfIGYNv93A5KKDw/+ywBFnuWybZZWcuzWHfbp21wUfRkbtz7dMGwGgT4iXjWuhRMA2Mzod6W4WA== - dependencies: - "@webassemblyjs/floating-point-hex-parser" "1.11.5" - "@webassemblyjs/helper-api-error" "1.11.5" - "@xtuc/long" "4.2.2" - "@webassemblyjs/helper-wasm-bytecode@1.11.1": version "1.11.1" resolved "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz" integrity sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q== -"@webassemblyjs/helper-wasm-bytecode@1.11.5": - version "1.11.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.5.tgz#e258a25251bc69a52ef817da3001863cc1c24b9f" - integrity sha512-oC4Qa0bNcqnjAowFn7MPCETQgDYytpsfvz4ujZz63Zu/a/v71HeCAAmZsgZ3YVKec3zSPYytG3/PrRCqbtcAvA== - "@webassemblyjs/helper-wasm-section@1.11.1": version "1.11.1" resolved "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz" @@ -2860,16 +2818,6 @@ "@webassemblyjs/helper-wasm-bytecode" "1.11.1" "@webassemblyjs/wasm-gen" "1.11.1" -"@webassemblyjs/helper-wasm-section@1.11.5": - version "1.11.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.5.tgz#966e855a6fae04d5570ad4ec87fbcf29b42ba78e" - integrity sha512-uEoThA1LN2NA+K3B9wDo3yKlBfVtC6rh0i4/6hvbz071E8gTNZD/pT0MsBf7MeD6KbApMSkaAK0XeKyOZC7CIA== - dependencies: - "@webassemblyjs/ast" "1.11.5" - "@webassemblyjs/helper-buffer" "1.11.5" - "@webassemblyjs/helper-wasm-bytecode" "1.11.5" - "@webassemblyjs/wasm-gen" "1.11.5" - "@webassemblyjs/ieee754@1.11.1": version "1.11.1" resolved "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz" @@ -2877,13 +2825,6 @@ dependencies: "@xtuc/ieee754" "^1.2.0" -"@webassemblyjs/ieee754@1.11.5": - version "1.11.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.11.5.tgz#b2db1b33ce9c91e34236194c2b5cba9b25ca9d60" - integrity sha512-37aGq6qVL8A8oPbPrSGMBcp38YZFXcHfiROflJn9jxSdSMMM5dS5P/9e2/TpaJuhE+wFrbukN2WI6Hw9MH5acg== - dependencies: - "@xtuc/ieee754" "^1.2.0" - "@webassemblyjs/leb128@1.11.1": version "1.11.1" resolved "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz" @@ -2891,23 +2832,11 @@ dependencies: "@xtuc/long" "4.2.2" -"@webassemblyjs/leb128@1.11.5": - version "1.11.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.11.5.tgz#482e44d26b6b949edf042a8525a66c649e38935a" - integrity sha512-ajqrRSXaTJoPW+xmkfYN6l8VIeNnR4vBOTQO9HzR7IygoCcKWkICbKFbVTNMjMgMREqXEr0+2M6zukzM47ZUfQ== - dependencies: - "@xtuc/long" "4.2.2" - "@webassemblyjs/utf8@1.11.1": version "1.11.1" resolved "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz" integrity sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ== -"@webassemblyjs/utf8@1.11.5": - version "1.11.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.11.5.tgz#83bef94856e399f3740e8df9f63bc47a987eae1a" - integrity sha512-WiOhulHKTZU5UPlRl53gHR8OxdGsSOxqfpqWeA2FmcwBMaoEdz6b2x2si3IwC9/fSPLfe8pBMRTHVMk5nlwnFQ== - "@webassemblyjs/wasm-edit@1.11.1": version "1.11.1" resolved "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz" @@ -2922,20 +2851,6 @@ "@webassemblyjs/wasm-parser" "1.11.1" "@webassemblyjs/wast-printer" "1.11.1" -"@webassemblyjs/wasm-edit@^1.11.5": - version "1.11.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.5.tgz#93ee10a08037657e21c70de31c47fdad6b522b2d" - integrity sha512-C0p9D2fAu3Twwqvygvf42iGCQ4av8MFBLiTb+08SZ4cEdwzWx9QeAHDo1E2k+9s/0w1DM40oflJOpkZ8jW4HCQ== - dependencies: - "@webassemblyjs/ast" "1.11.5" - "@webassemblyjs/helper-buffer" "1.11.5" - "@webassemblyjs/helper-wasm-bytecode" "1.11.5" - "@webassemblyjs/helper-wasm-section" "1.11.5" - "@webassemblyjs/wasm-gen" "1.11.5" - "@webassemblyjs/wasm-opt" "1.11.5" - "@webassemblyjs/wasm-parser" "1.11.5" - "@webassemblyjs/wast-printer" "1.11.5" - "@webassemblyjs/wasm-gen@1.11.1": version "1.11.1" resolved "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz" @@ -2947,17 +2862,6 @@ "@webassemblyjs/leb128" "1.11.1" "@webassemblyjs/utf8" "1.11.1" -"@webassemblyjs/wasm-gen@1.11.5": - version "1.11.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.5.tgz#ceb1c82b40bf0cf67a492c53381916756ef7f0b1" - integrity sha512-14vteRlRjxLK9eSyYFvw1K8Vv+iPdZU0Aebk3j6oB8TQiQYuO6hj9s4d7qf6f2HJr2khzvNldAFG13CgdkAIfA== - dependencies: - "@webassemblyjs/ast" "1.11.5" - "@webassemblyjs/helper-wasm-bytecode" "1.11.5" - "@webassemblyjs/ieee754" "1.11.5" - "@webassemblyjs/leb128" "1.11.5" - "@webassemblyjs/utf8" "1.11.5" - "@webassemblyjs/wasm-opt@1.11.1": version "1.11.1" resolved "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz" @@ -2968,16 +2872,6 @@ "@webassemblyjs/wasm-gen" "1.11.1" "@webassemblyjs/wasm-parser" "1.11.1" -"@webassemblyjs/wasm-opt@1.11.5": - version "1.11.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.5.tgz#b52bac29681fa62487e16d3bb7f0633d5e62ca0a" - integrity sha512-tcKwlIXstBQgbKy1MlbDMlXaxpucn42eb17H29rawYLxm5+MsEmgPzeCP8B1Cl69hCice8LeKgZpRUAPtqYPgw== - dependencies: - "@webassemblyjs/ast" "1.11.5" - "@webassemblyjs/helper-buffer" "1.11.5" - "@webassemblyjs/wasm-gen" "1.11.5" - "@webassemblyjs/wasm-parser" "1.11.5" - "@webassemblyjs/wasm-parser@1.11.1": version "1.11.1" resolved "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz" @@ -2990,18 +2884,6 @@ "@webassemblyjs/leb128" "1.11.1" "@webassemblyjs/utf8" "1.11.1" -"@webassemblyjs/wasm-parser@1.11.5", "@webassemblyjs/wasm-parser@^1.11.5": - version "1.11.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.5.tgz#7ba0697ca74c860ea13e3ba226b29617046982e2" - integrity sha512-SVXUIwsLQlc8srSD7jejsfTU83g7pIGr2YYNb9oHdtldSxaOhvA5xwvIiWIfcX8PlSakgqMXsLpLfbbJ4cBYew== - dependencies: - "@webassemblyjs/ast" "1.11.5" - "@webassemblyjs/helper-api-error" "1.11.5" - "@webassemblyjs/helper-wasm-bytecode" "1.11.5" - "@webassemblyjs/ieee754" "1.11.5" - "@webassemblyjs/leb128" "1.11.5" - "@webassemblyjs/utf8" "1.11.5" - "@webassemblyjs/wast-printer@1.11.1": version "1.11.1" resolved "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz" @@ -3010,14 +2892,6 @@ "@webassemblyjs/ast" "1.11.1" "@xtuc/long" "4.2.2" -"@webassemblyjs/wast-printer@1.11.5": - version "1.11.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.11.5.tgz#7a5e9689043f3eca82d544d7be7a8e6373a6fa98" - integrity sha512-f7Pq3wvg3GSPUPzR0F6bmI89Hdb+u9WXrSKc4v+N0aV0q6r42WoF92Jp2jEorBEBRoRNXgjp53nBniDXcqZYPA== - dependencies: - "@webassemblyjs/ast" "1.11.5" - "@xtuc/long" "4.2.2" - "@webpack-cli/configtest@^1.2.0": version "1.2.0" resolved "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.2.0.tgz" @@ -5093,14 +4967,6 @@ enhanced-resolve@^5.10.0: graceful-fs "^4.2.4" tapable "^2.2.0" -enhanced-resolve@^5.13.0: - version "5.13.0" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.13.0.tgz#26d1ecc448c02de997133217b5c1053f34a0a275" - integrity sha512-eyV8f0y1+bzyfh8xAwW/WTSZpLbjhqc4ne9eGSH4Zo2ejdyiNG9pU6mf9DG8a7+Auk6MFTlNOT4Y2y/9k8GKVg== - dependencies: - graceful-fs "^4.2.4" - tapable "^2.2.0" - enquirer@^2.3.6: version "2.3.6" resolved "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz" @@ -5224,11 +5090,6 @@ es-module-lexer@^0.9.0: resolved "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz" integrity sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ== -es-module-lexer@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-1.2.1.tgz#ba303831f63e6a394983fde2f97ad77b22324527" - integrity sha512-9978wrXM50Y4rTMmW5kXIC09ZdXQZqkE4mxhwkd8VbzsGkXGPgV4zWuqQJgCEzYngdo2dYDa0l8xhX4fkSwJSg== - es-set-tostringtag@^2.0.1: version "2.0.1" resolved "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz" @@ -10231,15 +10092,6 @@ schema-utils@^3.0.0, schema-utils@^3.1.0, schema-utils@^3.1.1: ajv "^6.12.5" ajv-keywords "^3.5.2" -schema-utils@^3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.1.2.tgz#36c10abca6f7577aeae136c804b0c741edeadc99" - integrity sha512-pvjEHOgWc9OWA/f/DE3ohBWTD6EleVLf7iFUkoSwAxttdBhB9QUebQgxER2kWueOvRJXPHNnyrvvh9eZINB8Eg== - dependencies: - "@types/json-schema" "^7.0.8" - ajv "^6.12.5" - ajv-keywords "^3.5.2" - schema-utils@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz" @@ -10927,7 +10779,7 @@ tar@^6.0.2, tar@^6.1.11, tar@^6.1.2: mkdirp "^1.0.3" yallist "^4.0.0" -terser-webpack-plugin@^5.1.3, terser-webpack-plugin@^5.3.7: +terser-webpack-plugin@^5.1.3: version "5.3.7" resolved "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.7.tgz" integrity sha512-AfKwIktyP7Cu50xNjXF/6Qb5lBNzYaWpU6YfoX3uZicTx0zTy0stDDCsvjDapKsSDvOeWo5MEq4TmdBy2cNoHw== @@ -11756,36 +11608,6 @@ webpack@5.76.1: watchpack "^2.4.0" webpack-sources "^3.2.3" -webpack@^5.80.0: - version "5.80.0" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.80.0.tgz#3e660b4ab572be38c5e954bdaae7e2bf76010fdc" - integrity sha512-OIMiq37XK1rWO8mH9ssfFKZsXg4n6klTEDL7S8/HqbAOBBaiy8ABvXvz0dDCXeEF9gqwxSvVk611zFPjS8hJxA== - dependencies: - "@types/eslint-scope" "^3.7.3" - "@types/estree" "^1.0.0" - "@webassemblyjs/ast" "^1.11.5" - "@webassemblyjs/wasm-edit" "^1.11.5" - "@webassemblyjs/wasm-parser" "^1.11.5" - acorn "^8.7.1" - acorn-import-assertions "^1.7.6" - browserslist "^4.14.5" - chrome-trace-event "^1.0.2" - enhanced-resolve "^5.13.0" - es-module-lexer "^1.2.1" - eslint-scope "5.1.1" - events "^3.2.0" - glob-to-regexp "^0.4.1" - graceful-fs "^4.2.9" - json-parse-even-better-errors "^2.3.1" - loader-runner "^4.2.0" - mime-types "^2.1.27" - neo-async "^2.6.2" - schema-utils "^3.1.2" - tapable "^2.1.1" - terser-webpack-plugin "^5.3.7" - watchpack "^2.4.0" - webpack-sources "^3.2.3" - websocket-driver@>=0.5.1, websocket-driver@^0.7.4: version "0.7.4" resolved "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz" From 7008afd05f19703e91c92f9f194feb54139c3d92 Mon Sep 17 00:00:00 2001 From: lotte Date: Tue, 25 Apr 2023 16:12:00 +0200 Subject: [PATCH 109/409] 1578: primaryBitstream implementation --- .../edit-bitstream-page.component.spec.ts | 152 ++++++++++++++++-- .../edit-bitstream-page.component.ts | 136 +++++++++++----- src/app/core/shared/bundle.model.ts | 8 +- 3 files changed, 243 insertions(+), 53 deletions(-) diff --git a/src/app/bitstream-page/edit-bitstream-page/edit-bitstream-page.component.spec.ts b/src/app/bitstream-page/edit-bitstream-page/edit-bitstream-page.component.spec.ts index 44e48182fd..13f3ec7f27 100644 --- a/src/app/bitstream-page/edit-bitstream-page/edit-bitstream-page.component.spec.ts +++ b/src/app/bitstream-page/edit-bitstream-page/edit-bitstream-page.component.spec.ts @@ -24,6 +24,8 @@ import { createPaginatedList } from '../../shared/testing/utils.test'; import { Item } from '../../core/shared/item.model'; import { MetadataValueFilter } from '../../core/shared/metadata.models'; import { DSONameService } from '../../core/breadcrumbs/dso-name.service'; +import { Bundle } from '../../core/shared/bundle.model'; +import { BundleDataService } from '../../core/data/bundle-data.service'; const infoNotification: INotification = new Notification('id', NotificationType.Info, 'info'); const warningNotification: INotification = new Notification('id', NotificationType.Warning, 'warning'); @@ -35,9 +37,14 @@ let bitstreamService: BitstreamDataService; let bitstreamFormatService: BitstreamFormatDataService; let dsoNameService: DSONameService; let bitstream: Bitstream; +let bitstreamID: string; let selectedFormat: BitstreamFormat; let allFormats: BitstreamFormat[]; let router: Router; +let bundleDataService; +let bundleWithCurrentPrimary: Bundle; +let bundleWithDifferentPrimary: Bundle; +let bundleWithNoPrimary: Bundle; let comp: EditBitstreamPageComponent; let fixture: ComponentFixture; @@ -45,6 +52,12 @@ let fixture: ComponentFixture; describe('EditBitstreamPageComponent', () => { beforeEach(() => { + bitstreamID = 'current-bitstream-id'; + bundleWithCurrentPrimary = Object.assign(new Bundle(), { 'primaryBitstreamUUID': bitstreamID }); + bundleWithDifferentPrimary = Object.assign(new Bundle(), { 'primaryBitstreamUUID': '12345-abcde-54321-edcba' }); + bundleWithNoPrimary = Object.assign(new Bundle(), { 'primaryBitstreamUUID': null }); + bundleDataService = jasmine.createSpyObj('BundleDataService', ['patch']); + bundleDataService.patch.and.callFake((a, b) => createSuccessfulRemoteDataObject$(a)); allFormats = [ Object.assign({ id: '1', @@ -53,7 +66,7 @@ describe('EditBitstreamPageComponent', () => { supportLevel: BitstreamFormatSupportLevel.Unknown, mimetype: 'application/octet-stream', _links: { - self: {href: 'format-selflink-1'} + self: { href: 'format-selflink-1' } } }), Object.assign({ @@ -63,7 +76,7 @@ describe('EditBitstreamPageComponent', () => { supportLevel: BitstreamFormatSupportLevel.Known, mimetype: 'image/png', _links: { - self: {href: 'format-selflink-2'} + self: { href: 'format-selflink-2' } } }), Object.assign({ @@ -73,7 +86,7 @@ describe('EditBitstreamPageComponent', () => { supportLevel: BitstreamFormatSupportLevel.Known, mimetype: 'image/gif', _links: { - self: {href: 'format-selflink-3'} + self: { href: 'format-selflink-3' } } }) ] as BitstreamFormat[]; @@ -112,6 +125,8 @@ describe('EditBitstreamPageComponent', () => { const bundleName = 'ORIGINAL'; bitstream = Object.assign(new Bitstream(), { + uuid: bitstreamID, + id: bitstreamID, metadata: { 'dc.description': [ { @@ -155,17 +170,19 @@ describe('EditBitstreamPageComponent', () => { imports: [TranslateModule.forRoot(), RouterTestingModule], declarations: [EditBitstreamPageComponent, FileSizePipe, VarDirective], providers: [ - {provide: NotificationsService, useValue: notificationsService}, - {provide: DynamicFormService, useValue: formService}, - {provide: ActivatedRoute, + { provide: NotificationsService, useValue: notificationsService }, + { provide: DynamicFormService, useValue: formService }, + { + provide: ActivatedRoute, useValue: { - data: observableOf({bitstream: createSuccessfulRemoteDataObject(bitstream)}), - snapshot: {queryParams: {}} + data: observableOf({ bitstream: createSuccessfulRemoteDataObject(bitstream) }), + snapshot: { queryParams: {} } } }, - {provide: BitstreamDataService, useValue: bitstreamService}, - {provide: DSONameService, useValue: dsoNameService}, - {provide: BitstreamFormatDataService, useValue: bitstreamFormatService}, + { provide: BitstreamDataService, useValue: bitstreamService }, + { provide: DSONameService, useValue: dsoNameService }, + { provide: BitstreamFormatDataService, useValue: bitstreamFormatService }, + { provide: BundleDataService, useValue: bundleDataService }, ChangeDetectorRef ], schemas: [NO_ERRORS_SCHEMA] @@ -203,6 +220,27 @@ describe('EditBitstreamPageComponent', () => { it('should put the \"New Format\" input on invisible', () => { expect(comp.formLayout.newFormat.grid.host).toContain('invisible'); }); + describe('when the bitstream is the primary bitstream on the bundle', () => { + beforeEach(() => { + (comp as any).bundle = bundleWithCurrentPrimary; + comp.setForm(); + rawForm = comp.formGroup.getRawValue(); + + }); + it('should enable the primary bitstream toggle', () => { + expect(rawForm.fileNamePrimaryContainer.primaryBitstream).toEqual(true); + }); + }); + describe('when the bitstream is not the primary bitstream on the bundle', () => { + beforeEach(() => { + (comp as any).bundle = bundleWithDifferentPrimary; + comp.setForm(); + rawForm = comp.formGroup.getRawValue(); + }); + it('should disable the primary bitstream toggle', () => { + expect(rawForm.fileNamePrimaryContainer.primaryBitstream).toEqual(false); + }); + }); }); describe('when an unknown format is selected', () => { @@ -216,6 +254,95 @@ describe('EditBitstreamPageComponent', () => { }); describe('onSubmit', () => { + describe('when the primaryBitstream changed', () => { + describe('to the current bitstream', () => { + beforeEach(() => { + const rawValue = Object.assign(comp.formGroup.getRawValue(), { fileNamePrimaryContainer: { primaryBitstream: true } }); + spyOn(comp.formGroup, 'getRawValue').and.returnValue(rawValue); + }); + + describe('from a different primary bitstream', () => { + beforeEach(() => { + (comp as any).bundle = bundleWithDifferentPrimary; + comp.onSubmit(); + }); + + it('should call patch with a replace operation', () => { + expect(bundleDataService.patch).toHaveBeenCalledWith(bundleWithDifferentPrimary, [jasmine.objectContaining({ + op: 'replace' + })]); + }); + + it('should call patch with the correct bitstream uuid', () => { + expect(bundleDataService.patch).toHaveBeenCalledWith(bundleWithDifferentPrimary, [jasmine.objectContaining({ + value: bitstreamID + })]); + }); + }); + describe('from no primary bitstream', () => { + beforeEach(() => { + (comp as any).bundle = bundleWithNoPrimary; + comp.onSubmit(); + }); + + it('should call patch with an add operation', () => { + expect(bundleDataService.patch).toHaveBeenCalledWith(bundleWithNoPrimary, [jasmine.objectContaining({ + op: 'add' + })]); + }); + + it('should call patch with the correct bitstream uuid', () => { + expect(bundleDataService.patch).toHaveBeenCalledWith(bundleWithNoPrimary, [jasmine.objectContaining({ + value: bitstreamID + })]); + }); + }); + }); + describe('to no primary bitstream', () => { + beforeEach(() => { + const rawValue = Object.assign(comp.formGroup.getRawValue(), { fileNamePrimaryContainer: { primaryBitstream: false } }); + spyOn(comp.formGroup, 'getRawValue').and.returnValue(rawValue); + }); + + describe('from the current bitstream', () => { + beforeEach(() => { + (comp as any).bundle = bundleWithCurrentPrimary; + comp.onSubmit(); + }); + + it('should call patch with a remove operation', () => { + expect(bundleDataService.patch).toHaveBeenCalledWith(bundleWithCurrentPrimary, [jasmine.objectContaining({ + op: 'remove' + })]); + }); + }); + }); + }); + describe('when the primaryBitstream did not changed', () => { + describe('the current bitstream stayed the primary bitstream', () => { + beforeEach(() => { + const rawValue = Object.assign(comp.formGroup.getRawValue(), { fileNamePrimaryContainer: { primaryBitstream: true } }); + spyOn(comp.formGroup, 'getRawValue').and.returnValue(rawValue); + (comp as any).bundle = bundleWithCurrentPrimary; + comp.onSubmit(); + }); + it('should not call patch on the bundle data service', () => { + expect(bundleDataService.patch).not.toHaveBeenCalled(); + }); + }); + describe('the bitstream was not and did not become the primary bitstream', () => { + beforeEach(() => { + const rawValue = Object.assign(comp.formGroup.getRawValue(), { fileNamePrimaryContainer: { primaryBitstream: false } }); + spyOn(comp.formGroup, 'getRawValue').and.returnValue(rawValue); + (comp as any).bundle = bundleWithDifferentPrimary; + comp.onSubmit(); + }); + it('should not call patch on the bundle data service', () => { + expect(bundleDataService.patch).not.toHaveBeenCalled(); + }); + }); + }); + describe('when selected format hasn\'t changed', () => { beforeEach(() => { comp.onSubmit(); @@ -357,6 +484,7 @@ describe('EditBitstreamPageComponent', () => { {provide: BitstreamDataService, useValue: bitstreamService}, {provide: DSONameService, useValue: dsoNameService}, {provide: BitstreamFormatDataService, useValue: bitstreamFormatService}, + { provide: BundleDataService, useValue: bundleDataService }, ChangeDetectorRef ], schemas: [NO_ERRORS_SCHEMA] @@ -371,7 +499,6 @@ describe('EditBitstreamPageComponent', () => { spyOn(router, 'navigate'); }); - describe('on startup', () => { let rawForm; @@ -475,6 +602,7 @@ describe('EditBitstreamPageComponent', () => { {provide: BitstreamDataService, useValue: bitstreamService}, {provide: DSONameService, useValue: dsoNameService}, {provide: BitstreamFormatDataService, useValue: bitstreamFormatService}, + { provide: BundleDataService, useValue: bundleDataService }, ChangeDetectorRef ], schemas: [NO_ERRORS_SCHEMA] diff --git a/src/app/bitstream-page/edit-bitstream-page/edit-bitstream-page.component.ts b/src/app/bitstream-page/edit-bitstream-page/edit-bitstream-page.component.ts index 8e63ec939f..3c3965a70a 100644 --- a/src/app/bitstream-page/edit-bitstream-page/edit-bitstream-page.component.ts +++ b/src/app/bitstream-page/edit-bitstream-page/edit-bitstream-page.component.ts @@ -52,6 +52,7 @@ import { DsDynamicInputModel } from '../../shared/form/builder/ds-dynamic-form-ui/models/ds-dynamic-input.model'; import { DsDynamicTextAreaModel } from '../../shared/form/builder/ds-dynamic-form-ui/models/ds-dynamic-textarea.model'; +import { BundleDataService } from '../../core/data/bundle-data.service'; @Component({ selector: 'ds-edit-bitstream-page', @@ -191,19 +192,19 @@ export class EditBitstreamPageComponent implements OnInit, OnDestroy { * The Dynamic Input Model for the iiif label */ iiifLabelModel = new DsDynamicInputModel({ - hasSelectableMetadata: false, metadataFields: [], repeatable: false, submissionId: '', - id: 'iiifLabel', - name: 'iiifLabel' - }, + hasSelectableMetadata: false, metadataFields: [], repeatable: false, submissionId: '', + id: 'iiifLabel', + name: 'iiifLabel' + }, { - grid: { - host: 'col col-lg-6 d-inline-block' - } + grid: { + host: 'col col-lg-6 d-inline-block' + } }); iiifLabelContainer = new DynamicFormGroupModel({ id: 'iiifLabelContainer', group: [this.iiifLabelModel] - },{ + }, { grid: { host: 'form-row' } @@ -213,7 +214,7 @@ export class EditBitstreamPageComponent implements OnInit, OnDestroy { hasSelectableMetadata: false, metadataFields: [], repeatable: false, submissionId: '', id: 'iiifToc', name: 'iiifToc', - },{ + }, { grid: { host: 'col col-lg-6 d-inline-block' } @@ -221,7 +222,7 @@ export class EditBitstreamPageComponent implements OnInit, OnDestroy { iiifTocContainer = new DynamicFormGroupModel({ id: 'iiifTocContainer', group: [this.iiifTocModel] - },{ + }, { grid: { host: 'form-row' } @@ -231,7 +232,7 @@ export class EditBitstreamPageComponent implements OnInit, OnDestroy { hasSelectableMetadata: false, metadataFields: [], repeatable: false, submissionId: '', id: 'iiifWidth', name: 'iiifWidth', - },{ + }, { grid: { host: 'col col-lg-6 d-inline-block' } @@ -239,7 +240,7 @@ export class EditBitstreamPageComponent implements OnInit, OnDestroy { iiifWidthContainer = new DynamicFormGroupModel({ id: 'iiifWidthContainer', group: [this.iiifWidthModel] - },{ + }, { grid: { host: 'form-row' } @@ -249,7 +250,7 @@ export class EditBitstreamPageComponent implements OnInit, OnDestroy { hasSelectableMetadata: false, metadataFields: [], repeatable: false, submissionId: '', id: 'iiifHeight', name: 'iiifHeight' - },{ + }, { grid: { host: 'col col-lg-6 d-inline-block' } @@ -257,7 +258,7 @@ export class EditBitstreamPageComponent implements OnInit, OnDestroy { iiifHeightContainer = new DynamicFormGroupModel({ id: 'iiifHeightContainer', group: [this.iiifHeightModel] - },{ + }, { grid: { host: 'form-row' } @@ -280,11 +281,11 @@ export class EditBitstreamPageComponent implements OnInit, OnDestroy { this.fileNameModel, this.primaryBitstreamModel ] - },{ - grid: { - host: 'form-row' - } - }), + }, { + grid: { + host: 'form-row' + } + }), new DynamicFormGroupModel({ id: 'descriptionContainer', group: [ @@ -380,13 +381,23 @@ export class EditBitstreamPageComponent implements OnInit, OnDestroy { */ isIIIF = false; - /** * Array to track all subscriptions and unsubscribe them onDestroy * @type {Array} */ protected subs: Subscription[] = []; + /** + * The parent bundle containing the Bitstream + * @private + */ + private bundle: Bundle; + + /** + * Path to patch primary bitstream on the bundle + * @private + */ + private readonly primaryBitstreamPath = '/primarybitstream'; constructor(private route: ActivatedRoute, private router: Router, @@ -397,7 +408,8 @@ export class EditBitstreamPageComponent implements OnInit, OnDestroy { private bitstreamService: BitstreamDataService, private dsoNameService: DSONameService, private notificationsService: NotificationsService, - private bitstreamFormatService: BitstreamFormatDataService) { + private bitstreamFormatService: BitstreamFormatDataService, + private bundleService: BundleDataService) { } /** @@ -423,13 +435,20 @@ export class EditBitstreamPageComponent implements OnInit, OnDestroy { getRemoteDataPayload() ); + const bundle$ = bitstream$.pipe( + switchMap((bitstream: Bitstream) => bitstream.bundle), + getFirstSucceededRemoteDataPayload(), + ); + this.subs.push( observableCombineLatest( bitstream$, - allFormats$ - ).subscribe(([bitstream, allFormats]) => { + allFormats$, + bundle$ + ).subscribe(([bitstream, allFormats, bundle]) => { this.bitstream = bitstream as Bitstream; this.formats = allFormats.page; + this.bundle = bundle; this.setIiifStatus(this.bitstream); }) ); @@ -437,8 +456,8 @@ export class EditBitstreamPageComponent implements OnInit, OnDestroy { this.subs.push( this.translate.onLangChange .subscribe(() => { - this.updateFieldTranslations(); - }) + this.updateFieldTranslations(); + }) ); } @@ -460,7 +479,7 @@ export class EditBitstreamPageComponent implements OnInit, OnDestroy { this.formGroup.patchValue({ fileNamePrimaryContainer: { fileName: bitstream.name, - primaryBitstream: false + primaryBitstream: this.bundle.primaryBitstreamUUID === bitstream.uuid }, descriptionContainer: { description: bitstream.firstMetadataValue('dc.description') @@ -563,6 +582,7 @@ export class EditBitstreamPageComponent implements OnInit, OnDestroy { } } + /** * Check for changes against the bitstream and send update requests to the REST API */ @@ -571,9 +591,45 @@ export class EditBitstreamPageComponent implements OnInit, OnDestroy { const updatedBitstream = this.formToBitstream(updatedValues); const selectedFormat = this.formats.find((f: BitstreamFormat) => f.id === updatedValues.formatContainer.selectedFormat); const isNewFormat = selectedFormat.id !== this.originalFormat.id; + const isPrimary = updatedValues.fileNamePrimaryContainer.primaryBitstream; + const wasPrimary = this.bundle.primaryBitstreamUUID === this.bitstream.uuid; let bitstream$; + let bundle$: Observable; + if (wasPrimary !== isPrimary) { + let patchOperation; + // No longer primary bitstream: remove + if (wasPrimary) { + patchOperation = { + path: this.primaryBitstreamPath, + op: 'remove' + }; + } else { + // Has become primary bitstream + // If it already had a value: replace, otherwise: add + patchOperation = { + path: this.primaryBitstreamPath, + op: hasValue(this.bundle.primaryBitstreamUUID) ? 'replace' : 'add', + value: this.bitstream.uuid + }; + } + bundle$ = this.bundleService.patch(this.bundle, [patchOperation]).pipe( + getFirstCompletedRemoteData(), + map((bundleResponse: RemoteData) => { + if (hasValue(bundleResponse) && bundleResponse.hasFailed) { + this.notificationsService.error( + this.translate.instant(this.NOTIFICATIONS_PREFIX + 'error.primaryBitstream.title'), + bundleResponse.errorMessage + ); + } else { + return bundleResponse.payload; + } + }) + ); + } else { + bundle$ = observableOf(this.bundle); + } if (isNewFormat) { bitstream$ = this.bitstreamService.updateFormat(this.bitstream, selectedFormat).pipe( getFirstCompletedRemoteData(), @@ -592,7 +648,7 @@ export class EditBitstreamPageComponent implements OnInit, OnDestroy { bitstream$ = observableOf(this.bitstream); } - bitstream$.pipe( + combineLatest([bundle$, bitstream$]).pipe( switchMap(() => { return this.bitstreamService.update(updatedBitstream).pipe( getFirstSucceededRemoteDataPayload() @@ -633,11 +689,11 @@ export class EditBitstreamPageComponent implements OnInit, OnDestroy { } else { Metadata.setFirstValue(newMetadata, this.IIIF_LABEL_METADATA, rawForm.iiifLabelContainer.iiifLabel); } - if (isEmpty(rawForm.iiifTocContainer.iiifToc)) { - delete newMetadata[this.IIIF_TOC_METADATA]; - } else { + if (isEmpty(rawForm.iiifTocContainer.iiifToc)) { + delete newMetadata[this.IIIF_TOC_METADATA]; + } else { Metadata.setFirstValue(newMetadata, this.IIIF_TOC_METADATA, rawForm.iiifTocContainer.iiifToc); - } + } if (isEmpty(rawForm.iiifWidthContainer.iiifWidth)) { delete newMetadata[this.IMAGE_WIDTH_METADATA]; } else { @@ -672,10 +728,10 @@ export class EditBitstreamPageComponent implements OnInit, OnDestroy { this.router.navigate([getEntityEditRoute(this.entityType, this.itemId), 'bitstreams']); } else { this.bitstream.bundle.pipe(getFirstSucceededRemoteDataPayload(), - mergeMap((bundle: Bundle) => bundle.item.pipe(getFirstSucceededRemoteDataPayload()))) - .subscribe((item) => { - this.router.navigate(([getItemEditRoute(item), 'bitstreams'])); - }); + mergeMap((bundle: Bundle) => bundle.item.pipe(getFirstSucceededRemoteDataPayload()))) + .subscribe((item) => { + this.router.navigate(([getItemEditRoute(item), 'bitstreams'])); + }); } } @@ -701,11 +757,11 @@ export class EditBitstreamPageComponent implements OnInit, OnDestroy { const isEnabled$ = this.bitstream.bundle.pipe( getFirstSucceededRemoteData(), map((bundle: RemoteData) => bundle.payload.item.pipe( - getFirstSucceededRemoteData(), - map((item: RemoteData) => - (item.payload.firstMetadataValue('dspace.iiif.enabled') && - item.payload.firstMetadataValue('dspace.iiif.enabled').match(regexIIIFItem) !== null) - )))); + getFirstSucceededRemoteData(), + map((item: RemoteData) => + (item.payload.firstMetadataValue('dspace.iiif.enabled') && + item.payload.firstMetadataValue('dspace.iiif.enabled').match(regexIIIFItem) !== null) + )))); const iiifSub = combineLatest( isImage$, diff --git a/src/app/core/shared/bundle.model.ts b/src/app/core/shared/bundle.model.ts index 36b7012e47..72c466d2d6 100644 --- a/src/app/core/shared/bundle.model.ts +++ b/src/app/core/shared/bundle.model.ts @@ -1,4 +1,4 @@ -import { deserialize, inheritSerialization } from 'cerialize'; +import { autoserializeAs, deserialize, inheritSerialization } from 'cerialize'; import { Observable } from 'rxjs'; @@ -29,6 +29,12 @@ export class Bundle extends DSpaceObject { item: HALLink; }; + /** + * The ID of the primaryBitstream of this Bundle + */ + @autoserializeAs('primarybitstream') + primaryBitstreamUUID: string; + /** * The primary Bitstream of this Bundle * Will be undefined unless the primaryBitstream {@link HALLink} has been resolved. From 99dd9d2de9911a0901f6ba741b09686a9456e145 Mon Sep 17 00:00:00 2001 From: Nona Luypaert Date: Tue, 25 Apr 2023 17:55:20 +0200 Subject: [PATCH 110/409] 101127: Take activeModal out of VocabularyTreeviewComponent --- .../vocabulary-treeview-modal.component.html | 4 ++-- .../vocabulary-treeview-modal.component.ts | 8 ++++++++ .../vocabulary-treeview/vocabulary-treeview.component.ts | 8 +------- 3 files changed, 11 insertions(+), 9 deletions(-) diff --git a/src/app/shared/form/vocabulary-treeview-modal/vocabulary-treeview-modal.component.html b/src/app/shared/form/vocabulary-treeview-modal/vocabulary-treeview-modal.component.html index 8df07a3879..71eb8e1476 100644 --- a/src/app/shared/form/vocabulary-treeview-modal/vocabulary-treeview-modal.component.html +++ b/src/app/shared/form/vocabulary-treeview-modal/vocabulary-treeview-modal.component.html @@ -9,8 +9,8 @@ + [multiSelect]="multiSelect" + (select)="onSelect($event)">
diff --git a/src/app/shared/form/vocabulary-treeview-modal/vocabulary-treeview-modal.component.ts b/src/app/shared/form/vocabulary-treeview-modal/vocabulary-treeview-modal.component.ts index fef230d4d7..c6b0bf20fe 100644 --- a/src/app/shared/form/vocabulary-treeview-modal/vocabulary-treeview-modal.component.ts +++ b/src/app/shared/form/vocabulary-treeview-modal/vocabulary-treeview-modal.component.ts @@ -1,6 +1,7 @@ import { Component, Input } from '@angular/core'; import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap'; import { VocabularyOptions } from '../../../core/submission/vocabularies/models/vocabulary-options.model'; +import { VocabularyEntryDetail } from '../../../core/submission/vocabularies/models/vocabulary-entry-detail.model'; @Component({ selector: 'ds-vocabulary-treeview-modal', @@ -40,4 +41,11 @@ export class VocabularyTreeviewModalComponent { constructor( public activeModal: NgbActiveModal, ) { } + + /** + * Method called on entry select + */ + onSelect(item: VocabularyEntryDetail) { + this.activeModal.close(item); + } } diff --git a/src/app/shared/form/vocabulary-treeview/vocabulary-treeview.component.ts b/src/app/shared/form/vocabulary-treeview/vocabulary-treeview.component.ts index b9c30e6343..572074d644 100644 --- a/src/app/shared/form/vocabulary-treeview/vocabulary-treeview.component.ts +++ b/src/app/shared/form/vocabulary-treeview/vocabulary-treeview.component.ts @@ -1,7 +1,6 @@ import { FlatTreeControl } from '@angular/cdk/tree'; import { Component, EventEmitter, Input, OnDestroy, OnInit, Output } from '@angular/core'; -import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap'; import { map } from 'rxjs/operators'; import { Observable, Subscription } from 'rxjs'; import { Store } from '@ngrx/store'; @@ -44,11 +43,6 @@ export class VocabularyTreeviewComponent implements OnDestroy, OnInit { */ @Input() selectedItems: string[] = []; - /** - * The active modal - */ - @Input() activeModal?: NgbActiveModal; - /** * Whether to allow selecting multiple values with checkboxes */ @@ -252,7 +246,7 @@ export class VocabularyTreeviewComponent implements OnDestroy, OnInit { */ onSelect(item: VocabularyEntryDetail) { this.selectedItems.push(item.id); - this.activeModal.close(item); + this.select.emit(item); } /** From 08b271095facf3f93600da30fd232f62f3cbe5ef Mon Sep 17 00:00:00 2001 From: tuanvu Date: Wed, 26 Apr 2023 14:46:32 +0700 Subject: [PATCH 111/409] Internalization (i18n): Vietnamese translation! --- src/assets/i18n/vi.json5 | 2667 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 2667 insertions(+) create mode 100644 src/assets/i18n/vi.json5 diff --git a/src/assets/i18n/vi.json5 b/src/assets/i18n/vi.json5 new file mode 100644 index 0000000000..afc7ce4e3c --- /dev/null +++ b/src/assets/i18n/vi.json5 @@ -0,0 +1,2667 @@ +{ + "401.help": "Bạn không có quyền truy cập trang này. Bạn có thể sử dụng nút chức năng phía dưới để quay lại trang chủ.", + "401.link.home-page": "Đi tới trang chủ", + "401.unauthorized": "không có quyền truy cập", + "403.forbidden": "không được phép truy cập", + "403.help": "Bạn không có quyền truy cập trang này. Bạn có thể sử dụng nút chức năng phía dưới để quay lại trang chủ.", + "403.link.home-page": "Đi tới trang chủ", + "404.help": "Chúng tôi không tìm thấy trang mà bạn đang tìm kiếm. Trang này có thể đã được chuyển tới một địa chỉ khác hoặc đã bị xóa. Bạn có thể sử dụng nút chức năng phía dưới để quay lại trang chủ.", + "404.link.home-page": "Đi tới trang chủ", + "404.page-not-found": "không tìm thấy trang", + "500.help": "Máy chủ tạm thời không thể phục vụ yêu cầu của bạn do đang trong giai đoạn bảo trì hoặc vấn đề về dung lượng. Vui lòng thử lại sau.", + "500.link.home-page": "Đi tới trang chủ", + "500.page-internal-server-error": "Dịch vụ không sẵn sàng", + + "access-status.embargo.listelement.badge": "Ngăn chặn", + "access-status.metadata.only.listelement.badge": "Chỉ siêu dữ liệu", + "access-status.open.access.listelement.badge": "Truy cập mở", + "access-status.restricted.listelement.badge": "Hạn chế", + "access-status.unknown.listelement.badge": "Không xác định", + + "admin.curation-tasks.breadcrumbs": "Thu thập các tác vụ hệ thống", + "admin.curation-tasks.header": "Thu thập các tác vụ hệ thống", + "admin.curation-tasks.title": "Thu thập các tác vụ hệ thống", + + "admin.registries.bitstream-formats.breadcrumbs": "Tạo định dạng", + "admin.registries.bitstream-formats.create.breadcrumbs": "Định dạng tệp tin", + "admin.registries.bitstream-formats.create.failure.content": "Đã xảy ra lỗi khi tạo định dạng tệp tin mới.", + "admin.registries.bitstream-formats.create.failure.head": "Không thành công", + "admin.registries.bitstream-formats.create.head": "Tạo định dạng tệp tin", + "admin.registries.bitstream-formats.create.new": "Thêm một định dạng tệp tin mới", + "admin.registries.bitstream-formats.create.success.content": "Định dạng tệp tin mới đã được tạo thành công.", + "admin.registries.bitstream-formats.create.success.head": "Thành công", + "admin.registries.bitstream-formats.delete.failure.amount": "Loại bỏ không thành công {{ amount }} định dạng", + "admin.registries.bitstream-formats.delete.failure.head": "Không thành công", + "admin.registries.bitstream-formats.delete.success.amount": "Loại bỏ thành công {{ amount }} định dạng", + "admin.registries.bitstream-formats.delete.success.head": "Thành công", + "admin.registries.bitstream-formats.description": "Danh sách các định dạng tệp tin này cung cấp thông tin về các định dạng đã biết và mức hỗ trợ của chúng.", + "admin.registries.bitstream-formats.edit.breadcrumbs": "Định dạng tệp tin", + "admin.registries.bitstream-formats.edit.description.label": "Mô tả", + "admin.registries.bitstream-formats.edit.extensions.hint": "Tiện ích mở rộng là phần mở rộng tệp được sử dụng để tự động xác định định dạng của tệp được tải lên. Bạn có thể nhập một vài phần mở rộng cho mỗi định dạng.", + "admin.registries.bitstream-formats.edit.extensions.label": "Mở rộng tệp", + "admin.registries.bitstream-formats.edit.extensions.placeholder": "Nhập một phần mở rộng tệp không có dấu chấm", + "admin.registries.bitstream-formats.edit.failure.content": "Đã xảy ra lỗi khi chỉnh sửa định dạng tệp tin.", + "admin.registries.bitstream-formats.edit.failure.head": "Không thành công", + "admin.registries.bitstream-formats.edit.head": "Định dạng tệp tin: {{ format }}", + "admin.registries.bitstream-formats.edit.internal.hint": "Các định dạng được đánh dấu là nội bộ sẽ được ẩn đối với người dùng và được sử dụng cho các mục đích quản trị.", + "admin.registries.bitstream-formats.edit.internal.label": "Nội bộ", + "admin.registries.bitstream-formats.edit.mimetype.hint": "Kiểu MIME được liên kết với định dạng này không nhất thiết phải là duy nhất.", + "admin.registries.bitstream-formats.edit.mimetype.label": "Kiểu MIME", + "admin.registries.bitstream-formats.edit.shortDescription.hint": "Một tên duy nhất cho định dạng này (ví dụ: Microsoft Word XP hoặc Microsoft Word 2000)", + "admin.registries.bitstream-formats.edit.shortDescription.label": "Tên", + "admin.registries.bitstream-formats.edit.success.content": "Định dạng tệp tin đã được chỉnh sửa thành công.", + "admin.registries.bitstream-formats.edit.success.head": "Thành công", + "admin.registries.bitstream-formats.edit.supportLevel.hint": "Mức độ hỗ trợ mà đơn vị của bạn cam kết cho định dạng này.", + "admin.registries.bitstream-formats.edit.supportLevel.label": "Mức độ hỗ trợ", + "admin.registries.bitstream-formats.head": "Tạo định dạng tệp tin số", + "admin.registries.bitstream-formats.no-items": "Không có định dạng tệp tin nào để hiển thị.", + "admin.registries.bitstream-formats.table.delete": "Xóa các mục được chọn", + "admin.registries.bitstream-formats.table.deselect-all": "Bỏ chọn tất cả", + "admin.registries.bitstream-formats.table.id": "ID", + "admin.registries.bitstream-formats.table.internal": "nội bộ", + "admin.registries.bitstream-formats.table.mimetype": "Kiểu MIME", + "admin.registries.bitstream-formats.table.name": "Tên", + "admin.registries.bitstream-formats.table.return": "Quay lại", + "admin.registries.bitstream-formats.table.supportLevel.head": "Mức độ hỗ trợ", + "admin.registries.bitstream-formats.table.supportLevel.KNOWN": "Đã xác định", + "admin.registries.bitstream-formats.table.supportLevel.SUPPORTED": "Được hỗ trợ", + "admin.registries.bitstream-formats.table.supportLevel.UNKNOWN": "Không xác định", + "admin.registries.bitstream-formats.title": "Tạo định dạng tệp tin số", + "admin.registries.metadata.breadcrumbs": "Mẫu nhập liệu", + "admin.registries.metadata.description": "Tạo mẫu nhập liệu cho phép duy trì danh sách tất cả các trường thông tin mô tả có sẵn trong hệ thống. Các trường này có thể được phân ra cho nhiều lược đồ. Tuy nhiên DSpace yêu cầu đủ điều kiện cho lược đồ Dublin Core.", + "admin.registries.metadata.form.create": "Tạo lược đồ thông tin mô tả", + "admin.registries.metadata.form.edit": "Chỉnh sửa lược đồ thông tin mô tả", + "admin.registries.metadata.form.name": "Tên", + "admin.registries.metadata.form.namespace": "Tên miền", + "admin.registries.metadata.head": "Tạo mẫu nhập liệu", + "admin.registries.metadata.schemas.no-items": "Không có lược đồ thông tin mô tả nào để hiển thị.", + "admin.registries.metadata.schemas.table.delete": "Xóa các mục đã chọn", + "admin.registries.metadata.schemas.table.id": "ID", + "admin.registries.metadata.schemas.table.name": "Tên", + "admin.registries.metadata.schemas.table.namespace": "Tên miền", + "admin.registries.metadata.title": "Tạo mẫu nhập liệu", + "admin.registries.schema.breadcrumbs": "Lược đồ thông tin mô tả", + "admin.registries.schema.description": "Đây là lược đồ thông tin mô tả cho \"{{namespace}}\".", + "admin.registries.schema.fields.head": "Lược đồ các trường thông tin mô tả", + "admin.registries.schema.fields.no-items": "Không có trường thông tin mô tả nào để hiển thị.", + "admin.registries.schema.fields.table.delete": "Xóa các mục đã lựa chọn", + "admin.registries.schema.fields.table.field": "Trường", + "admin.registries.schema.fields.table.id": "ID", + "admin.registries.schema.fields.table.scopenote": "Ghi chú phạm vi", + "admin.registries.schema.form.create": "Tạo trường thông tin mô tả", + "admin.registries.schema.form.edit": "Chỉnh sửa trường thông tin mô tả", + "admin.registries.schema.form.element": "Yếu tố", + "admin.registries.schema.form.qualifier": "Đối tượng bổ trợ", + "admin.registries.schema.form.scopenote": "Ghi chú phạm vi", + "admin.registries.schema.head": "Lược đồ thông tin mô tả", + "admin.registries.schema.notification.created": "Tạo thành công lược đồ thông tin mô tả \"{{prefix}}\"", + "admin.registries.schema.notification.deleted.failure": "Xóa không thành công {{amount}} lược đồ thông tin mô tả", + "admin.registries.schema.notification.deleted.success": "Đã xóa thành công {{amount}} lược đồ thông tin mô tả", + "admin.registries.schema.notification.edited": "Chỉnh sửa thành công lược đồ thông tin mô tả \"{{prefix}}\"", + "admin.registries.schema.notification.failure": "Lỗi", + "admin.registries.schema.notification.field.created": "Tạo thành công trường thông tin mô tả \"{{field}}\"", + "admin.registries.schema.notification.field.deleted.failure": "Xóa không thành công {{amount}} trường thông tin mô tả", + "admin.registries.schema.notification.field.deleted.success": "Đã xóa thành công {{amount}} trường thông tin mô tả", + "admin.registries.schema.notification.field.edited": "Chỉnh sửa thành công trường thông tin mô tả \"{{field}}\"", + "admin.registries.schema.notification.success": "Thành công", + "admin.registries.schema.return": "Quay lại", + "admin.registries.schema.title": "Tạo lược đồ thông tin mô tả", + + "admin.access-control.epeople.actions.delete": "Xóa người dùng", + "admin.access-control.epeople.actions.impersonate": "Mạo danh người dùng", + "admin.access-control.epeople.actions.reset": "Cài lại mật khẩu", + "admin.access-control.epeople.actions.stop-impersonating": "Dừng mạo danh người dùng", + "admin.access-control.epeople.breadcrumbs": "Người dùng", + "admin.access-control.epeople.button.add": "Thêm người dùng", + "admin.access-control.epeople.button.see-all": "Duyệt toàn bộ", + "admin.access-control.epeople.form.canLogIn": "Có thể đăng nhập", + "admin.access-control.epeople.form.create": "Tạo người dùng", + "admin.access-control.epeople.form.edit": "Chỉnh sửa người dùng", + "admin.access-control.epeople.form.email": "E-mail", + "admin.access-control.epeople.form.emailHint": "Phải là địa chỉ e-mail hợp lệ", + "admin.access-control.epeople.form.firstName": "Tên", + "admin.access-control.epeople.form.goToGroups": "Thêm vào nhóm", + "admin.access-control.epeople.form.groupsEPersonIsMemberOf": "Thành viên của các nhóm:", + "admin.access-control.epeople.form.lastName": "Họ", + "admin.access-control.epeople.form.memberOfNoGroups": "Người dùng không là thành viên của bất kỳ nhóm nào", + "admin.access-control.epeople.form.notification.created.failure": "Tạo không thành công người dùng \"{{name}}\"", + "admin.access-control.epeople.form.notification.created.failure.emailInUse": "Tạo không thành công người dùng \"{{name}}\" email \"{{email}}\" đã được sử dụng.", + "admin.access-control.epeople.form.notification.created.success": "Tạo thành công người dùng \"{{name}}\"", + "admin.access-control.epeople.form.notification.deleted.failure": "Xóa không thành công người dùng \"{{name}}\"", + "admin.access-control.epeople.form.notification.deleted.success": "Xóa thành công người dùng \"{{name}}\"", + "admin.access-control.epeople.form.notification.edited.failure": "Chỉnh sửa không thành công người dùng \"{{name}}\"", + "admin.access-control.epeople.form.notification.edited.failure.emailInUse": "Chỉnh sửa không thành công người dùng \"{{name}}\" email \"{{email}}\" đã được sử dụng.", + "admin.access-control.epeople.form.notification.edited.success": "Chỉnh sửa thành công người dùng \"{{name}}\"", + "admin.access-control.epeople.form.requireCertificate": "Khóa tài khoản", + "admin.access-control.epeople.form.return": "Quay lại", + "admin.access-control.epeople.form.table.collectionOrCommunity": "Đơn vị\/ Bộ sưu tập", + "admin.access-control.epeople.form.table.id": "ID", + "admin.access-control.epeople.form.table.name": "Tên", + "admin.access-control.epeople.head": "Người dùng", + "admin.access-control.epeople.no-items": "Không có người dùng nào để hiển thị.", + "admin.access-control.epeople.notification.deleted.failure": "Xóa không thành công người dùng: \"{{name}}\"", + "admin.access-control.epeople.notification.deleted.success": "Xóa thành công người dùng: \"{{name}}\"", + "admin.access-control.epeople.notification.resetpassword.success": "Thiết lập lại mật khẩu thành công cho người dùng: \"{{name}}\"", + "admin.access-control.epeople.search.button": "Tìm kiếm", + "admin.access-control.epeople.search.head": "Tìm kiếm", + "admin.access-control.epeople.search.placeholder": "Tìm kiếm người dùng...", + "admin.access-control.epeople.search.scope.email": "E-mail (chính xác)", + "admin.access-control.epeople.search.scope.metadata": "Siêu dữ liệu", + "admin.access-control.epeople.table.edit": "Chỉnh sửa", + "admin.access-control.epeople.table.edit.buttons.edit": "Chỉnh sửa \"{{name}}\"", + "admin.access-control.epeople.table.edit.buttons.edit-disabled": "Bạn không có quyền chỉnh sửa nhóm này", + "admin.access-control.epeople.table.edit.buttons.remove": "Xóa \"{{name}}\"", + "admin.access-control.epeople.table.email": "E-mail (chính xác)", + "admin.access-control.epeople.table.id": "ID", + "admin.access-control.epeople.table.name": "Tên", + "admin.access-control.epeople.title": "Người dùng", + "admin.access-control.groups.addGroup.breadcrumbs": "Tạo nhóm người dùng", + "admin.access-control.groups.breadcrumbs": "Nhóm người dùng", + "admin.access-control.groups.button.add": "Thêm nhóm người dùng", + "admin.access-control.groups.button.see-all": "Duyệt toàn bộ", + "admin.access-control.groups.form.actions.delete": "Xóa nhóm người dùng", + "admin.access-control.groups.form.alert.permanent": "Nhóm này là cố định vì vậy nó không thể bị chỉnh sửa hoặc xóa. Bạn vẫn có thể thêm và loại bỏ thành viên trong nhóm tại trang này.", + "admin.access-control.groups.form.alert.workflowGroup": "Không thể chỉnh sửa hoặc xóa nhóm này vì nó tương ứng với một vai trò trong quá trình gửi và quy trình xử lý trong \"{{name}}\" {{comcol}}. Bạn có thể xóa nó từ thẻ assign roles<\/a> trên trang chỉnh sửa {{comcol}}. Bạn vẫn có thể thêm và loại bỏ thành viên nhóm bằng trang này.\"", + "admin.access-control.groups.form.delete-group.modal.cancel": "Hủy", + "admin.access-control.groups.form.delete-group.modal.confirm": "Xóa", + "admin.access-control.groups.form.delete-group.modal.header": "Xóa nhóm người dùng \"{{ dsoName }}\"", + "admin.access-control.groups.form.delete-group.modal.info": "Bạn có chắc chắn rằng bạn muốn xóa nhóm người dùng \"{{ dsoName }}\"", + "admin.access-control.groups.form.groupCommunity": "Đơn vị hoặc Bộ sưu tập", + "admin.access-control.groups.form.groupDescription": "Mô tả", + "admin.access-control.groups.form.groupName": "Tên nhóm người dùng", + "admin.access-control.groups.form.head.create": "Tạo nhóm người dùng", + "admin.access-control.groups.form.head.edit": "Chỉnh sửa nhóm người dùng", + "admin.access-control.groups.form.members-list.button.see-all": "Duyệt toàn bộ", + "admin.access-control.groups.form.members-list.head": "Người dùng", + "admin.access-control.groups.form.members-list.headMembers": "Các thành viên hiện tại", + "admin.access-control.groups.form.members-list.no-items": "Không người dùng nào được tìm thấy trong tìm kiếm", + "admin.access-control.groups.form.members-list.no-members-yet": "Chưa có thành viên trong nhóm tìm kiếm và thêm thành viên vào nhóm.", + "admin.access-control.groups.form.members-list.notification.failure.addMember": "Thêm không thành công thành viên: \"{{name}}\"", + "admin.access-control.groups.form.members-list.notification.failure.deleteMember": "Xóa không thành công thành viên: \"{{name}}\"", + "admin.access-control.groups.form.members-list.notification.failure.noActiveGroup": "Hiện tại không có nhóm hoạt động gửi một tên trước.", + "admin.access-control.groups.form.members-list.notification.success.addMember": "Thêm thành công thành viên: \"{{name}}\"", + "admin.access-control.groups.form.members-list.notification.success.deleteMember": "Xóa thành công thành viên: \"{{name}}\"", + "admin.access-control.groups.form.members-list.search.button": "Tìm kiếm", + "admin.access-control.groups.form.members-list.search.head": "Thêm người dùng", + "admin.access-control.groups.form.members-list.search.scope.email": "E-mail (chính xác)", + "admin.access-control.groups.form.members-list.search.scope.metadata": "Siêu dữ liệu", + "admin.access-control.groups.form.members-list.table.edit": "Loại bỏ \/ Thêm", + "admin.access-control.groups.form.members-list.table.edit.buttons.add": "Thêm thành viên với tên \"{{name}}\"", + "admin.access-control.groups.form.members-list.table.edit.buttons.remove": "Loại bỏ thành viên với tên \"{{name}}\"", + "admin.access-control.groups.form.members-list.table.email": "Email", + "admin.access-control.groups.form.members-list.table.id": "ID", + "admin.access-control.groups.form.members-list.table.identity": "Định danh", + "admin.access-control.groups.form.members-list.table.name": "Tên", + "admin.access-control.groups.form.members-list.table.netid": "NetID", + "admin.access-control.groups.form.notification.created.failure": "Tạo không thành công nhóm người dùng \"{{name}}\"", + "admin.access-control.groups.form.notification.created.failure.groupNameInUse": "Tạo không thành công nhóm người dùng với tên: \"{{name}}\" đảm bảo tên này chưa được sử dụng\"", + "admin.access-control.groups.form.notification.created.success": "Tạo thành công nhóm người dùng \"{{name}}\"", + "admin.access-control.groups.form.notification.deleted.failure.content": "Nguyên nhân: \"{{ cause }}\"", + "admin.access-control.groups.form.notification.deleted.failure.title": "Xóa không thành công nhóm người dùng \"{{ name }}\"", + "admin.access-control.groups.form.notification.deleted.success": "Xóa thành công nhóm người dùng \"{{ name }}\"", + "admin.access-control.groups.form.notification.edited.failure": "Chỉnh sửa không thành công nhóm người dùng \"{{name}}\"", + "admin.access-control.groups.form.notification.edited.failure.groupNameInUse": "Tên \"{{name}}\" đã được sử dụng!\"", + "admin.access-control.groups.form.notification.edited.success": "Chỉnh sửa thành công nhóm người dùng \"{{name}}\"", + "admin.access-control.groups.form.return": "Quay lại", + "admin.access-control.groups.form.subgroups-list.button.see-all": "Duyệt toàn bộ", + "admin.access-control.groups.form.subgroups-list.head": "Nhóm người dùng", + "admin.access-control.groups.form.subgroups-list.headSubgroups": "Nhóm người dùng con hiện tại", + "admin.access-control.groups.form.subgroups-list.no-items": "Không tìm thấy nhóm nào có tên hoặc UUID như vậy", + "admin.access-control.groups.form.subgroups-list.no-subgroups-yet": "Chưa có nhóm người dùng con nào trong nhóm.", + "admin.access-control.groups.form.subgroups-list.notification.failure": "Đã xảy ra sự cố: \"{{cause}}\"", + "admin.access-control.groups.form.subgroups-list.notification.failure.addSubgroup": "Thêm không thành công nhóm người dùng con: \"{{name}}\"", + "admin.access-control.groups.form.subgroups-list.notification.failure.deleteSubgroup": "Xóa không thành công nhóm người dùng con: \"{{name}}\"", + "admin.access-control.groups.form.subgroups-list.notification.failure.noActiveGroup": "Hiện tại không có nhóm hoạt động gửi một tên trước.", + "admin.access-control.groups.form.subgroups-list.notification.failure.subgroupToAddIsActiveGroup": "Đây là nhóm hiện tại không thể thêm được.", + "admin.access-control.groups.form.subgroups-list.notification.success.addSubgroup": "Thêm thành công nhóm người dùng con: \"{{name}}\"", + "admin.access-control.groups.form.subgroups-list.notification.success.deleteSubgroup": "Loại bỏ thành công nhóm người dùng: \"{{name}}\" ra khỏi nhóm", + "admin.access-control.groups.form.subgroups-list.search.button": "Tìm kiếm", + "admin.access-control.groups.form.subgroups-list.search.head": "Thêm nhóm người dùng con", + "admin.access-control.groups.form.subgroups-list.table.collectionOrCommunity": "Đơn vị\/ Bộ sưu tập", + "admin.access-control.groups.form.subgroups-list.table.edit": "Loại bỏ \/ Thêm", + "admin.access-control.groups.form.subgroups-list.table.edit.buttons.add": "Thêm nhóm người dùng con với tên \"{{name}}\"", + "admin.access-control.groups.form.subgroups-list.table.edit.buttons.remove": "Loại bỏ nhóm người dùng con với tên \"{{name}}\"", + "admin.access-control.groups.form.subgroups-list.table.edit.currentGroup": "Nhóm người dùng hiện tại", + "admin.access-control.groups.form.subgroups-list.table.id": "ID", + "admin.access-control.groups.form.subgroups-list.table.name": "Tên", + "admin.access-control.groups.head": "Nhóm người dùng", + "admin.access-control.groups.no-items": "Không tìm thấy nhóm nào có tên hoặc UUID như vậy", + "admin.access-control.groups.notification.deleted.failure.content": "Nguyên nhân: \"{{cause}}\"", + "admin.access-control.groups.notification.deleted.failure.title": "Xóa không thành công nhóm \"{{name}}\"", + "admin.access-control.groups.notification.deleted.success": "Xóa thành công nhóm \"{{name}}\"", + "admin.access-control.groups.search.button": "Tìm kiếm", + "admin.access-control.groups.search.head": "Tìm kiếm nhóm người dùng", + "admin.access-control.groups.search.placeholder": "Tìm kiếm nhóm người dùng...", + "admin.access-control.groups.singleGroup.breadcrumbs": "Chỉnh sửa nhóm người dùng", + "admin.access-control.groups.table.collectionOrCommunity": "Đơn vị\/ Bộ sưu tập", + "admin.access-control.groups.table.edit": "Chỉnh sửa", + "admin.access-control.groups.table.edit.buttons.edit": "Chỉnh sửa \"{{name}}\"", + "admin.access-control.groups.table.edit.buttons.remove": "Xóa \"{{name}}\"", + "admin.access-control.groups.table.id": "ID", + "admin.access-control.groups.table.members": "Thành viên", + "admin.access-control.groups.table.name": "Tên", + "admin.access-control.groups.title": "Nhóm người dùng", + "admin.access-control.groups.title.addGroup": "Tạo nhóm người dùng", + "admin.access-control.groups.title.singleGroup": "Chỉnh sửa nhóm người dùng", + + "admin.search.breadcrumbs": "Tìm kiếm quản trị", + "admin.search.collection.edit": "Chỉnh sửa", + "admin.search.community.edit": "Chỉnh sửa", + "admin.search.item.delete": "Xóa", + "admin.search.item.edit": "Chỉnh sửa", + "admin.search.item.make-private": "Đặt làm tài liệu cá nhân", + "admin.search.item.make-public": "Đặt làm tài liệu công cộng", + "admin.search.item.move": "Di chuyển", + "admin.search.item.reinstate": "Khôi phục", + "admin.search.item.withdraw": "Ẩn", + "admin.search.title": "Tìm kiếm quản trị", + + "administrativeView.search.results.head": "Tìm kiếm quản trị", + + "admin.workflow.breadcrumbs": "Quản trị luồng công việc", + "admin.workflow.title": "Quản trị luồng công việc", + "admin.workflow.item.workflow": "Luồng công việc", + "admin.workflow.item.workspace": "Workspace", + "admin.workflow.item.delete": "Xóa", + "admin.workflow.item.send-back": "Gửi trở lại", + "admin.workflow.item.policies": "Policies", + "admin.workflow.item.supervision": "Supervision", + + "admin.batch-import.breadcrumbs": "Nhập dữ liệu theo lô", + "admin.batch-import.page.dropMsg": "Kéo thả file ZIP để nhập vào", + "admin.batch-import.page.dropMsgReplace": "Kéo thả để thay thế file ZIP cần nhập vào", + "admin.batch-import.page.error.addFile": "Chọn file Zip đầu tiên!", + "admin.batch-import.page.header": "Nhập dữ liệu theo lô", + "admin.batch-import.page.help": "Chọn Bộ sưu tập để nhập dữ liệu. Sau đó kéo thả hoặc duyệt tới tệp tin định dạng zip có chứa các tài liệu cần nhập vào.", + "admin.batch-import.page.remove": "xóa", + "admin.batch-import.title": "Nhập dữ liệu theo lô", + "admin.batch-import.page.validateOnly.hint": "Nếu chọn tùy chọn \"Kiểm tra file ZIP tải lên\", hệ thống sẽ chạy một tiến trình kiểm tra việc nhập dữ liệu theo lô thay vì đổ trực tiếp dữ liệu lên hệ thống. Việc này giúp cán bộ xác nhận lại kết quả của quy trình nhập trước khi nhập dữ liệu chính thức. Bỏ chọn tùy chọn này để đổ lô tài liệu lên hệ thống.", + + "admin.metadata-import.breadcrumbs": "Nhập thông tin mô tả", + "admin.metadata-import.page.button.proceed": "Tiếp tục", + "admin.metadata-import.page.button.return": "Quay lại", + "admin.metadata-import.page.button.select-collection": "Chọn Bộ sưu tập", + "admin.metadata-import.page.dropMsg": "Thả một tệp CSV để nhập thông tin mô tả", + "admin.metadata-import.page.dropMsgReplace": "Thả một tệp CSV để nhập thông tin mô tả thay thế", + "admin.metadata-import.page.error.addFile": "Lựa chọn tệp trước!", + "admin.metadata-import.page.header": "Nhập thông tin mô tả", + "admin.metadata-import.page.help": "Bạn có thể thả hoặc duyệt tới tệp CSV chứa hàng loạt các thông tin mô tả tại đây", + "admin.metadata-import.page.validateOnly": "Kiểm tra nhập lô siêu dữ liệu", + "admin.metadata-import.page.validateOnly.hint": "Nếu chọn tùy chọn \"Kiểm tra nhập lô siêu dữ liệu\", hệ thống sẽ chạy một tiến trình kiểm tra nhập lô siêu dữ liệu thay vì đổ trực tiếp dữ liệu lên hệ thống. Bỏ chọn tùy chọn này để tiến hành nhập dữ liệu chính thức.", + "admin.metadata-import.title": "Nhập thông tin mô tả", + + "advanced-workflow-action.rating.form.rating.label": "Xếp hạng", + "advanced-workflow-action.rating.form.rating.error": "Bạn phải đánh giá tài liệu/ thực thế này", + "advanced-workflow-action.rating.form.review.label": "Kiểm duyệt", + "advanced-workflow-action.rating.form.review.error": "Bạn phải nhập nội dung đánh giá để gửi bản xếp hạng này", + "advanced-workflow-action.rating.description": "Vui lòng chọn một xếp hạng bên dưới" + "advanced-workflow-action.rating.description-requiredDescription": "Vui lòng chọn xếp hạng bên dưới và thêm đánh giá", + "advanced-workflow-action.select-reviewer.description-single": "Vui lòng chọn một người kiểm duyệt dưới đây trước khi tải tài liệu lên", + "advanced-workflow-action.select-reviewer.description-multiple": "Vui lòng chọn một hoặc nhiều người kiểm duyệt dưới đây trước khi tải tài liệu lên", + "advanced-workflow-action-select-reviewer.groups.form.reviewers-list.head": "Người dùng", + "advanced-workflow-action-select-reviewer.groups.form.reviewers-list.search.head": "Thêm người dùng", + "advanced-workflow-action-select-reviewer.groups.form.reviewers-list.button.see-all": "Duyệt tất cả", + "advanced-workflow-action-select-reviewer.groups.form.reviewers-list.headMembers": "Các thành viên hiện tại", + "advanced-workflow-action-select-reviewer.groups.form.reviewers-list.search.scope.metadata": "Siêu dữ liệu", + "advanced-workflow-action-select-reviewer.groups.form.reviewers-list.search.scope.email": "E-mail (exact)", + "advanced-workflow-action-select-reviewer.groups.form.reviewers-list.search.button": "Tìm kiếm", + "advanced-workflow-action-select-reviewer.groups.form.reviewers-list.table.id": "ID", + "advanced-workflow-action-select-reviewer.groups.form.reviewers-list.table.name": "Name", + "advanced-workflow-action-select-reviewer.groups.form.reviewers-list.table.identity": "Identity", + "advanced-workflow-action-select-reviewer.groups.form.reviewers-list.table.email": "Email", + "advanced-workflow-action-select-reviewer.groups.form.reviewers-list.table.netid": "NetID", + "advanced-workflow-action-select-reviewer.groups.form.reviewers-list.table.edit": "Loại bỏ / Thêm", + "advanced-workflow-action-select-reviewer.groups.form.reviewers-list.table.edit.buttons.remove": "Loại bỏ người dùng \"{{name}}\"", + "advanced-workflow-action-select-reviewer.groups.form.reviewers-list.notification.success.addMember": "Thêm thành công thành viên: \"{{name}}\"", + "advanced-workflow-action-select-reviewer.groups.form.reviewers-list.notification.failure.addMember": "Không thể thêm thành viên: \"{{name}}\"", + "advanced-workflow-action-select-reviewer.groups.form.reviewers-list.notification.success.deleteMember": "Xóa thành công thành viên: \"{{name}}\"", + "advanced-workflow-action-select-reviewer.groups.form.reviewers-list.notification.failure.deleteMember": "Không thể xóa thành viên: \"{{name}}\"", + "advanced-workflow-action-select-reviewer.groups.form.reviewers-list.table.edit.buttons.add": "Thêm thành viên \"{{name}}\"", + "advanced-workflow-action-select-reviewer.groups.form.reviewers-list.notification.failure.noActiveGroup": "Không có nhóm hoạt động, gửi tên trước.", + "advanced-workflow-action-select-reviewer.groups.form.reviewers-list.no-members-yet": "Chưa có thành viên nào trong nhóm, tìm kiếm để thêm.", + "advanced-workflow-action-select-reviewer.groups.form.reviewers-list.no-items": "Không tìm thấy người dùng", + "advanced-workflow-action.select-reviewer.no-reviewer-selected.error": "Không có người kiểm duyệt nào được chọn.", + + "auth.errors.invalid-user": "Địa chỉ email hoặc mật khẩu không hợp lệ.", + + "auth.messages.expired": "Phiên của bạn đã hết hạn. Xin vui lòng đăng nhập lại.", + "auth.messages.token-refresh-failed": "Làm mới mã token phiên làm việc của bạn không thành công. Vui lòng đăng nhập lại.", + + "bitstream.download.page": "Đang tải xuống {{bitstream}}... ", + "bitstream.download.page.back": "Quay lại", + + "bitstream.edit.authorizations.link": "Chỉnh sửa chính sách của tệp tin", + "bitstream.edit.authorizations.title": "Chỉnh sửa chính sách của tệp tin", + "bitstream.edit.bitstream": "Tệp tin:", + "bitstream.edit.form.description.hint": "Tùy chọn cung cấp mô tả ngắn gọn về tệp ví dụ \"Bài báo chính\" or \"Dữ liệu đọc thử nghiệm\".", + "bitstream.edit.form.description.label": "Mô tả", + "bitstream.edit.form.embargo.hint": "Ngày đầu tiên được phép truy cập. Ngày này không thể được chỉnh sửa trên biểu mẫu này. Để thiết lập một ngày ngừng phục vụ tệp tin này đi tới thẻ Trạng thái tài liệu nhấp Phân quyền... tạo hoặc chỉnh sửa quyền ĐỌC của tệp tin và thiết lập Ngày bắt đầu như mong muốn.", + "bitstream.edit.form.embargo.label": "Ngừng phục vụ cho tới ngày", + "bitstream.edit.form.fileName.hint": "Thay đổi tên tệp cho tệp tin. Lưu ý rằng điều này sẽ thay đổi hiển thị URL tệp tin nhưng các liên kết cũ sẽ vẫn phân giải miễn là ID trình tự không thay đổi.", + "bitstream.edit.form.fileName.label": "Tên tệp", + "bitstream.edit.form.iiifHeight.hint": "Chiều cao của khung thường phải khớp với chiều cao của hình ảnh", + "bitstream.edit.form.iiifHeight.label": "Chiều cao ảnh", + "bitstream.edit.form.iiifLabel.hint": "Tên cho hình ảnh này. Nếu không được cung cấp tên mặc định sẽ được sử dụng.", + "bitstream.edit.form.iiifLabel.label": "Tên", + "bitstream.edit.form.iiifToc.hint": "Thêm mục lục mới", + "bitstream.edit.form.iiifToc.label": "Mục lục", + "bitstream.edit.form.iiifWidth.hint": "Chiều rộng của khung thường phải khớp với chiều rộng của hình", + "bitstream.edit.form.iiifWidth.label": "Chiều rộng khung", + "bitstream.edit.form.newFormat.hint": "Ứng dụng bạn đã sử dụng để tạo tệp và thông tin phiên bản (ví dụ \"ACMESoft SuperApp phiên bản 1.5\").", + "bitstream.edit.form.newFormat.label": "Mô tả định dạng mới", + "bitstream.edit.form.primaryBitstream.label": "Tệp tin chính", + "bitstream.edit.form.selectedFormat.hint": "Nếu định dạng không có trong danh sách trên chọn \"định dạng không có trong danh sách\" trên và mô tả nó dưới mục\"Mô tả định dạng mới\".", + "bitstream.edit.form.selectedFormat.label": "Định dạng đã chọn", + "bitstream.edit.form.selectedFormat.unknown": "Định dạng không có trong danh sách", + "bitstream.edit.notifications.error.format.title": "Đã xảy ra lỗi khi lưu định dạng của tệp tin", + "bitstream.edit.notifications.saved.content": "Thay đổi của bạn đối với tệp tin đã được lưu.", + "bitstream.edit.notifications.saved.title": "Đã lưu tệp tin", + "bitstream.edit.return": "Quay lại", + "bitstream.edit.title": "Chỉnh sửa tệp tin", + + "bitstream-request-a-copy.alert.canDownload1": "Bạn đã có quyền truy cập tệp tin này. Nếu muốn tải tệp tin click ", + "bitstream-request-a-copy.alert.canDownload2": "vào đây", + "bitstream-request-a-copy.allfiles.label": "Các tệp tin", + "bitstream-request-a-copy.email.error": "Vui lòng nhập một địa chỉ email hợp lệ.", + "bitstream-request-a-copy.email.hint": "Địa chỉ email này đã được sử dụng để gửi tệp tin.", + "bitstream-request-a-copy.email.label": "Địa chỉ email của bạn *", + "bitstream-request-a-copy.files-all-false.label": "Chỉ tệp tin được yêu cầu", + "bitstream-request-a-copy.files-all-true.label": "Tất cả tệp tin của tài liệu này đều bị hạn chế quyền truy cập", + "bitstream-request-a-copy.header": "Yêu cầu bản sao", + "bitstream-request-a-copy.intro": "Nhập các thông tin dưới đây để yêu cầu bản sao của tài liệu:", + "bitstream-request-a-copy.intro.bitstream.all": "Yêu cầu tất cả các tệp tin.", + "bitstream-request-a-copy.intro.bitstream.one": "Yêu cầu các tệp tin sau:", + "bitstream-request-a-copy.message.label": "Tin nhắn", + "bitstream-request-a-copy.name.error": "Tên là bắt buộc", + "bitstream-request-a-copy.name.label": "Tên*", + "bitstream-request-a-copy.return": "Quay lại", + "bitstream-request-a-copy.submit": "Yêu cầu bản sao", + "bitstream-request-a-copy.submit.error": "Đã xảy ra lỗi trong quá trình gửi yêu cầu tài liệu.", + "bitstream-request-a-copy.submit.success": "Yêu cầu tài liệu đã được gửi thành công.", + + "browse.back.all-results": "Tất cả kết quả", + + "browse.comcol.by.author": "Tác giả", + "browse.comcol.by.dateissued": "Năm xuất bản", + "browse.comcol.by.subject": "Chủ đề", + "browse.comcol.by.title": "Nhan đề", + "browse.comcol.head": "Duyệt", + + "browse.empty": "Không có tài liệu nào để hiển thị.", + + "browse.metadata.author": "Tác giả", + "browse.metadata.author.breadcrumbs": "Duyệt theo tác giả", + "browse.metadata.dateissued": "Năm xuất bản", + "browse.metadata.dateissued.breadcrumbs": "Duyệt theo năm xuất bản", + "browse.metadata.subject": "Chủ đề", + "browse.metadata.subject.breadcrumbs": "Duyệt theo chủ đề", + "browse.metadata.title": "Nhan đề", + "browse.metadata.title.breadcrumbs": "Duyệt theo nhan đề", + "browse.metadata.topic": "Topic", + "browse.metadata.type": "Kiểu tài liệu", + + "pagination.next.button": "Tiếp theo", + "pagination.previous.button": "Quay lại", + "pagination.next.button.disabled.tooltip": "Không còn trang kết quả khác", + + "browse.startsWith.choose_year.label": "Chọn năm xuất bản", + "browse.startsWith.choose_year": "(Năm)", + "browse.startsWith.jump": "Chuyển tới một điểm trong chỉ mục:", + "browse.startsWith.months.april": "Tháng Tư", + "browse.startsWith.months.august": "Tháng Tám", + "browse.startsWith.months.december": "Tháng Mười hai", + "browse.startsWith.months.february": "Tháng Hai", + "browse.startsWith.months.january": "Tháng Một", + "browse.startsWith.months.july": "Tháng Bảy", + "browse.startsWith.months.june": "Tháng Sáu", + "browse.startsWith.months.march": "Tháng Ba", + "browse.startsWith.months.may": "Tháng Năm", + "browse.startsWith.months.none.label": "Chọn tháng xuất bản", + "browse.startsWith.months.none": "(Tháng)", + "browse.startsWith.months.november": "Tháng Mười một", + "browse.startsWith.months.october": "Tháng Mười", + "browse.startsWith.months.september": "Tháng Chín", + "browse.startsWith.submit": "Duyệt", + "browse.startsWith.type_date": "Hoặc nhập một ngày (năm-tháng) và nhấp \"Duyệt\"", + "browse.startsWith.type_date.label": "Hoặc nhập một ngày (năm-tháng) à nhấp Duyệt", + "browse.startsWith.type_text": "Nhập một vài ký tự đầu tiên và nhấp vào nút Duyệt", + + "browse.title": "Duyệt {{ collection }} theo {{ field }}{{ startsWith }} {{ value }}", + "browse.title.page": "Duyệt {{ collection }} theo {{ field }} {{ value }}", + + "search.browse.item-back": "Quay lại kết quả tìm kiếm", + + "chips.remove": "Loại bỏ chip", + + "claimed-approved-search-result-list-element.title": "Chấp nhận", + "claimed-declined-search-result-list-element.title": "Đã bị từ chối, đã gửi lại cho người nhập liệu", + "claimed-declined-task-search-result-list-element.title": "Bị từ chối, đã gửi lại tới người quản lý kiểm duyệt", + + "collection.create.head": "Tạo một Bộ sưu tập", + "collection.create.notifications.success": "Tạo bộ sưu tập thành công", + "collection.create.sub-head": "Tạo một bộ sưu tập cho đơnn vị {{ parent }}", + "collection.curate.header": "Kiểm tra bộ sưu tập: {{collection}}", + "collection.delete.cancel": "Hủy", + "collection.delete.confirm": "Xác nhận", + "collection.delete.head": "Xóa bộ sưu tập", + "collection.delete.notification.fail": "Không thể xóa bộ sưu tập", + "collection.delete.notification.success": "Xóa bộ sưu tập thành công", + "collection.delete.processing": "Đang xóa", + "collection.delete.text": "Bạn có chắc chắn rằng bạn muốn xóa bộ sưu tập \"{{ dso }}\"", + "collection.edit.breadcrumbs": "Chỉnh sửa bộ sưu tập", + "collection.edit.delete": "Xóa bộ sưu tập này", + "collection.edit.head": "Chỉnh sửa bộ sưu tập", + "collection.edit.item.authorizations.load-bundle-button": "Hiển thị thêm các nhóm khác", + "collection.edit.item.authorizations.load-more-button": "Hiển thị thêm", + "collection.edit.item.authorizations.show-bitstreams-button": "Hiển thị chính sách phân quyền tệp tin đối với nhóm", + "collection.edit.item-mapper.cancel": "Hủy", + "collection.edit.item-mapper.collection": "Bộ sưu tập: \"{{name}}\"", + "collection.edit.item-mapper.confirm": "Ánh xạ những tài liệu đã chọn", + "collection.edit.item-mapper.description": "Đây là công cụ liên kết tài liệu cho phép người quản trị bộ sưu tập liên kết các tài liệu từ các bộ sưu tập khác vào bộ sưu tập này. Bạn có thể tìm kiếm các tài liệu từ các bộ sưu tập khác và liên kết chúng hoặc duyệt qua danh sách các tài liệu hiện đã được liên kết.", + "collection.edit.item-mapper.head": "Liên kết tài liệu - Liên kết tài liệu tới bộ sưu tập khác", + "collection.edit.item-mapper.no-search": "Vui lòng nhập truy vấn để tìm kiếm", + "collection.edit.item-mapper.notifications.map.error.content": "Đã xảy ra lỗi khi liên kết{{amount}} tài liệu.", + "collection.edit.item-mapper.notifications.map.error.head": "Lỗi liên kết", + "collection.edit.item-mapper.notifications.map.success.content": "Ánh xạ thành công {{amount}} tài liệu.", + "collection.edit.item-mapper.notifications.map.success.head": "Ánh xạ được hoàn thành", + "collection.edit.item-mapper.notifications.unmap.error.content": "Đã xảy ra lỗi khi loại bỏ các liên kết của {{amount}} tài liệu.", + "collection.edit.item-mapper.notifications.unmap.error.head": "Lỗi loại bỏ liên kết", + "collection.edit.item-mapper.notifications.unmap.success.content": "Loại bỏ thành công các liên kết của {{amount}} tài liệu.", + "collection.edit.item-mapper.notifications.unmap.success.head": "Hoàn thành loại bỏ liên kết", + "collection.edit.item-mapper.remove": "Loại bỏ các liên kết của tài liệu được chọn", + "collection.edit.item-mapper.search-form.placeholder": "Tìm kiếm tài liệu...", + "collection.edit.item-mapper.tabs.browse": "Duyệt các tài liệu được liên kết", + "collection.edit.item-mapper.tabs.map": "Liên kết tài liệu mới", + "collection.edit.logo.delete.title": "Xóa logo", + "collection.edit.logo.delete-undo.title": "Hoàn tác xóa", + "collection.edit.logo.label": "Logo bộ sưu tập", + "collection.edit.logo.notifications.add.error": "Tải lên không thành công logo bộ sưu tập. Vui lòng kiểm tra nội dung trước khi thử lại.", + "collection.edit.logo.notifications.add.success": "Tài thành công logo bộ sưu tập.", + "collection.edit.logo.notifications.delete.error.title": "Lỗi khi xóa logo", + "collection.edit.logo.notifications.delete.success.content": "Xóa thành công logo của bộ sưu tập", + "collection.edit.logo.notifications.delete.success.title": "Logo đã được xóa", + "collection.edit.logo.upload": "Thả một logo bộ sưu tập để tải lên", + "collection.edit.notifications.success": "Chỉnh sửa thành công bộ sưu tập", + "collection.edit.return": "Quay lại", + "collection.edit.tabs.authorizations.head": "Phân quyền", + "collection.edit.tabs.authorizations.title": "Chỉnh sửa bộ sưu tập - Phân quyền", + "collection.edit.tabs.curate.head": "Kiểm tra", + "collection.edit.tabs.curate.title": "Chỉnh sửa bộ sưu tập - Kiểm tra", + "collection.edit.tabs.item-mapper.title": "Chỉnh sửa bộ sưu tập - Liên kết tài liệu", + "collection.edit.tabs.mapper.head": "Liên kết tài liệu", + "collection.edit.tabs.metadata.head": "Chỉnh sửa thông tin mô tả", + "collection.edit.tabs.metadata.title": "Chỉnh sửa bộ sưu tập - Siêu dữ liệu", + "collection.edit.tabs.roles.head": "Gán quyền", + "collection.edit.tabs.roles.title": "Chỉnh sửa bộ sưu tập - Vai trò", + "collection.edit.tabs.source.external": "Bộ sưu tập này thu thập nội dung từ một nguồn bên ngoài", + "collection.edit.tabs.source.form.errors.oaiSource.required": "Bạn phải cung cấp một bộ id của bộ sưu tập đích.", + "collection.edit.tabs.source.form.harvestType": "Nội dung đang được thu thập", + "collection.edit.tabs.source.form.head": "Cấu hình nguồn bên ngoài", + "collection.edit.tabs.source.form.metadataConfigId": "Định dạng thông tin mô tả", + "collection.edit.tabs.source.form.oaiSetId": "ID của bộ OAI", + "collection.edit.tabs.source.form.oaiSource": "Nhà cung cấp OAI", + "collection.edit.tabs.source.form.options.harvestType.METADATA_AND_BITSTREAMS": "Thu thập thông tin mô tả và tệp tin (yêu cầu hỗ trợ ORE)", + "collection.edit.tabs.source.form.options.harvestType.METADATA_AND_REF": "Thu thập thông tin mô tả và tham chiếu đến tệp tin (yêu cầu hỗ trợ ORE)", + "collection.edit.tabs.source.form.options.harvestType.METADATA_ONLY": "Chỉ thu thập thông tin mô tả", + "collection.edit.tabs.source.head": "Nguồn nội dung", + "collection.edit.tabs.source.notifications.discarded.content": "Các thay đổi của bạn đã bị hủy. Để khôi phục các thay đổi hãy nhấp vào nút 'Hoàn tác'", + "collection.edit.tabs.source.notifications.discarded.title": "Các thay đổi đã bị hủy", + "collection.edit.tabs.source.notifications.invalid.content": "Các thay đổi chưa được lưu. Hãy đảm bảo rằng tất cả các trường đều hợp lệ trước khi lưu.", + "collection.edit.tabs.source.notifications.invalid.title": "Siêu dữ liệu không hợp lệ", + "collection.edit.tabs.source.notifications.saved.content": "Các thay đổi của bạn đối với nguồn nội dung của bộ sưu tập này đã được lưu.", + "collection.edit.tabs.source.notifications.saved.title": "Nguồn nội dung đã được lưu", + "collection.edit.tabs.source.title": "Chỉnh sửa bộ sưu tập - Nguồn nội dung", + "collection.edit.template.add-button": "Thêm", + "collection.edit.template.breadcrumbs": "Khung mẫu tài liệu", + "collection.edit.template.cancel": "Hủy", + "collection.edit.template.delete-button": "Xóa", + "collection.edit.template.edit-button": "Chỉnh sửa", + "collection.edit.template.error": "Đã xảy ra lỗi khi truy xuất khung mẫu tài liệu", + "collection.edit.template.head": "Chỉnh sửa khung mẫu tài liệu cho bộ sưu tập \"{{ collection }}\"", + "collection.edit.template.label": "Khung mẫu tài liệu", + "collection.edit.template.loading": "Đang tải khung mẫu tài liệu...", + "collection.edit.template.notifications.delete.error": "Xóa khung mẫu tài liệu không thành công", + "collection.edit.template.notifications.delete.success": "Xóa khung mẫu tài liệu thành công", + "collection.edit.template.title": "Chỉnh sửa khung mẫu tài liệu", + "collection.form.abstract": "Mô tả ngắn", + "collection.form.description": "Văn bản giới thiệu (HTML)", + "collection.form.entityType": "Loại thực thể", + "collection.form.errors.title.required": "Vui lòng nhập tên bộ sưu tập", + "collection.form.license": "Giấy phép", + "collection.form.provenance": "Nguồn gốc", + "collection.form.rights": "Bản quyền (HTML)", + "collection.form.tableofcontents": "Tin tức (HTML)", + "collection.form.title": "Tên", + "collection.listelement.badge": "Bộ sưu tập", + "collection.page.browse.recent.empty": "Không có biểu ghi nào để hiển thị", + "collection.page.browse.recent.head": "Những tài liệu tải lên gần đây", + "collection.page.edit": "Chỉnh sửa bộ sưu tập", + "collection.page.handle": "URL", + "collection.page.description.abstract": "Mô tả", + "collection.page.license": "Giấy phép", + "collection.page.news": "Tin tức", + "collection.select.confirm": "Xác nhận các mục đã chọn", + "collection.select.empty": "Không có bộ sưu tập nào để hiển thị", + "collection.select.table.title": "Nhan đề", + "collection.source.controls.harvest.last": "Lần thu thập trước:", + "collection.source.controls.harvest.message": "Thông tin thu thập:", + "collection.source.controls.harvest.no-information": "N\/A", + "collection.source.controls.harvest.start": "Thời gian bắt đầu thu thập:", + "collection.source.controls.harvest.status": "Trạng thái thu thập:", + "collection.source.controls.head": "Quản lý thu thập:", + "collection.source.controls.import.completed": "Quá trình nhập liệu đã hoàn thành", + "collection.source.controls.import.failed": "Xảy ra lỗi trong quá trình nhập dữ liệu", + "collection.source.controls.import.running": "Đang nhập dữ liệu…", + "collection.source.controls.import.submit": "Nhập ngay", + "collection.source.controls.import.submit.error": "Xảy ra sự cố khi bắt đầu quá trình nhập dữ liệu", + "collection.source.controls.import.submit.success": "Quá trình nhập liệu đã được bắt đầu thành công", + "collection.source.controls.reset.completed": "Quá trình thiết lập và nhập lại dữ liệu đã hoàn tất", + "collection.source.controls.reset.failed": "Xảy ra sự cố trong quá trình thiết lập và nhập lại dữ liệu", + "collection.source.controls.reset.running": "Đang thiết lập và nhập lại dữ liệu", + "collection.source.controls.reset.submit": "Thiết lập và nhập lại dữ liệu", + "collection.source.controls.reset.submit.error": "Đã xảy ra lỗi khi bắt đầu thiết lập và nhập lại dữ liệu", + "collection.source.controls.reset.submit.success": "Quá trình thiết lập và nhập lại dữ liệu đã được bắt đầu thành công", + "collection.source.controls.test.completed": "Tập lệnh để kiểm tra cài đặt đã kết thúc thành công", + "collection.source.controls.test.failed": "Tập lệnh để kiểm tra cài đặt không thành công", + "collection.source.controls.test.running": "Cấu hình thử nghiệm…", + "collection.source.controls.test.submit": "Cấu hình thử nghiệm", + "collection.source.controls.test.submit.error": "Đã xảy ra lỗi khi bắt đầu cài đặt thử nghiệm", + "collection.source.update.notifications.error.content": "Các cài đặt đã được kiểm tra và không hoạt động.", + "collection.source.update.notifications.error.title": "Lỗi máy chủ", + + "community.create.head": "Tạo đơn vị", + "community.create.notifications.success": "Tạo đơn vị thành công", + "community.create.sub-head": "Tạo một đơn vị con cho đơn vị {{ parent }}", + "community.curate.header": "Kiểm tra đơn vị: {{community}}", + "community.delete.cancel": "Hủy", + "community.delete.confirm": "Xác nhận", + "community.delete.head": "Xóa đơn vị", + "community.delete.notification.fail": "Không thể xóa đơn vị", + "community.delete.notification.success": "Xóa đơn vị thành công", + "community.delete.processing": "Đang xóa…", + "community.delete.text": "Bạn có chắc chắn muốn xóa đơn vị \"{{ dso }}\"", + "community.edit.breadcrumbs": "Chỉnh sửa đơn vị", + "community.edit.delete": "Xóa đơn vị này", + "community.edit.head": "Chỉnh sửa đơn vị", + "community.edit.logo.delete.title": "Xóa logo", + "community.edit.logo.delete-undo.title": "Hoàn tác xóa", + "community.edit.logo.label": "Logo đơn vị", + "community.edit.logo.notifications.add.error": "Tải lên không thành công thành công logo đơn vị. Vui lòng kiểm tra lại nội dung trước khi tải lại.", + "community.edit.logo.notifications.add.success": "Tài lên thành công logo đơn vị.", + "community.edit.logo.notifications.delete.error.title": "Lỗi khi xóa logo", + "community.edit.logo.notifications.delete.success.content": "Xóa thành công logo của đơn vị", + "community.edit.logo.notifications.delete.success.title": "Đã xóa logo", + "community.edit.logo.upload": "Thả một logo đơn vị để tải lên", + "community.edit.notifications.error": "Đã xảy ra lỗi khi chỉnh sửa đơn vị", + "community.edit.notifications.success": "Chỉnh sửa đơn vị thành công", + "community.edit.notifications.unauthorized": "Bạn không có quyền để thực hiện thay đổi này", + "community.edit.return": "Quay lại", + "community.edit.tabs.authorizations.head": "Phân quyền", + "community.edit.tabs.authorizations.title": "Chỉnh sửa đơn vị - Phân quyền", + "community.edit.tabs.curate.head": "Kiểm tra", + "community.edit.tabs.curate.title": "Chỉnh sửa đơn vị - Kiểm tra", + "community.edit.tabs.metadata.head": "Chỉnh sửa thông tin mô tả", + "community.edit.tabs.metadata.title": "Chỉnh sửa đơn vị - Siêu dữ liệu", + "community.edit.tabs.roles.head": "Gán quyền", + "community.edit.tabs.roles.title": "Chỉnh sửa đơn vị - Quyền", + "community.form.abstract": "Mô tả ngắn", + "community.form.description": "Văn bản giới thiệu (HTML)", + "community.form.errors.title.required": "Vui lòng nhập tên đơn vị", + "community.form.rights": "Thông tin bản quyền (HTML)", + "community.form.tableofcontents": "Tin tức (HTML)", + "community.form.title": "Tên", + "community.listelement.badge": "Đơn vị", + "community.page.edit": "Chỉnh sửa đơn vị", + "community.page.handle": "URL", + "community.page.license": "Giấy phép", + "community.page.news": "Tin tức", + "community.sub-collection-list.head": "Các bộ sưu tập của đơn vị này", + "community.sub-community-list.head": "Các đơn vị con của đơn vị này", + "communityList.breadcrumbs": "Danh sách đơn vị", + "communityList.showMore": "Hiển thị thêm", + "communityList.tabTitle": "Danh sách đơn vị", + "communityList.title": "Danh sách các đơn vị", + + "comcol-role.edit.bitstream_read.anonymous-group": "Quyền đọc được mặc định cho các tài liệu hiện được đặt cho nhóm người dùng ẩn danh.", + "comcol-role.edit.bitstream_read.description": "Người có quyền đọc tệp tin có khả năng tải các tệp tin về máy tính cá nhân để sử dụng", + "comcol-role.edit.bitstream_read.name": "Quyền đọc tệp tin mặc định", + "comcol-role.edit.collection-admin.description": "Quản trị viên bộ sưu tập quyết định người có thể tải tài liệu vào bộ sưu tập sửa thông tin mô tả của tài liệu (sau khi tải lên) và thêm (liên kết) tài liệu đã tồn tại từ bộ sưu tập khác (phụ thuộc phân quyền vào bộ sưu tập đó)", + "comcol-role.edit.collection-admin.name": "Quản trị", + "comcol-role.edit.community-admin.description": "Quản trị viên đơn vị có thể tạo đơn vị con hoặc bộ sưu tập và quản lý hoặc gán quyền quản lý cho những đơn vị con hoặc bộ sưu tập đó. Ngoài ra họ quyết định ai có thể tải các tài liệu vào bất kì bộ sưu tập nào chỉnh sửa thông tin thông tin mô tả của tài liệu (sau khi tải lên) và thêm (liên kết) các tài liệu đã tồn tại ở bộ sưu tập khác (phụ thuộc vào phân quyền)", + "comcol-role.edit.community-admin.name": "Quản trị", + "comcol-role.edit.create": "Tạo", + "comcol-role.edit.create.error.title": "Không tạo được nhóm có quyền '{{role }}'", + "comcol-role.edit.delete": "Xóa", + "comcol-role.edit.delete.error.title": "Không thể xóa nhóm có quyền '{{ role }}'", + "comcol-role.edit.editor.description": "Người biên tập có thể chỉnh sửa thông tin mô tả của tài liệu được tải lên, có thể chấp nhận hoặc từ chối tài liệu được tải lên.", + "comcol-role.edit.editor.name": "Người biên tập", + "comcol-role.edit.finaleditor.description": "Người biên tập cuối có thể chỉnh sửa thông tin mô tả của tài liệu được tải lên nhưng không thể từ chối tài liệu được tải lên.", + "comcol-role.edit.finaleditor.name": "Người biên tập cuối", + "comcol-role.edit.item_read.anonymous-group": "Quyền đọc được mặc định cho các tài liệu hiện được đặt cho nhóm người dùng ẩn danh.", + "comcol-role.edit.item_read.description": "Tài khoản người dùng và nhóm người dùng có thể đọc những tài liệu mới được tải lên bộ sưu tập này. Các thay đổi quyền này không có hiêu lực với những tài liệu đã được tải lên từ trước. Những tài liệu đã tồn tại trong hệ thống sẽ vẫn được xem bởi những người có quyền xem vào thời điểm chúng được bổ sung", + "comcol-role.edit.item_read.name": "Quyền đọc thông tin mô tả của tài liệu", + "comcol-role.edit.no-group": "Trống", + "comcol-role.edit.restrict": "Hạn chế", + "comcol-role.edit.reviewer.description": "Người kiểm duyệt có thể chấp nhận hoặc từ chối các tài liệu được tải lên. Tuy nhiên sẽ không thể chỉnh sửa thông tin mô tả của tài liệu.", + "comcol-role.edit.reviewer.name": "Người kiểm duyệt", + "comcol-role.edit.submitters.description": "Tài khoản người dùng và nhóm người dùng có quyền tải tài liệu mới vào bộ sưu tập này", + "comcol-role.edit.submitters.name": "Người tải lên", + + "community.form.abstract": "Mô tả ngắn", + "community.form.description": "Văn bản giới thiệu (HTML)", + "community.form.errors.title.required": "Vui lòng nhập tên đơn vị", + "community.form.rights": "Thông tin bản quyền (HTML)", + "community.form.tableofcontents": "Tin tức (HTML)", + "community.form.title": "Tên", + + "community.page.edit": "Chỉnh sửa đơn vị", + "community.page.handle": "URL", + "community.page.license": "Giấy phép", + "community.page.news": "Tin tức", + + "community.all-lists.head": "Đơn vị con và bộ sưu tập", + + "community.sub-collection-list.head": "Các bộ sưu tập của đơn vị này", + "community.sub-community-list.head": "Các đơn vị con của đơn vị này", + + "cookies.consent.accept-all": "Chấp thuận tất cả", + "cookies.consent.accept-selected": "Chấp nhận các mục đã chọn", + "cookies.consent.app.description.acknowledgement": "Bắt buộc để lưu sự xác nhận và đồng ý của bạn", + "cookies.consent.app.description.authentication": "Bắt buộc để đăng nhập", + "cookies.consent.app.description.google-analytics": "Cho phép chúng tôi theo dõi dữ liệu thống kê", + "cookies.consent.app.description.google-recaptcha": "Chúng tôi sử dụng dịch vụ google reCAPTCHA trong quá trình đăng ký và khôi phục mật khẩu", + "cookies.consent.app.description.preferences": "Bắt buộc để lưu tùy chọn của bạn", + "cookies.consent.app.disable-all.description": "Sử dụng nút chuyển này để bật hoặc tắt tất cả dịch vụ.", + "cookies.consent.app.disable-all.title": "Bật hoặc tắt tất cả dịch vụ", + "cookies.consent.app.opt-out.description": "Ứng dụng này đã được tải theo mặc định (nhưng bạn có thể chọn không tham gia)", + "cookies.consent.app.purpose": "mục đích", + "cookies.consent.app.required.description": "Ứng dụng này luôn được yêu cầu", + "cookies.consent.app.title.acknowledgement": "Sự xác nhận", + "cookies.consent.app.title.authentication": "Xác thực", + "cookies.consent.app.title.google-analytics": "Google Analytics", + "cookies.consent.app.title.google-recaptcha": "Google reCaptcha", + "cookies.consent.app.title.preferences": "Cài đặt cá nhân", + "cookies.consent.close": "Đóng", + "cookies.consent.content-modal.description": "Tại đây bạn có thể xem và tùy chỉnh thông tin mà chúng tôi thu thập được về bạn.", + "cookies.consent.content-modal.privacy-policy.name": "chính sách bảo mật", + "cookies.consent.content-modal.privacy-policy.text": "Để biết thêm vui lòng đọc {privacyPolicy} của chúng tôi.", + "cookies.consent.content-modal.service": "dịch vụ", + "cookies.consent.content-modal.services": "các dịch vụ", + "cookies.consent.content-modal.title": "Thông tin mà chúng tôi thu thập", + "cookies.consent.content-notice.description": "Chúng tôi thu thập và xử lý thông tin các nhân của bạn cho các mục đích sau: Xác thực các ưa thích xác nhận và thống kê.
Để biết thêm vui lòng đọc {privacyPolicy} của chúng tôi.", + "cookies.consent.content-notice.description.no-privacy": "Chúng tôi thu thập và xử lý thông tin cá nhân của bạn cho các mục đích sau: Xác thực Cài đặt cá nhân Xác nhận và Thống kê.", + "cookies.consent.content-notice.learnMore": "Tùy chỉnh", + "cookies.consent.content-notice.title": "Đồng ý sử dụng cookie", + "cookies.consent.decline": "Từ chối", + "cookies.consent.ok": "OK", + "cookies.consent.purpose.functional": "Chức năng", + "cookies.consent.purpose.registration-password-recovery": "Đăng ký và khôi phục mật khẩu", + "cookies.consent.purpose.sharing": "Chia sẻ", + "cookies.consent.purpose.statistical": "Thống kê", + "cookies.consent.save": "Lưu", + "cookies.consent.update": "Có 1 vài thay đổi từ lần ghé thăm cuối cùng của bạn vui lòng cập nhập sự đồng ý của bạn.", + + "curation-task.task.checklinks.label": "\"Kiểm tra các link trong thông tin mô tả\"", + "curation-task.task.citationpage.label": "Tạo trang trích dẫn", + "curation-task.task.noop.label": "NOOP", + "curation-task.task.profileformats.label": "Định dạng tệp tin", + "curation-task.task.register-doi.label": "Đăng ký DOI", + "curation-task.task.requiredmetadata.label": "Kiểm tra các trường dữ liệu bắt buộc", + "curation-task.task.translate.label": "Bộ dịch của Microsoft", + "curation-task.task.vscan.label": "Quét Virus", + + "curation.form.handle.hint": "Gợi ý: Nhập [your-handle-prefix]\/0 để chạy một tác vụ trên toàn bộ trang (chú ý rằng không phải tất cả tác vụ đều hỗ trợ khả năng này)", + "curation.form.handle.label": "Handle:", + "curation.form.submit": "Bắt đầu", + "curation.form.submit.error.content": "Đã có lỗi xảy ra khi cố gắng khởi động tác vụ kiểm tra.", + "curation.form.submit.error.head": "Việc chạy tác vụ kiểm tra đã thất bại", + "curation.form.submit.error.invalid-handle": "Không thể xác định định danh của đối tượng này", + "curation.form.submit.success.content": "Bạn sẽ được điều hướng đến trang phản hồi quy trình.", + "curation.form.submit.success.head": "Tác vụ kiểm tra đã khởi động thành công", + "curation.form.task-select.label": "Tác vụ:", + + "deny-request-copy.email.message": "Kính gửi {{ recipientName }}\n\nLiên quan đến yêu cầu của bạn Thư viện rất tiếc phải thông báo với bạn rằng chúng tôi không thể gửi cho bạn bản sao của (các) tệp bạn đã yêu cầu liên quan đến tài liệu: \"{{ itemUrl }}\" ({{ itemName }}).\n\nTrân trọng\n,{{ authorName}}<{{ authorEmail }}>", + "deny-request-copy.email.subject": "Yêu cầu bản sao tài liệu", + "deny-request-copy.error": "Đã xảy ra lỗi", + "deny-request-copy.header": "Từ chối yêu cầu bản sao tài liệu", + "deny-request-copy.intro": "Tin nhắn này sẽ được gửi đến người yêu cầu", + "deny-request-copy.success": "Từ chối thành công yêu cầu tài liệu", + + "dso.name.untitled": "Không có nhan đề", + + "dso-selector.claim.item.body": "Đây là những hồ sơ hiện có có thể liên quan đến bạn. Nếu bạn nhận ra mình ở một trong những hồ sơ này hãy chọn hồ sơ đó và trên trang chi tiết hãy chọn xác nhận hồ sơ. Nếu không bạn có thể tạo một hồ sơ mới từ đầu bằng cách sử dụng nút bên dưới.", + "dso-selector.claim.item.create-from-scratch": "Tạo hồ sơ mới", + "dso-selector.claim.item.head": "Mẹo quản lý hồ sơ", + "dso-selector.claim.item.not-mine-label": "Không có mục nào trong số này là của tôi", + "dso-selector.create.collection.head": "Bộ sưu tập mới", + "dso-selector.create.collection.sub-level": "Tạo một bộ sưu tập mới trong", + "dso-selector.create.community.head": "Đơn vị mới", + "dso-selector.create.community.or-divider": "hoặc", + "dso-selector.create.community.sub-level": "Tạo một đơn vị mới trong", + "dso-selector.create.community.top-level": "Tạo một đơn vị lớn", + "dso-selector.create.item.head": "Tài liệu mới", + "dso-selector.create.item.sub-level": "Tạo một tài liệu mới trong", + "dso-selector.create.submission.head": "Biên mục mới", + "dso-selector.create.topic.sub-level": "Tạo topic mới trong", + "dso-selector.create.topic.top-level": "Tạo topic lớn", + "dso-selector.edit.collection.head": "Chỉnh sửa bộ sưu tập", + "dso-selector.edit.community.head": "Chỉnh sửa đơn vị", + "dso-selector.edit.item.head": "Chỉnh sửa tài liệu", + "dso-selector.error.title": "Đã có lỗi xảy ra khi tìm kiếm kiểu tài liệu {{ type }}", + "dso-selector.export-batch.dspaceobject.head": "Xuất lô dữ liệu (định dạng file ZIP) từ", + "dso-selector.export-metadata.dspaceobject.head": "Xuất siêu dữ liệu từ", + "dso-selector.import-batch.dspaceobject.head": "Nhập lô dữ liệu từ", + "dso-selector.no-results": "Không tìm thấy kiểu {{ type }} nào", + "dso-selector.placeholder": "Tìm kiếm {{ type }}", + "dso-selector.results-could-not-be-retrieved": "Đã xảy ra lỗi vui lòng làm mới lại ↻", + "dso-selector.select.collection.head": "Chọn một bộ sưu tập", + "dso-selector.set-scope.community.button": "Tìm kiếm trên toàn hệ thống", + "dso-selector.set-scope.community.head": "Chọn một phạm vi tìm kiếm", + "dso-selector.set-scope.community.input-header": "Tìm kiếm một đơn vị hoặc bộ sưu tập", + "dso-selector.set-scope.community.or-divider": "hoặc", + + "supervision-group-selector.header": "Supervision Group Selector", + "supervision-group-selector.select.type-of-order.label": "Select a type of Order", + "supervision-group-selector.select.type-of-order.option.none": "NONE", + "supervision-group-selector.select.type-of-order.option.editor": "EDITOR", + "supervision-group-selector.select.type-of-order.option.observer": "OBSERVER", + "supervision-group-selector.select.group.label": "Select a Group", + "supervision-group-selector.button.cancel": "Cancel", + "supervision-group-selector.button.save": "Save", + "supervision-group-selector.select.type-of-order.error": "Please select a type of order", + "supervision-group-selector.select.group.error": "Please select a group", + "supervision-group-selector.notification.create.success.title": "Successfully created supervision order for group {{ name }}", + "supervision-group-selector.notification.create.failure.title": "Error", + "supervision-group-selector.notification.create.already-existing" : "A supervision order already exists on this item for selected group", + + "confirmation-modal.delete-eperson.cancel": "Hủy", + "confirmation-modal.delete-eperson.confirm": "Xóa", + "confirmation-modal.delete-eperson.header": "Xóa người dùng \"{{ dsoName }}\"", + "confirmation-modal.delete-eperson.info": "Bạn có chắc muốn xóa người dùng \"{{ dsoName }}\"", + "confirmation-modal.delete-profile.cancel": "Hủy", + "confirmation-modal.delete-profile.confirm": "Xóa", + "confirmation-modal.delete-profile.header": "Xóa hồ sơ", + "confirmation-modal.delete-profile.info": "Bạn có chắc chắn muốn xóa hồ sơ", + "confirmation-modal.export-batch.cancel": "Hủy", + "confirmation-modal.export-batch.confirm": "Xuất dữ liệu", + "confirmation-modal.export-batch.header": "Xuất lô dữ liệu (định dạng file ZIP) của tác giả {{ dsoName }}", + "confirmation-modal.export-batch.info": "Bạn có chắc chắn muốn xuất lô dữ liệu (định dạng file ZIP) của tác giả {{ dsoName }}", + "confirmation-modal.export-metadata.cancel": "Hủy", + "confirmation-modal.export-metadata.confirm": "Xuất dữ liệu", + "confirmation-modal.export-metadata.header": "Xuất thông tin mô tả tài liệu của đơn vị, bộ sưu tập {{ dsoName }}", + "confirmation-modal.export-metadata.info": "Bạn có chắc muốn xuất thông tin mô tả tài liệu của đơn vị, bộ sưu tập {{ dsoName }}", + "confirmation-modal.policies.cancel": "Hủy", + "confirmation-modal.policies.confirm": "Xác nhận", + "confirmation-modal.policies.header": "Chọn hướng phân quyền cho đối tượng đã di chuyển", + "confirmation-modal.policies.info": "Bạn muốn chọn hướng phân quyền cho đối tượng đã di chuyển", + "confirmation-modal.reset-password-eperson.cancel": "Hủy", + "confirmation-modal.reset-password-eperson.confirm": "Thiết lập lại mật khẩu", + "confirmation-modal.reset-password-eperson.info": "Bạn có chắc chắn muốn thiết lập lại mật khẩu cho người dùng \"{{ dsoName }}\"", + + "error.bitstream": "Lỗi tìm kiếm tệp tin", + "error.browse-by": "Lỗi tìm kiếm tài liệu", + "error.collection": "Lỗi tìm kiếm bộ sưu tập", + "error.collections": "Lỗi tìm kiếm bộ sưu tập", + "error.community": "Lỗi tìm kiếm đơn vị", + "error.default": "Lỗi", + "error.identifier": "Không tìm thấy tài liệu nào cho định danh này", + "error.invalid-search-query": "Truy vấn tìm kiếm không hợp lệ. Vui lòng kiểm tra
Cú pháp truy vấn Solr các phương pháp tốt nhất để biết thêm thông tin về lỗi này.", + "error.item": "Lỗi tìm kiếm tài liệu", + "error.items": "Lỗi tìm kiếm tài liệu", + "error.objects": "Lỗi tìm kiếm đối tượng", + "error.recent-submissions": "Lỗi tìm kiếm các tài liệu biên mục gần đây", + "error.search-results": "Lỗi tìm kiếm các kết quả tìm", + "error.sub-collections": "Lỗi tìm kiếm bộ sưu tập con", + "error.sub-communities": "Lỗi tìm kiếm đơn vị con", + "error.submission.sections.init-form-error": "Đã xảy ra lỗi khi khởi chạy các phần vui lòng kiểm tra cấu hình biểu mẫu đầu vào của bạn. Thông tin chi tiết ở bên dưới:

", + "error.top-level-communities": "Lỗi tìm kiếm đơn vị lớn", + "error.validation.emailTaken": "Email này đã được sử dụng", + "error.validation.filerequired": "Bắt buộc phải tải tệp tin lên", + "error.validation.groupExists": "Nhóm này đã tồn tại", + "error.validation.license.notgranted": "Bạn phải đồng ý với giấy phép này để hoàn thành tài liệu biên mục của mình. Nếu hiện tại bạn không thể đồng ý giấy phép này bạn có thể lưu tài liệu biên mục của mình và quay lại sau hoặc xóa nội dung đã biên mục.", + "error.validation.NotValidEmail": "Email này không hợp lệ", + "error.validation.pattern": "Đầu vào này bị giới hạn bởi mẫu hiện tại: {{ pattern }}.", + "error.validation.required": "Đây là trường bắt buộc", + "error-page.description.401": "không có quyền truy cập", + "error-page.description.403": "không được phép truy cập", + "error-page.description.404": "không tìm thấy trang", + "error-page.description.500": "Dịch vụ không sẵn sàng", + "error-page.orcid.generic-error": "Đã xảy ra lỗi khi đăng nhập qua ORCID. Make sure you have shared your ORCID account email address with DSpace. If the error persists contact the administrator", + + "feed.description": "Nguồn cấp dữ liệu tổng hợp", + + "file-section.error.header": "Lỗi khi lấy tệp cho tài liệu này", + + "footer.copyright": "bản quyền © 2002-{{ year }}", + "footer.link.cookies": "Cài đặt Cookie", + "footer.link.dspace": "Phần mềm thư viện số", + "footer.link.end-user-agreement": "Thỏa thuận bạn đọc", + "footer.link.feedback": "Gửi phản hồi", + "footer.link.lyrasis": "LYRASIS", + "footer.link.privacy-policy": "Chính sách riêng tư", + + "forgot-email.form.email": "Địa chỉ Email *", + "forgot-email.form.email.error.pattern": "Vui lòng nhập một địa chỉ email hợp lệ", + "forgot-email.form.email.error.required": "Vui lòng nhập địa chỉ email", + "forgot-email.form.email.hint": "Địa chỉ email này sẽ được xác nhận và sử dụng như là tên đăng nhập.", + "forgot-email.form.error.content": "Đã xảy ra lỗi khi đăng kí địa chỉ email sau: {{ email }}", + "forgot-email.form.error.head": "Đã xảy ra lỗi khi đăng kí email", + "forgot-email.form.header": "Quên mật khẩu", + "forgot-email.form.info": "Nhập địa chỉ email mà để đăng kí cập nhật thông tin tài liệu mới trong các bộ sưu tập qua email và biên mục tài liệu mới vào thư viện số.", + "forgot-email.form.submit": "Lưu", + "forgot-email.form.success.content": "Một email đã được gửi tới địa chỉ {{ email }} trong đó có chứa URL và các hướng dẫn chi tiết hơn.", + "forgot-email.form.success.head": "Email xác nhận đã được gửi tới bạn", + + "forgot-password.form.card.security": "Bảo mật", + "forgot-password.form.error.empty-password": "Vui lòng nhập mật khẩu mới trong ô dưới đây.", + "forgot-password.form.error.matching-passwords": "Hai mật khẩu không trùng khớp.", + "forgot-password.form.head": "Quên mật khẩu", + "forgot-password.form.identification.email": "Địa chỉ email:", + "forgot-password.form.identification.header": "Định danh", + "forgot-password.form.info": "Nhập mật khẩu mới trong ô dưới đây và xác nhận bằng cách nhập lại vào ô thứ hai. Mật khẩu nên chứa ít nhất 6 kí tự.", + "forgot-password.form.label.password": "Mật khẩu", + "forgot-password.form.label.passwordrepeat": "Nhập lại mật khẩu mới", + "forgot-password.form.notification.error.title": "Đã xảy ra lỗi khi gửi mật khẩu mới", + "forgot-password.form.notification.success.content": "Đã đặt lại mật khẩu thành công. Bạn đã được đăng nhập với tư cách là người dùng được tạo.", + "forgot-password.form.notification.success.title": "Hoàn thành đặt lại mật khẩu", + "forgot-password.form.submit": "Gửi mật khẩu", + "forgot-password.title": "Quên mật khẩu", + + "form.add": "Thêm", + "form.add-help": "Nhấp vào đây để thêm mục hiện tại và một mục khác", + "form.cancel": "Hủy", + "form.clear": "Xóa", + "form.clear-help": "Nhấp vào đây để xóa giá trị đã chọn", + "form.discard": "Hủy bỏ", + "form.drag": "Kéo", + "form.edit": "Chỉnh sửa", + "form.edit-help": "Nhấp vào đây để chỉnh sửa giá trị đã chọn", + "form.first-name": "Tên", + "form.group-collapse": "Thu hẹp", + "form.group-collapse-help": "Nhấp vào đây để thu hẹp", + "form.group-expand": "Mở rộng", + "form.group-expand-help": "Nhấp vào đây để mở rộng và thêm các yếu tố khác", + "form.last-name": "Họ", + "form.loading": "Đang tải...", + "form.lookup": "Tìm kiếm", + "form.lookup-help": "Nhấp vào đây để tìm kiếm mối liên hệ đang tồn tại", + "form.no-results": "Không tìm thấy kết quả phù hợp", + "form.no-value": "Không có giá trị nào được nhập vào", + "form.remove": "Xóa", + "form.repeatable.sort.tip": "Thả tài liệu vào vị trí mới", + "form.save": "Lưu", + "form.save-help": "Lưu thay đổi", + "form.search": "Tìm kiếm", + "form.search-help": "Nhấp vào đây để tìm kiếm thư từ đang tồn tại", + "form.submit": "Lưu", + + "grant-deny-request-copy.deny": "Không gửi bản sao", + "grant-deny-request-copy.email.back": "Quay lại", + "grant-deny-request-copy.email.message": "Tin nhắn", + "grant-deny-request-copy.email.message.empty": "Vui lòng nhập một tin nhắn", + "grant-deny-request-copy.email.permissions.info": "Bạn có thể nhân tiện dịp này để xem xét lại các hạn chế truy cập vào tài liệu để tránh phải trả lời các yêu cầu tương tự. Nếu bạn muốn yêu cầu quản trị hệ thống loại bỏ những hạn chế này vui lòng đánh dấu vào hộp bên dưới.", + "grant-deny-request-copy.email.permissions.label": "Chuyển thành truy cập mở", + "grant-deny-request-copy.email.send": "Gửi", + "grant-deny-request-copy.email.subject": "Chủ đề", + "grant-deny-request-copy.email.subject.empty": "Vui lòng nhập một chủ đề", + "grant-deny-request-copy.grant": "Gửi bản sao", + "grant-deny-request-copy.header": "Yêu cầu bản sao tài liệu", + "grant-deny-request-copy.home-page": "Đi tới trang chủ", + "grant-deny-request-copy.intro1": "Nếu bạn là một trong các tác giả của tài liệu {{ name }} vui lòng sử dụng một trong các tùy chọn dưới đây để phản hồi yêu cầu của bạn đọc.", + "grant-deny-request-copy.intro2": "Sau khi chọn một tùy chọn bạn sẽ thấy một email gợi ý trả lời mà bạn có thể chỉnh sửa.", + "grant-deny-request-copy.processed": "Yêu cầu này đã được xử lý. Bạn có thể sử dụng nút bên dưới để quay lại trang chủ.", + "grant-request-copy.email.message": "Dear {{ recipientName }}\n\nLiên quan đến yêu cầu của bạn Thư viện đồng ý gửi cho bạn bản sao của (các) tệp bạn đã yêu cầu liên quan đến tài liệu: \"{{ itemUrl }}\" ({{ itemName }}).\n\n\nTrân trọng\n\n{{ authorName }} <{{ authorEmail }}>\n", + "grant-request-copy.email.subject": "Yêu cầu bản sao tài liệu", + "grant-request-copy.error": "Đã xảy ra lỗi", + "grant-request-copy.header": "Chấp nhận yêu cầu bản sao tài liệu", + "grant-request-copy.intro": "Tin nhắn này sẽ được gửi đến người gửi yêu cầu. (Các) tài liệu được yêu cầu sẽ được gửi kèm tin nhắn.", + "grant-request-copy.success": "Yêu cầu tài liệu đã được xử lý thành công", + + "health.breadcrumbs": "Kiểm tra hệ thống", + "health-page.error.msg": "Dịch vụ kiểm tra hệ thống tạm thời không khả dụng", + "health-page.heading": "Kiểm tra hệ thống", + "health-page.info-tab": "Thông tin hệ thống", + "health-page.property.status": "Mã trạng thái", + "health-page.section.db.title": "Cơ sở dữ liệu", + "health-page.section.geoIp.title": "GeoIp", + "health-page.section.no-issues": "Không có vấn đề được phát hiện", + "health-page.section.solrAuthorityCore.title": "Solr: authority core", + "health-page.section.solrOaiCore.title": "Solr: oai core", + "health-page.section.solrSearchCore.title": "Solr: search core", + "health-page.section.solrStatisticsCore.title": "Solr: statistics core", + "health-page.section-info.app.title": "Ứng dụng Backend", + "health-page.section-info.java.title": "Java", + "health-page.status": "Trạng thái", + "health-page.status.error.info": "Các vấn đề được tìm thấy", + "health-page.status.ok.info": "Vận hành", + "health-page.status.warning.info": "Phát hiện các vấn đề có thể xảy ra", + "health-page.status-tab": "Trạng thái", + "health-page.title": "Kiểm tra hệ thống", + + "home.description": "", + "home.breadcrumbs": "Trang chủ", + "home.search-form.placeholder": "Tìm kiếm kho lưu trữ", + "home.title": "Trang chủ", + "home.top-level-communities.head": "Danh sách đơn vị trong DSpace", + "home.top-level-communities.help": "Chọn một đơn vị để xem các bộ sưu tập của nó.", + + "info.contact.breadcrumbs": "Thông tin liên hệ", + "info.contact.head": "Thông tin liên hệ", + "info.contact.title": "Thông tin liên hệ", + "info.end-user-agreement.accept": "Tôi đã đọc và đồng ý với Thỏa thuận bạn đọc", + "info.end-user-agreement.accept.error": "Đã xảy ra lỗi khi chấp nhận Thỏa thuận bạn đọc", + "info.end-user-agreement.accept.success": "Đã cập nhật thành công Thỏa thuận bạn đọc", + "info.end-user-agreement.breadcrumbs": "Thỏa thuận bạn đọc", + "info.end-user-agreement.buttons.cancel": "Hủy", + "info.end-user-agreement.buttons.save": "Lưu", + "info.end-user-agreement.head": "Thỏa thuận người dùng", + "info.end-user-agreement.title": "Thỏa thuận người dùng", + "info.feedback.breadcrumbs": "Phản hồi", + "info.feedback.comments": "Bình luận", + "info.feedback.create.success": "Gửi phản hồi thành công!", + "info.feedback.email_help": "Địa chỉ này sẽ được sử dụng để theo dõi phản hồi của bạn.", + "info.feedback.email-label": "Email", + "info.feedback.error.email.required": "Yêu cầu địa chỉ email hợp lệ", + "info.feedback.error.message.required": "Yêu cầu phải có nội dung bình luận", + "info.feedback.head": "Phản hồi", + "info.feedback.info": "Cảm ơn bạn đã chia sẽ phản hồi của mình tới Thư viện. Chúng tôi luôn trân trọng mọi ý kiến đóng góp của bạn!", + "info.feedback.page_help": "Trang liên kết với các phản hồi của bạn", + "info.feedback.page-label": "Trang", + "info.feedback.send": "Gửi phản hồi", + "info.feedback.title": "Phản hồi", + "info.help.head": "Trợ giúp", + "info.help.title": "Trợ giúp", + "info.privacy.breadcrumbs": "Cam kết bảo mật", + "info.privacy.head": "Cam kết bảo mật", + "info.privacy.title": "Cam kết bảo mật", + + "item.alerts.private": "Đây là tài liệu cá nhân", + "item.alerts.withdrawn": "Tài liệu này đã được chuyển sang chế độ ẩn", + "item.badge.private": "Cá nhân", + "item.badge.withdrawn": "Ẩn", + "item.bitstreams.upload.bundle": "Gói tệp tin", + "item.bitstreams.upload.bundle.new": "Tạo gói tệp tin", + "item.bitstreams.upload.bundle.placeholder": "Chọn một gói tệp tin", + "item.bitstreams.upload.bundles.empty": "Tài liệu này không có gói tệp tin nào để tải tệp tin vào.", + "item.bitstreams.upload.cancel": "Hủy", + "item.bitstreams.upload.drop-message": "Thả tệp tin để tài lên", + "item.bitstreams.upload.item": "Tài liệu:", + "item.bitstreams.upload.notifications.bundle.created.content": "Tạo thành công gói tệp tin.", + "item.bitstreams.upload.notifications.bundle.created.title": "Đã tạo gói tệp tin", + "item.bitstreams.upload.notifications.upload.failed": "Tải lên thất bại. Vui lòng xác minh nội dung sau trước khi thực hiện lại.", + "item.bitstreams.upload.title": "Tải tệp tin lên", + "item.edit.authorizations.heading": "Với trình chỉnh sửa này bạn có thể xem và chỉnh sửa chính sách phân quyền của một tài liệu (item) cũng như các thành phần của tài liệu đó như: gói tệp tin (bundle) và tệp tin (bitstream). Các tài liệu có thể chứa nhiều gói và mỗi gói có thể chứa nhiều tệp tin. Tài liệu và gói tệp tin thường có các quyền là THÊM\/XÓA\/ĐỌC\/CHỈNH SỬA còn tệp tin chỉ có quyền ĐỌC\/CHỈNH SỬA.", + "item.edit.authorizations.title": "Chỉnh sửa chính sách phân quyền của tài liệu", + "item.edit.bitstreams.bundle.displaying": "Đang hiển thị {{ amount }} trong số {{ total }} tệp tin.", + "item.edit.bitstreams.bundle.edit.buttons.upload": "Tải lên", + "item.edit.bitstreams.bundle.load.all": "Tải tất cả ({{ total }})", + "item.edit.bitstreams.bundle.load.more": "Xem thêm", + "item.edit.bitstreams.bundle.name": "GÓI TỆP TIN: {{ name }}", + "item.edit.bitstreams.discard-button": "Hủy bỏ", + "item.edit.bitstreams.edit.buttons.download": "Tải xuống", + "item.edit.bitstreams.edit.buttons.drag": "Kéo", + "item.edit.bitstreams.edit.buttons.edit": "Chỉnh sửa", + "item.edit.bitstreams.edit.buttons.remove": "Xóa", + "item.edit.bitstreams.edit.buttons.undo": "Hoàn tác", + "item.edit.bitstreams.empty": "Tài liệu này không chứa tệp tin nào. Hãy nhập vào nút tải lên để tải tệp tin.", + "item.edit.bitstreams.headers.actions": "Hành động", + "item.edit.bitstreams.headers.bundle": "Gói tệp tin", + "item.edit.bitstreams.headers.description": "Mô tả", + "item.edit.bitstreams.headers.format": "Định dạng", + "item.edit.bitstreams.headers.name": "Tên", + "item.edit.bitstreams.notifications.discarded.content": "Các thay đổi của bạn đã bị hủy. Để khôi phục các thay đổi của bạn hãy nhấp vào nút 'Hoàn tác'", + "item.edit.bitstreams.notifications.discarded.title": "Các thay đổi đã bị hủy", + "item.edit.bitstreams.notifications.move.failed.title": "Đã xảy ra lỗi khi di chuyển tệp tin", + "item.edit.bitstreams.notifications.move.saved.content": "Các di chuyển của bạn đối với tệp tin và gói tệp tin của tài liệu này đã được lưu lại.", + "item.edit.bitstreams.notifications.move.saved.title": "Di chuyển đã được lưu lại", + "item.edit.bitstreams.notifications.outdated.content": "Tài liệu bạn đang mở cũng đang được chỉnh sửa bởi một người dùng khác. Vì vậy các thay đổi của bạn đã bị hủy bỏ để tránh xảy ra xung đột.", + "item.edit.bitstreams.notifications.outdated.title": "Các thay đổi không có hiệu lực", + "item.edit.bitstreams.notifications.remove.failed.title": "Đã xảy ra lỗi khi xóa tệp tin", + "item.edit.bitstreams.notifications.remove.saved.content": "Các thay đổi liên quan tới việc xóa tệp tin của tài liệu này đã được lưu lại.", + "item.edit.bitstreams.notifications.remove.saved.title": "Việc xóa tệp tin đã được lưu lại", + "item.edit.bitstreams.reinstate-button": "Hoàn tác", + "item.edit.bitstreams.save-button": "Lưu", + "item.edit.bitstreams.upload-button": "Tải lên", + "item.edit.breadcrumbs": "Chỉnh sửa tài liệu", + "item.edit.delete.cancel": "Hủy", + "item.edit.delete.confirm": "Xóa", + "item.edit.delete.description": "Bạn có chắc chắn muốn xóa tài liệu này? Cẩn trọng: Hành động này sẽ xóa vĩnh viễn tài liệu và không thể khôi phục lại.", + "item.edit.delete.error": "Đã xảy ra lỗi trong khi xóa tài liệu này", + "item.edit.delete.header": "Xóa tài liệu: {{ id }}", + "item.edit.delete.success": "Tài liệu đã được xóa thành công", + "item.edit.head": "Chỉnh sửa tài liệu", + "item.edit.item-mapper.buttons.add": "Liên kết tài liệu tới các bộ sưu tập đã chọn", + "item.edit.item-mapper.buttons.remove": "Xóa liên kết tài liệu với các bộ sưu tập đã chọn", + "item.edit.item-mapper.cancel": "Hủy", + "item.edit.item-mapper.description": "Đây là công cụ liên kết tài liệu cho phép quản trị viên có thể liên kết tài liệu này với các bộ sưu tập khác. Bạn có thể tìm kiếm các bộ sưu tập và thực hiện liên kết hoặc xem danh sách các bộ sưu tập mà tài liệu hiện đang được liên kết tới.", + "item.edit.item-mapper.head": "Liên kết tài liệu - Liên kết tài liệu tới Bộ sưu tập khác", + "item.edit.item-mapper.item": "Tài liệu: \"{{name}}\"", + "item.edit.item-mapper.no-search": "Vui lòng nhập một truy vấn để tìm kiếm", + "item.edit.item-mapper.notifications.add.error.content": "Đã xảy ra lỗi khi liên kết tài liệu này tới {{amount}} bộ sưu tập.", + "item.edit.item-mapper.notifications.add.error.head": "Xảy ra lỗi khi liên kết", + "item.edit.item-mapper.notifications.add.success.content": "Đã liên kết thành công tài liệu này tới {{amount}} bộ sưu tập.", + "item.edit.item-mapper.notifications.add.success.head": "Hoàn thành liên kết tài liệu", + "item.edit.item-mapper.notifications.remove.error.content": "Đã xảy ra lỗi khi xóa liên kết của tài liệu với {{amount}} bộ sưu tập.", + "item.edit.item-mapper.notifications.remove.error.head": "Lỗi khi xóa liên kết tài liệu", + "item.edit.item-mapper.notifications.remove.success.content": "Đã xóa thành công liên kết giữa tài liệu với {{amount}} bộ sưu tập.", + "item.edit.item-mapper.notifications.remove.success.head": "Hoàn thành xóa liên kết tài liệu", + "item.edit.item-mapper.search-form.placeholder": "Tìm kiếm bộ sưu tập", + "item.edit.item-mapper.tabs.browse": "Xem các bộ sưu tập đã liên kết", + "item.edit.item-mapper.tabs.map": "Liên kết với các bộ sưu tập mới", + "item.edit.metadata.add-button": "Thêm", + "item.edit.metadata.discard-button": "Hủy bỏ", + "item.edit.metadata.edit.buttons.edit": "Chỉnh sửa", + "item.edit.metadata.edit.buttons.remove": "Xóa", + "item.edit.metadata.edit.buttons.undo": "Hoàn tác", + "item.edit.metadata.edit.buttons.unedit": "Ngừng chỉnh sửa", + "item.edit.metadata.empty": "Bộ sưu tập này hiện không chứa trường thông tin mặc định nào. Nhập vào nút Thêm để bắt đầu thêm giá trị mặc định cho trường thông tin cho các tài liệu biên mục mới trong bộ sưu tập.", + "item.edit.metadata.headers.edit": "Chỉnh sửa", + "item.edit.metadata.headers.field": "Trường", + "item.edit.metadata.headers.language": "Ngôn ngữ", + "item.edit.metadata.headers.value": "Giá trị", + "item.edit.metadata.metadatafield.invalid": "Vui lòng chọn một trường thông tin mô tả hợp lệ", + "item.edit.metadata.notifications.discarded.content": "Các thay đổi của bạn đã bị hủy. Để khôi phục lại các thay đổi này hãy nhấp vào nút 'Hoàn tác'", + "item.edit.metadata.notifications.discarded.title": "Đã khôi phục", + "item.edit.metadata.notifications.error.title": "Đã có lỗi xảy ra", + "item.edit.metadata.notifications.invalid.content": "Các thay đổi của bạn không được lưu lại. Vui lòng đảm bảo rằng tất cả các trường là hợp lệ trước khi bạn lưu.", + "item.edit.metadata.notifications.invalid.title": "Siêu dữ liệu không hợp lệ", + "item.edit.metadata.notifications.outdated.content": "Tài liệu bạn đang mở cũng đang được chỉnh sửa bởi một người dùng khác. Vì vậy các thay đổi của bạn với tài liệu sẽ bị hủy bỏ để tránh xung đột xảy ra.", + "item.edit.metadata.notifications.outdated.title": "Thay đổi không có hiệu lực", + "item.edit.metadata.notifications.saved.content": "Các thay đổi của bạn với thông tin mô tả của tài liệu này đã được lưu lại.", + "item.edit.metadata.notifications.saved.title": "Đã lưu thông tin mô tả", + "item.edit.metadata.reinstate-button": "Hoàn tác", + "item.edit.metadata.save-button": "Lưu", + "item.edit.modify.overview.field": "Trường", + "item.edit.modify.overview.language": "Ngôn ngữ", + "item.edit.modify.overview.value": "Giá trị", + "item.edit.move.cancel": "Quay lại", + "item.edit.move.description": "Chọn bộ sưu tập mà bạn muốn chuyển tài liệu này tới. Để giới hạn danh sách bộ sưu tập đang hiển thị bạn có thể nhập từ khóa tìm kiếm trong ô dưới đây.", + "item.edit.move.discard-button": "Hủy bỏ", + "item.edit.move.error": "Đã xảy ra lỗi khi thực hiện di chuyển tài liệu này", + "item.edit.move.head": "Di chuyển tài liệu: {{id}}", + "item.edit.move.inheritpolicies.checkbox": "Kế thừa chính sách", + "item.edit.move.inheritpolicies.description": "Kế thừa chính sách mặc định của bộ sưu tập đích", + "item.edit.move.move": "Di chuyển", + "item.edit.move.processing": "Đang di chuyển...", + "item.edit.move.save-button": "Lưu", + "item.edit.move.search.placeholder": "Nhập một từ khóa để tìm kiếm bộ sưu tập", + "item.edit.move.success": "Tài liệu đã được di chuyển thành công", + "item.edit.move.title": "Di chuyển tài liệu", + "item.edit.private.cancel": "Hủy", + "item.edit.private.confirm": "Chuyển thành tài liệu cá nhân", + "item.edit.private.description": "Bạn có chắc chắn muốn chuyển tài liệu này thành tài liệu cá nhân trong thư viện số?", + "item.edit.private.error": "Đã có lỗi xảy ra trong khi chuyển tài liệu sang chế độ cá nhân", + "item.edit.private.header": "Chuyển tài liệu: {{ id }} thành tài liệu cá nhân", + "item.edit.private.success": "Tài liệu bây giờ đã trở thành tài liệu cá nhân", + "item.edit.public.cancel": "Hủy", + "item.edit.public.confirm": "Chuyển thành tài liệu công cộng", + "item.edit.public.description": "Bạn có chắc chắn muốn chuyển tài liệu này thành tài liệu công cộng trong thư viện số?", + "item.edit.public.error": "Đã có lỗi xảy ra trong khi chuyển tài liệu sang chế độ công cộng", + "item.edit.public.header": "Chuyển tài liệu: {{ id }} thành tài liệu công cộng", + "item.edit.public.success": "Tài liệu bây giờ đã trở thành tài liệu công cộng", + "item.edit.reinstate.cancel": "Hủy", + "item.edit.reinstate.confirm": "Khôi phục", + "item.edit.reinstate.description": "Bạn có chắc chắn tài liệu này nên được khôi phục trong thư viện số?", + "item.edit.reinstate.error": "Đã có lỗi xảy ra trong khi khôi phục tài liệu này", + "item.edit.reinstate.header": "Khôi phục tài liệu: {{ id }}", + "item.edit.reinstate.success": "Tài liệu này đã được khôi phục thành công", + "item.edit.relationships.discard-button": "Hủy bỏ", + "item.edit.relationships.edit.buttons.add": "Thêm", + "item.edit.relationships.edit.buttons.remove": "Xóa", + "item.edit.relationships.edit.buttons.undo": "Hoàn tác", + "item.edit.relationships.no-entity-type": "Thêm trường dữ liệu 'dspace.entity.type' để kích hoạt các mối quan hệ cho tài liệu này", + "item.edit.relationships.no-relationships": "Không có mối quan hệ nào", + "item.edit.relationships.notifications.discarded.content": "các thay đổi của bạn đã bị hủy bỏ. Để khôi phục các thay đổi này hãy nhấp vào nút 'Hoàn tác'", + "item.edit.relationships.notifications.discarded.title": "Các thay đổi đã bị hủy", + "item.edit.relationships.notifications.failed.title": "Lỗi khi chỉnh sửa mối quan hệ", + "item.edit.relationships.notifications.outdated.content": "Tài liệu bạn đang mở cũng đang được chỉnh sửa bởi một người dùng khác. Vì vậy các thay đổi của bạn đã bị hủy bỏ để tránh xảy ra xung đột.", + "item.edit.relationships.notifications.outdated.title": "Các thay đổi không có hiệu lực", + "item.edit.relationships.notifications.saved.content": "Các thay đổi của bạn đối với các mối quan hệ của tài liệu này đã được lưu lại.", + "item.edit.relationships.notifications.saved.title": "Mối quan hệ đã được lưu lại", + "item.edit.relationships.reinstate-button": "Hoàn tác", + "item.edit.relationships.save-button": "Lưu", + "item.edit.return": "Quay lại", + "item.edit.tabs.bitstreams.head": "Tệp tin", + "item.edit.tabs.bitstreams.title": "Chỉnh sửa tài liệu - Tệp tin", + "item.edit.tabs.curate.head": "Kiểm tra dữ liệu", + "item.edit.tabs.curate.title": "Chỉnh sửa tài liệu - Kiểm tra dữ liệu", + "item.edit.tabs.disabled.tooltip": "Bạn không có quyền truy cập vào tab này", + "item.edit.tabs.item-mapper.title": "Chỉnh sửa tài liệu - Liên kết bộ sưu tập", + "item.edit.tabs.mapper.head": "Liên kết bộ sưu tập", + "item.edit.tabs.metadata.head": "Siêu dữ liệu", + "item.edit.tabs.metadata.title": "Chỉnh sửa tài liệu - Siêu dữ liệu", + "item.edit.tabs.relationships.head": "Mối quan hệ", + "item.edit.tabs.relationships.title": "Chỉnh sửa tài liệu - Mối quan hệ", + "item.edit.tabs.status.buttons.authorizations.button": "Phân quyền tài liệu", + "item.edit.tabs.status.buttons.authorizations.label": "Chỉnh sửa chính sách phân quyền của tài liệu", + "item.edit.tabs.status.buttons.delete.button": "Xóa vĩnh viễn", + "item.edit.tabs.status.buttons.delete.label": "Xóa tài liệu", + "item.edit.tabs.status.buttons.mappedCollections.button": "Bộ sưu tập đã liên kết", + "item.edit.tabs.status.buttons.mappedCollections.label": "Kiểm tra bộ sưu tập đã liên kết", + "item.edit.tabs.status.buttons.move.button": "Di chuyển tài liệu", + "item.edit.tabs.status.buttons.move.label": "Di chuyển tài liệu tới bộ sưu tập khác", + "item.edit.tabs.status.buttons.private.button": "Chuyển thành tài liệu cá nhân", + "item.edit.tabs.status.buttons.private.label": "Chuyển thành tài liệu cá nhân", + "item.edit.tabs.status.buttons.public.button": "Chuyển thành tài liệu công cộng", + "item.edit.tabs.status.buttons.public.label": "Chuyển tài liệu thành công cộng", + "item.edit.tabs.status.buttons.reinstate.button": "Khôi phục", + "item.edit.tabs.status.buttons.reinstate.label": "Khôi phục tài liệu vào kho lưu trữ", + "item.edit.tabs.status.buttons.unauthorized": "Bạn không có quyền thực hiện hành động này", + "item.edit.tabs.status.buttons.withdraw.button": "Ẩn", + "item.edit.tabs.status.buttons.withdraw.label": "Ẩn tài liệu khỏi kho lưu trữ", + "item.edit.tabs.status.description": "Chào mừng bạn đến với trang quản lý tài liệu. Từ đây bạn có thể ẩn khôi phục di chuyển hoặc xóa tài liệu. Bạn cũng có thể cập nhật hoặc nhập thêm trường dữ liệu mới tải thêm tệp tin trên những tab khác.", + "item.edit.tabs.status.head": "Trạng thái", + "item.edit.tabs.status.labels.handle": "Handle", + "item.edit.tabs.status.labels.bundleName": "Bundle name", + "item.edit.tabs.status.labels.id": "ID tài liệu", + "item.edit.tabs.status.labels.itemPage": "Trang tài liệu", + "item.edit.tabs.status.labels.lastModified": "Chỉnh sửa lần cuối", + "item.edit.tabs.status.title": "Chỉnh sửa tài liệu - Trạng thái", + "item.edit.tabs.versionhistory.head": "Lịch sử phiên bản", + "item.edit.tabs.versionhistory.title": "Chỉnh sửa tài liệu - Lịch sử phiên bản", + "item.edit.tabs.versionhistory.under-construction": "Chưa thể chỉnh sửa hoặc tạo thêm phiên bản trên giao diện người dùng này.", + "item.edit.tabs.view.head": "Xem tài liệu", + "item.edit.tabs.view.title": "Chỉnh sửa tài liệu - Xem", + "item.edit.withdraw.cancel": "Hủy", + "item.edit.withdraw.confirm": "Ẩn", + "item.edit.withdraw.description": "Bạn có chắc chắn muốn ẩn tài liệu này khỏi kho lưu trữ?", + "item.edit.withdraw.error": "Đã có lỗi xảy ra trong khi thực hiện ẩn tài liệu này", + "item.edit.withdraw.header": "Ẩn tài liệu: {{ id }}", + "item.edit.withdraw.success": "Tài liệu này đã được ẩn thành công", + "item.listelement.badge": "Tài liệu", + "item.orcid.return": "Quay lại", + "item.page.name": "Tên", + "item.page.abstract": "Tóm tắt", + "item.page.author": "Tác giả", + "item.page.bitstreams.collapse": "Thu hẹp", + "item.page.bitstreams.view-more": "Hiển thị thêm", + "item.page.citation": "Trích dẫn", + "item.page.claim.button": "Nhận nhiệm vụ", + "item.page.claim.tooltip": "Nhận nhiệm vụ tài liệu này", + "item.page.collections": "Bộ sưu tập", + "item.page.collections.loading": "Đang tải…", + "item.page.collections.load-more": "Xem thêm", + "item.page.date": "Năm xuất bản", + "item.page.description": "Mô tả", + "item.page.edit": "Chỉnh sửa tài liệu này", + "item.page.files": "Tệp tin", + "item.page.filesection.description": "Mô tả:", + "item.page.filesection.download": "Tải xuống", + "item.page.filesection.view": "Xem trực tuyến", + "item.page.filesection.format": "Định dạng:", + "item.page.filesection.license.bundle": "Tập tin giấy phép", + "item.page.filesection.name": "Tên:", + "item.page.filesection.original.bundle": "Tập tin chính của tài liệu", + "item.page.filesection.size": "Dung lượng:", + "item.page.journal.search.title": "Bài viết trong tạp chí này", + "item.page.journal-issn": "ISSN", + "item.page.journal-title": "Nhan đề tạp chí", + "item.page.link.full": "Hiển thị chi tiết", + "item.page.link.simple": "Hiển thị đơn giản", + "item.page.orcid.title": "ORCID", + "item.page.orcid.tooltip": "Mở trang cài đặt ORCID", + "item.page.person.search.title": "Bài viết của tác giả này", + "item.page.publisher": "Nhà xuất bản", + "item.page.related-items.view-less": "Ẩn {{ amount }} tài liệu cuối", + "item.page.related-items.view-more": "Hiển thị thêm {{ amount }} tài liệu", + "item.page.relationships.isAuthorOfPublication": "Ấn phẩm", + "item.page.relationships.isJournalOfPublication": "Ấn phẩm", + "item.page.relationships.isOrgUnitOfPerson": "Tác giả", + "item.page.relationships.isOrgUnitOfProject": "Dự án nghiên cứu", + "item.page.return": "Quay lại", + "item.page.subject": "Từ khóa chủ đề", + "item.page.titleprefix": "Tài liệu:", + "item.page.uri": "URL", + "item.page.version.create": "Tạo phiên bản mới", + "item.page.version.hasDraft": "Không thể tạo phiên bản mới vì có một phiên bản đang trong tiến trình tải lên", + "item.page.volume-title": "Nhan đề tập", + "item.preview.dc.contributor.author": "Tác giả:", + "item.preview.dc.coverage.spatial": "Quyền hạn:", + "item.preview.dc.date.issued": "Năm xuất bản:", + "item.preview.dc.description.abstract": "Tóm tắt:", + "item.preview.dc.identifier": "Định danh:", + "item.preview.dc.identifier.doi": "DOI", + "item.preview.dc.identifier.isbn": "ISBN", + "item.preview.dc.identifier.other": "Định danh khác:", + "item.preview.dc.identifier.uri": "Định danh:", + "item.preview.dc.language.iso": "Ngôn ngữ:", + "item.preview.dc.relation.ispartof": "Tạp chí hoặc Ấn phẩm định kỳ", + "item.preview.dc.relation.issn": "ISSN", + "item.preview.dc.subject": "Chủ đề:", + "item.preview.dc.title": "Nhan đề:", + "item.preview.dc.title.alternative": "Viết tắt:", + "item.preview.dc.type": "Loại hình tài liệu:", + "item.preview.oaire.awardNumber": "ID quỹ:", + "item.preview.oaire.citation.issue": "Kỳ ấn phẩm", + "item.preview.oaire.citation.volume": "Tập", + "item.preview.oaire.fundingStream": "Dòng quỹ:", + "item.preview.person.familyName": "Họ:", + "item.preview.person.givenName": "Tên:", + "item.preview.person.identifier.orcid": "ORCID:", + "item.preview.project.funder.identifier": "Định danh nhà tài trợ:", + "item.preview.project.funder.name": "Nhà tài trợ:", + "item.search.results.head": "Kết quả tìm kiếm tài liệu", + "item.search.title": "Tìm kiếm tài liệu", + "item.select.confirm": "Xác nhận cái đã chọn", + "item.select.empty": "Không có tài liệu để hiển thị", + "item.select.table.author": "Tác giả", + "item.select.table.collection": "Bộ sưu tập", + "item.select.table.title": "Nhan đề", + "item.truncatable-part.show-less": "Thu hẹp", + "item.truncatable-part.show-more": "Xem thêm", + "item.version.create.modal.button.cancel": "Hủy", + "item.version.create.modal.button.cancel.tooltip": "Không thể tạo phiên bản mới", + "item.version.create.modal.button.confirm": "Tạo", + "item.version.create.modal.button.confirm.tooltip": "Tạo phiên bản mới", + "item.version.create.modal.form.summary.label": "Thông tin tổng quan", + "item.version.create.modal.form.summary.placeholder": "Thêm thông tin mô tả cho phiên bản mới", + "item.version.create.modal.header": "Phiên bản mới", + "item.version.create.modal.submitted.header": "Tạp phiên bản mới…", + "item.version.create.modal.submitted.text": "Phiên bản mới đang được tạo. Có thể mất một chút thời gian để hoàn tất nếu tài liệu có nhiều mối quan hệ.", + "item.version.create.modal.text": "Tạo phiên bản mới cho tài liệu này", + "item.version.create.modal.text.startingFrom": "bắt đầu từ phiên bản {{version}}", + "item.version.create.notification.failure": "Phiên bản mới chưa được tạo", + "item.version.create.notification.inProgress": "Không thể tạo phiên bản mới vì có một phiên bản đang trong tiến trình tải lên", + "item.version.create.notification.success": "Phiên bản mới đã được tạo với mã số phiên bản là {{version}}", + "item.version.delete.modal.button.cancel": "Hủy", + "item.version.delete.modal.button.cancel.tooltip": "Không xóa phiên bản này", + "item.version.delete.modal.button.confirm": "Xóa", + "item.version.delete.modal.button.confirm.tooltip": "Xóa phiên bản này", + "item.version.delete.modal.header": "Xóa phiên bản", + "item.version.delete.modal.text": "Bạn có muốn xóa phiên bản {{version}}?", + "item.version.delete.notification.failure": "Phiên bản {{version}} chưa bị xóa", + "item.version.delete.notification.success": "Phiên bản {{version}} đã được xóa", + "item.version.edit.notification.failure": "Thông tin tổng quan của phiên bản {{version}} chưa được thay đổi", + "item.version.edit.notification.success": "Thông tin tổng quan của phiên bản {{version}} đã được thay đổi", + "item.version.history.empty": "Chưa có phiên bản nào khác của tài liệu này.", + "item.version.history.head": "Lịch sử phiên bản", + "item.version.history.return": "Quay lại", + "item.version.history.selected": "Phiên bản đã chọn", + "item.version.history.selected.alert": "Hiện tại bạn đang xem phiên bản {{version}} của tài liệu này.", + "item.version.history.table.action.deleteVersion": "Xóa phiên bản", + "item.version.history.table.action.discardSummary": "Hủy chỉnh sửa", + "item.version.history.table.action.editSummary": "Chỉnh sửa thông tin tổng quan", + "item.version.history.table.action.editWorkspaceItem": "Chỉnh sửa biểu ghi đang biên mục", + "item.version.history.table.action.hasDraft": "Không thể tạo phiên bản mới vì có một phiên bản đang trong tiến trình tải lên", + "item.version.history.table.action.newVersion": "Tạo phiên bản mới từ tài liệu này", + "item.version.history.table.action.saveSummary": "Lưu", + "item.version.history.table.actions": "Hành động", + "item.version.history.table.date": "Thời gian xuất bản", + "item.version.history.table.editor": "Người biên tập", + "item.version.history.table.item": "Tài liệu", + "item.version.history.table.summary": "Tóm tắt", + "item.version.history.table.version": "Phiên bản", + "item.version.history.table.workflowItem": "Đang kiểm duyệt", + "item.version.history.table.workspaceItem": "Đang biên mục", + "item.version.notice": "Đây không phải là phiên bản mới nhất của tài liệu này. Phiên bản mới nhất có thể xem tại đây.", + + "itemtemplate.edit.metadata.add-button": "Add", + + "itemtemplate.edit.metadata.discard-button": "Discard", + + "itemtemplate.edit.metadata.edit.buttons.confirm": "Confirm", + + "itemtemplate.edit.metadata.edit.buttons.drag": "Drag to reorder", + + "itemtemplate.edit.metadata.edit.buttons.edit": "Edit", + + "itemtemplate.edit.metadata.edit.buttons.remove": "Remove", + + "itemtemplate.edit.metadata.edit.buttons.undo": "Undo changes", + + "itemtemplate.edit.metadata.edit.buttons.unedit": "Stop editing", + + "itemtemplate.edit.metadata.empty": "The item template currently doesn't contain any metadata. Click Add to start adding a metadata value.", + + "itemtemplate.edit.metadata.headers.edit": "Edit", + + "itemtemplate.edit.metadata.headers.field": "Field", + + "itemtemplate.edit.metadata.headers.language": "Lang", + + "itemtemplate.edit.metadata.headers.value": "Value", + + "itemtemplate.edit.metadata.metadatafield.error": "An error occurred validating the metadata field", + + "itemtemplate.edit.metadata.metadatafield.invalid": "Please choose a valid metadata field", + + "itemtemplate.edit.metadata.notifications.discarded.content": "Your changes were discarded. To reinstate your changes click the 'Undo' button", + + "itemtemplate.edit.metadata.notifications.discarded.title": "Changes discarded", + + "itemtemplate.edit.metadata.notifications.error.title": "An error occurred", + + "itemtemplate.edit.metadata.notifications.invalid.content": "Your changes were not saved. Please make sure all fields are valid before you save.", + + "itemtemplate.edit.metadata.notifications.invalid.title": "Metadata invalid", + + "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.title": "Changes outdated", + + "itemtemplate.edit.metadata.notifications.saved.content": "Your changes to this item template's metadata were saved.", + + "itemtemplate.edit.metadata.notifications.saved.title": "Metadata saved", + + "itemtemplate.edit.metadata.reinstate-button": "Undo", + + "itemtemplate.edit.metadata.reset-order-button": "Undo reorder", + + "itemtemplate.edit.metadata.save-button": "Save", + + + "journal.listelement.badge": "Tạp chí", + "journal.page.description": "Mô tả", + "journal.page.edit": "Chỉnh sửa tài liệu này", + "journal.page.editor": "Tổng biên tập", + "journal.page.issn": "ISSN", + "journal.page.publisher": "Nhà xuất bản", + "journal.page.titleprefix": "Tạp chí:", + "journal.search.results.head": "Kết quả tìm kiếm tạp chí", + "journal.search.title": "Tìm kiếm tạp chí", + "journalissue.listelement.badge": "Kỳ của tạp chí", + "journalissue.page.description": "Mô tả", + "journalissue.page.abstract": "Tóm tắt", + "journalissue.page.edit": "Chỉnh sửa tài liệu này", + "journalissue.page.issuedate": "Ngày xuất bản", + "journalissue.page.journal-issn": "ISSN", + "journalissue.page.journal-title": "Nhan đề tạp chí", + "journalissue.page.keyword": "Từ khóa chủ đề", + "journalissue.page.number": "Số lượng", + "journalissue.page.titleprefix": "Kỳ của tạp chí:", + "journal-relationships.search.results.head": "Kết quả tìm kiếm tạp chí", + "journalvolume.listelement.badge": "Tập của tạp chí", + "journalvolume.page.description": "Mô tả", + "journalvolume.page.edit": "Chỉnh sửa tài liệu này", + "journalvolume.page.issuedate": "Ngày xuất bản", + "journalvolume.page.titleprefix": "Tập của tạp chí:", + "journalvolume.page.volume": "Tập", + + + "iiif.listelement.badge": "Phương tiện hình ảnh", + "iiif.page.description": "Mô tả:", + "iiif.page.doi": "Đường dẫn cố định:", + "iiif.page.issue": "Vấn đề:", + "iiif.page.titleprefix": "Hình ảnh:", + "iiifsearchable.listelement.badge": "Phương tiện biểu ghi", + "iiifsearchable.page.description": "Mô tả:", + "iiifsearchable.page.doi": "Đường dẫn cố định:", + "iiifsearchable.page.issue": "Vấn đề:", + "iiifsearchable.page.titleprefix": "Tài liệu:", + "iiifviewer.fullscreen.notice": "Sử dụng chế độ toàn màn hình để xem tốt hơn.", + + "loading.bitstream": "Đang tải tệp tin...", + "loading.bitstreams": "Đang tải tệp tin...", + "loading.browse-by": "Đang tải tài liệu...", + "loading.browse-by-page": "Đang tải trang...", + "loading.collection": "Đang tải bộ sưu tập...", + "loading.collections": "Đang tải bộ sưu tập...", + "loading.community": "Đang tải đơn vị...", + "loading.content-source": "Đang tải nguồn nội dung...", + "loading.default": "Đang tải...", + "loading.item": "Đang tải tài liệu...", + "loading.items": "Đang tải tài liệu...", + "loading.mydspace-results": "Đang tải tài liệu...", + "loading.objects": "Đang tải...", + "loading.recent-submissions": "Đang tải các tài liệu mới gần đây...", + "loading.search-results": "Đanh tải kết quả tìm kiếm...", + "loading.sub-collections": "Đang tải bộ sưu tập con...", + "loading.sub-communities": "Đang tải đơn vị con...", + "loading.top-level-communities": "Đang tải các đơn vị lớn...", + + "login.breadcrumbs": "Đăng nhập", + "login.form.email": "Địa chỉ email", + "login.form.forgot-password": "Có phải bạn quên mật khẩu?", + "login.form.header": "Vui lòng đăng nhập vào DSpace", + "login.form.new-user": "Bạn là người dùng mới? \n Vui lòng nhấp vào đây để đăng kí.", + "login.form.oidc": "Đăng nhập với OIDC", + "login.form.orcid": "Đăng nhập với ORCID", + "login.form.or-divider": "hoặc", + "login.form.password": "Mật khẩu", + "login.form.shibboleth": "Đăng nhập bằng Shibboleth", + "login.form.submit": "Đăng nhập", + "login.title": "Đăng nhập", + + "logout.form.header": "Đăng xuất khỏi DSpace", + "logout.form.submit": "Đăng xuất", + "logout.title": "Đăng xuất", + + "menu.header.admin": "Quản trị", + "menu.header.admin.description": "Menu quản trị", + "menu.header.image.logo": "Logo của kho lưu trữ", + + "menu.section.access_control": "Người dùng và nhóm người dùng", + "menu.section.access_control_authorizations": "Chính sách phân quyền", + "menu.section.access_control_groups": "Nhóm người dùng", + "menu.section.access_control_people": "Người dùng", + "menu.section.admin_search": "Tìm kiếm quản trị", + "menu.section.browse_community": "Đơn vị này", + "menu.section.browse_community_by_author": "Tác giả", + "menu.section.browse_community_by_issue_date": "Năm xuất bản", + "menu.section.browse_community_by_title": "Nhan đề", + "menu.section.browse_global": "Duyệt tìm", + "menu.section.browse_global_by_author": "Tác giả", + "menu.section.browse_global_by_dateissued": "Năm xuất bản", + "menu.section.browse_global_by_subject": "Chủ đề", + "menu.section.browse_global_by_title": "Nhan đề", + "menu.section.browse_global_communities_and_collections": "Đơn vị & Bộ sưu tập", + "menu.section.control_panel": "Bảng điều khiển", + "menu.section.curation_task": "Kiểm tra dữ liệu", + "menu.section.edit": "Chỉnh sửa", + "menu.section.edit_collection": "Bộ sưu tập", + "menu.section.edit_community": "Đơn vị", + "menu.section.edit_item": "Tài liệu", + "menu.section.export": "Trích xuất", + "menu.section.export_batch": "Xuất dữ liệu (ZIP)", + "menu.section.export_collection": "Bộ sưu tập", + "menu.section.export_community": "Đơn vị", + "menu.section.export_item": "Tài liệu", + "menu.section.export_metadata": "Siêu dữ liệu", + "menu.section.health": "Kiểm tra hệ thống", + "menu.section.icon.access_control": "Phần menu của mục Người dùng và Nhóm người dùng", + "menu.section.icon.admin_search": "Phần menu của mục Tìm kiếm quản trị", + "menu.section.icon.control_panel": "Phần menu của mục Bảng điều khiển", + "menu.section.icon.curation_tasks": "Phần menu của Nhiệm vụ kiểm tra", + "menu.section.icon.edit": "Phần menu của mục Chỉnh sửa", + "menu.section.icon.export": "Phần menu của mục Trích xuất dữ liệu", + "menu.section.icon.find": "Phần menu của mục Tìm kiếm", + "menu.section.icon.health": "Phần menu của mục Kiểm tra hệ thống", + "menu.section.icon.import": "Phần menu của mục Nhập dữ liệu", + "menu.section.icon.new": "Phần menu của mục Tạo mới", + "menu.section.icon.pin": "Ghim thanh quản trị", + "menu.section.icon.processes": "Phần menu của mục Tiến trình", + "menu.section.icon.registries": "Phần menu của mục Thống số chung", + "menu.section.icon.statistics_task": "Phần menu của mục Nhiệm vụ báo cáo thống kê", + "menu.section.icon.unpin": "Bỏ ghim thanh quản trị", + "menu.section.icon.workflow": "Phần menu của mục Quản trị luồng công việc", + "menu.section.import": "Nhập dữ liệu", + "menu.section.import_batch": "Nhập liệu theo lô (ZIP)", + "menu.section.import_metadata": "Siêu dữ liệu", + "menu.section.new": "Tạo mới", + "menu.section.new_collection": "Bộ sưu tập", + "menu.section.new_community": "Đơn vị", + "menu.section.new_item": "Tài liệu", + "menu.section.new_item_version": "Phiên bản tài liệu", + "menu.section.new_process": "Tiến trình", + "menu.section.pin": "Ghim thanh quản trị", + "menu.section.policies_metadata": "Chính sách phân quyền", + "menu.section.processes": "Tiến trình", + "menu.section.registries": "Thông số chung", + "menu.section.registries_format": "Định dạng tệp tin số", + "menu.section.registries_metadata": "Trường dữ liệu", + "menu.section.statistics": "Báo cáo thống kê", + "menu.section.statistics_admin": "Báo cáo thống kê", + "menu.section.statistics_admin_metadata": "Báo cáo thống kê", + "menu.section.statistics_task": "Nhiệm vụ báo cáo thống kê", + "menu.section.toggle.access_control": "Phần chuyển đổi Người dùng và Nhóm người dùng", + "menu.section.toggle.control_panel": "Phần chuyển đổi Bảng điều khiển", + "menu.section.toggle.curation_task": "Phần chuyển đổi Kiểm tra dữ liệu", + "menu.section.toggle.edit": "Phần chuyển đổi Chỉnh sửa", + "menu.section.toggle.export": "Phần chuyển đổi Trích xuất dữ liệu", + "menu.section.toggle.find": "Phần chuyển đổi Tìm kiếm", + "menu.section.toggle.import": "Phần chuyển đổi Nhập dữ liệu", + "menu.section.toggle.new": "Phần chuyển đổi Tạo mới", + "menu.section.toggle.registries": "Phần chuyển đổi thông số chung", + "menu.section.toggle.statistics_task": "Phần chuyển đổi Nhiệm vụ Báo cáo thống kê", + "menu.section.unpin": "Bỏ ghim thanh quản trị", + "menu.section.workflow": "Quản trị dòng công việc", + + "metadata-export-search.submit.error": "Xảy ra lỗi trong quá trình xuất dữ liệu", + "metadata-export-search.submit.success": "Quá trình xuất dữ liệu đã được khởi chạy thành công", + "metadata-export-search.tooltip": "Xuất kết quả tìm kiếm ra CSV", + + "mydspace.breadcrumbs": "Trang cá nhân", + "mydspace.messages.controller-help": "Chọn tùy chọn này để gửi tin nhắn tới người biên mục tài liệu.", + "mydspace.messages.description-placeholder": "Thêm tin nhắn của bạn tại đây...", + "mydspace.messages.hide-msg": "Ẩn tin nhắn", + "mydspace.messages.mark-as-read": "Đánh dấu đã đọc", + "mydspace.messages.mark-as-unread": "Đánh dấu chưa đọc", + "mydspace.messages.no-content": "Không có nội dung.", + "mydspace.messages.no-messages": "Không có tin nhắn nào.", + "mydspace.messages.send-btn": "Gửi", + "mydspace.messages.show-msg": "Hiển thị tin nhắn", + "mydspace.messages.subject-placeholder": "Chủ đề...", + "mydspace.messages.submitter-help": "Chọn tùy chọn này để gửi tin nhắn tới người quản trị.", + "mydspace.messages.title": "Tin nhắn", + "mydspace.messages.to": "Tới", + "mydspace.new-submission": "Tạo tài liệu mới", + "mydspace.new-submission-external": "Nhập thông tin mô tả từ nguồn bên ngoài", + "mydspace.new-submission-external-short": "Nhập thông tin mô tả", + "mydspace.results.head": "Tài liệu của tôi", + "mydspace.results.no-abstract": "Không có tóm tắt", + "mydspace.results.no-authors": "Không có tác giả", + "mydspace.results.no-collections": "Không có bộ sưu tập", + "mydspace.results.no-date": "Không có thời gian xuất bản", + "mydspace.results.no-files": "Không có tệp đính kèm", + "mydspace.results.no-results": "Không có tài liệu để hiển thị", + "mydspace.results.no-title": "Không có nhan đề", + "mydspace.results.no-uri": "Không có URL", + "mydspace.search-form.placeholder": "Tìm kiếm trong trang cá nhân của tôi...", + "mydspace.show.workflow": "Tất cả nhiệm vụ", + "mydspace.show.workspace": "Tài liệu của tôi", + "mydspace.status.archived": "Đã lưu trữ", + "mydspace.status.validation": "Đang kiểm tra", + "mydspace.status.waiting-for-controller": "Đợi nhận nhiệm vụ", + "mydspace.status.workflow": "Đang kiểm duyệt", + "mydspace.status.workspace": "Đang biên mục", + "mydspace.title": "Trang cá nhân", + "mydspace.upload.upload-failed": "Có lỗi xảy ra khi tạo tài liệu mới. Vui lòng xác minh nội dung đã tải lên trước khi thử lại.", + "mydspace.upload.upload-failed-manyentries": "Không thể xử lý tệp tin. Có quá nhiều mục trong khi hệ thống chỉ cho phép một mục trong tệp tin.", + "mydspace.upload.upload-failed-moreonefile": "Không thể xử lý yêu cầu. Chỉ cho phép một tệp tin duy nhất.", + "mydspace.upload.upload-multiple-successful": "Đã tạo {{qty}} mục không gian làm việc mới.", + "mydspace.view-btn": "Xem chi tiết", + + "nav.browse.header": "Tất cả DSpace", + "nav.community-browse.header": "Theo Đơn vị", + "nav.language": "Chuyển ngôn ngữ", + "nav.login": "Đăng nhập", + "nav.logout": "Menu Hồ sơ cá nhân và Đăng xuất", + "nav.main.description": "Thanh điều hướng chính", + "nav.mydspace": "Trang cá nhân", + "nav.profile": "Hồ sơ cá nhân", + "nav.search": "Tìm kiếm", + "nav.statistics.header": "Báo cáo thống kê", + "nav.stop-impersonating": "Ngừng giả danh Người dùng", + "nav.toggle": "Điều hướng chuyển", + "nav.user.description": "Thanh hồ sơ người dùng", + "nav.user-profile-menu-and-logout": "Trình đơn Hồ sơ cá nhân và Đăng xuất", + + "none.listelement.badge": "Tài liệu", + + "orgunit.listelement.badge": "Đơn vị\/Tổ chức", + "orgunit.listelement.no-title": "Không có nhan đề", + "orgunit.page.city": "Thành phố", + "orgunit.page.country": "Quốc gia", + "orgunit.page.dateestablished": "Ngày thành lập", + "orgunit.page.description": "Mô tả", + "orgunit.page.edit": "Chỉnh sửa tài liệu", + "orgunit.page.id": "ID", + "orgunit.page.titleprefix": "Đơn vị\/Tổ chức", + + "pagination.next.button": "Tiếp theo", + "pagination.next.button.disabled.tooltip": "Không còn trang kết quả khác", + "pagination.options.description": "Tùy chọn Phân trang", + "pagination.previous.button": "Quay lại", + "pagination.results-per-page": "Số kết quả\/trang", + "pagination.showing.detail": "{{ range }} của tổng số {{ total }} kết quả", + "pagination.showing.label": "Đang hiển thị ", + "pagination.sort-direction": "Tùy chọn sắp xếp", + + "person.listelement.badge": "Nhà nghiên cứu", + "person.listelement.no-title": "Không tìm thấy tên", + "person.orcid.registry.auth": "Được phép qua ORCID ", + "person.orcid.registry.queue": "Đang xếp hàng đợi đăng ký ORCID", + "person.orcid.sync.setting": "Thiết lập đồng bộ hóa với ORCID", + "person.page.birthdate": "Ngày sinh", + "person.page.edit": "Chỉnh sửa tài liệu", + "person.page.email": "Email", + "person.page.firstname": "Tên", + "person.page.jobtitle": "Chức vụ", + "person.page.abtract": "Tiểu sử", + "person.page.description": "Mô tả", + "person.page.lastname": "Họ", + "person.page.link.full": "Hiển thị chi tiết", + "person.page.name": "Tên", + "person.page.orcid": "ORCID", + "person.page.orcid.create": "Tạo một ID trên ORCID", + "person.page.orcid.funding-preferences": "Quỹ ưa thích", + "person.page.orcid.grant-authorizations": "Cấp quyền", + "person.page.orcid.granted-authorizations": "Quyền đã cấp", + "person.page.orcid.link": "Liên kết với ID ORCID", + "person.page.orcid.link.error.message": "Đã xảy ra lỗi khi kết nối hồ sơ với ORCID. Nếu sự cố vẫn tiếp tục xảy ra vui lòng liên hệ với quản trị viên.", + "person.page.orcid.link.processing": "Đang kết nối hồ sơ tới ORCID…", + "person.page.orcid.missing-authorizations": "Thiếu quyền", + "person.page.orcid.missing-authorizations-message": "Những quyền sau đang bị thiếu:", + "person.page.orcid.no-missing-authorizations-message": "Tuyệt! Ô này đang trống vì vậy bạn đã được cấp tất cả các quyền truy cập để sử dụng tất cả các chức năng do tổ chức của bạn cung cấp.", + "person.page.orcid.no-orcid-message": "Chưa có ID ORCID nào được liên kết. Bạn có thể click vào nút dưới đây để liên kết hồ sơ này với một tài khoản ORCID.", + "person.page.orcid.orcid-not-linked-message": "ID ORCID của hồ sơ này ({{ orcid }}) chưa được kết nối với tài khoản trên trang ORCID hoặc kết nối đã hết hạn.", + "person.page.orcid.profile-preferences": "Tham số của hồ sơ", + "person.page.orcid.publications-preferences": "Tham số của ấn phẩm", + "person.page.orcid.remove-orcid-message": "Nếu bạn cần xóa ORCID của bạn vui lòng liên hệ với quản trị viên.", + "person.page.orcid.save.preference.changes": "Cập nhật cài đặt", + "person.page.orcid.scope.activities-update": "Thêm\/cập nhật các hoạt động nghiên cứu của bạn", + "person.page.orcid.scope.authenticate": "Lấy ID ORCID của bạn", + "person.page.orcid.scope.person-update": "Thêm\/cập nhật thông tin cá nhân của bạn", + "person.page.orcid.scope.read-limited": "Thiết lập để cho phép Các bên Tin cậy (Trusted Parties) có khả năng đọc thông tin của bạn ", + "person.page.orcid.sync-fundings.all": "Tất cả quỹ", + "person.page.orcid.sync-fundings.disabled": "Đã ngừng kích hoạt", + "person.page.orcid.sync-fundings.mine": "Quỹ của tôi", + "person.page.orcid.sync-fundings.my_selected": "Quỹ đã chọn", + "person.page.orcid.synchronization-mode": "Chế độ đồng bộ", + "person.page.orcid.synchronization-mode.batch": "Theo lô", + "person.page.orcid.synchronization-mode.label": "Chế độ đồng bộ", + "person.page.orcid.synchronization-mode.manual": "Thủ công", + "person.page.orcid.synchronization-mode-funding-message": "Chọn gửi\/không gửi các thực thể dự án của bạn đến danh sách các quỹ tài trợ trong bản ghi ORCID của bạn hay không.", + "person.page.orcid.synchronization-mode-message": "Vui lòng chọn phương thức đồng bộ hóa với ORCID. Các tùy chọn bao gồm \"Thủ công\" (bạn phải gửi dữ liệu của mình tới ORCID theo cách thủ công) hoặc \"Tự động\" (hệ thống sẽ gửi dữ liệu của bạn tới ORCID thông qua tập lệnh đã lên lịch).", + "person.page.orcid.synchronization-mode-profile-message": "Chọn gửi\/ không gửi thông tin tiểu sử hoặc số định danh cá nhân tới hồ sơ ORCID của bạn.", + "person.page.orcid.synchronization-mode-publication-message": "Chọn gửi\/ không gửi các thực thể Ấn phẩm tới danh sách các tác phẩm trong biểu ghi ORCID của bạn.", + "person.page.orcid.synchronization-settings-update.error": "Cập nhật cài đặt đồng bộ hóa không thành công", + "person.page.orcid.synchronization-settings-update.success": "Cài đặt đồng bộ hóa đã được cập nhật thành công", + "person.page.orcid.sync-profile.affiliation": "Tổ chức", + "person.page.orcid.sync-profile.biographical": "Dữ liệu sinh trắc học", + "person.page.orcid.sync-profile.education": "Giáo dục", + "person.page.orcid.sync-profile.identifiers": "Định danh", + "person.page.orcid.sync-publications.all": "Tất cả ấn phẩm", + "person.page.orcid.sync-publications.disabled": "Đã ngừng kích hoạt", + "person.page.orcid.sync-publications.mine": "Ấn phẩm của tôi", + "person.page.orcid.sync-publications.my_selected": "Ấn phẩm đã chọn", + "person.page.orcid.sync-queue.description.affiliation": "Tổ chức", + "person.page.orcid.sync-queue.description.country": "Quốc gia", + "person.page.orcid.sync-queue.description.education": "Giáo dục", + "person.page.orcid.sync-queue.description.external_ids": "ID ngoài", + "person.page.orcid.sync-queue.description.keywords": "Từ khóa", + "person.page.orcid.sync-queue.description.other_names": "Tên khác", + "person.page.orcid.sync-queue.description.qualification": "Trình độ chuyên môn", + "person.page.orcid.sync-queue.description.researcher_urls": "URL nhà nghiên cứu", + "person.page.orcid.sync-queue.discard": "Hủy thay đổi và không đồng bộ với trang ORCID", + "person.page.orcid.sync-queue.discard.error": "Việc loại bỏ biểu ghi trong danh sách chờ của ORCID đã thất bại", + "person.page.orcid.sync-queue.discard.success": "Biểu ghi trong danh sách chờ của ORCID đã được hủy bỏ thành công", + "person.page.orcid.sync-queue.empty-message": "Danh sách chờ ORCID trống", + "person.page.orcid.sync-queue.send": "Đồng bộ với trang ORCID", + "person.page.orcid.sync-queue.send.bad-request-error": "Đẩy dữ liệu lên ORCID không thành công vì tài nguyên này không hợp lệ", + "person.page.orcid.sync-queue.send.conflict-error": "Đẩy dữ liệu lên ORCID không thành công bởi vì tài nguyên này đã có trên trang ORCID", + "person.page.orcid.sync-queue.send.error": "Đẩy dữ liệu lên ORCID không thành công", + "person.page.orcid.sync-queue.send.not-found-warning": "Tài nguyên không còn tồn tại trên ORCID.", + "person.page.orcid.sync-queue.send.success": "Đẩy dữ liệu lên ORCID thành công", + "person.page.orcid.sync-queue.send.unauthorized-error.content": "Nhấp vào đây<\/a> để cấp lại các quyền bắt buộc. Nếu vấn đề vẫn còn tồn tại vui lòng liên hệ quản trị viên.", + "person.page.orcid.sync-queue.send.unauthorized-error.title": "Đẩy dữ liệu lên ORCID không thành công do tài khoản của bạn không đủ các quyền cần thiết.", + "person.page.orcid.sync-queue.send.validation-error": "Dữ liệu bạn muốn đồng bộ với ORCID là dữ liệu không hợp lệ", + "person.page.orcid.sync-queue.send.validation-error.amount-currency.required": "Đơn vị tiền tệ là bắt buộc", + "person.page.orcid.sync-queue.send.validation-error.country.invalid": "2 ký tự mã quốc gia theo ISO 3166 là không hợp lệ", + "person.page.orcid.sync-queue.send.validation-error.disambiguated-organization.required": "Cần có số định danh (ID) để phân biệt giữa các tổ chức. ID được hỗ trợ là GRID Ringgold LEI và số định dang Cơ quan đăng ký Crossref Funder", + "person.page.orcid.sync-queue.send.validation-error.disambiguated-organization.value-required": "Định danh của tổ chức yêu cầu phải có một giá trị", + "person.page.orcid.sync-queue.send.validation-error.disambiguation-source.invalid": "Nguồn của một trong các số định danh của tổ chức không hợp lệ. Các nguồn được hỗ trợ là RINGGOLD GRID LEI và FUNDREF", + "person.page.orcid.sync-queue.send.validation-error.disambiguation-source.required": "Phải có một nguồn cho định danh của tổ chức", + "person.page.orcid.sync-queue.send.validation-error.external-id.required": "Tài nguyên được gửi yêu cầu phải có ít nhất một định danh", + "person.page.orcid.sync-queue.send.validation-error.funder.required": "Nhà tài trợ là bắt buộc", + "person.page.orcid.sync-queue.send.validation-error.organization.address-required": "Tổ chức này yêu cầu phải có địa chỉ", + "person.page.orcid.sync-queue.send.validation-error.organization.city-required": "Địa chỉ của tổ chức này phải là một thành phố", + "person.page.orcid.sync-queue.send.validation-error.organization.country-required": "Địa chỉ của tổ chức này phải là một mã quốc gia bao gồm 2 ký tự theo ISO 3166", + "person.page.orcid.sync-queue.send.validation-error.organization.name-required": "Tên của tổ chức là bắt buộc", + "person.page.orcid.sync-queue.send.validation-error.organization.required": "Yêu cầu phải có tổ chức", + "person.page.orcid.sync-queue.send.validation-error.publication.date-invalid": "Năm xuất bản phải là năm sau năm 1900", + "person.page.orcid.sync-queue.send.validation-error.start-date.required": "Ngày bắt đầu là bắt buộc", + "person.page.orcid.sync-queue.send.validation-error.title.required": "Nhan đề là bắt buộc", + "person.page.orcid.sync-queue.send.validation-error.type.required": "Trường dc.type là bắt buộc", + "person.page.orcid.sync-queue.table.header.action": "Hành động", + "person.page.orcid.sync-queue.table.header.description": "Mô tả", + "person.page.orcid.sync-queue.table.header.type": "Loại hình tài liệu", + "person.page.orcid.sync-queue.tooltip.affiliation": "Tổ chức", + "person.page.orcid.sync-queue.tooltip.country": "Quốc gia", + "person.page.orcid.sync-queue.tooltip.delete": "Loại bỏ mục này khỏi trang ORCID", + "person.page.orcid.sync-queue.tooltip.education": "Giáo dục", + "person.page.orcid.sync-queue.tooltip.external_ids": "Định danh ", + "person.page.orcid.sync-queue.tooltip.insert": "Thêm mục mới trong ORCID", + "person.page.orcid.sync-queue.tooltip.keywords": "Từ khóa", + "person.page.orcid.sync-queue.tooltip.other_names": "Tên khác", + "person.page.orcid.sync-queue.tooltip.project": "Dự án", + "person.page.orcid.sync-queue.tooltip.publication": "Ấn phẩm", + "person.page.orcid.sync-queue.tooltip.qualification": "Trình độ chuyên môn", + "person.page.orcid.sync-queue.tooltip.researcher_urls": "URL nhà nghiên cứu", + "person.page.orcid.sync-queue.tooltip.update": "Cập nhật mục này trên trang ORCID", + "person.page.orcid.unlink": "Ngắt kết nối khỏi ORCID", + "person.page.orcid.unlink.error": "Đã xảy ra lỗi khi ngắt kết nối giữa hồ sơ và ORCID. Vui lòng thử lại.", + "person.page.orcid.unlink.processing": "Đang xử lý…", + "person.page.orcid.unlink.success": "Đã ngắt kết nối giữa hồ sơ nhà nghiên cứu và trang ORCID thành công", + "person.page.staffid": "ID nhân viên", + "person.page.titleprefix": "Nhà nghiên cứu", + "person.search.results.head": "Kết quả tìm kiếm Nhà nghiên cứu", + "person.search.title": "Tìm kiếm Nhà nghiên cứu", + "person-relationships.search.results.head": "Kết quả tìm kiếm Tác giả\/Nhà nghiên cứu", + + "process.bulk.delete.error.body": "Không thể xóa tiến trình có ID {{ processId}}. Các tiến trình còn lại sẽ tiếp tục bị xóa.", + "process.bulk.delete.error.head": "Đã xảy ra lỗi khi xóa tiến trình", + "process.detail.actions": "Hành động", + "process.detail.arguments": "Tham số", + "process.detail.arguments.empty": "Tiến trình này không chứa bất kì tham số nào", + "process.detail.back": "Quay lại", + "process.detail.create": "Tạo tiến trình tương tự", + "process.detail.delete.body": "Bạn có chắc chắn muốn xóa tiến trình hiện tại?", + "process.detail.delete.button": "Xóa tiến trình", + "process.detail.delete.cancel": "Hủy", + "process.detail.delete.confirm": "Xóa tiến trình", + "process.detail.delete.error": "Đã xảy ra sự cố trong khi xóa tiến trình", + "process.detail.delete.header": "Xóa tiến trình", + "process.detail.delete.success": "Tiến trình đã được xóa thành công.", + "process.detail.end-time": "Thời gian kết thúc", + "process.detail.logs.button": "Tìm kiếm đầu ra của tiến trình", + "process.detail.logs.loading": "Đang tìm kiếm", + "process.detail.logs.none": "Tiến trình này không có đầu ra nào", + "process.detail.output": "Đầu ra của tiến trình", + "process.detail.output-files": "Tệp tin đầu ra", + "process.detail.output-files.empty": "Tiến trình này không chứa tệp tin đầu ra nào", + "process.detail.script": "Tập lệnh", + "process.detail.start-time": "Thời gian bắt đầu", + "process.detail.status": "Trạng thái", + "process.detail.title": "Tiến trình: {{ id }} - {{ name }}", + "process.new.breadcrumbs": "Tạo tiến trình mới", + "process.new.cancel": "Hủy", + "process.new.header": "Tạo tiến trình mới", + "process.new.notification.error.content": "Đã có lỗi xảy ra trong khi tạo tiến trình", + "process.new.notification.error.title": "Lỗi", + "process.new.notification.success.content": "Tiến trình đã được thực hiện thành công", + "process.new.notification.success.title": "Thành công", + "process.new.parameter.file.required": "Vui lòng chọn một tệp tin", + "process.new.parameter.file.upload-button": "Chọn tệp tin...", + "process.new.parameter.required.missing": "Các tham số bắt buộc sau đang bị thiếu:", + "process.new.parameter.string.required": "Giá trị tham số là bắt buộc", + "process.new.parameter.type.file": "tệp tin", + "process.new.parameter.type.value": "giá trị", + "process.new.select-parameters": "Tham số", + "process.new.select-script": "Tập lệnh", + "process.new.select-script.placeholder": "Chọn một tập lệnh...", + "process.new.select-script.required": "Tập lệnh là bắt buộc", + "process.new.submit": "Lưu", + "process.new.title": "Tạo tiến trình mới", + "process.overview.breadcrumbs": "Tiến trình tổng quan", + "process.overview.delete": "Xóa {{count}} tiến trình", + "process.overview.delete.body": "Bạn có chắc chắn muốn xóa {{count}} tiến trình?", + "process.overview.delete.clear": "Xóa các tiến trình đã chọn", + "process.overview.delete.header": "Xóa", + "process.overview.new": "Tạo mới", + "process.overview.table.actions": "Hành động", + "process.overview.table.finish": "Thời gian kết thúc", + "process.overview.table.id": "ID tiến trình", + "process.overview.table.name": "Tên", + "process.overview.table.start": "Thời gian bắt đầu", + "process.overview.table.status": "Trạng thái", + "process.overview.table.user": "Người dùng", + "process.overview.title": "Tổng quan tiến trình", + + "profile.breadcrumbs": "Cập nhật hồ sơ", + "profile.card.identify": "Hồ sơ định danh", + "profile.card.researcher": "Định danh", + "profile.card.security": "Bảo mật", + "profile.form.submit": "Lưu", + "profile.groups.head": "Nhóm quyền của bạn", + "profile.head": "Cập nhật hồ sơ", + "profile.metadata.form.error.firstname.required": "Yêu cầu nhập Tên của người dùng", + "profile.metadata.form.error.lastname.required": "Yêu cầu nhập Họ của người dùng", + "profile.metadata.form.label.email": "Địa chỉ email", + "profile.metadata.form.label.firstname": "Tên", + "profile.metadata.form.label.language": "Ngôn ngữ", + "profile.metadata.form.label.lastname": "Họ", + "profile.metadata.form.label.phone": "Số điện thoại liên hệ", + "profile.metadata.form.notifications.success.content": "Cập nhật hồ sơ thành công .", + "profile.metadata.form.notifications.success.title": "Lưu hồ sơ", + "profile.notifications.warning.no-changes.content": "Không có thay đổi nào trên hồ sơ của bạn.", + "profile.notifications.warning.no-changes.title": "Không thay đổi", + "profile.security.form.error.matching-passwords": "Mật khẩu không khớp.", + "profile.security.form.info": "Nhập vào mật khẩu mới và xác nhận mật khẩu vào ô phía dưới. Độ dài tối thiểu của mật khẩu là 6 ký tự.", + "profile.security.form.label.current-password": "Mật khẩu hiện tại", + "profile.security.form.label.password": "Mật khẩu", + "profile.security.form.label.passwordrepeat": "Nhập lại mật khẩu để xác nhận", + "profile.security.form.notifications.error.change-failed": "Đã xảy ra lỗi khi thay đổi mật khẩu. Vui lòng kiểm tra lại tính chính xác của mật khẩu hiện tại.", + "profile.security.form.notifications.error.general": "Vui lòng điền vào các trường bắt buộc của biểu mẫu bảo mật.", + "profile.security.form.notifications.error.not-same": "Mật khẩu được cung cấp không giống nhau.", + "profile.security.form.notifications.error.title": "Thay đổi mật khẩu không thành công", + "profile.security.form.notifications.success.content": "Thay đổi mật khẩu thành công.", + "profile.security.form.notifications.success.title": "Đã lưu mật khẩu", + "profile.special.groups.head": "Phân quyền cho các nhóm đặc biệt mà bạn thuộc về", + "profile.title": "Cập nhật hồ sơ", + + "project.listelement.badge": "Dự án nghiên cứu", + "project.page.contributor": "Người tham gia", + "project.page.description": "Mô tả", + "project.page.edit": "Chỉnh sửa tài liệu", + "project.page.expectedcompletion": "Dự kiến hoàn thành", + "project.page.funder": "Nhà tài trợ", + "project.page.id": "ID", + "project.page.keyword": "Từ khóa", + "project.page.status": "Trạng thái", + "project.page.titleprefix": "Dự án nghiên cứu:", + "project.search.results.head": "Kết quả tìm kiếm dự án", + "project-relationships.search.results.head": "Kết quả tìm kiếm dự án", + + "publication.listelement.badge": "Ấn phẩm", + "publication.page.description": "Mô tả", + "publication.page.edit": "Chỉnh sửa tài liệu", + "publication.page.journal-issn": "ISSN tạp chí", + "publication.page.journal-title": "Nhan đề tạp chí", + "publication.page.publisher": "Nhà xuất bản", + "publication.page.titleprefix": "Ấn phẩm: ", + "publication.page.volume-title": "Nhan đề tập", + "publication.search.results.head": "Kết quả tìm kiếm ấn phẩm", + "publication.search.title": "Tìm kiếm ấn phẩm", + "publication-relationships.search.results.head": "Kết quả tìm kiếm ấn phẩm", + + "media-viewer.next": "Tiếp theot", + "media-viewer.playlist": "Danh sách phát", + "media-viewer.previous": "Quay lại", + + "register-email.title": "Đăng ký tài khoản mới", + "register-page.create-profile.header": "Tạo hồ sơ", + "register-page.create-profile.identification.contact": "Điện thoại liên hệ", + "register-page.create-profile.identification.email": "Địa chỉ email", + "register-page.create-profile.identification.first-name": "Tên *", + "register-page.create-profile.identification.first-name.error": "Nhập vào tên của người dùng", + "register-page.create-profile.identification.header": "Hồ sơ định danh", + "register-page.create-profile.identification.language": "Ngôn ngữ", + "register-page.create-profile.identification.last-name": "Họ *", + "register-page.create-profile.identification.last-name.error": "Nhập vào họ của người dùng", + "register-page.create-profile.security.error.empty-password": "Nhập mật khẩu vào ô phía dưới.", + "register-page.create-profile.security.error.matching-passwords": "Mật khẩu không khớp.", + "register-page.create-profile.security.header": "Bảo mật", + "register-page.create-profile.security.info": "Nhập vào mật khẩu mới và xác nhận mật khẩu vào ô phía dưới. Độ dài tối thiểu của mật khẩu là 6 ký tự.", + "register-page.create-profile.security.label.password": "Mật khẩu *", + "register-page.create-profile.security.label.passwordrepeat": "Nhập lại để xác nhận *", + "register-page.create-profile.submit": "Đăng ký thành công", + "register-page.create-profile.submit.error.content": "Đã có sự cố xảy ra khi đăng ký người dùng mới.", + "register-page.create-profile.submit.error.head": "Đăng ký lỗi", + "register-page.create-profile.submit.success.content": "Đăng ký thành công. Bạn đã đăng nhập với tư cách người dùng mới", + "register-page.create-profile.submit.success.head": "Đăng ký thành công", + "register-page.registration.email": "Địa chỉ email *", + "register-page.registration.email.error.pattern": "Vui lòng nhập một địa chỉ email hợp lệ", + "register-page.registration.email.error.required": "Vui lòng nhập vào địa chỉ email", + "register-page.registration.email.hint": "Địa chỉ này sẽ được xác minh và dùng làm tên đăng nhập của bạn.", + "register-page.registration.error.content": "Đã xảy ra lỗi khi đăng ký địa chỉ email sau: {{ email }}", + "register-page.registration.error.head": "Lỗi khi đăng ký email", + "register-page.registration.error.recaptcha": "Lỗi khi thực hiện xác minh bằng recaptcha", + "register-page.registration.google-recaptcha.must-accept-cookies": "Để đăng ký bạn phải chấp nhận cookie Đăng ký và khôi phục mật khẩu<\/b> (Google reCaptcha).", + "register-page.registration.google-recaptcha.notification.message.error": "Xác minh đã hết hạn. Vui lòng xác minh lại.", + "register-page.registration.google-recaptcha.notification.message.expired": "Đã xảy ra lỗi trong quá trình xác minh reCaptcha", + "register-page.registration.google-recaptcha.notification.title": "Google reCaptcha", + "register-page.registration.google-recaptcha.open-cookie-settings": "Mở phần cài đặt cookie", + "register-page.registration.header": "Đăng ký người dùng mới", + "register-page.registration.info": "Đăng ký tài khoản để nhận cập nhật mới về bộ sưu tập qua email và theo dõi tài liệu mới trên DSpace.", + "register-page.registration.submit": "Đăng ký", + "register-page.registration.success.content": "Một email sẽ được gửi đến địa chỉ email {{ email }} chứa liên kết xác nhận và các hướng dẫn khác.", + "register-page.registration.success.head": "Gửi email xác nhận", + + "relationships.add.error.relationship-type.content": "Không có kết quả nào phù hợp cho kiểu quan hệ {{ type }} giữa hai tài liệu", + "relationships.add.error.server.content": "Máy chủ trả về lỗi", + "relationships.add.error.title": "Không thể thêm mối quan hệ", + "relationships.isAuthorOf": "Tác giả", + "relationships.isAuthorOf.OrgUnit": "Tác giả (tổ chức)", + "relationships.isAuthorOf.Person": "Tác giả (người)", + "relationships.isContributorOf": "Người tham gia", + "relationships.isContributorOf.OrgUnit": "Người tham gia (Tổ chức)", + "relationships.isContributorOf.Person": "Người tham gia", + "relationships.isFundingAgencyOf.OrgUnit": "Nhà tài trợ", + "relationships.isIssueOf": "Số kỳ của tạp chí", + "relationships.isJournalIssueOf": "Số kỳ của tạp chí", + "relationships.isJournalOf": "Tạp chí", + "relationships.isOrgUnitOf": "Đơn vị tổ chức", + "relationships.isPersonOf": "Tác giả", + "relationships.isProjectOf": "Dự án nghiên cứu", + "relationships.isPublicationOf": "Ấn phẩm", + "relationships.isPublicationOfJournalIssue": "Bài báo", + "relationships.isSingleJournalOf": "Tạp chí", + "relationships.isSingleVolumeOf": "Số tập của tạp chí", + "relationships.isVolumeOf": "Số tập của tạp chí", + + "repository.image.logo": "Logo lưu trữ", + "repository.title.prefix": "Digital Library ::", + "repository.title.prefixDSpace": "Digital Library ::", + + "resource-policies.add.button": "Thêm", + "resource-policies.add.for.bitstream": "Thêm chính sách dữ liệu số mới", + "resource-policies.add.for.bundle": "Thêm chính sách gói dữ liệu mới", + "resource-policies.add.for.collection": "Thêm chính sách bộ sưu tập mới", + "resource-policies.add.for.community": "Thêm chính sách đơn vị mới", + "resource-policies.add.for.item": "Thêm chính sách tài liệu mới", + "resource-policies.create.page.failure.content": "Đã có lỗi xảy ra khi tạo chính sách tài nguyên.", + "resource-policies.create.page.heading": "Tạo chính sách tài nguyên mới cho", + "resource-policies.create.page.success.content": "Hành động thành công", + "resource-policies.create.page.title": "Tạp chính sách tài nguyên mới", + "resource-policies.delete.btn": "Xóa lựa chọn", + "resource-policies.delete.btn.title": "Xóa chính sách tài nguyên đã chọn", + "resource-policies.delete.failure.content": "Đã có lỗi xảy ra khi xóa chính sách tài nguyên đã lựa chọn.", + "resource-policies.delete.success.content": "Hành động thành công", + "resource-policies.edit.page.failure.content": "Đã có lỗi xảy ra khi chỉnh sửa chính sách tài nguyên.", + "resource-policies.edit.page.heading": "Chỉnh sửa chính sách tài nguyên", + "resource-policies.edit.page.other-failure.content": "Đã xảy ra lỗi khi chỉnh sửa chính sách phân quyền. Người dùng\/ nhóm người dùng đã được cập nhật thành công.", + "resource-policies.edit.page.success.content": "Hành động thành công", + "resource-policies.edit.page.target-failure.content": "Đã xảy ra lỗi khi chỉnh sửa người dùng\/ nhóm người dùng trong chính sách phân quyền.", + "resource-policies.edit.page.title": "Chỉnh sửa chính sách phân quyền", + "resource-policies.form.action-type.label": "Lựa chọn kiểu hành động", + "resource-policies.form.action-type.required": "Bạn cần phải lựa chọn hành động chính sách phân quyền.", + "resource-policies.form.date.end.label": "Ngày kết thúc", + "resource-policies.form.date.start.label": "Ngày bắt đầu", + "resource-policies.form.description.label": "Mô tả", + "resource-policies.form.eperson-group-list.label": "Người hoặc nhóm người dùng được cấp quyền", + "resource-policies.form.eperson-group-list.modal.close": "Ok", + "resource-policies.form.eperson-group-list.modal.header": "Không thể thay đổi kiểu", + "resource-policies.form.eperson-group-list.modal.text1.toEPerson": "Không thể thay thế nhóm người dùng bằng người dùng.", + "resource-policies.form.eperson-group-list.modal.text1.toGroup": "Không thể thay thế người dùng bằng nhóm người dùng.", + "resource-policies.form.eperson-group-list.modal.text2": "Xóa chính sách phân quyền hiện tại và tạo chính sách mới với kiểu mong muốn.", + "resource-policies.form.eperson-group-list.select.btn": "Lựa chọn", + "resource-policies.form.eperson-group-list.tab.eperson": "Tìm kiếm người dùng", + "resource-policies.form.eperson-group-list.tab.group": "Tìm kiếm một nhóm người dùng", + "resource-policies.form.eperson-group-list.table.headers.action": "Hành động", + "resource-policies.form.eperson-group-list.table.headers.id": "ID", + "resource-policies.form.eperson-group-list.table.headers.name": "Tên", + "resource-policies.form.name.label": "Tên", + "resource-policies.form.policy-type.label": "Lựa chọn kiểu chính sách", + "resource-policies.form.policy-type.required": "Bạn cần lựa chọn kiểu chính sách tài nguyên.", + "resource-policies.table.headers.action": "Quyền", + "resource-policies.table.headers.date.end": "Ngày kết thúc", + "resource-policies.table.headers.date.start": "Ngày bắt đầu", + "resource-policies.table.headers.edit": "Chỉnh sửa", + "resource-policies.table.headers.edit.group": "Chỉnh sửa nhóm", + "resource-policies.table.headers.edit.policy": "Chỉnh sửa chính sách", + "resource-policies.table.headers.eperson": "Người dùng", + "resource-policies.table.headers.group": "Nhóm", + "resource-policies.table.headers.id": "ID", + "resource-policies.table.headers.name": "Tên", + "resource-policies.table.headers.policyType": "kiểu", + "resource-policies.table.headers.title.for.bitstream": "Chính sách tệp dữ liệu số", + "resource-policies.table.headers.title.for.bundle": "Chính sách gói dữ liệu số", + "resource-policies.table.headers.title.for.collection": "Chính sách bộ sưu tập", + "resource-policies.table.headers.title.for.community": "Chính sách đơn vị", + "resource-policies.table.headers.title.for.item": "Chính sách tài liệu", + "resource-policies.table.headers.title.for.topic": "Chính sách topic", + + "search.breadcrumbs": "Tìm kiếm", + "search.browse.item-back": "Quay lại kết quả tìm kiếm", + "search.filters.applied.f.author": "Tác giả", + "search.filters.applied.f.birthDate.max": "Ngày sinh kết thúc", + "search.filters.applied.f.birthDate.min": "Ngày sinh bắt đầu", + "search.filters.applied.f.dateIssued.max": "Ngày kết thúc", + "search.filters.applied.f.dateIssued.min": "Ngày bắt đầu", + "search.filters.applied.f.dateSubmitted": "Ngày đăng", + "search.filters.applied.f.discoverable": "Tài liệu cá nhân", + "search.filters.applied.f.entityType": "Kiểu tài liệu", + "search.filters.applied.f.has_content_in_original_bundle": "Có tệp", + "search.filters.applied.f.itemtype": "Kiểu", + "search.filters.applied.f.jobTitle": "Chức danh", + "search.filters.applied.f.namedresourcetype": "Trạng thái", + "search.filters.applied.f.subject": "Chủ đề", + "search.filters.applied.f.submitter": "Người gửi", + "search.filters.applied.f.withdrawn": "Tài liệu ẩn", + "search.filters.discoverable.false": "Có", + "search.filters.discoverable.true": "Không", + "search.filters.entityType.JournalIssue": "Kỳ của tạp chí", + "search.filters.entityType.JournalVolume": "Số tập cảu tạp chí", + "search.filters.entityType.OrgUnit": "Đơn vị tổ chức", + "search.filters.filter.author.head": "Tác giả", + "search.filters.filter.author.label": "Tìm kiếm tên tác giả", + "search.filters.filter.author.placeholder": "Tên tác giả", + "search.filters.filter.birthDate.head": "Ngày sinh", + "search.filters.filter.birthDate.label": "Tìm kiếm ngày sinh", + "search.filters.filter.birthDate.placeholder": "Ngày sinh", + "search.filters.filter.collapse": "Thu hẹp bộ lọc", + "search.filters.filter.creativeDatePublished.head": "Ngày xuất bản", + "search.filters.filter.creativeDatePublished.label": "Tìm kiếm ngày xuất bản", + "search.filters.filter.creativeDatePublished.placeholder": "Ngày xuất bản", + "search.filters.filter.creativeWorkEditor.head": "Người biên tập", + "search.filters.filter.creativeWorkEditor.label": "Tìm kiếm người biên tập", + "search.filters.filter.creativeWorkEditor.placeholder": "Người biên tập", + "search.filters.filter.creativeWorkKeywords.head": "Chủ đề", + "search.filters.filter.creativeWorkKeywords.label": "Tìm kiếm chủ đề", + "search.filters.filter.creativeWorkKeywords.placeholder": "Chủ đề", + "search.filters.filter.creativeWorkPublisher.head": "Nhà xuất bản", + "search.filters.filter.creativeWorkPublisher.label": "Tìm kiếm nhà xuất bản", + "search.filters.filter.creativeWorkPublisher.placeholder": "Nhà xuất bản", + "search.filters.filter.dateIssued.head": "Thời gian xuất bản", + "search.filters.filter.dateIssued.max.label": "Kết thúc", + "search.filters.filter.dateIssued.max.placeholder": "Thời gian tối đa", + "search.filters.filter.dateIssued.min.label": "Bắt đầu", + "search.filters.filter.dateIssued.min.placeholder": "Thời gian tối thiểu", + "search.filters.filter.dateSubmitted.head": "Ngày gửi", + "search.filters.filter.dateSubmitted.label": "Tìm kiếm ngày gửi", + "search.filters.filter.dateSubmitted.placeholder": "Ngày gửi", + "search.filters.filter.discoverable.head": "Tài liệu cá nhân", + "search.filters.filter.entityType.head": "Kiểu thực thể", + "search.filters.filter.entityType.label": "Tìm kiếm kiểu thực thể", + "search.filters.filter.entityType.placeholder": "Kiểu thực thể", + "search.filters.filter.expand": "Mở rộng bộ lọc", + "search.filters.filter.has_content_in_original_bundle.head": "Có tệp", + "search.filters.filter.itemtype.head": "Kiểu tài liệu", + "search.filters.filter.itemtype.label": "Tìm kiếm kiểu tài liệu", + "search.filters.filter.itemtype.placeholder": "Kiểu tài liệu", + "search.filters.filter.jobTitle.head": "Chức danh", + "search.filters.filter.jobTitle.label": "Tìm kiếm chức danh", + "search.filters.filter.jobTitle.placeholder": "Chức danh", + "search.filters.filter.knowsLanguage.head": "Ngôn ngữ", + "search.filters.filter.knowsLanguage.label": "Tìm kiếm ngôn ngữ", + "search.filters.filter.knowsLanguage.placeholder": "Ngôn ngữ", + "search.filters.filter.namedresourcetype.head": "Trạng thái", + "search.filters.filter.namedresourcetype.label": "Tìm kiếm trạng thái", + "search.filters.filter.namedresourcetype.placeholder": "Trạng thái", + "search.filters.filter.objectpeople.head": "Người", + "search.filters.filter.objectpeople.label": "Tìm kiếm tên người", + "search.filters.filter.objectpeople.placeholder": "Người", + "search.filters.filter.organizationAddressCountry.head": "Quốc gia", + "search.filters.filter.organizationAddressCountry.label": "Tìm kiếm quốc gia", + "search.filters.filter.organizationAddressCountry.placeholder": "Quốc gia", + "search.filters.filter.organizationAddressLocality.head": "Thành phố", + "search.filters.filter.organizationAddressLocality.label": "Tìm kiếm thành phố", + "search.filters.filter.organizationAddressLocality.placeholder": "Thành phố", + "search.filters.filter.organizationFoundingDate.head": "Ngày thành lập", + "search.filters.filter.organizationFoundingDate.label": "Tìm kiếm ngày thành lập", + "search.filters.filter.organizationFoundingDate.placeholder": "Ngày thành lập", + "search.filters.filter.scope.head": "Phạm vi", + "search.filters.filter.scope.label": "Tìm kiếm phạm vi giới hạn", + "search.filters.filter.scope.placeholder": "phạm vi giới hạn", + "search.filters.filter.show-less": "Thu hẹp", + "search.filters.filter.show-more": "Xem thêm", + "search.filters.filter.show-tree": "Duyệt cây {{ name }}", + "search.filters.filter.subject.head": "Chủ đề", + "search.filters.filter.subject.label": "Tìm kiếm chủ đề", + "search.filters.filter.subject.placeholder": "Chủ đề", + "search.filters.filter.submitter.head": "Người gửi", + "search.filters.filter.submitter.label": "Tìm kiếm người gửi", + "search.filters.filter.submitter.placeholder": "Người gửi", + "search.filters.filter.withdrawn.head": "Tài liệu ẩn", + "search.filters.has_content_in_original_bundle.false": "Không", + "search.filters.has_content_in_original_bundle.true": "Có", + "search.filters.head": "Bộ lọc", + "search.filters.reset": "Làm mới bộ lọc", + "search.filters.search.submit": "Xác nhận", + "search.filters.withdrawn.false": "Không", + "search.filters.withdrawn.true": "Có", + "search.form.scope.all": "Toàn bộ thư viện", + "search.form.search": "Tìm kiếm", + "search.form.search_dspace": "tất cả kho lưu trữ", + "search.results.empty": "Tìm kiếm của bạn không trả về kết quả.", + "search.results.head": "Kết quả tìm kiếm", + "search.results.no-results": "Tìm kiếm của bạn không trả về kết quả. Bạn có gặp khó khăn khi thực hiện tìm kiếm? Hãy thử lại bằng cách", + "search.results.no-results-link": "đặt từ khóa tìm vào trong cặp dấu ngoặc kép", + "search.results.response.500": "Đã xảy ra lỗi trong khi thực hiện truy vấn vui lòng thử lại sau", + "search.results.view-result": "Xem", + "search.search-form.placeholder": "Từ khóa tìm kiếm", + "search.sidebar.close": "Quay lại kết quả tìm kiếm", + "search.sidebar.filters.title": "Bộ lọc", + "search.sidebar.open": "Công cụ tìm kiếm", + "search.sidebar.results": "kết quả", + "search.sidebar.settings.rpp": "Kết quả mỗi trang", + "search.sidebar.settings.sort-by": "Sắp xếp theo", + "search.sidebar.settings.title": "Cài đặt", + "search.switch-configuration.title": "Xem", + "search.title": "Tìm kiếm", + "search.view-switch.show-detail": "Xem chi tiết", + "search.view-switch.show-grid": "Hiển thị dưới dạng lưới", + "search.view-switch.show-list": "Hiển thị dưới dạng danh sách", + + "sorting.ASC": "Tăng dần", + "sorting.dc.date.accessioned.ASC": "Tăng dần theo ngày lưu trữ", + "sorting.dc.date.accessioned.DESC": "Giảm dần theo ngày lưu trữ", + "sorting.dc.date.issued.ASC": "Tăng dần theo ngày", + "sorting.dc.date.issued.DESC": "Giảm dần theo ngày", + "sorting.dc.title.ASC": "Tăng dần theo nhan đề", + "sorting.dc.title.DESC": "Giảm dần theo nhan đề", + "sorting.DESC": "Giảm dần", + "sorting.lastModified.ASC": "Tăng dần theo lần chỉnh sửa cuối cùng", + "sorting.lastModified.DESC": "Giảm dần theo lần chỉnh sửa cuối cùng", + "sorting.score.ASC": "Liên quan ít nhất", + "sorting.score.DESC": "Liên quan nhiều nhất", + + "statistics.breadcrumbs": "Thống kê", + "statistics.header": "Thống kê theo {{ scope }}", + "statistics.page.no-data": "Không có dữ liệu", + "statistics.table.header.views": "Xem", + "statistics.table.no-data": "Không có dữ liệu", + "statistics.table.title.TopCities": "Top thành phố xem nhiều nhất", + "statistics.table.title.TopCountries": "Top quốc gia xem nhiều nhất", + "statistics.table.title.TotalDownloads": "Truy cập tệp", + "statistics.table.title.TotalVisits": "Tổng số truy cập", + "statistics.table.title.TotalVisitsPerMonth": "Tổng số lượt truy cập theo từng tháng", + "statistics.title": "Thống kê", + + + "submission.edit.breadcrumbs": "Chỉnh sửa đăng ký", + "submission.edit.title": "Chỉnh sửa đăng ký", + "submission.general.cancel": "Hủy", + "submission.general.cannot_submit": "Bạn không có quyền chỉnh sửa đăng ký đã gửi .", + "submission.general.deposit": "Tải lên", + "submission.general.discard.confirm.cancel": "Hủy", + "submission.general.discard.confirm.info": "Không thể hoàn tác thao tác. Bạn có chắc chắn không?", + "submission.general.discard.confirm.submit": "Có tôi đồng ý", + "submission.general.discard.confirm.title": "Hủy đăng ký", + "submission.general.discard.submit": "Hủy", + "submission.general.info.pending-changes": "Thay đổi chưa được lưu", + "submission.general.info.saved": "Lưu", + "submission.general.save": "Lưu", + "submission.general.save-later": "Lưu lại", + "submission.import-external.back-to-my-dspace": "Trở lại thư viện số", + "submission.import-external.page.hint": "Nhập vào một truy vấn phía trên để tìm các tài liệu trên trang web để nhập vào thư viện số", + "submission.import-external.page.title": "Nhập thông tin mô tả từ nguồn bên ngoài", + "submission.import-external.preview.button.import": "Bắt đầu gửi", + "submission.import-external.preview.error.import.body": "Đã xảy ra lỗi trong quá trình nhập tài liệu từ nguồn bên ngoài", + "submission.import-external.preview.error.import.title": "Lỗi gửi đi", + "submission.import-external.preview.subtitle": "Siêu dữ liệu bên dưới được nhập từ nguồn bên ngoài. Nó sẽ được điền vào trước khi bạn gửi đi.", + "submission.import-external.preview.title": "Xem trước tài liệu", + "submission.import-external.preview.title.Journal": "Xem trước Tạp chí", + "submission.import-external.preview.title.none": "Xem trước tài liệu", + "submission.import-external.preview.title.OrgUnit": "Xem trước tổ chức", + "submission.import-external.preview.title.Person": "Xem trước Tác giả\/nhà nghiên cứu", + "submission.import-external.preview.title.Project": "Xem trước dự án", + "submission.import-external.preview.title.Publication": "Xem trước ấn phẩm", + "submission.import-external.search.button": "Tìm kiếm", + "submission.import-external.search.button.hint": "Nhập một từ để tìm kiếm", + "submission.import-external.search.placeholder": "Tìm kiếm nguồn bên ngoài", + "submission.import-external.search.source.hint": "Chọn một nguồn bên ngoài", + "submission.import-external.source.ads": "NASA\/ADS", + "submission.import-external.source.arxiv": "arXiv", + "submission.import-external.source.cinii": "CiNii", + "submission.import-external.source.crossref": "CrossRef", + "submission.import-external.source.datacite": "submission.import-external.source.datacite", + "submission.import-external.source.epo": "Văn phòng Bằng sáng chế Châu Âu (EPO)", + "submission.import-external.source.lcname": "Tên Thư viện Quốc hội", + "submission.import-external.source.loading": "Đang tải lên ...", + "submission.import-external.source.openAIREFunding": "Funding OpenAIRE API", + "submission.import-external.source.orcid": "ORCID", + "submission.import-external.source.orcidWorks": "ORCID", + "submission.import-external.source.pubmed": "Pubmed", + "submission.import-external.source.pubmedeu": "Pubmed Europe", + "submission.import-external.source.scielo": "SciELO", + "submission.import-external.source.scopus": "SciELO", + "submission.import-external.source.sherpaJournal": "Tạp chí SHERPA", + "submission.import-external.source.sherpaJournalIssn": "Số ISSN của tạp chí SHERPA", + "submission.import-external.source.sherpaPublisher": "Nhà xuất bản SHERPA", + "submission.import-external.source.vufind": "VuFind", + "submission.import-external.source.wos": "Web Of Science", + "submission.import-external.title": "Nhập thông tin mô tả từ nguồn bên ngoài", + "submission.import-external.title.Journal": "Nhập tạp chí từ nguồn bên ngoài", + "submission.import-external.title.JournalIssue": "Nhập kỳ ấn phẩm tạp chí từ nguồn bên ngoài", + "submission.import-external.title.JournalVolume": "Nhập một tập của tạp chí từ nguồn bên ngoài", + "submission.import-external.title.none": "Nhập thông tin mô tả từ nguồn bên ngoài", + "submission.import-external.title.OrgUnit": "Nhập nhà xuất bản từ nguồn bên ngoài", + "submission.import-external.title.Person": "Nhập một tác giả\/ nhà nghiên cứu từ nguồn bên ngoài", + "submission.import-external.title.Project": "Nhập một dự án từ nguồn bên ngoài", + "submission.import-external.title.Publication": "Nhập một ấn phẩm từ nguồn bên ngoài", + "submission.sections.accesses.form.access-condition-hint": "Chọn chính sách phân quyền để áp dụng cho biểu ghi khi nó được nhập vào hệ thống.", + "submission.sections.accesses.form.access-condition-label": "Loại chính sách truy cập", + "submission.sections.accesses.form.date-required": "Thông tin thời gian là bắt buộc.", + "submission.sections.accesses.form.date-required-from": "Bắt buộc phải khai báo thời gian để xác định ngày bắt đầu cấp quyền truy cập", + "submission.sections.accesses.form.date-required-until": "Bắt buộc phải khai báo thời gian để xác định ngày bắt đầu cấp quyền truy cập", + "submission.sections.accesses.form.discoverable-description": "Khi được chọn biểu ghi này sẽ có thể được tìm thấy trong các chức năng tìm kiếm\/duyệt. Khi bỏ chọn biểu ghi sẽ chỉ có sẵn qua đường dẫn trực tiếp và sẽ không bao giờ xuất hiện trong tìm kiếm\/duyệt.", + "submission.sections.accesses.form.discoverable-label": "Có thể khám phá", + "submission.sections.accesses.form.from-hint": "Chọn ngày mà quyền được áp dụng", + "submission.sections.accesses.form.from-label": "Cấp quyền truy cập từ", + "submission.sections.accesses.form.from-placeholder": "Từ", + "submission.sections.accesses.form.group-label": "Nhóm", + "submission.sections.accesses.form.group-required": "Trường Nhóm là bắt buộc.", + "submission.sections.accesses.form.until-hint": "Chọn ngày mà quyền được áp dụng", + "submission.sections.accesses.form.until-label": "Cấp quyền truy cập cho đến khi", + "submission.sections.accesses.form.until-placeholder": "Cho tới khi", + "submission.sections.ccLicense.change": "Thay đổi loại giấy phép…", + "submission.sections.ccLicense.confirmation": "Tôi đồng ý với giấy phép ở trên", + "submission.sections.ccLicense.link": "Bạn có lựa chọn theo giấy phép này:", + "submission.sections.ccLicense.none": "Không có giấy phép nào", + "submission.sections.ccLicense.option.select": "Lựa chọn tùy chọn…", + "submission.sections.ccLicense.select": "Lựa chọn loại giấy phép…", + "submission.sections.ccLicense.type": "Loại giấy phép", + "submission.sections.describe.relationship-lookup.close": "Đóng", + "submission.sections.describe.relationship-lookup.external-source.added": "Thêm thành công tài liệu nội bộ vào mục đã chọn", + "submission.sections.describe.relationship-lookup.external-source.import-button-title.Equipment": "Nhập thiết bị từ cơ sở dữ liệu từ xa", + "submission.sections.describe.relationship-lookup.external-source.import-button-title.Event": "Nhập sự kiện từ cơ sở dữ liệu từ xa", + "submission.sections.describe.relationship-lookup.external-source.import-button-title.Funding": "Nhập sự kiện từ cơ sở dữ liệu từ xa", + "submission.sections.describe.relationship-lookup.external-source.import-button-title.isAuthorOfPublication": "Nhập tác giả từ xa", + "submission.sections.describe.relationship-lookup.external-source.import-button-title.isProjectOfPublication": "Dự án", + "submission.sections.describe.relationship-lookup.external-source.import-button-title.Journal": "Nhập tạp chí từ xa", + "submission.sections.describe.relationship-lookup.external-source.import-button-title.JournalIssue": "Nhập số kỳ của tạp chí từ cơ sở dữ liệu từ xa", + "submission.sections.describe.relationship-lookup.external-source.import-button-title.JournalVolume": "Nhập số tập của tạp chí từ cơ sở dữ liệu từ xa", + "submission.sections.describe.relationship-lookup.external-source.import-button-title.none": "Nhập tài liệu từ cơ sở dữ liệu từ xa", + "submission.sections.describe.relationship-lookup.external-source.import-button-title.OrgUnit": "Nhập tổ chức từ cơ sở dữ liệu từ xa", + "submission.sections.describe.relationship-lookup.external-source.import-button-title.Patent": "Nhập bằng sáng chế từ cơ sở dữ liệu từ xa", + "submission.sections.describe.relationship-lookup.external-source.import-button-title.Person": "Nhập tác giả\/ nhà nghiên cứu từ cơ sở dữ liệu từ xa", + "submission.sections.describe.relationship-lookup.external-source.import-button-title.Product": "Nhập tác giả\/ nhà nghiên cứu từ cơ sở dữ liệu từ xa", + "submission.sections.describe.relationship-lookup.external-source.import-button-title.Project": "Nhập dự án từ cơ sở dữ liệu từ xa", + "submission.sections.describe.relationship-lookup.external-source.import-button-title.Publication": "Nhập ấn phẩm từ cơ sở dữ liệu từ xa", + "submission.sections.describe.relationship-lookup.external-source.import-modal.authority": "Kiểm soát", + "submission.sections.describe.relationship-lookup.external-source.import-modal.authority.new": "Nhập dưới dạng một kiểm soát nội bộ mới", + "submission.sections.describe.relationship-lookup.external-source.import-modal.cancel": "Hủy", + "submission.sections.describe.relationship-lookup.external-source.import-modal.collection": "Chọn một bộ sưu tập để thêm các tài liệu mới", + "submission.sections.describe.relationship-lookup.external-source.import-modal.entities": "Thực thể", + "submission.sections.describe.relationship-lookup.external-source.import-modal.entities.new": "Nhập vào một thực thể nội bộ mới", + "submission.sections.describe.relationship-lookup.external-source.import-modal.head.arxiv": "Nhập từ arXiv", + "submission.sections.describe.relationship-lookup.external-source.import-modal.head.lcname": "Nhập từ tên LC", + "submission.sections.describe.relationship-lookup.external-source.import-modal.head.openAIREFunding": "Funding OpenAIRE API", + "submission.sections.describe.relationship-lookup.external-source.import-modal.head.orcid": "Nhập từ ORCID", + "submission.sections.describe.relationship-lookup.external-source.import-modal.head.pubmed": "Nhập từ PubMed", + "submission.sections.describe.relationship-lookup.external-source.import-modal.head.sherpaJournal": "Nhập từ tạp chí Sherpa", + "submission.sections.describe.relationship-lookup.external-source.import-modal.head.sherpaPublisher": "Nhập từ nhà xuất bản Sherpa", + "submission.sections.describe.relationship-lookup.external-source.import-modal.import": "Nhập liệu", + "submission.sections.describe.relationship-lookup.external-source.import-modal.isAuthorOfPublication.added.local-entity": "Thêm thành công tác giả nội bộ bộ vào mục đã chọn", + "submission.sections.describe.relationship-lookup.external-source.import-modal.isAuthorOfPublication.added.new-entity": "Nhập thành công và thêm tác giả bên ngoài vào mục đã chọn", + "submission.sections.describe.relationship-lookup.external-source.import-modal.isAuthorOfPublication.title": "Nhập tác giả từ cơ sở dữ liệu từ xa", + "submission.sections.describe.relationship-lookup.external-source.import-modal.isProjectOfPublication.added.new-entity": "Thực thể mới đã được thêm!", + "submission.sections.describe.relationship-lookup.external-source.import-modal.isProjectOfPublication.title": "Dự án", + "submission.sections.describe.relationship-lookup.external-source.import-modal.Journal.added.local-entity": "Thêm thành công tạp chí đã chọn", + "submission.sections.describe.relationship-lookup.external-source.import-modal.Journal.added.new-entity": "Nhập thành công tạp chí bên ngoài vào mục lựa chọn", + "submission.sections.describe.relationship-lookup.external-source.import-modal.Journal.title": "Nhập tạp chí từ xa", + "submission.sections.describe.relationship-lookup.external-source.import-modal.JournalIssue.added.local-entity": "Thêm thành công số kỳ tạp chí nội bộ vào mục lựa chọn", + "submission.sections.describe.relationship-lookup.external-source.import-modal.JournalIssue.added.new-entity": "Nhập thành công và thêm số kỳ của tạp chí bên ngoài vào mục lựa chọn", + "submission.sections.describe.relationship-lookup.external-source.import-modal.JournalIssue.title": "Nhập số kỳ của tạp chí từ xa", + "submission.sections.describe.relationship-lookup.external-source.import-modal.JournalVolume.added.local-entity": "Thêm thành công số tập của tạp chí nội bộ vào mục lựa chọn", + "submission.sections.describe.relationship-lookup.external-source.import-modal.JournalVolume.added.new-entity": "Nhập và thêm thành công số tập của tạp chí bên ngoài vào mục lựa chọn", + "submission.sections.describe.relationship-lookup.external-source.import-modal.JournalVolume.title": "Nhập số tập của tạp chí từ xa", + "submission.sections.describe.relationship-lookup.external-source.import-modal.select": "Chọn một phù hợp:", + "submission.sections.describe.relationship-lookup.name-variant.notification.confirm": "Lưu một biến thể tên mới", + "submission.sections.describe.relationship-lookup.name-variant.notification.content": "Bạn có muốn lưu \"{{ value }}\" làm tên biến thể cho người này để bạn và những người khác có thể sử dụng lại cho những lần gửi sau không? Nếu không bạn vẫn có thể sử dụng cho lần gửi này\"", + "submission.sections.describe.relationship-lookup.name-variant.notification.decline": "Chỉ sử dụng cho lần gửi này", + "submission.sections.describe.relationship-lookup.search-tab.deselect-all": "Bỏ chọn tất cả", + "submission.sections.describe.relationship-lookup.search-tab.deselect-page": "Bỏ chọn trang", + "submission.sections.describe.relationship-lookup.search-tab.loading": "Đang tải...", + "submission.sections.describe.relationship-lookup.search-tab.placeholder": "Tìm kiếm truy vấn", + "submission.sections.describe.relationship-lookup.search-tab.search": "Đi", + "submission.sections.describe.relationship-lookup.search-tab.search-form.placeholder": "Tìm kiếm...", + "submission.sections.describe.relationship-lookup.search-tab.select-all": "Lựa chọn tất cả", + "submission.sections.describe.relationship-lookup.search-tab.select-page": "Lựa chọn trang", + "submission.sections.describe.relationship-lookup.search-tab.tab-title.arxiv": "arXiv ({{ count }})", + "submission.sections.describe.relationship-lookup.search-tab.tab-title.DataFile": "Tệp dữ liệu nội bộ ({{ count }})", + "submission.sections.describe.relationship-lookup.search-tab.tab-title.DataPackage": "Gói dữ liệu nội bộ ({{ count }})", + "submission.sections.describe.relationship-lookup.search-tab.tab-title.isAuthorOfPublication": "Tác giả nội bộ ({{ count }})", + "submission.sections.describe.relationship-lookup.search-tab.tab-title.isChildOrgUnitOf": "Tìm kiếm đơn vị tổ chức", + "submission.sections.describe.relationship-lookup.search-tab.tab-title.isFundingAgencyOfProject": "Nhà tài trợ của dự án", + "submission.sections.describe.relationship-lookup.search-tab.tab-title.isFundingAgencyOfPublication": "Tìm kiếm cơ quan cấp vốn", + "submission.sections.describe.relationship-lookup.search-tab.tab-title.isFundingOfPublication": "Tìm kiếm tài trợ", + "submission.sections.describe.relationship-lookup.search-tab.tab-title.isJournalIssueOfPublication": "Số kỳ của tạp chí nội bộ ({{ count }})", + "submission.sections.describe.relationship-lookup.search-tab.tab-title.isJournalOfPublication": "Tạp chí nội bộ ({{ count }})", + "submission.sections.describe.relationship-lookup.search-tab.tab-title.isJournalVolumeOfPublication": "Số tập của tạp chí nội bộ ({{ count }})", + "submission.sections.describe.relationship-lookup.search-tab.tab-title.isProjectOfPublication": "Dự án", + "submission.sections.describe.relationship-lookup.search-tab.tab-title.isPublicationOfAuthor": "Ấn phẩm của tác giả", + "submission.sections.describe.relationship-lookup.search-tab.tab-title.Journal": "Tạp chí nội bộ ({{ count }})", + "submission.sections.describe.relationship-lookup.search-tab.tab-title.JournalIssue": "Số kỳ của tạp chsi nội bộ ({{ count }})", + "submission.sections.describe.relationship-lookup.search-tab.tab-title.JournalVolume": "Số tập của tạp chí nội bộ ({{ count }})", + "submission.sections.describe.relationship-lookup.search-tab.tab-title.lcname": "Tên LC ({{ count }})", + "submission.sections.describe.relationship-lookup.search-tab.tab-title.openAIREFunding": "Funding OpenAIRE API", + "submission.sections.describe.relationship-lookup.search-tab.tab-title.orcid": "ORCID ({{ count }})", + "submission.sections.describe.relationship-lookup.search-tab.tab-title.OrgUnit": "Đơn vị tổ chức nội bộ ({{ count }})", + "submission.sections.describe.relationship-lookup.search-tab.tab-title.Person": "Tác giả nội bộ ({{ count }})", + "submission.sections.describe.relationship-lookup.search-tab.tab-title.Project": "Dự án nội bộ ({{ count }})", + "submission.sections.describe.relationship-lookup.search-tab.tab-title.Publication": "Ấn phẩm nội bộ ({{ count }})", + "submission.sections.describe.relationship-lookup.search-tab.tab-title.pubmed": "PubMed ({{ count }})", + "submission.sections.describe.relationship-lookup.search-tab.tab-title.sherpaJournal": "Tạp chí Sherpa ({{ count }})", + "submission.sections.describe.relationship-lookup.search-tab.tab-title.sherpaPublisher": "Nhà xuất bản Sherpa ({{ count }})", + "submission.sections.describe.relationship-lookup.search-tab.toggle-dropdown": "Chuyển đổi danh mục thả xuống", + "submission.sections.describe.relationship-lookup.selected": "Lựa chọn {{ size }} tài liệu", + "submission.sections.describe.relationship-lookup.selection-tab.no-selection": "Lựa chọn cảu bạn hiện đang trống.", + "submission.sections.describe.relationship-lookup.selection-tab.search-form.placeholder": "Tìm kiếm...", + "submission.sections.describe.relationship-lookup.selection-tab.settings": "Cài đặt", + "submission.sections.describe.relationship-lookup.selection-tab.tab-title": "Lựa chọn hiện tại ({{ count }})", + "submission.sections.describe.relationship-lookup.selection-tab.title": "Kết quả tìm kiếm", + "submission.sections.describe.relationship-lookup.selection-tab.title.arxiv": "Kết quả tìm kiếm", + "submission.sections.describe.relationship-lookup.selection-tab.title.crossref": "Kết quả tìm kiếm", + "submission.sections.describe.relationship-lookup.selection-tab.title.DataFile": "Lựa chọn tệp dữ liệu", + "submission.sections.describe.relationship-lookup.selection-tab.title.DataPackage": "Lựa chọn gói dữ liệu", + "submission.sections.describe.relationship-lookup.selection-tab.title.epo": "Kết quả tìm kiếm", + "submission.sections.describe.relationship-lookup.selection-tab.title.isAuthorOfPublication": "Lựa chọn tác giả.", + "submission.sections.describe.relationship-lookup.selection-tab.title.isChildOrgUnitOf": "Lựa chọn đơn vị tổ chức", + "submission.sections.describe.relationship-lookup.selection-tab.title.isFundingAgencyOfPublication": "Lựa chọn đơn vị tổ chức", + "submission.sections.describe.relationship-lookup.selection-tab.title.isFundingOfPublication": "Lựa chọn tài trợ", + "submission.sections.describe.relationship-lookup.selection-tab.title.isJournalIssueOfPublication": "Lựa chọn kỳ của tạp chí", + "submission.sections.describe.relationship-lookup.selection-tab.title.isJournalOfPublication": "Lựa chọn tạp chí", + "submission.sections.describe.relationship-lookup.selection-tab.title.isJournalVolumeOfPublication": "Lựa chọn số tập của tạp chí", + "submission.sections.describe.relationship-lookup.selection-tab.title.isProjectOfPublication": "Dự án", + "submission.sections.describe.relationship-lookup.selection-tab.title.Journal": "Lựa chọn tạp chí", + "submission.sections.describe.relationship-lookup.selection-tab.title.JournalIssue": "Lựa chọn số kỳ của tạp chí", + "submission.sections.describe.relationship-lookup.selection-tab.title.JournalVolume": "Lựa chọn số tập của tạp chí", + "submission.sections.describe.relationship-lookup.selection-tab.title.lcname": "Kết quả tìm kiếm", + "submission.sections.describe.relationship-lookup.selection-tab.title.openAIREFunding": "Funding OpenAIRE API", + "submission.sections.describe.relationship-lookup.selection-tab.title.orcid": "Kết quả tìm kiếm", + "submission.sections.describe.relationship-lookup.selection-tab.title.orcidv2": "Kết quả tìm kiếm", + "submission.sections.describe.relationship-lookup.selection-tab.title.OrgUnit": "Lựa chọn đơn vị tổ chức", + "submission.sections.describe.relationship-lookup.selection-tab.title.Person": "Lựa chọn tác giả", + "submission.sections.describe.relationship-lookup.selection-tab.title.Project": "Lựa chọn dự án", + "submission.sections.describe.relationship-lookup.selection-tab.title.Publication": "Lựa chọn ấn phẩm", + "submission.sections.describe.relationship-lookup.selection-tab.title.pubmed": "Kết quả tìm kiếm", + "submission.sections.describe.relationship-lookup.selection-tab.title.scielo": "Kết quả tìm kiếm", + "submission.sections.describe.relationship-lookup.selection-tab.title.scopus": "Kết quả tìm kiếm", + "submission.sections.describe.relationship-lookup.selection-tab.title.sherpaJournal": "Lựa chọn kết quả", + "submission.sections.describe.relationship-lookup.selection-tab.title.sherpaPublisher": "Kết quả tìm kiếm", + "submission.sections.describe.relationship-lookup.selection-tab.title.wos": "Kết quả tìm kiếm", + "submission.sections.describe.relationship-lookup.title.DataFile": "Tệp dữ liệu", + "submission.sections.describe.relationship-lookup.title.DataPackage": "Gói dữ liệu", + "submission.sections.describe.relationship-lookup.title.FundingAgency": "Đơn vị tài trợ", + "submission.sections.describe.relationship-lookup.title.isAuthorOfPublication": "Tác giả", + "submission.sections.describe.relationship-lookup.title.isChildOrgUnitOf": "Đơn vị tổ chức chính", + "submission.sections.describe.relationship-lookup.title.isFundingAgencyOfProject": "Nhà tài trợ của dự án", + "submission.sections.describe.relationship-lookup.title.isFundingAgencyOfPublication": "Đơn vị tài trợ", + "submission.sections.describe.relationship-lookup.title.isFundingOfPublication": "Tài trợ", + "submission.sections.describe.relationship-lookup.title.isJournalIssueOfPublication": "Số kỳ của tạp chí", + "submission.sections.describe.relationship-lookup.title.isJournalOfPublication": "Tạp chí", + "submission.sections.describe.relationship-lookup.title.isJournalVolumeOfPublication": "Số tập cảu tạp chí", + "submission.sections.describe.relationship-lookup.title.isProjectOfPublication": "Dự án", + "submission.sections.describe.relationship-lookup.title.isPublicationOfAuthor": "Ấn phẩm", + "submission.sections.describe.relationship-lookup.title.JournalIssue": "Số kỳ của tạp chí", + "submission.sections.describe.relationship-lookup.title.JournalVolume": "Số tập của tạp chí", + "submission.sections.describe.relationship-lookup.title.OrgUnit": "Đơn vị tổ chức", + "submission.sections.describe.relationship-lookup.title.Person": "Tác giả", + "submission.sections.describe.relationship-lookup.title.Project": "Dự án", + "submission.sections.describe.relationship-lookup.title.Publication": "Ấn phẩm", + "submission.sections.general.add-more": "Thêm nhiều hơn", + "submission.sections.general.cannot_deposit": "Không thể hoàn tất quá trình nhập dữ liệu do lỗi trong biểu mẫu.
Vui lòng điền vào tất cả các trường bắt buộc để hoàn tất quá trình nhập liệu.", + "submission.sections.general.collection": "Bộ sưu tập", + "submission.sections.general.deposit_error_notice": "Đã xảy ra sự cố khi gửi tài liệu vui lòng thử lại sau.", + "submission.sections.general.deposit_success_notice": "Đã gửi thành công.", + "submission.sections.general.discard_error_notice": "Đã xảy ra sự cố khi hủy tài liệu vui lòng thử lại sau.", + "submission.sections.general.discard_success_notice": "Đã hủy thành công.", + "submission.sections.general.metadata-extracted": "Siêu dữ liệu mới đã được trích xuất và thêm vào phần {{sectionId}} phần.", + "submission.sections.general.metadata-extracted-new-section": " {{sectionId}} mới phần đã được thêm vào thông tin gửi đi.", + "submission.sections.general.no-collection": "Không tìm thấy bộ sưu tập", + "submission.sections.general.no-sections": "Không có tùy chọn", + "submission.sections.general.save_error_notice": "Đã xảy ra sự cố khi lưu tài liệu vui lòng thử lại sau.", + "submission.sections.general.save_success_notice": "Lưu thành công.", + "submission.sections.general.search-collection": "Tìm kiếm bộ sưu tập", + "submission.sections.general.sections_not_valid": "Không có phần nào hoàn thành.", + "submission.sections.license.granted-label": "Xác nhận giấy phép", + "submission.sections.license.notgranted": "Bạn phải chấp nhận giấy phép", + "submission.sections.license.required": "Bạn phải chấp nhận giấy phép", + "submission.sections.sherpa.error.message": "Đã xảy ra lỗi trong quá trình truy xuất thông tin", + "submission.sections.sherpa.publication.information": "Thông tin ấn phẩm", + "submission.sections.sherpa.publication.information.issns": "ISSNs", + "submission.sections.sherpa.publication.information.publishers": "Nhà xuất bản", + "submission.sections.sherpa.publication.information.romeoPub": "Romeo Pub", + "submission.sections.sherpa.publication.information.title": "Nhan đề", + "submission.sections.sherpa.publication.information.url": "URL", + "submission.sections.sherpa.publication.information.zetoPub": "Zeto Pub", + "submission.sections.sherpa.publisher.policy": "Chính sách của nhà xuất bản", + "submission.sections.sherpa.publisher.policy.conditions": "Điều kiện", + "submission.sections.sherpa.publisher.policy.description": "Thông tin dưới đây được tìm thấy thông qua Sherpa Romeo. Dựa trên các chính sách của nhà xuất bản của bạn hệ thống sẽ đưa ra lời khuyên về việc có cần thiết phải hạn chế hay không và\/hoặc những tệp nào mà bạn được phép tải lên. Nếu bạn có thắc mắc vui lòng liên hệ với quản trị viên.", + "submission.sections.sherpa.publisher.policy.embargo": "Hạn chế", + "submission.sections.sherpa.publisher.policy.license": "Bản quyền", + "submission.sections.sherpa.publisher.policy.location": "Vị trí", + "submission.sections.sherpa.publisher.policy.more.information": "Để biết thêm thông tin vui lòng xem đường dẫn dưới đây:", + "submission.sections.sherpa.publisher.policy.noembargo": "Không hạn chế", + "submission.sections.sherpa.publisher.policy.nolocation": "Trống", + "submission.sections.sherpa.publisher.policy.openaccess": "Các đường dẫn truy cập mở được cho phép bởi chính sách của tạp chí này được liệt kê bên dưới theo phiên bản bài viết. Nhấp vào một đường dẫn để xem chi tiết", + "submission.sections.sherpa.publisher.policy.prerequisites": "Điều kiện cần", + "submission.sections.sherpa.publisher.policy.refresh": "Làm mới", + "submission.sections.sherpa.publisher.policy.version": "Phiên bản", + "submission.sections.sherpa.record.information": "Thông tin biểu ghi", + "submission.sections.sherpa.record.information.date.created": "Ngày tạo", + "submission.sections.sherpa.record.information.date.modified": "Lần chỉnh sửa gần nhất", + "submission.sections.sherpa.record.information.id": "ID", + "submission.sections.sherpa.record.information.uri": "URL", + "submission.sections.sherpa-policy.title-empty": "Không có chính sách của nhà xuất bản. Nếu tác phẩm của bạn có ISSN liên quan vui lòng nhập nó ở trên để xem các chính sách truy cập mở của nhà xuất bản (nếu có)", + "submission.sections.status.errors.aria": "có lỗi", + "submission.sections.status.errors.title": "Lỗi", + "submission.sections.status.info.aria": "Thông tin bổ sung", + "submission.sections.status.info.title": "Thông tin bổ sung", + "submission.sections.status.valid.aria": "là hợp lệ", + "submission.sections.status.valid.title": "Hợp lệ", + "submission.sections.status.warnings.aria": "có cảnh báo", + "submission.sections.status.warnings.title": "Cảnh báo", + "submission.sections.submit.progressbar.accessCondition": "Điều kiện truy cập biểu ghi", + "submission.sections.submit.progressbar.CClicense": "Bằng sáng chế", + "submission.sections.submit.progressbar.describe.recycle": "Tái chế", + "submission.sections.submit.progressbar.describe.stepcustom": "Mô tả", + "submission.sections.submit.progressbar.describe.stepone": "Mô tả", + "submission.sections.submit.progressbar.describe.steptwo": "Mô tả", + "submission.sections.submit.progressbar.detect-duplicate": "Các trùng lặp xảy ra", + "submission.sections.submit.progressbar.license": "Giấy phép tiền gửi", + "submission.sections.submit.progressbar.sherpaPolicies": "Chính sách truy cập mở của nhà xuất bản", + "submission.sections.submit.progressbar.sherpapolicy": "Chính sách", + "submission.sections.submit.progressbar.upload": "Tải tệp lên", + "submission.sections.toggle.aria.close": "Thu hẹp phần {{sectionHeader}}", + "submission.sections.toggle.aria.open": "Mở rộng phần {{sectionHeader}}", + "submission.sections.toggle.close": "Đóng phiên", + "submission.sections.toggle.open": "Mở phiên mới", + "submission.sections.upload.delete.confirm.cancel": "Hủy", + "submission.sections.upload.delete.confirm.info": "Không thể hoàn tác thao tác này. Bạn có chắc không?", + "submission.sections.upload.delete.confirm.submit": "Có tôi chắc chắn", + "submission.sections.upload.delete.confirm.title": "Xóa dữ liệu số", + "submission.sections.upload.delete.submit": "Xóa", + "submission.sections.upload.download.title": "Tải dữ liệu số", + "submission.sections.upload.drop-message": "Kéo tệp đính kèm vào tài liệu", + "submission.sections.upload.edit.title": "Chỉnh sửa dữ liệu số", + "submission.sections.upload.form.access-condition-hint": "Chọn quyền truy cập áp dụng trên tệp tin khi biểu ghi được biên mục vào hệ thống.", + "submission.sections.upload.form.access-condition-label": "Loại điều kiện truy cập", + "submission.sections.upload.form.date-required": "Ngày yêu cầu", + "submission.sections.upload.form.date-required-from": "Bắt buộc phải khai báo thời gian để xác định ngày bắt đầu cấp quyền truy cập", + "submission.sections.upload.form.date-required-until": "Bắt buộc phải khai báo thời gian để xác định ngày kết thúc cấp quyền truy cập", + "submission.sections.upload.form.from-hint": "Chọn ngày mà quyền được áp dụng", + "submission.sections.upload.form.from-label": "Cấp quyền truy cập từ", + "submission.sections.upload.form.from-placeholder": "Từ", + "submission.sections.upload.form.group-label": "Nhóm", + "submission.sections.upload.form.group-required": "Nhóm yêu cầu.", + "submission.sections.upload.form.until-hint": "Chọn ngày hết hạn quyền truy cập", + "submission.sections.upload.form.until-label": "Cấp quyền truy cập cho đến khi", + "submission.sections.upload.form.until-placeholder": "Đến khi", + "submission.sections.upload.header.policy.default.nolist": "Các tệp tải lên trong bộ sưu tập {{collectionName}} sẽ cso quyền truy cập thep các nhóm sau:", + "submission.sections.upload.header.policy.default.withlist": "Xin lưu ý rằng các tệp đã tải lên trong bộ sưu tập {{collectionName}} sẽ có thể truy cập được ngoài những gì được quyết định rõ ràng cho một tệp với (các) nhóm sau:", + "submission.sections.upload.info": "Tại đây bạn sẽ tìm thấy tất cả các tệp hiện có trong tài liệu. Bạn có thể cập nhật thông tin mô tả tệp và điều kiện truy cập hoặc tải lên tệp bổ sung chỉ cần kéo và thả chúng ở mọi nơi trong trang", + "submission.sections.upload.no-entry": "Không", + "submission.sections.upload.no-file-uploaded": "Không có tệp tải lên.", + "submission.sections.upload.save-metadata": "Lưu thông tin mô tả", + "submission.sections.upload.undo": "Hủy", + "submission.sections.upload.upload-failed": "Tải lên lỗi", + "submission.sections.upload.upload-successful": "Tải lên thành công", + "submission.submit.breadcrumbs": "Gửi mới", + "submission.submit.title": "Gửi mới", + "submission.workflow.generic.delete": "Xóa", + "submission.workflow.generic.delete-help": "Nếu bạn muốn hủy tài liệu này hãy chọn \"Delete\". Sau đó bạn sẽ được yêu cầu xác nhận.\"", + "submission.workflow.generic.edit": "Chỉnh sửa", + "submission.workflow.generic.edit-help": "Chọn tùy chọn này để thay đổi thông tin mô tả của tài liệu.", + "submission.workflow.generic.view": "Xem", + "submission.workflow.generic.view-help": "Chọn tùy chọn này để xem dữ liệu cảu tài liệu.", + "submission.workflow.tasks.claimed.approve": "Chấp nhận", + "submission.workflow.tasks.claimed.approve_help": "Nếu bạn đã xem xét tài liệu và thấy phù hợp để đưa vào bộ sưu tập hãy chọn \"Approve\".", + "submission.workflow.tasks.claimed.edit": "Chỉnh sửa", + "submission.workflow.tasks.claimed.edit_help": "Chọn tùy chọn này để thay đổi thông tin mô tả của tài liệu.", + "submission.workflow.tasks.claimed.reject.reason.info": "Vui lòng nhập lý do từ chối gửi của bạn vào ô bên dưới cho biết liệu người gửi có thể khắc phục sự cố và gửi lại hay không.", + "submission.workflow.tasks.claimed.reject.reason.placeholder": "Mô tả lý do từ chối", + "submission.workflow.tasks.claimed.reject.reason.submit": "Từ chối tài liệu", + "submission.workflow.tasks.claimed.reject.reason.title": "Lý do", + "submission.workflow.tasks.claimed.reject.submit": "Từ chối", + "submission.workflow.tasks.claimed.reject_help": "Nếu bạn đã xem xét tài liệu và thấy không phù hợp để đưa vào bộ sưu tập hãy chọn \"Reject\". Sau đó bạn sẽ được yêu cầu nhập một thông báo cho biết lý do tại sao tài liệu đó không phù hợp và liệu người gửi có nên thay đổi điều gì đó và gửi lại hay không.", + "submission.workflow.tasks.claimed.return": "Trả lại nhiệm vụ", + "submission.workflow.tasks.claimed.return_help": "Trả tác vụ về nhóm để người dùng khác có thể thực hiện tác vụ.", + "submission.workflow.tasks.generic.error": "Đã xảy ra lỗi trong khi vận hành ...", + "submission.workflow.tasks.generic.processing": "Đang xử lý...", + "submission.workflow.tasks.generic.submitter": "Người gửi", + "submission.workflow.tasks.generic.success": "Hoạt động thành công", + "submission.workflow.tasks.pool.claim": "Nhận nhiệm vụ", + "submission.workflow.tasks.pool.claim_help": "Giao nhiệm vụ này cho chính bạn.", + "submission.workflow.tasks.pool.hide-detail": "Ẩn chi tiết", + "submission.workflow.tasks.pool.show-detail": "Xem chi tiết", + "submission.workspace.generic.view": "Xem", + "submission.workspace.generic.view-help": "Chọn tủy chọn để xem thông tin mô tả của tài liệu", + + "thumbnail.default.alt": "Hình ảnh thu nhỏ", + "thumbnail.default.placeholder": "Không có ảnh thu nhỏ nào", + "thumbnail.orgunit.alt": "Logo Đơn vị tổ chức", + "thumbnail.orgunit.placeholder": "Hỉnh ảnh giữ chỗ của đơn vị tổ chức", + "thumbnail.person.alt": "Ảnh hồ sơ", + "thumbnail.person.placeholder": "Không có ảnh hồ sơ nào", + "thumbnail.project.alt": "Logo dự án", + "thumbnail.project.placeholder": "Hình ảnh giữ chỗ của dự án", + + "title": "DSpace", + + "vocabulary-treeview.header": "Chế độ xem phân cấp", + "vocabulary-treeview.info": "Chọn một chủ đề để thêm làm bộ lọc tìm kiếm", + "vocabulary-treeview.load-more": "Xem thêm", + "vocabulary-treeview.search.form.reset": "Khôi phục", + "vocabulary-treeview.search.form.search": "Tìm kiếm", + "vocabulary-treeview.search.no-result": "Không có tài liệu nào hiển thị", + "vocabulary-treeview.tree.description.nsi": "Chỉ số Norwegian Science", + "vocabulary-treeview.tree.description.srsc": "Danh mục chủ đề", + + "uploader.browse": "duyệt", + "uploader.delete.btn-title": "Xóa", + "uploader.drag-message": "Kéo & thả tệp tại đây", + "uploader.processing": "Đang xử lý", + "uploader.queue-length": "Chiều dài hàng đợi", + + "virtual-metadata.delete-item.info": "Chọn kiểu mà bạn muốn lưu thông tin mô tả ảo làm thông tin mô tả thực", + "virtual-metadata.delete-item.modal-head": "Siêu dữ liệu ảo của mối quan hệ này", + "virtual-metadata.delete-relationship.modal-head": "Chọn các tài liệu mà bạn muốn lưu thông tin mô tả ảo làm thông tin mô tả thực", + + "supervisedWorkspace.search.results.head": "Supervised Items", + + + "workflow.search.results.head": "Tất cả nhiệm vụ", + "workflowAdmin.search.results.head": "Tiến trình làm việc của quản trị viên", + "workflow-item.delete.button.cancel": "Hủy", + "workflow-item.delete.button.confirm": "Xóa", + "workflow-item.delete.header": "Xóa tiến trình tài liệu", + "workflow-item.delete.notification.error.content": "Không thể xóa tiến trình tài liệu", + "workflow-item.delete.notification.error.title": "Đã xảy ra lỗi", + "workflow-item.delete.notification.success.content": " Tiến trình tài liệu này đã được xóa thành công", + "workflow-item.delete.notification.success.title": "Xóa", + "workflow-item.delete.title": "Xóa tiến trình tài liệu", + "workflow-item.edit.breadcrumbs": "Chỉnh sửa tiến trình tài liệu", + "workflow-item.edit.title": "Xem tiến trình tài liệu", + "workflow-item.send-back.button.cancel": "Hủy", + "workflow-item.send-back.button.confirm": "Gửi lại", + "workflow-item.send-back.header": "Gửi lại tiến trình tài liệucho người gửi", + "workflow-item.send-back.notification.error.content": "Không thể gửi lại tiến trình tài liệu cho người gửi", + "workflow-item.send-back.notification.error.title": "Đã xảy ra lỗi", + "workflow-item.send-back.notification.success.content": "Tiến trình tài liệu này đã được gửi lại thành công cho người gửi", + "workflow-item.send-back.notification.success.title": "Đã gửi lại cho người gửi", + "workflow-item.send-back.title": "Gửi lại tiến trình tài liệu cho người gửi", + "workflow-item.view.breadcrumbs": "Xem tiến trình", + "workspace.search.results.head": "Biểu ghi bạn đã tải lên", + "workspace-item.view.breadcrumbs": "Xem các tài liệu đang biên mục dở dang", + "workspace-item.view.title": "Xem các tài liệu đang biên mục dở dang", + + "idle-modal.extend-session": "Gia hạn phiên", + "idle-modal.header": "Phiên sẽ sớm hết hạn", + "idle-modal.info": "Vì lý do bảo mật các phiên của người dùng sẽ hết hạn sau {{timeToExpire}} phút không hoạt động. Phiên của bạn sẽ sớm hết hạn. Bạn muốn gia hạn hay đăng xuất?", + "idle-modal.log-out": "Đăng xuất", + + "researcher.profile.action.processing": "Đang xử lý…", + "researcher.profile.associated": "Hồ sơ nhà nghiên cứu đã được liên kết", + "researcher.profile.change-visibility.fail": "Đã xảy ra lỗi khi thay đổi chế độ hiển thị hồ sơ", + "researcher.profile.create.fail": "Đã có lỗi xảy ra trong khi tạo hồ sơ nhà nghiên cứu", + "researcher.profile.create.new": "Tạo mới", + "researcher.profile.create.success": "Đã tạo thành công hồ sơ nhà nghiên cứu", + "researcher.profile.delete": "Xóa", + "researcher.profile.expose": "Hiển thị", + "researcher.profile.hide": "Ẩn", + "researcher.profile.not.associated": "Hồ sơ nhà nghiên cứu chưa được liên kết", + "researcher.profile.private.visibility": "CÁ NHÂN", + "researcher.profile.public.visibility": "CÔNG CỘNG", + "researcher.profile.status": "Trạng thái:", + "researcher.profile.view": "Xem", + + "person.page.orcid": "ORCID", + "person.page.orcid.create": "Tạo một ID trên ORCID", + "person.page.orcid.funding-preferences": "Quỹ ưa thích", + "person.page.orcid.grant-authorizations": "Cấp quyền", + "person.page.orcid.granted-authorizations": "Quyền đã cấp", + "person.page.orcid.link": "Liên kết với ID ORCID", + "person.page.orcid.link.error.message": "Đã xảy ra lỗi khi kết nối hồ sơ với ORCID. Nếu sự cố vẫn tiếp tục xảy ra vui lòng liên hệ với quản trị viên.", + "person.page.orcid.link.processing": "Đang kết nối hồ sơ tới ORCID…", + "person.page.orcid.missing-authorizations": "Thiếu quyền", + "person.page.orcid.missing-authorizations-message": "Những quyền sau đang bị thiếu:", + "person.page.orcid.no-missing-authorizations-message": "Tuyệt! Ô này đang trống vì vậy bạn đã được cấp tất cả các quyền truy cập để sử dụng tất cả các chức năng do tổ chức của bạn cung cấp.", + "person.page.orcid.no-orcid-message": "Chưa có ID ORCID nào được liên kết. Bạn có thể click vào nút dưới đây để liên kết hồ sơ này với một tài khoản ORCID.", + "person.page.orcid.orcid-not-linked-message": "ID ORCID của hồ sơ này ({{ orcid }}) chưa được kết nối với tài khoản trên trang ORCID hoặc kết nối đã hết hạn.", + "person.page.orcid.profile-preferences": "Tham số của hồ sơ", + "person.page.orcid.publications-preferences": "Tham số của ấn phẩm", + "person.page.orcid.remove-orcid-message": "Nếu bạn cần xóa ORCID của bạn vui lòng liên hệ với quản trị viên.", + "person.page.orcid.save.preference.changes": "Cập nhật cài đặt", + "person.page.orcid.scope.activities-update": "Thêm\/cập nhật các hoạt động nghiên cứu của bạn", + "person.page.orcid.scope.authenticate": "Lấy ID ORCID của bạn", + "person.page.orcid.scope.person-update": "Thêm\/cập nhật thông tin cá nhân của bạn", + "person.page.orcid.scope.read-limited": "Thiết lập để cho phép Các bên Tin cậy (Trusted Parties) có khả năng đọc thông tin của bạn ", + "person.page.orcid.sync-fundings.all": "Tất cả quỹ", + "person.page.orcid.sync-fundings.disabled": "Đã ngừng kích hoạt", + "person.page.orcid.sync-fundings.mine": "Quỹ của tôi", + "person.page.orcid.sync-fundings.my_selected": "Quỹ đã chọn", + "person.page.orcid.synchronization-mode": "Chế độ đồng bộ", + "person.page.orcid.synchronization-mode.batch": "Theo lô", + "person.page.orcid.synchronization-mode.label": "Chế độ đồng bộ", + "person.page.orcid.synchronization-mode.manual": "Thủ công", + "person.page.orcid.synchronization-mode-funding-message": "Chọn gửi\/không gửi các thực thể dự án của bạn đến danh sách các quỹ tài trợ trong bản ghi ORCID của bạn hay không.", + "person.page.orcid.synchronization-mode-message": "Vui lòng chọn phương thức đồng bộ hóa với ORCID. Các tùy chọn bao gồm \"Thủ công\" (bạn phải gửi dữ liệu của mình tới ORCID theo cách thủ công) hoặc \"Tự động\" (hệ thống sẽ gửi dữ liệu của bạn tới ORCID thông qua tập lệnh đã lên lịch).", + "person.page.orcid.synchronization-mode-profile-message": "Chọn gửi\/ không gửi thông tin tiểu sử hoặc số định danh cá nhân tới hồ sơ ORCID của bạn.", + "person.page.orcid.synchronization-mode-publication-message": "Chọn gửi\/ không gửi các thực thể Ấn phẩm tới danh sách các tác phẩm trong biểu ghi ORCID của bạn.", + "person.page.orcid.synchronization-settings-update.error": "Cập nhật cài đặt đồng bộ hóa không thành công", + "person.page.orcid.synchronization-settings-update.success": "Cài đặt đồng bộ hóa đã được cập nhật thành công", + "person.page.orcid.sync-profile.affiliation": "Tổ chức", + "person.page.orcid.sync-profile.biographical": "Dữ liệu sinh trắc học", + "person.page.orcid.sync-profile.education": "Giáo dục", + "person.page.orcid.sync-profile.identifiers": "Định danh", + "person.page.orcid.sync-publications.all": "Tất cả ấn phẩm", + "person.page.orcid.sync-publications.disabled": "Đã ngừng kích hoạt", + "person.page.orcid.sync-publications.mine": "Ấn phẩm của tôi", + "person.page.orcid.sync-publications.my_selected": "Ấn phẩm đã chọn", + "person.page.orcid.sync-queue.description.affiliation": "Tổ chức", + "person.page.orcid.sync-queue.description.country": "Quốc gia", + "person.page.orcid.sync-queue.description.education": "Giáo dục", + "person.page.orcid.sync-queue.description.external_ids": "ID ngoài", + "person.page.orcid.sync-queue.description.keywords": "Từ khóa", + "person.page.orcid.sync-queue.description.other_names": "Tên khác", + "person.page.orcid.sync-queue.description.qualification": "Trình độ chuyên môn", + "person.page.orcid.sync-queue.description.researcher_urls": "URL nhà nghiên cứu", + "person.page.orcid.sync-queue.discard": "Hủy thay đổi và không đồng bộ với trang ORCID", + "person.page.orcid.sync-queue.discard.error": "Việc loại bỏ biểu ghi trong danh sách chờ của ORCID đã thất bại", + "person.page.orcid.sync-queue.discard.success": "Biểu ghi trong danh sách chờ của ORCID đã được hủy bỏ thành công", + "person.page.orcid.sync-queue.empty-message": "Danh sách chờ ORCID trống", + "person.page.orcid.sync-queue.send": "Đồng bộ với trang ORCID", + "person.page.orcid.sync-queue.send.bad-request-error": "Đẩy dữ liệu lên ORCID không thành công vì tài nguyên này không hợp lệ", + "person.page.orcid.sync-queue.send.conflict-error": "Đẩy dữ liệu lên ORCID không thành công bởi vì tài nguyên này đã có trên trang ORCID", + "person.page.orcid.sync-queue.send.error": "Đẩy dữ liệu lên ORCID không thành công", + "person.page.orcid.sync-queue.send.not-found-warning": "Tài nguyên không còn tồn tại trên ORCID.", + "person.page.orcid.sync-queue.send.success": "Đẩy dữ liệu lên ORCID thành công", + "person.page.orcid.sync-queue.send.unauthorized-error.content": "Nhấp
vào đây<\/a> để cấp lại các quyền bắt buộc. Nếu vấn đề vẫn còn tồn tại vui lòng liên hệ quản trị viên.", + "person.page.orcid.sync-queue.send.unauthorized-error.title": "Đẩy dữ liệu lên ORCID không thành công do tài khoản của bạn không đủ các quyền cần thiết.", + "person.page.orcid.sync-queue.send.validation-error": "Dữ liệu bạn muốn đồng bộ với ORCID là dữ liệu không hợp lệ", + "person.page.orcid.sync-queue.send.validation-error.amount-currency.required": "Đơn vị tiền tệ là bắt buộc", + "person.page.orcid.sync-queue.send.validation-error.country.invalid": "2 ký tự mã quốc gia theo ISO 3166 là không hợp lệ", + "person.page.orcid.sync-queue.send.validation-error.disambiguated-organization.required": "Cần có số định danh (ID) để phân biệt giữa các tổ chức. ID được hỗ trợ là GRID Ringgold LEI và số định dang Cơ quan đăng ký Crossref Funder", + "person.page.orcid.sync-queue.send.validation-error.disambiguated-organization.value-required": "Định danh của tổ chức yêu cầu phải có một giá trị", + "person.page.orcid.sync-queue.send.validation-error.disambiguation-source.invalid": "Nguồn của một trong các số định danh của tổ chức không hợp lệ. Các nguồn được hỗ trợ là RINGGOLD GRID LEI và FUNDREF", + "person.page.orcid.sync-queue.send.validation-error.disambiguation-source.required": "Phải có một nguồn cho định danh của tổ chức", + "person.page.orcid.sync-queue.send.validation-error.external-id.required": "Tài nguyên được gửi yêu cầu phải có ít nhất một định danh", + "person.page.orcid.sync-queue.send.validation-error.funder.required": "Nhà tài trợ là bắt buộc", + "person.page.orcid.sync-queue.send.validation-error.organization.address-required": "Tổ chức này yêu cầu phải có địa chỉ", + "person.page.orcid.sync-queue.send.validation-error.organization.city-required": "Địa chỉ của tổ chức này phải là một thành phố", + "person.page.orcid.sync-queue.send.validation-error.organization.country-required": "Địa chỉ của tổ chức này phải là một mã quốc gia bao gồm 2 ký tự theo ISO 3166", + "person.page.orcid.sync-queue.send.validation-error.organization.name-required": "Tên của tổ chức là bắt buộc", + "person.page.orcid.sync-queue.send.validation-error.organization.required": "Yêu cầu phải có tổ chức", + "person.page.orcid.sync-queue.send.validation-error.publication.date-invalid": "Năm xuất bản phải là năm sau năm 1900", + "person.page.orcid.sync-queue.send.validation-error.start-date.required": "Ngày bắt đầu là bắt buộc", + "person.page.orcid.sync-queue.send.validation-error.title.required": "Nhan đề là bắt buộc", + "person.page.orcid.sync-queue.send.validation-error.type.required": "Trường dc.type là bắt buộc", + "person.page.orcid.sync-queue.table.header.action": "Hành động", + "person.page.orcid.sync-queue.table.header.description": "Mô tả", + "person.page.orcid.sync-queue.table.header.type": "Loại hình tài liệu", + "person.page.orcid.sync-queue.tooltip.affiliation": "Tổ chức", + "person.page.orcid.sync-queue.tooltip.country": "Quốc gia", + "person.page.orcid.sync-queue.tooltip.delete": "Loại bỏ mục này khỏi trang ORCID", + "person.page.orcid.sync-queue.tooltip.education": "Giáo dục", + "person.page.orcid.sync-queue.tooltip.external_ids": "Định danh ", + "person.page.orcid.sync-queue.tooltip.insert": "Thêm mục mới trong ORCID", + "person.page.orcid.sync-queue.tooltip.keywords": "Từ khóa", + "person.page.orcid.sync-queue.tooltip.other_names": "Tên khác", + "person.page.orcid.sync-queue.tooltip.project": "Dự án", + "person.page.orcid.sync-queue.tooltip.publication": "Ấn phẩm", + "person.page.orcid.sync-queue.tooltip.qualification": "Trình độ chuyên môn", + "person.page.orcid.sync-queue.tooltip.researcher_urls": "URL nhà nghiên cứu", + "person.page.orcid.sync-queue.tooltip.update": "Cập nhật mục này trên trang ORCID", + "person.page.orcid.unlink": "Ngắt kết nối khỏi ORCID", + "person.page.orcid.unlink.error": "Đã xảy ra lỗi khi ngắt kết nối giữa hồ sơ và ORCID. Vui lòng thử lại.", + "person.page.orcid.unlink.processing": "Đang xử lý…", + "person.page.orcid.unlink.success": "Đã ngắt kết nối giữa hồ sơ nhà nghiên cứu và trang ORCID thành công", + + "person.orcid.registry.auth": "Được phép qua ORCID ", + "person.orcid.registry.queue": "Đang xếp hàng đợi đăng ký ORCID", + "person.orcid.sync.setting": "Thiết lập đồng bộ hóa với ORCID", + + "home.recent-submissions.head": "Các tài liệu tải lên gần đây", + + "listable-notification-object.default-message": "Không thể truy xuất", + + "system-wide-alert-banner.retrieval.error": "Đã xảy ra lỗi trong quá trình truy xuất cảnh báo hệ thống", + "system-wide-alert-banner.countdown.prefix": "Trong", + "system-wide-alert-banner.countdown.days": "{{days}} ngày", + "system-wide-alert-banner.countdown.hours": "{{hours}} giờ và", + "system-wide-alert-banner.countdown.minutes": "{{minutes}} phút:", + + "menu.section.system-wide-alert": "Cảnh báo toàn hệ thống", + + "system-wide-alert.form.header": "Cảnh báo toàn hệ thống", + "system-wide-alert-form.retrieval.error": "Đã xảy ra lỗi trong quá trình truy xuất cảnh báo trên toàn hệ thống", + "system-wide-alert.form.cancel": "Hủy", + "system-wide-alert.form.save": "Lưu", + "system-wide-alert.form.label.active": "HOẠT ĐỘNG", + "system-wide-alert.form.label.inactive": "KHÔNG HOẠT ĐỘNG", + "system-wide-alert.form.error.message": "Cảnh báo trên toàn hệ thống phải chứa một nội dung", + "system-wide-alert.form.label.message": "Nội dung cảnh báo", + "system-wide-alert.form.label.countdownTo.enable": "Kích hoạt thời gian tạm dừng máy chủ", + "system-wide-alert.form.label.countdownTo.hint": "Gợi ý: Thiết lập lịch tạm dừng máy chủ. Khi chức năng này được kích hoạt, có thể lựa chọn một ngày tạm dừng máy chủ trong tương lai và nội dung cảnh báo sẽ được đếm ngược tới ngày đã đặt. Khi bộ hẹn giờ này được kết thúc, nội dung này sẽ biến mất khỏi cảnh báo. Máy chủ sẽ không tự động tạm dừng.", + "system-wide-alert.form.label.preview": "Xem trước cảnh báo toàn hệ thống", + "system-wide-alert.form.update.success": "Cảnh báo toàn hệ thống đã được cập nhật thành công", + "system-wide-alert.form.update.error": "Đã xảy ra lỗi trong quá trình cập nhật cảnh báo toàn hệ thống", + "system-wide-alert.form.create.success": "Cảnh báo toàn hệ thống đã được tạo thành công", + "system-wide-alert.form.create.error": "Đã xảy ra lỗi trong quá trình tạo cảnh báo toàn hệ thống", + "admin.system-wide-alert.breadcrumbs": "Cảnh báo toàn hệ thống", + "admin.system-wide-alert.title": "Cảnh báo toàn hệ thống", +} \ No newline at end of file From 222c220c5667fb76c183ca9eb25273aaf68aa1f8 Mon Sep 17 00:00:00 2001 From: lotte Date: Wed, 26 Apr 2023 10:54:36 +0200 Subject: [PATCH 112/409] 101289: #1578 fixed redirection bug --- .../edit-bitstream-page.component.spec.ts | 9 +- .../edit-bitstream-page.component.ts | 116 +++++++----------- src/assets/i18n/en.json5 | 2 + 3 files changed, 48 insertions(+), 79 deletions(-) diff --git a/src/app/bitstream-page/edit-bitstream-page/edit-bitstream-page.component.spec.ts b/src/app/bitstream-page/edit-bitstream-page/edit-bitstream-page.component.spec.ts index 13f3ec7f27..258ff2432f 100644 --- a/src/app/bitstream-page/edit-bitstream-page/edit-bitstream-page.component.spec.ts +++ b/src/app/bitstream-page/edit-bitstream-page/edit-bitstream-page.component.spec.ts @@ -388,20 +388,13 @@ describe('EditBitstreamPageComponent', () => { expect(comp.navigateToItemEditBitstreams).toHaveBeenCalled(); }); }); - describe('when navigateToItemEditBitstreams is called, and the component has an itemId', () => { + describe('when navigateToItemEditBitstreams is called', () => { it('should redirect to the item edit page on the bitstreams tab with the itemId from the component', () => { comp.itemId = 'some-uuid1'; comp.navigateToItemEditBitstreams(); expect(router.navigate).toHaveBeenCalledWith([getEntityEditRoute(null, 'some-uuid1'), 'bitstreams']); }); }); - describe('when navigateToItemEditBitstreams is called, and the component does not have an itemId', () => { - it('should redirect to the item edit page on the bitstreams tab with the itemId from the bundle links ', () => { - comp.itemId = undefined; - comp.navigateToItemEditBitstreams(); - expect(router.navigate).toHaveBeenCalledWith([getEntityEditRoute(null, 'some-uuid'), 'bitstreams']); - }); - }); }); describe('EditBitstreamPageComponent with IIIF fields', () => { diff --git a/src/app/bitstream-page/edit-bitstream-page/edit-bitstream-page.component.ts b/src/app/bitstream-page/edit-bitstream-page/edit-bitstream-page.component.ts index 3c3965a70a..5110a5e936 100644 --- a/src/app/bitstream-page/edit-bitstream-page/edit-bitstream-page.component.ts +++ b/src/app/bitstream-page/edit-bitstream-page/edit-bitstream-page.component.ts @@ -1,58 +1,32 @@ -import { - ChangeDetectionStrategy, - ChangeDetectorRef, - Component, - OnDestroy, - OnInit -} from '@angular/core'; +import { ChangeDetectionStrategy, ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core'; import { Bitstream } from '../../core/shared/bitstream.model'; import { ActivatedRoute, Router } from '@angular/router'; -import { map, mergeMap, switchMap } from 'rxjs/operators'; -import { - combineLatest, - combineLatest as observableCombineLatest, - Observable, - of as observableOf, - Subscription -} from 'rxjs'; -import { - DynamicFormControlModel, - DynamicFormGroupModel, - DynamicFormLayout, - DynamicFormService, - DynamicInputModel, - DynamicSelectModel -} from '@ng-dynamic-forms/core'; +import { map, switchMap, tap } from 'rxjs/operators'; +import { combineLatest, combineLatest as observableCombineLatest, Observable, of as observableOf, Subscription } from 'rxjs'; +import { DynamicFormControlModel, DynamicFormGroupModel, DynamicFormLayout, DynamicFormService, DynamicInputModel, DynamicSelectModel } from '@ng-dynamic-forms/core'; import { FormGroup } from '@angular/forms'; import { TranslateService } from '@ngx-translate/core'; import { DynamicCustomSwitchModel } from '../../shared/form/builder/ds-dynamic-form-ui/models/custom-switch/custom-switch.model'; import cloneDeep from 'lodash/cloneDeep'; import { BitstreamDataService } from '../../core/data/bitstream-data.service'; -import { - getAllSucceededRemoteDataPayload, - getFirstCompletedRemoteData, - getFirstSucceededRemoteData, - getFirstSucceededRemoteDataPayload, - getRemoteDataPayload -} from '../../core/shared/operators'; +import { getAllSucceededRemoteDataPayload, getFirstCompletedRemoteData, getFirstSucceededRemoteData, getFirstSucceededRemoteDataPayload, getRemoteDataPayload } from '../../core/shared/operators'; import { NotificationsService } from '../../shared/notifications/notifications.service'; import { BitstreamFormatDataService } from '../../core/data/bitstream-format-data.service'; import { BitstreamFormat } from '../../core/shared/bitstream-format.model'; import { BitstreamFormatSupportLevel } from '../../core/shared/bitstream-format-support-level'; -import { hasValue, isNotEmpty, isEmpty } from '../../shared/empty.util'; +import { hasValue, isEmpty, isNotEmpty } from '../../shared/empty.util'; import { Metadata } from '../../core/shared/metadata.utils'; import { Location } from '@angular/common'; import { RemoteData } from '../../core/data/remote-data'; import { PaginatedList } from '../../core/data/paginated-list.model'; -import { getEntityEditRoute, getItemEditRoute } from '../../item-page/item-page-routing-paths'; +import { getEntityEditRoute } from '../../item-page/item-page-routing-paths'; import { Bundle } from '../../core/shared/bundle.model'; import { DSONameService } from '../../core/breadcrumbs/dso-name.service'; import { Item } from '../../core/shared/item.model'; -import { - DsDynamicInputModel -} from '../../shared/form/builder/ds-dynamic-form-ui/models/ds-dynamic-input.model'; +import { DsDynamicInputModel } from '../../shared/form/builder/ds-dynamic-form-ui/models/ds-dynamic-input.model'; import { DsDynamicTextAreaModel } from '../../shared/form/builder/ds-dynamic-form-ui/models/ds-dynamic-textarea.model'; import { BundleDataService } from '../../core/data/bundle-data.service'; +import { Operation } from 'fast-json-patch'; @Component({ selector: 'ds-edit-bitstream-page', @@ -440,17 +414,24 @@ export class EditBitstreamPageComponent implements OnInit, OnDestroy { getFirstSucceededRemoteDataPayload(), ); + const item$ = bundle$.pipe( + switchMap((bundle: Bundle) => bundle.item), + getFirstSucceededRemoteDataPayload() + ); this.subs.push( observableCombineLatest( bitstream$, allFormats$, - bundle$ - ).subscribe(([bitstream, allFormats, bundle]) => { - this.bitstream = bitstream as Bitstream; - this.formats = allFormats.page; - this.bundle = bundle; - this.setIiifStatus(this.bitstream); - }) + bundle$, + item$, + ).pipe() + .subscribe(([bitstream, allFormats, bundle, item]) => { + this.bitstream = bitstream as Bitstream; + this.formats = allFormats.page; + this.bundle = bundle; + this.itemId = item.uuid; + this.setIiifStatus(this.bitstream); + }) ); this.subs.push( @@ -582,7 +563,6 @@ export class EditBitstreamPageComponent implements OnInit, OnDestroy { } } - /** * Check for changes against the bitstream and send update requests to the REST API */ @@ -598,23 +578,8 @@ export class EditBitstreamPageComponent implements OnInit, OnDestroy { let bundle$: Observable; if (wasPrimary !== isPrimary) { - let patchOperation; - // No longer primary bitstream: remove - if (wasPrimary) { - patchOperation = { - path: this.primaryBitstreamPath, - op: 'remove' - }; - } else { - // Has become primary bitstream - // If it already had a value: replace, otherwise: add - patchOperation = { - path: this.primaryBitstreamPath, - op: hasValue(this.bundle.primaryBitstreamUUID) ? 'replace' : 'add', - value: this.bitstream.uuid - }; - } - bundle$ = this.bundleService.patch(this.bundle, [patchOperation]).pipe( + const patchOperations: Operation[] = this.retrieveBundlePatch(wasPrimary); + bundle$ = this.bundleService.patch(this.bundle, patchOperations).pipe( getFirstCompletedRemoteData(), map((bundleResponse: RemoteData) => { if (hasValue(bundleResponse) && bundleResponse.hasFailed) { @@ -649,6 +614,7 @@ export class EditBitstreamPageComponent implements OnInit, OnDestroy { } combineLatest([bundle$, bitstream$]).pipe( + tap(([bundle]) => this.bundle = bundle), switchMap(() => { return this.bitstreamService.update(updatedBitstream).pipe( getFirstSucceededRemoteDataPayload() @@ -664,6 +630,24 @@ export class EditBitstreamPageComponent implements OnInit, OnDestroy { }); } + private retrieveBundlePatch(wasPrimary: boolean): Operation[] { + // No longer primary bitstream: remove + if (wasPrimary) { + return [{ + path: this.primaryBitstreamPath, + op: 'remove' + }]; + } else { + // Has become primary bitstream + // If it already had a value: replace, otherwise: add + return [{ + path: this.primaryBitstreamPath, + op: hasValue(this.bundle.primaryBitstreamUUID) ? 'replace' : 'add', + value: this.bitstream.uuid + }]; + } + } + /** * Parse form data to an updated bitstream object * @param rawForm Raw form data @@ -671,8 +655,6 @@ export class EditBitstreamPageComponent implements OnInit, OnDestroy { formToBitstream(rawForm): Bitstream { const updatedBitstream = cloneDeep(this.bitstream); const newMetadata = updatedBitstream.metadata; - // TODO: Set bitstream to primary when supported - const primary = rawForm.fileNamePrimaryContainer.primaryBitstream; Metadata.setFirstValue(newMetadata, 'dc.title', rawForm.fileNamePrimaryContainer.fileName); if (isEmpty(rawForm.descriptionContainer.description)) { delete newMetadata['dc.description']; @@ -724,15 +706,7 @@ export class EditBitstreamPageComponent implements OnInit, OnDestroy { * otherwise retrieve the item ID based on the owning bundle's link */ navigateToItemEditBitstreams() { - if (hasValue(this.itemId)) { - this.router.navigate([getEntityEditRoute(this.entityType, this.itemId), 'bitstreams']); - } else { - this.bitstream.bundle.pipe(getFirstSucceededRemoteDataPayload(), - mergeMap((bundle: Bundle) => bundle.item.pipe(getFirstSucceededRemoteDataPayload()))) - .subscribe((item) => { - this.router.navigate(([getItemEditRoute(item), 'bitstreams'])); - }); - } + this.router.navigate([getEntityEditRoute(this.entityType, this.itemId), 'bitstreams']); } /** diff --git a/src/assets/i18n/en.json5 b/src/assets/i18n/en.json5 index 66824e56b3..5f09574ab0 100644 --- a/src/assets/i18n/en.json5 +++ b/src/assets/i18n/en.json5 @@ -705,6 +705,8 @@ "bitstream.edit.notifications.error.format.title": "An error occurred saving the bitstream's format", + "bitstream.edit.notifications.error.primaryBitstream.title": "An error occurred saving the primary bitstream", + "bitstream.edit.form.iiifLabel.label": "IIIF Label", "bitstream.edit.form.iiifLabel.hint": "Canvas label for this image. If not provided default label will be used.", From 618f03c8ca0d26488bbc1cba87666ac9a169cd6c Mon Sep 17 00:00:00 2001 From: tuanvu Date: Wed, 26 Apr 2023 15:55:52 +0700 Subject: [PATCH 113/409] Update Locale --- src/assets/i18n/vi.json5 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/assets/i18n/vi.json5 b/src/assets/i18n/vi.json5 index afc7ce4e3c..cb8b205d3f 100644 --- a/src/assets/i18n/vi.json5 +++ b/src/assets/i18n/vi.json5 @@ -294,7 +294,7 @@ "advanced-workflow-action.rating.form.rating.error": "Bạn phải đánh giá tài liệu/ thực thế này", "advanced-workflow-action.rating.form.review.label": "Kiểm duyệt", "advanced-workflow-action.rating.form.review.error": "Bạn phải nhập nội dung đánh giá để gửi bản xếp hạng này", - "advanced-workflow-action.rating.description": "Vui lòng chọn một xếp hạng bên dưới" + "advanced-workflow-action.rating.description": "Vui lòng chọn một xếp hạng bên dưới", "advanced-workflow-action.rating.description-requiredDescription": "Vui lòng chọn xếp hạng bên dưới và thêm đánh giá", "advanced-workflow-action.select-reviewer.description-single": "Vui lòng chọn một người kiểm duyệt dưới đây trước khi tải tài liệu lên", "advanced-workflow-action.select-reviewer.description-multiple": "Vui lòng chọn một hoặc nhiều người kiểm duyệt dưới đây trước khi tải tài liệu lên", From 6e7a8a992ce607a30033f78f0344d30e2880334e Mon Sep 17 00:00:00 2001 From: Nona Luypaert Date: Wed, 26 Apr 2023 10:12:28 +0200 Subject: [PATCH 114/409] 101127: Add VocabularyTreeview to BrowseByTaxonomyPage --- .../browse-by-taxonomy-page.component.html | 6 +++++- .../browse-by-taxonomy-page.component.ts | 10 ++++++++-- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/src/app/browse-by/browse-by-taxonomy-page/browse-by-taxonomy-page.component.html b/src/app/browse-by/browse-by-taxonomy-page/browse-by-taxonomy-page.component.html index 04f39bf727..39fcf1ab30 100644 --- a/src/app/browse-by/browse-by-taxonomy-page/browse-by-taxonomy-page.component.html +++ b/src/app/browse-by/browse-by-taxonomy-page/browse-by-taxonomy-page.component.html @@ -1 +1,5 @@ -

browse-by-taxonomy-page works!

+
+ + +
diff --git a/src/app/browse-by/browse-by-taxonomy-page/browse-by-taxonomy-page.component.ts b/src/app/browse-by/browse-by-taxonomy-page/browse-by-taxonomy-page.component.ts index 97402843f5..b697c74052 100644 --- a/src/app/browse-by/browse-by-taxonomy-page/browse-by-taxonomy-page.component.ts +++ b/src/app/browse-by/browse-by-taxonomy-page/browse-by-taxonomy-page.component.ts @@ -1,4 +1,5 @@ -import { Component } from '@angular/core'; +import { Component, OnInit } from '@angular/core'; +import { VocabularyOptions } from '../../core/submission/vocabularies/models/vocabulary-options.model'; @Component({ selector: 'ds-browse-by-taxonomy-page', @@ -8,6 +9,11 @@ import { Component } from '@angular/core'; /** * Component for browsing items by metadata in a hierarchical controlled vocabulary */ -export class BrowseByTaxonomyPageComponent { +export class BrowseByTaxonomyPageComponent implements OnInit { + vocabularyOptions: VocabularyOptions; + + ngOnInit() { + this.vocabularyOptions = { name: 'srsc', closed: true }; + } } From 702f9cd4dbd44340386c51080a2f3fd24b2aa43f Mon Sep 17 00:00:00 2001 From: tuanvu Date: Wed, 26 Apr 2023 16:06:02 +0700 Subject: [PATCH 115/409] Update Lang file --- src/assets/i18n/vi.json5 | 5220 +++++++++++++++++++------------------- 1 file changed, 2610 insertions(+), 2610 deletions(-) diff --git a/src/assets/i18n/vi.json5 b/src/assets/i18n/vi.json5 index cb8b205d3f..4e3528148f 100644 --- a/src/assets/i18n/vi.json5 +++ b/src/assets/i18n/vi.json5 @@ -1,1301 +1,1301 @@ { - "401.help": "Bạn không có quyền truy cập trang này. Bạn có thể sử dụng nút chức năng phía dưới để quay lại trang chủ.", - "401.link.home-page": "Đi tới trang chủ", - "401.unauthorized": "không có quyền truy cập", - "403.forbidden": "không được phép truy cập", - "403.help": "Bạn không có quyền truy cập trang này. Bạn có thể sử dụng nút chức năng phía dưới để quay lại trang chủ.", - "403.link.home-page": "Đi tới trang chủ", - "404.help": "Chúng tôi không tìm thấy trang mà bạn đang tìm kiếm. Trang này có thể đã được chuyển tới một địa chỉ khác hoặc đã bị xóa. Bạn có thể sử dụng nút chức năng phía dưới để quay lại trang chủ.", - "404.link.home-page": "Đi tới trang chủ", - "404.page-not-found": "không tìm thấy trang", - "500.help": "Máy chủ tạm thời không thể phục vụ yêu cầu của bạn do đang trong giai đoạn bảo trì hoặc vấn đề về dung lượng. Vui lòng thử lại sau.", - "500.link.home-page": "Đi tới trang chủ", - "500.page-internal-server-error": "Dịch vụ không sẵn sàng", - - "access-status.embargo.listelement.badge": "Ngăn chặn", - "access-status.metadata.only.listelement.badge": "Chỉ siêu dữ liệu", - "access-status.open.access.listelement.badge": "Truy cập mở", - "access-status.restricted.listelement.badge": "Hạn chế", - "access-status.unknown.listelement.badge": "Không xác định", - - "admin.curation-tasks.breadcrumbs": "Thu thập các tác vụ hệ thống", - "admin.curation-tasks.header": "Thu thập các tác vụ hệ thống", - "admin.curation-tasks.title": "Thu thập các tác vụ hệ thống", - - "admin.registries.bitstream-formats.breadcrumbs": "Tạo định dạng", - "admin.registries.bitstream-formats.create.breadcrumbs": "Định dạng tệp tin", - "admin.registries.bitstream-formats.create.failure.content": "Đã xảy ra lỗi khi tạo định dạng tệp tin mới.", - "admin.registries.bitstream-formats.create.failure.head": "Không thành công", - "admin.registries.bitstream-formats.create.head": "Tạo định dạng tệp tin", - "admin.registries.bitstream-formats.create.new": "Thêm một định dạng tệp tin mới", - "admin.registries.bitstream-formats.create.success.content": "Định dạng tệp tin mới đã được tạo thành công.", - "admin.registries.bitstream-formats.create.success.head": "Thành công", - "admin.registries.bitstream-formats.delete.failure.amount": "Loại bỏ không thành công {{ amount }} định dạng", - "admin.registries.bitstream-formats.delete.failure.head": "Không thành công", - "admin.registries.bitstream-formats.delete.success.amount": "Loại bỏ thành công {{ amount }} định dạng", - "admin.registries.bitstream-formats.delete.success.head": "Thành công", - "admin.registries.bitstream-formats.description": "Danh sách các định dạng tệp tin này cung cấp thông tin về các định dạng đã biết và mức hỗ trợ của chúng.", - "admin.registries.bitstream-formats.edit.breadcrumbs": "Định dạng tệp tin", - "admin.registries.bitstream-formats.edit.description.label": "Mô tả", - "admin.registries.bitstream-formats.edit.extensions.hint": "Tiện ích mở rộng là phần mở rộng tệp được sử dụng để tự động xác định định dạng của tệp được tải lên. Bạn có thể nhập một vài phần mở rộng cho mỗi định dạng.", - "admin.registries.bitstream-formats.edit.extensions.label": "Mở rộng tệp", - "admin.registries.bitstream-formats.edit.extensions.placeholder": "Nhập một phần mở rộng tệp không có dấu chấm", - "admin.registries.bitstream-formats.edit.failure.content": "Đã xảy ra lỗi khi chỉnh sửa định dạng tệp tin.", - "admin.registries.bitstream-formats.edit.failure.head": "Không thành công", - "admin.registries.bitstream-formats.edit.head": "Định dạng tệp tin: {{ format }}", - "admin.registries.bitstream-formats.edit.internal.hint": "Các định dạng được đánh dấu là nội bộ sẽ được ẩn đối với người dùng và được sử dụng cho các mục đích quản trị.", - "admin.registries.bitstream-formats.edit.internal.label": "Nội bộ", - "admin.registries.bitstream-formats.edit.mimetype.hint": "Kiểu MIME được liên kết với định dạng này không nhất thiết phải là duy nhất.", - "admin.registries.bitstream-formats.edit.mimetype.label": "Kiểu MIME", - "admin.registries.bitstream-formats.edit.shortDescription.hint": "Một tên duy nhất cho định dạng này (ví dụ: Microsoft Word XP hoặc Microsoft Word 2000)", - "admin.registries.bitstream-formats.edit.shortDescription.label": "Tên", - "admin.registries.bitstream-formats.edit.success.content": "Định dạng tệp tin đã được chỉnh sửa thành công.", - "admin.registries.bitstream-formats.edit.success.head": "Thành công", - "admin.registries.bitstream-formats.edit.supportLevel.hint": "Mức độ hỗ trợ mà đơn vị của bạn cam kết cho định dạng này.", - "admin.registries.bitstream-formats.edit.supportLevel.label": "Mức độ hỗ trợ", - "admin.registries.bitstream-formats.head": "Tạo định dạng tệp tin số", - "admin.registries.bitstream-formats.no-items": "Không có định dạng tệp tin nào để hiển thị.", - "admin.registries.bitstream-formats.table.delete": "Xóa các mục được chọn", - "admin.registries.bitstream-formats.table.deselect-all": "Bỏ chọn tất cả", - "admin.registries.bitstream-formats.table.id": "ID", - "admin.registries.bitstream-formats.table.internal": "nội bộ", - "admin.registries.bitstream-formats.table.mimetype": "Kiểu MIME", - "admin.registries.bitstream-formats.table.name": "Tên", - "admin.registries.bitstream-formats.table.return": "Quay lại", - "admin.registries.bitstream-formats.table.supportLevel.head": "Mức độ hỗ trợ", - "admin.registries.bitstream-formats.table.supportLevel.KNOWN": "Đã xác định", - "admin.registries.bitstream-formats.table.supportLevel.SUPPORTED": "Được hỗ trợ", - "admin.registries.bitstream-formats.table.supportLevel.UNKNOWN": "Không xác định", - "admin.registries.bitstream-formats.title": "Tạo định dạng tệp tin số", - "admin.registries.metadata.breadcrumbs": "Mẫu nhập liệu", - "admin.registries.metadata.description": "Tạo mẫu nhập liệu cho phép duy trì danh sách tất cả các trường thông tin mô tả có sẵn trong hệ thống. Các trường này có thể được phân ra cho nhiều lược đồ. Tuy nhiên DSpace yêu cầu đủ điều kiện cho lược đồ Dublin Core.", - "admin.registries.metadata.form.create": "Tạo lược đồ thông tin mô tả", - "admin.registries.metadata.form.edit": "Chỉnh sửa lược đồ thông tin mô tả", - "admin.registries.metadata.form.name": "Tên", - "admin.registries.metadata.form.namespace": "Tên miền", - "admin.registries.metadata.head": "Tạo mẫu nhập liệu", - "admin.registries.metadata.schemas.no-items": "Không có lược đồ thông tin mô tả nào để hiển thị.", - "admin.registries.metadata.schemas.table.delete": "Xóa các mục đã chọn", - "admin.registries.metadata.schemas.table.id": "ID", - "admin.registries.metadata.schemas.table.name": "Tên", - "admin.registries.metadata.schemas.table.namespace": "Tên miền", - "admin.registries.metadata.title": "Tạo mẫu nhập liệu", - "admin.registries.schema.breadcrumbs": "Lược đồ thông tin mô tả", - "admin.registries.schema.description": "Đây là lược đồ thông tin mô tả cho \"{{namespace}}\".", - "admin.registries.schema.fields.head": "Lược đồ các trường thông tin mô tả", - "admin.registries.schema.fields.no-items": "Không có trường thông tin mô tả nào để hiển thị.", - "admin.registries.schema.fields.table.delete": "Xóa các mục đã lựa chọn", - "admin.registries.schema.fields.table.field": "Trường", - "admin.registries.schema.fields.table.id": "ID", - "admin.registries.schema.fields.table.scopenote": "Ghi chú phạm vi", - "admin.registries.schema.form.create": "Tạo trường thông tin mô tả", - "admin.registries.schema.form.edit": "Chỉnh sửa trường thông tin mô tả", - "admin.registries.schema.form.element": "Yếu tố", - "admin.registries.schema.form.qualifier": "Đối tượng bổ trợ", - "admin.registries.schema.form.scopenote": "Ghi chú phạm vi", - "admin.registries.schema.head": "Lược đồ thông tin mô tả", - "admin.registries.schema.notification.created": "Tạo thành công lược đồ thông tin mô tả \"{{prefix}}\"", - "admin.registries.schema.notification.deleted.failure": "Xóa không thành công {{amount}} lược đồ thông tin mô tả", - "admin.registries.schema.notification.deleted.success": "Đã xóa thành công {{amount}} lược đồ thông tin mô tả", - "admin.registries.schema.notification.edited": "Chỉnh sửa thành công lược đồ thông tin mô tả \"{{prefix}}\"", - "admin.registries.schema.notification.failure": "Lỗi", - "admin.registries.schema.notification.field.created": "Tạo thành công trường thông tin mô tả \"{{field}}\"", - "admin.registries.schema.notification.field.deleted.failure": "Xóa không thành công {{amount}} trường thông tin mô tả", - "admin.registries.schema.notification.field.deleted.success": "Đã xóa thành công {{amount}} trường thông tin mô tả", - "admin.registries.schema.notification.field.edited": "Chỉnh sửa thành công trường thông tin mô tả \"{{field}}\"", - "admin.registries.schema.notification.success": "Thành công", - "admin.registries.schema.return": "Quay lại", - "admin.registries.schema.title": "Tạo lược đồ thông tin mô tả", - - "admin.access-control.epeople.actions.delete": "Xóa người dùng", - "admin.access-control.epeople.actions.impersonate": "Mạo danh người dùng", - "admin.access-control.epeople.actions.reset": "Cài lại mật khẩu", - "admin.access-control.epeople.actions.stop-impersonating": "Dừng mạo danh người dùng", - "admin.access-control.epeople.breadcrumbs": "Người dùng", - "admin.access-control.epeople.button.add": "Thêm người dùng", - "admin.access-control.epeople.button.see-all": "Duyệt toàn bộ", - "admin.access-control.epeople.form.canLogIn": "Có thể đăng nhập", - "admin.access-control.epeople.form.create": "Tạo người dùng", - "admin.access-control.epeople.form.edit": "Chỉnh sửa người dùng", - "admin.access-control.epeople.form.email": "E-mail", - "admin.access-control.epeople.form.emailHint": "Phải là địa chỉ e-mail hợp lệ", - "admin.access-control.epeople.form.firstName": "Tên", - "admin.access-control.epeople.form.goToGroups": "Thêm vào nhóm", - "admin.access-control.epeople.form.groupsEPersonIsMemberOf": "Thành viên của các nhóm:", - "admin.access-control.epeople.form.lastName": "Họ", - "admin.access-control.epeople.form.memberOfNoGroups": "Người dùng không là thành viên của bất kỳ nhóm nào", - "admin.access-control.epeople.form.notification.created.failure": "Tạo không thành công người dùng \"{{name}}\"", - "admin.access-control.epeople.form.notification.created.failure.emailInUse": "Tạo không thành công người dùng \"{{name}}\" email \"{{email}}\" đã được sử dụng.", - "admin.access-control.epeople.form.notification.created.success": "Tạo thành công người dùng \"{{name}}\"", - "admin.access-control.epeople.form.notification.deleted.failure": "Xóa không thành công người dùng \"{{name}}\"", - "admin.access-control.epeople.form.notification.deleted.success": "Xóa thành công người dùng \"{{name}}\"", - "admin.access-control.epeople.form.notification.edited.failure": "Chỉnh sửa không thành công người dùng \"{{name}}\"", - "admin.access-control.epeople.form.notification.edited.failure.emailInUse": "Chỉnh sửa không thành công người dùng \"{{name}}\" email \"{{email}}\" đã được sử dụng.", - "admin.access-control.epeople.form.notification.edited.success": "Chỉnh sửa thành công người dùng \"{{name}}\"", - "admin.access-control.epeople.form.requireCertificate": "Khóa tài khoản", - "admin.access-control.epeople.form.return": "Quay lại", - "admin.access-control.epeople.form.table.collectionOrCommunity": "Đơn vị\/ Bộ sưu tập", - "admin.access-control.epeople.form.table.id": "ID", - "admin.access-control.epeople.form.table.name": "Tên", - "admin.access-control.epeople.head": "Người dùng", - "admin.access-control.epeople.no-items": "Không có người dùng nào để hiển thị.", - "admin.access-control.epeople.notification.deleted.failure": "Xóa không thành công người dùng: \"{{name}}\"", - "admin.access-control.epeople.notification.deleted.success": "Xóa thành công người dùng: \"{{name}}\"", - "admin.access-control.epeople.notification.resetpassword.success": "Thiết lập lại mật khẩu thành công cho người dùng: \"{{name}}\"", - "admin.access-control.epeople.search.button": "Tìm kiếm", - "admin.access-control.epeople.search.head": "Tìm kiếm", - "admin.access-control.epeople.search.placeholder": "Tìm kiếm người dùng...", - "admin.access-control.epeople.search.scope.email": "E-mail (chính xác)", - "admin.access-control.epeople.search.scope.metadata": "Siêu dữ liệu", - "admin.access-control.epeople.table.edit": "Chỉnh sửa", - "admin.access-control.epeople.table.edit.buttons.edit": "Chỉnh sửa \"{{name}}\"", - "admin.access-control.epeople.table.edit.buttons.edit-disabled": "Bạn không có quyền chỉnh sửa nhóm này", - "admin.access-control.epeople.table.edit.buttons.remove": "Xóa \"{{name}}\"", - "admin.access-control.epeople.table.email": "E-mail (chính xác)", - "admin.access-control.epeople.table.id": "ID", - "admin.access-control.epeople.table.name": "Tên", - "admin.access-control.epeople.title": "Người dùng", - "admin.access-control.groups.addGroup.breadcrumbs": "Tạo nhóm người dùng", - "admin.access-control.groups.breadcrumbs": "Nhóm người dùng", - "admin.access-control.groups.button.add": "Thêm nhóm người dùng", - "admin.access-control.groups.button.see-all": "Duyệt toàn bộ", - "admin.access-control.groups.form.actions.delete": "Xóa nhóm người dùng", - "admin.access-control.groups.form.alert.permanent": "Nhóm này là cố định vì vậy nó không thể bị chỉnh sửa hoặc xóa. Bạn vẫn có thể thêm và loại bỏ thành viên trong nhóm tại trang này.", - "admin.access-control.groups.form.alert.workflowGroup": "Không thể chỉnh sửa hoặc xóa nhóm này vì nó tương ứng với một vai trò trong quá trình gửi và quy trình xử lý trong \"{{name}}\" {{comcol}}. Bạn có thể xóa nó từ thẻ
assign roles<\/a> trên trang chỉnh sửa {{comcol}}. Bạn vẫn có thể thêm và loại bỏ thành viên nhóm bằng trang này.\"", - "admin.access-control.groups.form.delete-group.modal.cancel": "Hủy", - "admin.access-control.groups.form.delete-group.modal.confirm": "Xóa", - "admin.access-control.groups.form.delete-group.modal.header": "Xóa nhóm người dùng \"{{ dsoName }}\"", - "admin.access-control.groups.form.delete-group.modal.info": "Bạn có chắc chắn rằng bạn muốn xóa nhóm người dùng \"{{ dsoName }}\"", - "admin.access-control.groups.form.groupCommunity": "Đơn vị hoặc Bộ sưu tập", - "admin.access-control.groups.form.groupDescription": "Mô tả", - "admin.access-control.groups.form.groupName": "Tên nhóm người dùng", - "admin.access-control.groups.form.head.create": "Tạo nhóm người dùng", - "admin.access-control.groups.form.head.edit": "Chỉnh sửa nhóm người dùng", - "admin.access-control.groups.form.members-list.button.see-all": "Duyệt toàn bộ", - "admin.access-control.groups.form.members-list.head": "Người dùng", - "admin.access-control.groups.form.members-list.headMembers": "Các thành viên hiện tại", - "admin.access-control.groups.form.members-list.no-items": "Không người dùng nào được tìm thấy trong tìm kiếm", - "admin.access-control.groups.form.members-list.no-members-yet": "Chưa có thành viên trong nhóm tìm kiếm và thêm thành viên vào nhóm.", - "admin.access-control.groups.form.members-list.notification.failure.addMember": "Thêm không thành công thành viên: \"{{name}}\"", - "admin.access-control.groups.form.members-list.notification.failure.deleteMember": "Xóa không thành công thành viên: \"{{name}}\"", - "admin.access-control.groups.form.members-list.notification.failure.noActiveGroup": "Hiện tại không có nhóm hoạt động gửi một tên trước.", - "admin.access-control.groups.form.members-list.notification.success.addMember": "Thêm thành công thành viên: \"{{name}}\"", - "admin.access-control.groups.form.members-list.notification.success.deleteMember": "Xóa thành công thành viên: \"{{name}}\"", - "admin.access-control.groups.form.members-list.search.button": "Tìm kiếm", - "admin.access-control.groups.form.members-list.search.head": "Thêm người dùng", - "admin.access-control.groups.form.members-list.search.scope.email": "E-mail (chính xác)", - "admin.access-control.groups.form.members-list.search.scope.metadata": "Siêu dữ liệu", - "admin.access-control.groups.form.members-list.table.edit": "Loại bỏ \/ Thêm", - "admin.access-control.groups.form.members-list.table.edit.buttons.add": "Thêm thành viên với tên \"{{name}}\"", - "admin.access-control.groups.form.members-list.table.edit.buttons.remove": "Loại bỏ thành viên với tên \"{{name}}\"", - "admin.access-control.groups.form.members-list.table.email": "Email", - "admin.access-control.groups.form.members-list.table.id": "ID", - "admin.access-control.groups.form.members-list.table.identity": "Định danh", - "admin.access-control.groups.form.members-list.table.name": "Tên", - "admin.access-control.groups.form.members-list.table.netid": "NetID", - "admin.access-control.groups.form.notification.created.failure": "Tạo không thành công nhóm người dùng \"{{name}}\"", - "admin.access-control.groups.form.notification.created.failure.groupNameInUse": "Tạo không thành công nhóm người dùng với tên: \"{{name}}\" đảm bảo tên này chưa được sử dụng\"", - "admin.access-control.groups.form.notification.created.success": "Tạo thành công nhóm người dùng \"{{name}}\"", - "admin.access-control.groups.form.notification.deleted.failure.content": "Nguyên nhân: \"{{ cause }}\"", - "admin.access-control.groups.form.notification.deleted.failure.title": "Xóa không thành công nhóm người dùng \"{{ name }}\"", - "admin.access-control.groups.form.notification.deleted.success": "Xóa thành công nhóm người dùng \"{{ name }}\"", - "admin.access-control.groups.form.notification.edited.failure": "Chỉnh sửa không thành công nhóm người dùng \"{{name}}\"", - "admin.access-control.groups.form.notification.edited.failure.groupNameInUse": "Tên \"{{name}}\" đã được sử dụng!\"", - "admin.access-control.groups.form.notification.edited.success": "Chỉnh sửa thành công nhóm người dùng \"{{name}}\"", - "admin.access-control.groups.form.return": "Quay lại", - "admin.access-control.groups.form.subgroups-list.button.see-all": "Duyệt toàn bộ", - "admin.access-control.groups.form.subgroups-list.head": "Nhóm người dùng", - "admin.access-control.groups.form.subgroups-list.headSubgroups": "Nhóm người dùng con hiện tại", - "admin.access-control.groups.form.subgroups-list.no-items": "Không tìm thấy nhóm nào có tên hoặc UUID như vậy", - "admin.access-control.groups.form.subgroups-list.no-subgroups-yet": "Chưa có nhóm người dùng con nào trong nhóm.", - "admin.access-control.groups.form.subgroups-list.notification.failure": "Đã xảy ra sự cố: \"{{cause}}\"", - "admin.access-control.groups.form.subgroups-list.notification.failure.addSubgroup": "Thêm không thành công nhóm người dùng con: \"{{name}}\"", - "admin.access-control.groups.form.subgroups-list.notification.failure.deleteSubgroup": "Xóa không thành công nhóm người dùng con: \"{{name}}\"", - "admin.access-control.groups.form.subgroups-list.notification.failure.noActiveGroup": "Hiện tại không có nhóm hoạt động gửi một tên trước.", - "admin.access-control.groups.form.subgroups-list.notification.failure.subgroupToAddIsActiveGroup": "Đây là nhóm hiện tại không thể thêm được.", - "admin.access-control.groups.form.subgroups-list.notification.success.addSubgroup": "Thêm thành công nhóm người dùng con: \"{{name}}\"", - "admin.access-control.groups.form.subgroups-list.notification.success.deleteSubgroup": "Loại bỏ thành công nhóm người dùng: \"{{name}}\" ra khỏi nhóm", - "admin.access-control.groups.form.subgroups-list.search.button": "Tìm kiếm", - "admin.access-control.groups.form.subgroups-list.search.head": "Thêm nhóm người dùng con", - "admin.access-control.groups.form.subgroups-list.table.collectionOrCommunity": "Đơn vị\/ Bộ sưu tập", - "admin.access-control.groups.form.subgroups-list.table.edit": "Loại bỏ \/ Thêm", - "admin.access-control.groups.form.subgroups-list.table.edit.buttons.add": "Thêm nhóm người dùng con với tên \"{{name}}\"", - "admin.access-control.groups.form.subgroups-list.table.edit.buttons.remove": "Loại bỏ nhóm người dùng con với tên \"{{name}}\"", - "admin.access-control.groups.form.subgroups-list.table.edit.currentGroup": "Nhóm người dùng hiện tại", - "admin.access-control.groups.form.subgroups-list.table.id": "ID", - "admin.access-control.groups.form.subgroups-list.table.name": "Tên", - "admin.access-control.groups.head": "Nhóm người dùng", - "admin.access-control.groups.no-items": "Không tìm thấy nhóm nào có tên hoặc UUID như vậy", - "admin.access-control.groups.notification.deleted.failure.content": "Nguyên nhân: \"{{cause}}\"", - "admin.access-control.groups.notification.deleted.failure.title": "Xóa không thành công nhóm \"{{name}}\"", - "admin.access-control.groups.notification.deleted.success": "Xóa thành công nhóm \"{{name}}\"", - "admin.access-control.groups.search.button": "Tìm kiếm", - "admin.access-control.groups.search.head": "Tìm kiếm nhóm người dùng", - "admin.access-control.groups.search.placeholder": "Tìm kiếm nhóm người dùng...", - "admin.access-control.groups.singleGroup.breadcrumbs": "Chỉnh sửa nhóm người dùng", - "admin.access-control.groups.table.collectionOrCommunity": "Đơn vị\/ Bộ sưu tập", - "admin.access-control.groups.table.edit": "Chỉnh sửa", - "admin.access-control.groups.table.edit.buttons.edit": "Chỉnh sửa \"{{name}}\"", - "admin.access-control.groups.table.edit.buttons.remove": "Xóa \"{{name}}\"", - "admin.access-control.groups.table.id": "ID", - "admin.access-control.groups.table.members": "Thành viên", - "admin.access-control.groups.table.name": "Tên", - "admin.access-control.groups.title": "Nhóm người dùng", - "admin.access-control.groups.title.addGroup": "Tạo nhóm người dùng", - "admin.access-control.groups.title.singleGroup": "Chỉnh sửa nhóm người dùng", - - "admin.search.breadcrumbs": "Tìm kiếm quản trị", - "admin.search.collection.edit": "Chỉnh sửa", - "admin.search.community.edit": "Chỉnh sửa", - "admin.search.item.delete": "Xóa", - "admin.search.item.edit": "Chỉnh sửa", - "admin.search.item.make-private": "Đặt làm tài liệu cá nhân", - "admin.search.item.make-public": "Đặt làm tài liệu công cộng", - "admin.search.item.move": "Di chuyển", - "admin.search.item.reinstate": "Khôi phục", - "admin.search.item.withdraw": "Ẩn", - "admin.search.title": "Tìm kiếm quản trị", - - "administrativeView.search.results.head": "Tìm kiếm quản trị", - - "admin.workflow.breadcrumbs": "Quản trị luồng công việc", - "admin.workflow.title": "Quản trị luồng công việc", - "admin.workflow.item.workflow": "Luồng công việc", - "admin.workflow.item.workspace": "Workspace", - "admin.workflow.item.delete": "Xóa", - "admin.workflow.item.send-back": "Gửi trở lại", - "admin.workflow.item.policies": "Policies", - "admin.workflow.item.supervision": "Supervision", - - "admin.batch-import.breadcrumbs": "Nhập dữ liệu theo lô", - "admin.batch-import.page.dropMsg": "Kéo thả file ZIP để nhập vào", - "admin.batch-import.page.dropMsgReplace": "Kéo thả để thay thế file ZIP cần nhập vào", - "admin.batch-import.page.error.addFile": "Chọn file Zip đầu tiên!", - "admin.batch-import.page.header": "Nhập dữ liệu theo lô", - "admin.batch-import.page.help": "Chọn Bộ sưu tập để nhập dữ liệu. Sau đó kéo thả hoặc duyệt tới tệp tin định dạng zip có chứa các tài liệu cần nhập vào.", - "admin.batch-import.page.remove": "xóa", - "admin.batch-import.title": "Nhập dữ liệu theo lô", - "admin.batch-import.page.validateOnly.hint": "Nếu chọn tùy chọn \"Kiểm tra file ZIP tải lên\", hệ thống sẽ chạy một tiến trình kiểm tra việc nhập dữ liệu theo lô thay vì đổ trực tiếp dữ liệu lên hệ thống. Việc này giúp cán bộ xác nhận lại kết quả của quy trình nhập trước khi nhập dữ liệu chính thức. Bỏ chọn tùy chọn này để đổ lô tài liệu lên hệ thống.", - - "admin.metadata-import.breadcrumbs": "Nhập thông tin mô tả", - "admin.metadata-import.page.button.proceed": "Tiếp tục", - "admin.metadata-import.page.button.return": "Quay lại", - "admin.metadata-import.page.button.select-collection": "Chọn Bộ sưu tập", - "admin.metadata-import.page.dropMsg": "Thả một tệp CSV để nhập thông tin mô tả", - "admin.metadata-import.page.dropMsgReplace": "Thả một tệp CSV để nhập thông tin mô tả thay thế", - "admin.metadata-import.page.error.addFile": "Lựa chọn tệp trước!", - "admin.metadata-import.page.header": "Nhập thông tin mô tả", - "admin.metadata-import.page.help": "Bạn có thể thả hoặc duyệt tới tệp CSV chứa hàng loạt các thông tin mô tả tại đây", - "admin.metadata-import.page.validateOnly": "Kiểm tra nhập lô siêu dữ liệu", - "admin.metadata-import.page.validateOnly.hint": "Nếu chọn tùy chọn \"Kiểm tra nhập lô siêu dữ liệu\", hệ thống sẽ chạy một tiến trình kiểm tra nhập lô siêu dữ liệu thay vì đổ trực tiếp dữ liệu lên hệ thống. Bỏ chọn tùy chọn này để tiến hành nhập dữ liệu chính thức.", - "admin.metadata-import.title": "Nhập thông tin mô tả", - - "advanced-workflow-action.rating.form.rating.label": "Xếp hạng", - "advanced-workflow-action.rating.form.rating.error": "Bạn phải đánh giá tài liệu/ thực thế này", - "advanced-workflow-action.rating.form.review.label": "Kiểm duyệt", - "advanced-workflow-action.rating.form.review.error": "Bạn phải nhập nội dung đánh giá để gửi bản xếp hạng này", - "advanced-workflow-action.rating.description": "Vui lòng chọn một xếp hạng bên dưới", - "advanced-workflow-action.rating.description-requiredDescription": "Vui lòng chọn xếp hạng bên dưới và thêm đánh giá", - "advanced-workflow-action.select-reviewer.description-single": "Vui lòng chọn một người kiểm duyệt dưới đây trước khi tải tài liệu lên", - "advanced-workflow-action.select-reviewer.description-multiple": "Vui lòng chọn một hoặc nhiều người kiểm duyệt dưới đây trước khi tải tài liệu lên", - "advanced-workflow-action-select-reviewer.groups.form.reviewers-list.head": "Người dùng", - "advanced-workflow-action-select-reviewer.groups.form.reviewers-list.search.head": "Thêm người dùng", - "advanced-workflow-action-select-reviewer.groups.form.reviewers-list.button.see-all": "Duyệt tất cả", - "advanced-workflow-action-select-reviewer.groups.form.reviewers-list.headMembers": "Các thành viên hiện tại", - "advanced-workflow-action-select-reviewer.groups.form.reviewers-list.search.scope.metadata": "Siêu dữ liệu", - "advanced-workflow-action-select-reviewer.groups.form.reviewers-list.search.scope.email": "E-mail (exact)", - "advanced-workflow-action-select-reviewer.groups.form.reviewers-list.search.button": "Tìm kiếm", - "advanced-workflow-action-select-reviewer.groups.form.reviewers-list.table.id": "ID", - "advanced-workflow-action-select-reviewer.groups.form.reviewers-list.table.name": "Name", - "advanced-workflow-action-select-reviewer.groups.form.reviewers-list.table.identity": "Identity", - "advanced-workflow-action-select-reviewer.groups.form.reviewers-list.table.email": "Email", - "advanced-workflow-action-select-reviewer.groups.form.reviewers-list.table.netid": "NetID", - "advanced-workflow-action-select-reviewer.groups.form.reviewers-list.table.edit": "Loại bỏ / Thêm", - "advanced-workflow-action-select-reviewer.groups.form.reviewers-list.table.edit.buttons.remove": "Loại bỏ người dùng \"{{name}}\"", - "advanced-workflow-action-select-reviewer.groups.form.reviewers-list.notification.success.addMember": "Thêm thành công thành viên: \"{{name}}\"", - "advanced-workflow-action-select-reviewer.groups.form.reviewers-list.notification.failure.addMember": "Không thể thêm thành viên: \"{{name}}\"", - "advanced-workflow-action-select-reviewer.groups.form.reviewers-list.notification.success.deleteMember": "Xóa thành công thành viên: \"{{name}}\"", - "advanced-workflow-action-select-reviewer.groups.form.reviewers-list.notification.failure.deleteMember": "Không thể xóa thành viên: \"{{name}}\"", - "advanced-workflow-action-select-reviewer.groups.form.reviewers-list.table.edit.buttons.add": "Thêm thành viên \"{{name}}\"", - "advanced-workflow-action-select-reviewer.groups.form.reviewers-list.notification.failure.noActiveGroup": "Không có nhóm hoạt động, gửi tên trước.", - "advanced-workflow-action-select-reviewer.groups.form.reviewers-list.no-members-yet": "Chưa có thành viên nào trong nhóm, tìm kiếm để thêm.", - "advanced-workflow-action-select-reviewer.groups.form.reviewers-list.no-items": "Không tìm thấy người dùng", - "advanced-workflow-action.select-reviewer.no-reviewer-selected.error": "Không có người kiểm duyệt nào được chọn.", - - "auth.errors.invalid-user": "Địa chỉ email hoặc mật khẩu không hợp lệ.", - - "auth.messages.expired": "Phiên của bạn đã hết hạn. Xin vui lòng đăng nhập lại.", - "auth.messages.token-refresh-failed": "Làm mới mã token phiên làm việc của bạn không thành công. Vui lòng đăng nhập lại.", - - "bitstream.download.page": "Đang tải xuống {{bitstream}}... ", - "bitstream.download.page.back": "Quay lại", - - "bitstream.edit.authorizations.link": "Chỉnh sửa chính sách của tệp tin", - "bitstream.edit.authorizations.title": "Chỉnh sửa chính sách của tệp tin", - "bitstream.edit.bitstream": "Tệp tin:", - "bitstream.edit.form.description.hint": "Tùy chọn cung cấp mô tả ngắn gọn về tệp ví dụ \"Bài báo chính\" or \"Dữ liệu đọc thử nghiệm\".", - "bitstream.edit.form.description.label": "Mô tả", - "bitstream.edit.form.embargo.hint": "Ngày đầu tiên được phép truy cập. Ngày này không thể được chỉnh sửa trên biểu mẫu này. Để thiết lập một ngày ngừng phục vụ tệp tin này đi tới thẻ Trạng thái tài liệu nhấp Phân quyền... tạo hoặc chỉnh sửa quyền ĐỌC của tệp tin và thiết lập Ngày bắt đầu như mong muốn.", - "bitstream.edit.form.embargo.label": "Ngừng phục vụ cho tới ngày", - "bitstream.edit.form.fileName.hint": "Thay đổi tên tệp cho tệp tin. Lưu ý rằng điều này sẽ thay đổi hiển thị URL tệp tin nhưng các liên kết cũ sẽ vẫn phân giải miễn là ID trình tự không thay đổi.", - "bitstream.edit.form.fileName.label": "Tên tệp", - "bitstream.edit.form.iiifHeight.hint": "Chiều cao của khung thường phải khớp với chiều cao của hình ảnh", - "bitstream.edit.form.iiifHeight.label": "Chiều cao ảnh", - "bitstream.edit.form.iiifLabel.hint": "Tên cho hình ảnh này. Nếu không được cung cấp tên mặc định sẽ được sử dụng.", - "bitstream.edit.form.iiifLabel.label": "Tên", - "bitstream.edit.form.iiifToc.hint": "Thêm mục lục mới", - "bitstream.edit.form.iiifToc.label": "Mục lục", - "bitstream.edit.form.iiifWidth.hint": "Chiều rộng của khung thường phải khớp với chiều rộng của hình", - "bitstream.edit.form.iiifWidth.label": "Chiều rộng khung", - "bitstream.edit.form.newFormat.hint": "Ứng dụng bạn đã sử dụng để tạo tệp và thông tin phiên bản (ví dụ \"ACMESoft SuperApp phiên bản 1.5\").", - "bitstream.edit.form.newFormat.label": "Mô tả định dạng mới", - "bitstream.edit.form.primaryBitstream.label": "Tệp tin chính", - "bitstream.edit.form.selectedFormat.hint": "Nếu định dạng không có trong danh sách trên chọn \"định dạng không có trong danh sách\" trên và mô tả nó dưới mục\"Mô tả định dạng mới\".", - "bitstream.edit.form.selectedFormat.label": "Định dạng đã chọn", - "bitstream.edit.form.selectedFormat.unknown": "Định dạng không có trong danh sách", - "bitstream.edit.notifications.error.format.title": "Đã xảy ra lỗi khi lưu định dạng của tệp tin", - "bitstream.edit.notifications.saved.content": "Thay đổi của bạn đối với tệp tin đã được lưu.", - "bitstream.edit.notifications.saved.title": "Đã lưu tệp tin", - "bitstream.edit.return": "Quay lại", - "bitstream.edit.title": "Chỉnh sửa tệp tin", - - "bitstream-request-a-copy.alert.canDownload1": "Bạn đã có quyền truy cập tệp tin này. Nếu muốn tải tệp tin click ", - "bitstream-request-a-copy.alert.canDownload2": "vào đây", - "bitstream-request-a-copy.allfiles.label": "Các tệp tin", - "bitstream-request-a-copy.email.error": "Vui lòng nhập một địa chỉ email hợp lệ.", - "bitstream-request-a-copy.email.hint": "Địa chỉ email này đã được sử dụng để gửi tệp tin.", - "bitstream-request-a-copy.email.label": "Địa chỉ email của bạn *", - "bitstream-request-a-copy.files-all-false.label": "Chỉ tệp tin được yêu cầu", - "bitstream-request-a-copy.files-all-true.label": "Tất cả tệp tin của tài liệu này đều bị hạn chế quyền truy cập", - "bitstream-request-a-copy.header": "Yêu cầu bản sao", - "bitstream-request-a-copy.intro": "Nhập các thông tin dưới đây để yêu cầu bản sao của tài liệu:", - "bitstream-request-a-copy.intro.bitstream.all": "Yêu cầu tất cả các tệp tin.", - "bitstream-request-a-copy.intro.bitstream.one": "Yêu cầu các tệp tin sau:", - "bitstream-request-a-copy.message.label": "Tin nhắn", - "bitstream-request-a-copy.name.error": "Tên là bắt buộc", - "bitstream-request-a-copy.name.label": "Tên*", - "bitstream-request-a-copy.return": "Quay lại", - "bitstream-request-a-copy.submit": "Yêu cầu bản sao", - "bitstream-request-a-copy.submit.error": "Đã xảy ra lỗi trong quá trình gửi yêu cầu tài liệu.", - "bitstream-request-a-copy.submit.success": "Yêu cầu tài liệu đã được gửi thành công.", - - "browse.back.all-results": "Tất cả kết quả", - - "browse.comcol.by.author": "Tác giả", - "browse.comcol.by.dateissued": "Năm xuất bản", - "browse.comcol.by.subject": "Chủ đề", - "browse.comcol.by.title": "Nhan đề", - "browse.comcol.head": "Duyệt", - - "browse.empty": "Không có tài liệu nào để hiển thị.", - - "browse.metadata.author": "Tác giả", - "browse.metadata.author.breadcrumbs": "Duyệt theo tác giả", - "browse.metadata.dateissued": "Năm xuất bản", - "browse.metadata.dateissued.breadcrumbs": "Duyệt theo năm xuất bản", - "browse.metadata.subject": "Chủ đề", - "browse.metadata.subject.breadcrumbs": "Duyệt theo chủ đề", - "browse.metadata.title": "Nhan đề", - "browse.metadata.title.breadcrumbs": "Duyệt theo nhan đề", - "browse.metadata.topic": "Topic", - "browse.metadata.type": "Kiểu tài liệu", - - "pagination.next.button": "Tiếp theo", - "pagination.previous.button": "Quay lại", - "pagination.next.button.disabled.tooltip": "Không còn trang kết quả khác", - - "browse.startsWith.choose_year.label": "Chọn năm xuất bản", - "browse.startsWith.choose_year": "(Năm)", - "browse.startsWith.jump": "Chuyển tới một điểm trong chỉ mục:", - "browse.startsWith.months.april": "Tháng Tư", - "browse.startsWith.months.august": "Tháng Tám", - "browse.startsWith.months.december": "Tháng Mười hai", - "browse.startsWith.months.february": "Tháng Hai", - "browse.startsWith.months.january": "Tháng Một", - "browse.startsWith.months.july": "Tháng Bảy", - "browse.startsWith.months.june": "Tháng Sáu", - "browse.startsWith.months.march": "Tháng Ba", - "browse.startsWith.months.may": "Tháng Năm", - "browse.startsWith.months.none.label": "Chọn tháng xuất bản", - "browse.startsWith.months.none": "(Tháng)", - "browse.startsWith.months.november": "Tháng Mười một", - "browse.startsWith.months.october": "Tháng Mười", - "browse.startsWith.months.september": "Tháng Chín", - "browse.startsWith.submit": "Duyệt", - "browse.startsWith.type_date": "Hoặc nhập một ngày (năm-tháng) và nhấp \"Duyệt\"", - "browse.startsWith.type_date.label": "Hoặc nhập một ngày (năm-tháng) à nhấp Duyệt", - "browse.startsWith.type_text": "Nhập một vài ký tự đầu tiên và nhấp vào nút Duyệt", - - "browse.title": "Duyệt {{ collection }} theo {{ field }}{{ startsWith }} {{ value }}", - "browse.title.page": "Duyệt {{ collection }} theo {{ field }} {{ value }}", - - "search.browse.item-back": "Quay lại kết quả tìm kiếm", - - "chips.remove": "Loại bỏ chip", - - "claimed-approved-search-result-list-element.title": "Chấp nhận", - "claimed-declined-search-result-list-element.title": "Đã bị từ chối, đã gửi lại cho người nhập liệu", - "claimed-declined-task-search-result-list-element.title": "Bị từ chối, đã gửi lại tới người quản lý kiểm duyệt", - - "collection.create.head": "Tạo một Bộ sưu tập", - "collection.create.notifications.success": "Tạo bộ sưu tập thành công", - "collection.create.sub-head": "Tạo một bộ sưu tập cho đơnn vị {{ parent }}", - "collection.curate.header": "Kiểm tra bộ sưu tập: {{collection}}", - "collection.delete.cancel": "Hủy", - "collection.delete.confirm": "Xác nhận", - "collection.delete.head": "Xóa bộ sưu tập", - "collection.delete.notification.fail": "Không thể xóa bộ sưu tập", - "collection.delete.notification.success": "Xóa bộ sưu tập thành công", - "collection.delete.processing": "Đang xóa", - "collection.delete.text": "Bạn có chắc chắn rằng bạn muốn xóa bộ sưu tập \"{{ dso }}\"", - "collection.edit.breadcrumbs": "Chỉnh sửa bộ sưu tập", - "collection.edit.delete": "Xóa bộ sưu tập này", - "collection.edit.head": "Chỉnh sửa bộ sưu tập", - "collection.edit.item.authorizations.load-bundle-button": "Hiển thị thêm các nhóm khác", - "collection.edit.item.authorizations.load-more-button": "Hiển thị thêm", - "collection.edit.item.authorizations.show-bitstreams-button": "Hiển thị chính sách phân quyền tệp tin đối với nhóm", - "collection.edit.item-mapper.cancel": "Hủy", - "collection.edit.item-mapper.collection": "Bộ sưu tập: \"{{name}}\"", - "collection.edit.item-mapper.confirm": "Ánh xạ những tài liệu đã chọn", - "collection.edit.item-mapper.description": "Đây là công cụ liên kết tài liệu cho phép người quản trị bộ sưu tập liên kết các tài liệu từ các bộ sưu tập khác vào bộ sưu tập này. Bạn có thể tìm kiếm các tài liệu từ các bộ sưu tập khác và liên kết chúng hoặc duyệt qua danh sách các tài liệu hiện đã được liên kết.", - "collection.edit.item-mapper.head": "Liên kết tài liệu - Liên kết tài liệu tới bộ sưu tập khác", - "collection.edit.item-mapper.no-search": "Vui lòng nhập truy vấn để tìm kiếm", - "collection.edit.item-mapper.notifications.map.error.content": "Đã xảy ra lỗi khi liên kết{{amount}} tài liệu.", - "collection.edit.item-mapper.notifications.map.error.head": "Lỗi liên kết", - "collection.edit.item-mapper.notifications.map.success.content": "Ánh xạ thành công {{amount}} tài liệu.", - "collection.edit.item-mapper.notifications.map.success.head": "Ánh xạ được hoàn thành", - "collection.edit.item-mapper.notifications.unmap.error.content": "Đã xảy ra lỗi khi loại bỏ các liên kết của {{amount}} tài liệu.", - "collection.edit.item-mapper.notifications.unmap.error.head": "Lỗi loại bỏ liên kết", - "collection.edit.item-mapper.notifications.unmap.success.content": "Loại bỏ thành công các liên kết của {{amount}} tài liệu.", - "collection.edit.item-mapper.notifications.unmap.success.head": "Hoàn thành loại bỏ liên kết", - "collection.edit.item-mapper.remove": "Loại bỏ các liên kết của tài liệu được chọn", - "collection.edit.item-mapper.search-form.placeholder": "Tìm kiếm tài liệu...", - "collection.edit.item-mapper.tabs.browse": "Duyệt các tài liệu được liên kết", - "collection.edit.item-mapper.tabs.map": "Liên kết tài liệu mới", - "collection.edit.logo.delete.title": "Xóa logo", - "collection.edit.logo.delete-undo.title": "Hoàn tác xóa", - "collection.edit.logo.label": "Logo bộ sưu tập", - "collection.edit.logo.notifications.add.error": "Tải lên không thành công logo bộ sưu tập. Vui lòng kiểm tra nội dung trước khi thử lại.", - "collection.edit.logo.notifications.add.success": "Tài thành công logo bộ sưu tập.", - "collection.edit.logo.notifications.delete.error.title": "Lỗi khi xóa logo", - "collection.edit.logo.notifications.delete.success.content": "Xóa thành công logo của bộ sưu tập", - "collection.edit.logo.notifications.delete.success.title": "Logo đã được xóa", - "collection.edit.logo.upload": "Thả một logo bộ sưu tập để tải lên", - "collection.edit.notifications.success": "Chỉnh sửa thành công bộ sưu tập", - "collection.edit.return": "Quay lại", - "collection.edit.tabs.authorizations.head": "Phân quyền", - "collection.edit.tabs.authorizations.title": "Chỉnh sửa bộ sưu tập - Phân quyền", - "collection.edit.tabs.curate.head": "Kiểm tra", - "collection.edit.tabs.curate.title": "Chỉnh sửa bộ sưu tập - Kiểm tra", - "collection.edit.tabs.item-mapper.title": "Chỉnh sửa bộ sưu tập - Liên kết tài liệu", - "collection.edit.tabs.mapper.head": "Liên kết tài liệu", - "collection.edit.tabs.metadata.head": "Chỉnh sửa thông tin mô tả", - "collection.edit.tabs.metadata.title": "Chỉnh sửa bộ sưu tập - Siêu dữ liệu", - "collection.edit.tabs.roles.head": "Gán quyền", - "collection.edit.tabs.roles.title": "Chỉnh sửa bộ sưu tập - Vai trò", - "collection.edit.tabs.source.external": "Bộ sưu tập này thu thập nội dung từ một nguồn bên ngoài", - "collection.edit.tabs.source.form.errors.oaiSource.required": "Bạn phải cung cấp một bộ id của bộ sưu tập đích.", - "collection.edit.tabs.source.form.harvestType": "Nội dung đang được thu thập", - "collection.edit.tabs.source.form.head": "Cấu hình nguồn bên ngoài", - "collection.edit.tabs.source.form.metadataConfigId": "Định dạng thông tin mô tả", - "collection.edit.tabs.source.form.oaiSetId": "ID của bộ OAI", - "collection.edit.tabs.source.form.oaiSource": "Nhà cung cấp OAI", - "collection.edit.tabs.source.form.options.harvestType.METADATA_AND_BITSTREAMS": "Thu thập thông tin mô tả và tệp tin (yêu cầu hỗ trợ ORE)", - "collection.edit.tabs.source.form.options.harvestType.METADATA_AND_REF": "Thu thập thông tin mô tả và tham chiếu đến tệp tin (yêu cầu hỗ trợ ORE)", - "collection.edit.tabs.source.form.options.harvestType.METADATA_ONLY": "Chỉ thu thập thông tin mô tả", - "collection.edit.tabs.source.head": "Nguồn nội dung", - "collection.edit.tabs.source.notifications.discarded.content": "Các thay đổi của bạn đã bị hủy. Để khôi phục các thay đổi hãy nhấp vào nút 'Hoàn tác'", - "collection.edit.tabs.source.notifications.discarded.title": "Các thay đổi đã bị hủy", - "collection.edit.tabs.source.notifications.invalid.content": "Các thay đổi chưa được lưu. Hãy đảm bảo rằng tất cả các trường đều hợp lệ trước khi lưu.", - "collection.edit.tabs.source.notifications.invalid.title": "Siêu dữ liệu không hợp lệ", - "collection.edit.tabs.source.notifications.saved.content": "Các thay đổi của bạn đối với nguồn nội dung của bộ sưu tập này đã được lưu.", - "collection.edit.tabs.source.notifications.saved.title": "Nguồn nội dung đã được lưu", - "collection.edit.tabs.source.title": "Chỉnh sửa bộ sưu tập - Nguồn nội dung", - "collection.edit.template.add-button": "Thêm", - "collection.edit.template.breadcrumbs": "Khung mẫu tài liệu", - "collection.edit.template.cancel": "Hủy", - "collection.edit.template.delete-button": "Xóa", - "collection.edit.template.edit-button": "Chỉnh sửa", - "collection.edit.template.error": "Đã xảy ra lỗi khi truy xuất khung mẫu tài liệu", - "collection.edit.template.head": "Chỉnh sửa khung mẫu tài liệu cho bộ sưu tập \"{{ collection }}\"", - "collection.edit.template.label": "Khung mẫu tài liệu", - "collection.edit.template.loading": "Đang tải khung mẫu tài liệu...", - "collection.edit.template.notifications.delete.error": "Xóa khung mẫu tài liệu không thành công", - "collection.edit.template.notifications.delete.success": "Xóa khung mẫu tài liệu thành công", - "collection.edit.template.title": "Chỉnh sửa khung mẫu tài liệu", - "collection.form.abstract": "Mô tả ngắn", - "collection.form.description": "Văn bản giới thiệu (HTML)", - "collection.form.entityType": "Loại thực thể", - "collection.form.errors.title.required": "Vui lòng nhập tên bộ sưu tập", - "collection.form.license": "Giấy phép", - "collection.form.provenance": "Nguồn gốc", - "collection.form.rights": "Bản quyền (HTML)", - "collection.form.tableofcontents": "Tin tức (HTML)", - "collection.form.title": "Tên", - "collection.listelement.badge": "Bộ sưu tập", - "collection.page.browse.recent.empty": "Không có biểu ghi nào để hiển thị", - "collection.page.browse.recent.head": "Những tài liệu tải lên gần đây", - "collection.page.edit": "Chỉnh sửa bộ sưu tập", - "collection.page.handle": "URL", - "collection.page.description.abstract": "Mô tả", - "collection.page.license": "Giấy phép", - "collection.page.news": "Tin tức", - "collection.select.confirm": "Xác nhận các mục đã chọn", - "collection.select.empty": "Không có bộ sưu tập nào để hiển thị", - "collection.select.table.title": "Nhan đề", - "collection.source.controls.harvest.last": "Lần thu thập trước:", - "collection.source.controls.harvest.message": "Thông tin thu thập:", - "collection.source.controls.harvest.no-information": "N\/A", - "collection.source.controls.harvest.start": "Thời gian bắt đầu thu thập:", - "collection.source.controls.harvest.status": "Trạng thái thu thập:", - "collection.source.controls.head": "Quản lý thu thập:", - "collection.source.controls.import.completed": "Quá trình nhập liệu đã hoàn thành", - "collection.source.controls.import.failed": "Xảy ra lỗi trong quá trình nhập dữ liệu", - "collection.source.controls.import.running": "Đang nhập dữ liệu…", - "collection.source.controls.import.submit": "Nhập ngay", - "collection.source.controls.import.submit.error": "Xảy ra sự cố khi bắt đầu quá trình nhập dữ liệu", - "collection.source.controls.import.submit.success": "Quá trình nhập liệu đã được bắt đầu thành công", - "collection.source.controls.reset.completed": "Quá trình thiết lập và nhập lại dữ liệu đã hoàn tất", - "collection.source.controls.reset.failed": "Xảy ra sự cố trong quá trình thiết lập và nhập lại dữ liệu", - "collection.source.controls.reset.running": "Đang thiết lập và nhập lại dữ liệu", - "collection.source.controls.reset.submit": "Thiết lập và nhập lại dữ liệu", - "collection.source.controls.reset.submit.error": "Đã xảy ra lỗi khi bắt đầu thiết lập và nhập lại dữ liệu", - "collection.source.controls.reset.submit.success": "Quá trình thiết lập và nhập lại dữ liệu đã được bắt đầu thành công", - "collection.source.controls.test.completed": "Tập lệnh để kiểm tra cài đặt đã kết thúc thành công", - "collection.source.controls.test.failed": "Tập lệnh để kiểm tra cài đặt không thành công", - "collection.source.controls.test.running": "Cấu hình thử nghiệm…", - "collection.source.controls.test.submit": "Cấu hình thử nghiệm", - "collection.source.controls.test.submit.error": "Đã xảy ra lỗi khi bắt đầu cài đặt thử nghiệm", - "collection.source.update.notifications.error.content": "Các cài đặt đã được kiểm tra và không hoạt động.", - "collection.source.update.notifications.error.title": "Lỗi máy chủ", - - "community.create.head": "Tạo đơn vị", - "community.create.notifications.success": "Tạo đơn vị thành công", - "community.create.sub-head": "Tạo một đơn vị con cho đơn vị {{ parent }}", - "community.curate.header": "Kiểm tra đơn vị: {{community}}", - "community.delete.cancel": "Hủy", - "community.delete.confirm": "Xác nhận", - "community.delete.head": "Xóa đơn vị", - "community.delete.notification.fail": "Không thể xóa đơn vị", - "community.delete.notification.success": "Xóa đơn vị thành công", - "community.delete.processing": "Đang xóa…", - "community.delete.text": "Bạn có chắc chắn muốn xóa đơn vị \"{{ dso }}\"", - "community.edit.breadcrumbs": "Chỉnh sửa đơn vị", - "community.edit.delete": "Xóa đơn vị này", - "community.edit.head": "Chỉnh sửa đơn vị", - "community.edit.logo.delete.title": "Xóa logo", - "community.edit.logo.delete-undo.title": "Hoàn tác xóa", - "community.edit.logo.label": "Logo đơn vị", - "community.edit.logo.notifications.add.error": "Tải lên không thành công thành công logo đơn vị. Vui lòng kiểm tra lại nội dung trước khi tải lại.", - "community.edit.logo.notifications.add.success": "Tài lên thành công logo đơn vị.", - "community.edit.logo.notifications.delete.error.title": "Lỗi khi xóa logo", - "community.edit.logo.notifications.delete.success.content": "Xóa thành công logo của đơn vị", - "community.edit.logo.notifications.delete.success.title": "Đã xóa logo", - "community.edit.logo.upload": "Thả một logo đơn vị để tải lên", - "community.edit.notifications.error": "Đã xảy ra lỗi khi chỉnh sửa đơn vị", - "community.edit.notifications.success": "Chỉnh sửa đơn vị thành công", - "community.edit.notifications.unauthorized": "Bạn không có quyền để thực hiện thay đổi này", - "community.edit.return": "Quay lại", - "community.edit.tabs.authorizations.head": "Phân quyền", - "community.edit.tabs.authorizations.title": "Chỉnh sửa đơn vị - Phân quyền", - "community.edit.tabs.curate.head": "Kiểm tra", - "community.edit.tabs.curate.title": "Chỉnh sửa đơn vị - Kiểm tra", - "community.edit.tabs.metadata.head": "Chỉnh sửa thông tin mô tả", - "community.edit.tabs.metadata.title": "Chỉnh sửa đơn vị - Siêu dữ liệu", - "community.edit.tabs.roles.head": "Gán quyền", - "community.edit.tabs.roles.title": "Chỉnh sửa đơn vị - Quyền", - "community.form.abstract": "Mô tả ngắn", - "community.form.description": "Văn bản giới thiệu (HTML)", - "community.form.errors.title.required": "Vui lòng nhập tên đơn vị", - "community.form.rights": "Thông tin bản quyền (HTML)", - "community.form.tableofcontents": "Tin tức (HTML)", - "community.form.title": "Tên", - "community.listelement.badge": "Đơn vị", - "community.page.edit": "Chỉnh sửa đơn vị", - "community.page.handle": "URL", - "community.page.license": "Giấy phép", - "community.page.news": "Tin tức", - "community.sub-collection-list.head": "Các bộ sưu tập của đơn vị này", - "community.sub-community-list.head": "Các đơn vị con của đơn vị này", - "communityList.breadcrumbs": "Danh sách đơn vị", - "communityList.showMore": "Hiển thị thêm", - "communityList.tabTitle": "Danh sách đơn vị", - "communityList.title": "Danh sách các đơn vị", - - "comcol-role.edit.bitstream_read.anonymous-group": "Quyền đọc được mặc định cho các tài liệu hiện được đặt cho nhóm người dùng ẩn danh.", - "comcol-role.edit.bitstream_read.description": "Người có quyền đọc tệp tin có khả năng tải các tệp tin về máy tính cá nhân để sử dụng", - "comcol-role.edit.bitstream_read.name": "Quyền đọc tệp tin mặc định", - "comcol-role.edit.collection-admin.description": "Quản trị viên bộ sưu tập quyết định người có thể tải tài liệu vào bộ sưu tập sửa thông tin mô tả của tài liệu (sau khi tải lên) và thêm (liên kết) tài liệu đã tồn tại từ bộ sưu tập khác (phụ thuộc phân quyền vào bộ sưu tập đó)", - "comcol-role.edit.collection-admin.name": "Quản trị", - "comcol-role.edit.community-admin.description": "Quản trị viên đơn vị có thể tạo đơn vị con hoặc bộ sưu tập và quản lý hoặc gán quyền quản lý cho những đơn vị con hoặc bộ sưu tập đó. Ngoài ra họ quyết định ai có thể tải các tài liệu vào bất kì bộ sưu tập nào chỉnh sửa thông tin thông tin mô tả của tài liệu (sau khi tải lên) và thêm (liên kết) các tài liệu đã tồn tại ở bộ sưu tập khác (phụ thuộc vào phân quyền)", - "comcol-role.edit.community-admin.name": "Quản trị", - "comcol-role.edit.create": "Tạo", - "comcol-role.edit.create.error.title": "Không tạo được nhóm có quyền '{{role }}'", - "comcol-role.edit.delete": "Xóa", - "comcol-role.edit.delete.error.title": "Không thể xóa nhóm có quyền '{{ role }}'", - "comcol-role.edit.editor.description": "Người biên tập có thể chỉnh sửa thông tin mô tả của tài liệu được tải lên, có thể chấp nhận hoặc từ chối tài liệu được tải lên.", - "comcol-role.edit.editor.name": "Người biên tập", - "comcol-role.edit.finaleditor.description": "Người biên tập cuối có thể chỉnh sửa thông tin mô tả của tài liệu được tải lên nhưng không thể từ chối tài liệu được tải lên.", - "comcol-role.edit.finaleditor.name": "Người biên tập cuối", - "comcol-role.edit.item_read.anonymous-group": "Quyền đọc được mặc định cho các tài liệu hiện được đặt cho nhóm người dùng ẩn danh.", - "comcol-role.edit.item_read.description": "Tài khoản người dùng và nhóm người dùng có thể đọc những tài liệu mới được tải lên bộ sưu tập này. Các thay đổi quyền này không có hiêu lực với những tài liệu đã được tải lên từ trước. Những tài liệu đã tồn tại trong hệ thống sẽ vẫn được xem bởi những người có quyền xem vào thời điểm chúng được bổ sung", - "comcol-role.edit.item_read.name": "Quyền đọc thông tin mô tả của tài liệu", - "comcol-role.edit.no-group": "Trống", - "comcol-role.edit.restrict": "Hạn chế", - "comcol-role.edit.reviewer.description": "Người kiểm duyệt có thể chấp nhận hoặc từ chối các tài liệu được tải lên. Tuy nhiên sẽ không thể chỉnh sửa thông tin mô tả của tài liệu.", - "comcol-role.edit.reviewer.name": "Người kiểm duyệt", - "comcol-role.edit.submitters.description": "Tài khoản người dùng và nhóm người dùng có quyền tải tài liệu mới vào bộ sưu tập này", - "comcol-role.edit.submitters.name": "Người tải lên", - - "community.form.abstract": "Mô tả ngắn", - "community.form.description": "Văn bản giới thiệu (HTML)", - "community.form.errors.title.required": "Vui lòng nhập tên đơn vị", - "community.form.rights": "Thông tin bản quyền (HTML)", - "community.form.tableofcontents": "Tin tức (HTML)", - "community.form.title": "Tên", - - "community.page.edit": "Chỉnh sửa đơn vị", - "community.page.handle": "URL", - "community.page.license": "Giấy phép", - "community.page.news": "Tin tức", - - "community.all-lists.head": "Đơn vị con và bộ sưu tập", - - "community.sub-collection-list.head": "Các bộ sưu tập của đơn vị này", - "community.sub-community-list.head": "Các đơn vị con của đơn vị này", - - "cookies.consent.accept-all": "Chấp thuận tất cả", - "cookies.consent.accept-selected": "Chấp nhận các mục đã chọn", - "cookies.consent.app.description.acknowledgement": "Bắt buộc để lưu sự xác nhận và đồng ý của bạn", - "cookies.consent.app.description.authentication": "Bắt buộc để đăng nhập", - "cookies.consent.app.description.google-analytics": "Cho phép chúng tôi theo dõi dữ liệu thống kê", - "cookies.consent.app.description.google-recaptcha": "Chúng tôi sử dụng dịch vụ google reCAPTCHA trong quá trình đăng ký và khôi phục mật khẩu", - "cookies.consent.app.description.preferences": "Bắt buộc để lưu tùy chọn của bạn", - "cookies.consent.app.disable-all.description": "Sử dụng nút chuyển này để bật hoặc tắt tất cả dịch vụ.", - "cookies.consent.app.disable-all.title": "Bật hoặc tắt tất cả dịch vụ", - "cookies.consent.app.opt-out.description": "Ứng dụng này đã được tải theo mặc định (nhưng bạn có thể chọn không tham gia)", - "cookies.consent.app.purpose": "mục đích", - "cookies.consent.app.required.description": "Ứng dụng này luôn được yêu cầu", - "cookies.consent.app.title.acknowledgement": "Sự xác nhận", - "cookies.consent.app.title.authentication": "Xác thực", - "cookies.consent.app.title.google-analytics": "Google Analytics", - "cookies.consent.app.title.google-recaptcha": "Google reCaptcha", - "cookies.consent.app.title.preferences": "Cài đặt cá nhân", - "cookies.consent.close": "Đóng", - "cookies.consent.content-modal.description": "Tại đây bạn có thể xem và tùy chỉnh thông tin mà chúng tôi thu thập được về bạn.", - "cookies.consent.content-modal.privacy-policy.name": "chính sách bảo mật", - "cookies.consent.content-modal.privacy-policy.text": "Để biết thêm vui lòng đọc {privacyPolicy} của chúng tôi.", - "cookies.consent.content-modal.service": "dịch vụ", - "cookies.consent.content-modal.services": "các dịch vụ", - "cookies.consent.content-modal.title": "Thông tin mà chúng tôi thu thập", - "cookies.consent.content-notice.description": "Chúng tôi thu thập và xử lý thông tin các nhân của bạn cho các mục đích sau: Xác thực các ưa thích xác nhận và thống kê.
Để biết thêm vui lòng đọc {privacyPolicy} của chúng tôi.", - "cookies.consent.content-notice.description.no-privacy": "Chúng tôi thu thập và xử lý thông tin cá nhân của bạn cho các mục đích sau: Xác thực Cài đặt cá nhân Xác nhận và Thống kê.", - "cookies.consent.content-notice.learnMore": "Tùy chỉnh", - "cookies.consent.content-notice.title": "Đồng ý sử dụng cookie", - "cookies.consent.decline": "Từ chối", - "cookies.consent.ok": "OK", - "cookies.consent.purpose.functional": "Chức năng", - "cookies.consent.purpose.registration-password-recovery": "Đăng ký và khôi phục mật khẩu", - "cookies.consent.purpose.sharing": "Chia sẻ", - "cookies.consent.purpose.statistical": "Thống kê", - "cookies.consent.save": "Lưu", - "cookies.consent.update": "Có 1 vài thay đổi từ lần ghé thăm cuối cùng của bạn vui lòng cập nhập sự đồng ý của bạn.", - - "curation-task.task.checklinks.label": "\"Kiểm tra các link trong thông tin mô tả\"", - "curation-task.task.citationpage.label": "Tạo trang trích dẫn", - "curation-task.task.noop.label": "NOOP", - "curation-task.task.profileformats.label": "Định dạng tệp tin", - "curation-task.task.register-doi.label": "Đăng ký DOI", - "curation-task.task.requiredmetadata.label": "Kiểm tra các trường dữ liệu bắt buộc", - "curation-task.task.translate.label": "Bộ dịch của Microsoft", - "curation-task.task.vscan.label": "Quét Virus", - - "curation.form.handle.hint": "Gợi ý: Nhập [your-handle-prefix]\/0 để chạy một tác vụ trên toàn bộ trang (chú ý rằng không phải tất cả tác vụ đều hỗ trợ khả năng này)", - "curation.form.handle.label": "Handle:", - "curation.form.submit": "Bắt đầu", - "curation.form.submit.error.content": "Đã có lỗi xảy ra khi cố gắng khởi động tác vụ kiểm tra.", - "curation.form.submit.error.head": "Việc chạy tác vụ kiểm tra đã thất bại", - "curation.form.submit.error.invalid-handle": "Không thể xác định định danh của đối tượng này", - "curation.form.submit.success.content": "Bạn sẽ được điều hướng đến trang phản hồi quy trình.", - "curation.form.submit.success.head": "Tác vụ kiểm tra đã khởi động thành công", - "curation.form.task-select.label": "Tác vụ:", - - "deny-request-copy.email.message": "Kính gửi {{ recipientName }}\n\nLiên quan đến yêu cầu của bạn Thư viện rất tiếc phải thông báo với bạn rằng chúng tôi không thể gửi cho bạn bản sao của (các) tệp bạn đã yêu cầu liên quan đến tài liệu: \"{{ itemUrl }}\" ({{ itemName }}).\n\nTrân trọng\n,{{ authorName}}<{{ authorEmail }}>", - "deny-request-copy.email.subject": "Yêu cầu bản sao tài liệu", - "deny-request-copy.error": "Đã xảy ra lỗi", - "deny-request-copy.header": "Từ chối yêu cầu bản sao tài liệu", - "deny-request-copy.intro": "Tin nhắn này sẽ được gửi đến người yêu cầu", - "deny-request-copy.success": "Từ chối thành công yêu cầu tài liệu", - - "dso.name.untitled": "Không có nhan đề", - - "dso-selector.claim.item.body": "Đây là những hồ sơ hiện có có thể liên quan đến bạn. Nếu bạn nhận ra mình ở một trong những hồ sơ này hãy chọn hồ sơ đó và trên trang chi tiết hãy chọn xác nhận hồ sơ. Nếu không bạn có thể tạo một hồ sơ mới từ đầu bằng cách sử dụng nút bên dưới.", - "dso-selector.claim.item.create-from-scratch": "Tạo hồ sơ mới", - "dso-selector.claim.item.head": "Mẹo quản lý hồ sơ", - "dso-selector.claim.item.not-mine-label": "Không có mục nào trong số này là của tôi", - "dso-selector.create.collection.head": "Bộ sưu tập mới", - "dso-selector.create.collection.sub-level": "Tạo một bộ sưu tập mới trong", - "dso-selector.create.community.head": "Đơn vị mới", - "dso-selector.create.community.or-divider": "hoặc", - "dso-selector.create.community.sub-level": "Tạo một đơn vị mới trong", - "dso-selector.create.community.top-level": "Tạo một đơn vị lớn", - "dso-selector.create.item.head": "Tài liệu mới", - "dso-selector.create.item.sub-level": "Tạo một tài liệu mới trong", - "dso-selector.create.submission.head": "Biên mục mới", - "dso-selector.create.topic.sub-level": "Tạo topic mới trong", - "dso-selector.create.topic.top-level": "Tạo topic lớn", - "dso-selector.edit.collection.head": "Chỉnh sửa bộ sưu tập", - "dso-selector.edit.community.head": "Chỉnh sửa đơn vị", - "dso-selector.edit.item.head": "Chỉnh sửa tài liệu", - "dso-selector.error.title": "Đã có lỗi xảy ra khi tìm kiếm kiểu tài liệu {{ type }}", - "dso-selector.export-batch.dspaceobject.head": "Xuất lô dữ liệu (định dạng file ZIP) từ", - "dso-selector.export-metadata.dspaceobject.head": "Xuất siêu dữ liệu từ", - "dso-selector.import-batch.dspaceobject.head": "Nhập lô dữ liệu từ", - "dso-selector.no-results": "Không tìm thấy kiểu {{ type }} nào", - "dso-selector.placeholder": "Tìm kiếm {{ type }}", - "dso-selector.results-could-not-be-retrieved": "Đã xảy ra lỗi vui lòng làm mới lại ↻", - "dso-selector.select.collection.head": "Chọn một bộ sưu tập", - "dso-selector.set-scope.community.button": "Tìm kiếm trên toàn hệ thống", - "dso-selector.set-scope.community.head": "Chọn một phạm vi tìm kiếm", - "dso-selector.set-scope.community.input-header": "Tìm kiếm một đơn vị hoặc bộ sưu tập", - "dso-selector.set-scope.community.or-divider": "hoặc", - - "supervision-group-selector.header": "Supervision Group Selector", - "supervision-group-selector.select.type-of-order.label": "Select a type of Order", - "supervision-group-selector.select.type-of-order.option.none": "NONE", - "supervision-group-selector.select.type-of-order.option.editor": "EDITOR", - "supervision-group-selector.select.type-of-order.option.observer": "OBSERVER", - "supervision-group-selector.select.group.label": "Select a Group", - "supervision-group-selector.button.cancel": "Cancel", - "supervision-group-selector.button.save": "Save", - "supervision-group-selector.select.type-of-order.error": "Please select a type of order", - "supervision-group-selector.select.group.error": "Please select a group", - "supervision-group-selector.notification.create.success.title": "Successfully created supervision order for group {{ name }}", - "supervision-group-selector.notification.create.failure.title": "Error", - "supervision-group-selector.notification.create.already-existing" : "A supervision order already exists on this item for selected group", - - "confirmation-modal.delete-eperson.cancel": "Hủy", - "confirmation-modal.delete-eperson.confirm": "Xóa", - "confirmation-modal.delete-eperson.header": "Xóa người dùng \"{{ dsoName }}\"", - "confirmation-modal.delete-eperson.info": "Bạn có chắc muốn xóa người dùng \"{{ dsoName }}\"", - "confirmation-modal.delete-profile.cancel": "Hủy", - "confirmation-modal.delete-profile.confirm": "Xóa", - "confirmation-modal.delete-profile.header": "Xóa hồ sơ", - "confirmation-modal.delete-profile.info": "Bạn có chắc chắn muốn xóa hồ sơ", - "confirmation-modal.export-batch.cancel": "Hủy", - "confirmation-modal.export-batch.confirm": "Xuất dữ liệu", - "confirmation-modal.export-batch.header": "Xuất lô dữ liệu (định dạng file ZIP) của tác giả {{ dsoName }}", - "confirmation-modal.export-batch.info": "Bạn có chắc chắn muốn xuất lô dữ liệu (định dạng file ZIP) của tác giả {{ dsoName }}", - "confirmation-modal.export-metadata.cancel": "Hủy", - "confirmation-modal.export-metadata.confirm": "Xuất dữ liệu", - "confirmation-modal.export-metadata.header": "Xuất thông tin mô tả tài liệu của đơn vị, bộ sưu tập {{ dsoName }}", - "confirmation-modal.export-metadata.info": "Bạn có chắc muốn xuất thông tin mô tả tài liệu của đơn vị, bộ sưu tập {{ dsoName }}", - "confirmation-modal.policies.cancel": "Hủy", - "confirmation-modal.policies.confirm": "Xác nhận", - "confirmation-modal.policies.header": "Chọn hướng phân quyền cho đối tượng đã di chuyển", - "confirmation-modal.policies.info": "Bạn muốn chọn hướng phân quyền cho đối tượng đã di chuyển", - "confirmation-modal.reset-password-eperson.cancel": "Hủy", - "confirmation-modal.reset-password-eperson.confirm": "Thiết lập lại mật khẩu", - "confirmation-modal.reset-password-eperson.info": "Bạn có chắc chắn muốn thiết lập lại mật khẩu cho người dùng \"{{ dsoName }}\"", - - "error.bitstream": "Lỗi tìm kiếm tệp tin", - "error.browse-by": "Lỗi tìm kiếm tài liệu", - "error.collection": "Lỗi tìm kiếm bộ sưu tập", - "error.collections": "Lỗi tìm kiếm bộ sưu tập", - "error.community": "Lỗi tìm kiếm đơn vị", - "error.default": "Lỗi", - "error.identifier": "Không tìm thấy tài liệu nào cho định danh này", - "error.invalid-search-query": "Truy vấn tìm kiếm không hợp lệ. Vui lòng kiểm tra
Cú pháp truy vấn Solr các phương pháp tốt nhất để biết thêm thông tin về lỗi này.", - "error.item": "Lỗi tìm kiếm tài liệu", - "error.items": "Lỗi tìm kiếm tài liệu", - "error.objects": "Lỗi tìm kiếm đối tượng", - "error.recent-submissions": "Lỗi tìm kiếm các tài liệu biên mục gần đây", - "error.search-results": "Lỗi tìm kiếm các kết quả tìm", - "error.sub-collections": "Lỗi tìm kiếm bộ sưu tập con", - "error.sub-communities": "Lỗi tìm kiếm đơn vị con", - "error.submission.sections.init-form-error": "Đã xảy ra lỗi khi khởi chạy các phần vui lòng kiểm tra cấu hình biểu mẫu đầu vào của bạn. Thông tin chi tiết ở bên dưới:

", - "error.top-level-communities": "Lỗi tìm kiếm đơn vị lớn", - "error.validation.emailTaken": "Email này đã được sử dụng", - "error.validation.filerequired": "Bắt buộc phải tải tệp tin lên", - "error.validation.groupExists": "Nhóm này đã tồn tại", - "error.validation.license.notgranted": "Bạn phải đồng ý với giấy phép này để hoàn thành tài liệu biên mục của mình. Nếu hiện tại bạn không thể đồng ý giấy phép này bạn có thể lưu tài liệu biên mục của mình và quay lại sau hoặc xóa nội dung đã biên mục.", - "error.validation.NotValidEmail": "Email này không hợp lệ", - "error.validation.pattern": "Đầu vào này bị giới hạn bởi mẫu hiện tại: {{ pattern }}.", - "error.validation.required": "Đây là trường bắt buộc", - "error-page.description.401": "không có quyền truy cập", - "error-page.description.403": "không được phép truy cập", - "error-page.description.404": "không tìm thấy trang", - "error-page.description.500": "Dịch vụ không sẵn sàng", - "error-page.orcid.generic-error": "Đã xảy ra lỗi khi đăng nhập qua ORCID. Make sure you have shared your ORCID account email address with DSpace. If the error persists contact the administrator", - - "feed.description": "Nguồn cấp dữ liệu tổng hợp", - - "file-section.error.header": "Lỗi khi lấy tệp cho tài liệu này", - - "footer.copyright": "bản quyền © 2002-{{ year }}", - "footer.link.cookies": "Cài đặt Cookie", - "footer.link.dspace": "Phần mềm thư viện số", - "footer.link.end-user-agreement": "Thỏa thuận bạn đọc", - "footer.link.feedback": "Gửi phản hồi", - "footer.link.lyrasis": "LYRASIS", - "footer.link.privacy-policy": "Chính sách riêng tư", - - "forgot-email.form.email": "Địa chỉ Email *", - "forgot-email.form.email.error.pattern": "Vui lòng nhập một địa chỉ email hợp lệ", - "forgot-email.form.email.error.required": "Vui lòng nhập địa chỉ email", - "forgot-email.form.email.hint": "Địa chỉ email này sẽ được xác nhận và sử dụng như là tên đăng nhập.", - "forgot-email.form.error.content": "Đã xảy ra lỗi khi đăng kí địa chỉ email sau: {{ email }}", - "forgot-email.form.error.head": "Đã xảy ra lỗi khi đăng kí email", - "forgot-email.form.header": "Quên mật khẩu", - "forgot-email.form.info": "Nhập địa chỉ email mà để đăng kí cập nhật thông tin tài liệu mới trong các bộ sưu tập qua email và biên mục tài liệu mới vào thư viện số.", - "forgot-email.form.submit": "Lưu", - "forgot-email.form.success.content": "Một email đã được gửi tới địa chỉ {{ email }} trong đó có chứa URL và các hướng dẫn chi tiết hơn.", - "forgot-email.form.success.head": "Email xác nhận đã được gửi tới bạn", - - "forgot-password.form.card.security": "Bảo mật", - "forgot-password.form.error.empty-password": "Vui lòng nhập mật khẩu mới trong ô dưới đây.", - "forgot-password.form.error.matching-passwords": "Hai mật khẩu không trùng khớp.", - "forgot-password.form.head": "Quên mật khẩu", - "forgot-password.form.identification.email": "Địa chỉ email:", - "forgot-password.form.identification.header": "Định danh", - "forgot-password.form.info": "Nhập mật khẩu mới trong ô dưới đây và xác nhận bằng cách nhập lại vào ô thứ hai. Mật khẩu nên chứa ít nhất 6 kí tự.", - "forgot-password.form.label.password": "Mật khẩu", - "forgot-password.form.label.passwordrepeat": "Nhập lại mật khẩu mới", - "forgot-password.form.notification.error.title": "Đã xảy ra lỗi khi gửi mật khẩu mới", - "forgot-password.form.notification.success.content": "Đã đặt lại mật khẩu thành công. Bạn đã được đăng nhập với tư cách là người dùng được tạo.", - "forgot-password.form.notification.success.title": "Hoàn thành đặt lại mật khẩu", - "forgot-password.form.submit": "Gửi mật khẩu", - "forgot-password.title": "Quên mật khẩu", - - "form.add": "Thêm", - "form.add-help": "Nhấp vào đây để thêm mục hiện tại và một mục khác", - "form.cancel": "Hủy", - "form.clear": "Xóa", - "form.clear-help": "Nhấp vào đây để xóa giá trị đã chọn", - "form.discard": "Hủy bỏ", - "form.drag": "Kéo", - "form.edit": "Chỉnh sửa", - "form.edit-help": "Nhấp vào đây để chỉnh sửa giá trị đã chọn", - "form.first-name": "Tên", - "form.group-collapse": "Thu hẹp", - "form.group-collapse-help": "Nhấp vào đây để thu hẹp", - "form.group-expand": "Mở rộng", - "form.group-expand-help": "Nhấp vào đây để mở rộng và thêm các yếu tố khác", - "form.last-name": "Họ", - "form.loading": "Đang tải...", - "form.lookup": "Tìm kiếm", - "form.lookup-help": "Nhấp vào đây để tìm kiếm mối liên hệ đang tồn tại", - "form.no-results": "Không tìm thấy kết quả phù hợp", - "form.no-value": "Không có giá trị nào được nhập vào", - "form.remove": "Xóa", - "form.repeatable.sort.tip": "Thả tài liệu vào vị trí mới", - "form.save": "Lưu", - "form.save-help": "Lưu thay đổi", - "form.search": "Tìm kiếm", - "form.search-help": "Nhấp vào đây để tìm kiếm thư từ đang tồn tại", - "form.submit": "Lưu", - - "grant-deny-request-copy.deny": "Không gửi bản sao", - "grant-deny-request-copy.email.back": "Quay lại", - "grant-deny-request-copy.email.message": "Tin nhắn", - "grant-deny-request-copy.email.message.empty": "Vui lòng nhập một tin nhắn", - "grant-deny-request-copy.email.permissions.info": "Bạn có thể nhân tiện dịp này để xem xét lại các hạn chế truy cập vào tài liệu để tránh phải trả lời các yêu cầu tương tự. Nếu bạn muốn yêu cầu quản trị hệ thống loại bỏ những hạn chế này vui lòng đánh dấu vào hộp bên dưới.", - "grant-deny-request-copy.email.permissions.label": "Chuyển thành truy cập mở", - "grant-deny-request-copy.email.send": "Gửi", - "grant-deny-request-copy.email.subject": "Chủ đề", - "grant-deny-request-copy.email.subject.empty": "Vui lòng nhập một chủ đề", - "grant-deny-request-copy.grant": "Gửi bản sao", - "grant-deny-request-copy.header": "Yêu cầu bản sao tài liệu", - "grant-deny-request-copy.home-page": "Đi tới trang chủ", - "grant-deny-request-copy.intro1": "Nếu bạn là một trong các tác giả của tài liệu {{ name }} vui lòng sử dụng một trong các tùy chọn dưới đây để phản hồi yêu cầu của bạn đọc.", - "grant-deny-request-copy.intro2": "Sau khi chọn một tùy chọn bạn sẽ thấy một email gợi ý trả lời mà bạn có thể chỉnh sửa.", - "grant-deny-request-copy.processed": "Yêu cầu này đã được xử lý. Bạn có thể sử dụng nút bên dưới để quay lại trang chủ.", - "grant-request-copy.email.message": "Dear {{ recipientName }}\n\nLiên quan đến yêu cầu của bạn Thư viện đồng ý gửi cho bạn bản sao của (các) tệp bạn đã yêu cầu liên quan đến tài liệu: \"{{ itemUrl }}\" ({{ itemName }}).\n\n\nTrân trọng\n\n{{ authorName }} <{{ authorEmail }}>\n", - "grant-request-copy.email.subject": "Yêu cầu bản sao tài liệu", - "grant-request-copy.error": "Đã xảy ra lỗi", - "grant-request-copy.header": "Chấp nhận yêu cầu bản sao tài liệu", - "grant-request-copy.intro": "Tin nhắn này sẽ được gửi đến người gửi yêu cầu. (Các) tài liệu được yêu cầu sẽ được gửi kèm tin nhắn.", - "grant-request-copy.success": "Yêu cầu tài liệu đã được xử lý thành công", - - "health.breadcrumbs": "Kiểm tra hệ thống", - "health-page.error.msg": "Dịch vụ kiểm tra hệ thống tạm thời không khả dụng", - "health-page.heading": "Kiểm tra hệ thống", - "health-page.info-tab": "Thông tin hệ thống", - "health-page.property.status": "Mã trạng thái", - "health-page.section.db.title": "Cơ sở dữ liệu", - "health-page.section.geoIp.title": "GeoIp", - "health-page.section.no-issues": "Không có vấn đề được phát hiện", - "health-page.section.solrAuthorityCore.title": "Solr: authority core", - "health-page.section.solrOaiCore.title": "Solr: oai core", - "health-page.section.solrSearchCore.title": "Solr: search core", - "health-page.section.solrStatisticsCore.title": "Solr: statistics core", - "health-page.section-info.app.title": "Ứng dụng Backend", - "health-page.section-info.java.title": "Java", - "health-page.status": "Trạng thái", - "health-page.status.error.info": "Các vấn đề được tìm thấy", - "health-page.status.ok.info": "Vận hành", - "health-page.status.warning.info": "Phát hiện các vấn đề có thể xảy ra", - "health-page.status-tab": "Trạng thái", - "health-page.title": "Kiểm tra hệ thống", - - "home.description": "", - "home.breadcrumbs": "Trang chủ", - "home.search-form.placeholder": "Tìm kiếm kho lưu trữ", - "home.title": "Trang chủ", - "home.top-level-communities.head": "Danh sách đơn vị trong DSpace", - "home.top-level-communities.help": "Chọn một đơn vị để xem các bộ sưu tập của nó.", - - "info.contact.breadcrumbs": "Thông tin liên hệ", - "info.contact.head": "Thông tin liên hệ", - "info.contact.title": "Thông tin liên hệ", - "info.end-user-agreement.accept": "Tôi đã đọc và đồng ý với Thỏa thuận bạn đọc", - "info.end-user-agreement.accept.error": "Đã xảy ra lỗi khi chấp nhận Thỏa thuận bạn đọc", - "info.end-user-agreement.accept.success": "Đã cập nhật thành công Thỏa thuận bạn đọc", - "info.end-user-agreement.breadcrumbs": "Thỏa thuận bạn đọc", - "info.end-user-agreement.buttons.cancel": "Hủy", - "info.end-user-agreement.buttons.save": "Lưu", - "info.end-user-agreement.head": "Thỏa thuận người dùng", - "info.end-user-agreement.title": "Thỏa thuận người dùng", - "info.feedback.breadcrumbs": "Phản hồi", - "info.feedback.comments": "Bình luận", - "info.feedback.create.success": "Gửi phản hồi thành công!", - "info.feedback.email_help": "Địa chỉ này sẽ được sử dụng để theo dõi phản hồi của bạn.", - "info.feedback.email-label": "Email", - "info.feedback.error.email.required": "Yêu cầu địa chỉ email hợp lệ", - "info.feedback.error.message.required": "Yêu cầu phải có nội dung bình luận", - "info.feedback.head": "Phản hồi", - "info.feedback.info": "Cảm ơn bạn đã chia sẽ phản hồi của mình tới Thư viện. Chúng tôi luôn trân trọng mọi ý kiến đóng góp của bạn!", - "info.feedback.page_help": "Trang liên kết với các phản hồi của bạn", - "info.feedback.page-label": "Trang", - "info.feedback.send": "Gửi phản hồi", - "info.feedback.title": "Phản hồi", - "info.help.head": "Trợ giúp", - "info.help.title": "Trợ giúp", - "info.privacy.breadcrumbs": "Cam kết bảo mật", - "info.privacy.head": "Cam kết bảo mật", - "info.privacy.title": "Cam kết bảo mật", - - "item.alerts.private": "Đây là tài liệu cá nhân", - "item.alerts.withdrawn": "Tài liệu này đã được chuyển sang chế độ ẩn", - "item.badge.private": "Cá nhân", - "item.badge.withdrawn": "Ẩn", - "item.bitstreams.upload.bundle": "Gói tệp tin", - "item.bitstreams.upload.bundle.new": "Tạo gói tệp tin", - "item.bitstreams.upload.bundle.placeholder": "Chọn một gói tệp tin", - "item.bitstreams.upload.bundles.empty": "Tài liệu này không có gói tệp tin nào để tải tệp tin vào.", - "item.bitstreams.upload.cancel": "Hủy", - "item.bitstreams.upload.drop-message": "Thả tệp tin để tài lên", - "item.bitstreams.upload.item": "Tài liệu:", - "item.bitstreams.upload.notifications.bundle.created.content": "Tạo thành công gói tệp tin.", - "item.bitstreams.upload.notifications.bundle.created.title": "Đã tạo gói tệp tin", - "item.bitstreams.upload.notifications.upload.failed": "Tải lên thất bại. Vui lòng xác minh nội dung sau trước khi thực hiện lại.", - "item.bitstreams.upload.title": "Tải tệp tin lên", - "item.edit.authorizations.heading": "Với trình chỉnh sửa này bạn có thể xem và chỉnh sửa chính sách phân quyền của một tài liệu (item) cũng như các thành phần của tài liệu đó như: gói tệp tin (bundle) và tệp tin (bitstream). Các tài liệu có thể chứa nhiều gói và mỗi gói có thể chứa nhiều tệp tin. Tài liệu và gói tệp tin thường có các quyền là THÊM\/XÓA\/ĐỌC\/CHỈNH SỬA còn tệp tin chỉ có quyền ĐỌC\/CHỈNH SỬA.", - "item.edit.authorizations.title": "Chỉnh sửa chính sách phân quyền của tài liệu", - "item.edit.bitstreams.bundle.displaying": "Đang hiển thị {{ amount }} trong số {{ total }} tệp tin.", - "item.edit.bitstreams.bundle.edit.buttons.upload": "Tải lên", - "item.edit.bitstreams.bundle.load.all": "Tải tất cả ({{ total }})", - "item.edit.bitstreams.bundle.load.more": "Xem thêm", - "item.edit.bitstreams.bundle.name": "GÓI TỆP TIN: {{ name }}", - "item.edit.bitstreams.discard-button": "Hủy bỏ", - "item.edit.bitstreams.edit.buttons.download": "Tải xuống", - "item.edit.bitstreams.edit.buttons.drag": "Kéo", - "item.edit.bitstreams.edit.buttons.edit": "Chỉnh sửa", - "item.edit.bitstreams.edit.buttons.remove": "Xóa", - "item.edit.bitstreams.edit.buttons.undo": "Hoàn tác", - "item.edit.bitstreams.empty": "Tài liệu này không chứa tệp tin nào. Hãy nhập vào nút tải lên để tải tệp tin.", - "item.edit.bitstreams.headers.actions": "Hành động", - "item.edit.bitstreams.headers.bundle": "Gói tệp tin", - "item.edit.bitstreams.headers.description": "Mô tả", - "item.edit.bitstreams.headers.format": "Định dạng", - "item.edit.bitstreams.headers.name": "Tên", - "item.edit.bitstreams.notifications.discarded.content": "Các thay đổi của bạn đã bị hủy. Để khôi phục các thay đổi của bạn hãy nhấp vào nút 'Hoàn tác'", - "item.edit.bitstreams.notifications.discarded.title": "Các thay đổi đã bị hủy", - "item.edit.bitstreams.notifications.move.failed.title": "Đã xảy ra lỗi khi di chuyển tệp tin", - "item.edit.bitstreams.notifications.move.saved.content": "Các di chuyển của bạn đối với tệp tin và gói tệp tin của tài liệu này đã được lưu lại.", - "item.edit.bitstreams.notifications.move.saved.title": "Di chuyển đã được lưu lại", - "item.edit.bitstreams.notifications.outdated.content": "Tài liệu bạn đang mở cũng đang được chỉnh sửa bởi một người dùng khác. Vì vậy các thay đổi của bạn đã bị hủy bỏ để tránh xảy ra xung đột.", - "item.edit.bitstreams.notifications.outdated.title": "Các thay đổi không có hiệu lực", - "item.edit.bitstreams.notifications.remove.failed.title": "Đã xảy ra lỗi khi xóa tệp tin", - "item.edit.bitstreams.notifications.remove.saved.content": "Các thay đổi liên quan tới việc xóa tệp tin của tài liệu này đã được lưu lại.", - "item.edit.bitstreams.notifications.remove.saved.title": "Việc xóa tệp tin đã được lưu lại", - "item.edit.bitstreams.reinstate-button": "Hoàn tác", - "item.edit.bitstreams.save-button": "Lưu", - "item.edit.bitstreams.upload-button": "Tải lên", - "item.edit.breadcrumbs": "Chỉnh sửa tài liệu", - "item.edit.delete.cancel": "Hủy", - "item.edit.delete.confirm": "Xóa", - "item.edit.delete.description": "Bạn có chắc chắn muốn xóa tài liệu này? Cẩn trọng: Hành động này sẽ xóa vĩnh viễn tài liệu và không thể khôi phục lại.", - "item.edit.delete.error": "Đã xảy ra lỗi trong khi xóa tài liệu này", - "item.edit.delete.header": "Xóa tài liệu: {{ id }}", - "item.edit.delete.success": "Tài liệu đã được xóa thành công", - "item.edit.head": "Chỉnh sửa tài liệu", - "item.edit.item-mapper.buttons.add": "Liên kết tài liệu tới các bộ sưu tập đã chọn", - "item.edit.item-mapper.buttons.remove": "Xóa liên kết tài liệu với các bộ sưu tập đã chọn", - "item.edit.item-mapper.cancel": "Hủy", - "item.edit.item-mapper.description": "Đây là công cụ liên kết tài liệu cho phép quản trị viên có thể liên kết tài liệu này với các bộ sưu tập khác. Bạn có thể tìm kiếm các bộ sưu tập và thực hiện liên kết hoặc xem danh sách các bộ sưu tập mà tài liệu hiện đang được liên kết tới.", - "item.edit.item-mapper.head": "Liên kết tài liệu - Liên kết tài liệu tới Bộ sưu tập khác", - "item.edit.item-mapper.item": "Tài liệu: \"{{name}}\"", - "item.edit.item-mapper.no-search": "Vui lòng nhập một truy vấn để tìm kiếm", - "item.edit.item-mapper.notifications.add.error.content": "Đã xảy ra lỗi khi liên kết tài liệu này tới {{amount}} bộ sưu tập.", - "item.edit.item-mapper.notifications.add.error.head": "Xảy ra lỗi khi liên kết", - "item.edit.item-mapper.notifications.add.success.content": "Đã liên kết thành công tài liệu này tới {{amount}} bộ sưu tập.", - "item.edit.item-mapper.notifications.add.success.head": "Hoàn thành liên kết tài liệu", - "item.edit.item-mapper.notifications.remove.error.content": "Đã xảy ra lỗi khi xóa liên kết của tài liệu với {{amount}} bộ sưu tập.", - "item.edit.item-mapper.notifications.remove.error.head": "Lỗi khi xóa liên kết tài liệu", - "item.edit.item-mapper.notifications.remove.success.content": "Đã xóa thành công liên kết giữa tài liệu với {{amount}} bộ sưu tập.", - "item.edit.item-mapper.notifications.remove.success.head": "Hoàn thành xóa liên kết tài liệu", - "item.edit.item-mapper.search-form.placeholder": "Tìm kiếm bộ sưu tập", - "item.edit.item-mapper.tabs.browse": "Xem các bộ sưu tập đã liên kết", - "item.edit.item-mapper.tabs.map": "Liên kết với các bộ sưu tập mới", - "item.edit.metadata.add-button": "Thêm", - "item.edit.metadata.discard-button": "Hủy bỏ", - "item.edit.metadata.edit.buttons.edit": "Chỉnh sửa", - "item.edit.metadata.edit.buttons.remove": "Xóa", - "item.edit.metadata.edit.buttons.undo": "Hoàn tác", - "item.edit.metadata.edit.buttons.unedit": "Ngừng chỉnh sửa", - "item.edit.metadata.empty": "Bộ sưu tập này hiện không chứa trường thông tin mặc định nào. Nhập vào nút Thêm để bắt đầu thêm giá trị mặc định cho trường thông tin cho các tài liệu biên mục mới trong bộ sưu tập.", - "item.edit.metadata.headers.edit": "Chỉnh sửa", - "item.edit.metadata.headers.field": "Trường", - "item.edit.metadata.headers.language": "Ngôn ngữ", - "item.edit.metadata.headers.value": "Giá trị", - "item.edit.metadata.metadatafield.invalid": "Vui lòng chọn một trường thông tin mô tả hợp lệ", - "item.edit.metadata.notifications.discarded.content": "Các thay đổi của bạn đã bị hủy. Để khôi phục lại các thay đổi này hãy nhấp vào nút 'Hoàn tác'", - "item.edit.metadata.notifications.discarded.title": "Đã khôi phục", - "item.edit.metadata.notifications.error.title": "Đã có lỗi xảy ra", - "item.edit.metadata.notifications.invalid.content": "Các thay đổi của bạn không được lưu lại. Vui lòng đảm bảo rằng tất cả các trường là hợp lệ trước khi bạn lưu.", - "item.edit.metadata.notifications.invalid.title": "Siêu dữ liệu không hợp lệ", - "item.edit.metadata.notifications.outdated.content": "Tài liệu bạn đang mở cũng đang được chỉnh sửa bởi một người dùng khác. Vì vậy các thay đổi của bạn với tài liệu sẽ bị hủy bỏ để tránh xung đột xảy ra.", - "item.edit.metadata.notifications.outdated.title": "Thay đổi không có hiệu lực", - "item.edit.metadata.notifications.saved.content": "Các thay đổi của bạn với thông tin mô tả của tài liệu này đã được lưu lại.", - "item.edit.metadata.notifications.saved.title": "Đã lưu thông tin mô tả", - "item.edit.metadata.reinstate-button": "Hoàn tác", - "item.edit.metadata.save-button": "Lưu", - "item.edit.modify.overview.field": "Trường", - "item.edit.modify.overview.language": "Ngôn ngữ", - "item.edit.modify.overview.value": "Giá trị", - "item.edit.move.cancel": "Quay lại", - "item.edit.move.description": "Chọn bộ sưu tập mà bạn muốn chuyển tài liệu này tới. Để giới hạn danh sách bộ sưu tập đang hiển thị bạn có thể nhập từ khóa tìm kiếm trong ô dưới đây.", - "item.edit.move.discard-button": "Hủy bỏ", - "item.edit.move.error": "Đã xảy ra lỗi khi thực hiện di chuyển tài liệu này", - "item.edit.move.head": "Di chuyển tài liệu: {{id}}", - "item.edit.move.inheritpolicies.checkbox": "Kế thừa chính sách", - "item.edit.move.inheritpolicies.description": "Kế thừa chính sách mặc định của bộ sưu tập đích", - "item.edit.move.move": "Di chuyển", - "item.edit.move.processing": "Đang di chuyển...", - "item.edit.move.save-button": "Lưu", - "item.edit.move.search.placeholder": "Nhập một từ khóa để tìm kiếm bộ sưu tập", - "item.edit.move.success": "Tài liệu đã được di chuyển thành công", - "item.edit.move.title": "Di chuyển tài liệu", - "item.edit.private.cancel": "Hủy", - "item.edit.private.confirm": "Chuyển thành tài liệu cá nhân", - "item.edit.private.description": "Bạn có chắc chắn muốn chuyển tài liệu này thành tài liệu cá nhân trong thư viện số?", - "item.edit.private.error": "Đã có lỗi xảy ra trong khi chuyển tài liệu sang chế độ cá nhân", - "item.edit.private.header": "Chuyển tài liệu: {{ id }} thành tài liệu cá nhân", - "item.edit.private.success": "Tài liệu bây giờ đã trở thành tài liệu cá nhân", - "item.edit.public.cancel": "Hủy", - "item.edit.public.confirm": "Chuyển thành tài liệu công cộng", - "item.edit.public.description": "Bạn có chắc chắn muốn chuyển tài liệu này thành tài liệu công cộng trong thư viện số?", - "item.edit.public.error": "Đã có lỗi xảy ra trong khi chuyển tài liệu sang chế độ công cộng", - "item.edit.public.header": "Chuyển tài liệu: {{ id }} thành tài liệu công cộng", - "item.edit.public.success": "Tài liệu bây giờ đã trở thành tài liệu công cộng", - "item.edit.reinstate.cancel": "Hủy", - "item.edit.reinstate.confirm": "Khôi phục", - "item.edit.reinstate.description": "Bạn có chắc chắn tài liệu này nên được khôi phục trong thư viện số?", - "item.edit.reinstate.error": "Đã có lỗi xảy ra trong khi khôi phục tài liệu này", - "item.edit.reinstate.header": "Khôi phục tài liệu: {{ id }}", - "item.edit.reinstate.success": "Tài liệu này đã được khôi phục thành công", - "item.edit.relationships.discard-button": "Hủy bỏ", - "item.edit.relationships.edit.buttons.add": "Thêm", - "item.edit.relationships.edit.buttons.remove": "Xóa", - "item.edit.relationships.edit.buttons.undo": "Hoàn tác", - "item.edit.relationships.no-entity-type": "Thêm trường dữ liệu 'dspace.entity.type' để kích hoạt các mối quan hệ cho tài liệu này", - "item.edit.relationships.no-relationships": "Không có mối quan hệ nào", - "item.edit.relationships.notifications.discarded.content": "các thay đổi của bạn đã bị hủy bỏ. Để khôi phục các thay đổi này hãy nhấp vào nút 'Hoàn tác'", - "item.edit.relationships.notifications.discarded.title": "Các thay đổi đã bị hủy", - "item.edit.relationships.notifications.failed.title": "Lỗi khi chỉnh sửa mối quan hệ", - "item.edit.relationships.notifications.outdated.content": "Tài liệu bạn đang mở cũng đang được chỉnh sửa bởi một người dùng khác. Vì vậy các thay đổi của bạn đã bị hủy bỏ để tránh xảy ra xung đột.", - "item.edit.relationships.notifications.outdated.title": "Các thay đổi không có hiệu lực", - "item.edit.relationships.notifications.saved.content": "Các thay đổi của bạn đối với các mối quan hệ của tài liệu này đã được lưu lại.", - "item.edit.relationships.notifications.saved.title": "Mối quan hệ đã được lưu lại", - "item.edit.relationships.reinstate-button": "Hoàn tác", - "item.edit.relationships.save-button": "Lưu", - "item.edit.return": "Quay lại", - "item.edit.tabs.bitstreams.head": "Tệp tin", - "item.edit.tabs.bitstreams.title": "Chỉnh sửa tài liệu - Tệp tin", - "item.edit.tabs.curate.head": "Kiểm tra dữ liệu", - "item.edit.tabs.curate.title": "Chỉnh sửa tài liệu - Kiểm tra dữ liệu", - "item.edit.tabs.disabled.tooltip": "Bạn không có quyền truy cập vào tab này", - "item.edit.tabs.item-mapper.title": "Chỉnh sửa tài liệu - Liên kết bộ sưu tập", - "item.edit.tabs.mapper.head": "Liên kết bộ sưu tập", - "item.edit.tabs.metadata.head": "Siêu dữ liệu", - "item.edit.tabs.metadata.title": "Chỉnh sửa tài liệu - Siêu dữ liệu", - "item.edit.tabs.relationships.head": "Mối quan hệ", - "item.edit.tabs.relationships.title": "Chỉnh sửa tài liệu - Mối quan hệ", - "item.edit.tabs.status.buttons.authorizations.button": "Phân quyền tài liệu", - "item.edit.tabs.status.buttons.authorizations.label": "Chỉnh sửa chính sách phân quyền của tài liệu", - "item.edit.tabs.status.buttons.delete.button": "Xóa vĩnh viễn", - "item.edit.tabs.status.buttons.delete.label": "Xóa tài liệu", - "item.edit.tabs.status.buttons.mappedCollections.button": "Bộ sưu tập đã liên kết", - "item.edit.tabs.status.buttons.mappedCollections.label": "Kiểm tra bộ sưu tập đã liên kết", - "item.edit.tabs.status.buttons.move.button": "Di chuyển tài liệu", - "item.edit.tabs.status.buttons.move.label": "Di chuyển tài liệu tới bộ sưu tập khác", - "item.edit.tabs.status.buttons.private.button": "Chuyển thành tài liệu cá nhân", - "item.edit.tabs.status.buttons.private.label": "Chuyển thành tài liệu cá nhân", - "item.edit.tabs.status.buttons.public.button": "Chuyển thành tài liệu công cộng", - "item.edit.tabs.status.buttons.public.label": "Chuyển tài liệu thành công cộng", - "item.edit.tabs.status.buttons.reinstate.button": "Khôi phục", - "item.edit.tabs.status.buttons.reinstate.label": "Khôi phục tài liệu vào kho lưu trữ", - "item.edit.tabs.status.buttons.unauthorized": "Bạn không có quyền thực hiện hành động này", - "item.edit.tabs.status.buttons.withdraw.button": "Ẩn", - "item.edit.tabs.status.buttons.withdraw.label": "Ẩn tài liệu khỏi kho lưu trữ", - "item.edit.tabs.status.description": "Chào mừng bạn đến với trang quản lý tài liệu. Từ đây bạn có thể ẩn khôi phục di chuyển hoặc xóa tài liệu. Bạn cũng có thể cập nhật hoặc nhập thêm trường dữ liệu mới tải thêm tệp tin trên những tab khác.", - "item.edit.tabs.status.head": "Trạng thái", - "item.edit.tabs.status.labels.handle": "Handle", - "item.edit.tabs.status.labels.bundleName": "Bundle name", - "item.edit.tabs.status.labels.id": "ID tài liệu", - "item.edit.tabs.status.labels.itemPage": "Trang tài liệu", - "item.edit.tabs.status.labels.lastModified": "Chỉnh sửa lần cuối", - "item.edit.tabs.status.title": "Chỉnh sửa tài liệu - Trạng thái", - "item.edit.tabs.versionhistory.head": "Lịch sử phiên bản", - "item.edit.tabs.versionhistory.title": "Chỉnh sửa tài liệu - Lịch sử phiên bản", - "item.edit.tabs.versionhistory.under-construction": "Chưa thể chỉnh sửa hoặc tạo thêm phiên bản trên giao diện người dùng này.", - "item.edit.tabs.view.head": "Xem tài liệu", - "item.edit.tabs.view.title": "Chỉnh sửa tài liệu - Xem", - "item.edit.withdraw.cancel": "Hủy", - "item.edit.withdraw.confirm": "Ẩn", - "item.edit.withdraw.description": "Bạn có chắc chắn muốn ẩn tài liệu này khỏi kho lưu trữ?", - "item.edit.withdraw.error": "Đã có lỗi xảy ra trong khi thực hiện ẩn tài liệu này", - "item.edit.withdraw.header": "Ẩn tài liệu: {{ id }}", - "item.edit.withdraw.success": "Tài liệu này đã được ẩn thành công", - "item.listelement.badge": "Tài liệu", - "item.orcid.return": "Quay lại", - "item.page.name": "Tên", - "item.page.abstract": "Tóm tắt", - "item.page.author": "Tác giả", - "item.page.bitstreams.collapse": "Thu hẹp", - "item.page.bitstreams.view-more": "Hiển thị thêm", - "item.page.citation": "Trích dẫn", - "item.page.claim.button": "Nhận nhiệm vụ", - "item.page.claim.tooltip": "Nhận nhiệm vụ tài liệu này", - "item.page.collections": "Bộ sưu tập", - "item.page.collections.loading": "Đang tải…", - "item.page.collections.load-more": "Xem thêm", - "item.page.date": "Năm xuất bản", - "item.page.description": "Mô tả", - "item.page.edit": "Chỉnh sửa tài liệu này", - "item.page.files": "Tệp tin", - "item.page.filesection.description": "Mô tả:", - "item.page.filesection.download": "Tải xuống", - "item.page.filesection.view": "Xem trực tuyến", - "item.page.filesection.format": "Định dạng:", - "item.page.filesection.license.bundle": "Tập tin giấy phép", - "item.page.filesection.name": "Tên:", - "item.page.filesection.original.bundle": "Tập tin chính của tài liệu", - "item.page.filesection.size": "Dung lượng:", - "item.page.journal.search.title": "Bài viết trong tạp chí này", - "item.page.journal-issn": "ISSN", - "item.page.journal-title": "Nhan đề tạp chí", - "item.page.link.full": "Hiển thị chi tiết", - "item.page.link.simple": "Hiển thị đơn giản", - "item.page.orcid.title": "ORCID", - "item.page.orcid.tooltip": "Mở trang cài đặt ORCID", - "item.page.person.search.title": "Bài viết của tác giả này", - "item.page.publisher": "Nhà xuất bản", - "item.page.related-items.view-less": "Ẩn {{ amount }} tài liệu cuối", - "item.page.related-items.view-more": "Hiển thị thêm {{ amount }} tài liệu", - "item.page.relationships.isAuthorOfPublication": "Ấn phẩm", - "item.page.relationships.isJournalOfPublication": "Ấn phẩm", - "item.page.relationships.isOrgUnitOfPerson": "Tác giả", - "item.page.relationships.isOrgUnitOfProject": "Dự án nghiên cứu", - "item.page.return": "Quay lại", - "item.page.subject": "Từ khóa chủ đề", - "item.page.titleprefix": "Tài liệu:", - "item.page.uri": "URL", - "item.page.version.create": "Tạo phiên bản mới", - "item.page.version.hasDraft": "Không thể tạo phiên bản mới vì có một phiên bản đang trong tiến trình tải lên", - "item.page.volume-title": "Nhan đề tập", - "item.preview.dc.contributor.author": "Tác giả:", - "item.preview.dc.coverage.spatial": "Quyền hạn:", - "item.preview.dc.date.issued": "Năm xuất bản:", - "item.preview.dc.description.abstract": "Tóm tắt:", - "item.preview.dc.identifier": "Định danh:", - "item.preview.dc.identifier.doi": "DOI", - "item.preview.dc.identifier.isbn": "ISBN", - "item.preview.dc.identifier.other": "Định danh khác:", - "item.preview.dc.identifier.uri": "Định danh:", - "item.preview.dc.language.iso": "Ngôn ngữ:", - "item.preview.dc.relation.ispartof": "Tạp chí hoặc Ấn phẩm định kỳ", - "item.preview.dc.relation.issn": "ISSN", - "item.preview.dc.subject": "Chủ đề:", - "item.preview.dc.title": "Nhan đề:", - "item.preview.dc.title.alternative": "Viết tắt:", - "item.preview.dc.type": "Loại hình tài liệu:", - "item.preview.oaire.awardNumber": "ID quỹ:", - "item.preview.oaire.citation.issue": "Kỳ ấn phẩm", - "item.preview.oaire.citation.volume": "Tập", - "item.preview.oaire.fundingStream": "Dòng quỹ:", - "item.preview.person.familyName": "Họ:", - "item.preview.person.givenName": "Tên:", - "item.preview.person.identifier.orcid": "ORCID:", - "item.preview.project.funder.identifier": "Định danh nhà tài trợ:", - "item.preview.project.funder.name": "Nhà tài trợ:", - "item.search.results.head": "Kết quả tìm kiếm tài liệu", - "item.search.title": "Tìm kiếm tài liệu", - "item.select.confirm": "Xác nhận cái đã chọn", - "item.select.empty": "Không có tài liệu để hiển thị", - "item.select.table.author": "Tác giả", - "item.select.table.collection": "Bộ sưu tập", - "item.select.table.title": "Nhan đề", - "item.truncatable-part.show-less": "Thu hẹp", - "item.truncatable-part.show-more": "Xem thêm", - "item.version.create.modal.button.cancel": "Hủy", - "item.version.create.modal.button.cancel.tooltip": "Không thể tạo phiên bản mới", - "item.version.create.modal.button.confirm": "Tạo", - "item.version.create.modal.button.confirm.tooltip": "Tạo phiên bản mới", - "item.version.create.modal.form.summary.label": "Thông tin tổng quan", - "item.version.create.modal.form.summary.placeholder": "Thêm thông tin mô tả cho phiên bản mới", - "item.version.create.modal.header": "Phiên bản mới", - "item.version.create.modal.submitted.header": "Tạp phiên bản mới…", - "item.version.create.modal.submitted.text": "Phiên bản mới đang được tạo. Có thể mất một chút thời gian để hoàn tất nếu tài liệu có nhiều mối quan hệ.", - "item.version.create.modal.text": "Tạo phiên bản mới cho tài liệu này", - "item.version.create.modal.text.startingFrom": "bắt đầu từ phiên bản {{version}}", - "item.version.create.notification.failure": "Phiên bản mới chưa được tạo", - "item.version.create.notification.inProgress": "Không thể tạo phiên bản mới vì có một phiên bản đang trong tiến trình tải lên", - "item.version.create.notification.success": "Phiên bản mới đã được tạo với mã số phiên bản là {{version}}", - "item.version.delete.modal.button.cancel": "Hủy", - "item.version.delete.modal.button.cancel.tooltip": "Không xóa phiên bản này", - "item.version.delete.modal.button.confirm": "Xóa", - "item.version.delete.modal.button.confirm.tooltip": "Xóa phiên bản này", - "item.version.delete.modal.header": "Xóa phiên bản", - "item.version.delete.modal.text": "Bạn có muốn xóa phiên bản {{version}}?", - "item.version.delete.notification.failure": "Phiên bản {{version}} chưa bị xóa", - "item.version.delete.notification.success": "Phiên bản {{version}} đã được xóa", - "item.version.edit.notification.failure": "Thông tin tổng quan của phiên bản {{version}} chưa được thay đổi", - "item.version.edit.notification.success": "Thông tin tổng quan của phiên bản {{version}} đã được thay đổi", - "item.version.history.empty": "Chưa có phiên bản nào khác của tài liệu này.", - "item.version.history.head": "Lịch sử phiên bản", - "item.version.history.return": "Quay lại", - "item.version.history.selected": "Phiên bản đã chọn", - "item.version.history.selected.alert": "Hiện tại bạn đang xem phiên bản {{version}} của tài liệu này.", - "item.version.history.table.action.deleteVersion": "Xóa phiên bản", - "item.version.history.table.action.discardSummary": "Hủy chỉnh sửa", - "item.version.history.table.action.editSummary": "Chỉnh sửa thông tin tổng quan", - "item.version.history.table.action.editWorkspaceItem": "Chỉnh sửa biểu ghi đang biên mục", - "item.version.history.table.action.hasDraft": "Không thể tạo phiên bản mới vì có một phiên bản đang trong tiến trình tải lên", - "item.version.history.table.action.newVersion": "Tạo phiên bản mới từ tài liệu này", - "item.version.history.table.action.saveSummary": "Lưu", - "item.version.history.table.actions": "Hành động", - "item.version.history.table.date": "Thời gian xuất bản", - "item.version.history.table.editor": "Người biên tập", - "item.version.history.table.item": "Tài liệu", - "item.version.history.table.summary": "Tóm tắt", - "item.version.history.table.version": "Phiên bản", - "item.version.history.table.workflowItem": "Đang kiểm duyệt", - "item.version.history.table.workspaceItem": "Đang biên mục", - "item.version.notice": "Đây không phải là phiên bản mới nhất của tài liệu này. Phiên bản mới nhất có thể xem tại đây.", - - "itemtemplate.edit.metadata.add-button": "Add", + "401.help": "Bạn không có quyền truy cập trang này. Bạn có thể sử dụng nút chức năng phía dưới để quay lại trang chủ.", + "401.link.home-page": "Đi tới trang chủ", + "401.unauthorized": "không có quyền truy cập", + "403.forbidden": "không được phép truy cập", + "403.help": "Bạn không có quyền truy cập trang này. Bạn có thể sử dụng nút chức năng phía dưới để quay lại trang chủ.", + "403.link.home-page": "Đi tới trang chủ", + "404.help": "Chúng tôi không tìm thấy trang mà bạn đang tìm kiếm. Trang này có thể đã được chuyển tới một địa chỉ khác hoặc đã bị xóa. Bạn có thể sử dụng nút chức năng phía dưới để quay lại trang chủ.", + "404.link.home-page": "Đi tới trang chủ", + "404.page-not-found": "không tìm thấy trang", + "500.help": "Máy chủ tạm thời không thể phục vụ yêu cầu của bạn do đang trong giai đoạn bảo trì hoặc vấn đề về dung lượng. Vui lòng thử lại sau.", + "500.link.home-page": "Đi tới trang chủ", + "500.page-internal-server-error": "Dịch vụ không sẵn sàng", + + "access-status.embargo.listelement.badge": "Ngăn chặn", + "access-status.metadata.only.listelement.badge": "Chỉ siêu dữ liệu", + "access-status.open.access.listelement.badge": "Truy cập mở", + "access-status.restricted.listelement.badge": "Hạn chế", + "access-status.unknown.listelement.badge": "Không xác định", + + "admin.curation-tasks.breadcrumbs": "Thu thập các tác vụ hệ thống", + "admin.curation-tasks.header": "Thu thập các tác vụ hệ thống", + "admin.curation-tasks.title": "Thu thập các tác vụ hệ thống", + + "admin.registries.bitstream-formats.breadcrumbs": "Tạo định dạng", + "admin.registries.bitstream-formats.create.breadcrumbs": "Định dạng tệp tin", + "admin.registries.bitstream-formats.create.failure.content": "Đã xảy ra lỗi khi tạo định dạng tệp tin mới.", + "admin.registries.bitstream-formats.create.failure.head": "Không thành công", + "admin.registries.bitstream-formats.create.head": "Tạo định dạng tệp tin", + "admin.registries.bitstream-formats.create.new": "Thêm một định dạng tệp tin mới", + "admin.registries.bitstream-formats.create.success.content": "Định dạng tệp tin mới đã được tạo thành công.", + "admin.registries.bitstream-formats.create.success.head": "Thành công", + "admin.registries.bitstream-formats.delete.failure.amount": "Loại bỏ không thành công {{ amount }} định dạng", + "admin.registries.bitstream-formats.delete.failure.head": "Không thành công", + "admin.registries.bitstream-formats.delete.success.amount": "Loại bỏ thành công {{ amount }} định dạng", + "admin.registries.bitstream-formats.delete.success.head": "Thành công", + "admin.registries.bitstream-formats.description": "Danh sách các định dạng tệp tin này cung cấp thông tin về các định dạng đã biết và mức hỗ trợ của chúng.", + "admin.registries.bitstream-formats.edit.breadcrumbs": "Định dạng tệp tin", + "admin.registries.bitstream-formats.edit.description.label": "Mô tả", + "admin.registries.bitstream-formats.edit.extensions.hint": "Tiện ích mở rộng là phần mở rộng tệp được sử dụng để tự động xác định định dạng của tệp được tải lên. Bạn có thể nhập một vài phần mở rộng cho mỗi định dạng.", + "admin.registries.bitstream-formats.edit.extensions.label": "Mở rộng tệp", + "admin.registries.bitstream-formats.edit.extensions.placeholder": "Nhập một phần mở rộng tệp không có dấu chấm", + "admin.registries.bitstream-formats.edit.failure.content": "Đã xảy ra lỗi khi chỉnh sửa định dạng tệp tin.", + "admin.registries.bitstream-formats.edit.failure.head": "Không thành công", + "admin.registries.bitstream-formats.edit.head": "Định dạng tệp tin: {{ format }}", + "admin.registries.bitstream-formats.edit.internal.hint": "Các định dạng được đánh dấu là nội bộ sẽ được ẩn đối với người dùng và được sử dụng cho các mục đích quản trị.", + "admin.registries.bitstream-formats.edit.internal.label": "Nội bộ", + "admin.registries.bitstream-formats.edit.mimetype.hint": "Kiểu MIME được liên kết với định dạng này không nhất thiết phải là duy nhất.", + "admin.registries.bitstream-formats.edit.mimetype.label": "Kiểu MIME", + "admin.registries.bitstream-formats.edit.shortDescription.hint": "Một tên duy nhất cho định dạng này (ví dụ: Microsoft Word XP hoặc Microsoft Word 2000)", + "admin.registries.bitstream-formats.edit.shortDescription.label": "Tên", + "admin.registries.bitstream-formats.edit.success.content": "Định dạng tệp tin đã được chỉnh sửa thành công.", + "admin.registries.bitstream-formats.edit.success.head": "Thành công", + "admin.registries.bitstream-formats.edit.supportLevel.hint": "Mức độ hỗ trợ mà đơn vị của bạn cam kết cho định dạng này.", + "admin.registries.bitstream-formats.edit.supportLevel.label": "Mức độ hỗ trợ", + "admin.registries.bitstream-formats.head": "Tạo định dạng tệp tin số", + "admin.registries.bitstream-formats.no-items": "Không có định dạng tệp tin nào để hiển thị.", + "admin.registries.bitstream-formats.table.delete": "Xóa các mục được chọn", + "admin.registries.bitstream-formats.table.deselect-all": "Bỏ chọn tất cả", + "admin.registries.bitstream-formats.table.id": "ID", + "admin.registries.bitstream-formats.table.internal": "nội bộ", + "admin.registries.bitstream-formats.table.mimetype": "Kiểu MIME", + "admin.registries.bitstream-formats.table.name": "Tên", + "admin.registries.bitstream-formats.table.return": "Quay lại", + "admin.registries.bitstream-formats.table.supportLevel.head": "Mức độ hỗ trợ", + "admin.registries.bitstream-formats.table.supportLevel.KNOWN": "Đã xác định", + "admin.registries.bitstream-formats.table.supportLevel.SUPPORTED": "Được hỗ trợ", + "admin.registries.bitstream-formats.table.supportLevel.UNKNOWN": "Không xác định", + "admin.registries.bitstream-formats.title": "Tạo định dạng tệp tin số", + "admin.registries.metadata.breadcrumbs": "Mẫu nhập liệu", + "admin.registries.metadata.description": "Tạo mẫu nhập liệu cho phép duy trì danh sách tất cả các trường thông tin mô tả có sẵn trong hệ thống. Các trường này có thể được phân ra cho nhiều lược đồ. Tuy nhiên DSpace yêu cầu đủ điều kiện cho lược đồ Dublin Core.", + "admin.registries.metadata.form.create": "Tạo lược đồ thông tin mô tả", + "admin.registries.metadata.form.edit": "Chỉnh sửa lược đồ thông tin mô tả", + "admin.registries.metadata.form.name": "Tên", + "admin.registries.metadata.form.namespace": "Tên miền", + "admin.registries.metadata.head": "Tạo mẫu nhập liệu", + "admin.registries.metadata.schemas.no-items": "Không có lược đồ thông tin mô tả nào để hiển thị.", + "admin.registries.metadata.schemas.table.delete": "Xóa các mục đã chọn", + "admin.registries.metadata.schemas.table.id": "ID", + "admin.registries.metadata.schemas.table.name": "Tên", + "admin.registries.metadata.schemas.table.namespace": "Tên miền", + "admin.registries.metadata.title": "Tạo mẫu nhập liệu", + "admin.registries.schema.breadcrumbs": "Lược đồ thông tin mô tả", + "admin.registries.schema.description": "Đây là lược đồ thông tin mô tả cho \"{{namespace}}\".", + "admin.registries.schema.fields.head": "Lược đồ các trường thông tin mô tả", + "admin.registries.schema.fields.no-items": "Không có trường thông tin mô tả nào để hiển thị.", + "admin.registries.schema.fields.table.delete": "Xóa các mục đã lựa chọn", + "admin.registries.schema.fields.table.field": "Trường", + "admin.registries.schema.fields.table.id": "ID", + "admin.registries.schema.fields.table.scopenote": "Ghi chú phạm vi", + "admin.registries.schema.form.create": "Tạo trường thông tin mô tả", + "admin.registries.schema.form.edit": "Chỉnh sửa trường thông tin mô tả", + "admin.registries.schema.form.element": "Yếu tố", + "admin.registries.schema.form.qualifier": "Đối tượng bổ trợ", + "admin.registries.schema.form.scopenote": "Ghi chú phạm vi", + "admin.registries.schema.head": "Lược đồ thông tin mô tả", + "admin.registries.schema.notification.created": "Tạo thành công lược đồ thông tin mô tả \"{{prefix}}\"", + "admin.registries.schema.notification.deleted.failure": "Xóa không thành công {{amount}} lược đồ thông tin mô tả", + "admin.registries.schema.notification.deleted.success": "Đã xóa thành công {{amount}} lược đồ thông tin mô tả", + "admin.registries.schema.notification.edited": "Chỉnh sửa thành công lược đồ thông tin mô tả \"{{prefix}}\"", + "admin.registries.schema.notification.failure": "Lỗi", + "admin.registries.schema.notification.field.created": "Tạo thành công trường thông tin mô tả \"{{field}}\"", + "admin.registries.schema.notification.field.deleted.failure": "Xóa không thành công {{amount}} trường thông tin mô tả", + "admin.registries.schema.notification.field.deleted.success": "Đã xóa thành công {{amount}} trường thông tin mô tả", + "admin.registries.schema.notification.field.edited": "Chỉnh sửa thành công trường thông tin mô tả \"{{field}}\"", + "admin.registries.schema.notification.success": "Thành công", + "admin.registries.schema.return": "Quay lại", + "admin.registries.schema.title": "Tạo lược đồ thông tin mô tả", + + "admin.access-control.epeople.actions.delete": "Xóa người dùng", + "admin.access-control.epeople.actions.impersonate": "Mạo danh người dùng", + "admin.access-control.epeople.actions.reset": "Cài lại mật khẩu", + "admin.access-control.epeople.actions.stop-impersonating": "Dừng mạo danh người dùng", + "admin.access-control.epeople.breadcrumbs": "Người dùng", + "admin.access-control.epeople.button.add": "Thêm người dùng", + "admin.access-control.epeople.button.see-all": "Duyệt toàn bộ", + "admin.access-control.epeople.form.canLogIn": "Có thể đăng nhập", + "admin.access-control.epeople.form.create": "Tạo người dùng", + "admin.access-control.epeople.form.edit": "Chỉnh sửa người dùng", + "admin.access-control.epeople.form.email": "E-mail", + "admin.access-control.epeople.form.emailHint": "Phải là địa chỉ e-mail hợp lệ", + "admin.access-control.epeople.form.firstName": "Tên", + "admin.access-control.epeople.form.goToGroups": "Thêm vào nhóm", + "admin.access-control.epeople.form.groupsEPersonIsMemberOf": "Thành viên của các nhóm:", + "admin.access-control.epeople.form.lastName": "Họ", + "admin.access-control.epeople.form.memberOfNoGroups": "Người dùng không là thành viên của bất kỳ nhóm nào", + "admin.access-control.epeople.form.notification.created.failure": "Tạo không thành công người dùng \"{{name}}\"", + "admin.access-control.epeople.form.notification.created.failure.emailInUse": "Tạo không thành công người dùng \"{{name}}\" email \"{{email}}\" đã được sử dụng.", + "admin.access-control.epeople.form.notification.created.success": "Tạo thành công người dùng \"{{name}}\"", + "admin.access-control.epeople.form.notification.deleted.failure": "Xóa không thành công người dùng \"{{name}}\"", + "admin.access-control.epeople.form.notification.deleted.success": "Xóa thành công người dùng \"{{name}}\"", + "admin.access-control.epeople.form.notification.edited.failure": "Chỉnh sửa không thành công người dùng \"{{name}}\"", + "admin.access-control.epeople.form.notification.edited.failure.emailInUse": "Chỉnh sửa không thành công người dùng \"{{name}}\" email \"{{email}}\" đã được sử dụng.", + "admin.access-control.epeople.form.notification.edited.success": "Chỉnh sửa thành công người dùng \"{{name}}\"", + "admin.access-control.epeople.form.requireCertificate": "Khóa tài khoản", + "admin.access-control.epeople.form.return": "Quay lại", + "admin.access-control.epeople.form.table.collectionOrCommunity": "Đơn vị\/ Bộ sưu tập", + "admin.access-control.epeople.form.table.id": "ID", + "admin.access-control.epeople.form.table.name": "Tên", + "admin.access-control.epeople.head": "Người dùng", + "admin.access-control.epeople.no-items": "Không có người dùng nào để hiển thị.", + "admin.access-control.epeople.notification.deleted.failure": "Xóa không thành công người dùng: \"{{name}}\"", + "admin.access-control.epeople.notification.deleted.success": "Xóa thành công người dùng: \"{{name}}\"", + "admin.access-control.epeople.notification.resetpassword.success": "Thiết lập lại mật khẩu thành công cho người dùng: \"{{name}}\"", + "admin.access-control.epeople.search.button": "Tìm kiếm", + "admin.access-control.epeople.search.head": "Tìm kiếm", + "admin.access-control.epeople.search.placeholder": "Tìm kiếm người dùng...", + "admin.access-control.epeople.search.scope.email": "E-mail (chính xác)", + "admin.access-control.epeople.search.scope.metadata": "Siêu dữ liệu", + "admin.access-control.epeople.table.edit": "Chỉnh sửa", + "admin.access-control.epeople.table.edit.buttons.edit": "Chỉnh sửa \"{{name}}\"", + "admin.access-control.epeople.table.edit.buttons.edit-disabled": "Bạn không có quyền chỉnh sửa nhóm này", + "admin.access-control.epeople.table.edit.buttons.remove": "Xóa \"{{name}}\"", + "admin.access-control.epeople.table.email": "E-mail (chính xác)", + "admin.access-control.epeople.table.id": "ID", + "admin.access-control.epeople.table.name": "Tên", + "admin.access-control.epeople.title": "Người dùng", + "admin.access-control.groups.addGroup.breadcrumbs": "Tạo nhóm người dùng", + "admin.access-control.groups.breadcrumbs": "Nhóm người dùng", + "admin.access-control.groups.button.add": "Thêm nhóm người dùng", + "admin.access-control.groups.button.see-all": "Duyệt toàn bộ", + "admin.access-control.groups.form.actions.delete": "Xóa nhóm người dùng", + "admin.access-control.groups.form.alert.permanent": "Nhóm này là cố định vì vậy nó không thể bị chỉnh sửa hoặc xóa. Bạn vẫn có thể thêm và loại bỏ thành viên trong nhóm tại trang này.", + "admin.access-control.groups.form.alert.workflowGroup": "Không thể chỉnh sửa hoặc xóa nhóm này vì nó tương ứng với một vai trò trong quá trình gửi và quy trình xử lý trong \"{{name}}\" {{comcol}}. Bạn có thể xóa nó từ thẻ assign roles<\/a> trên trang chỉnh sửa {{comcol}}. Bạn vẫn có thể thêm và loại bỏ thành viên nhóm bằng trang này.\"", + "admin.access-control.groups.form.delete-group.modal.cancel": "Hủy", + "admin.access-control.groups.form.delete-group.modal.confirm": "Xóa", + "admin.access-control.groups.form.delete-group.modal.header": "Xóa nhóm người dùng \"{{ dsoName }}\"", + "admin.access-control.groups.form.delete-group.modal.info": "Bạn có chắc chắn rằng bạn muốn xóa nhóm người dùng \"{{ dsoName }}\"", + "admin.access-control.groups.form.groupCommunity": "Đơn vị hoặc Bộ sưu tập", + "admin.access-control.groups.form.groupDescription": "Mô tả", + "admin.access-control.groups.form.groupName": "Tên nhóm người dùng", + "admin.access-control.groups.form.head.create": "Tạo nhóm người dùng", + "admin.access-control.groups.form.head.edit": "Chỉnh sửa nhóm người dùng", + "admin.access-control.groups.form.members-list.button.see-all": "Duyệt toàn bộ", + "admin.access-control.groups.form.members-list.head": "Người dùng", + "admin.access-control.groups.form.members-list.headMembers": "Các thành viên hiện tại", + "admin.access-control.groups.form.members-list.no-items": "Không người dùng nào được tìm thấy trong tìm kiếm", + "admin.access-control.groups.form.members-list.no-members-yet": "Chưa có thành viên trong nhóm tìm kiếm và thêm thành viên vào nhóm.", + "admin.access-control.groups.form.members-list.notification.failure.addMember": "Thêm không thành công thành viên: \"{{name}}\"", + "admin.access-control.groups.form.members-list.notification.failure.deleteMember": "Xóa không thành công thành viên: \"{{name}}\"", + "admin.access-control.groups.form.members-list.notification.failure.noActiveGroup": "Hiện tại không có nhóm hoạt động gửi một tên trước.", + "admin.access-control.groups.form.members-list.notification.success.addMember": "Thêm thành công thành viên: \"{{name}}\"", + "admin.access-control.groups.form.members-list.notification.success.deleteMember": "Xóa thành công thành viên: \"{{name}}\"", + "admin.access-control.groups.form.members-list.search.button": "Tìm kiếm", + "admin.access-control.groups.form.members-list.search.head": "Thêm người dùng", + "admin.access-control.groups.form.members-list.search.scope.email": "E-mail (chính xác)", + "admin.access-control.groups.form.members-list.search.scope.metadata": "Siêu dữ liệu", + "admin.access-control.groups.form.members-list.table.edit": "Loại bỏ \/ Thêm", + "admin.access-control.groups.form.members-list.table.edit.buttons.add": "Thêm thành viên với tên \"{{name}}\"", + "admin.access-control.groups.form.members-list.table.edit.buttons.remove": "Loại bỏ thành viên với tên \"{{name}}\"", + "admin.access-control.groups.form.members-list.table.email": "Email", + "admin.access-control.groups.form.members-list.table.id": "ID", + "admin.access-control.groups.form.members-list.table.identity": "Định danh", + "admin.access-control.groups.form.members-list.table.name": "Tên", + "admin.access-control.groups.form.members-list.table.netid": "NetID", + "admin.access-control.groups.form.notification.created.failure": "Tạo không thành công nhóm người dùng \"{{name}}\"", + "admin.access-control.groups.form.notification.created.failure.groupNameInUse": "Tạo không thành công nhóm người dùng với tên: \"{{name}}\" đảm bảo tên này chưa được sử dụng\"", + "admin.access-control.groups.form.notification.created.success": "Tạo thành công nhóm người dùng \"{{name}}\"", + "admin.access-control.groups.form.notification.deleted.failure.content": "Nguyên nhân: \"{{ cause }}\"", + "admin.access-control.groups.form.notification.deleted.failure.title": "Xóa không thành công nhóm người dùng \"{{ name }}\"", + "admin.access-control.groups.form.notification.deleted.success": "Xóa thành công nhóm người dùng \"{{ name }}\"", + "admin.access-control.groups.form.notification.edited.failure": "Chỉnh sửa không thành công nhóm người dùng \"{{name}}\"", + "admin.access-control.groups.form.notification.edited.failure.groupNameInUse": "Tên \"{{name}}\" đã được sử dụng!\"", + "admin.access-control.groups.form.notification.edited.success": "Chỉnh sửa thành công nhóm người dùng \"{{name}}\"", + "admin.access-control.groups.form.return": "Quay lại", + "admin.access-control.groups.form.subgroups-list.button.see-all": "Duyệt toàn bộ", + "admin.access-control.groups.form.subgroups-list.head": "Nhóm người dùng", + "admin.access-control.groups.form.subgroups-list.headSubgroups": "Nhóm người dùng con hiện tại", + "admin.access-control.groups.form.subgroups-list.no-items": "Không tìm thấy nhóm nào có tên hoặc UUID như vậy", + "admin.access-control.groups.form.subgroups-list.no-subgroups-yet": "Chưa có nhóm người dùng con nào trong nhóm.", + "admin.access-control.groups.form.subgroups-list.notification.failure": "Đã xảy ra sự cố: \"{{cause}}\"", + "admin.access-control.groups.form.subgroups-list.notification.failure.addSubgroup": "Thêm không thành công nhóm người dùng con: \"{{name}}\"", + "admin.access-control.groups.form.subgroups-list.notification.failure.deleteSubgroup": "Xóa không thành công nhóm người dùng con: \"{{name}}\"", + "admin.access-control.groups.form.subgroups-list.notification.failure.noActiveGroup": "Hiện tại không có nhóm hoạt động gửi một tên trước.", + "admin.access-control.groups.form.subgroups-list.notification.failure.subgroupToAddIsActiveGroup": "Đây là nhóm hiện tại không thể thêm được.", + "admin.access-control.groups.form.subgroups-list.notification.success.addSubgroup": "Thêm thành công nhóm người dùng con: \"{{name}}\"", + "admin.access-control.groups.form.subgroups-list.notification.success.deleteSubgroup": "Loại bỏ thành công nhóm người dùng: \"{{name}}\" ra khỏi nhóm", + "admin.access-control.groups.form.subgroups-list.search.button": "Tìm kiếm", + "admin.access-control.groups.form.subgroups-list.search.head": "Thêm nhóm người dùng con", + "admin.access-control.groups.form.subgroups-list.table.collectionOrCommunity": "Đơn vị\/ Bộ sưu tập", + "admin.access-control.groups.form.subgroups-list.table.edit": "Loại bỏ \/ Thêm", + "admin.access-control.groups.form.subgroups-list.table.edit.buttons.add": "Thêm nhóm người dùng con với tên \"{{name}}\"", + "admin.access-control.groups.form.subgroups-list.table.edit.buttons.remove": "Loại bỏ nhóm người dùng con với tên \"{{name}}\"", + "admin.access-control.groups.form.subgroups-list.table.edit.currentGroup": "Nhóm người dùng hiện tại", + "admin.access-control.groups.form.subgroups-list.table.id": "ID", + "admin.access-control.groups.form.subgroups-list.table.name": "Tên", + "admin.access-control.groups.head": "Nhóm người dùng", + "admin.access-control.groups.no-items": "Không tìm thấy nhóm nào có tên hoặc UUID như vậy", + "admin.access-control.groups.notification.deleted.failure.content": "Nguyên nhân: \"{{cause}}\"", + "admin.access-control.groups.notification.deleted.failure.title": "Xóa không thành công nhóm \"{{name}}\"", + "admin.access-control.groups.notification.deleted.success": "Xóa thành công nhóm \"{{name}}\"", + "admin.access-control.groups.search.button": "Tìm kiếm", + "admin.access-control.groups.search.head": "Tìm kiếm nhóm người dùng", + "admin.access-control.groups.search.placeholder": "Tìm kiếm nhóm người dùng...", + "admin.access-control.groups.singleGroup.breadcrumbs": "Chỉnh sửa nhóm người dùng", + "admin.access-control.groups.table.collectionOrCommunity": "Đơn vị\/ Bộ sưu tập", + "admin.access-control.groups.table.edit": "Chỉnh sửa", + "admin.access-control.groups.table.edit.buttons.edit": "Chỉnh sửa \"{{name}}\"", + "admin.access-control.groups.table.edit.buttons.remove": "Xóa \"{{name}}\"", + "admin.access-control.groups.table.id": "ID", + "admin.access-control.groups.table.members": "Thành viên", + "admin.access-control.groups.table.name": "Tên", + "admin.access-control.groups.title": "Nhóm người dùng", + "admin.access-control.groups.title.addGroup": "Tạo nhóm người dùng", + "admin.access-control.groups.title.singleGroup": "Chỉnh sửa nhóm người dùng", + + "admin.search.breadcrumbs": "Tìm kiếm quản trị", + "admin.search.collection.edit": "Chỉnh sửa", + "admin.search.community.edit": "Chỉnh sửa", + "admin.search.item.delete": "Xóa", + "admin.search.item.edit": "Chỉnh sửa", + "admin.search.item.make-private": "Đặt làm tài liệu cá nhân", + "admin.search.item.make-public": "Đặt làm tài liệu công cộng", + "admin.search.item.move": "Di chuyển", + "admin.search.item.reinstate": "Khôi phục", + "admin.search.item.withdraw": "Ẩn", + "admin.search.title": "Tìm kiếm quản trị", + + "administrativeView.search.results.head": "Tìm kiếm quản trị", + + "admin.workflow.breadcrumbs": "Quản trị luồng công việc", + "admin.workflow.title": "Quản trị luồng công việc", + "admin.workflow.item.workflow": "Luồng công việc", + "admin.workflow.item.workspace": "Workspace", + "admin.workflow.item.delete": "Xóa", + "admin.workflow.item.send-back": "Gửi trở lại", + "admin.workflow.item.policies": "Policies", + "admin.workflow.item.supervision": "Supervision", + + "admin.batch-import.breadcrumbs": "Nhập dữ liệu theo lô", + "admin.batch-import.page.dropMsg": "Kéo thả file ZIP để nhập vào", + "admin.batch-import.page.dropMsgReplace": "Kéo thả để thay thế file ZIP cần nhập vào", + "admin.batch-import.page.error.addFile": "Chọn file Zip đầu tiên!", + "admin.batch-import.page.header": "Nhập dữ liệu theo lô", + "admin.batch-import.page.help": "Chọn Bộ sưu tập để nhập dữ liệu. Sau đó kéo thả hoặc duyệt tới tệp tin định dạng zip có chứa các tài liệu cần nhập vào.", + "admin.batch-import.page.remove": "xóa", + "admin.batch-import.title": "Nhập dữ liệu theo lô", + "admin.batch-import.page.validateOnly.hint": "Nếu chọn tùy chọn \"Kiểm tra file ZIP tải lên\", hệ thống sẽ chạy một tiến trình kiểm tra việc nhập dữ liệu theo lô thay vì đổ trực tiếp dữ liệu lên hệ thống. Việc này giúp cán bộ xác nhận lại kết quả của quy trình nhập trước khi nhập dữ liệu chính thức. Bỏ chọn tùy chọn này để đổ lô tài liệu lên hệ thống.", + + "admin.metadata-import.breadcrumbs": "Nhập thông tin mô tả", + "admin.metadata-import.page.button.proceed": "Tiếp tục", + "admin.metadata-import.page.button.return": "Quay lại", + "admin.metadata-import.page.button.select-collection": "Chọn Bộ sưu tập", + "admin.metadata-import.page.dropMsg": "Thả một tệp CSV để nhập thông tin mô tả", + "admin.metadata-import.page.dropMsgReplace": "Thả một tệp CSV để nhập thông tin mô tả thay thế", + "admin.metadata-import.page.error.addFile": "Lựa chọn tệp trước!", + "admin.metadata-import.page.header": "Nhập thông tin mô tả", + "admin.metadata-import.page.help": "Bạn có thể thả hoặc duyệt tới tệp CSV chứa hàng loạt các thông tin mô tả tại đây", + "admin.metadata-import.page.validateOnly": "Kiểm tra nhập lô siêu dữ liệu", + "admin.metadata-import.page.validateOnly.hint": "Nếu chọn tùy chọn \"Kiểm tra nhập lô siêu dữ liệu\", hệ thống sẽ chạy một tiến trình kiểm tra nhập lô siêu dữ liệu thay vì đổ trực tiếp dữ liệu lên hệ thống. Bỏ chọn tùy chọn này để tiến hành nhập dữ liệu chính thức.", + "admin.metadata-import.title": "Nhập thông tin mô tả", + + "advanced-workflow-action.rating.form.rating.label": "Xếp hạng", + "advanced-workflow-action.rating.form.rating.error": "Bạn phải đánh giá tài liệu/ thực thế này", + "advanced-workflow-action.rating.form.review.label": "Kiểm duyệt", + "advanced-workflow-action.rating.form.review.error": "Bạn phải nhập nội dung đánh giá để gửi bản xếp hạng này", + "advanced-workflow-action.rating.description": "Vui lòng chọn một xếp hạng bên dưới", + "advanced-workflow-action.rating.description-requiredDescription": "Vui lòng chọn xếp hạng bên dưới và thêm đánh giá", + "advanced-workflow-action.select-reviewer.description-single": "Vui lòng chọn một người kiểm duyệt dưới đây trước khi tải tài liệu lên", + "advanced-workflow-action.select-reviewer.description-multiple": "Vui lòng chọn một hoặc nhiều người kiểm duyệt dưới đây trước khi tải tài liệu lên", + "advanced-workflow-action-select-reviewer.groups.form.reviewers-list.head": "Người dùng", + "advanced-workflow-action-select-reviewer.groups.form.reviewers-list.search.head": "Thêm người dùng", + "advanced-workflow-action-select-reviewer.groups.form.reviewers-list.button.see-all": "Duyệt tất cả", + "advanced-workflow-action-select-reviewer.groups.form.reviewers-list.headMembers": "Các thành viên hiện tại", + "advanced-workflow-action-select-reviewer.groups.form.reviewers-list.search.scope.metadata": "Siêu dữ liệu", + "advanced-workflow-action-select-reviewer.groups.form.reviewers-list.search.scope.email": "E-mail (exact)", + "advanced-workflow-action-select-reviewer.groups.form.reviewers-list.search.button": "Tìm kiếm", + "advanced-workflow-action-select-reviewer.groups.form.reviewers-list.table.id": "ID", + "advanced-workflow-action-select-reviewer.groups.form.reviewers-list.table.name": "Name", + "advanced-workflow-action-select-reviewer.groups.form.reviewers-list.table.identity": "Identity", + "advanced-workflow-action-select-reviewer.groups.form.reviewers-list.table.email": "Email", + "advanced-workflow-action-select-reviewer.groups.form.reviewers-list.table.netid": "NetID", + "advanced-workflow-action-select-reviewer.groups.form.reviewers-list.table.edit": "Loại bỏ / Thêm", + "advanced-workflow-action-select-reviewer.groups.form.reviewers-list.table.edit.buttons.remove": "Loại bỏ người dùng \"{{name}}\"", + "advanced-workflow-action-select-reviewer.groups.form.reviewers-list.notification.success.addMember": "Thêm thành công thành viên: \"{{name}}\"", + "advanced-workflow-action-select-reviewer.groups.form.reviewers-list.notification.failure.addMember": "Không thể thêm thành viên: \"{{name}}\"", + "advanced-workflow-action-select-reviewer.groups.form.reviewers-list.notification.success.deleteMember": "Xóa thành công thành viên: \"{{name}}\"", + "advanced-workflow-action-select-reviewer.groups.form.reviewers-list.notification.failure.deleteMember": "Không thể xóa thành viên: \"{{name}}\"", + "advanced-workflow-action-select-reviewer.groups.form.reviewers-list.table.edit.buttons.add": "Thêm thành viên \"{{name}}\"", + "advanced-workflow-action-select-reviewer.groups.form.reviewers-list.notification.failure.noActiveGroup": "Không có nhóm hoạt động, gửi tên trước.", + "advanced-workflow-action-select-reviewer.groups.form.reviewers-list.no-members-yet": "Chưa có thành viên nào trong nhóm, tìm kiếm để thêm.", + "advanced-workflow-action-select-reviewer.groups.form.reviewers-list.no-items": "Không tìm thấy người dùng", + "advanced-workflow-action.select-reviewer.no-reviewer-selected.error": "Không có người kiểm duyệt nào được chọn.", + + "auth.errors.invalid-user": "Địa chỉ email hoặc mật khẩu không hợp lệ.", + + "auth.messages.expired": "Phiên của bạn đã hết hạn. Xin vui lòng đăng nhập lại.", + "auth.messages.token-refresh-failed": "Làm mới mã token phiên làm việc của bạn không thành công. Vui lòng đăng nhập lại.", + + "bitstream.download.page": "Đang tải xuống {{bitstream}}... ", + "bitstream.download.page.back": "Quay lại", + + "bitstream.edit.authorizations.link": "Chỉnh sửa chính sách của tệp tin", + "bitstream.edit.authorizations.title": "Chỉnh sửa chính sách của tệp tin", + "bitstream.edit.bitstream": "Tệp tin:", + "bitstream.edit.form.description.hint": "Tùy chọn cung cấp mô tả ngắn gọn về tệp ví dụ \"Bài báo chính\" or \"Dữ liệu đọc thử nghiệm\".", + "bitstream.edit.form.description.label": "Mô tả", + "bitstream.edit.form.embargo.hint": "Ngày đầu tiên được phép truy cập. Ngày này không thể được chỉnh sửa trên biểu mẫu này. Để thiết lập một ngày ngừng phục vụ tệp tin này đi tới thẻ Trạng thái tài liệu nhấp Phân quyền... tạo hoặc chỉnh sửa quyền ĐỌC của tệp tin và thiết lập Ngày bắt đầu như mong muốn.", + "bitstream.edit.form.embargo.label": "Ngừng phục vụ cho tới ngày", + "bitstream.edit.form.fileName.hint": "Thay đổi tên tệp cho tệp tin. Lưu ý rằng điều này sẽ thay đổi hiển thị URL tệp tin nhưng các liên kết cũ sẽ vẫn phân giải miễn là ID trình tự không thay đổi.", + "bitstream.edit.form.fileName.label": "Tên tệp", + "bitstream.edit.form.iiifHeight.hint": "Chiều cao của khung thường phải khớp với chiều cao của hình ảnh", + "bitstream.edit.form.iiifHeight.label": "Chiều cao ảnh", + "bitstream.edit.form.iiifLabel.hint": "Tên cho hình ảnh này. Nếu không được cung cấp tên mặc định sẽ được sử dụng.", + "bitstream.edit.form.iiifLabel.label": "Tên", + "bitstream.edit.form.iiifToc.hint": "Thêm mục lục mới", + "bitstream.edit.form.iiifToc.label": "Mục lục", + "bitstream.edit.form.iiifWidth.hint": "Chiều rộng của khung thường phải khớp với chiều rộng của hình", + "bitstream.edit.form.iiifWidth.label": "Chiều rộng khung", + "bitstream.edit.form.newFormat.hint": "Ứng dụng bạn đã sử dụng để tạo tệp và thông tin phiên bản (ví dụ \"ACMESoft SuperApp phiên bản 1.5\").", + "bitstream.edit.form.newFormat.label": "Mô tả định dạng mới", + "bitstream.edit.form.primaryBitstream.label": "Tệp tin chính", + "bitstream.edit.form.selectedFormat.hint": "Nếu định dạng không có trong danh sách trên chọn \"định dạng không có trong danh sách\" trên và mô tả nó dưới mục\"Mô tả định dạng mới\".", + "bitstream.edit.form.selectedFormat.label": "Định dạng đã chọn", + "bitstream.edit.form.selectedFormat.unknown": "Định dạng không có trong danh sách", + "bitstream.edit.notifications.error.format.title": "Đã xảy ra lỗi khi lưu định dạng của tệp tin", + "bitstream.edit.notifications.saved.content": "Thay đổi của bạn đối với tệp tin đã được lưu.", + "bitstream.edit.notifications.saved.title": "Đã lưu tệp tin", + "bitstream.edit.return": "Quay lại", + "bitstream.edit.title": "Chỉnh sửa tệp tin", + + "bitstream-request-a-copy.alert.canDownload1": "Bạn đã có quyền truy cập tệp tin này. Nếu muốn tải tệp tin click ", + "bitstream-request-a-copy.alert.canDownload2": "vào đây", + "bitstream-request-a-copy.allfiles.label": "Các tệp tin", + "bitstream-request-a-copy.email.error": "Vui lòng nhập một địa chỉ email hợp lệ.", + "bitstream-request-a-copy.email.hint": "Địa chỉ email này đã được sử dụng để gửi tệp tin.", + "bitstream-request-a-copy.email.label": "Địa chỉ email của bạn *", + "bitstream-request-a-copy.files-all-false.label": "Chỉ tệp tin được yêu cầu", + "bitstream-request-a-copy.files-all-true.label": "Tất cả tệp tin của tài liệu này đều bị hạn chế quyền truy cập", + "bitstream-request-a-copy.header": "Yêu cầu bản sao", + "bitstream-request-a-copy.intro": "Nhập các thông tin dưới đây để yêu cầu bản sao của tài liệu:", + "bitstream-request-a-copy.intro.bitstream.all": "Yêu cầu tất cả các tệp tin.", + "bitstream-request-a-copy.intro.bitstream.one": "Yêu cầu các tệp tin sau:", + "bitstream-request-a-copy.message.label": "Tin nhắn", + "bitstream-request-a-copy.name.error": "Tên là bắt buộc", + "bitstream-request-a-copy.name.label": "Tên*", + "bitstream-request-a-copy.return": "Quay lại", + "bitstream-request-a-copy.submit": "Yêu cầu bản sao", + "bitstream-request-a-copy.submit.error": "Đã xảy ra lỗi trong quá trình gửi yêu cầu tài liệu.", + "bitstream-request-a-copy.submit.success": "Yêu cầu tài liệu đã được gửi thành công.", + + "browse.back.all-results": "Tất cả kết quả", + + "browse.comcol.by.author": "Tác giả", + "browse.comcol.by.dateissued": "Năm xuất bản", + "browse.comcol.by.subject": "Chủ đề", + "browse.comcol.by.title": "Nhan đề", + "browse.comcol.head": "Duyệt", + + "browse.empty": "Không có tài liệu nào để hiển thị.", + + "browse.metadata.author": "Tác giả", + "browse.metadata.author.breadcrumbs": "Duyệt theo tác giả", + "browse.metadata.dateissued": "Năm xuất bản", + "browse.metadata.dateissued.breadcrumbs": "Duyệt theo năm xuất bản", + "browse.metadata.subject": "Chủ đề", + "browse.metadata.subject.breadcrumbs": "Duyệt theo chủ đề", + "browse.metadata.title": "Nhan đề", + "browse.metadata.title.breadcrumbs": "Duyệt theo nhan đề", + "browse.metadata.topic": "Topic", + "browse.metadata.type": "Kiểu tài liệu", + + "pagination.next.button": "Tiếp theo", + "pagination.previous.button": "Quay lại", + "pagination.next.button.disabled.tooltip": "Không còn trang kết quả khác", + + "browse.startsWith.choose_year.label": "Chọn năm xuất bản", + "browse.startsWith.choose_year": "(Năm)", + "browse.startsWith.jump": "Chuyển tới một điểm trong chỉ mục:", + "browse.startsWith.months.april": "Tháng Tư", + "browse.startsWith.months.august": "Tháng Tám", + "browse.startsWith.months.december": "Tháng Mười hai", + "browse.startsWith.months.february": "Tháng Hai", + "browse.startsWith.months.january": "Tháng Một", + "browse.startsWith.months.july": "Tháng Bảy", + "browse.startsWith.months.june": "Tháng Sáu", + "browse.startsWith.months.march": "Tháng Ba", + "browse.startsWith.months.may": "Tháng Năm", + "browse.startsWith.months.none.label": "Chọn tháng xuất bản", + "browse.startsWith.months.none": "(Tháng)", + "browse.startsWith.months.november": "Tháng Mười một", + "browse.startsWith.months.october": "Tháng Mười", + "browse.startsWith.months.september": "Tháng Chín", + "browse.startsWith.submit": "Duyệt", + "browse.startsWith.type_date": "Hoặc nhập một ngày (năm-tháng) và nhấp \"Duyệt\"", + "browse.startsWith.type_date.label": "Hoặc nhập một ngày (năm-tháng) à nhấp Duyệt", + "browse.startsWith.type_text": "Nhập một vài ký tự đầu tiên và nhấp vào nút Duyệt", + + "browse.title": "Duyệt {{ collection }} theo {{ field }}{{ startsWith }} {{ value }}", + "browse.title.page": "Duyệt {{ collection }} theo {{ field }} {{ value }}", + + "search.browse.item-back": "Quay lại kết quả tìm kiếm", + + "chips.remove": "Loại bỏ chip", + + "claimed-approved-search-result-list-element.title": "Chấp nhận", + "claimed-declined-search-result-list-element.title": "Đã bị từ chối, đã gửi lại cho người nhập liệu", + "claimed-declined-task-search-result-list-element.title": "Bị từ chối, đã gửi lại tới người quản lý kiểm duyệt", + + "collection.create.head": "Tạo một Bộ sưu tập", + "collection.create.notifications.success": "Tạo bộ sưu tập thành công", + "collection.create.sub-head": "Tạo một bộ sưu tập cho đơnn vị {{ parent }}", + "collection.curate.header": "Kiểm tra bộ sưu tập: {{collection}}", + "collection.delete.cancel": "Hủy", + "collection.delete.confirm": "Xác nhận", + "collection.delete.head": "Xóa bộ sưu tập", + "collection.delete.notification.fail": "Không thể xóa bộ sưu tập", + "collection.delete.notification.success": "Xóa bộ sưu tập thành công", + "collection.delete.processing": "Đang xóa", + "collection.delete.text": "Bạn có chắc chắn rằng bạn muốn xóa bộ sưu tập \"{{ dso }}\"", + "collection.edit.breadcrumbs": "Chỉnh sửa bộ sưu tập", + "collection.edit.delete": "Xóa bộ sưu tập này", + "collection.edit.head": "Chỉnh sửa bộ sưu tập", + "collection.edit.item.authorizations.load-bundle-button": "Hiển thị thêm các nhóm khác", + "collection.edit.item.authorizations.load-more-button": "Hiển thị thêm", + "collection.edit.item.authorizations.show-bitstreams-button": "Hiển thị chính sách phân quyền tệp tin đối với nhóm", + "collection.edit.item-mapper.cancel": "Hủy", + "collection.edit.item-mapper.collection": "Bộ sưu tập: \"{{name}}\"", + "collection.edit.item-mapper.confirm": "Ánh xạ những tài liệu đã chọn", + "collection.edit.item-mapper.description": "Đây là công cụ liên kết tài liệu cho phép người quản trị bộ sưu tập liên kết các tài liệu từ các bộ sưu tập khác vào bộ sưu tập này. Bạn có thể tìm kiếm các tài liệu từ các bộ sưu tập khác và liên kết chúng hoặc duyệt qua danh sách các tài liệu hiện đã được liên kết.", + "collection.edit.item-mapper.head": "Liên kết tài liệu - Liên kết tài liệu tới bộ sưu tập khác", + "collection.edit.item-mapper.no-search": "Vui lòng nhập truy vấn để tìm kiếm", + "collection.edit.item-mapper.notifications.map.error.content": "Đã xảy ra lỗi khi liên kết{{amount}} tài liệu.", + "collection.edit.item-mapper.notifications.map.error.head": "Lỗi liên kết", + "collection.edit.item-mapper.notifications.map.success.content": "Ánh xạ thành công {{amount}} tài liệu.", + "collection.edit.item-mapper.notifications.map.success.head": "Ánh xạ được hoàn thành", + "collection.edit.item-mapper.notifications.unmap.error.content": "Đã xảy ra lỗi khi loại bỏ các liên kết của {{amount}} tài liệu.", + "collection.edit.item-mapper.notifications.unmap.error.head": "Lỗi loại bỏ liên kết", + "collection.edit.item-mapper.notifications.unmap.success.content": "Loại bỏ thành công các liên kết của {{amount}} tài liệu.", + "collection.edit.item-mapper.notifications.unmap.success.head": "Hoàn thành loại bỏ liên kết", + "collection.edit.item-mapper.remove": "Loại bỏ các liên kết của tài liệu được chọn", + "collection.edit.item-mapper.search-form.placeholder": "Tìm kiếm tài liệu...", + "collection.edit.item-mapper.tabs.browse": "Duyệt các tài liệu được liên kết", + "collection.edit.item-mapper.tabs.map": "Liên kết tài liệu mới", + "collection.edit.logo.delete.title": "Xóa logo", + "collection.edit.logo.delete-undo.title": "Hoàn tác xóa", + "collection.edit.logo.label": "Logo bộ sưu tập", + "collection.edit.logo.notifications.add.error": "Tải lên không thành công logo bộ sưu tập. Vui lòng kiểm tra nội dung trước khi thử lại.", + "collection.edit.logo.notifications.add.success": "Tài thành công logo bộ sưu tập.", + "collection.edit.logo.notifications.delete.error.title": "Lỗi khi xóa logo", + "collection.edit.logo.notifications.delete.success.content": "Xóa thành công logo của bộ sưu tập", + "collection.edit.logo.notifications.delete.success.title": "Logo đã được xóa", + "collection.edit.logo.upload": "Thả một logo bộ sưu tập để tải lên", + "collection.edit.notifications.success": "Chỉnh sửa thành công bộ sưu tập", + "collection.edit.return": "Quay lại", + "collection.edit.tabs.authorizations.head": "Phân quyền", + "collection.edit.tabs.authorizations.title": "Chỉnh sửa bộ sưu tập - Phân quyền", + "collection.edit.tabs.curate.head": "Kiểm tra", + "collection.edit.tabs.curate.title": "Chỉnh sửa bộ sưu tập - Kiểm tra", + "collection.edit.tabs.item-mapper.title": "Chỉnh sửa bộ sưu tập - Liên kết tài liệu", + "collection.edit.tabs.mapper.head": "Liên kết tài liệu", + "collection.edit.tabs.metadata.head": "Chỉnh sửa thông tin mô tả", + "collection.edit.tabs.metadata.title": "Chỉnh sửa bộ sưu tập - Siêu dữ liệu", + "collection.edit.tabs.roles.head": "Gán quyền", + "collection.edit.tabs.roles.title": "Chỉnh sửa bộ sưu tập - Vai trò", + "collection.edit.tabs.source.external": "Bộ sưu tập này thu thập nội dung từ một nguồn bên ngoài", + "collection.edit.tabs.source.form.errors.oaiSource.required": "Bạn phải cung cấp một bộ id của bộ sưu tập đích.", + "collection.edit.tabs.source.form.harvestType": "Nội dung đang được thu thập", + "collection.edit.tabs.source.form.head": "Cấu hình nguồn bên ngoài", + "collection.edit.tabs.source.form.metadataConfigId": "Định dạng thông tin mô tả", + "collection.edit.tabs.source.form.oaiSetId": "ID của bộ OAI", + "collection.edit.tabs.source.form.oaiSource": "Nhà cung cấp OAI", + "collection.edit.tabs.source.form.options.harvestType.METADATA_AND_BITSTREAMS": "Thu thập thông tin mô tả và tệp tin (yêu cầu hỗ trợ ORE)", + "collection.edit.tabs.source.form.options.harvestType.METADATA_AND_REF": "Thu thập thông tin mô tả và tham chiếu đến tệp tin (yêu cầu hỗ trợ ORE)", + "collection.edit.tabs.source.form.options.harvestType.METADATA_ONLY": "Chỉ thu thập thông tin mô tả", + "collection.edit.tabs.source.head": "Nguồn nội dung", + "collection.edit.tabs.source.notifications.discarded.content": "Các thay đổi của bạn đã bị hủy. Để khôi phục các thay đổi hãy nhấp vào nút 'Hoàn tác'", + "collection.edit.tabs.source.notifications.discarded.title": "Các thay đổi đã bị hủy", + "collection.edit.tabs.source.notifications.invalid.content": "Các thay đổi chưa được lưu. Hãy đảm bảo rằng tất cả các trường đều hợp lệ trước khi lưu.", + "collection.edit.tabs.source.notifications.invalid.title": "Siêu dữ liệu không hợp lệ", + "collection.edit.tabs.source.notifications.saved.content": "Các thay đổi của bạn đối với nguồn nội dung của bộ sưu tập này đã được lưu.", + "collection.edit.tabs.source.notifications.saved.title": "Nguồn nội dung đã được lưu", + "collection.edit.tabs.source.title": "Chỉnh sửa bộ sưu tập - Nguồn nội dung", + "collection.edit.template.add-button": "Thêm", + "collection.edit.template.breadcrumbs": "Khung mẫu tài liệu", + "collection.edit.template.cancel": "Hủy", + "collection.edit.template.delete-button": "Xóa", + "collection.edit.template.edit-button": "Chỉnh sửa", + "collection.edit.template.error": "Đã xảy ra lỗi khi truy xuất khung mẫu tài liệu", + "collection.edit.template.head": "Chỉnh sửa khung mẫu tài liệu cho bộ sưu tập \"{{ collection }}\"", + "collection.edit.template.label": "Khung mẫu tài liệu", + "collection.edit.template.loading": "Đang tải khung mẫu tài liệu...", + "collection.edit.template.notifications.delete.error": "Xóa khung mẫu tài liệu không thành công", + "collection.edit.template.notifications.delete.success": "Xóa khung mẫu tài liệu thành công", + "collection.edit.template.title": "Chỉnh sửa khung mẫu tài liệu", + "collection.form.abstract": "Mô tả ngắn", + "collection.form.description": "Văn bản giới thiệu (HTML)", + "collection.form.entityType": "Loại thực thể", + "collection.form.errors.title.required": "Vui lòng nhập tên bộ sưu tập", + "collection.form.license": "Giấy phép", + "collection.form.provenance": "Nguồn gốc", + "collection.form.rights": "Bản quyền (HTML)", + "collection.form.tableofcontents": "Tin tức (HTML)", + "collection.form.title": "Tên", + "collection.listelement.badge": "Bộ sưu tập", + "collection.page.browse.recent.empty": "Không có biểu ghi nào để hiển thị", + "collection.page.browse.recent.head": "Những tài liệu tải lên gần đây", + "collection.page.edit": "Chỉnh sửa bộ sưu tập", + "collection.page.handle": "URL", + "collection.page.description.abstract": "Mô tả", + "collection.page.license": "Giấy phép", + "collection.page.news": "Tin tức", + "collection.select.confirm": "Xác nhận các mục đã chọn", + "collection.select.empty": "Không có bộ sưu tập nào để hiển thị", + "collection.select.table.title": "Nhan đề", + "collection.source.controls.harvest.last": "Lần thu thập trước:", + "collection.source.controls.harvest.message": "Thông tin thu thập:", + "collection.source.controls.harvest.no-information": "N\/A", + "collection.source.controls.harvest.start": "Thời gian bắt đầu thu thập:", + "collection.source.controls.harvest.status": "Trạng thái thu thập:", + "collection.source.controls.head": "Quản lý thu thập:", + "collection.source.controls.import.completed": "Quá trình nhập liệu đã hoàn thành", + "collection.source.controls.import.failed": "Xảy ra lỗi trong quá trình nhập dữ liệu", + "collection.source.controls.import.running": "Đang nhập dữ liệu…", + "collection.source.controls.import.submit": "Nhập ngay", + "collection.source.controls.import.submit.error": "Xảy ra sự cố khi bắt đầu quá trình nhập dữ liệu", + "collection.source.controls.import.submit.success": "Quá trình nhập liệu đã được bắt đầu thành công", + "collection.source.controls.reset.completed": "Quá trình thiết lập và nhập lại dữ liệu đã hoàn tất", + "collection.source.controls.reset.failed": "Xảy ra sự cố trong quá trình thiết lập và nhập lại dữ liệu", + "collection.source.controls.reset.running": "Đang thiết lập và nhập lại dữ liệu", + "collection.source.controls.reset.submit": "Thiết lập và nhập lại dữ liệu", + "collection.source.controls.reset.submit.error": "Đã xảy ra lỗi khi bắt đầu thiết lập và nhập lại dữ liệu", + "collection.source.controls.reset.submit.success": "Quá trình thiết lập và nhập lại dữ liệu đã được bắt đầu thành công", + "collection.source.controls.test.completed": "Tập lệnh để kiểm tra cài đặt đã kết thúc thành công", + "collection.source.controls.test.failed": "Tập lệnh để kiểm tra cài đặt không thành công", + "collection.source.controls.test.running": "Cấu hình thử nghiệm…", + "collection.source.controls.test.submit": "Cấu hình thử nghiệm", + "collection.source.controls.test.submit.error": "Đã xảy ra lỗi khi bắt đầu cài đặt thử nghiệm", + "collection.source.update.notifications.error.content": "Các cài đặt đã được kiểm tra và không hoạt động.", + "collection.source.update.notifications.error.title": "Lỗi máy chủ", + + "community.create.head": "Tạo đơn vị", + "community.create.notifications.success": "Tạo đơn vị thành công", + "community.create.sub-head": "Tạo một đơn vị con cho đơn vị {{ parent }}", + "community.curate.header": "Kiểm tra đơn vị: {{community}}", + "community.delete.cancel": "Hủy", + "community.delete.confirm": "Xác nhận", + "community.delete.head": "Xóa đơn vị", + "community.delete.notification.fail": "Không thể xóa đơn vị", + "community.delete.notification.success": "Xóa đơn vị thành công", + "community.delete.processing": "Đang xóa…", + "community.delete.text": "Bạn có chắc chắn muốn xóa đơn vị \"{{ dso }}\"", + "community.edit.breadcrumbs": "Chỉnh sửa đơn vị", + "community.edit.delete": "Xóa đơn vị này", + "community.edit.head": "Chỉnh sửa đơn vị", + "community.edit.logo.delete.title": "Xóa logo", + "community.edit.logo.delete-undo.title": "Hoàn tác xóa", + "community.edit.logo.label": "Logo đơn vị", + "community.edit.logo.notifications.add.error": "Tải lên không thành công thành công logo đơn vị. Vui lòng kiểm tra lại nội dung trước khi tải lại.", + "community.edit.logo.notifications.add.success": "Tài lên thành công logo đơn vị.", + "community.edit.logo.notifications.delete.error.title": "Lỗi khi xóa logo", + "community.edit.logo.notifications.delete.success.content": "Xóa thành công logo của đơn vị", + "community.edit.logo.notifications.delete.success.title": "Đã xóa logo", + "community.edit.logo.upload": "Thả một logo đơn vị để tải lên", + "community.edit.notifications.error": "Đã xảy ra lỗi khi chỉnh sửa đơn vị", + "community.edit.notifications.success": "Chỉnh sửa đơn vị thành công", + "community.edit.notifications.unauthorized": "Bạn không có quyền để thực hiện thay đổi này", + "community.edit.return": "Quay lại", + "community.edit.tabs.authorizations.head": "Phân quyền", + "community.edit.tabs.authorizations.title": "Chỉnh sửa đơn vị - Phân quyền", + "community.edit.tabs.curate.head": "Kiểm tra", + "community.edit.tabs.curate.title": "Chỉnh sửa đơn vị - Kiểm tra", + "community.edit.tabs.metadata.head": "Chỉnh sửa thông tin mô tả", + "community.edit.tabs.metadata.title": "Chỉnh sửa đơn vị - Siêu dữ liệu", + "community.edit.tabs.roles.head": "Gán quyền", + "community.edit.tabs.roles.title": "Chỉnh sửa đơn vị - Quyền", + "community.form.abstract": "Mô tả ngắn", + "community.form.description": "Văn bản giới thiệu (HTML)", + "community.form.errors.title.required": "Vui lòng nhập tên đơn vị", + "community.form.rights": "Thông tin bản quyền (HTML)", + "community.form.tableofcontents": "Tin tức (HTML)", + "community.form.title": "Tên", + "community.listelement.badge": "Đơn vị", + "community.page.edit": "Chỉnh sửa đơn vị", + "community.page.handle": "URL", + "community.page.license": "Giấy phép", + "community.page.news": "Tin tức", + "community.sub-collection-list.head": "Các bộ sưu tập của đơn vị này", + "community.sub-community-list.head": "Các đơn vị con của đơn vị này", + "communityList.breadcrumbs": "Danh sách đơn vị", + "communityList.showMore": "Hiển thị thêm", + "communityList.tabTitle": "Danh sách đơn vị", + "communityList.title": "Danh sách các đơn vị", + + "comcol-role.edit.bitstream_read.anonymous-group": "Quyền đọc được mặc định cho các tài liệu hiện được đặt cho nhóm người dùng ẩn danh.", + "comcol-role.edit.bitstream_read.description": "Người có quyền đọc tệp tin có khả năng tải các tệp tin về máy tính cá nhân để sử dụng", + "comcol-role.edit.bitstream_read.name": "Quyền đọc tệp tin mặc định", + "comcol-role.edit.collection-admin.description": "Quản trị viên bộ sưu tập quyết định người có thể tải tài liệu vào bộ sưu tập sửa thông tin mô tả của tài liệu (sau khi tải lên) và thêm (liên kết) tài liệu đã tồn tại từ bộ sưu tập khác (phụ thuộc phân quyền vào bộ sưu tập đó)", + "comcol-role.edit.collection-admin.name": "Quản trị", + "comcol-role.edit.community-admin.description": "Quản trị viên đơn vị có thể tạo đơn vị con hoặc bộ sưu tập và quản lý hoặc gán quyền quản lý cho những đơn vị con hoặc bộ sưu tập đó. Ngoài ra họ quyết định ai có thể tải các tài liệu vào bất kì bộ sưu tập nào chỉnh sửa thông tin thông tin mô tả của tài liệu (sau khi tải lên) và thêm (liên kết) các tài liệu đã tồn tại ở bộ sưu tập khác (phụ thuộc vào phân quyền)", + "comcol-role.edit.community-admin.name": "Quản trị", + "comcol-role.edit.create": "Tạo", + "comcol-role.edit.create.error.title": "Không tạo được nhóm có quyền '{{role }}'", + "comcol-role.edit.delete": "Xóa", + "comcol-role.edit.delete.error.title": "Không thể xóa nhóm có quyền '{{ role }}'", + "comcol-role.edit.editor.description": "Người biên tập có thể chỉnh sửa thông tin mô tả của tài liệu được tải lên, có thể chấp nhận hoặc từ chối tài liệu được tải lên.", + "comcol-role.edit.editor.name": "Người biên tập", + "comcol-role.edit.finaleditor.description": "Người biên tập cuối có thể chỉnh sửa thông tin mô tả của tài liệu được tải lên nhưng không thể từ chối tài liệu được tải lên.", + "comcol-role.edit.finaleditor.name": "Người biên tập cuối", + "comcol-role.edit.item_read.anonymous-group": "Quyền đọc được mặc định cho các tài liệu hiện được đặt cho nhóm người dùng ẩn danh.", + "comcol-role.edit.item_read.description": "Tài khoản người dùng và nhóm người dùng có thể đọc những tài liệu mới được tải lên bộ sưu tập này. Các thay đổi quyền này không có hiêu lực với những tài liệu đã được tải lên từ trước. Những tài liệu đã tồn tại trong hệ thống sẽ vẫn được xem bởi những người có quyền xem vào thời điểm chúng được bổ sung", + "comcol-role.edit.item_read.name": "Quyền đọc thông tin mô tả của tài liệu", + "comcol-role.edit.no-group": "Trống", + "comcol-role.edit.restrict": "Hạn chế", + "comcol-role.edit.reviewer.description": "Người kiểm duyệt có thể chấp nhận hoặc từ chối các tài liệu được tải lên. Tuy nhiên sẽ không thể chỉnh sửa thông tin mô tả của tài liệu.", + "comcol-role.edit.reviewer.name": "Người kiểm duyệt", + "comcol-role.edit.submitters.description": "Tài khoản người dùng và nhóm người dùng có quyền tải tài liệu mới vào bộ sưu tập này", + "comcol-role.edit.submitters.name": "Người tải lên", + + "community.form.abstract": "Mô tả ngắn", + "community.form.description": "Văn bản giới thiệu (HTML)", + "community.form.errors.title.required": "Vui lòng nhập tên đơn vị", + "community.form.rights": "Thông tin bản quyền (HTML)", + "community.form.tableofcontents": "Tin tức (HTML)", + "community.form.title": "Tên", + + "community.page.edit": "Chỉnh sửa đơn vị", + "community.page.handle": "URL", + "community.page.license": "Giấy phép", + "community.page.news": "Tin tức", + + "community.all-lists.head": "Đơn vị con và bộ sưu tập", + + "community.sub-collection-list.head": "Các bộ sưu tập của đơn vị này", + "community.sub-community-list.head": "Các đơn vị con của đơn vị này", + + "cookies.consent.accept-all": "Chấp thuận tất cả", + "cookies.consent.accept-selected": "Chấp nhận các mục đã chọn", + "cookies.consent.app.description.acknowledgement": "Bắt buộc để lưu sự xác nhận và đồng ý của bạn", + "cookies.consent.app.description.authentication": "Bắt buộc để đăng nhập", + "cookies.consent.app.description.google-analytics": "Cho phép chúng tôi theo dõi dữ liệu thống kê", + "cookies.consent.app.description.google-recaptcha": "Chúng tôi sử dụng dịch vụ google reCAPTCHA trong quá trình đăng ký và khôi phục mật khẩu", + "cookies.consent.app.description.preferences": "Bắt buộc để lưu tùy chọn của bạn", + "cookies.consent.app.disable-all.description": "Sử dụng nút chuyển này để bật hoặc tắt tất cả dịch vụ.", + "cookies.consent.app.disable-all.title": "Bật hoặc tắt tất cả dịch vụ", + "cookies.consent.app.opt-out.description": "Ứng dụng này đã được tải theo mặc định (nhưng bạn có thể chọn không tham gia)", + "cookies.consent.app.purpose": "mục đích", + "cookies.consent.app.required.description": "Ứng dụng này luôn được yêu cầu", + "cookies.consent.app.title.acknowledgement": "Sự xác nhận", + "cookies.consent.app.title.authentication": "Xác thực", + "cookies.consent.app.title.google-analytics": "Google Analytics", + "cookies.consent.app.title.google-recaptcha": "Google reCaptcha", + "cookies.consent.app.title.preferences": "Cài đặt cá nhân", + "cookies.consent.close": "Đóng", + "cookies.consent.content-modal.description": "Tại đây bạn có thể xem và tùy chỉnh thông tin mà chúng tôi thu thập được về bạn.", + "cookies.consent.content-modal.privacy-policy.name": "chính sách bảo mật", + "cookies.consent.content-modal.privacy-policy.text": "Để biết thêm vui lòng đọc {privacyPolicy} của chúng tôi.", + "cookies.consent.content-modal.service": "dịch vụ", + "cookies.consent.content-modal.services": "các dịch vụ", + "cookies.consent.content-modal.title": "Thông tin mà chúng tôi thu thập", + "cookies.consent.content-notice.description": "Chúng tôi thu thập và xử lý thông tin các nhân của bạn cho các mục đích sau: Xác thực các ưa thích xác nhận và thống kê.
Để biết thêm vui lòng đọc {privacyPolicy} của chúng tôi.", + "cookies.consent.content-notice.description.no-privacy": "Chúng tôi thu thập và xử lý thông tin cá nhân của bạn cho các mục đích sau: Xác thực Cài đặt cá nhân Xác nhận và Thống kê.", + "cookies.consent.content-notice.learnMore": "Tùy chỉnh", + "cookies.consent.content-notice.title": "Đồng ý sử dụng cookie", + "cookies.consent.decline": "Từ chối", + "cookies.consent.ok": "OK", + "cookies.consent.purpose.functional": "Chức năng", + "cookies.consent.purpose.registration-password-recovery": "Đăng ký và khôi phục mật khẩu", + "cookies.consent.purpose.sharing": "Chia sẻ", + "cookies.consent.purpose.statistical": "Thống kê", + "cookies.consent.save": "Lưu", + "cookies.consent.update": "Có 1 vài thay đổi từ lần ghé thăm cuối cùng của bạn vui lòng cập nhập sự đồng ý của bạn.", + + "curation-task.task.checklinks.label": "\"Kiểm tra các link trong thông tin mô tả\"", + "curation-task.task.citationpage.label": "Tạo trang trích dẫn", + "curation-task.task.noop.label": "NOOP", + "curation-task.task.profileformats.label": "Định dạng tệp tin", + "curation-task.task.register-doi.label": "Đăng ký DOI", + "curation-task.task.requiredmetadata.label": "Kiểm tra các trường dữ liệu bắt buộc", + "curation-task.task.translate.label": "Bộ dịch của Microsoft", + "curation-task.task.vscan.label": "Quét Virus", + + "curation.form.handle.hint": "Gợi ý: Nhập [your-handle-prefix]\/0 để chạy một tác vụ trên toàn bộ trang (chú ý rằng không phải tất cả tác vụ đều hỗ trợ khả năng này)", + "curation.form.handle.label": "Handle:", + "curation.form.submit": "Bắt đầu", + "curation.form.submit.error.content": "Đã có lỗi xảy ra khi cố gắng khởi động tác vụ kiểm tra.", + "curation.form.submit.error.head": "Việc chạy tác vụ kiểm tra đã thất bại", + "curation.form.submit.error.invalid-handle": "Không thể xác định định danh của đối tượng này", + "curation.form.submit.success.content": "Bạn sẽ được điều hướng đến trang phản hồi quy trình.", + "curation.form.submit.success.head": "Tác vụ kiểm tra đã khởi động thành công", + "curation.form.task-select.label": "Tác vụ:", + + "deny-request-copy.email.message": "Kính gửi {{ recipientName }}\n\nLiên quan đến yêu cầu của bạn Thư viện rất tiếc phải thông báo với bạn rằng chúng tôi không thể gửi cho bạn bản sao của (các) tệp bạn đã yêu cầu liên quan đến tài liệu: \"{{ itemUrl }}\" ({{ itemName }}).\n\nTrân trọng\n,{{ authorName}}<{{ authorEmail }}>", + "deny-request-copy.email.subject": "Yêu cầu bản sao tài liệu", + "deny-request-copy.error": "Đã xảy ra lỗi", + "deny-request-copy.header": "Từ chối yêu cầu bản sao tài liệu", + "deny-request-copy.intro": "Tin nhắn này sẽ được gửi đến người yêu cầu", + "deny-request-copy.success": "Từ chối thành công yêu cầu tài liệu", + + "dso.name.untitled": "Không có nhan đề", + + "dso-selector.claim.item.body": "Đây là những hồ sơ hiện có có thể liên quan đến bạn. Nếu bạn nhận ra mình ở một trong những hồ sơ này hãy chọn hồ sơ đó và trên trang chi tiết hãy chọn xác nhận hồ sơ. Nếu không bạn có thể tạo một hồ sơ mới từ đầu bằng cách sử dụng nút bên dưới.", + "dso-selector.claim.item.create-from-scratch": "Tạo hồ sơ mới", + "dso-selector.claim.item.head": "Mẹo quản lý hồ sơ", + "dso-selector.claim.item.not-mine-label": "Không có mục nào trong số này là của tôi", + "dso-selector.create.collection.head": "Bộ sưu tập mới", + "dso-selector.create.collection.sub-level": "Tạo một bộ sưu tập mới trong", + "dso-selector.create.community.head": "Đơn vị mới", + "dso-selector.create.community.or-divider": "hoặc", + "dso-selector.create.community.sub-level": "Tạo một đơn vị mới trong", + "dso-selector.create.community.top-level": "Tạo một đơn vị lớn", + "dso-selector.create.item.head": "Tài liệu mới", + "dso-selector.create.item.sub-level": "Tạo một tài liệu mới trong", + "dso-selector.create.submission.head": "Biên mục mới", + "dso-selector.create.topic.sub-level": "Tạo topic mới trong", + "dso-selector.create.topic.top-level": "Tạo topic lớn", + "dso-selector.edit.collection.head": "Chỉnh sửa bộ sưu tập", + "dso-selector.edit.community.head": "Chỉnh sửa đơn vị", + "dso-selector.edit.item.head": "Chỉnh sửa tài liệu", + "dso-selector.error.title": "Đã có lỗi xảy ra khi tìm kiếm kiểu tài liệu {{ type }}", + "dso-selector.export-batch.dspaceobject.head": "Xuất lô dữ liệu (định dạng file ZIP) từ", + "dso-selector.export-metadata.dspaceobject.head": "Xuất siêu dữ liệu từ", + "dso-selector.import-batch.dspaceobject.head": "Nhập lô dữ liệu từ", + "dso-selector.no-results": "Không tìm thấy kiểu {{ type }} nào", + "dso-selector.placeholder": "Tìm kiếm {{ type }}", + "dso-selector.results-could-not-be-retrieved": "Đã xảy ra lỗi vui lòng làm mới lại ↻", + "dso-selector.select.collection.head": "Chọn một bộ sưu tập", + "dso-selector.set-scope.community.button": "Tìm kiếm trên toàn hệ thống", + "dso-selector.set-scope.community.head": "Chọn một phạm vi tìm kiếm", + "dso-selector.set-scope.community.input-header": "Tìm kiếm một đơn vị hoặc bộ sưu tập", + "dso-selector.set-scope.community.or-divider": "hoặc", + + "supervision-group-selector.header": "Supervision Group Selector", + "supervision-group-selector.select.type-of-order.label": "Select a type of Order", + "supervision-group-selector.select.type-of-order.option.none": "NONE", + "supervision-group-selector.select.type-of-order.option.editor": "EDITOR", + "supervision-group-selector.select.type-of-order.option.observer": "OBSERVER", + "supervision-group-selector.select.group.label": "Select a Group", + "supervision-group-selector.button.cancel": "Cancel", + "supervision-group-selector.button.save": "Save", + "supervision-group-selector.select.type-of-order.error": "Please select a type of order", + "supervision-group-selector.select.group.error": "Please select a group", + "supervision-group-selector.notification.create.success.title": "Successfully created supervision order for group {{ name }}", + "supervision-group-selector.notification.create.failure.title": "Error", + "supervision-group-selector.notification.create.already-existing" : "A supervision order already exists on this item for selected group", + + "confirmation-modal.delete-eperson.cancel": "Hủy", + "confirmation-modal.delete-eperson.confirm": "Xóa", + "confirmation-modal.delete-eperson.header": "Xóa người dùng \"{{ dsoName }}\"", + "confirmation-modal.delete-eperson.info": "Bạn có chắc muốn xóa người dùng \"{{ dsoName }}\"", + "confirmation-modal.delete-profile.cancel": "Hủy", + "confirmation-modal.delete-profile.confirm": "Xóa", + "confirmation-modal.delete-profile.header": "Xóa hồ sơ", + "confirmation-modal.delete-profile.info": "Bạn có chắc chắn muốn xóa hồ sơ", + "confirmation-modal.export-batch.cancel": "Hủy", + "confirmation-modal.export-batch.confirm": "Xuất dữ liệu", + "confirmation-modal.export-batch.header": "Xuất lô dữ liệu (định dạng file ZIP) của tác giả {{ dsoName }}", + "confirmation-modal.export-batch.info": "Bạn có chắc chắn muốn xuất lô dữ liệu (định dạng file ZIP) của tác giả {{ dsoName }}", + "confirmation-modal.export-metadata.cancel": "Hủy", + "confirmation-modal.export-metadata.confirm": "Xuất dữ liệu", + "confirmation-modal.export-metadata.header": "Xuất thông tin mô tả tài liệu của đơn vị, bộ sưu tập {{ dsoName }}", + "confirmation-modal.export-metadata.info": "Bạn có chắc muốn xuất thông tin mô tả tài liệu của đơn vị, bộ sưu tập {{ dsoName }}", + "confirmation-modal.policies.cancel": "Hủy", + "confirmation-modal.policies.confirm": "Xác nhận", + "confirmation-modal.policies.header": "Chọn hướng phân quyền cho đối tượng đã di chuyển", + "confirmation-modal.policies.info": "Bạn muốn chọn hướng phân quyền cho đối tượng đã di chuyển", + "confirmation-modal.reset-password-eperson.cancel": "Hủy", + "confirmation-modal.reset-password-eperson.confirm": "Thiết lập lại mật khẩu", + "confirmation-modal.reset-password-eperson.info": "Bạn có chắc chắn muốn thiết lập lại mật khẩu cho người dùng \"{{ dsoName }}\"", + + "error.bitstream": "Lỗi tìm kiếm tệp tin", + "error.browse-by": "Lỗi tìm kiếm tài liệu", + "error.collection": "Lỗi tìm kiếm bộ sưu tập", + "error.collections": "Lỗi tìm kiếm bộ sưu tập", + "error.community": "Lỗi tìm kiếm đơn vị", + "error.default": "Lỗi", + "error.identifier": "Không tìm thấy tài liệu nào cho định danh này", + "error.invalid-search-query": "Truy vấn tìm kiếm không hợp lệ. Vui lòng kiểm tra
Cú pháp truy vấn Solr các phương pháp tốt nhất để biết thêm thông tin về lỗi này.", + "error.item": "Lỗi tìm kiếm tài liệu", + "error.items": "Lỗi tìm kiếm tài liệu", + "error.objects": "Lỗi tìm kiếm đối tượng", + "error.recent-submissions": "Lỗi tìm kiếm các tài liệu biên mục gần đây", + "error.search-results": "Lỗi tìm kiếm các kết quả tìm", + "error.sub-collections": "Lỗi tìm kiếm bộ sưu tập con", + "error.sub-communities": "Lỗi tìm kiếm đơn vị con", + "error.submission.sections.init-form-error": "Đã xảy ra lỗi khi khởi chạy các phần vui lòng kiểm tra cấu hình biểu mẫu đầu vào của bạn. Thông tin chi tiết ở bên dưới:

", + "error.top-level-communities": "Lỗi tìm kiếm đơn vị lớn", + "error.validation.emailTaken": "Email này đã được sử dụng", + "error.validation.filerequired": "Bắt buộc phải tải tệp tin lên", + "error.validation.groupExists": "Nhóm này đã tồn tại", + "error.validation.license.notgranted": "Bạn phải đồng ý với giấy phép này để hoàn thành tài liệu biên mục của mình. Nếu hiện tại bạn không thể đồng ý giấy phép này bạn có thể lưu tài liệu biên mục của mình và quay lại sau hoặc xóa nội dung đã biên mục.", + "error.validation.NotValidEmail": "Email này không hợp lệ", + "error.validation.pattern": "Đầu vào này bị giới hạn bởi mẫu hiện tại: {{ pattern }}.", + "error.validation.required": "Đây là trường bắt buộc", + "error-page.description.401": "không có quyền truy cập", + "error-page.description.403": "không được phép truy cập", + "error-page.description.404": "không tìm thấy trang", + "error-page.description.500": "Dịch vụ không sẵn sàng", + "error-page.orcid.generic-error": "Đã xảy ra lỗi khi đăng nhập qua ORCID. Make sure you have shared your ORCID account email address with DSpace. If the error persists contact the administrator", + + "feed.description": "Nguồn cấp dữ liệu tổng hợp", + + "file-section.error.header": "Lỗi khi lấy tệp cho tài liệu này", + + "footer.copyright": "bản quyền © 2002-{{ year }}", + "footer.link.cookies": "Cài đặt Cookie", + "footer.link.dspace": "Phần mềm thư viện số", + "footer.link.end-user-agreement": "Thỏa thuận bạn đọc", + "footer.link.feedback": "Gửi phản hồi", + "footer.link.lyrasis": "LYRASIS", + "footer.link.privacy-policy": "Chính sách riêng tư", + + "forgot-email.form.email": "Địa chỉ Email *", + "forgot-email.form.email.error.pattern": "Vui lòng nhập một địa chỉ email hợp lệ", + "forgot-email.form.email.error.required": "Vui lòng nhập địa chỉ email", + "forgot-email.form.email.hint": "Địa chỉ email này sẽ được xác nhận và sử dụng như là tên đăng nhập.", + "forgot-email.form.error.content": "Đã xảy ra lỗi khi đăng kí địa chỉ email sau: {{ email }}", + "forgot-email.form.error.head": "Đã xảy ra lỗi khi đăng kí email", + "forgot-email.form.header": "Quên mật khẩu", + "forgot-email.form.info": "Nhập địa chỉ email mà để đăng kí cập nhật thông tin tài liệu mới trong các bộ sưu tập qua email và biên mục tài liệu mới vào thư viện số.", + "forgot-email.form.submit": "Lưu", + "forgot-email.form.success.content": "Một email đã được gửi tới địa chỉ {{ email }} trong đó có chứa URL và các hướng dẫn chi tiết hơn.", + "forgot-email.form.success.head": "Email xác nhận đã được gửi tới bạn", + + "forgot-password.form.card.security": "Bảo mật", + "forgot-password.form.error.empty-password": "Vui lòng nhập mật khẩu mới trong ô dưới đây.", + "forgot-password.form.error.matching-passwords": "Hai mật khẩu không trùng khớp.", + "forgot-password.form.head": "Quên mật khẩu", + "forgot-password.form.identification.email": "Địa chỉ email:", + "forgot-password.form.identification.header": "Định danh", + "forgot-password.form.info": "Nhập mật khẩu mới trong ô dưới đây và xác nhận bằng cách nhập lại vào ô thứ hai. Mật khẩu nên chứa ít nhất 6 kí tự.", + "forgot-password.form.label.password": "Mật khẩu", + "forgot-password.form.label.passwordrepeat": "Nhập lại mật khẩu mới", + "forgot-password.form.notification.error.title": "Đã xảy ra lỗi khi gửi mật khẩu mới", + "forgot-password.form.notification.success.content": "Đã đặt lại mật khẩu thành công. Bạn đã được đăng nhập với tư cách là người dùng được tạo.", + "forgot-password.form.notification.success.title": "Hoàn thành đặt lại mật khẩu", + "forgot-password.form.submit": "Gửi mật khẩu", + "forgot-password.title": "Quên mật khẩu", + + "form.add": "Thêm", + "form.add-help": "Nhấp vào đây để thêm mục hiện tại và một mục khác", + "form.cancel": "Hủy", + "form.clear": "Xóa", + "form.clear-help": "Nhấp vào đây để xóa giá trị đã chọn", + "form.discard": "Hủy bỏ", + "form.drag": "Kéo", + "form.edit": "Chỉnh sửa", + "form.edit-help": "Nhấp vào đây để chỉnh sửa giá trị đã chọn", + "form.first-name": "Tên", + "form.group-collapse": "Thu hẹp", + "form.group-collapse-help": "Nhấp vào đây để thu hẹp", + "form.group-expand": "Mở rộng", + "form.group-expand-help": "Nhấp vào đây để mở rộng và thêm các yếu tố khác", + "form.last-name": "Họ", + "form.loading": "Đang tải...", + "form.lookup": "Tìm kiếm", + "form.lookup-help": "Nhấp vào đây để tìm kiếm mối liên hệ đang tồn tại", + "form.no-results": "Không tìm thấy kết quả phù hợp", + "form.no-value": "Không có giá trị nào được nhập vào", + "form.remove": "Xóa", + "form.repeatable.sort.tip": "Thả tài liệu vào vị trí mới", + "form.save": "Lưu", + "form.save-help": "Lưu thay đổi", + "form.search": "Tìm kiếm", + "form.search-help": "Nhấp vào đây để tìm kiếm thư từ đang tồn tại", + "form.submit": "Lưu", + + "grant-deny-request-copy.deny": "Không gửi bản sao", + "grant-deny-request-copy.email.back": "Quay lại", + "grant-deny-request-copy.email.message": "Tin nhắn", + "grant-deny-request-copy.email.message.empty": "Vui lòng nhập một tin nhắn", + "grant-deny-request-copy.email.permissions.info": "Bạn có thể nhân tiện dịp này để xem xét lại các hạn chế truy cập vào tài liệu để tránh phải trả lời các yêu cầu tương tự. Nếu bạn muốn yêu cầu quản trị hệ thống loại bỏ những hạn chế này vui lòng đánh dấu vào hộp bên dưới.", + "grant-deny-request-copy.email.permissions.label": "Chuyển thành truy cập mở", + "grant-deny-request-copy.email.send": "Gửi", + "grant-deny-request-copy.email.subject": "Chủ đề", + "grant-deny-request-copy.email.subject.empty": "Vui lòng nhập một chủ đề", + "grant-deny-request-copy.grant": "Gửi bản sao", + "grant-deny-request-copy.header": "Yêu cầu bản sao tài liệu", + "grant-deny-request-copy.home-page": "Đi tới trang chủ", + "grant-deny-request-copy.intro1": "Nếu bạn là một trong các tác giả của tài liệu {{ name }} vui lòng sử dụng một trong các tùy chọn dưới đây để phản hồi yêu cầu của bạn đọc.", + "grant-deny-request-copy.intro2": "Sau khi chọn một tùy chọn bạn sẽ thấy một email gợi ý trả lời mà bạn có thể chỉnh sửa.", + "grant-deny-request-copy.processed": "Yêu cầu này đã được xử lý. Bạn có thể sử dụng nút bên dưới để quay lại trang chủ.", + "grant-request-copy.email.message": "Dear {{ recipientName }}\n\nLiên quan đến yêu cầu của bạn Thư viện đồng ý gửi cho bạn bản sao của (các) tệp bạn đã yêu cầu liên quan đến tài liệu: \"{{ itemUrl }}\" ({{ itemName }}).\n\n\nTrân trọng\n\n{{ authorName }} <{{ authorEmail }}>\n", + "grant-request-copy.email.subject": "Yêu cầu bản sao tài liệu", + "grant-request-copy.error": "Đã xảy ra lỗi", + "grant-request-copy.header": "Chấp nhận yêu cầu bản sao tài liệu", + "grant-request-copy.intro": "Tin nhắn này sẽ được gửi đến người gửi yêu cầu. (Các) tài liệu được yêu cầu sẽ được gửi kèm tin nhắn.", + "grant-request-copy.success": "Yêu cầu tài liệu đã được xử lý thành công", + + "health.breadcrumbs": "Kiểm tra hệ thống", + "health-page.error.msg": "Dịch vụ kiểm tra hệ thống tạm thời không khả dụng", + "health-page.heading": "Kiểm tra hệ thống", + "health-page.info-tab": "Thông tin hệ thống", + "health-page.property.status": "Mã trạng thái", + "health-page.section.db.title": "Cơ sở dữ liệu", + "health-page.section.geoIp.title": "GeoIp", + "health-page.section.no-issues": "Không có vấn đề được phát hiện", + "health-page.section.solrAuthorityCore.title": "Solr: authority core", + "health-page.section.solrOaiCore.title": "Solr: oai core", + "health-page.section.solrSearchCore.title": "Solr: search core", + "health-page.section.solrStatisticsCore.title": "Solr: statistics core", + "health-page.section-info.app.title": "Ứng dụng Backend", + "health-page.section-info.java.title": "Java", + "health-page.status": "Trạng thái", + "health-page.status.error.info": "Các vấn đề được tìm thấy", + "health-page.status.ok.info": "Vận hành", + "health-page.status.warning.info": "Phát hiện các vấn đề có thể xảy ra", + "health-page.status-tab": "Trạng thái", + "health-page.title": "Kiểm tra hệ thống", + + "home.description": "", + "home.breadcrumbs": "Trang chủ", + "home.search-form.placeholder": "Tìm kiếm kho lưu trữ", + "home.title": "Trang chủ", + "home.top-level-communities.head": "Danh sách đơn vị trong DSpace", + "home.top-level-communities.help": "Chọn một đơn vị để xem các bộ sưu tập của nó.", + + "info.contact.breadcrumbs": "Thông tin liên hệ", + "info.contact.head": "Thông tin liên hệ", + "info.contact.title": "Thông tin liên hệ", + "info.end-user-agreement.accept": "Tôi đã đọc và đồng ý với Thỏa thuận bạn đọc", + "info.end-user-agreement.accept.error": "Đã xảy ra lỗi khi chấp nhận Thỏa thuận bạn đọc", + "info.end-user-agreement.accept.success": "Đã cập nhật thành công Thỏa thuận bạn đọc", + "info.end-user-agreement.breadcrumbs": "Thỏa thuận bạn đọc", + "info.end-user-agreement.buttons.cancel": "Hủy", + "info.end-user-agreement.buttons.save": "Lưu", + "info.end-user-agreement.head": "Thỏa thuận người dùng", + "info.end-user-agreement.title": "Thỏa thuận người dùng", + "info.feedback.breadcrumbs": "Phản hồi", + "info.feedback.comments": "Bình luận", + "info.feedback.create.success": "Gửi phản hồi thành công!", + "info.feedback.email_help": "Địa chỉ này sẽ được sử dụng để theo dõi phản hồi của bạn.", + "info.feedback.email-label": "Email", + "info.feedback.error.email.required": "Yêu cầu địa chỉ email hợp lệ", + "info.feedback.error.message.required": "Yêu cầu phải có nội dung bình luận", + "info.feedback.head": "Phản hồi", + "info.feedback.info": "Cảm ơn bạn đã chia sẽ phản hồi của mình tới Thư viện. Chúng tôi luôn trân trọng mọi ý kiến đóng góp của bạn!", + "info.feedback.page_help": "Trang liên kết với các phản hồi của bạn", + "info.feedback.page-label": "Trang", + "info.feedback.send": "Gửi phản hồi", + "info.feedback.title": "Phản hồi", + "info.help.head": "Trợ giúp", + "info.help.title": "Trợ giúp", + "info.privacy.breadcrumbs": "Cam kết bảo mật", + "info.privacy.head": "Cam kết bảo mật", + "info.privacy.title": "Cam kết bảo mật", + + "item.alerts.private": "Đây là tài liệu cá nhân", + "item.alerts.withdrawn": "Tài liệu này đã được chuyển sang chế độ ẩn", + "item.badge.private": "Cá nhân", + "item.badge.withdrawn": "Ẩn", + "item.bitstreams.upload.bundle": "Gói tệp tin", + "item.bitstreams.upload.bundle.new": "Tạo gói tệp tin", + "item.bitstreams.upload.bundle.placeholder": "Chọn một gói tệp tin", + "item.bitstreams.upload.bundles.empty": "Tài liệu này không có gói tệp tin nào để tải tệp tin vào.", + "item.bitstreams.upload.cancel": "Hủy", + "item.bitstreams.upload.drop-message": "Thả tệp tin để tài lên", + "item.bitstreams.upload.item": "Tài liệu:", + "item.bitstreams.upload.notifications.bundle.created.content": "Tạo thành công gói tệp tin.", + "item.bitstreams.upload.notifications.bundle.created.title": "Đã tạo gói tệp tin", + "item.bitstreams.upload.notifications.upload.failed": "Tải lên thất bại. Vui lòng xác minh nội dung sau trước khi thực hiện lại.", + "item.bitstreams.upload.title": "Tải tệp tin lên", + "item.edit.authorizations.heading": "Với trình chỉnh sửa này bạn có thể xem và chỉnh sửa chính sách phân quyền của một tài liệu (item) cũng như các thành phần của tài liệu đó như: gói tệp tin (bundle) và tệp tin (bitstream). Các tài liệu có thể chứa nhiều gói và mỗi gói có thể chứa nhiều tệp tin. Tài liệu và gói tệp tin thường có các quyền là THÊM\/XÓA\/ĐỌC\/CHỈNH SỬA còn tệp tin chỉ có quyền ĐỌC\/CHỈNH SỬA.", + "item.edit.authorizations.title": "Chỉnh sửa chính sách phân quyền của tài liệu", + "item.edit.bitstreams.bundle.displaying": "Đang hiển thị {{ amount }} trong số {{ total }} tệp tin.", + "item.edit.bitstreams.bundle.edit.buttons.upload": "Tải lên", + "item.edit.bitstreams.bundle.load.all": "Tải tất cả ({{ total }})", + "item.edit.bitstreams.bundle.load.more": "Xem thêm", + "item.edit.bitstreams.bundle.name": "GÓI TỆP TIN: {{ name }}", + "item.edit.bitstreams.discard-button": "Hủy bỏ", + "item.edit.bitstreams.edit.buttons.download": "Tải xuống", + "item.edit.bitstreams.edit.buttons.drag": "Kéo", + "item.edit.bitstreams.edit.buttons.edit": "Chỉnh sửa", + "item.edit.bitstreams.edit.buttons.remove": "Xóa", + "item.edit.bitstreams.edit.buttons.undo": "Hoàn tác", + "item.edit.bitstreams.empty": "Tài liệu này không chứa tệp tin nào. Hãy nhập vào nút tải lên để tải tệp tin.", + "item.edit.bitstreams.headers.actions": "Hành động", + "item.edit.bitstreams.headers.bundle": "Gói tệp tin", + "item.edit.bitstreams.headers.description": "Mô tả", + "item.edit.bitstreams.headers.format": "Định dạng", + "item.edit.bitstreams.headers.name": "Tên", + "item.edit.bitstreams.notifications.discarded.content": "Các thay đổi của bạn đã bị hủy. Để khôi phục các thay đổi của bạn hãy nhấp vào nút 'Hoàn tác'", + "item.edit.bitstreams.notifications.discarded.title": "Các thay đổi đã bị hủy", + "item.edit.bitstreams.notifications.move.failed.title": "Đã xảy ra lỗi khi di chuyển tệp tin", + "item.edit.bitstreams.notifications.move.saved.content": "Các di chuyển của bạn đối với tệp tin và gói tệp tin của tài liệu này đã được lưu lại.", + "item.edit.bitstreams.notifications.move.saved.title": "Di chuyển đã được lưu lại", + "item.edit.bitstreams.notifications.outdated.content": "Tài liệu bạn đang mở cũng đang được chỉnh sửa bởi một người dùng khác. Vì vậy các thay đổi của bạn đã bị hủy bỏ để tránh xảy ra xung đột.", + "item.edit.bitstreams.notifications.outdated.title": "Các thay đổi không có hiệu lực", + "item.edit.bitstreams.notifications.remove.failed.title": "Đã xảy ra lỗi khi xóa tệp tin", + "item.edit.bitstreams.notifications.remove.saved.content": "Các thay đổi liên quan tới việc xóa tệp tin của tài liệu này đã được lưu lại.", + "item.edit.bitstreams.notifications.remove.saved.title": "Việc xóa tệp tin đã được lưu lại", + "item.edit.bitstreams.reinstate-button": "Hoàn tác", + "item.edit.bitstreams.save-button": "Lưu", + "item.edit.bitstreams.upload-button": "Tải lên", + "item.edit.breadcrumbs": "Chỉnh sửa tài liệu", + "item.edit.delete.cancel": "Hủy", + "item.edit.delete.confirm": "Xóa", + "item.edit.delete.description": "Bạn có chắc chắn muốn xóa tài liệu này? Cẩn trọng: Hành động này sẽ xóa vĩnh viễn tài liệu và không thể khôi phục lại.", + "item.edit.delete.error": "Đã xảy ra lỗi trong khi xóa tài liệu này", + "item.edit.delete.header": "Xóa tài liệu: {{ id }}", + "item.edit.delete.success": "Tài liệu đã được xóa thành công", + "item.edit.head": "Chỉnh sửa tài liệu", + "item.edit.item-mapper.buttons.add": "Liên kết tài liệu tới các bộ sưu tập đã chọn", + "item.edit.item-mapper.buttons.remove": "Xóa liên kết tài liệu với các bộ sưu tập đã chọn", + "item.edit.item-mapper.cancel": "Hủy", + "item.edit.item-mapper.description": "Đây là công cụ liên kết tài liệu cho phép quản trị viên có thể liên kết tài liệu này với các bộ sưu tập khác. Bạn có thể tìm kiếm các bộ sưu tập và thực hiện liên kết hoặc xem danh sách các bộ sưu tập mà tài liệu hiện đang được liên kết tới.", + "item.edit.item-mapper.head": "Liên kết tài liệu - Liên kết tài liệu tới Bộ sưu tập khác", + "item.edit.item-mapper.item": "Tài liệu: \"{{name}}\"", + "item.edit.item-mapper.no-search": "Vui lòng nhập một truy vấn để tìm kiếm", + "item.edit.item-mapper.notifications.add.error.content": "Đã xảy ra lỗi khi liên kết tài liệu này tới {{amount}} bộ sưu tập.", + "item.edit.item-mapper.notifications.add.error.head": "Xảy ra lỗi khi liên kết", + "item.edit.item-mapper.notifications.add.success.content": "Đã liên kết thành công tài liệu này tới {{amount}} bộ sưu tập.", + "item.edit.item-mapper.notifications.add.success.head": "Hoàn thành liên kết tài liệu", + "item.edit.item-mapper.notifications.remove.error.content": "Đã xảy ra lỗi khi xóa liên kết của tài liệu với {{amount}} bộ sưu tập.", + "item.edit.item-mapper.notifications.remove.error.head": "Lỗi khi xóa liên kết tài liệu", + "item.edit.item-mapper.notifications.remove.success.content": "Đã xóa thành công liên kết giữa tài liệu với {{amount}} bộ sưu tập.", + "item.edit.item-mapper.notifications.remove.success.head": "Hoàn thành xóa liên kết tài liệu", + "item.edit.item-mapper.search-form.placeholder": "Tìm kiếm bộ sưu tập", + "item.edit.item-mapper.tabs.browse": "Xem các bộ sưu tập đã liên kết", + "item.edit.item-mapper.tabs.map": "Liên kết với các bộ sưu tập mới", + "item.edit.metadata.add-button": "Thêm", + "item.edit.metadata.discard-button": "Hủy bỏ", + "item.edit.metadata.edit.buttons.edit": "Chỉnh sửa", + "item.edit.metadata.edit.buttons.remove": "Xóa", + "item.edit.metadata.edit.buttons.undo": "Hoàn tác", + "item.edit.metadata.edit.buttons.unedit": "Ngừng chỉnh sửa", + "item.edit.metadata.empty": "Bộ sưu tập này hiện không chứa trường thông tin mặc định nào. Nhập vào nút Thêm để bắt đầu thêm giá trị mặc định cho trường thông tin cho các tài liệu biên mục mới trong bộ sưu tập.", + "item.edit.metadata.headers.edit": "Chỉnh sửa", + "item.edit.metadata.headers.field": "Trường", + "item.edit.metadata.headers.language": "Ngôn ngữ", + "item.edit.metadata.headers.value": "Giá trị", + "item.edit.metadata.metadatafield.invalid": "Vui lòng chọn một trường thông tin mô tả hợp lệ", + "item.edit.metadata.notifications.discarded.content": "Các thay đổi của bạn đã bị hủy. Để khôi phục lại các thay đổi này hãy nhấp vào nút 'Hoàn tác'", + "item.edit.metadata.notifications.discarded.title": "Đã khôi phục", + "item.edit.metadata.notifications.error.title": "Đã có lỗi xảy ra", + "item.edit.metadata.notifications.invalid.content": "Các thay đổi của bạn không được lưu lại. Vui lòng đảm bảo rằng tất cả các trường là hợp lệ trước khi bạn lưu.", + "item.edit.metadata.notifications.invalid.title": "Siêu dữ liệu không hợp lệ", + "item.edit.metadata.notifications.outdated.content": "Tài liệu bạn đang mở cũng đang được chỉnh sửa bởi một người dùng khác. Vì vậy các thay đổi của bạn với tài liệu sẽ bị hủy bỏ để tránh xung đột xảy ra.", + "item.edit.metadata.notifications.outdated.title": "Thay đổi không có hiệu lực", + "item.edit.metadata.notifications.saved.content": "Các thay đổi của bạn với thông tin mô tả của tài liệu này đã được lưu lại.", + "item.edit.metadata.notifications.saved.title": "Đã lưu thông tin mô tả", + "item.edit.metadata.reinstate-button": "Hoàn tác", + "item.edit.metadata.save-button": "Lưu", + "item.edit.modify.overview.field": "Trường", + "item.edit.modify.overview.language": "Ngôn ngữ", + "item.edit.modify.overview.value": "Giá trị", + "item.edit.move.cancel": "Quay lại", + "item.edit.move.description": "Chọn bộ sưu tập mà bạn muốn chuyển tài liệu này tới. Để giới hạn danh sách bộ sưu tập đang hiển thị bạn có thể nhập từ khóa tìm kiếm trong ô dưới đây.", + "item.edit.move.discard-button": "Hủy bỏ", + "item.edit.move.error": "Đã xảy ra lỗi khi thực hiện di chuyển tài liệu này", + "item.edit.move.head": "Di chuyển tài liệu: {{id}}", + "item.edit.move.inheritpolicies.checkbox": "Kế thừa chính sách", + "item.edit.move.inheritpolicies.description": "Kế thừa chính sách mặc định của bộ sưu tập đích", + "item.edit.move.move": "Di chuyển", + "item.edit.move.processing": "Đang di chuyển...", + "item.edit.move.save-button": "Lưu", + "item.edit.move.search.placeholder": "Nhập một từ khóa để tìm kiếm bộ sưu tập", + "item.edit.move.success": "Tài liệu đã được di chuyển thành công", + "item.edit.move.title": "Di chuyển tài liệu", + "item.edit.private.cancel": "Hủy", + "item.edit.private.confirm": "Chuyển thành tài liệu cá nhân", + "item.edit.private.description": "Bạn có chắc chắn muốn chuyển tài liệu này thành tài liệu cá nhân trong thư viện số?", + "item.edit.private.error": "Đã có lỗi xảy ra trong khi chuyển tài liệu sang chế độ cá nhân", + "item.edit.private.header": "Chuyển tài liệu: {{ id }} thành tài liệu cá nhân", + "item.edit.private.success": "Tài liệu bây giờ đã trở thành tài liệu cá nhân", + "item.edit.public.cancel": "Hủy", + "item.edit.public.confirm": "Chuyển thành tài liệu công cộng", + "item.edit.public.description": "Bạn có chắc chắn muốn chuyển tài liệu này thành tài liệu công cộng trong thư viện số?", + "item.edit.public.error": "Đã có lỗi xảy ra trong khi chuyển tài liệu sang chế độ công cộng", + "item.edit.public.header": "Chuyển tài liệu: {{ id }} thành tài liệu công cộng", + "item.edit.public.success": "Tài liệu bây giờ đã trở thành tài liệu công cộng", + "item.edit.reinstate.cancel": "Hủy", + "item.edit.reinstate.confirm": "Khôi phục", + "item.edit.reinstate.description": "Bạn có chắc chắn tài liệu này nên được khôi phục trong thư viện số?", + "item.edit.reinstate.error": "Đã có lỗi xảy ra trong khi khôi phục tài liệu này", + "item.edit.reinstate.header": "Khôi phục tài liệu: {{ id }}", + "item.edit.reinstate.success": "Tài liệu này đã được khôi phục thành công", + "item.edit.relationships.discard-button": "Hủy bỏ", + "item.edit.relationships.edit.buttons.add": "Thêm", + "item.edit.relationships.edit.buttons.remove": "Xóa", + "item.edit.relationships.edit.buttons.undo": "Hoàn tác", + "item.edit.relationships.no-entity-type": "Thêm trường dữ liệu 'dspace.entity.type' để kích hoạt các mối quan hệ cho tài liệu này", + "item.edit.relationships.no-relationships": "Không có mối quan hệ nào", + "item.edit.relationships.notifications.discarded.content": "các thay đổi của bạn đã bị hủy bỏ. Để khôi phục các thay đổi này hãy nhấp vào nút 'Hoàn tác'", + "item.edit.relationships.notifications.discarded.title": "Các thay đổi đã bị hủy", + "item.edit.relationships.notifications.failed.title": "Lỗi khi chỉnh sửa mối quan hệ", + "item.edit.relationships.notifications.outdated.content": "Tài liệu bạn đang mở cũng đang được chỉnh sửa bởi một người dùng khác. Vì vậy các thay đổi của bạn đã bị hủy bỏ để tránh xảy ra xung đột.", + "item.edit.relationships.notifications.outdated.title": "Các thay đổi không có hiệu lực", + "item.edit.relationships.notifications.saved.content": "Các thay đổi của bạn đối với các mối quan hệ của tài liệu này đã được lưu lại.", + "item.edit.relationships.notifications.saved.title": "Mối quan hệ đã được lưu lại", + "item.edit.relationships.reinstate-button": "Hoàn tác", + "item.edit.relationships.save-button": "Lưu", + "item.edit.return": "Quay lại", + "item.edit.tabs.bitstreams.head": "Tệp tin", + "item.edit.tabs.bitstreams.title": "Chỉnh sửa tài liệu - Tệp tin", + "item.edit.tabs.curate.head": "Kiểm tra dữ liệu", + "item.edit.tabs.curate.title": "Chỉnh sửa tài liệu - Kiểm tra dữ liệu", + "item.edit.tabs.disabled.tooltip": "Bạn không có quyền truy cập vào tab này", + "item.edit.tabs.item-mapper.title": "Chỉnh sửa tài liệu - Liên kết bộ sưu tập", + "item.edit.tabs.mapper.head": "Liên kết bộ sưu tập", + "item.edit.tabs.metadata.head": "Siêu dữ liệu", + "item.edit.tabs.metadata.title": "Chỉnh sửa tài liệu - Siêu dữ liệu", + "item.edit.tabs.relationships.head": "Mối quan hệ", + "item.edit.tabs.relationships.title": "Chỉnh sửa tài liệu - Mối quan hệ", + "item.edit.tabs.status.buttons.authorizations.button": "Phân quyền tài liệu", + "item.edit.tabs.status.buttons.authorizations.label": "Chỉnh sửa chính sách phân quyền của tài liệu", + "item.edit.tabs.status.buttons.delete.button": "Xóa vĩnh viễn", + "item.edit.tabs.status.buttons.delete.label": "Xóa tài liệu", + "item.edit.tabs.status.buttons.mappedCollections.button": "Bộ sưu tập đã liên kết", + "item.edit.tabs.status.buttons.mappedCollections.label": "Kiểm tra bộ sưu tập đã liên kết", + "item.edit.tabs.status.buttons.move.button": "Di chuyển tài liệu", + "item.edit.tabs.status.buttons.move.label": "Di chuyển tài liệu tới bộ sưu tập khác", + "item.edit.tabs.status.buttons.private.button": "Chuyển thành tài liệu cá nhân", + "item.edit.tabs.status.buttons.private.label": "Chuyển thành tài liệu cá nhân", + "item.edit.tabs.status.buttons.public.button": "Chuyển thành tài liệu công cộng", + "item.edit.tabs.status.buttons.public.label": "Chuyển tài liệu thành công cộng", + "item.edit.tabs.status.buttons.reinstate.button": "Khôi phục", + "item.edit.tabs.status.buttons.reinstate.label": "Khôi phục tài liệu vào kho lưu trữ", + "item.edit.tabs.status.buttons.unauthorized": "Bạn không có quyền thực hiện hành động này", + "item.edit.tabs.status.buttons.withdraw.button": "Ẩn", + "item.edit.tabs.status.buttons.withdraw.label": "Ẩn tài liệu khỏi kho lưu trữ", + "item.edit.tabs.status.description": "Chào mừng bạn đến với trang quản lý tài liệu. Từ đây bạn có thể ẩn khôi phục di chuyển hoặc xóa tài liệu. Bạn cũng có thể cập nhật hoặc nhập thêm trường dữ liệu mới tải thêm tệp tin trên những tab khác.", + "item.edit.tabs.status.head": "Trạng thái", + "item.edit.tabs.status.labels.handle": "Handle", + "item.edit.tabs.status.labels.bundleName": "Bundle name", + "item.edit.tabs.status.labels.id": "ID tài liệu", + "item.edit.tabs.status.labels.itemPage": "Trang tài liệu", + "item.edit.tabs.status.labels.lastModified": "Chỉnh sửa lần cuối", + "item.edit.tabs.status.title": "Chỉnh sửa tài liệu - Trạng thái", + "item.edit.tabs.versionhistory.head": "Lịch sử phiên bản", + "item.edit.tabs.versionhistory.title": "Chỉnh sửa tài liệu - Lịch sử phiên bản", + "item.edit.tabs.versionhistory.under-construction": "Chưa thể chỉnh sửa hoặc tạo thêm phiên bản trên giao diện người dùng này.", + "item.edit.tabs.view.head": "Xem tài liệu", + "item.edit.tabs.view.title": "Chỉnh sửa tài liệu - Xem", + "item.edit.withdraw.cancel": "Hủy", + "item.edit.withdraw.confirm": "Ẩn", + "item.edit.withdraw.description": "Bạn có chắc chắn muốn ẩn tài liệu này khỏi kho lưu trữ?", + "item.edit.withdraw.error": "Đã có lỗi xảy ra trong khi thực hiện ẩn tài liệu này", + "item.edit.withdraw.header": "Ẩn tài liệu: {{ id }}", + "item.edit.withdraw.success": "Tài liệu này đã được ẩn thành công", + "item.listelement.badge": "Tài liệu", + "item.orcid.return": "Quay lại", + "item.page.name": "Tên", + "item.page.abstract": "Tóm tắt", + "item.page.author": "Tác giả", + "item.page.bitstreams.collapse": "Thu hẹp", + "item.page.bitstreams.view-more": "Hiển thị thêm", + "item.page.citation": "Trích dẫn", + "item.page.claim.button": "Nhận nhiệm vụ", + "item.page.claim.tooltip": "Nhận nhiệm vụ tài liệu này", + "item.page.collections": "Bộ sưu tập", + "item.page.collections.loading": "Đang tải…", + "item.page.collections.load-more": "Xem thêm", + "item.page.date": "Năm xuất bản", + "item.page.description": "Mô tả", + "item.page.edit": "Chỉnh sửa tài liệu này", + "item.page.files": "Tệp tin", + "item.page.filesection.description": "Mô tả:", + "item.page.filesection.download": "Tải xuống", + "item.page.filesection.view": "Xem trực tuyến", + "item.page.filesection.format": "Định dạng:", + "item.page.filesection.license.bundle": "Tập tin giấy phép", + "item.page.filesection.name": "Tên:", + "item.page.filesection.original.bundle": "Tập tin chính của tài liệu", + "item.page.filesection.size": "Dung lượng:", + "item.page.journal.search.title": "Bài viết trong tạp chí này", + "item.page.journal-issn": "ISSN", + "item.page.journal-title": "Nhan đề tạp chí", + "item.page.link.full": "Hiển thị chi tiết", + "item.page.link.simple": "Hiển thị đơn giản", + "item.page.orcid.title": "ORCID", + "item.page.orcid.tooltip": "Mở trang cài đặt ORCID", + "item.page.person.search.title": "Bài viết của tác giả này", + "item.page.publisher": "Nhà xuất bản", + "item.page.related-items.view-less": "Ẩn {{ amount }} tài liệu cuối", + "item.page.related-items.view-more": "Hiển thị thêm {{ amount }} tài liệu", + "item.page.relationships.isAuthorOfPublication": "Ấn phẩm", + "item.page.relationships.isJournalOfPublication": "Ấn phẩm", + "item.page.relationships.isOrgUnitOfPerson": "Tác giả", + "item.page.relationships.isOrgUnitOfProject": "Dự án nghiên cứu", + "item.page.return": "Quay lại", + "item.page.subject": "Từ khóa chủ đề", + "item.page.titleprefix": "Tài liệu:", + "item.page.uri": "URL", + "item.page.version.create": "Tạo phiên bản mới", + "item.page.version.hasDraft": "Không thể tạo phiên bản mới vì có một phiên bản đang trong tiến trình tải lên", + "item.page.volume-title": "Nhan đề tập", + "item.preview.dc.contributor.author": "Tác giả:", + "item.preview.dc.coverage.spatial": "Quyền hạn:", + "item.preview.dc.date.issued": "Năm xuất bản:", + "item.preview.dc.description.abstract": "Tóm tắt:", + "item.preview.dc.identifier": "Định danh:", + "item.preview.dc.identifier.doi": "DOI", + "item.preview.dc.identifier.isbn": "ISBN", + "item.preview.dc.identifier.other": "Định danh khác:", + "item.preview.dc.identifier.uri": "Định danh:", + "item.preview.dc.language.iso": "Ngôn ngữ:", + "item.preview.dc.relation.ispartof": "Tạp chí hoặc Ấn phẩm định kỳ", + "item.preview.dc.relation.issn": "ISSN", + "item.preview.dc.subject": "Chủ đề:", + "item.preview.dc.title": "Nhan đề:", + "item.preview.dc.title.alternative": "Viết tắt:", + "item.preview.dc.type": "Loại hình tài liệu:", + "item.preview.oaire.awardNumber": "ID quỹ:", + "item.preview.oaire.citation.issue": "Kỳ ấn phẩm", + "item.preview.oaire.citation.volume": "Tập", + "item.preview.oaire.fundingStream": "Dòng quỹ:", + "item.preview.person.familyName": "Họ:", + "item.preview.person.givenName": "Tên:", + "item.preview.person.identifier.orcid": "ORCID:", + "item.preview.project.funder.identifier": "Định danh nhà tài trợ:", + "item.preview.project.funder.name": "Nhà tài trợ:", + "item.search.results.head": "Kết quả tìm kiếm tài liệu", + "item.search.title": "Tìm kiếm tài liệu", + "item.select.confirm": "Xác nhận cái đã chọn", + "item.select.empty": "Không có tài liệu để hiển thị", + "item.select.table.author": "Tác giả", + "item.select.table.collection": "Bộ sưu tập", + "item.select.table.title": "Nhan đề", + "item.truncatable-part.show-less": "Thu hẹp", + "item.truncatable-part.show-more": "Xem thêm", + "item.version.create.modal.button.cancel": "Hủy", + "item.version.create.modal.button.cancel.tooltip": "Không thể tạo phiên bản mới", + "item.version.create.modal.button.confirm": "Tạo", + "item.version.create.modal.button.confirm.tooltip": "Tạo phiên bản mới", + "item.version.create.modal.form.summary.label": "Thông tin tổng quan", + "item.version.create.modal.form.summary.placeholder": "Thêm thông tin mô tả cho phiên bản mới", + "item.version.create.modal.header": "Phiên bản mới", + "item.version.create.modal.submitted.header": "Tạp phiên bản mới…", + "item.version.create.modal.submitted.text": "Phiên bản mới đang được tạo. Có thể mất một chút thời gian để hoàn tất nếu tài liệu có nhiều mối quan hệ.", + "item.version.create.modal.text": "Tạo phiên bản mới cho tài liệu này", + "item.version.create.modal.text.startingFrom": "bắt đầu từ phiên bản {{version}}", + "item.version.create.notification.failure": "Phiên bản mới chưa được tạo", + "item.version.create.notification.inProgress": "Không thể tạo phiên bản mới vì có một phiên bản đang trong tiến trình tải lên", + "item.version.create.notification.success": "Phiên bản mới đã được tạo với mã số phiên bản là {{version}}", + "item.version.delete.modal.button.cancel": "Hủy", + "item.version.delete.modal.button.cancel.tooltip": "Không xóa phiên bản này", + "item.version.delete.modal.button.confirm": "Xóa", + "item.version.delete.modal.button.confirm.tooltip": "Xóa phiên bản này", + "item.version.delete.modal.header": "Xóa phiên bản", + "item.version.delete.modal.text": "Bạn có muốn xóa phiên bản {{version}}?", + "item.version.delete.notification.failure": "Phiên bản {{version}} chưa bị xóa", + "item.version.delete.notification.success": "Phiên bản {{version}} đã được xóa", + "item.version.edit.notification.failure": "Thông tin tổng quan của phiên bản {{version}} chưa được thay đổi", + "item.version.edit.notification.success": "Thông tin tổng quan của phiên bản {{version}} đã được thay đổi", + "item.version.history.empty": "Chưa có phiên bản nào khác của tài liệu này.", + "item.version.history.head": "Lịch sử phiên bản", + "item.version.history.return": "Quay lại", + "item.version.history.selected": "Phiên bản đã chọn", + "item.version.history.selected.alert": "Hiện tại bạn đang xem phiên bản {{version}} của tài liệu này.", + "item.version.history.table.action.deleteVersion": "Xóa phiên bản", + "item.version.history.table.action.discardSummary": "Hủy chỉnh sửa", + "item.version.history.table.action.editSummary": "Chỉnh sửa thông tin tổng quan", + "item.version.history.table.action.editWorkspaceItem": "Chỉnh sửa biểu ghi đang biên mục", + "item.version.history.table.action.hasDraft": "Không thể tạo phiên bản mới vì có một phiên bản đang trong tiến trình tải lên", + "item.version.history.table.action.newVersion": "Tạo phiên bản mới từ tài liệu này", + "item.version.history.table.action.saveSummary": "Lưu", + "item.version.history.table.actions": "Hành động", + "item.version.history.table.date": "Thời gian xuất bản", + "item.version.history.table.editor": "Người biên tập", + "item.version.history.table.item": "Tài liệu", + "item.version.history.table.summary": "Tóm tắt", + "item.version.history.table.version": "Phiên bản", + "item.version.history.table.workflowItem": "Đang kiểm duyệt", + "item.version.history.table.workspaceItem": "Đang biên mục", + "item.version.notice": "Đây không phải là phiên bản mới nhất của tài liệu này. Phiên bản mới nhất có thể xem tại đây.", + + "itemtemplate.edit.metadata.add-button": "Add", "itemtemplate.edit.metadata.discard-button": "Discard", @@ -1351,1317 +1351,1317 @@ "journal.listelement.badge": "Tạp chí", - "journal.page.description": "Mô tả", - "journal.page.edit": "Chỉnh sửa tài liệu này", - "journal.page.editor": "Tổng biên tập", - "journal.page.issn": "ISSN", - "journal.page.publisher": "Nhà xuất bản", - "journal.page.titleprefix": "Tạp chí:", - "journal.search.results.head": "Kết quả tìm kiếm tạp chí", - "journal.search.title": "Tìm kiếm tạp chí", - "journalissue.listelement.badge": "Kỳ của tạp chí", - "journalissue.page.description": "Mô tả", - "journalissue.page.abstract": "Tóm tắt", - "journalissue.page.edit": "Chỉnh sửa tài liệu này", - "journalissue.page.issuedate": "Ngày xuất bản", - "journalissue.page.journal-issn": "ISSN", - "journalissue.page.journal-title": "Nhan đề tạp chí", - "journalissue.page.keyword": "Từ khóa chủ đề", - "journalissue.page.number": "Số lượng", - "journalissue.page.titleprefix": "Kỳ của tạp chí:", - "journal-relationships.search.results.head": "Kết quả tìm kiếm tạp chí", - "journalvolume.listelement.badge": "Tập của tạp chí", - "journalvolume.page.description": "Mô tả", - "journalvolume.page.edit": "Chỉnh sửa tài liệu này", - "journalvolume.page.issuedate": "Ngày xuất bản", - "journalvolume.page.titleprefix": "Tập của tạp chí:", - "journalvolume.page.volume": "Tập", - - - "iiif.listelement.badge": "Phương tiện hình ảnh", - "iiif.page.description": "Mô tả:", - "iiif.page.doi": "Đường dẫn cố định:", - "iiif.page.issue": "Vấn đề:", - "iiif.page.titleprefix": "Hình ảnh:", - "iiifsearchable.listelement.badge": "Phương tiện biểu ghi", - "iiifsearchable.page.description": "Mô tả:", - "iiifsearchable.page.doi": "Đường dẫn cố định:", - "iiifsearchable.page.issue": "Vấn đề:", - "iiifsearchable.page.titleprefix": "Tài liệu:", - "iiifviewer.fullscreen.notice": "Sử dụng chế độ toàn màn hình để xem tốt hơn.", - - "loading.bitstream": "Đang tải tệp tin...", - "loading.bitstreams": "Đang tải tệp tin...", - "loading.browse-by": "Đang tải tài liệu...", - "loading.browse-by-page": "Đang tải trang...", - "loading.collection": "Đang tải bộ sưu tập...", - "loading.collections": "Đang tải bộ sưu tập...", - "loading.community": "Đang tải đơn vị...", - "loading.content-source": "Đang tải nguồn nội dung...", - "loading.default": "Đang tải...", - "loading.item": "Đang tải tài liệu...", - "loading.items": "Đang tải tài liệu...", - "loading.mydspace-results": "Đang tải tài liệu...", - "loading.objects": "Đang tải...", - "loading.recent-submissions": "Đang tải các tài liệu mới gần đây...", - "loading.search-results": "Đanh tải kết quả tìm kiếm...", - "loading.sub-collections": "Đang tải bộ sưu tập con...", - "loading.sub-communities": "Đang tải đơn vị con...", - "loading.top-level-communities": "Đang tải các đơn vị lớn...", - - "login.breadcrumbs": "Đăng nhập", - "login.form.email": "Địa chỉ email", - "login.form.forgot-password": "Có phải bạn quên mật khẩu?", - "login.form.header": "Vui lòng đăng nhập vào DSpace", - "login.form.new-user": "Bạn là người dùng mới? \n Vui lòng nhấp vào đây để đăng kí.", - "login.form.oidc": "Đăng nhập với OIDC", - "login.form.orcid": "Đăng nhập với ORCID", - "login.form.or-divider": "hoặc", - "login.form.password": "Mật khẩu", - "login.form.shibboleth": "Đăng nhập bằng Shibboleth", - "login.form.submit": "Đăng nhập", - "login.title": "Đăng nhập", - - "logout.form.header": "Đăng xuất khỏi DSpace", - "logout.form.submit": "Đăng xuất", - "logout.title": "Đăng xuất", - - "menu.header.admin": "Quản trị", - "menu.header.admin.description": "Menu quản trị", - "menu.header.image.logo": "Logo của kho lưu trữ", - - "menu.section.access_control": "Người dùng và nhóm người dùng", - "menu.section.access_control_authorizations": "Chính sách phân quyền", - "menu.section.access_control_groups": "Nhóm người dùng", - "menu.section.access_control_people": "Người dùng", - "menu.section.admin_search": "Tìm kiếm quản trị", - "menu.section.browse_community": "Đơn vị này", - "menu.section.browse_community_by_author": "Tác giả", - "menu.section.browse_community_by_issue_date": "Năm xuất bản", - "menu.section.browse_community_by_title": "Nhan đề", - "menu.section.browse_global": "Duyệt tìm", - "menu.section.browse_global_by_author": "Tác giả", - "menu.section.browse_global_by_dateissued": "Năm xuất bản", - "menu.section.browse_global_by_subject": "Chủ đề", - "menu.section.browse_global_by_title": "Nhan đề", - "menu.section.browse_global_communities_and_collections": "Đơn vị & Bộ sưu tập", - "menu.section.control_panel": "Bảng điều khiển", - "menu.section.curation_task": "Kiểm tra dữ liệu", - "menu.section.edit": "Chỉnh sửa", - "menu.section.edit_collection": "Bộ sưu tập", - "menu.section.edit_community": "Đơn vị", - "menu.section.edit_item": "Tài liệu", - "menu.section.export": "Trích xuất", - "menu.section.export_batch": "Xuất dữ liệu (ZIP)", - "menu.section.export_collection": "Bộ sưu tập", - "menu.section.export_community": "Đơn vị", - "menu.section.export_item": "Tài liệu", - "menu.section.export_metadata": "Siêu dữ liệu", - "menu.section.health": "Kiểm tra hệ thống", - "menu.section.icon.access_control": "Phần menu của mục Người dùng và Nhóm người dùng", - "menu.section.icon.admin_search": "Phần menu của mục Tìm kiếm quản trị", - "menu.section.icon.control_panel": "Phần menu của mục Bảng điều khiển", - "menu.section.icon.curation_tasks": "Phần menu của Nhiệm vụ kiểm tra", - "menu.section.icon.edit": "Phần menu của mục Chỉnh sửa", - "menu.section.icon.export": "Phần menu của mục Trích xuất dữ liệu", - "menu.section.icon.find": "Phần menu của mục Tìm kiếm", - "menu.section.icon.health": "Phần menu của mục Kiểm tra hệ thống", - "menu.section.icon.import": "Phần menu của mục Nhập dữ liệu", - "menu.section.icon.new": "Phần menu của mục Tạo mới", - "menu.section.icon.pin": "Ghim thanh quản trị", - "menu.section.icon.processes": "Phần menu của mục Tiến trình", - "menu.section.icon.registries": "Phần menu của mục Thống số chung", - "menu.section.icon.statistics_task": "Phần menu của mục Nhiệm vụ báo cáo thống kê", - "menu.section.icon.unpin": "Bỏ ghim thanh quản trị", - "menu.section.icon.workflow": "Phần menu của mục Quản trị luồng công việc", - "menu.section.import": "Nhập dữ liệu", - "menu.section.import_batch": "Nhập liệu theo lô (ZIP)", - "menu.section.import_metadata": "Siêu dữ liệu", - "menu.section.new": "Tạo mới", - "menu.section.new_collection": "Bộ sưu tập", - "menu.section.new_community": "Đơn vị", - "menu.section.new_item": "Tài liệu", - "menu.section.new_item_version": "Phiên bản tài liệu", - "menu.section.new_process": "Tiến trình", - "menu.section.pin": "Ghim thanh quản trị", - "menu.section.policies_metadata": "Chính sách phân quyền", - "menu.section.processes": "Tiến trình", - "menu.section.registries": "Thông số chung", - "menu.section.registries_format": "Định dạng tệp tin số", - "menu.section.registries_metadata": "Trường dữ liệu", - "menu.section.statistics": "Báo cáo thống kê", - "menu.section.statistics_admin": "Báo cáo thống kê", - "menu.section.statistics_admin_metadata": "Báo cáo thống kê", - "menu.section.statistics_task": "Nhiệm vụ báo cáo thống kê", - "menu.section.toggle.access_control": "Phần chuyển đổi Người dùng và Nhóm người dùng", - "menu.section.toggle.control_panel": "Phần chuyển đổi Bảng điều khiển", - "menu.section.toggle.curation_task": "Phần chuyển đổi Kiểm tra dữ liệu", - "menu.section.toggle.edit": "Phần chuyển đổi Chỉnh sửa", - "menu.section.toggle.export": "Phần chuyển đổi Trích xuất dữ liệu", - "menu.section.toggle.find": "Phần chuyển đổi Tìm kiếm", - "menu.section.toggle.import": "Phần chuyển đổi Nhập dữ liệu", - "menu.section.toggle.new": "Phần chuyển đổi Tạo mới", - "menu.section.toggle.registries": "Phần chuyển đổi thông số chung", - "menu.section.toggle.statistics_task": "Phần chuyển đổi Nhiệm vụ Báo cáo thống kê", - "menu.section.unpin": "Bỏ ghim thanh quản trị", - "menu.section.workflow": "Quản trị dòng công việc", - - "metadata-export-search.submit.error": "Xảy ra lỗi trong quá trình xuất dữ liệu", - "metadata-export-search.submit.success": "Quá trình xuất dữ liệu đã được khởi chạy thành công", - "metadata-export-search.tooltip": "Xuất kết quả tìm kiếm ra CSV", - - "mydspace.breadcrumbs": "Trang cá nhân", - "mydspace.messages.controller-help": "Chọn tùy chọn này để gửi tin nhắn tới người biên mục tài liệu.", - "mydspace.messages.description-placeholder": "Thêm tin nhắn của bạn tại đây...", - "mydspace.messages.hide-msg": "Ẩn tin nhắn", - "mydspace.messages.mark-as-read": "Đánh dấu đã đọc", - "mydspace.messages.mark-as-unread": "Đánh dấu chưa đọc", - "mydspace.messages.no-content": "Không có nội dung.", - "mydspace.messages.no-messages": "Không có tin nhắn nào.", - "mydspace.messages.send-btn": "Gửi", - "mydspace.messages.show-msg": "Hiển thị tin nhắn", - "mydspace.messages.subject-placeholder": "Chủ đề...", - "mydspace.messages.submitter-help": "Chọn tùy chọn này để gửi tin nhắn tới người quản trị.", - "mydspace.messages.title": "Tin nhắn", - "mydspace.messages.to": "Tới", - "mydspace.new-submission": "Tạo tài liệu mới", - "mydspace.new-submission-external": "Nhập thông tin mô tả từ nguồn bên ngoài", - "mydspace.new-submission-external-short": "Nhập thông tin mô tả", - "mydspace.results.head": "Tài liệu của tôi", - "mydspace.results.no-abstract": "Không có tóm tắt", - "mydspace.results.no-authors": "Không có tác giả", - "mydspace.results.no-collections": "Không có bộ sưu tập", - "mydspace.results.no-date": "Không có thời gian xuất bản", - "mydspace.results.no-files": "Không có tệp đính kèm", - "mydspace.results.no-results": "Không có tài liệu để hiển thị", - "mydspace.results.no-title": "Không có nhan đề", - "mydspace.results.no-uri": "Không có URL", - "mydspace.search-form.placeholder": "Tìm kiếm trong trang cá nhân của tôi...", - "mydspace.show.workflow": "Tất cả nhiệm vụ", - "mydspace.show.workspace": "Tài liệu của tôi", - "mydspace.status.archived": "Đã lưu trữ", - "mydspace.status.validation": "Đang kiểm tra", - "mydspace.status.waiting-for-controller": "Đợi nhận nhiệm vụ", - "mydspace.status.workflow": "Đang kiểm duyệt", - "mydspace.status.workspace": "Đang biên mục", - "mydspace.title": "Trang cá nhân", - "mydspace.upload.upload-failed": "Có lỗi xảy ra khi tạo tài liệu mới. Vui lòng xác minh nội dung đã tải lên trước khi thử lại.", - "mydspace.upload.upload-failed-manyentries": "Không thể xử lý tệp tin. Có quá nhiều mục trong khi hệ thống chỉ cho phép một mục trong tệp tin.", - "mydspace.upload.upload-failed-moreonefile": "Không thể xử lý yêu cầu. Chỉ cho phép một tệp tin duy nhất.", - "mydspace.upload.upload-multiple-successful": "Đã tạo {{qty}} mục không gian làm việc mới.", - "mydspace.view-btn": "Xem chi tiết", - - "nav.browse.header": "Tất cả DSpace", - "nav.community-browse.header": "Theo Đơn vị", - "nav.language": "Chuyển ngôn ngữ", - "nav.login": "Đăng nhập", - "nav.logout": "Menu Hồ sơ cá nhân và Đăng xuất", - "nav.main.description": "Thanh điều hướng chính", - "nav.mydspace": "Trang cá nhân", - "nav.profile": "Hồ sơ cá nhân", - "nav.search": "Tìm kiếm", - "nav.statistics.header": "Báo cáo thống kê", - "nav.stop-impersonating": "Ngừng giả danh Người dùng", - "nav.toggle": "Điều hướng chuyển", - "nav.user.description": "Thanh hồ sơ người dùng", - "nav.user-profile-menu-and-logout": "Trình đơn Hồ sơ cá nhân và Đăng xuất", - - "none.listelement.badge": "Tài liệu", - - "orgunit.listelement.badge": "Đơn vị\/Tổ chức", - "orgunit.listelement.no-title": "Không có nhan đề", - "orgunit.page.city": "Thành phố", - "orgunit.page.country": "Quốc gia", - "orgunit.page.dateestablished": "Ngày thành lập", - "orgunit.page.description": "Mô tả", - "orgunit.page.edit": "Chỉnh sửa tài liệu", - "orgunit.page.id": "ID", - "orgunit.page.titleprefix": "Đơn vị\/Tổ chức", - - "pagination.next.button": "Tiếp theo", - "pagination.next.button.disabled.tooltip": "Không còn trang kết quả khác", - "pagination.options.description": "Tùy chọn Phân trang", - "pagination.previous.button": "Quay lại", - "pagination.results-per-page": "Số kết quả\/trang", - "pagination.showing.detail": "{{ range }} của tổng số {{ total }} kết quả", - "pagination.showing.label": "Đang hiển thị ", - "pagination.sort-direction": "Tùy chọn sắp xếp", - - "person.listelement.badge": "Nhà nghiên cứu", - "person.listelement.no-title": "Không tìm thấy tên", - "person.orcid.registry.auth": "Được phép qua ORCID ", - "person.orcid.registry.queue": "Đang xếp hàng đợi đăng ký ORCID", - "person.orcid.sync.setting": "Thiết lập đồng bộ hóa với ORCID", - "person.page.birthdate": "Ngày sinh", - "person.page.edit": "Chỉnh sửa tài liệu", - "person.page.email": "Email", - "person.page.firstname": "Tên", - "person.page.jobtitle": "Chức vụ", - "person.page.abtract": "Tiểu sử", - "person.page.description": "Mô tả", - "person.page.lastname": "Họ", - "person.page.link.full": "Hiển thị chi tiết", - "person.page.name": "Tên", - "person.page.orcid": "ORCID", - "person.page.orcid.create": "Tạo một ID trên ORCID", - "person.page.orcid.funding-preferences": "Quỹ ưa thích", - "person.page.orcid.grant-authorizations": "Cấp quyền", - "person.page.orcid.granted-authorizations": "Quyền đã cấp", - "person.page.orcid.link": "Liên kết với ID ORCID", - "person.page.orcid.link.error.message": "Đã xảy ra lỗi khi kết nối hồ sơ với ORCID. Nếu sự cố vẫn tiếp tục xảy ra vui lòng liên hệ với quản trị viên.", - "person.page.orcid.link.processing": "Đang kết nối hồ sơ tới ORCID…", - "person.page.orcid.missing-authorizations": "Thiếu quyền", - "person.page.orcid.missing-authorizations-message": "Những quyền sau đang bị thiếu:", - "person.page.orcid.no-missing-authorizations-message": "Tuyệt! Ô này đang trống vì vậy bạn đã được cấp tất cả các quyền truy cập để sử dụng tất cả các chức năng do tổ chức của bạn cung cấp.", - "person.page.orcid.no-orcid-message": "Chưa có ID ORCID nào được liên kết. Bạn có thể click vào nút dưới đây để liên kết hồ sơ này với một tài khoản ORCID.", - "person.page.orcid.orcid-not-linked-message": "ID ORCID của hồ sơ này ({{ orcid }}) chưa được kết nối với tài khoản trên trang ORCID hoặc kết nối đã hết hạn.", - "person.page.orcid.profile-preferences": "Tham số của hồ sơ", - "person.page.orcid.publications-preferences": "Tham số của ấn phẩm", - "person.page.orcid.remove-orcid-message": "Nếu bạn cần xóa ORCID của bạn vui lòng liên hệ với quản trị viên.", - "person.page.orcid.save.preference.changes": "Cập nhật cài đặt", - "person.page.orcid.scope.activities-update": "Thêm\/cập nhật các hoạt động nghiên cứu của bạn", - "person.page.orcid.scope.authenticate": "Lấy ID ORCID của bạn", - "person.page.orcid.scope.person-update": "Thêm\/cập nhật thông tin cá nhân của bạn", - "person.page.orcid.scope.read-limited": "Thiết lập để cho phép Các bên Tin cậy (Trusted Parties) có khả năng đọc thông tin của bạn ", - "person.page.orcid.sync-fundings.all": "Tất cả quỹ", - "person.page.orcid.sync-fundings.disabled": "Đã ngừng kích hoạt", - "person.page.orcid.sync-fundings.mine": "Quỹ của tôi", - "person.page.orcid.sync-fundings.my_selected": "Quỹ đã chọn", - "person.page.orcid.synchronization-mode": "Chế độ đồng bộ", - "person.page.orcid.synchronization-mode.batch": "Theo lô", - "person.page.orcid.synchronization-mode.label": "Chế độ đồng bộ", - "person.page.orcid.synchronization-mode.manual": "Thủ công", - "person.page.orcid.synchronization-mode-funding-message": "Chọn gửi\/không gửi các thực thể dự án của bạn đến danh sách các quỹ tài trợ trong bản ghi ORCID của bạn hay không.", - "person.page.orcid.synchronization-mode-message": "Vui lòng chọn phương thức đồng bộ hóa với ORCID. Các tùy chọn bao gồm \"Thủ công\" (bạn phải gửi dữ liệu của mình tới ORCID theo cách thủ công) hoặc \"Tự động\" (hệ thống sẽ gửi dữ liệu của bạn tới ORCID thông qua tập lệnh đã lên lịch).", - "person.page.orcid.synchronization-mode-profile-message": "Chọn gửi\/ không gửi thông tin tiểu sử hoặc số định danh cá nhân tới hồ sơ ORCID của bạn.", - "person.page.orcid.synchronization-mode-publication-message": "Chọn gửi\/ không gửi các thực thể Ấn phẩm tới danh sách các tác phẩm trong biểu ghi ORCID của bạn.", - "person.page.orcid.synchronization-settings-update.error": "Cập nhật cài đặt đồng bộ hóa không thành công", - "person.page.orcid.synchronization-settings-update.success": "Cài đặt đồng bộ hóa đã được cập nhật thành công", - "person.page.orcid.sync-profile.affiliation": "Tổ chức", - "person.page.orcid.sync-profile.biographical": "Dữ liệu sinh trắc học", - "person.page.orcid.sync-profile.education": "Giáo dục", - "person.page.orcid.sync-profile.identifiers": "Định danh", - "person.page.orcid.sync-publications.all": "Tất cả ấn phẩm", - "person.page.orcid.sync-publications.disabled": "Đã ngừng kích hoạt", - "person.page.orcid.sync-publications.mine": "Ấn phẩm của tôi", - "person.page.orcid.sync-publications.my_selected": "Ấn phẩm đã chọn", - "person.page.orcid.sync-queue.description.affiliation": "Tổ chức", - "person.page.orcid.sync-queue.description.country": "Quốc gia", - "person.page.orcid.sync-queue.description.education": "Giáo dục", - "person.page.orcid.sync-queue.description.external_ids": "ID ngoài", - "person.page.orcid.sync-queue.description.keywords": "Từ khóa", - "person.page.orcid.sync-queue.description.other_names": "Tên khác", - "person.page.orcid.sync-queue.description.qualification": "Trình độ chuyên môn", - "person.page.orcid.sync-queue.description.researcher_urls": "URL nhà nghiên cứu", - "person.page.orcid.sync-queue.discard": "Hủy thay đổi và không đồng bộ với trang ORCID", - "person.page.orcid.sync-queue.discard.error": "Việc loại bỏ biểu ghi trong danh sách chờ của ORCID đã thất bại", - "person.page.orcid.sync-queue.discard.success": "Biểu ghi trong danh sách chờ của ORCID đã được hủy bỏ thành công", - "person.page.orcid.sync-queue.empty-message": "Danh sách chờ ORCID trống", - "person.page.orcid.sync-queue.send": "Đồng bộ với trang ORCID", - "person.page.orcid.sync-queue.send.bad-request-error": "Đẩy dữ liệu lên ORCID không thành công vì tài nguyên này không hợp lệ", - "person.page.orcid.sync-queue.send.conflict-error": "Đẩy dữ liệu lên ORCID không thành công bởi vì tài nguyên này đã có trên trang ORCID", - "person.page.orcid.sync-queue.send.error": "Đẩy dữ liệu lên ORCID không thành công", - "person.page.orcid.sync-queue.send.not-found-warning": "Tài nguyên không còn tồn tại trên ORCID.", - "person.page.orcid.sync-queue.send.success": "Đẩy dữ liệu lên ORCID thành công", - "person.page.orcid.sync-queue.send.unauthorized-error.content": "Nhấp vào đây<\/a> để cấp lại các quyền bắt buộc. Nếu vấn đề vẫn còn tồn tại vui lòng liên hệ quản trị viên.", - "person.page.orcid.sync-queue.send.unauthorized-error.title": "Đẩy dữ liệu lên ORCID không thành công do tài khoản của bạn không đủ các quyền cần thiết.", - "person.page.orcid.sync-queue.send.validation-error": "Dữ liệu bạn muốn đồng bộ với ORCID là dữ liệu không hợp lệ", - "person.page.orcid.sync-queue.send.validation-error.amount-currency.required": "Đơn vị tiền tệ là bắt buộc", - "person.page.orcid.sync-queue.send.validation-error.country.invalid": "2 ký tự mã quốc gia theo ISO 3166 là không hợp lệ", - "person.page.orcid.sync-queue.send.validation-error.disambiguated-organization.required": "Cần có số định danh (ID) để phân biệt giữa các tổ chức. ID được hỗ trợ là GRID Ringgold LEI và số định dang Cơ quan đăng ký Crossref Funder", - "person.page.orcid.sync-queue.send.validation-error.disambiguated-organization.value-required": "Định danh của tổ chức yêu cầu phải có một giá trị", - "person.page.orcid.sync-queue.send.validation-error.disambiguation-source.invalid": "Nguồn của một trong các số định danh của tổ chức không hợp lệ. Các nguồn được hỗ trợ là RINGGOLD GRID LEI và FUNDREF", - "person.page.orcid.sync-queue.send.validation-error.disambiguation-source.required": "Phải có một nguồn cho định danh của tổ chức", - "person.page.orcid.sync-queue.send.validation-error.external-id.required": "Tài nguyên được gửi yêu cầu phải có ít nhất một định danh", - "person.page.orcid.sync-queue.send.validation-error.funder.required": "Nhà tài trợ là bắt buộc", - "person.page.orcid.sync-queue.send.validation-error.organization.address-required": "Tổ chức này yêu cầu phải có địa chỉ", - "person.page.orcid.sync-queue.send.validation-error.organization.city-required": "Địa chỉ của tổ chức này phải là một thành phố", - "person.page.orcid.sync-queue.send.validation-error.organization.country-required": "Địa chỉ của tổ chức này phải là một mã quốc gia bao gồm 2 ký tự theo ISO 3166", - "person.page.orcid.sync-queue.send.validation-error.organization.name-required": "Tên của tổ chức là bắt buộc", - "person.page.orcid.sync-queue.send.validation-error.organization.required": "Yêu cầu phải có tổ chức", - "person.page.orcid.sync-queue.send.validation-error.publication.date-invalid": "Năm xuất bản phải là năm sau năm 1900", - "person.page.orcid.sync-queue.send.validation-error.start-date.required": "Ngày bắt đầu là bắt buộc", - "person.page.orcid.sync-queue.send.validation-error.title.required": "Nhan đề là bắt buộc", - "person.page.orcid.sync-queue.send.validation-error.type.required": "Trường dc.type là bắt buộc", - "person.page.orcid.sync-queue.table.header.action": "Hành động", - "person.page.orcid.sync-queue.table.header.description": "Mô tả", - "person.page.orcid.sync-queue.table.header.type": "Loại hình tài liệu", - "person.page.orcid.sync-queue.tooltip.affiliation": "Tổ chức", - "person.page.orcid.sync-queue.tooltip.country": "Quốc gia", - "person.page.orcid.sync-queue.tooltip.delete": "Loại bỏ mục này khỏi trang ORCID", - "person.page.orcid.sync-queue.tooltip.education": "Giáo dục", - "person.page.orcid.sync-queue.tooltip.external_ids": "Định danh ", - "person.page.orcid.sync-queue.tooltip.insert": "Thêm mục mới trong ORCID", - "person.page.orcid.sync-queue.tooltip.keywords": "Từ khóa", - "person.page.orcid.sync-queue.tooltip.other_names": "Tên khác", - "person.page.orcid.sync-queue.tooltip.project": "Dự án", - "person.page.orcid.sync-queue.tooltip.publication": "Ấn phẩm", - "person.page.orcid.sync-queue.tooltip.qualification": "Trình độ chuyên môn", - "person.page.orcid.sync-queue.tooltip.researcher_urls": "URL nhà nghiên cứu", - "person.page.orcid.sync-queue.tooltip.update": "Cập nhật mục này trên trang ORCID", - "person.page.orcid.unlink": "Ngắt kết nối khỏi ORCID", - "person.page.orcid.unlink.error": "Đã xảy ra lỗi khi ngắt kết nối giữa hồ sơ và ORCID. Vui lòng thử lại.", - "person.page.orcid.unlink.processing": "Đang xử lý…", - "person.page.orcid.unlink.success": "Đã ngắt kết nối giữa hồ sơ nhà nghiên cứu và trang ORCID thành công", - "person.page.staffid": "ID nhân viên", - "person.page.titleprefix": "Nhà nghiên cứu", - "person.search.results.head": "Kết quả tìm kiếm Nhà nghiên cứu", - "person.search.title": "Tìm kiếm Nhà nghiên cứu", - "person-relationships.search.results.head": "Kết quả tìm kiếm Tác giả\/Nhà nghiên cứu", - - "process.bulk.delete.error.body": "Không thể xóa tiến trình có ID {{ processId}}. Các tiến trình còn lại sẽ tiếp tục bị xóa.", - "process.bulk.delete.error.head": "Đã xảy ra lỗi khi xóa tiến trình", - "process.detail.actions": "Hành động", - "process.detail.arguments": "Tham số", - "process.detail.arguments.empty": "Tiến trình này không chứa bất kì tham số nào", - "process.detail.back": "Quay lại", - "process.detail.create": "Tạo tiến trình tương tự", - "process.detail.delete.body": "Bạn có chắc chắn muốn xóa tiến trình hiện tại?", - "process.detail.delete.button": "Xóa tiến trình", - "process.detail.delete.cancel": "Hủy", - "process.detail.delete.confirm": "Xóa tiến trình", - "process.detail.delete.error": "Đã xảy ra sự cố trong khi xóa tiến trình", - "process.detail.delete.header": "Xóa tiến trình", - "process.detail.delete.success": "Tiến trình đã được xóa thành công.", - "process.detail.end-time": "Thời gian kết thúc", - "process.detail.logs.button": "Tìm kiếm đầu ra của tiến trình", - "process.detail.logs.loading": "Đang tìm kiếm", - "process.detail.logs.none": "Tiến trình này không có đầu ra nào", - "process.detail.output": "Đầu ra của tiến trình", - "process.detail.output-files": "Tệp tin đầu ra", - "process.detail.output-files.empty": "Tiến trình này không chứa tệp tin đầu ra nào", - "process.detail.script": "Tập lệnh", - "process.detail.start-time": "Thời gian bắt đầu", - "process.detail.status": "Trạng thái", - "process.detail.title": "Tiến trình: {{ id }} - {{ name }}", - "process.new.breadcrumbs": "Tạo tiến trình mới", - "process.new.cancel": "Hủy", - "process.new.header": "Tạo tiến trình mới", - "process.new.notification.error.content": "Đã có lỗi xảy ra trong khi tạo tiến trình", - "process.new.notification.error.title": "Lỗi", - "process.new.notification.success.content": "Tiến trình đã được thực hiện thành công", - "process.new.notification.success.title": "Thành công", - "process.new.parameter.file.required": "Vui lòng chọn một tệp tin", - "process.new.parameter.file.upload-button": "Chọn tệp tin...", - "process.new.parameter.required.missing": "Các tham số bắt buộc sau đang bị thiếu:", - "process.new.parameter.string.required": "Giá trị tham số là bắt buộc", - "process.new.parameter.type.file": "tệp tin", - "process.new.parameter.type.value": "giá trị", - "process.new.select-parameters": "Tham số", - "process.new.select-script": "Tập lệnh", - "process.new.select-script.placeholder": "Chọn một tập lệnh...", - "process.new.select-script.required": "Tập lệnh là bắt buộc", - "process.new.submit": "Lưu", - "process.new.title": "Tạo tiến trình mới", - "process.overview.breadcrumbs": "Tiến trình tổng quan", - "process.overview.delete": "Xóa {{count}} tiến trình", - "process.overview.delete.body": "Bạn có chắc chắn muốn xóa {{count}} tiến trình?", - "process.overview.delete.clear": "Xóa các tiến trình đã chọn", - "process.overview.delete.header": "Xóa", - "process.overview.new": "Tạo mới", - "process.overview.table.actions": "Hành động", - "process.overview.table.finish": "Thời gian kết thúc", - "process.overview.table.id": "ID tiến trình", - "process.overview.table.name": "Tên", - "process.overview.table.start": "Thời gian bắt đầu", - "process.overview.table.status": "Trạng thái", - "process.overview.table.user": "Người dùng", - "process.overview.title": "Tổng quan tiến trình", - - "profile.breadcrumbs": "Cập nhật hồ sơ", - "profile.card.identify": "Hồ sơ định danh", - "profile.card.researcher": "Định danh", - "profile.card.security": "Bảo mật", - "profile.form.submit": "Lưu", - "profile.groups.head": "Nhóm quyền của bạn", - "profile.head": "Cập nhật hồ sơ", - "profile.metadata.form.error.firstname.required": "Yêu cầu nhập Tên của người dùng", - "profile.metadata.form.error.lastname.required": "Yêu cầu nhập Họ của người dùng", - "profile.metadata.form.label.email": "Địa chỉ email", - "profile.metadata.form.label.firstname": "Tên", - "profile.metadata.form.label.language": "Ngôn ngữ", - "profile.metadata.form.label.lastname": "Họ", - "profile.metadata.form.label.phone": "Số điện thoại liên hệ", - "profile.metadata.form.notifications.success.content": "Cập nhật hồ sơ thành công .", - "profile.metadata.form.notifications.success.title": "Lưu hồ sơ", - "profile.notifications.warning.no-changes.content": "Không có thay đổi nào trên hồ sơ của bạn.", - "profile.notifications.warning.no-changes.title": "Không thay đổi", - "profile.security.form.error.matching-passwords": "Mật khẩu không khớp.", - "profile.security.form.info": "Nhập vào mật khẩu mới và xác nhận mật khẩu vào ô phía dưới. Độ dài tối thiểu của mật khẩu là 6 ký tự.", - "profile.security.form.label.current-password": "Mật khẩu hiện tại", - "profile.security.form.label.password": "Mật khẩu", - "profile.security.form.label.passwordrepeat": "Nhập lại mật khẩu để xác nhận", - "profile.security.form.notifications.error.change-failed": "Đã xảy ra lỗi khi thay đổi mật khẩu. Vui lòng kiểm tra lại tính chính xác của mật khẩu hiện tại.", - "profile.security.form.notifications.error.general": "Vui lòng điền vào các trường bắt buộc của biểu mẫu bảo mật.", - "profile.security.form.notifications.error.not-same": "Mật khẩu được cung cấp không giống nhau.", - "profile.security.form.notifications.error.title": "Thay đổi mật khẩu không thành công", - "profile.security.form.notifications.success.content": "Thay đổi mật khẩu thành công.", - "profile.security.form.notifications.success.title": "Đã lưu mật khẩu", - "profile.special.groups.head": "Phân quyền cho các nhóm đặc biệt mà bạn thuộc về", - "profile.title": "Cập nhật hồ sơ", - - "project.listelement.badge": "Dự án nghiên cứu", - "project.page.contributor": "Người tham gia", - "project.page.description": "Mô tả", - "project.page.edit": "Chỉnh sửa tài liệu", - "project.page.expectedcompletion": "Dự kiến hoàn thành", - "project.page.funder": "Nhà tài trợ", - "project.page.id": "ID", - "project.page.keyword": "Từ khóa", - "project.page.status": "Trạng thái", - "project.page.titleprefix": "Dự án nghiên cứu:", - "project.search.results.head": "Kết quả tìm kiếm dự án", - "project-relationships.search.results.head": "Kết quả tìm kiếm dự án", - - "publication.listelement.badge": "Ấn phẩm", - "publication.page.description": "Mô tả", - "publication.page.edit": "Chỉnh sửa tài liệu", - "publication.page.journal-issn": "ISSN tạp chí", - "publication.page.journal-title": "Nhan đề tạp chí", - "publication.page.publisher": "Nhà xuất bản", - "publication.page.titleprefix": "Ấn phẩm: ", - "publication.page.volume-title": "Nhan đề tập", - "publication.search.results.head": "Kết quả tìm kiếm ấn phẩm", - "publication.search.title": "Tìm kiếm ấn phẩm", - "publication-relationships.search.results.head": "Kết quả tìm kiếm ấn phẩm", - - "media-viewer.next": "Tiếp theot", - "media-viewer.playlist": "Danh sách phát", - "media-viewer.previous": "Quay lại", - - "register-email.title": "Đăng ký tài khoản mới", - "register-page.create-profile.header": "Tạo hồ sơ", - "register-page.create-profile.identification.contact": "Điện thoại liên hệ", - "register-page.create-profile.identification.email": "Địa chỉ email", - "register-page.create-profile.identification.first-name": "Tên *", - "register-page.create-profile.identification.first-name.error": "Nhập vào tên của người dùng", - "register-page.create-profile.identification.header": "Hồ sơ định danh", - "register-page.create-profile.identification.language": "Ngôn ngữ", - "register-page.create-profile.identification.last-name": "Họ *", - "register-page.create-profile.identification.last-name.error": "Nhập vào họ của người dùng", - "register-page.create-profile.security.error.empty-password": "Nhập mật khẩu vào ô phía dưới.", - "register-page.create-profile.security.error.matching-passwords": "Mật khẩu không khớp.", - "register-page.create-profile.security.header": "Bảo mật", - "register-page.create-profile.security.info": "Nhập vào mật khẩu mới và xác nhận mật khẩu vào ô phía dưới. Độ dài tối thiểu của mật khẩu là 6 ký tự.", - "register-page.create-profile.security.label.password": "Mật khẩu *", - "register-page.create-profile.security.label.passwordrepeat": "Nhập lại để xác nhận *", - "register-page.create-profile.submit": "Đăng ký thành công", - "register-page.create-profile.submit.error.content": "Đã có sự cố xảy ra khi đăng ký người dùng mới.", - "register-page.create-profile.submit.error.head": "Đăng ký lỗi", - "register-page.create-profile.submit.success.content": "Đăng ký thành công. Bạn đã đăng nhập với tư cách người dùng mới", - "register-page.create-profile.submit.success.head": "Đăng ký thành công", - "register-page.registration.email": "Địa chỉ email *", - "register-page.registration.email.error.pattern": "Vui lòng nhập một địa chỉ email hợp lệ", - "register-page.registration.email.error.required": "Vui lòng nhập vào địa chỉ email", - "register-page.registration.email.hint": "Địa chỉ này sẽ được xác minh và dùng làm tên đăng nhập của bạn.", - "register-page.registration.error.content": "Đã xảy ra lỗi khi đăng ký địa chỉ email sau: {{ email }}", - "register-page.registration.error.head": "Lỗi khi đăng ký email", - "register-page.registration.error.recaptcha": "Lỗi khi thực hiện xác minh bằng recaptcha", - "register-page.registration.google-recaptcha.must-accept-cookies": "Để đăng ký bạn phải chấp nhận cookie Đăng ký và khôi phục mật khẩu<\/b> (Google reCaptcha).", - "register-page.registration.google-recaptcha.notification.message.error": "Xác minh đã hết hạn. Vui lòng xác minh lại.", - "register-page.registration.google-recaptcha.notification.message.expired": "Đã xảy ra lỗi trong quá trình xác minh reCaptcha", - "register-page.registration.google-recaptcha.notification.title": "Google reCaptcha", - "register-page.registration.google-recaptcha.open-cookie-settings": "Mở phần cài đặt cookie", - "register-page.registration.header": "Đăng ký người dùng mới", - "register-page.registration.info": "Đăng ký tài khoản để nhận cập nhật mới về bộ sưu tập qua email và theo dõi tài liệu mới trên DSpace.", - "register-page.registration.submit": "Đăng ký", - "register-page.registration.success.content": "Một email sẽ được gửi đến địa chỉ email {{ email }} chứa liên kết xác nhận và các hướng dẫn khác.", - "register-page.registration.success.head": "Gửi email xác nhận", - - "relationships.add.error.relationship-type.content": "Không có kết quả nào phù hợp cho kiểu quan hệ {{ type }} giữa hai tài liệu", - "relationships.add.error.server.content": "Máy chủ trả về lỗi", - "relationships.add.error.title": "Không thể thêm mối quan hệ", - "relationships.isAuthorOf": "Tác giả", - "relationships.isAuthorOf.OrgUnit": "Tác giả (tổ chức)", - "relationships.isAuthorOf.Person": "Tác giả (người)", - "relationships.isContributorOf": "Người tham gia", - "relationships.isContributorOf.OrgUnit": "Người tham gia (Tổ chức)", - "relationships.isContributorOf.Person": "Người tham gia", - "relationships.isFundingAgencyOf.OrgUnit": "Nhà tài trợ", - "relationships.isIssueOf": "Số kỳ của tạp chí", - "relationships.isJournalIssueOf": "Số kỳ của tạp chí", - "relationships.isJournalOf": "Tạp chí", - "relationships.isOrgUnitOf": "Đơn vị tổ chức", - "relationships.isPersonOf": "Tác giả", - "relationships.isProjectOf": "Dự án nghiên cứu", - "relationships.isPublicationOf": "Ấn phẩm", - "relationships.isPublicationOfJournalIssue": "Bài báo", - "relationships.isSingleJournalOf": "Tạp chí", - "relationships.isSingleVolumeOf": "Số tập của tạp chí", - "relationships.isVolumeOf": "Số tập của tạp chí", - - "repository.image.logo": "Logo lưu trữ", - "repository.title.prefix": "Digital Library ::", - "repository.title.prefixDSpace": "Digital Library ::", - - "resource-policies.add.button": "Thêm", - "resource-policies.add.for.bitstream": "Thêm chính sách dữ liệu số mới", - "resource-policies.add.for.bundle": "Thêm chính sách gói dữ liệu mới", - "resource-policies.add.for.collection": "Thêm chính sách bộ sưu tập mới", - "resource-policies.add.for.community": "Thêm chính sách đơn vị mới", - "resource-policies.add.for.item": "Thêm chính sách tài liệu mới", - "resource-policies.create.page.failure.content": "Đã có lỗi xảy ra khi tạo chính sách tài nguyên.", - "resource-policies.create.page.heading": "Tạo chính sách tài nguyên mới cho", - "resource-policies.create.page.success.content": "Hành động thành công", - "resource-policies.create.page.title": "Tạp chính sách tài nguyên mới", - "resource-policies.delete.btn": "Xóa lựa chọn", - "resource-policies.delete.btn.title": "Xóa chính sách tài nguyên đã chọn", - "resource-policies.delete.failure.content": "Đã có lỗi xảy ra khi xóa chính sách tài nguyên đã lựa chọn.", - "resource-policies.delete.success.content": "Hành động thành công", - "resource-policies.edit.page.failure.content": "Đã có lỗi xảy ra khi chỉnh sửa chính sách tài nguyên.", - "resource-policies.edit.page.heading": "Chỉnh sửa chính sách tài nguyên", - "resource-policies.edit.page.other-failure.content": "Đã xảy ra lỗi khi chỉnh sửa chính sách phân quyền. Người dùng\/ nhóm người dùng đã được cập nhật thành công.", - "resource-policies.edit.page.success.content": "Hành động thành công", - "resource-policies.edit.page.target-failure.content": "Đã xảy ra lỗi khi chỉnh sửa người dùng\/ nhóm người dùng trong chính sách phân quyền.", - "resource-policies.edit.page.title": "Chỉnh sửa chính sách phân quyền", - "resource-policies.form.action-type.label": "Lựa chọn kiểu hành động", - "resource-policies.form.action-type.required": "Bạn cần phải lựa chọn hành động chính sách phân quyền.", - "resource-policies.form.date.end.label": "Ngày kết thúc", - "resource-policies.form.date.start.label": "Ngày bắt đầu", - "resource-policies.form.description.label": "Mô tả", - "resource-policies.form.eperson-group-list.label": "Người hoặc nhóm người dùng được cấp quyền", - "resource-policies.form.eperson-group-list.modal.close": "Ok", - "resource-policies.form.eperson-group-list.modal.header": "Không thể thay đổi kiểu", - "resource-policies.form.eperson-group-list.modal.text1.toEPerson": "Không thể thay thế nhóm người dùng bằng người dùng.", - "resource-policies.form.eperson-group-list.modal.text1.toGroup": "Không thể thay thế người dùng bằng nhóm người dùng.", - "resource-policies.form.eperson-group-list.modal.text2": "Xóa chính sách phân quyền hiện tại và tạo chính sách mới với kiểu mong muốn.", - "resource-policies.form.eperson-group-list.select.btn": "Lựa chọn", - "resource-policies.form.eperson-group-list.tab.eperson": "Tìm kiếm người dùng", - "resource-policies.form.eperson-group-list.tab.group": "Tìm kiếm một nhóm người dùng", - "resource-policies.form.eperson-group-list.table.headers.action": "Hành động", - "resource-policies.form.eperson-group-list.table.headers.id": "ID", - "resource-policies.form.eperson-group-list.table.headers.name": "Tên", - "resource-policies.form.name.label": "Tên", - "resource-policies.form.policy-type.label": "Lựa chọn kiểu chính sách", - "resource-policies.form.policy-type.required": "Bạn cần lựa chọn kiểu chính sách tài nguyên.", - "resource-policies.table.headers.action": "Quyền", - "resource-policies.table.headers.date.end": "Ngày kết thúc", - "resource-policies.table.headers.date.start": "Ngày bắt đầu", - "resource-policies.table.headers.edit": "Chỉnh sửa", - "resource-policies.table.headers.edit.group": "Chỉnh sửa nhóm", - "resource-policies.table.headers.edit.policy": "Chỉnh sửa chính sách", - "resource-policies.table.headers.eperson": "Người dùng", - "resource-policies.table.headers.group": "Nhóm", - "resource-policies.table.headers.id": "ID", - "resource-policies.table.headers.name": "Tên", - "resource-policies.table.headers.policyType": "kiểu", - "resource-policies.table.headers.title.for.bitstream": "Chính sách tệp dữ liệu số", - "resource-policies.table.headers.title.for.bundle": "Chính sách gói dữ liệu số", - "resource-policies.table.headers.title.for.collection": "Chính sách bộ sưu tập", - "resource-policies.table.headers.title.for.community": "Chính sách đơn vị", - "resource-policies.table.headers.title.for.item": "Chính sách tài liệu", - "resource-policies.table.headers.title.for.topic": "Chính sách topic", - - "search.breadcrumbs": "Tìm kiếm", - "search.browse.item-back": "Quay lại kết quả tìm kiếm", - "search.filters.applied.f.author": "Tác giả", - "search.filters.applied.f.birthDate.max": "Ngày sinh kết thúc", - "search.filters.applied.f.birthDate.min": "Ngày sinh bắt đầu", - "search.filters.applied.f.dateIssued.max": "Ngày kết thúc", - "search.filters.applied.f.dateIssued.min": "Ngày bắt đầu", - "search.filters.applied.f.dateSubmitted": "Ngày đăng", - "search.filters.applied.f.discoverable": "Tài liệu cá nhân", - "search.filters.applied.f.entityType": "Kiểu tài liệu", - "search.filters.applied.f.has_content_in_original_bundle": "Có tệp", - "search.filters.applied.f.itemtype": "Kiểu", - "search.filters.applied.f.jobTitle": "Chức danh", - "search.filters.applied.f.namedresourcetype": "Trạng thái", - "search.filters.applied.f.subject": "Chủ đề", - "search.filters.applied.f.submitter": "Người gửi", - "search.filters.applied.f.withdrawn": "Tài liệu ẩn", - "search.filters.discoverable.false": "Có", - "search.filters.discoverable.true": "Không", - "search.filters.entityType.JournalIssue": "Kỳ của tạp chí", - "search.filters.entityType.JournalVolume": "Số tập cảu tạp chí", - "search.filters.entityType.OrgUnit": "Đơn vị tổ chức", - "search.filters.filter.author.head": "Tác giả", - "search.filters.filter.author.label": "Tìm kiếm tên tác giả", - "search.filters.filter.author.placeholder": "Tên tác giả", - "search.filters.filter.birthDate.head": "Ngày sinh", - "search.filters.filter.birthDate.label": "Tìm kiếm ngày sinh", - "search.filters.filter.birthDate.placeholder": "Ngày sinh", - "search.filters.filter.collapse": "Thu hẹp bộ lọc", - "search.filters.filter.creativeDatePublished.head": "Ngày xuất bản", - "search.filters.filter.creativeDatePublished.label": "Tìm kiếm ngày xuất bản", - "search.filters.filter.creativeDatePublished.placeholder": "Ngày xuất bản", - "search.filters.filter.creativeWorkEditor.head": "Người biên tập", - "search.filters.filter.creativeWorkEditor.label": "Tìm kiếm người biên tập", - "search.filters.filter.creativeWorkEditor.placeholder": "Người biên tập", - "search.filters.filter.creativeWorkKeywords.head": "Chủ đề", - "search.filters.filter.creativeWorkKeywords.label": "Tìm kiếm chủ đề", - "search.filters.filter.creativeWorkKeywords.placeholder": "Chủ đề", - "search.filters.filter.creativeWorkPublisher.head": "Nhà xuất bản", - "search.filters.filter.creativeWorkPublisher.label": "Tìm kiếm nhà xuất bản", - "search.filters.filter.creativeWorkPublisher.placeholder": "Nhà xuất bản", - "search.filters.filter.dateIssued.head": "Thời gian xuất bản", - "search.filters.filter.dateIssued.max.label": "Kết thúc", - "search.filters.filter.dateIssued.max.placeholder": "Thời gian tối đa", - "search.filters.filter.dateIssued.min.label": "Bắt đầu", - "search.filters.filter.dateIssued.min.placeholder": "Thời gian tối thiểu", - "search.filters.filter.dateSubmitted.head": "Ngày gửi", - "search.filters.filter.dateSubmitted.label": "Tìm kiếm ngày gửi", - "search.filters.filter.dateSubmitted.placeholder": "Ngày gửi", - "search.filters.filter.discoverable.head": "Tài liệu cá nhân", - "search.filters.filter.entityType.head": "Kiểu thực thể", - "search.filters.filter.entityType.label": "Tìm kiếm kiểu thực thể", - "search.filters.filter.entityType.placeholder": "Kiểu thực thể", - "search.filters.filter.expand": "Mở rộng bộ lọc", - "search.filters.filter.has_content_in_original_bundle.head": "Có tệp", - "search.filters.filter.itemtype.head": "Kiểu tài liệu", - "search.filters.filter.itemtype.label": "Tìm kiếm kiểu tài liệu", - "search.filters.filter.itemtype.placeholder": "Kiểu tài liệu", - "search.filters.filter.jobTitle.head": "Chức danh", - "search.filters.filter.jobTitle.label": "Tìm kiếm chức danh", - "search.filters.filter.jobTitle.placeholder": "Chức danh", - "search.filters.filter.knowsLanguage.head": "Ngôn ngữ", - "search.filters.filter.knowsLanguage.label": "Tìm kiếm ngôn ngữ", - "search.filters.filter.knowsLanguage.placeholder": "Ngôn ngữ", - "search.filters.filter.namedresourcetype.head": "Trạng thái", - "search.filters.filter.namedresourcetype.label": "Tìm kiếm trạng thái", - "search.filters.filter.namedresourcetype.placeholder": "Trạng thái", - "search.filters.filter.objectpeople.head": "Người", - "search.filters.filter.objectpeople.label": "Tìm kiếm tên người", - "search.filters.filter.objectpeople.placeholder": "Người", - "search.filters.filter.organizationAddressCountry.head": "Quốc gia", - "search.filters.filter.organizationAddressCountry.label": "Tìm kiếm quốc gia", - "search.filters.filter.organizationAddressCountry.placeholder": "Quốc gia", - "search.filters.filter.organizationAddressLocality.head": "Thành phố", - "search.filters.filter.organizationAddressLocality.label": "Tìm kiếm thành phố", - "search.filters.filter.organizationAddressLocality.placeholder": "Thành phố", - "search.filters.filter.organizationFoundingDate.head": "Ngày thành lập", - "search.filters.filter.organizationFoundingDate.label": "Tìm kiếm ngày thành lập", - "search.filters.filter.organizationFoundingDate.placeholder": "Ngày thành lập", - "search.filters.filter.scope.head": "Phạm vi", - "search.filters.filter.scope.label": "Tìm kiếm phạm vi giới hạn", - "search.filters.filter.scope.placeholder": "phạm vi giới hạn", - "search.filters.filter.show-less": "Thu hẹp", - "search.filters.filter.show-more": "Xem thêm", - "search.filters.filter.show-tree": "Duyệt cây {{ name }}", - "search.filters.filter.subject.head": "Chủ đề", - "search.filters.filter.subject.label": "Tìm kiếm chủ đề", - "search.filters.filter.subject.placeholder": "Chủ đề", - "search.filters.filter.submitter.head": "Người gửi", - "search.filters.filter.submitter.label": "Tìm kiếm người gửi", - "search.filters.filter.submitter.placeholder": "Người gửi", - "search.filters.filter.withdrawn.head": "Tài liệu ẩn", - "search.filters.has_content_in_original_bundle.false": "Không", - "search.filters.has_content_in_original_bundle.true": "Có", - "search.filters.head": "Bộ lọc", - "search.filters.reset": "Làm mới bộ lọc", - "search.filters.search.submit": "Xác nhận", - "search.filters.withdrawn.false": "Không", - "search.filters.withdrawn.true": "Có", - "search.form.scope.all": "Toàn bộ thư viện", - "search.form.search": "Tìm kiếm", - "search.form.search_dspace": "tất cả kho lưu trữ", - "search.results.empty": "Tìm kiếm của bạn không trả về kết quả.", - "search.results.head": "Kết quả tìm kiếm", - "search.results.no-results": "Tìm kiếm của bạn không trả về kết quả. Bạn có gặp khó khăn khi thực hiện tìm kiếm? Hãy thử lại bằng cách", - "search.results.no-results-link": "đặt từ khóa tìm vào trong cặp dấu ngoặc kép", - "search.results.response.500": "Đã xảy ra lỗi trong khi thực hiện truy vấn vui lòng thử lại sau", - "search.results.view-result": "Xem", - "search.search-form.placeholder": "Từ khóa tìm kiếm", - "search.sidebar.close": "Quay lại kết quả tìm kiếm", - "search.sidebar.filters.title": "Bộ lọc", - "search.sidebar.open": "Công cụ tìm kiếm", - "search.sidebar.results": "kết quả", - "search.sidebar.settings.rpp": "Kết quả mỗi trang", - "search.sidebar.settings.sort-by": "Sắp xếp theo", - "search.sidebar.settings.title": "Cài đặt", - "search.switch-configuration.title": "Xem", - "search.title": "Tìm kiếm", - "search.view-switch.show-detail": "Xem chi tiết", - "search.view-switch.show-grid": "Hiển thị dưới dạng lưới", - "search.view-switch.show-list": "Hiển thị dưới dạng danh sách", - - "sorting.ASC": "Tăng dần", - "sorting.dc.date.accessioned.ASC": "Tăng dần theo ngày lưu trữ", - "sorting.dc.date.accessioned.DESC": "Giảm dần theo ngày lưu trữ", - "sorting.dc.date.issued.ASC": "Tăng dần theo ngày", - "sorting.dc.date.issued.DESC": "Giảm dần theo ngày", - "sorting.dc.title.ASC": "Tăng dần theo nhan đề", - "sorting.dc.title.DESC": "Giảm dần theo nhan đề", - "sorting.DESC": "Giảm dần", - "sorting.lastModified.ASC": "Tăng dần theo lần chỉnh sửa cuối cùng", - "sorting.lastModified.DESC": "Giảm dần theo lần chỉnh sửa cuối cùng", - "sorting.score.ASC": "Liên quan ít nhất", - "sorting.score.DESC": "Liên quan nhiều nhất", - - "statistics.breadcrumbs": "Thống kê", - "statistics.header": "Thống kê theo {{ scope }}", - "statistics.page.no-data": "Không có dữ liệu", - "statistics.table.header.views": "Xem", - "statistics.table.no-data": "Không có dữ liệu", - "statistics.table.title.TopCities": "Top thành phố xem nhiều nhất", - "statistics.table.title.TopCountries": "Top quốc gia xem nhiều nhất", - "statistics.table.title.TotalDownloads": "Truy cập tệp", - "statistics.table.title.TotalVisits": "Tổng số truy cập", - "statistics.table.title.TotalVisitsPerMonth": "Tổng số lượt truy cập theo từng tháng", - "statistics.title": "Thống kê", - - - "submission.edit.breadcrumbs": "Chỉnh sửa đăng ký", - "submission.edit.title": "Chỉnh sửa đăng ký", - "submission.general.cancel": "Hủy", - "submission.general.cannot_submit": "Bạn không có quyền chỉnh sửa đăng ký đã gửi .", - "submission.general.deposit": "Tải lên", - "submission.general.discard.confirm.cancel": "Hủy", - "submission.general.discard.confirm.info": "Không thể hoàn tác thao tác. Bạn có chắc chắn không?", - "submission.general.discard.confirm.submit": "Có tôi đồng ý", - "submission.general.discard.confirm.title": "Hủy đăng ký", - "submission.general.discard.submit": "Hủy", - "submission.general.info.pending-changes": "Thay đổi chưa được lưu", - "submission.general.info.saved": "Lưu", - "submission.general.save": "Lưu", - "submission.general.save-later": "Lưu lại", - "submission.import-external.back-to-my-dspace": "Trở lại thư viện số", - "submission.import-external.page.hint": "Nhập vào một truy vấn phía trên để tìm các tài liệu trên trang web để nhập vào thư viện số", - "submission.import-external.page.title": "Nhập thông tin mô tả từ nguồn bên ngoài", - "submission.import-external.preview.button.import": "Bắt đầu gửi", - "submission.import-external.preview.error.import.body": "Đã xảy ra lỗi trong quá trình nhập tài liệu từ nguồn bên ngoài", - "submission.import-external.preview.error.import.title": "Lỗi gửi đi", - "submission.import-external.preview.subtitle": "Siêu dữ liệu bên dưới được nhập từ nguồn bên ngoài. Nó sẽ được điền vào trước khi bạn gửi đi.", - "submission.import-external.preview.title": "Xem trước tài liệu", - "submission.import-external.preview.title.Journal": "Xem trước Tạp chí", - "submission.import-external.preview.title.none": "Xem trước tài liệu", - "submission.import-external.preview.title.OrgUnit": "Xem trước tổ chức", - "submission.import-external.preview.title.Person": "Xem trước Tác giả\/nhà nghiên cứu", - "submission.import-external.preview.title.Project": "Xem trước dự án", - "submission.import-external.preview.title.Publication": "Xem trước ấn phẩm", - "submission.import-external.search.button": "Tìm kiếm", - "submission.import-external.search.button.hint": "Nhập một từ để tìm kiếm", - "submission.import-external.search.placeholder": "Tìm kiếm nguồn bên ngoài", - "submission.import-external.search.source.hint": "Chọn một nguồn bên ngoài", - "submission.import-external.source.ads": "NASA\/ADS", - "submission.import-external.source.arxiv": "arXiv", - "submission.import-external.source.cinii": "CiNii", - "submission.import-external.source.crossref": "CrossRef", - "submission.import-external.source.datacite": "submission.import-external.source.datacite", - "submission.import-external.source.epo": "Văn phòng Bằng sáng chế Châu Âu (EPO)", - "submission.import-external.source.lcname": "Tên Thư viện Quốc hội", - "submission.import-external.source.loading": "Đang tải lên ...", - "submission.import-external.source.openAIREFunding": "Funding OpenAIRE API", - "submission.import-external.source.orcid": "ORCID", - "submission.import-external.source.orcidWorks": "ORCID", - "submission.import-external.source.pubmed": "Pubmed", - "submission.import-external.source.pubmedeu": "Pubmed Europe", - "submission.import-external.source.scielo": "SciELO", - "submission.import-external.source.scopus": "SciELO", - "submission.import-external.source.sherpaJournal": "Tạp chí SHERPA", - "submission.import-external.source.sherpaJournalIssn": "Số ISSN của tạp chí SHERPA", - "submission.import-external.source.sherpaPublisher": "Nhà xuất bản SHERPA", - "submission.import-external.source.vufind": "VuFind", - "submission.import-external.source.wos": "Web Of Science", - "submission.import-external.title": "Nhập thông tin mô tả từ nguồn bên ngoài", - "submission.import-external.title.Journal": "Nhập tạp chí từ nguồn bên ngoài", - "submission.import-external.title.JournalIssue": "Nhập kỳ ấn phẩm tạp chí từ nguồn bên ngoài", - "submission.import-external.title.JournalVolume": "Nhập một tập của tạp chí từ nguồn bên ngoài", - "submission.import-external.title.none": "Nhập thông tin mô tả từ nguồn bên ngoài", - "submission.import-external.title.OrgUnit": "Nhập nhà xuất bản từ nguồn bên ngoài", - "submission.import-external.title.Person": "Nhập một tác giả\/ nhà nghiên cứu từ nguồn bên ngoài", - "submission.import-external.title.Project": "Nhập một dự án từ nguồn bên ngoài", - "submission.import-external.title.Publication": "Nhập một ấn phẩm từ nguồn bên ngoài", - "submission.sections.accesses.form.access-condition-hint": "Chọn chính sách phân quyền để áp dụng cho biểu ghi khi nó được nhập vào hệ thống.", - "submission.sections.accesses.form.access-condition-label": "Loại chính sách truy cập", - "submission.sections.accesses.form.date-required": "Thông tin thời gian là bắt buộc.", - "submission.sections.accesses.form.date-required-from": "Bắt buộc phải khai báo thời gian để xác định ngày bắt đầu cấp quyền truy cập", - "submission.sections.accesses.form.date-required-until": "Bắt buộc phải khai báo thời gian để xác định ngày bắt đầu cấp quyền truy cập", - "submission.sections.accesses.form.discoverable-description": "Khi được chọn biểu ghi này sẽ có thể được tìm thấy trong các chức năng tìm kiếm\/duyệt. Khi bỏ chọn biểu ghi sẽ chỉ có sẵn qua đường dẫn trực tiếp và sẽ không bao giờ xuất hiện trong tìm kiếm\/duyệt.", - "submission.sections.accesses.form.discoverable-label": "Có thể khám phá", - "submission.sections.accesses.form.from-hint": "Chọn ngày mà quyền được áp dụng", - "submission.sections.accesses.form.from-label": "Cấp quyền truy cập từ", - "submission.sections.accesses.form.from-placeholder": "Từ", - "submission.sections.accesses.form.group-label": "Nhóm", - "submission.sections.accesses.form.group-required": "Trường Nhóm là bắt buộc.", - "submission.sections.accesses.form.until-hint": "Chọn ngày mà quyền được áp dụng", - "submission.sections.accesses.form.until-label": "Cấp quyền truy cập cho đến khi", - "submission.sections.accesses.form.until-placeholder": "Cho tới khi", - "submission.sections.ccLicense.change": "Thay đổi loại giấy phép…", - "submission.sections.ccLicense.confirmation": "Tôi đồng ý với giấy phép ở trên", - "submission.sections.ccLicense.link": "Bạn có lựa chọn theo giấy phép này:", - "submission.sections.ccLicense.none": "Không có giấy phép nào", - "submission.sections.ccLicense.option.select": "Lựa chọn tùy chọn…", - "submission.sections.ccLicense.select": "Lựa chọn loại giấy phép…", - "submission.sections.ccLicense.type": "Loại giấy phép", - "submission.sections.describe.relationship-lookup.close": "Đóng", - "submission.sections.describe.relationship-lookup.external-source.added": "Thêm thành công tài liệu nội bộ vào mục đã chọn", - "submission.sections.describe.relationship-lookup.external-source.import-button-title.Equipment": "Nhập thiết bị từ cơ sở dữ liệu từ xa", - "submission.sections.describe.relationship-lookup.external-source.import-button-title.Event": "Nhập sự kiện từ cơ sở dữ liệu từ xa", - "submission.sections.describe.relationship-lookup.external-source.import-button-title.Funding": "Nhập sự kiện từ cơ sở dữ liệu từ xa", - "submission.sections.describe.relationship-lookup.external-source.import-button-title.isAuthorOfPublication": "Nhập tác giả từ xa", - "submission.sections.describe.relationship-lookup.external-source.import-button-title.isProjectOfPublication": "Dự án", - "submission.sections.describe.relationship-lookup.external-source.import-button-title.Journal": "Nhập tạp chí từ xa", - "submission.sections.describe.relationship-lookup.external-source.import-button-title.JournalIssue": "Nhập số kỳ của tạp chí từ cơ sở dữ liệu từ xa", - "submission.sections.describe.relationship-lookup.external-source.import-button-title.JournalVolume": "Nhập số tập của tạp chí từ cơ sở dữ liệu từ xa", - "submission.sections.describe.relationship-lookup.external-source.import-button-title.none": "Nhập tài liệu từ cơ sở dữ liệu từ xa", - "submission.sections.describe.relationship-lookup.external-source.import-button-title.OrgUnit": "Nhập tổ chức từ cơ sở dữ liệu từ xa", - "submission.sections.describe.relationship-lookup.external-source.import-button-title.Patent": "Nhập bằng sáng chế từ cơ sở dữ liệu từ xa", - "submission.sections.describe.relationship-lookup.external-source.import-button-title.Person": "Nhập tác giả\/ nhà nghiên cứu từ cơ sở dữ liệu từ xa", - "submission.sections.describe.relationship-lookup.external-source.import-button-title.Product": "Nhập tác giả\/ nhà nghiên cứu từ cơ sở dữ liệu từ xa", - "submission.sections.describe.relationship-lookup.external-source.import-button-title.Project": "Nhập dự án từ cơ sở dữ liệu từ xa", - "submission.sections.describe.relationship-lookup.external-source.import-button-title.Publication": "Nhập ấn phẩm từ cơ sở dữ liệu từ xa", - "submission.sections.describe.relationship-lookup.external-source.import-modal.authority": "Kiểm soát", - "submission.sections.describe.relationship-lookup.external-source.import-modal.authority.new": "Nhập dưới dạng một kiểm soát nội bộ mới", - "submission.sections.describe.relationship-lookup.external-source.import-modal.cancel": "Hủy", - "submission.sections.describe.relationship-lookup.external-source.import-modal.collection": "Chọn một bộ sưu tập để thêm các tài liệu mới", - "submission.sections.describe.relationship-lookup.external-source.import-modal.entities": "Thực thể", - "submission.sections.describe.relationship-lookup.external-source.import-modal.entities.new": "Nhập vào một thực thể nội bộ mới", - "submission.sections.describe.relationship-lookup.external-source.import-modal.head.arxiv": "Nhập từ arXiv", - "submission.sections.describe.relationship-lookup.external-source.import-modal.head.lcname": "Nhập từ tên LC", - "submission.sections.describe.relationship-lookup.external-source.import-modal.head.openAIREFunding": "Funding OpenAIRE API", - "submission.sections.describe.relationship-lookup.external-source.import-modal.head.orcid": "Nhập từ ORCID", - "submission.sections.describe.relationship-lookup.external-source.import-modal.head.pubmed": "Nhập từ PubMed", - "submission.sections.describe.relationship-lookup.external-source.import-modal.head.sherpaJournal": "Nhập từ tạp chí Sherpa", - "submission.sections.describe.relationship-lookup.external-source.import-modal.head.sherpaPublisher": "Nhập từ nhà xuất bản Sherpa", - "submission.sections.describe.relationship-lookup.external-source.import-modal.import": "Nhập liệu", - "submission.sections.describe.relationship-lookup.external-source.import-modal.isAuthorOfPublication.added.local-entity": "Thêm thành công tác giả nội bộ bộ vào mục đã chọn", - "submission.sections.describe.relationship-lookup.external-source.import-modal.isAuthorOfPublication.added.new-entity": "Nhập thành công và thêm tác giả bên ngoài vào mục đã chọn", - "submission.sections.describe.relationship-lookup.external-source.import-modal.isAuthorOfPublication.title": "Nhập tác giả từ cơ sở dữ liệu từ xa", - "submission.sections.describe.relationship-lookup.external-source.import-modal.isProjectOfPublication.added.new-entity": "Thực thể mới đã được thêm!", - "submission.sections.describe.relationship-lookup.external-source.import-modal.isProjectOfPublication.title": "Dự án", - "submission.sections.describe.relationship-lookup.external-source.import-modal.Journal.added.local-entity": "Thêm thành công tạp chí đã chọn", - "submission.sections.describe.relationship-lookup.external-source.import-modal.Journal.added.new-entity": "Nhập thành công tạp chí bên ngoài vào mục lựa chọn", - "submission.sections.describe.relationship-lookup.external-source.import-modal.Journal.title": "Nhập tạp chí từ xa", - "submission.sections.describe.relationship-lookup.external-source.import-modal.JournalIssue.added.local-entity": "Thêm thành công số kỳ tạp chí nội bộ vào mục lựa chọn", - "submission.sections.describe.relationship-lookup.external-source.import-modal.JournalIssue.added.new-entity": "Nhập thành công và thêm số kỳ của tạp chí bên ngoài vào mục lựa chọn", - "submission.sections.describe.relationship-lookup.external-source.import-modal.JournalIssue.title": "Nhập số kỳ của tạp chí từ xa", - "submission.sections.describe.relationship-lookup.external-source.import-modal.JournalVolume.added.local-entity": "Thêm thành công số tập của tạp chí nội bộ vào mục lựa chọn", - "submission.sections.describe.relationship-lookup.external-source.import-modal.JournalVolume.added.new-entity": "Nhập và thêm thành công số tập của tạp chí bên ngoài vào mục lựa chọn", - "submission.sections.describe.relationship-lookup.external-source.import-modal.JournalVolume.title": "Nhập số tập của tạp chí từ xa", - "submission.sections.describe.relationship-lookup.external-source.import-modal.select": "Chọn một phù hợp:", - "submission.sections.describe.relationship-lookup.name-variant.notification.confirm": "Lưu một biến thể tên mới", - "submission.sections.describe.relationship-lookup.name-variant.notification.content": "Bạn có muốn lưu \"{{ value }}\" làm tên biến thể cho người này để bạn và những người khác có thể sử dụng lại cho những lần gửi sau không? Nếu không bạn vẫn có thể sử dụng cho lần gửi này\"", - "submission.sections.describe.relationship-lookup.name-variant.notification.decline": "Chỉ sử dụng cho lần gửi này", - "submission.sections.describe.relationship-lookup.search-tab.deselect-all": "Bỏ chọn tất cả", - "submission.sections.describe.relationship-lookup.search-tab.deselect-page": "Bỏ chọn trang", - "submission.sections.describe.relationship-lookup.search-tab.loading": "Đang tải...", - "submission.sections.describe.relationship-lookup.search-tab.placeholder": "Tìm kiếm truy vấn", - "submission.sections.describe.relationship-lookup.search-tab.search": "Đi", - "submission.sections.describe.relationship-lookup.search-tab.search-form.placeholder": "Tìm kiếm...", - "submission.sections.describe.relationship-lookup.search-tab.select-all": "Lựa chọn tất cả", - "submission.sections.describe.relationship-lookup.search-tab.select-page": "Lựa chọn trang", - "submission.sections.describe.relationship-lookup.search-tab.tab-title.arxiv": "arXiv ({{ count }})", - "submission.sections.describe.relationship-lookup.search-tab.tab-title.DataFile": "Tệp dữ liệu nội bộ ({{ count }})", - "submission.sections.describe.relationship-lookup.search-tab.tab-title.DataPackage": "Gói dữ liệu nội bộ ({{ count }})", - "submission.sections.describe.relationship-lookup.search-tab.tab-title.isAuthorOfPublication": "Tác giả nội bộ ({{ count }})", - "submission.sections.describe.relationship-lookup.search-tab.tab-title.isChildOrgUnitOf": "Tìm kiếm đơn vị tổ chức", - "submission.sections.describe.relationship-lookup.search-tab.tab-title.isFundingAgencyOfProject": "Nhà tài trợ của dự án", - "submission.sections.describe.relationship-lookup.search-tab.tab-title.isFundingAgencyOfPublication": "Tìm kiếm cơ quan cấp vốn", - "submission.sections.describe.relationship-lookup.search-tab.tab-title.isFundingOfPublication": "Tìm kiếm tài trợ", - "submission.sections.describe.relationship-lookup.search-tab.tab-title.isJournalIssueOfPublication": "Số kỳ của tạp chí nội bộ ({{ count }})", - "submission.sections.describe.relationship-lookup.search-tab.tab-title.isJournalOfPublication": "Tạp chí nội bộ ({{ count }})", - "submission.sections.describe.relationship-lookup.search-tab.tab-title.isJournalVolumeOfPublication": "Số tập của tạp chí nội bộ ({{ count }})", - "submission.sections.describe.relationship-lookup.search-tab.tab-title.isProjectOfPublication": "Dự án", - "submission.sections.describe.relationship-lookup.search-tab.tab-title.isPublicationOfAuthor": "Ấn phẩm của tác giả", - "submission.sections.describe.relationship-lookup.search-tab.tab-title.Journal": "Tạp chí nội bộ ({{ count }})", - "submission.sections.describe.relationship-lookup.search-tab.tab-title.JournalIssue": "Số kỳ của tạp chsi nội bộ ({{ count }})", - "submission.sections.describe.relationship-lookup.search-tab.tab-title.JournalVolume": "Số tập của tạp chí nội bộ ({{ count }})", - "submission.sections.describe.relationship-lookup.search-tab.tab-title.lcname": "Tên LC ({{ count }})", - "submission.sections.describe.relationship-lookup.search-tab.tab-title.openAIREFunding": "Funding OpenAIRE API", - "submission.sections.describe.relationship-lookup.search-tab.tab-title.orcid": "ORCID ({{ count }})", - "submission.sections.describe.relationship-lookup.search-tab.tab-title.OrgUnit": "Đơn vị tổ chức nội bộ ({{ count }})", - "submission.sections.describe.relationship-lookup.search-tab.tab-title.Person": "Tác giả nội bộ ({{ count }})", - "submission.sections.describe.relationship-lookup.search-tab.tab-title.Project": "Dự án nội bộ ({{ count }})", - "submission.sections.describe.relationship-lookup.search-tab.tab-title.Publication": "Ấn phẩm nội bộ ({{ count }})", - "submission.sections.describe.relationship-lookup.search-tab.tab-title.pubmed": "PubMed ({{ count }})", - "submission.sections.describe.relationship-lookup.search-tab.tab-title.sherpaJournal": "Tạp chí Sherpa ({{ count }})", - "submission.sections.describe.relationship-lookup.search-tab.tab-title.sherpaPublisher": "Nhà xuất bản Sherpa ({{ count }})", - "submission.sections.describe.relationship-lookup.search-tab.toggle-dropdown": "Chuyển đổi danh mục thả xuống", - "submission.sections.describe.relationship-lookup.selected": "Lựa chọn {{ size }} tài liệu", - "submission.sections.describe.relationship-lookup.selection-tab.no-selection": "Lựa chọn cảu bạn hiện đang trống.", - "submission.sections.describe.relationship-lookup.selection-tab.search-form.placeholder": "Tìm kiếm...", - "submission.sections.describe.relationship-lookup.selection-tab.settings": "Cài đặt", - "submission.sections.describe.relationship-lookup.selection-tab.tab-title": "Lựa chọn hiện tại ({{ count }})", - "submission.sections.describe.relationship-lookup.selection-tab.title": "Kết quả tìm kiếm", - "submission.sections.describe.relationship-lookup.selection-tab.title.arxiv": "Kết quả tìm kiếm", - "submission.sections.describe.relationship-lookup.selection-tab.title.crossref": "Kết quả tìm kiếm", - "submission.sections.describe.relationship-lookup.selection-tab.title.DataFile": "Lựa chọn tệp dữ liệu", - "submission.sections.describe.relationship-lookup.selection-tab.title.DataPackage": "Lựa chọn gói dữ liệu", - "submission.sections.describe.relationship-lookup.selection-tab.title.epo": "Kết quả tìm kiếm", - "submission.sections.describe.relationship-lookup.selection-tab.title.isAuthorOfPublication": "Lựa chọn tác giả.", - "submission.sections.describe.relationship-lookup.selection-tab.title.isChildOrgUnitOf": "Lựa chọn đơn vị tổ chức", - "submission.sections.describe.relationship-lookup.selection-tab.title.isFundingAgencyOfPublication": "Lựa chọn đơn vị tổ chức", - "submission.sections.describe.relationship-lookup.selection-tab.title.isFundingOfPublication": "Lựa chọn tài trợ", - "submission.sections.describe.relationship-lookup.selection-tab.title.isJournalIssueOfPublication": "Lựa chọn kỳ của tạp chí", - "submission.sections.describe.relationship-lookup.selection-tab.title.isJournalOfPublication": "Lựa chọn tạp chí", - "submission.sections.describe.relationship-lookup.selection-tab.title.isJournalVolumeOfPublication": "Lựa chọn số tập của tạp chí", - "submission.sections.describe.relationship-lookup.selection-tab.title.isProjectOfPublication": "Dự án", - "submission.sections.describe.relationship-lookup.selection-tab.title.Journal": "Lựa chọn tạp chí", - "submission.sections.describe.relationship-lookup.selection-tab.title.JournalIssue": "Lựa chọn số kỳ của tạp chí", - "submission.sections.describe.relationship-lookup.selection-tab.title.JournalVolume": "Lựa chọn số tập của tạp chí", - "submission.sections.describe.relationship-lookup.selection-tab.title.lcname": "Kết quả tìm kiếm", - "submission.sections.describe.relationship-lookup.selection-tab.title.openAIREFunding": "Funding OpenAIRE API", - "submission.sections.describe.relationship-lookup.selection-tab.title.orcid": "Kết quả tìm kiếm", - "submission.sections.describe.relationship-lookup.selection-tab.title.orcidv2": "Kết quả tìm kiếm", - "submission.sections.describe.relationship-lookup.selection-tab.title.OrgUnit": "Lựa chọn đơn vị tổ chức", - "submission.sections.describe.relationship-lookup.selection-tab.title.Person": "Lựa chọn tác giả", - "submission.sections.describe.relationship-lookup.selection-tab.title.Project": "Lựa chọn dự án", - "submission.sections.describe.relationship-lookup.selection-tab.title.Publication": "Lựa chọn ấn phẩm", - "submission.sections.describe.relationship-lookup.selection-tab.title.pubmed": "Kết quả tìm kiếm", - "submission.sections.describe.relationship-lookup.selection-tab.title.scielo": "Kết quả tìm kiếm", - "submission.sections.describe.relationship-lookup.selection-tab.title.scopus": "Kết quả tìm kiếm", - "submission.sections.describe.relationship-lookup.selection-tab.title.sherpaJournal": "Lựa chọn kết quả", - "submission.sections.describe.relationship-lookup.selection-tab.title.sherpaPublisher": "Kết quả tìm kiếm", - "submission.sections.describe.relationship-lookup.selection-tab.title.wos": "Kết quả tìm kiếm", - "submission.sections.describe.relationship-lookup.title.DataFile": "Tệp dữ liệu", - "submission.sections.describe.relationship-lookup.title.DataPackage": "Gói dữ liệu", - "submission.sections.describe.relationship-lookup.title.FundingAgency": "Đơn vị tài trợ", - "submission.sections.describe.relationship-lookup.title.isAuthorOfPublication": "Tác giả", - "submission.sections.describe.relationship-lookup.title.isChildOrgUnitOf": "Đơn vị tổ chức chính", - "submission.sections.describe.relationship-lookup.title.isFundingAgencyOfProject": "Nhà tài trợ của dự án", - "submission.sections.describe.relationship-lookup.title.isFundingAgencyOfPublication": "Đơn vị tài trợ", - "submission.sections.describe.relationship-lookup.title.isFundingOfPublication": "Tài trợ", - "submission.sections.describe.relationship-lookup.title.isJournalIssueOfPublication": "Số kỳ của tạp chí", - "submission.sections.describe.relationship-lookup.title.isJournalOfPublication": "Tạp chí", - "submission.sections.describe.relationship-lookup.title.isJournalVolumeOfPublication": "Số tập cảu tạp chí", - "submission.sections.describe.relationship-lookup.title.isProjectOfPublication": "Dự án", - "submission.sections.describe.relationship-lookup.title.isPublicationOfAuthor": "Ấn phẩm", - "submission.sections.describe.relationship-lookup.title.JournalIssue": "Số kỳ của tạp chí", - "submission.sections.describe.relationship-lookup.title.JournalVolume": "Số tập của tạp chí", - "submission.sections.describe.relationship-lookup.title.OrgUnit": "Đơn vị tổ chức", - "submission.sections.describe.relationship-lookup.title.Person": "Tác giả", - "submission.sections.describe.relationship-lookup.title.Project": "Dự án", - "submission.sections.describe.relationship-lookup.title.Publication": "Ấn phẩm", - "submission.sections.general.add-more": "Thêm nhiều hơn", - "submission.sections.general.cannot_deposit": "Không thể hoàn tất quá trình nhập dữ liệu do lỗi trong biểu mẫu.
Vui lòng điền vào tất cả các trường bắt buộc để hoàn tất quá trình nhập liệu.", - "submission.sections.general.collection": "Bộ sưu tập", - "submission.sections.general.deposit_error_notice": "Đã xảy ra sự cố khi gửi tài liệu vui lòng thử lại sau.", - "submission.sections.general.deposit_success_notice": "Đã gửi thành công.", - "submission.sections.general.discard_error_notice": "Đã xảy ra sự cố khi hủy tài liệu vui lòng thử lại sau.", - "submission.sections.general.discard_success_notice": "Đã hủy thành công.", - "submission.sections.general.metadata-extracted": "Siêu dữ liệu mới đã được trích xuất và thêm vào phần {{sectionId}} phần.", - "submission.sections.general.metadata-extracted-new-section": " {{sectionId}} mới phần đã được thêm vào thông tin gửi đi.", - "submission.sections.general.no-collection": "Không tìm thấy bộ sưu tập", - "submission.sections.general.no-sections": "Không có tùy chọn", - "submission.sections.general.save_error_notice": "Đã xảy ra sự cố khi lưu tài liệu vui lòng thử lại sau.", - "submission.sections.general.save_success_notice": "Lưu thành công.", - "submission.sections.general.search-collection": "Tìm kiếm bộ sưu tập", - "submission.sections.general.sections_not_valid": "Không có phần nào hoàn thành.", - "submission.sections.license.granted-label": "Xác nhận giấy phép", - "submission.sections.license.notgranted": "Bạn phải chấp nhận giấy phép", - "submission.sections.license.required": "Bạn phải chấp nhận giấy phép", - "submission.sections.sherpa.error.message": "Đã xảy ra lỗi trong quá trình truy xuất thông tin", - "submission.sections.sherpa.publication.information": "Thông tin ấn phẩm", - "submission.sections.sherpa.publication.information.issns": "ISSNs", - "submission.sections.sherpa.publication.information.publishers": "Nhà xuất bản", - "submission.sections.sherpa.publication.information.romeoPub": "Romeo Pub", - "submission.sections.sherpa.publication.information.title": "Nhan đề", - "submission.sections.sherpa.publication.information.url": "URL", - "submission.sections.sherpa.publication.information.zetoPub": "Zeto Pub", - "submission.sections.sherpa.publisher.policy": "Chính sách của nhà xuất bản", - "submission.sections.sherpa.publisher.policy.conditions": "Điều kiện", - "submission.sections.sherpa.publisher.policy.description": "Thông tin dưới đây được tìm thấy thông qua Sherpa Romeo. Dựa trên các chính sách của nhà xuất bản của bạn hệ thống sẽ đưa ra lời khuyên về việc có cần thiết phải hạn chế hay không và\/hoặc những tệp nào mà bạn được phép tải lên. Nếu bạn có thắc mắc vui lòng liên hệ với quản trị viên.", - "submission.sections.sherpa.publisher.policy.embargo": "Hạn chế", - "submission.sections.sherpa.publisher.policy.license": "Bản quyền", - "submission.sections.sherpa.publisher.policy.location": "Vị trí", - "submission.sections.sherpa.publisher.policy.more.information": "Để biết thêm thông tin vui lòng xem đường dẫn dưới đây:", - "submission.sections.sherpa.publisher.policy.noembargo": "Không hạn chế", - "submission.sections.sherpa.publisher.policy.nolocation": "Trống", - "submission.sections.sherpa.publisher.policy.openaccess": "Các đường dẫn truy cập mở được cho phép bởi chính sách của tạp chí này được liệt kê bên dưới theo phiên bản bài viết. Nhấp vào một đường dẫn để xem chi tiết", - "submission.sections.sherpa.publisher.policy.prerequisites": "Điều kiện cần", - "submission.sections.sherpa.publisher.policy.refresh": "Làm mới", - "submission.sections.sherpa.publisher.policy.version": "Phiên bản", - "submission.sections.sherpa.record.information": "Thông tin biểu ghi", - "submission.sections.sherpa.record.information.date.created": "Ngày tạo", - "submission.sections.sherpa.record.information.date.modified": "Lần chỉnh sửa gần nhất", - "submission.sections.sherpa.record.information.id": "ID", - "submission.sections.sherpa.record.information.uri": "URL", - "submission.sections.sherpa-policy.title-empty": "Không có chính sách của nhà xuất bản. Nếu tác phẩm của bạn có ISSN liên quan vui lòng nhập nó ở trên để xem các chính sách truy cập mở của nhà xuất bản (nếu có)", - "submission.sections.status.errors.aria": "có lỗi", - "submission.sections.status.errors.title": "Lỗi", - "submission.sections.status.info.aria": "Thông tin bổ sung", - "submission.sections.status.info.title": "Thông tin bổ sung", - "submission.sections.status.valid.aria": "là hợp lệ", - "submission.sections.status.valid.title": "Hợp lệ", - "submission.sections.status.warnings.aria": "có cảnh báo", - "submission.sections.status.warnings.title": "Cảnh báo", - "submission.sections.submit.progressbar.accessCondition": "Điều kiện truy cập biểu ghi", - "submission.sections.submit.progressbar.CClicense": "Bằng sáng chế", - "submission.sections.submit.progressbar.describe.recycle": "Tái chế", - "submission.sections.submit.progressbar.describe.stepcustom": "Mô tả", - "submission.sections.submit.progressbar.describe.stepone": "Mô tả", - "submission.sections.submit.progressbar.describe.steptwo": "Mô tả", - "submission.sections.submit.progressbar.detect-duplicate": "Các trùng lặp xảy ra", - "submission.sections.submit.progressbar.license": "Giấy phép tiền gửi", - "submission.sections.submit.progressbar.sherpaPolicies": "Chính sách truy cập mở của nhà xuất bản", - "submission.sections.submit.progressbar.sherpapolicy": "Chính sách", - "submission.sections.submit.progressbar.upload": "Tải tệp lên", - "submission.sections.toggle.aria.close": "Thu hẹp phần {{sectionHeader}}", - "submission.sections.toggle.aria.open": "Mở rộng phần {{sectionHeader}}", - "submission.sections.toggle.close": "Đóng phiên", - "submission.sections.toggle.open": "Mở phiên mới", - "submission.sections.upload.delete.confirm.cancel": "Hủy", - "submission.sections.upload.delete.confirm.info": "Không thể hoàn tác thao tác này. Bạn có chắc không?", - "submission.sections.upload.delete.confirm.submit": "Có tôi chắc chắn", - "submission.sections.upload.delete.confirm.title": "Xóa dữ liệu số", - "submission.sections.upload.delete.submit": "Xóa", - "submission.sections.upload.download.title": "Tải dữ liệu số", - "submission.sections.upload.drop-message": "Kéo tệp đính kèm vào tài liệu", - "submission.sections.upload.edit.title": "Chỉnh sửa dữ liệu số", - "submission.sections.upload.form.access-condition-hint": "Chọn quyền truy cập áp dụng trên tệp tin khi biểu ghi được biên mục vào hệ thống.", - "submission.sections.upload.form.access-condition-label": "Loại điều kiện truy cập", - "submission.sections.upload.form.date-required": "Ngày yêu cầu", - "submission.sections.upload.form.date-required-from": "Bắt buộc phải khai báo thời gian để xác định ngày bắt đầu cấp quyền truy cập", - "submission.sections.upload.form.date-required-until": "Bắt buộc phải khai báo thời gian để xác định ngày kết thúc cấp quyền truy cập", - "submission.sections.upload.form.from-hint": "Chọn ngày mà quyền được áp dụng", - "submission.sections.upload.form.from-label": "Cấp quyền truy cập từ", - "submission.sections.upload.form.from-placeholder": "Từ", - "submission.sections.upload.form.group-label": "Nhóm", - "submission.sections.upload.form.group-required": "Nhóm yêu cầu.", - "submission.sections.upload.form.until-hint": "Chọn ngày hết hạn quyền truy cập", - "submission.sections.upload.form.until-label": "Cấp quyền truy cập cho đến khi", - "submission.sections.upload.form.until-placeholder": "Đến khi", - "submission.sections.upload.header.policy.default.nolist": "Các tệp tải lên trong bộ sưu tập {{collectionName}} sẽ cso quyền truy cập thep các nhóm sau:", - "submission.sections.upload.header.policy.default.withlist": "Xin lưu ý rằng các tệp đã tải lên trong bộ sưu tập {{collectionName}} sẽ có thể truy cập được ngoài những gì được quyết định rõ ràng cho một tệp với (các) nhóm sau:", - "submission.sections.upload.info": "Tại đây bạn sẽ tìm thấy tất cả các tệp hiện có trong tài liệu. Bạn có thể cập nhật thông tin mô tả tệp và điều kiện truy cập hoặc tải lên tệp bổ sung chỉ cần kéo và thả chúng ở mọi nơi trong trang", - "submission.sections.upload.no-entry": "Không", - "submission.sections.upload.no-file-uploaded": "Không có tệp tải lên.", - "submission.sections.upload.save-metadata": "Lưu thông tin mô tả", - "submission.sections.upload.undo": "Hủy", - "submission.sections.upload.upload-failed": "Tải lên lỗi", - "submission.sections.upload.upload-successful": "Tải lên thành công", - "submission.submit.breadcrumbs": "Gửi mới", - "submission.submit.title": "Gửi mới", - "submission.workflow.generic.delete": "Xóa", - "submission.workflow.generic.delete-help": "Nếu bạn muốn hủy tài liệu này hãy chọn \"Delete\". Sau đó bạn sẽ được yêu cầu xác nhận.\"", - "submission.workflow.generic.edit": "Chỉnh sửa", - "submission.workflow.generic.edit-help": "Chọn tùy chọn này để thay đổi thông tin mô tả của tài liệu.", - "submission.workflow.generic.view": "Xem", - "submission.workflow.generic.view-help": "Chọn tùy chọn này để xem dữ liệu cảu tài liệu.", - "submission.workflow.tasks.claimed.approve": "Chấp nhận", - "submission.workflow.tasks.claimed.approve_help": "Nếu bạn đã xem xét tài liệu và thấy phù hợp để đưa vào bộ sưu tập hãy chọn \"Approve\".", - "submission.workflow.tasks.claimed.edit": "Chỉnh sửa", - "submission.workflow.tasks.claimed.edit_help": "Chọn tùy chọn này để thay đổi thông tin mô tả của tài liệu.", - "submission.workflow.tasks.claimed.reject.reason.info": "Vui lòng nhập lý do từ chối gửi của bạn vào ô bên dưới cho biết liệu người gửi có thể khắc phục sự cố và gửi lại hay không.", - "submission.workflow.tasks.claimed.reject.reason.placeholder": "Mô tả lý do từ chối", - "submission.workflow.tasks.claimed.reject.reason.submit": "Từ chối tài liệu", - "submission.workflow.tasks.claimed.reject.reason.title": "Lý do", - "submission.workflow.tasks.claimed.reject.submit": "Từ chối", - "submission.workflow.tasks.claimed.reject_help": "Nếu bạn đã xem xét tài liệu và thấy không phù hợp để đưa vào bộ sưu tập hãy chọn \"Reject\". Sau đó bạn sẽ được yêu cầu nhập một thông báo cho biết lý do tại sao tài liệu đó không phù hợp và liệu người gửi có nên thay đổi điều gì đó và gửi lại hay không.", - "submission.workflow.tasks.claimed.return": "Trả lại nhiệm vụ", - "submission.workflow.tasks.claimed.return_help": "Trả tác vụ về nhóm để người dùng khác có thể thực hiện tác vụ.", - "submission.workflow.tasks.generic.error": "Đã xảy ra lỗi trong khi vận hành ...", - "submission.workflow.tasks.generic.processing": "Đang xử lý...", - "submission.workflow.tasks.generic.submitter": "Người gửi", - "submission.workflow.tasks.generic.success": "Hoạt động thành công", - "submission.workflow.tasks.pool.claim": "Nhận nhiệm vụ", - "submission.workflow.tasks.pool.claim_help": "Giao nhiệm vụ này cho chính bạn.", - "submission.workflow.tasks.pool.hide-detail": "Ẩn chi tiết", - "submission.workflow.tasks.pool.show-detail": "Xem chi tiết", - "submission.workspace.generic.view": "Xem", - "submission.workspace.generic.view-help": "Chọn tủy chọn để xem thông tin mô tả của tài liệu", - - "thumbnail.default.alt": "Hình ảnh thu nhỏ", - "thumbnail.default.placeholder": "Không có ảnh thu nhỏ nào", - "thumbnail.orgunit.alt": "Logo Đơn vị tổ chức", - "thumbnail.orgunit.placeholder": "Hỉnh ảnh giữ chỗ của đơn vị tổ chức", - "thumbnail.person.alt": "Ảnh hồ sơ", - "thumbnail.person.placeholder": "Không có ảnh hồ sơ nào", - "thumbnail.project.alt": "Logo dự án", - "thumbnail.project.placeholder": "Hình ảnh giữ chỗ của dự án", - - "title": "DSpace", - - "vocabulary-treeview.header": "Chế độ xem phân cấp", - "vocabulary-treeview.info": "Chọn một chủ đề để thêm làm bộ lọc tìm kiếm", - "vocabulary-treeview.load-more": "Xem thêm", - "vocabulary-treeview.search.form.reset": "Khôi phục", - "vocabulary-treeview.search.form.search": "Tìm kiếm", - "vocabulary-treeview.search.no-result": "Không có tài liệu nào hiển thị", - "vocabulary-treeview.tree.description.nsi": "Chỉ số Norwegian Science", - "vocabulary-treeview.tree.description.srsc": "Danh mục chủ đề", - - "uploader.browse": "duyệt", - "uploader.delete.btn-title": "Xóa", - "uploader.drag-message": "Kéo & thả tệp tại đây", - "uploader.processing": "Đang xử lý", - "uploader.queue-length": "Chiều dài hàng đợi", - - "virtual-metadata.delete-item.info": "Chọn kiểu mà bạn muốn lưu thông tin mô tả ảo làm thông tin mô tả thực", - "virtual-metadata.delete-item.modal-head": "Siêu dữ liệu ảo của mối quan hệ này", - "virtual-metadata.delete-relationship.modal-head": "Chọn các tài liệu mà bạn muốn lưu thông tin mô tả ảo làm thông tin mô tả thực", - - "supervisedWorkspace.search.results.head": "Supervised Items", - - - "workflow.search.results.head": "Tất cả nhiệm vụ", - "workflowAdmin.search.results.head": "Tiến trình làm việc của quản trị viên", - "workflow-item.delete.button.cancel": "Hủy", - "workflow-item.delete.button.confirm": "Xóa", - "workflow-item.delete.header": "Xóa tiến trình tài liệu", - "workflow-item.delete.notification.error.content": "Không thể xóa tiến trình tài liệu", - "workflow-item.delete.notification.error.title": "Đã xảy ra lỗi", - "workflow-item.delete.notification.success.content": " Tiến trình tài liệu này đã được xóa thành công", - "workflow-item.delete.notification.success.title": "Xóa", - "workflow-item.delete.title": "Xóa tiến trình tài liệu", - "workflow-item.edit.breadcrumbs": "Chỉnh sửa tiến trình tài liệu", - "workflow-item.edit.title": "Xem tiến trình tài liệu", - "workflow-item.send-back.button.cancel": "Hủy", - "workflow-item.send-back.button.confirm": "Gửi lại", - "workflow-item.send-back.header": "Gửi lại tiến trình tài liệucho người gửi", - "workflow-item.send-back.notification.error.content": "Không thể gửi lại tiến trình tài liệu cho người gửi", - "workflow-item.send-back.notification.error.title": "Đã xảy ra lỗi", - "workflow-item.send-back.notification.success.content": "Tiến trình tài liệu này đã được gửi lại thành công cho người gửi", - "workflow-item.send-back.notification.success.title": "Đã gửi lại cho người gửi", - "workflow-item.send-back.title": "Gửi lại tiến trình tài liệu cho người gửi", - "workflow-item.view.breadcrumbs": "Xem tiến trình", - "workspace.search.results.head": "Biểu ghi bạn đã tải lên", - "workspace-item.view.breadcrumbs": "Xem các tài liệu đang biên mục dở dang", - "workspace-item.view.title": "Xem các tài liệu đang biên mục dở dang", - - "idle-modal.extend-session": "Gia hạn phiên", - "idle-modal.header": "Phiên sẽ sớm hết hạn", - "idle-modal.info": "Vì lý do bảo mật các phiên của người dùng sẽ hết hạn sau {{timeToExpire}} phút không hoạt động. Phiên của bạn sẽ sớm hết hạn. Bạn muốn gia hạn hay đăng xuất?", - "idle-modal.log-out": "Đăng xuất", - - "researcher.profile.action.processing": "Đang xử lý…", - "researcher.profile.associated": "Hồ sơ nhà nghiên cứu đã được liên kết", - "researcher.profile.change-visibility.fail": "Đã xảy ra lỗi khi thay đổi chế độ hiển thị hồ sơ", - "researcher.profile.create.fail": "Đã có lỗi xảy ra trong khi tạo hồ sơ nhà nghiên cứu", - "researcher.profile.create.new": "Tạo mới", - "researcher.profile.create.success": "Đã tạo thành công hồ sơ nhà nghiên cứu", - "researcher.profile.delete": "Xóa", - "researcher.profile.expose": "Hiển thị", - "researcher.profile.hide": "Ẩn", - "researcher.profile.not.associated": "Hồ sơ nhà nghiên cứu chưa được liên kết", - "researcher.profile.private.visibility": "CÁ NHÂN", - "researcher.profile.public.visibility": "CÔNG CỘNG", - "researcher.profile.status": "Trạng thái:", - "researcher.profile.view": "Xem", - - "person.page.orcid": "ORCID", - "person.page.orcid.create": "Tạo một ID trên ORCID", - "person.page.orcid.funding-preferences": "Quỹ ưa thích", - "person.page.orcid.grant-authorizations": "Cấp quyền", - "person.page.orcid.granted-authorizations": "Quyền đã cấp", - "person.page.orcid.link": "Liên kết với ID ORCID", - "person.page.orcid.link.error.message": "Đã xảy ra lỗi khi kết nối hồ sơ với ORCID. Nếu sự cố vẫn tiếp tục xảy ra vui lòng liên hệ với quản trị viên.", - "person.page.orcid.link.processing": "Đang kết nối hồ sơ tới ORCID…", - "person.page.orcid.missing-authorizations": "Thiếu quyền", - "person.page.orcid.missing-authorizations-message": "Những quyền sau đang bị thiếu:", - "person.page.orcid.no-missing-authorizations-message": "Tuyệt! Ô này đang trống vì vậy bạn đã được cấp tất cả các quyền truy cập để sử dụng tất cả các chức năng do tổ chức của bạn cung cấp.", - "person.page.orcid.no-orcid-message": "Chưa có ID ORCID nào được liên kết. Bạn có thể click vào nút dưới đây để liên kết hồ sơ này với một tài khoản ORCID.", - "person.page.orcid.orcid-not-linked-message": "ID ORCID của hồ sơ này ({{ orcid }}) chưa được kết nối với tài khoản trên trang ORCID hoặc kết nối đã hết hạn.", - "person.page.orcid.profile-preferences": "Tham số của hồ sơ", - "person.page.orcid.publications-preferences": "Tham số của ấn phẩm", - "person.page.orcid.remove-orcid-message": "Nếu bạn cần xóa ORCID của bạn vui lòng liên hệ với quản trị viên.", - "person.page.orcid.save.preference.changes": "Cập nhật cài đặt", - "person.page.orcid.scope.activities-update": "Thêm\/cập nhật các hoạt động nghiên cứu của bạn", - "person.page.orcid.scope.authenticate": "Lấy ID ORCID của bạn", - "person.page.orcid.scope.person-update": "Thêm\/cập nhật thông tin cá nhân của bạn", - "person.page.orcid.scope.read-limited": "Thiết lập để cho phép Các bên Tin cậy (Trusted Parties) có khả năng đọc thông tin của bạn ", - "person.page.orcid.sync-fundings.all": "Tất cả quỹ", - "person.page.orcid.sync-fundings.disabled": "Đã ngừng kích hoạt", - "person.page.orcid.sync-fundings.mine": "Quỹ của tôi", - "person.page.orcid.sync-fundings.my_selected": "Quỹ đã chọn", - "person.page.orcid.synchronization-mode": "Chế độ đồng bộ", - "person.page.orcid.synchronization-mode.batch": "Theo lô", - "person.page.orcid.synchronization-mode.label": "Chế độ đồng bộ", - "person.page.orcid.synchronization-mode.manual": "Thủ công", - "person.page.orcid.synchronization-mode-funding-message": "Chọn gửi\/không gửi các thực thể dự án của bạn đến danh sách các quỹ tài trợ trong bản ghi ORCID của bạn hay không.", - "person.page.orcid.synchronization-mode-message": "Vui lòng chọn phương thức đồng bộ hóa với ORCID. Các tùy chọn bao gồm \"Thủ công\" (bạn phải gửi dữ liệu của mình tới ORCID theo cách thủ công) hoặc \"Tự động\" (hệ thống sẽ gửi dữ liệu của bạn tới ORCID thông qua tập lệnh đã lên lịch).", - "person.page.orcid.synchronization-mode-profile-message": "Chọn gửi\/ không gửi thông tin tiểu sử hoặc số định danh cá nhân tới hồ sơ ORCID của bạn.", - "person.page.orcid.synchronization-mode-publication-message": "Chọn gửi\/ không gửi các thực thể Ấn phẩm tới danh sách các tác phẩm trong biểu ghi ORCID của bạn.", - "person.page.orcid.synchronization-settings-update.error": "Cập nhật cài đặt đồng bộ hóa không thành công", - "person.page.orcid.synchronization-settings-update.success": "Cài đặt đồng bộ hóa đã được cập nhật thành công", - "person.page.orcid.sync-profile.affiliation": "Tổ chức", - "person.page.orcid.sync-profile.biographical": "Dữ liệu sinh trắc học", - "person.page.orcid.sync-profile.education": "Giáo dục", - "person.page.orcid.sync-profile.identifiers": "Định danh", - "person.page.orcid.sync-publications.all": "Tất cả ấn phẩm", - "person.page.orcid.sync-publications.disabled": "Đã ngừng kích hoạt", - "person.page.orcid.sync-publications.mine": "Ấn phẩm của tôi", - "person.page.orcid.sync-publications.my_selected": "Ấn phẩm đã chọn", - "person.page.orcid.sync-queue.description.affiliation": "Tổ chức", - "person.page.orcid.sync-queue.description.country": "Quốc gia", - "person.page.orcid.sync-queue.description.education": "Giáo dục", - "person.page.orcid.sync-queue.description.external_ids": "ID ngoài", - "person.page.orcid.sync-queue.description.keywords": "Từ khóa", - "person.page.orcid.sync-queue.description.other_names": "Tên khác", - "person.page.orcid.sync-queue.description.qualification": "Trình độ chuyên môn", - "person.page.orcid.sync-queue.description.researcher_urls": "URL nhà nghiên cứu", - "person.page.orcid.sync-queue.discard": "Hủy thay đổi và không đồng bộ với trang ORCID", - "person.page.orcid.sync-queue.discard.error": "Việc loại bỏ biểu ghi trong danh sách chờ của ORCID đã thất bại", - "person.page.orcid.sync-queue.discard.success": "Biểu ghi trong danh sách chờ của ORCID đã được hủy bỏ thành công", - "person.page.orcid.sync-queue.empty-message": "Danh sách chờ ORCID trống", - "person.page.orcid.sync-queue.send": "Đồng bộ với trang ORCID", - "person.page.orcid.sync-queue.send.bad-request-error": "Đẩy dữ liệu lên ORCID không thành công vì tài nguyên này không hợp lệ", - "person.page.orcid.sync-queue.send.conflict-error": "Đẩy dữ liệu lên ORCID không thành công bởi vì tài nguyên này đã có trên trang ORCID", - "person.page.orcid.sync-queue.send.error": "Đẩy dữ liệu lên ORCID không thành công", - "person.page.orcid.sync-queue.send.not-found-warning": "Tài nguyên không còn tồn tại trên ORCID.", - "person.page.orcid.sync-queue.send.success": "Đẩy dữ liệu lên ORCID thành công", - "person.page.orcid.sync-queue.send.unauthorized-error.content": "Nhấp
vào đây<\/a> để cấp lại các quyền bắt buộc. Nếu vấn đề vẫn còn tồn tại vui lòng liên hệ quản trị viên.", - "person.page.orcid.sync-queue.send.unauthorized-error.title": "Đẩy dữ liệu lên ORCID không thành công do tài khoản của bạn không đủ các quyền cần thiết.", - "person.page.orcid.sync-queue.send.validation-error": "Dữ liệu bạn muốn đồng bộ với ORCID là dữ liệu không hợp lệ", - "person.page.orcid.sync-queue.send.validation-error.amount-currency.required": "Đơn vị tiền tệ là bắt buộc", - "person.page.orcid.sync-queue.send.validation-error.country.invalid": "2 ký tự mã quốc gia theo ISO 3166 là không hợp lệ", - "person.page.orcid.sync-queue.send.validation-error.disambiguated-organization.required": "Cần có số định danh (ID) để phân biệt giữa các tổ chức. ID được hỗ trợ là GRID Ringgold LEI và số định dang Cơ quan đăng ký Crossref Funder", - "person.page.orcid.sync-queue.send.validation-error.disambiguated-organization.value-required": "Định danh của tổ chức yêu cầu phải có một giá trị", - "person.page.orcid.sync-queue.send.validation-error.disambiguation-source.invalid": "Nguồn của một trong các số định danh của tổ chức không hợp lệ. Các nguồn được hỗ trợ là RINGGOLD GRID LEI và FUNDREF", - "person.page.orcid.sync-queue.send.validation-error.disambiguation-source.required": "Phải có một nguồn cho định danh của tổ chức", - "person.page.orcid.sync-queue.send.validation-error.external-id.required": "Tài nguyên được gửi yêu cầu phải có ít nhất một định danh", - "person.page.orcid.sync-queue.send.validation-error.funder.required": "Nhà tài trợ là bắt buộc", - "person.page.orcid.sync-queue.send.validation-error.organization.address-required": "Tổ chức này yêu cầu phải có địa chỉ", - "person.page.orcid.sync-queue.send.validation-error.organization.city-required": "Địa chỉ của tổ chức này phải là một thành phố", - "person.page.orcid.sync-queue.send.validation-error.organization.country-required": "Địa chỉ của tổ chức này phải là một mã quốc gia bao gồm 2 ký tự theo ISO 3166", - "person.page.orcid.sync-queue.send.validation-error.organization.name-required": "Tên của tổ chức là bắt buộc", - "person.page.orcid.sync-queue.send.validation-error.organization.required": "Yêu cầu phải có tổ chức", - "person.page.orcid.sync-queue.send.validation-error.publication.date-invalid": "Năm xuất bản phải là năm sau năm 1900", - "person.page.orcid.sync-queue.send.validation-error.start-date.required": "Ngày bắt đầu là bắt buộc", - "person.page.orcid.sync-queue.send.validation-error.title.required": "Nhan đề là bắt buộc", - "person.page.orcid.sync-queue.send.validation-error.type.required": "Trường dc.type là bắt buộc", - "person.page.orcid.sync-queue.table.header.action": "Hành động", - "person.page.orcid.sync-queue.table.header.description": "Mô tả", - "person.page.orcid.sync-queue.table.header.type": "Loại hình tài liệu", - "person.page.orcid.sync-queue.tooltip.affiliation": "Tổ chức", - "person.page.orcid.sync-queue.tooltip.country": "Quốc gia", - "person.page.orcid.sync-queue.tooltip.delete": "Loại bỏ mục này khỏi trang ORCID", - "person.page.orcid.sync-queue.tooltip.education": "Giáo dục", - "person.page.orcid.sync-queue.tooltip.external_ids": "Định danh ", - "person.page.orcid.sync-queue.tooltip.insert": "Thêm mục mới trong ORCID", - "person.page.orcid.sync-queue.tooltip.keywords": "Từ khóa", - "person.page.orcid.sync-queue.tooltip.other_names": "Tên khác", - "person.page.orcid.sync-queue.tooltip.project": "Dự án", - "person.page.orcid.sync-queue.tooltip.publication": "Ấn phẩm", - "person.page.orcid.sync-queue.tooltip.qualification": "Trình độ chuyên môn", - "person.page.orcid.sync-queue.tooltip.researcher_urls": "URL nhà nghiên cứu", - "person.page.orcid.sync-queue.tooltip.update": "Cập nhật mục này trên trang ORCID", - "person.page.orcid.unlink": "Ngắt kết nối khỏi ORCID", - "person.page.orcid.unlink.error": "Đã xảy ra lỗi khi ngắt kết nối giữa hồ sơ và ORCID. Vui lòng thử lại.", - "person.page.orcid.unlink.processing": "Đang xử lý…", - "person.page.orcid.unlink.success": "Đã ngắt kết nối giữa hồ sơ nhà nghiên cứu và trang ORCID thành công", - - "person.orcid.registry.auth": "Được phép qua ORCID ", - "person.orcid.registry.queue": "Đang xếp hàng đợi đăng ký ORCID", - "person.orcid.sync.setting": "Thiết lập đồng bộ hóa với ORCID", - - "home.recent-submissions.head": "Các tài liệu tải lên gần đây", - - "listable-notification-object.default-message": "Không thể truy xuất", - - "system-wide-alert-banner.retrieval.error": "Đã xảy ra lỗi trong quá trình truy xuất cảnh báo hệ thống", - "system-wide-alert-banner.countdown.prefix": "Trong", - "system-wide-alert-banner.countdown.days": "{{days}} ngày", - "system-wide-alert-banner.countdown.hours": "{{hours}} giờ và", - "system-wide-alert-banner.countdown.minutes": "{{minutes}} phút:", - - "menu.section.system-wide-alert": "Cảnh báo toàn hệ thống", - - "system-wide-alert.form.header": "Cảnh báo toàn hệ thống", - "system-wide-alert-form.retrieval.error": "Đã xảy ra lỗi trong quá trình truy xuất cảnh báo trên toàn hệ thống", - "system-wide-alert.form.cancel": "Hủy", - "system-wide-alert.form.save": "Lưu", - "system-wide-alert.form.label.active": "HOẠT ĐỘNG", - "system-wide-alert.form.label.inactive": "KHÔNG HOẠT ĐỘNG", - "system-wide-alert.form.error.message": "Cảnh báo trên toàn hệ thống phải chứa một nội dung", - "system-wide-alert.form.label.message": "Nội dung cảnh báo", - "system-wide-alert.form.label.countdownTo.enable": "Kích hoạt thời gian tạm dừng máy chủ", - "system-wide-alert.form.label.countdownTo.hint": "Gợi ý: Thiết lập lịch tạm dừng máy chủ. Khi chức năng này được kích hoạt, có thể lựa chọn một ngày tạm dừng máy chủ trong tương lai và nội dung cảnh báo sẽ được đếm ngược tới ngày đã đặt. Khi bộ hẹn giờ này được kết thúc, nội dung này sẽ biến mất khỏi cảnh báo. Máy chủ sẽ không tự động tạm dừng.", - "system-wide-alert.form.label.preview": "Xem trước cảnh báo toàn hệ thống", - "system-wide-alert.form.update.success": "Cảnh báo toàn hệ thống đã được cập nhật thành công", - "system-wide-alert.form.update.error": "Đã xảy ra lỗi trong quá trình cập nhật cảnh báo toàn hệ thống", - "system-wide-alert.form.create.success": "Cảnh báo toàn hệ thống đã được tạo thành công", - "system-wide-alert.form.create.error": "Đã xảy ra lỗi trong quá trình tạo cảnh báo toàn hệ thống", - "admin.system-wide-alert.breadcrumbs": "Cảnh báo toàn hệ thống", - "admin.system-wide-alert.title": "Cảnh báo toàn hệ thống", + "journal.page.description": "Mô tả", + "journal.page.edit": "Chỉnh sửa tài liệu này", + "journal.page.editor": "Tổng biên tập", + "journal.page.issn": "ISSN", + "journal.page.publisher": "Nhà xuất bản", + "journal.page.titleprefix": "Tạp chí:", + "journal.search.results.head": "Kết quả tìm kiếm tạp chí", + "journal.search.title": "Tìm kiếm tạp chí", + "journalissue.listelement.badge": "Kỳ của tạp chí", + "journalissue.page.description": "Mô tả", + "journalissue.page.abstract": "Tóm tắt", + "journalissue.page.edit": "Chỉnh sửa tài liệu này", + "journalissue.page.issuedate": "Ngày xuất bản", + "journalissue.page.journal-issn": "ISSN", + "journalissue.page.journal-title": "Nhan đề tạp chí", + "journalissue.page.keyword": "Từ khóa chủ đề", + "journalissue.page.number": "Số lượng", + "journalissue.page.titleprefix": "Kỳ của tạp chí:", + "journal-relationships.search.results.head": "Kết quả tìm kiếm tạp chí", + "journalvolume.listelement.badge": "Tập của tạp chí", + "journalvolume.page.description": "Mô tả", + "journalvolume.page.edit": "Chỉnh sửa tài liệu này", + "journalvolume.page.issuedate": "Ngày xuất bản", + "journalvolume.page.titleprefix": "Tập của tạp chí:", + "journalvolume.page.volume": "Tập", + + + "iiif.listelement.badge": "Phương tiện hình ảnh", + "iiif.page.description": "Mô tả:", + "iiif.page.doi": "Đường dẫn cố định:", + "iiif.page.issue": "Vấn đề:", + "iiif.page.titleprefix": "Hình ảnh:", + "iiifsearchable.listelement.badge": "Phương tiện biểu ghi", + "iiifsearchable.page.description": "Mô tả:", + "iiifsearchable.page.doi": "Đường dẫn cố định:", + "iiifsearchable.page.issue": "Vấn đề:", + "iiifsearchable.page.titleprefix": "Tài liệu:", + "iiifviewer.fullscreen.notice": "Sử dụng chế độ toàn màn hình để xem tốt hơn.", + + "loading.bitstream": "Đang tải tệp tin...", + "loading.bitstreams": "Đang tải tệp tin...", + "loading.browse-by": "Đang tải tài liệu...", + "loading.browse-by-page": "Đang tải trang...", + "loading.collection": "Đang tải bộ sưu tập...", + "loading.collections": "Đang tải bộ sưu tập...", + "loading.community": "Đang tải đơn vị...", + "loading.content-source": "Đang tải nguồn nội dung...", + "loading.default": "Đang tải...", + "loading.item": "Đang tải tài liệu...", + "loading.items": "Đang tải tài liệu...", + "loading.mydspace-results": "Đang tải tài liệu...", + "loading.objects": "Đang tải...", + "loading.recent-submissions": "Đang tải các tài liệu mới gần đây...", + "loading.search-results": "Đanh tải kết quả tìm kiếm...", + "loading.sub-collections": "Đang tải bộ sưu tập con...", + "loading.sub-communities": "Đang tải đơn vị con...", + "loading.top-level-communities": "Đang tải các đơn vị lớn...", + + "login.breadcrumbs": "Đăng nhập", + "login.form.email": "Địa chỉ email", + "login.form.forgot-password": "Có phải bạn quên mật khẩu?", + "login.form.header": "Vui lòng đăng nhập vào DSpace", + "login.form.new-user": "Bạn là người dùng mới? \n Vui lòng nhấp vào đây để đăng kí.", + "login.form.oidc": "Đăng nhập với OIDC", + "login.form.orcid": "Đăng nhập với ORCID", + "login.form.or-divider": "hoặc", + "login.form.password": "Mật khẩu", + "login.form.shibboleth": "Đăng nhập bằng Shibboleth", + "login.form.submit": "Đăng nhập", + "login.title": "Đăng nhập", + + "logout.form.header": "Đăng xuất khỏi DSpace", + "logout.form.submit": "Đăng xuất", + "logout.title": "Đăng xuất", + + "menu.header.admin": "Quản trị", + "menu.header.admin.description": "Menu quản trị", + "menu.header.image.logo": "Logo của kho lưu trữ", + + "menu.section.access_control": "Người dùng và nhóm người dùng", + "menu.section.access_control_authorizations": "Chính sách phân quyền", + "menu.section.access_control_groups": "Nhóm người dùng", + "menu.section.access_control_people": "Người dùng", + "menu.section.admin_search": "Tìm kiếm quản trị", + "menu.section.browse_community": "Đơn vị này", + "menu.section.browse_community_by_author": "Tác giả", + "menu.section.browse_community_by_issue_date": "Năm xuất bản", + "menu.section.browse_community_by_title": "Nhan đề", + "menu.section.browse_global": "Duyệt tìm", + "menu.section.browse_global_by_author": "Tác giả", + "menu.section.browse_global_by_dateissued": "Năm xuất bản", + "menu.section.browse_global_by_subject": "Chủ đề", + "menu.section.browse_global_by_title": "Nhan đề", + "menu.section.browse_global_communities_and_collections": "Đơn vị & Bộ sưu tập", + "menu.section.control_panel": "Bảng điều khiển", + "menu.section.curation_task": "Kiểm tra dữ liệu", + "menu.section.edit": "Chỉnh sửa", + "menu.section.edit_collection": "Bộ sưu tập", + "menu.section.edit_community": "Đơn vị", + "menu.section.edit_item": "Tài liệu", + "menu.section.export": "Trích xuất", + "menu.section.export_batch": "Xuất dữ liệu (ZIP)", + "menu.section.export_collection": "Bộ sưu tập", + "menu.section.export_community": "Đơn vị", + "menu.section.export_item": "Tài liệu", + "menu.section.export_metadata": "Siêu dữ liệu", + "menu.section.health": "Kiểm tra hệ thống", + "menu.section.icon.access_control": "Phần menu của mục Người dùng và Nhóm người dùng", + "menu.section.icon.admin_search": "Phần menu của mục Tìm kiếm quản trị", + "menu.section.icon.control_panel": "Phần menu của mục Bảng điều khiển", + "menu.section.icon.curation_tasks": "Phần menu của Nhiệm vụ kiểm tra", + "menu.section.icon.edit": "Phần menu của mục Chỉnh sửa", + "menu.section.icon.export": "Phần menu của mục Trích xuất dữ liệu", + "menu.section.icon.find": "Phần menu của mục Tìm kiếm", + "menu.section.icon.health": "Phần menu của mục Kiểm tra hệ thống", + "menu.section.icon.import": "Phần menu của mục Nhập dữ liệu", + "menu.section.icon.new": "Phần menu của mục Tạo mới", + "menu.section.icon.pin": "Ghim thanh quản trị", + "menu.section.icon.processes": "Phần menu của mục Tiến trình", + "menu.section.icon.registries": "Phần menu của mục Thống số chung", + "menu.section.icon.statistics_task": "Phần menu của mục Nhiệm vụ báo cáo thống kê", + "menu.section.icon.unpin": "Bỏ ghim thanh quản trị", + "menu.section.icon.workflow": "Phần menu của mục Quản trị luồng công việc", + "menu.section.import": "Nhập dữ liệu", + "menu.section.import_batch": "Nhập liệu theo lô (ZIP)", + "menu.section.import_metadata": "Siêu dữ liệu", + "menu.section.new": "Tạo mới", + "menu.section.new_collection": "Bộ sưu tập", + "menu.section.new_community": "Đơn vị", + "menu.section.new_item": "Tài liệu", + "menu.section.new_item_version": "Phiên bản tài liệu", + "menu.section.new_process": "Tiến trình", + "menu.section.pin": "Ghim thanh quản trị", + "menu.section.policies_metadata": "Chính sách phân quyền", + "menu.section.processes": "Tiến trình", + "menu.section.registries": "Thông số chung", + "menu.section.registries_format": "Định dạng tệp tin số", + "menu.section.registries_metadata": "Trường dữ liệu", + "menu.section.statistics": "Báo cáo thống kê", + "menu.section.statistics_admin": "Báo cáo thống kê", + "menu.section.statistics_admin_metadata": "Báo cáo thống kê", + "menu.section.statistics_task": "Nhiệm vụ báo cáo thống kê", + "menu.section.toggle.access_control": "Phần chuyển đổi Người dùng và Nhóm người dùng", + "menu.section.toggle.control_panel": "Phần chuyển đổi Bảng điều khiển", + "menu.section.toggle.curation_task": "Phần chuyển đổi Kiểm tra dữ liệu", + "menu.section.toggle.edit": "Phần chuyển đổi Chỉnh sửa", + "menu.section.toggle.export": "Phần chuyển đổi Trích xuất dữ liệu", + "menu.section.toggle.find": "Phần chuyển đổi Tìm kiếm", + "menu.section.toggle.import": "Phần chuyển đổi Nhập dữ liệu", + "menu.section.toggle.new": "Phần chuyển đổi Tạo mới", + "menu.section.toggle.registries": "Phần chuyển đổi thông số chung", + "menu.section.toggle.statistics_task": "Phần chuyển đổi Nhiệm vụ Báo cáo thống kê", + "menu.section.unpin": "Bỏ ghim thanh quản trị", + "menu.section.workflow": "Quản trị dòng công việc", + + "metadata-export-search.submit.error": "Xảy ra lỗi trong quá trình xuất dữ liệu", + "metadata-export-search.submit.success": "Quá trình xuất dữ liệu đã được khởi chạy thành công", + "metadata-export-search.tooltip": "Xuất kết quả tìm kiếm ra CSV", + + "mydspace.breadcrumbs": "Trang cá nhân", + "mydspace.messages.controller-help": "Chọn tùy chọn này để gửi tin nhắn tới người biên mục tài liệu.", + "mydspace.messages.description-placeholder": "Thêm tin nhắn của bạn tại đây...", + "mydspace.messages.hide-msg": "Ẩn tin nhắn", + "mydspace.messages.mark-as-read": "Đánh dấu đã đọc", + "mydspace.messages.mark-as-unread": "Đánh dấu chưa đọc", + "mydspace.messages.no-content": "Không có nội dung.", + "mydspace.messages.no-messages": "Không có tin nhắn nào.", + "mydspace.messages.send-btn": "Gửi", + "mydspace.messages.show-msg": "Hiển thị tin nhắn", + "mydspace.messages.subject-placeholder": "Chủ đề...", + "mydspace.messages.submitter-help": "Chọn tùy chọn này để gửi tin nhắn tới người quản trị.", + "mydspace.messages.title": "Tin nhắn", + "mydspace.messages.to": "Tới", + "mydspace.new-submission": "Tạo tài liệu mới", + "mydspace.new-submission-external": "Nhập thông tin mô tả từ nguồn bên ngoài", + "mydspace.new-submission-external-short": "Nhập thông tin mô tả", + "mydspace.results.head": "Tài liệu của tôi", + "mydspace.results.no-abstract": "Không có tóm tắt", + "mydspace.results.no-authors": "Không có tác giả", + "mydspace.results.no-collections": "Không có bộ sưu tập", + "mydspace.results.no-date": "Không có thời gian xuất bản", + "mydspace.results.no-files": "Không có tệp đính kèm", + "mydspace.results.no-results": "Không có tài liệu để hiển thị", + "mydspace.results.no-title": "Không có nhan đề", + "mydspace.results.no-uri": "Không có URL", + "mydspace.search-form.placeholder": "Tìm kiếm trong trang cá nhân của tôi...", + "mydspace.show.workflow": "Tất cả nhiệm vụ", + "mydspace.show.workspace": "Tài liệu của tôi", + "mydspace.status.archived": "Đã lưu trữ", + "mydspace.status.validation": "Đang kiểm tra", + "mydspace.status.waiting-for-controller": "Đợi nhận nhiệm vụ", + "mydspace.status.workflow": "Đang kiểm duyệt", + "mydspace.status.workspace": "Đang biên mục", + "mydspace.title": "Trang cá nhân", + "mydspace.upload.upload-failed": "Có lỗi xảy ra khi tạo tài liệu mới. Vui lòng xác minh nội dung đã tải lên trước khi thử lại.", + "mydspace.upload.upload-failed-manyentries": "Không thể xử lý tệp tin. Có quá nhiều mục trong khi hệ thống chỉ cho phép một mục trong tệp tin.", + "mydspace.upload.upload-failed-moreonefile": "Không thể xử lý yêu cầu. Chỉ cho phép một tệp tin duy nhất.", + "mydspace.upload.upload-multiple-successful": "Đã tạo {{qty}} mục không gian làm việc mới.", + "mydspace.view-btn": "Xem chi tiết", + + "nav.browse.header": "Tất cả DSpace", + "nav.community-browse.header": "Theo Đơn vị", + "nav.language": "Chuyển ngôn ngữ", + "nav.login": "Đăng nhập", + "nav.logout": "Menu Hồ sơ cá nhân và Đăng xuất", + "nav.main.description": "Thanh điều hướng chính", + "nav.mydspace": "Trang cá nhân", + "nav.profile": "Hồ sơ cá nhân", + "nav.search": "Tìm kiếm", + "nav.statistics.header": "Báo cáo thống kê", + "nav.stop-impersonating": "Ngừng giả danh Người dùng", + "nav.toggle": "Điều hướng chuyển", + "nav.user.description": "Thanh hồ sơ người dùng", + "nav.user-profile-menu-and-logout": "Trình đơn Hồ sơ cá nhân và Đăng xuất", + + "none.listelement.badge": "Tài liệu", + + "orgunit.listelement.badge": "Đơn vị\/Tổ chức", + "orgunit.listelement.no-title": "Không có nhan đề", + "orgunit.page.city": "Thành phố", + "orgunit.page.country": "Quốc gia", + "orgunit.page.dateestablished": "Ngày thành lập", + "orgunit.page.description": "Mô tả", + "orgunit.page.edit": "Chỉnh sửa tài liệu", + "orgunit.page.id": "ID", + "orgunit.page.titleprefix": "Đơn vị\/Tổ chức", + + "pagination.next.button": "Tiếp theo", + "pagination.next.button.disabled.tooltip": "Không còn trang kết quả khác", + "pagination.options.description": "Tùy chọn Phân trang", + "pagination.previous.button": "Quay lại", + "pagination.results-per-page": "Số kết quả\/trang", + "pagination.showing.detail": "{{ range }} của tổng số {{ total }} kết quả", + "pagination.showing.label": "Đang hiển thị ", + "pagination.sort-direction": "Tùy chọn sắp xếp", + + "person.listelement.badge": "Nhà nghiên cứu", + "person.listelement.no-title": "Không tìm thấy tên", + "person.orcid.registry.auth": "Được phép qua ORCID ", + "person.orcid.registry.queue": "Đang xếp hàng đợi đăng ký ORCID", + "person.orcid.sync.setting": "Thiết lập đồng bộ hóa với ORCID", + "person.page.birthdate": "Ngày sinh", + "person.page.edit": "Chỉnh sửa tài liệu", + "person.page.email": "Email", + "person.page.firstname": "Tên", + "person.page.jobtitle": "Chức vụ", + "person.page.abtract": "Tiểu sử", + "person.page.description": "Mô tả", + "person.page.lastname": "Họ", + "person.page.link.full": "Hiển thị chi tiết", + "person.page.name": "Tên", + "person.page.orcid": "ORCID", + "person.page.orcid.create": "Tạo một ID trên ORCID", + "person.page.orcid.funding-preferences": "Quỹ ưa thích", + "person.page.orcid.grant-authorizations": "Cấp quyền", + "person.page.orcid.granted-authorizations": "Quyền đã cấp", + "person.page.orcid.link": "Liên kết với ID ORCID", + "person.page.orcid.link.error.message": "Đã xảy ra lỗi khi kết nối hồ sơ với ORCID. Nếu sự cố vẫn tiếp tục xảy ra vui lòng liên hệ với quản trị viên.", + "person.page.orcid.link.processing": "Đang kết nối hồ sơ tới ORCID…", + "person.page.orcid.missing-authorizations": "Thiếu quyền", + "person.page.orcid.missing-authorizations-message": "Những quyền sau đang bị thiếu:", + "person.page.orcid.no-missing-authorizations-message": "Tuyệt! Ô này đang trống vì vậy bạn đã được cấp tất cả các quyền truy cập để sử dụng tất cả các chức năng do tổ chức của bạn cung cấp.", + "person.page.orcid.no-orcid-message": "Chưa có ID ORCID nào được liên kết. Bạn có thể click vào nút dưới đây để liên kết hồ sơ này với một tài khoản ORCID.", + "person.page.orcid.orcid-not-linked-message": "ID ORCID của hồ sơ này ({{ orcid }}) chưa được kết nối với tài khoản trên trang ORCID hoặc kết nối đã hết hạn.", + "person.page.orcid.profile-preferences": "Tham số của hồ sơ", + "person.page.orcid.publications-preferences": "Tham số của ấn phẩm", + "person.page.orcid.remove-orcid-message": "Nếu bạn cần xóa ORCID của bạn vui lòng liên hệ với quản trị viên.", + "person.page.orcid.save.preference.changes": "Cập nhật cài đặt", + "person.page.orcid.scope.activities-update": "Thêm\/cập nhật các hoạt động nghiên cứu của bạn", + "person.page.orcid.scope.authenticate": "Lấy ID ORCID của bạn", + "person.page.orcid.scope.person-update": "Thêm\/cập nhật thông tin cá nhân của bạn", + "person.page.orcid.scope.read-limited": "Thiết lập để cho phép Các bên Tin cậy (Trusted Parties) có khả năng đọc thông tin của bạn ", + "person.page.orcid.sync-fundings.all": "Tất cả quỹ", + "person.page.orcid.sync-fundings.disabled": "Đã ngừng kích hoạt", + "person.page.orcid.sync-fundings.mine": "Quỹ của tôi", + "person.page.orcid.sync-fundings.my_selected": "Quỹ đã chọn", + "person.page.orcid.synchronization-mode": "Chế độ đồng bộ", + "person.page.orcid.synchronization-mode.batch": "Theo lô", + "person.page.orcid.synchronization-mode.label": "Chế độ đồng bộ", + "person.page.orcid.synchronization-mode.manual": "Thủ công", + "person.page.orcid.synchronization-mode-funding-message": "Chọn gửi\/không gửi các thực thể dự án của bạn đến danh sách các quỹ tài trợ trong bản ghi ORCID của bạn hay không.", + "person.page.orcid.synchronization-mode-message": "Vui lòng chọn phương thức đồng bộ hóa với ORCID. Các tùy chọn bao gồm \"Thủ công\" (bạn phải gửi dữ liệu của mình tới ORCID theo cách thủ công) hoặc \"Tự động\" (hệ thống sẽ gửi dữ liệu của bạn tới ORCID thông qua tập lệnh đã lên lịch).", + "person.page.orcid.synchronization-mode-profile-message": "Chọn gửi\/ không gửi thông tin tiểu sử hoặc số định danh cá nhân tới hồ sơ ORCID của bạn.", + "person.page.orcid.synchronization-mode-publication-message": "Chọn gửi\/ không gửi các thực thể Ấn phẩm tới danh sách các tác phẩm trong biểu ghi ORCID của bạn.", + "person.page.orcid.synchronization-settings-update.error": "Cập nhật cài đặt đồng bộ hóa không thành công", + "person.page.orcid.synchronization-settings-update.success": "Cài đặt đồng bộ hóa đã được cập nhật thành công", + "person.page.orcid.sync-profile.affiliation": "Tổ chức", + "person.page.orcid.sync-profile.biographical": "Dữ liệu sinh trắc học", + "person.page.orcid.sync-profile.education": "Giáo dục", + "person.page.orcid.sync-profile.identifiers": "Định danh", + "person.page.orcid.sync-publications.all": "Tất cả ấn phẩm", + "person.page.orcid.sync-publications.disabled": "Đã ngừng kích hoạt", + "person.page.orcid.sync-publications.mine": "Ấn phẩm của tôi", + "person.page.orcid.sync-publications.my_selected": "Ấn phẩm đã chọn", + "person.page.orcid.sync-queue.description.affiliation": "Tổ chức", + "person.page.orcid.sync-queue.description.country": "Quốc gia", + "person.page.orcid.sync-queue.description.education": "Giáo dục", + "person.page.orcid.sync-queue.description.external_ids": "ID ngoài", + "person.page.orcid.sync-queue.description.keywords": "Từ khóa", + "person.page.orcid.sync-queue.description.other_names": "Tên khác", + "person.page.orcid.sync-queue.description.qualification": "Trình độ chuyên môn", + "person.page.orcid.sync-queue.description.researcher_urls": "URL nhà nghiên cứu", + "person.page.orcid.sync-queue.discard": "Hủy thay đổi và không đồng bộ với trang ORCID", + "person.page.orcid.sync-queue.discard.error": "Việc loại bỏ biểu ghi trong danh sách chờ của ORCID đã thất bại", + "person.page.orcid.sync-queue.discard.success": "Biểu ghi trong danh sách chờ của ORCID đã được hủy bỏ thành công", + "person.page.orcid.sync-queue.empty-message": "Danh sách chờ ORCID trống", + "person.page.orcid.sync-queue.send": "Đồng bộ với trang ORCID", + "person.page.orcid.sync-queue.send.bad-request-error": "Đẩy dữ liệu lên ORCID không thành công vì tài nguyên này không hợp lệ", + "person.page.orcid.sync-queue.send.conflict-error": "Đẩy dữ liệu lên ORCID không thành công bởi vì tài nguyên này đã có trên trang ORCID", + "person.page.orcid.sync-queue.send.error": "Đẩy dữ liệu lên ORCID không thành công", + "person.page.orcid.sync-queue.send.not-found-warning": "Tài nguyên không còn tồn tại trên ORCID.", + "person.page.orcid.sync-queue.send.success": "Đẩy dữ liệu lên ORCID thành công", + "person.page.orcid.sync-queue.send.unauthorized-error.content": "Nhấp vào đây<\/a> để cấp lại các quyền bắt buộc. Nếu vấn đề vẫn còn tồn tại vui lòng liên hệ quản trị viên.", + "person.page.orcid.sync-queue.send.unauthorized-error.title": "Đẩy dữ liệu lên ORCID không thành công do tài khoản của bạn không đủ các quyền cần thiết.", + "person.page.orcid.sync-queue.send.validation-error": "Dữ liệu bạn muốn đồng bộ với ORCID là dữ liệu không hợp lệ", + "person.page.orcid.sync-queue.send.validation-error.amount-currency.required": "Đơn vị tiền tệ là bắt buộc", + "person.page.orcid.sync-queue.send.validation-error.country.invalid": "2 ký tự mã quốc gia theo ISO 3166 là không hợp lệ", + "person.page.orcid.sync-queue.send.validation-error.disambiguated-organization.required": "Cần có số định danh (ID) để phân biệt giữa các tổ chức. ID được hỗ trợ là GRID Ringgold LEI và số định dang Cơ quan đăng ký Crossref Funder", + "person.page.orcid.sync-queue.send.validation-error.disambiguated-organization.value-required": "Định danh của tổ chức yêu cầu phải có một giá trị", + "person.page.orcid.sync-queue.send.validation-error.disambiguation-source.invalid": "Nguồn của một trong các số định danh của tổ chức không hợp lệ. Các nguồn được hỗ trợ là RINGGOLD GRID LEI và FUNDREF", + "person.page.orcid.sync-queue.send.validation-error.disambiguation-source.required": "Phải có một nguồn cho định danh của tổ chức", + "person.page.orcid.sync-queue.send.validation-error.external-id.required": "Tài nguyên được gửi yêu cầu phải có ít nhất một định danh", + "person.page.orcid.sync-queue.send.validation-error.funder.required": "Nhà tài trợ là bắt buộc", + "person.page.orcid.sync-queue.send.validation-error.organization.address-required": "Tổ chức này yêu cầu phải có địa chỉ", + "person.page.orcid.sync-queue.send.validation-error.organization.city-required": "Địa chỉ của tổ chức này phải là một thành phố", + "person.page.orcid.sync-queue.send.validation-error.organization.country-required": "Địa chỉ của tổ chức này phải là một mã quốc gia bao gồm 2 ký tự theo ISO 3166", + "person.page.orcid.sync-queue.send.validation-error.organization.name-required": "Tên của tổ chức là bắt buộc", + "person.page.orcid.sync-queue.send.validation-error.organization.required": "Yêu cầu phải có tổ chức", + "person.page.orcid.sync-queue.send.validation-error.publication.date-invalid": "Năm xuất bản phải là năm sau năm 1900", + "person.page.orcid.sync-queue.send.validation-error.start-date.required": "Ngày bắt đầu là bắt buộc", + "person.page.orcid.sync-queue.send.validation-error.title.required": "Nhan đề là bắt buộc", + "person.page.orcid.sync-queue.send.validation-error.type.required": "Trường dc.type là bắt buộc", + "person.page.orcid.sync-queue.table.header.action": "Hành động", + "person.page.orcid.sync-queue.table.header.description": "Mô tả", + "person.page.orcid.sync-queue.table.header.type": "Loại hình tài liệu", + "person.page.orcid.sync-queue.tooltip.affiliation": "Tổ chức", + "person.page.orcid.sync-queue.tooltip.country": "Quốc gia", + "person.page.orcid.sync-queue.tooltip.delete": "Loại bỏ mục này khỏi trang ORCID", + "person.page.orcid.sync-queue.tooltip.education": "Giáo dục", + "person.page.orcid.sync-queue.tooltip.external_ids": "Định danh ", + "person.page.orcid.sync-queue.tooltip.insert": "Thêm mục mới trong ORCID", + "person.page.orcid.sync-queue.tooltip.keywords": "Từ khóa", + "person.page.orcid.sync-queue.tooltip.other_names": "Tên khác", + "person.page.orcid.sync-queue.tooltip.project": "Dự án", + "person.page.orcid.sync-queue.tooltip.publication": "Ấn phẩm", + "person.page.orcid.sync-queue.tooltip.qualification": "Trình độ chuyên môn", + "person.page.orcid.sync-queue.tooltip.researcher_urls": "URL nhà nghiên cứu", + "person.page.orcid.sync-queue.tooltip.update": "Cập nhật mục này trên trang ORCID", + "person.page.orcid.unlink": "Ngắt kết nối khỏi ORCID", + "person.page.orcid.unlink.error": "Đã xảy ra lỗi khi ngắt kết nối giữa hồ sơ và ORCID. Vui lòng thử lại.", + "person.page.orcid.unlink.processing": "Đang xử lý…", + "person.page.orcid.unlink.success": "Đã ngắt kết nối giữa hồ sơ nhà nghiên cứu và trang ORCID thành công", + "person.page.staffid": "ID nhân viên", + "person.page.titleprefix": "Nhà nghiên cứu", + "person.search.results.head": "Kết quả tìm kiếm Nhà nghiên cứu", + "person.search.title": "Tìm kiếm Nhà nghiên cứu", + "person-relationships.search.results.head": "Kết quả tìm kiếm Tác giả\/Nhà nghiên cứu", + + "process.bulk.delete.error.body": "Không thể xóa tiến trình có ID {{ processId}}. Các tiến trình còn lại sẽ tiếp tục bị xóa.", + "process.bulk.delete.error.head": "Đã xảy ra lỗi khi xóa tiến trình", + "process.detail.actions": "Hành động", + "process.detail.arguments": "Tham số", + "process.detail.arguments.empty": "Tiến trình này không chứa bất kì tham số nào", + "process.detail.back": "Quay lại", + "process.detail.create": "Tạo tiến trình tương tự", + "process.detail.delete.body": "Bạn có chắc chắn muốn xóa tiến trình hiện tại?", + "process.detail.delete.button": "Xóa tiến trình", + "process.detail.delete.cancel": "Hủy", + "process.detail.delete.confirm": "Xóa tiến trình", + "process.detail.delete.error": "Đã xảy ra sự cố trong khi xóa tiến trình", + "process.detail.delete.header": "Xóa tiến trình", + "process.detail.delete.success": "Tiến trình đã được xóa thành công.", + "process.detail.end-time": "Thời gian kết thúc", + "process.detail.logs.button": "Tìm kiếm đầu ra của tiến trình", + "process.detail.logs.loading": "Đang tìm kiếm", + "process.detail.logs.none": "Tiến trình này không có đầu ra nào", + "process.detail.output": "Đầu ra của tiến trình", + "process.detail.output-files": "Tệp tin đầu ra", + "process.detail.output-files.empty": "Tiến trình này không chứa tệp tin đầu ra nào", + "process.detail.script": "Tập lệnh", + "process.detail.start-time": "Thời gian bắt đầu", + "process.detail.status": "Trạng thái", + "process.detail.title": "Tiến trình: {{ id }} - {{ name }}", + "process.new.breadcrumbs": "Tạo tiến trình mới", + "process.new.cancel": "Hủy", + "process.new.header": "Tạo tiến trình mới", + "process.new.notification.error.content": "Đã có lỗi xảy ra trong khi tạo tiến trình", + "process.new.notification.error.title": "Lỗi", + "process.new.notification.success.content": "Tiến trình đã được thực hiện thành công", + "process.new.notification.success.title": "Thành công", + "process.new.parameter.file.required": "Vui lòng chọn một tệp tin", + "process.new.parameter.file.upload-button": "Chọn tệp tin...", + "process.new.parameter.required.missing": "Các tham số bắt buộc sau đang bị thiếu:", + "process.new.parameter.string.required": "Giá trị tham số là bắt buộc", + "process.new.parameter.type.file": "tệp tin", + "process.new.parameter.type.value": "giá trị", + "process.new.select-parameters": "Tham số", + "process.new.select-script": "Tập lệnh", + "process.new.select-script.placeholder": "Chọn một tập lệnh...", + "process.new.select-script.required": "Tập lệnh là bắt buộc", + "process.new.submit": "Lưu", + "process.new.title": "Tạo tiến trình mới", + "process.overview.breadcrumbs": "Tiến trình tổng quan", + "process.overview.delete": "Xóa {{count}} tiến trình", + "process.overview.delete.body": "Bạn có chắc chắn muốn xóa {{count}} tiến trình?", + "process.overview.delete.clear": "Xóa các tiến trình đã chọn", + "process.overview.delete.header": "Xóa", + "process.overview.new": "Tạo mới", + "process.overview.table.actions": "Hành động", + "process.overview.table.finish": "Thời gian kết thúc", + "process.overview.table.id": "ID tiến trình", + "process.overview.table.name": "Tên", + "process.overview.table.start": "Thời gian bắt đầu", + "process.overview.table.status": "Trạng thái", + "process.overview.table.user": "Người dùng", + "process.overview.title": "Tổng quan tiến trình", + + "profile.breadcrumbs": "Cập nhật hồ sơ", + "profile.card.identify": "Hồ sơ định danh", + "profile.card.researcher": "Định danh", + "profile.card.security": "Bảo mật", + "profile.form.submit": "Lưu", + "profile.groups.head": "Nhóm quyền của bạn", + "profile.head": "Cập nhật hồ sơ", + "profile.metadata.form.error.firstname.required": "Yêu cầu nhập Tên của người dùng", + "profile.metadata.form.error.lastname.required": "Yêu cầu nhập Họ của người dùng", + "profile.metadata.form.label.email": "Địa chỉ email", + "profile.metadata.form.label.firstname": "Tên", + "profile.metadata.form.label.language": "Ngôn ngữ", + "profile.metadata.form.label.lastname": "Họ", + "profile.metadata.form.label.phone": "Số điện thoại liên hệ", + "profile.metadata.form.notifications.success.content": "Cập nhật hồ sơ thành công .", + "profile.metadata.form.notifications.success.title": "Lưu hồ sơ", + "profile.notifications.warning.no-changes.content": "Không có thay đổi nào trên hồ sơ của bạn.", + "profile.notifications.warning.no-changes.title": "Không thay đổi", + "profile.security.form.error.matching-passwords": "Mật khẩu không khớp.", + "profile.security.form.info": "Nhập vào mật khẩu mới và xác nhận mật khẩu vào ô phía dưới. Độ dài tối thiểu của mật khẩu là 6 ký tự.", + "profile.security.form.label.current-password": "Mật khẩu hiện tại", + "profile.security.form.label.password": "Mật khẩu", + "profile.security.form.label.passwordrepeat": "Nhập lại mật khẩu để xác nhận", + "profile.security.form.notifications.error.change-failed": "Đã xảy ra lỗi khi thay đổi mật khẩu. Vui lòng kiểm tra lại tính chính xác của mật khẩu hiện tại.", + "profile.security.form.notifications.error.general": "Vui lòng điền vào các trường bắt buộc của biểu mẫu bảo mật.", + "profile.security.form.notifications.error.not-same": "Mật khẩu được cung cấp không giống nhau.", + "profile.security.form.notifications.error.title": "Thay đổi mật khẩu không thành công", + "profile.security.form.notifications.success.content": "Thay đổi mật khẩu thành công.", + "profile.security.form.notifications.success.title": "Đã lưu mật khẩu", + "profile.special.groups.head": "Phân quyền cho các nhóm đặc biệt mà bạn thuộc về", + "profile.title": "Cập nhật hồ sơ", + + "project.listelement.badge": "Dự án nghiên cứu", + "project.page.contributor": "Người tham gia", + "project.page.description": "Mô tả", + "project.page.edit": "Chỉnh sửa tài liệu", + "project.page.expectedcompletion": "Dự kiến hoàn thành", + "project.page.funder": "Nhà tài trợ", + "project.page.id": "ID", + "project.page.keyword": "Từ khóa", + "project.page.status": "Trạng thái", + "project.page.titleprefix": "Dự án nghiên cứu:", + "project.search.results.head": "Kết quả tìm kiếm dự án", + "project-relationships.search.results.head": "Kết quả tìm kiếm dự án", + + "publication.listelement.badge": "Ấn phẩm", + "publication.page.description": "Mô tả", + "publication.page.edit": "Chỉnh sửa tài liệu", + "publication.page.journal-issn": "ISSN tạp chí", + "publication.page.journal-title": "Nhan đề tạp chí", + "publication.page.publisher": "Nhà xuất bản", + "publication.page.titleprefix": "Ấn phẩm: ", + "publication.page.volume-title": "Nhan đề tập", + "publication.search.results.head": "Kết quả tìm kiếm ấn phẩm", + "publication.search.title": "Tìm kiếm ấn phẩm", + "publication-relationships.search.results.head": "Kết quả tìm kiếm ấn phẩm", + + "media-viewer.next": "Tiếp theot", + "media-viewer.playlist": "Danh sách phát", + "media-viewer.previous": "Quay lại", + + "register-email.title": "Đăng ký tài khoản mới", + "register-page.create-profile.header": "Tạo hồ sơ", + "register-page.create-profile.identification.contact": "Điện thoại liên hệ", + "register-page.create-profile.identification.email": "Địa chỉ email", + "register-page.create-profile.identification.first-name": "Tên *", + "register-page.create-profile.identification.first-name.error": "Nhập vào tên của người dùng", + "register-page.create-profile.identification.header": "Hồ sơ định danh", + "register-page.create-profile.identification.language": "Ngôn ngữ", + "register-page.create-profile.identification.last-name": "Họ *", + "register-page.create-profile.identification.last-name.error": "Nhập vào họ của người dùng", + "register-page.create-profile.security.error.empty-password": "Nhập mật khẩu vào ô phía dưới.", + "register-page.create-profile.security.error.matching-passwords": "Mật khẩu không khớp.", + "register-page.create-profile.security.header": "Bảo mật", + "register-page.create-profile.security.info": "Nhập vào mật khẩu mới và xác nhận mật khẩu vào ô phía dưới. Độ dài tối thiểu của mật khẩu là 6 ký tự.", + "register-page.create-profile.security.label.password": "Mật khẩu *", + "register-page.create-profile.security.label.passwordrepeat": "Nhập lại để xác nhận *", + "register-page.create-profile.submit": "Đăng ký thành công", + "register-page.create-profile.submit.error.content": "Đã có sự cố xảy ra khi đăng ký người dùng mới.", + "register-page.create-profile.submit.error.head": "Đăng ký lỗi", + "register-page.create-profile.submit.success.content": "Đăng ký thành công. Bạn đã đăng nhập với tư cách người dùng mới", + "register-page.create-profile.submit.success.head": "Đăng ký thành công", + "register-page.registration.email": "Địa chỉ email *", + "register-page.registration.email.error.pattern": "Vui lòng nhập một địa chỉ email hợp lệ", + "register-page.registration.email.error.required": "Vui lòng nhập vào địa chỉ email", + "register-page.registration.email.hint": "Địa chỉ này sẽ được xác minh và dùng làm tên đăng nhập của bạn.", + "register-page.registration.error.content": "Đã xảy ra lỗi khi đăng ký địa chỉ email sau: {{ email }}", + "register-page.registration.error.head": "Lỗi khi đăng ký email", + "register-page.registration.error.recaptcha": "Lỗi khi thực hiện xác minh bằng recaptcha", + "register-page.registration.google-recaptcha.must-accept-cookies": "Để đăng ký bạn phải chấp nhận cookie Đăng ký và khôi phục mật khẩu<\/b> (Google reCaptcha).", + "register-page.registration.google-recaptcha.notification.message.error": "Xác minh đã hết hạn. Vui lòng xác minh lại.", + "register-page.registration.google-recaptcha.notification.message.expired": "Đã xảy ra lỗi trong quá trình xác minh reCaptcha", + "register-page.registration.google-recaptcha.notification.title": "Google reCaptcha", + "register-page.registration.google-recaptcha.open-cookie-settings": "Mở phần cài đặt cookie", + "register-page.registration.header": "Đăng ký người dùng mới", + "register-page.registration.info": "Đăng ký tài khoản để nhận cập nhật mới về bộ sưu tập qua email và theo dõi tài liệu mới trên DSpace.", + "register-page.registration.submit": "Đăng ký", + "register-page.registration.success.content": "Một email sẽ được gửi đến địa chỉ email {{ email }} chứa liên kết xác nhận và các hướng dẫn khác.", + "register-page.registration.success.head": "Gửi email xác nhận", + + "relationships.add.error.relationship-type.content": "Không có kết quả nào phù hợp cho kiểu quan hệ {{ type }} giữa hai tài liệu", + "relationships.add.error.server.content": "Máy chủ trả về lỗi", + "relationships.add.error.title": "Không thể thêm mối quan hệ", + "relationships.isAuthorOf": "Tác giả", + "relationships.isAuthorOf.OrgUnit": "Tác giả (tổ chức)", + "relationships.isAuthorOf.Person": "Tác giả (người)", + "relationships.isContributorOf": "Người tham gia", + "relationships.isContributorOf.OrgUnit": "Người tham gia (Tổ chức)", + "relationships.isContributorOf.Person": "Người tham gia", + "relationships.isFundingAgencyOf.OrgUnit": "Nhà tài trợ", + "relationships.isIssueOf": "Số kỳ của tạp chí", + "relationships.isJournalIssueOf": "Số kỳ của tạp chí", + "relationships.isJournalOf": "Tạp chí", + "relationships.isOrgUnitOf": "Đơn vị tổ chức", + "relationships.isPersonOf": "Tác giả", + "relationships.isProjectOf": "Dự án nghiên cứu", + "relationships.isPublicationOf": "Ấn phẩm", + "relationships.isPublicationOfJournalIssue": "Bài báo", + "relationships.isSingleJournalOf": "Tạp chí", + "relationships.isSingleVolumeOf": "Số tập của tạp chí", + "relationships.isVolumeOf": "Số tập của tạp chí", + + "repository.image.logo": "Logo lưu trữ", + "repository.title.prefix": "Digital Library ::", + "repository.title.prefixDSpace": "Digital Library ::", + + "resource-policies.add.button": "Thêm", + "resource-policies.add.for.bitstream": "Thêm chính sách dữ liệu số mới", + "resource-policies.add.for.bundle": "Thêm chính sách gói dữ liệu mới", + "resource-policies.add.for.collection": "Thêm chính sách bộ sưu tập mới", + "resource-policies.add.for.community": "Thêm chính sách đơn vị mới", + "resource-policies.add.for.item": "Thêm chính sách tài liệu mới", + "resource-policies.create.page.failure.content": "Đã có lỗi xảy ra khi tạo chính sách tài nguyên.", + "resource-policies.create.page.heading": "Tạo chính sách tài nguyên mới cho", + "resource-policies.create.page.success.content": "Hành động thành công", + "resource-policies.create.page.title": "Tạp chính sách tài nguyên mới", + "resource-policies.delete.btn": "Xóa lựa chọn", + "resource-policies.delete.btn.title": "Xóa chính sách tài nguyên đã chọn", + "resource-policies.delete.failure.content": "Đã có lỗi xảy ra khi xóa chính sách tài nguyên đã lựa chọn.", + "resource-policies.delete.success.content": "Hành động thành công", + "resource-policies.edit.page.failure.content": "Đã có lỗi xảy ra khi chỉnh sửa chính sách tài nguyên.", + "resource-policies.edit.page.heading": "Chỉnh sửa chính sách tài nguyên", + "resource-policies.edit.page.other-failure.content": "Đã xảy ra lỗi khi chỉnh sửa chính sách phân quyền. Người dùng\/ nhóm người dùng đã được cập nhật thành công.", + "resource-policies.edit.page.success.content": "Hành động thành công", + "resource-policies.edit.page.target-failure.content": "Đã xảy ra lỗi khi chỉnh sửa người dùng\/ nhóm người dùng trong chính sách phân quyền.", + "resource-policies.edit.page.title": "Chỉnh sửa chính sách phân quyền", + "resource-policies.form.action-type.label": "Lựa chọn kiểu hành động", + "resource-policies.form.action-type.required": "Bạn cần phải lựa chọn hành động chính sách phân quyền.", + "resource-policies.form.date.end.label": "Ngày kết thúc", + "resource-policies.form.date.start.label": "Ngày bắt đầu", + "resource-policies.form.description.label": "Mô tả", + "resource-policies.form.eperson-group-list.label": "Người hoặc nhóm người dùng được cấp quyền", + "resource-policies.form.eperson-group-list.modal.close": "Ok", + "resource-policies.form.eperson-group-list.modal.header": "Không thể thay đổi kiểu", + "resource-policies.form.eperson-group-list.modal.text1.toEPerson": "Không thể thay thế nhóm người dùng bằng người dùng.", + "resource-policies.form.eperson-group-list.modal.text1.toGroup": "Không thể thay thế người dùng bằng nhóm người dùng.", + "resource-policies.form.eperson-group-list.modal.text2": "Xóa chính sách phân quyền hiện tại và tạo chính sách mới với kiểu mong muốn.", + "resource-policies.form.eperson-group-list.select.btn": "Lựa chọn", + "resource-policies.form.eperson-group-list.tab.eperson": "Tìm kiếm người dùng", + "resource-policies.form.eperson-group-list.tab.group": "Tìm kiếm một nhóm người dùng", + "resource-policies.form.eperson-group-list.table.headers.action": "Hành động", + "resource-policies.form.eperson-group-list.table.headers.id": "ID", + "resource-policies.form.eperson-group-list.table.headers.name": "Tên", + "resource-policies.form.name.label": "Tên", + "resource-policies.form.policy-type.label": "Lựa chọn kiểu chính sách", + "resource-policies.form.policy-type.required": "Bạn cần lựa chọn kiểu chính sách tài nguyên.", + "resource-policies.table.headers.action": "Quyền", + "resource-policies.table.headers.date.end": "Ngày kết thúc", + "resource-policies.table.headers.date.start": "Ngày bắt đầu", + "resource-policies.table.headers.edit": "Chỉnh sửa", + "resource-policies.table.headers.edit.group": "Chỉnh sửa nhóm", + "resource-policies.table.headers.edit.policy": "Chỉnh sửa chính sách", + "resource-policies.table.headers.eperson": "Người dùng", + "resource-policies.table.headers.group": "Nhóm", + "resource-policies.table.headers.id": "ID", + "resource-policies.table.headers.name": "Tên", + "resource-policies.table.headers.policyType": "kiểu", + "resource-policies.table.headers.title.for.bitstream": "Chính sách tệp dữ liệu số", + "resource-policies.table.headers.title.for.bundle": "Chính sách gói dữ liệu số", + "resource-policies.table.headers.title.for.collection": "Chính sách bộ sưu tập", + "resource-policies.table.headers.title.for.community": "Chính sách đơn vị", + "resource-policies.table.headers.title.for.item": "Chính sách tài liệu", + "resource-policies.table.headers.title.for.topic": "Chính sách topic", + + "search.breadcrumbs": "Tìm kiếm", + "search.browse.item-back": "Quay lại kết quả tìm kiếm", + "search.filters.applied.f.author": "Tác giả", + "search.filters.applied.f.birthDate.max": "Ngày sinh kết thúc", + "search.filters.applied.f.birthDate.min": "Ngày sinh bắt đầu", + "search.filters.applied.f.dateIssued.max": "Ngày kết thúc", + "search.filters.applied.f.dateIssued.min": "Ngày bắt đầu", + "search.filters.applied.f.dateSubmitted": "Ngày đăng", + "search.filters.applied.f.discoverable": "Tài liệu cá nhân", + "search.filters.applied.f.entityType": "Kiểu tài liệu", + "search.filters.applied.f.has_content_in_original_bundle": "Có tệp", + "search.filters.applied.f.itemtype": "Kiểu", + "search.filters.applied.f.jobTitle": "Chức danh", + "search.filters.applied.f.namedresourcetype": "Trạng thái", + "search.filters.applied.f.subject": "Chủ đề", + "search.filters.applied.f.submitter": "Người gửi", + "search.filters.applied.f.withdrawn": "Tài liệu ẩn", + "search.filters.discoverable.false": "Có", + "search.filters.discoverable.true": "Không", + "search.filters.entityType.JournalIssue": "Kỳ của tạp chí", + "search.filters.entityType.JournalVolume": "Số tập cảu tạp chí", + "search.filters.entityType.OrgUnit": "Đơn vị tổ chức", + "search.filters.filter.author.head": "Tác giả", + "search.filters.filter.author.label": "Tìm kiếm tên tác giả", + "search.filters.filter.author.placeholder": "Tên tác giả", + "search.filters.filter.birthDate.head": "Ngày sinh", + "search.filters.filter.birthDate.label": "Tìm kiếm ngày sinh", + "search.filters.filter.birthDate.placeholder": "Ngày sinh", + "search.filters.filter.collapse": "Thu hẹp bộ lọc", + "search.filters.filter.creativeDatePublished.head": "Ngày xuất bản", + "search.filters.filter.creativeDatePublished.label": "Tìm kiếm ngày xuất bản", + "search.filters.filter.creativeDatePublished.placeholder": "Ngày xuất bản", + "search.filters.filter.creativeWorkEditor.head": "Người biên tập", + "search.filters.filter.creativeWorkEditor.label": "Tìm kiếm người biên tập", + "search.filters.filter.creativeWorkEditor.placeholder": "Người biên tập", + "search.filters.filter.creativeWorkKeywords.head": "Chủ đề", + "search.filters.filter.creativeWorkKeywords.label": "Tìm kiếm chủ đề", + "search.filters.filter.creativeWorkKeywords.placeholder": "Chủ đề", + "search.filters.filter.creativeWorkPublisher.head": "Nhà xuất bản", + "search.filters.filter.creativeWorkPublisher.label": "Tìm kiếm nhà xuất bản", + "search.filters.filter.creativeWorkPublisher.placeholder": "Nhà xuất bản", + "search.filters.filter.dateIssued.head": "Thời gian xuất bản", + "search.filters.filter.dateIssued.max.label": "Kết thúc", + "search.filters.filter.dateIssued.max.placeholder": "Thời gian tối đa", + "search.filters.filter.dateIssued.min.label": "Bắt đầu", + "search.filters.filter.dateIssued.min.placeholder": "Thời gian tối thiểu", + "search.filters.filter.dateSubmitted.head": "Ngày gửi", + "search.filters.filter.dateSubmitted.label": "Tìm kiếm ngày gửi", + "search.filters.filter.dateSubmitted.placeholder": "Ngày gửi", + "search.filters.filter.discoverable.head": "Tài liệu cá nhân", + "search.filters.filter.entityType.head": "Kiểu thực thể", + "search.filters.filter.entityType.label": "Tìm kiếm kiểu thực thể", + "search.filters.filter.entityType.placeholder": "Kiểu thực thể", + "search.filters.filter.expand": "Mở rộng bộ lọc", + "search.filters.filter.has_content_in_original_bundle.head": "Có tệp", + "search.filters.filter.itemtype.head": "Kiểu tài liệu", + "search.filters.filter.itemtype.label": "Tìm kiếm kiểu tài liệu", + "search.filters.filter.itemtype.placeholder": "Kiểu tài liệu", + "search.filters.filter.jobTitle.head": "Chức danh", + "search.filters.filter.jobTitle.label": "Tìm kiếm chức danh", + "search.filters.filter.jobTitle.placeholder": "Chức danh", + "search.filters.filter.knowsLanguage.head": "Ngôn ngữ", + "search.filters.filter.knowsLanguage.label": "Tìm kiếm ngôn ngữ", + "search.filters.filter.knowsLanguage.placeholder": "Ngôn ngữ", + "search.filters.filter.namedresourcetype.head": "Trạng thái", + "search.filters.filter.namedresourcetype.label": "Tìm kiếm trạng thái", + "search.filters.filter.namedresourcetype.placeholder": "Trạng thái", + "search.filters.filter.objectpeople.head": "Người", + "search.filters.filter.objectpeople.label": "Tìm kiếm tên người", + "search.filters.filter.objectpeople.placeholder": "Người", + "search.filters.filter.organizationAddressCountry.head": "Quốc gia", + "search.filters.filter.organizationAddressCountry.label": "Tìm kiếm quốc gia", + "search.filters.filter.organizationAddressCountry.placeholder": "Quốc gia", + "search.filters.filter.organizationAddressLocality.head": "Thành phố", + "search.filters.filter.organizationAddressLocality.label": "Tìm kiếm thành phố", + "search.filters.filter.organizationAddressLocality.placeholder": "Thành phố", + "search.filters.filter.organizationFoundingDate.head": "Ngày thành lập", + "search.filters.filter.organizationFoundingDate.label": "Tìm kiếm ngày thành lập", + "search.filters.filter.organizationFoundingDate.placeholder": "Ngày thành lập", + "search.filters.filter.scope.head": "Phạm vi", + "search.filters.filter.scope.label": "Tìm kiếm phạm vi giới hạn", + "search.filters.filter.scope.placeholder": "phạm vi giới hạn", + "search.filters.filter.show-less": "Thu hẹp", + "search.filters.filter.show-more": "Xem thêm", + "search.filters.filter.show-tree": "Duyệt cây {{ name }}", + "search.filters.filter.subject.head": "Chủ đề", + "search.filters.filter.subject.label": "Tìm kiếm chủ đề", + "search.filters.filter.subject.placeholder": "Chủ đề", + "search.filters.filter.submitter.head": "Người gửi", + "search.filters.filter.submitter.label": "Tìm kiếm người gửi", + "search.filters.filter.submitter.placeholder": "Người gửi", + "search.filters.filter.withdrawn.head": "Tài liệu ẩn", + "search.filters.has_content_in_original_bundle.false": "Không", + "search.filters.has_content_in_original_bundle.true": "Có", + "search.filters.head": "Bộ lọc", + "search.filters.reset": "Làm mới bộ lọc", + "search.filters.search.submit": "Xác nhận", + "search.filters.withdrawn.false": "Không", + "search.filters.withdrawn.true": "Có", + "search.form.scope.all": "Toàn bộ thư viện", + "search.form.search": "Tìm kiếm", + "search.form.search_dspace": "tất cả kho lưu trữ", + "search.results.empty": "Tìm kiếm của bạn không trả về kết quả.", + "search.results.head": "Kết quả tìm kiếm", + "search.results.no-results": "Tìm kiếm của bạn không trả về kết quả. Bạn có gặp khó khăn khi thực hiện tìm kiếm? Hãy thử lại bằng cách", + "search.results.no-results-link": "đặt từ khóa tìm vào trong cặp dấu ngoặc kép", + "search.results.response.500": "Đã xảy ra lỗi trong khi thực hiện truy vấn vui lòng thử lại sau", + "search.results.view-result": "Xem", + "search.search-form.placeholder": "Từ khóa tìm kiếm", + "search.sidebar.close": "Quay lại kết quả tìm kiếm", + "search.sidebar.filters.title": "Bộ lọc", + "search.sidebar.open": "Công cụ tìm kiếm", + "search.sidebar.results": "kết quả", + "search.sidebar.settings.rpp": "Kết quả mỗi trang", + "search.sidebar.settings.sort-by": "Sắp xếp theo", + "search.sidebar.settings.title": "Cài đặt", + "search.switch-configuration.title": "Xem", + "search.title": "Tìm kiếm", + "search.view-switch.show-detail": "Xem chi tiết", + "search.view-switch.show-grid": "Hiển thị dưới dạng lưới", + "search.view-switch.show-list": "Hiển thị dưới dạng danh sách", + + "sorting.ASC": "Tăng dần", + "sorting.dc.date.accessioned.ASC": "Tăng dần theo ngày lưu trữ", + "sorting.dc.date.accessioned.DESC": "Giảm dần theo ngày lưu trữ", + "sorting.dc.date.issued.ASC": "Tăng dần theo ngày", + "sorting.dc.date.issued.DESC": "Giảm dần theo ngày", + "sorting.dc.title.ASC": "Tăng dần theo nhan đề", + "sorting.dc.title.DESC": "Giảm dần theo nhan đề", + "sorting.DESC": "Giảm dần", + "sorting.lastModified.ASC": "Tăng dần theo lần chỉnh sửa cuối cùng", + "sorting.lastModified.DESC": "Giảm dần theo lần chỉnh sửa cuối cùng", + "sorting.score.ASC": "Liên quan ít nhất", + "sorting.score.DESC": "Liên quan nhiều nhất", + + "statistics.breadcrumbs": "Thống kê", + "statistics.header": "Thống kê theo {{ scope }}", + "statistics.page.no-data": "Không có dữ liệu", + "statistics.table.header.views": "Xem", + "statistics.table.no-data": "Không có dữ liệu", + "statistics.table.title.TopCities": "Top thành phố xem nhiều nhất", + "statistics.table.title.TopCountries": "Top quốc gia xem nhiều nhất", + "statistics.table.title.TotalDownloads": "Truy cập tệp", + "statistics.table.title.TotalVisits": "Tổng số truy cập", + "statistics.table.title.TotalVisitsPerMonth": "Tổng số lượt truy cập theo từng tháng", + "statistics.title": "Thống kê", + + + "submission.edit.breadcrumbs": "Chỉnh sửa đăng ký", + "submission.edit.title": "Chỉnh sửa đăng ký", + "submission.general.cancel": "Hủy", + "submission.general.cannot_submit": "Bạn không có quyền chỉnh sửa đăng ký đã gửi .", + "submission.general.deposit": "Tải lên", + "submission.general.discard.confirm.cancel": "Hủy", + "submission.general.discard.confirm.info": "Không thể hoàn tác thao tác. Bạn có chắc chắn không?", + "submission.general.discard.confirm.submit": "Có tôi đồng ý", + "submission.general.discard.confirm.title": "Hủy đăng ký", + "submission.general.discard.submit": "Hủy", + "submission.general.info.pending-changes": "Thay đổi chưa được lưu", + "submission.general.info.saved": "Lưu", + "submission.general.save": "Lưu", + "submission.general.save-later": "Lưu lại", + "submission.import-external.back-to-my-dspace": "Trở lại thư viện số", + "submission.import-external.page.hint": "Nhập vào một truy vấn phía trên để tìm các tài liệu trên trang web để nhập vào thư viện số", + "submission.import-external.page.title": "Nhập thông tin mô tả từ nguồn bên ngoài", + "submission.import-external.preview.button.import": "Bắt đầu gửi", + "submission.import-external.preview.error.import.body": "Đã xảy ra lỗi trong quá trình nhập tài liệu từ nguồn bên ngoài", + "submission.import-external.preview.error.import.title": "Lỗi gửi đi", + "submission.import-external.preview.subtitle": "Siêu dữ liệu bên dưới được nhập từ nguồn bên ngoài. Nó sẽ được điền vào trước khi bạn gửi đi.", + "submission.import-external.preview.title": "Xem trước tài liệu", + "submission.import-external.preview.title.Journal": "Xem trước Tạp chí", + "submission.import-external.preview.title.none": "Xem trước tài liệu", + "submission.import-external.preview.title.OrgUnit": "Xem trước tổ chức", + "submission.import-external.preview.title.Person": "Xem trước Tác giả\/nhà nghiên cứu", + "submission.import-external.preview.title.Project": "Xem trước dự án", + "submission.import-external.preview.title.Publication": "Xem trước ấn phẩm", + "submission.import-external.search.button": "Tìm kiếm", + "submission.import-external.search.button.hint": "Nhập một từ để tìm kiếm", + "submission.import-external.search.placeholder": "Tìm kiếm nguồn bên ngoài", + "submission.import-external.search.source.hint": "Chọn một nguồn bên ngoài", + "submission.import-external.source.ads": "NASA\/ADS", + "submission.import-external.source.arxiv": "arXiv", + "submission.import-external.source.cinii": "CiNii", + "submission.import-external.source.crossref": "CrossRef", + "submission.import-external.source.datacite": "submission.import-external.source.datacite", + "submission.import-external.source.epo": "Văn phòng Bằng sáng chế Châu Âu (EPO)", + "submission.import-external.source.lcname": "Tên Thư viện Quốc hội", + "submission.import-external.source.loading": "Đang tải lên ...", + "submission.import-external.source.openAIREFunding": "Funding OpenAIRE API", + "submission.import-external.source.orcid": "ORCID", + "submission.import-external.source.orcidWorks": "ORCID", + "submission.import-external.source.pubmed": "Pubmed", + "submission.import-external.source.pubmedeu": "Pubmed Europe", + "submission.import-external.source.scielo": "SciELO", + "submission.import-external.source.scopus": "SciELO", + "submission.import-external.source.sherpaJournal": "Tạp chí SHERPA", + "submission.import-external.source.sherpaJournalIssn": "Số ISSN của tạp chí SHERPA", + "submission.import-external.source.sherpaPublisher": "Nhà xuất bản SHERPA", + "submission.import-external.source.vufind": "VuFind", + "submission.import-external.source.wos": "Web Of Science", + "submission.import-external.title": "Nhập thông tin mô tả từ nguồn bên ngoài", + "submission.import-external.title.Journal": "Nhập tạp chí từ nguồn bên ngoài", + "submission.import-external.title.JournalIssue": "Nhập kỳ ấn phẩm tạp chí từ nguồn bên ngoài", + "submission.import-external.title.JournalVolume": "Nhập một tập của tạp chí từ nguồn bên ngoài", + "submission.import-external.title.none": "Nhập thông tin mô tả từ nguồn bên ngoài", + "submission.import-external.title.OrgUnit": "Nhập nhà xuất bản từ nguồn bên ngoài", + "submission.import-external.title.Person": "Nhập một tác giả\/ nhà nghiên cứu từ nguồn bên ngoài", + "submission.import-external.title.Project": "Nhập một dự án từ nguồn bên ngoài", + "submission.import-external.title.Publication": "Nhập một ấn phẩm từ nguồn bên ngoài", + "submission.sections.accesses.form.access-condition-hint": "Chọn chính sách phân quyền để áp dụng cho biểu ghi khi nó được nhập vào hệ thống.", + "submission.sections.accesses.form.access-condition-label": "Loại chính sách truy cập", + "submission.sections.accesses.form.date-required": "Thông tin thời gian là bắt buộc.", + "submission.sections.accesses.form.date-required-from": "Bắt buộc phải khai báo thời gian để xác định ngày bắt đầu cấp quyền truy cập", + "submission.sections.accesses.form.date-required-until": "Bắt buộc phải khai báo thời gian để xác định ngày bắt đầu cấp quyền truy cập", + "submission.sections.accesses.form.discoverable-description": "Khi được chọn biểu ghi này sẽ có thể được tìm thấy trong các chức năng tìm kiếm\/duyệt. Khi bỏ chọn biểu ghi sẽ chỉ có sẵn qua đường dẫn trực tiếp và sẽ không bao giờ xuất hiện trong tìm kiếm\/duyệt.", + "submission.sections.accesses.form.discoverable-label": "Có thể khám phá", + "submission.sections.accesses.form.from-hint": "Chọn ngày mà quyền được áp dụng", + "submission.sections.accesses.form.from-label": "Cấp quyền truy cập từ", + "submission.sections.accesses.form.from-placeholder": "Từ", + "submission.sections.accesses.form.group-label": "Nhóm", + "submission.sections.accesses.form.group-required": "Trường Nhóm là bắt buộc.", + "submission.sections.accesses.form.until-hint": "Chọn ngày mà quyền được áp dụng", + "submission.sections.accesses.form.until-label": "Cấp quyền truy cập cho đến khi", + "submission.sections.accesses.form.until-placeholder": "Cho tới khi", + "submission.sections.ccLicense.change": "Thay đổi loại giấy phép…", + "submission.sections.ccLicense.confirmation": "Tôi đồng ý với giấy phép ở trên", + "submission.sections.ccLicense.link": "Bạn có lựa chọn theo giấy phép này:", + "submission.sections.ccLicense.none": "Không có giấy phép nào", + "submission.sections.ccLicense.option.select": "Lựa chọn tùy chọn…", + "submission.sections.ccLicense.select": "Lựa chọn loại giấy phép…", + "submission.sections.ccLicense.type": "Loại giấy phép", + "submission.sections.describe.relationship-lookup.close": "Đóng", + "submission.sections.describe.relationship-lookup.external-source.added": "Thêm thành công tài liệu nội bộ vào mục đã chọn", + "submission.sections.describe.relationship-lookup.external-source.import-button-title.Equipment": "Nhập thiết bị từ cơ sở dữ liệu từ xa", + "submission.sections.describe.relationship-lookup.external-source.import-button-title.Event": "Nhập sự kiện từ cơ sở dữ liệu từ xa", + "submission.sections.describe.relationship-lookup.external-source.import-button-title.Funding": "Nhập sự kiện từ cơ sở dữ liệu từ xa", + "submission.sections.describe.relationship-lookup.external-source.import-button-title.isAuthorOfPublication": "Nhập tác giả từ xa", + "submission.sections.describe.relationship-lookup.external-source.import-button-title.isProjectOfPublication": "Dự án", + "submission.sections.describe.relationship-lookup.external-source.import-button-title.Journal": "Nhập tạp chí từ xa", + "submission.sections.describe.relationship-lookup.external-source.import-button-title.JournalIssue": "Nhập số kỳ của tạp chí từ cơ sở dữ liệu từ xa", + "submission.sections.describe.relationship-lookup.external-source.import-button-title.JournalVolume": "Nhập số tập của tạp chí từ cơ sở dữ liệu từ xa", + "submission.sections.describe.relationship-lookup.external-source.import-button-title.none": "Nhập tài liệu từ cơ sở dữ liệu từ xa", + "submission.sections.describe.relationship-lookup.external-source.import-button-title.OrgUnit": "Nhập tổ chức từ cơ sở dữ liệu từ xa", + "submission.sections.describe.relationship-lookup.external-source.import-button-title.Patent": "Nhập bằng sáng chế từ cơ sở dữ liệu từ xa", + "submission.sections.describe.relationship-lookup.external-source.import-button-title.Person": "Nhập tác giả\/ nhà nghiên cứu từ cơ sở dữ liệu từ xa", + "submission.sections.describe.relationship-lookup.external-source.import-button-title.Product": "Nhập tác giả\/ nhà nghiên cứu từ cơ sở dữ liệu từ xa", + "submission.sections.describe.relationship-lookup.external-source.import-button-title.Project": "Nhập dự án từ cơ sở dữ liệu từ xa", + "submission.sections.describe.relationship-lookup.external-source.import-button-title.Publication": "Nhập ấn phẩm từ cơ sở dữ liệu từ xa", + "submission.sections.describe.relationship-lookup.external-source.import-modal.authority": "Kiểm soát", + "submission.sections.describe.relationship-lookup.external-source.import-modal.authority.new": "Nhập dưới dạng một kiểm soát nội bộ mới", + "submission.sections.describe.relationship-lookup.external-source.import-modal.cancel": "Hủy", + "submission.sections.describe.relationship-lookup.external-source.import-modal.collection": "Chọn một bộ sưu tập để thêm các tài liệu mới", + "submission.sections.describe.relationship-lookup.external-source.import-modal.entities": "Thực thể", + "submission.sections.describe.relationship-lookup.external-source.import-modal.entities.new": "Nhập vào một thực thể nội bộ mới", + "submission.sections.describe.relationship-lookup.external-source.import-modal.head.arxiv": "Nhập từ arXiv", + "submission.sections.describe.relationship-lookup.external-source.import-modal.head.lcname": "Nhập từ tên LC", + "submission.sections.describe.relationship-lookup.external-source.import-modal.head.openAIREFunding": "Funding OpenAIRE API", + "submission.sections.describe.relationship-lookup.external-source.import-modal.head.orcid": "Nhập từ ORCID", + "submission.sections.describe.relationship-lookup.external-source.import-modal.head.pubmed": "Nhập từ PubMed", + "submission.sections.describe.relationship-lookup.external-source.import-modal.head.sherpaJournal": "Nhập từ tạp chí Sherpa", + "submission.sections.describe.relationship-lookup.external-source.import-modal.head.sherpaPublisher": "Nhập từ nhà xuất bản Sherpa", + "submission.sections.describe.relationship-lookup.external-source.import-modal.import": "Nhập liệu", + "submission.sections.describe.relationship-lookup.external-source.import-modal.isAuthorOfPublication.added.local-entity": "Thêm thành công tác giả nội bộ bộ vào mục đã chọn", + "submission.sections.describe.relationship-lookup.external-source.import-modal.isAuthorOfPublication.added.new-entity": "Nhập thành công và thêm tác giả bên ngoài vào mục đã chọn", + "submission.sections.describe.relationship-lookup.external-source.import-modal.isAuthorOfPublication.title": "Nhập tác giả từ cơ sở dữ liệu từ xa", + "submission.sections.describe.relationship-lookup.external-source.import-modal.isProjectOfPublication.added.new-entity": "Thực thể mới đã được thêm!", + "submission.sections.describe.relationship-lookup.external-source.import-modal.isProjectOfPublication.title": "Dự án", + "submission.sections.describe.relationship-lookup.external-source.import-modal.Journal.added.local-entity": "Thêm thành công tạp chí đã chọn", + "submission.sections.describe.relationship-lookup.external-source.import-modal.Journal.added.new-entity": "Nhập thành công tạp chí bên ngoài vào mục lựa chọn", + "submission.sections.describe.relationship-lookup.external-source.import-modal.Journal.title": "Nhập tạp chí từ xa", + "submission.sections.describe.relationship-lookup.external-source.import-modal.JournalIssue.added.local-entity": "Thêm thành công số kỳ tạp chí nội bộ vào mục lựa chọn", + "submission.sections.describe.relationship-lookup.external-source.import-modal.JournalIssue.added.new-entity": "Nhập thành công và thêm số kỳ của tạp chí bên ngoài vào mục lựa chọn", + "submission.sections.describe.relationship-lookup.external-source.import-modal.JournalIssue.title": "Nhập số kỳ của tạp chí từ xa", + "submission.sections.describe.relationship-lookup.external-source.import-modal.JournalVolume.added.local-entity": "Thêm thành công số tập của tạp chí nội bộ vào mục lựa chọn", + "submission.sections.describe.relationship-lookup.external-source.import-modal.JournalVolume.added.new-entity": "Nhập và thêm thành công số tập của tạp chí bên ngoài vào mục lựa chọn", + "submission.sections.describe.relationship-lookup.external-source.import-modal.JournalVolume.title": "Nhập số tập của tạp chí từ xa", + "submission.sections.describe.relationship-lookup.external-source.import-modal.select": "Chọn một phù hợp:", + "submission.sections.describe.relationship-lookup.name-variant.notification.confirm": "Lưu một biến thể tên mới", + "submission.sections.describe.relationship-lookup.name-variant.notification.content": "Bạn có muốn lưu \"{{ value }}\" làm tên biến thể cho người này để bạn và những người khác có thể sử dụng lại cho những lần gửi sau không? Nếu không bạn vẫn có thể sử dụng cho lần gửi này\"", + "submission.sections.describe.relationship-lookup.name-variant.notification.decline": "Chỉ sử dụng cho lần gửi này", + "submission.sections.describe.relationship-lookup.search-tab.deselect-all": "Bỏ chọn tất cả", + "submission.sections.describe.relationship-lookup.search-tab.deselect-page": "Bỏ chọn trang", + "submission.sections.describe.relationship-lookup.search-tab.loading": "Đang tải...", + "submission.sections.describe.relationship-lookup.search-tab.placeholder": "Tìm kiếm truy vấn", + "submission.sections.describe.relationship-lookup.search-tab.search": "Đi", + "submission.sections.describe.relationship-lookup.search-tab.search-form.placeholder": "Tìm kiếm...", + "submission.sections.describe.relationship-lookup.search-tab.select-all": "Lựa chọn tất cả", + "submission.sections.describe.relationship-lookup.search-tab.select-page": "Lựa chọn trang", + "submission.sections.describe.relationship-lookup.search-tab.tab-title.arxiv": "arXiv ({{ count }})", + "submission.sections.describe.relationship-lookup.search-tab.tab-title.DataFile": "Tệp dữ liệu nội bộ ({{ count }})", + "submission.sections.describe.relationship-lookup.search-tab.tab-title.DataPackage": "Gói dữ liệu nội bộ ({{ count }})", + "submission.sections.describe.relationship-lookup.search-tab.tab-title.isAuthorOfPublication": "Tác giả nội bộ ({{ count }})", + "submission.sections.describe.relationship-lookup.search-tab.tab-title.isChildOrgUnitOf": "Tìm kiếm đơn vị tổ chức", + "submission.sections.describe.relationship-lookup.search-tab.tab-title.isFundingAgencyOfProject": "Nhà tài trợ của dự án", + "submission.sections.describe.relationship-lookup.search-tab.tab-title.isFundingAgencyOfPublication": "Tìm kiếm cơ quan cấp vốn", + "submission.sections.describe.relationship-lookup.search-tab.tab-title.isFundingOfPublication": "Tìm kiếm tài trợ", + "submission.sections.describe.relationship-lookup.search-tab.tab-title.isJournalIssueOfPublication": "Số kỳ của tạp chí nội bộ ({{ count }})", + "submission.sections.describe.relationship-lookup.search-tab.tab-title.isJournalOfPublication": "Tạp chí nội bộ ({{ count }})", + "submission.sections.describe.relationship-lookup.search-tab.tab-title.isJournalVolumeOfPublication": "Số tập của tạp chí nội bộ ({{ count }})", + "submission.sections.describe.relationship-lookup.search-tab.tab-title.isProjectOfPublication": "Dự án", + "submission.sections.describe.relationship-lookup.search-tab.tab-title.isPublicationOfAuthor": "Ấn phẩm của tác giả", + "submission.sections.describe.relationship-lookup.search-tab.tab-title.Journal": "Tạp chí nội bộ ({{ count }})", + "submission.sections.describe.relationship-lookup.search-tab.tab-title.JournalIssue": "Số kỳ của tạp chsi nội bộ ({{ count }})", + "submission.sections.describe.relationship-lookup.search-tab.tab-title.JournalVolume": "Số tập của tạp chí nội bộ ({{ count }})", + "submission.sections.describe.relationship-lookup.search-tab.tab-title.lcname": "Tên LC ({{ count }})", + "submission.sections.describe.relationship-lookup.search-tab.tab-title.openAIREFunding": "Funding OpenAIRE API", + "submission.sections.describe.relationship-lookup.search-tab.tab-title.orcid": "ORCID ({{ count }})", + "submission.sections.describe.relationship-lookup.search-tab.tab-title.OrgUnit": "Đơn vị tổ chức nội bộ ({{ count }})", + "submission.sections.describe.relationship-lookup.search-tab.tab-title.Person": "Tác giả nội bộ ({{ count }})", + "submission.sections.describe.relationship-lookup.search-tab.tab-title.Project": "Dự án nội bộ ({{ count }})", + "submission.sections.describe.relationship-lookup.search-tab.tab-title.Publication": "Ấn phẩm nội bộ ({{ count }})", + "submission.sections.describe.relationship-lookup.search-tab.tab-title.pubmed": "PubMed ({{ count }})", + "submission.sections.describe.relationship-lookup.search-tab.tab-title.sherpaJournal": "Tạp chí Sherpa ({{ count }})", + "submission.sections.describe.relationship-lookup.search-tab.tab-title.sherpaPublisher": "Nhà xuất bản Sherpa ({{ count }})", + "submission.sections.describe.relationship-lookup.search-tab.toggle-dropdown": "Chuyển đổi danh mục thả xuống", + "submission.sections.describe.relationship-lookup.selected": "Lựa chọn {{ size }} tài liệu", + "submission.sections.describe.relationship-lookup.selection-tab.no-selection": "Lựa chọn cảu bạn hiện đang trống.", + "submission.sections.describe.relationship-lookup.selection-tab.search-form.placeholder": "Tìm kiếm...", + "submission.sections.describe.relationship-lookup.selection-tab.settings": "Cài đặt", + "submission.sections.describe.relationship-lookup.selection-tab.tab-title": "Lựa chọn hiện tại ({{ count }})", + "submission.sections.describe.relationship-lookup.selection-tab.title": "Kết quả tìm kiếm", + "submission.sections.describe.relationship-lookup.selection-tab.title.arxiv": "Kết quả tìm kiếm", + "submission.sections.describe.relationship-lookup.selection-tab.title.crossref": "Kết quả tìm kiếm", + "submission.sections.describe.relationship-lookup.selection-tab.title.DataFile": "Lựa chọn tệp dữ liệu", + "submission.sections.describe.relationship-lookup.selection-tab.title.DataPackage": "Lựa chọn gói dữ liệu", + "submission.sections.describe.relationship-lookup.selection-tab.title.epo": "Kết quả tìm kiếm", + "submission.sections.describe.relationship-lookup.selection-tab.title.isAuthorOfPublication": "Lựa chọn tác giả.", + "submission.sections.describe.relationship-lookup.selection-tab.title.isChildOrgUnitOf": "Lựa chọn đơn vị tổ chức", + "submission.sections.describe.relationship-lookup.selection-tab.title.isFundingAgencyOfPublication": "Lựa chọn đơn vị tổ chức", + "submission.sections.describe.relationship-lookup.selection-tab.title.isFundingOfPublication": "Lựa chọn tài trợ", + "submission.sections.describe.relationship-lookup.selection-tab.title.isJournalIssueOfPublication": "Lựa chọn kỳ của tạp chí", + "submission.sections.describe.relationship-lookup.selection-tab.title.isJournalOfPublication": "Lựa chọn tạp chí", + "submission.sections.describe.relationship-lookup.selection-tab.title.isJournalVolumeOfPublication": "Lựa chọn số tập của tạp chí", + "submission.sections.describe.relationship-lookup.selection-tab.title.isProjectOfPublication": "Dự án", + "submission.sections.describe.relationship-lookup.selection-tab.title.Journal": "Lựa chọn tạp chí", + "submission.sections.describe.relationship-lookup.selection-tab.title.JournalIssue": "Lựa chọn số kỳ của tạp chí", + "submission.sections.describe.relationship-lookup.selection-tab.title.JournalVolume": "Lựa chọn số tập của tạp chí", + "submission.sections.describe.relationship-lookup.selection-tab.title.lcname": "Kết quả tìm kiếm", + "submission.sections.describe.relationship-lookup.selection-tab.title.openAIREFunding": "Funding OpenAIRE API", + "submission.sections.describe.relationship-lookup.selection-tab.title.orcid": "Kết quả tìm kiếm", + "submission.sections.describe.relationship-lookup.selection-tab.title.orcidv2": "Kết quả tìm kiếm", + "submission.sections.describe.relationship-lookup.selection-tab.title.OrgUnit": "Lựa chọn đơn vị tổ chức", + "submission.sections.describe.relationship-lookup.selection-tab.title.Person": "Lựa chọn tác giả", + "submission.sections.describe.relationship-lookup.selection-tab.title.Project": "Lựa chọn dự án", + "submission.sections.describe.relationship-lookup.selection-tab.title.Publication": "Lựa chọn ấn phẩm", + "submission.sections.describe.relationship-lookup.selection-tab.title.pubmed": "Kết quả tìm kiếm", + "submission.sections.describe.relationship-lookup.selection-tab.title.scielo": "Kết quả tìm kiếm", + "submission.sections.describe.relationship-lookup.selection-tab.title.scopus": "Kết quả tìm kiếm", + "submission.sections.describe.relationship-lookup.selection-tab.title.sherpaJournal": "Lựa chọn kết quả", + "submission.sections.describe.relationship-lookup.selection-tab.title.sherpaPublisher": "Kết quả tìm kiếm", + "submission.sections.describe.relationship-lookup.selection-tab.title.wos": "Kết quả tìm kiếm", + "submission.sections.describe.relationship-lookup.title.DataFile": "Tệp dữ liệu", + "submission.sections.describe.relationship-lookup.title.DataPackage": "Gói dữ liệu", + "submission.sections.describe.relationship-lookup.title.FundingAgency": "Đơn vị tài trợ", + "submission.sections.describe.relationship-lookup.title.isAuthorOfPublication": "Tác giả", + "submission.sections.describe.relationship-lookup.title.isChildOrgUnitOf": "Đơn vị tổ chức chính", + "submission.sections.describe.relationship-lookup.title.isFundingAgencyOfProject": "Nhà tài trợ của dự án", + "submission.sections.describe.relationship-lookup.title.isFundingAgencyOfPublication": "Đơn vị tài trợ", + "submission.sections.describe.relationship-lookup.title.isFundingOfPublication": "Tài trợ", + "submission.sections.describe.relationship-lookup.title.isJournalIssueOfPublication": "Số kỳ của tạp chí", + "submission.sections.describe.relationship-lookup.title.isJournalOfPublication": "Tạp chí", + "submission.sections.describe.relationship-lookup.title.isJournalVolumeOfPublication": "Số tập cảu tạp chí", + "submission.sections.describe.relationship-lookup.title.isProjectOfPublication": "Dự án", + "submission.sections.describe.relationship-lookup.title.isPublicationOfAuthor": "Ấn phẩm", + "submission.sections.describe.relationship-lookup.title.JournalIssue": "Số kỳ của tạp chí", + "submission.sections.describe.relationship-lookup.title.JournalVolume": "Số tập của tạp chí", + "submission.sections.describe.relationship-lookup.title.OrgUnit": "Đơn vị tổ chức", + "submission.sections.describe.relationship-lookup.title.Person": "Tác giả", + "submission.sections.describe.relationship-lookup.title.Project": "Dự án", + "submission.sections.describe.relationship-lookup.title.Publication": "Ấn phẩm", + "submission.sections.general.add-more": "Thêm nhiều hơn", + "submission.sections.general.cannot_deposit": "Không thể hoàn tất quá trình nhập dữ liệu do lỗi trong biểu mẫu.
Vui lòng điền vào tất cả các trường bắt buộc để hoàn tất quá trình nhập liệu.", + "submission.sections.general.collection": "Bộ sưu tập", + "submission.sections.general.deposit_error_notice": "Đã xảy ra sự cố khi gửi tài liệu vui lòng thử lại sau.", + "submission.sections.general.deposit_success_notice": "Đã gửi thành công.", + "submission.sections.general.discard_error_notice": "Đã xảy ra sự cố khi hủy tài liệu vui lòng thử lại sau.", + "submission.sections.general.discard_success_notice": "Đã hủy thành công.", + "submission.sections.general.metadata-extracted": "Siêu dữ liệu mới đã được trích xuất và thêm vào phần {{sectionId}} phần.", + "submission.sections.general.metadata-extracted-new-section": " {{sectionId}} mới phần đã được thêm vào thông tin gửi đi.", + "submission.sections.general.no-collection": "Không tìm thấy bộ sưu tập", + "submission.sections.general.no-sections": "Không có tùy chọn", + "submission.sections.general.save_error_notice": "Đã xảy ra sự cố khi lưu tài liệu vui lòng thử lại sau.", + "submission.sections.general.save_success_notice": "Lưu thành công.", + "submission.sections.general.search-collection": "Tìm kiếm bộ sưu tập", + "submission.sections.general.sections_not_valid": "Không có phần nào hoàn thành.", + "submission.sections.license.granted-label": "Xác nhận giấy phép", + "submission.sections.license.notgranted": "Bạn phải chấp nhận giấy phép", + "submission.sections.license.required": "Bạn phải chấp nhận giấy phép", + "submission.sections.sherpa.error.message": "Đã xảy ra lỗi trong quá trình truy xuất thông tin", + "submission.sections.sherpa.publication.information": "Thông tin ấn phẩm", + "submission.sections.sherpa.publication.information.issns": "ISSNs", + "submission.sections.sherpa.publication.information.publishers": "Nhà xuất bản", + "submission.sections.sherpa.publication.information.romeoPub": "Romeo Pub", + "submission.sections.sherpa.publication.information.title": "Nhan đề", + "submission.sections.sherpa.publication.information.url": "URL", + "submission.sections.sherpa.publication.information.zetoPub": "Zeto Pub", + "submission.sections.sherpa.publisher.policy": "Chính sách của nhà xuất bản", + "submission.sections.sherpa.publisher.policy.conditions": "Điều kiện", + "submission.sections.sherpa.publisher.policy.description": "Thông tin dưới đây được tìm thấy thông qua Sherpa Romeo. Dựa trên các chính sách của nhà xuất bản của bạn hệ thống sẽ đưa ra lời khuyên về việc có cần thiết phải hạn chế hay không và\/hoặc những tệp nào mà bạn được phép tải lên. Nếu bạn có thắc mắc vui lòng liên hệ với quản trị viên.", + "submission.sections.sherpa.publisher.policy.embargo": "Hạn chế", + "submission.sections.sherpa.publisher.policy.license": "Bản quyền", + "submission.sections.sherpa.publisher.policy.location": "Vị trí", + "submission.sections.sherpa.publisher.policy.more.information": "Để biết thêm thông tin vui lòng xem đường dẫn dưới đây:", + "submission.sections.sherpa.publisher.policy.noembargo": "Không hạn chế", + "submission.sections.sherpa.publisher.policy.nolocation": "Trống", + "submission.sections.sherpa.publisher.policy.openaccess": "Các đường dẫn truy cập mở được cho phép bởi chính sách của tạp chí này được liệt kê bên dưới theo phiên bản bài viết. Nhấp vào một đường dẫn để xem chi tiết", + "submission.sections.sherpa.publisher.policy.prerequisites": "Điều kiện cần", + "submission.sections.sherpa.publisher.policy.refresh": "Làm mới", + "submission.sections.sherpa.publisher.policy.version": "Phiên bản", + "submission.sections.sherpa.record.information": "Thông tin biểu ghi", + "submission.sections.sherpa.record.information.date.created": "Ngày tạo", + "submission.sections.sherpa.record.information.date.modified": "Lần chỉnh sửa gần nhất", + "submission.sections.sherpa.record.information.id": "ID", + "submission.sections.sherpa.record.information.uri": "URL", + "submission.sections.sherpa-policy.title-empty": "Không có chính sách của nhà xuất bản. Nếu tác phẩm của bạn có ISSN liên quan vui lòng nhập nó ở trên để xem các chính sách truy cập mở của nhà xuất bản (nếu có)", + "submission.sections.status.errors.aria": "có lỗi", + "submission.sections.status.errors.title": "Lỗi", + "submission.sections.status.info.aria": "Thông tin bổ sung", + "submission.sections.status.info.title": "Thông tin bổ sung", + "submission.sections.status.valid.aria": "là hợp lệ", + "submission.sections.status.valid.title": "Hợp lệ", + "submission.sections.status.warnings.aria": "có cảnh báo", + "submission.sections.status.warnings.title": "Cảnh báo", + "submission.sections.submit.progressbar.accessCondition": "Điều kiện truy cập biểu ghi", + "submission.sections.submit.progressbar.CClicense": "Bằng sáng chế", + "submission.sections.submit.progressbar.describe.recycle": "Tái chế", + "submission.sections.submit.progressbar.describe.stepcustom": "Mô tả", + "submission.sections.submit.progressbar.describe.stepone": "Mô tả", + "submission.sections.submit.progressbar.describe.steptwo": "Mô tả", + "submission.sections.submit.progressbar.detect-duplicate": "Các trùng lặp xảy ra", + "submission.sections.submit.progressbar.license": "Giấy phép tiền gửi", + "submission.sections.submit.progressbar.sherpaPolicies": "Chính sách truy cập mở của nhà xuất bản", + "submission.sections.submit.progressbar.sherpapolicy": "Chính sách", + "submission.sections.submit.progressbar.upload": "Tải tệp lên", + "submission.sections.toggle.aria.close": "Thu hẹp phần {{sectionHeader}}", + "submission.sections.toggle.aria.open": "Mở rộng phần {{sectionHeader}}", + "submission.sections.toggle.close": "Đóng phiên", + "submission.sections.toggle.open": "Mở phiên mới", + "submission.sections.upload.delete.confirm.cancel": "Hủy", + "submission.sections.upload.delete.confirm.info": "Không thể hoàn tác thao tác này. Bạn có chắc không?", + "submission.sections.upload.delete.confirm.submit": "Có tôi chắc chắn", + "submission.sections.upload.delete.confirm.title": "Xóa dữ liệu số", + "submission.sections.upload.delete.submit": "Xóa", + "submission.sections.upload.download.title": "Tải dữ liệu số", + "submission.sections.upload.drop-message": "Kéo tệp đính kèm vào tài liệu", + "submission.sections.upload.edit.title": "Chỉnh sửa dữ liệu số", + "submission.sections.upload.form.access-condition-hint": "Chọn quyền truy cập áp dụng trên tệp tin khi biểu ghi được biên mục vào hệ thống.", + "submission.sections.upload.form.access-condition-label": "Loại điều kiện truy cập", + "submission.sections.upload.form.date-required": "Ngày yêu cầu", + "submission.sections.upload.form.date-required-from": "Bắt buộc phải khai báo thời gian để xác định ngày bắt đầu cấp quyền truy cập", + "submission.sections.upload.form.date-required-until": "Bắt buộc phải khai báo thời gian để xác định ngày kết thúc cấp quyền truy cập", + "submission.sections.upload.form.from-hint": "Chọn ngày mà quyền được áp dụng", + "submission.sections.upload.form.from-label": "Cấp quyền truy cập từ", + "submission.sections.upload.form.from-placeholder": "Từ", + "submission.sections.upload.form.group-label": "Nhóm", + "submission.sections.upload.form.group-required": "Nhóm yêu cầu.", + "submission.sections.upload.form.until-hint": "Chọn ngày hết hạn quyền truy cập", + "submission.sections.upload.form.until-label": "Cấp quyền truy cập cho đến khi", + "submission.sections.upload.form.until-placeholder": "Đến khi", + "submission.sections.upload.header.policy.default.nolist": "Các tệp tải lên trong bộ sưu tập {{collectionName}} sẽ cso quyền truy cập thep các nhóm sau:", + "submission.sections.upload.header.policy.default.withlist": "Xin lưu ý rằng các tệp đã tải lên trong bộ sưu tập {{collectionName}} sẽ có thể truy cập được ngoài những gì được quyết định rõ ràng cho một tệp với (các) nhóm sau:", + "submission.sections.upload.info": "Tại đây bạn sẽ tìm thấy tất cả các tệp hiện có trong tài liệu. Bạn có thể cập nhật thông tin mô tả tệp và điều kiện truy cập hoặc tải lên tệp bổ sung chỉ cần kéo và thả chúng ở mọi nơi trong trang", + "submission.sections.upload.no-entry": "Không", + "submission.sections.upload.no-file-uploaded": "Không có tệp tải lên.", + "submission.sections.upload.save-metadata": "Lưu thông tin mô tả", + "submission.sections.upload.undo": "Hủy", + "submission.sections.upload.upload-failed": "Tải lên lỗi", + "submission.sections.upload.upload-successful": "Tải lên thành công", + "submission.submit.breadcrumbs": "Gửi mới", + "submission.submit.title": "Gửi mới", + "submission.workflow.generic.delete": "Xóa", + "submission.workflow.generic.delete-help": "Nếu bạn muốn hủy tài liệu này hãy chọn \"Delete\". Sau đó bạn sẽ được yêu cầu xác nhận.\"", + "submission.workflow.generic.edit": "Chỉnh sửa", + "submission.workflow.generic.edit-help": "Chọn tùy chọn này để thay đổi thông tin mô tả của tài liệu.", + "submission.workflow.generic.view": "Xem", + "submission.workflow.generic.view-help": "Chọn tùy chọn này để xem dữ liệu cảu tài liệu.", + "submission.workflow.tasks.claimed.approve": "Chấp nhận", + "submission.workflow.tasks.claimed.approve_help": "Nếu bạn đã xem xét tài liệu và thấy phù hợp để đưa vào bộ sưu tập hãy chọn \"Approve\".", + "submission.workflow.tasks.claimed.edit": "Chỉnh sửa", + "submission.workflow.tasks.claimed.edit_help": "Chọn tùy chọn này để thay đổi thông tin mô tả của tài liệu.", + "submission.workflow.tasks.claimed.reject.reason.info": "Vui lòng nhập lý do từ chối gửi của bạn vào ô bên dưới cho biết liệu người gửi có thể khắc phục sự cố và gửi lại hay không.", + "submission.workflow.tasks.claimed.reject.reason.placeholder": "Mô tả lý do từ chối", + "submission.workflow.tasks.claimed.reject.reason.submit": "Từ chối tài liệu", + "submission.workflow.tasks.claimed.reject.reason.title": "Lý do", + "submission.workflow.tasks.claimed.reject.submit": "Từ chối", + "submission.workflow.tasks.claimed.reject_help": "Nếu bạn đã xem xét tài liệu và thấy không phù hợp để đưa vào bộ sưu tập hãy chọn \"Reject\". Sau đó bạn sẽ được yêu cầu nhập một thông báo cho biết lý do tại sao tài liệu đó không phù hợp và liệu người gửi có nên thay đổi điều gì đó và gửi lại hay không.", + "submission.workflow.tasks.claimed.return": "Trả lại nhiệm vụ", + "submission.workflow.tasks.claimed.return_help": "Trả tác vụ về nhóm để người dùng khác có thể thực hiện tác vụ.", + "submission.workflow.tasks.generic.error": "Đã xảy ra lỗi trong khi vận hành ...", + "submission.workflow.tasks.generic.processing": "Đang xử lý...", + "submission.workflow.tasks.generic.submitter": "Người gửi", + "submission.workflow.tasks.generic.success": "Hoạt động thành công", + "submission.workflow.tasks.pool.claim": "Nhận nhiệm vụ", + "submission.workflow.tasks.pool.claim_help": "Giao nhiệm vụ này cho chính bạn.", + "submission.workflow.tasks.pool.hide-detail": "Ẩn chi tiết", + "submission.workflow.tasks.pool.show-detail": "Xem chi tiết", + "submission.workspace.generic.view": "Xem", + "submission.workspace.generic.view-help": "Chọn tủy chọn để xem thông tin mô tả của tài liệu", + + "thumbnail.default.alt": "Hình ảnh thu nhỏ", + "thumbnail.default.placeholder": "Không có ảnh thu nhỏ nào", + "thumbnail.orgunit.alt": "Logo Đơn vị tổ chức", + "thumbnail.orgunit.placeholder": "Hỉnh ảnh giữ chỗ của đơn vị tổ chức", + "thumbnail.person.alt": "Ảnh hồ sơ", + "thumbnail.person.placeholder": "Không có ảnh hồ sơ nào", + "thumbnail.project.alt": "Logo dự án", + "thumbnail.project.placeholder": "Hình ảnh giữ chỗ của dự án", + + "title": "DSpace", + + "vocabulary-treeview.header": "Chế độ xem phân cấp", + "vocabulary-treeview.info": "Chọn một chủ đề để thêm làm bộ lọc tìm kiếm", + "vocabulary-treeview.load-more": "Xem thêm", + "vocabulary-treeview.search.form.reset": "Khôi phục", + "vocabulary-treeview.search.form.search": "Tìm kiếm", + "vocabulary-treeview.search.no-result": "Không có tài liệu nào hiển thị", + "vocabulary-treeview.tree.description.nsi": "Chỉ số Norwegian Science", + "vocabulary-treeview.tree.description.srsc": "Danh mục chủ đề", + + "uploader.browse": "duyệt", + "uploader.delete.btn-title": "Xóa", + "uploader.drag-message": "Kéo & thả tệp tại đây", + "uploader.processing": "Đang xử lý", + "uploader.queue-length": "Chiều dài hàng đợi", + + "virtual-metadata.delete-item.info": "Chọn kiểu mà bạn muốn lưu thông tin mô tả ảo làm thông tin mô tả thực", + "virtual-metadata.delete-item.modal-head": "Siêu dữ liệu ảo của mối quan hệ này", + "virtual-metadata.delete-relationship.modal-head": "Chọn các tài liệu mà bạn muốn lưu thông tin mô tả ảo làm thông tin mô tả thực", + + "supervisedWorkspace.search.results.head": "Supervised Items", + + + "workflow.search.results.head": "Tất cả nhiệm vụ", + "workflowAdmin.search.results.head": "Tiến trình làm việc của quản trị viên", + "workflow-item.delete.button.cancel": "Hủy", + "workflow-item.delete.button.confirm": "Xóa", + "workflow-item.delete.header": "Xóa tiến trình tài liệu", + "workflow-item.delete.notification.error.content": "Không thể xóa tiến trình tài liệu", + "workflow-item.delete.notification.error.title": "Đã xảy ra lỗi", + "workflow-item.delete.notification.success.content": " Tiến trình tài liệu này đã được xóa thành công", + "workflow-item.delete.notification.success.title": "Xóa", + "workflow-item.delete.title": "Xóa tiến trình tài liệu", + "workflow-item.edit.breadcrumbs": "Chỉnh sửa tiến trình tài liệu", + "workflow-item.edit.title": "Xem tiến trình tài liệu", + "workflow-item.send-back.button.cancel": "Hủy", + "workflow-item.send-back.button.confirm": "Gửi lại", + "workflow-item.send-back.header": "Gửi lại tiến trình tài liệucho người gửi", + "workflow-item.send-back.notification.error.content": "Không thể gửi lại tiến trình tài liệu cho người gửi", + "workflow-item.send-back.notification.error.title": "Đã xảy ra lỗi", + "workflow-item.send-back.notification.success.content": "Tiến trình tài liệu này đã được gửi lại thành công cho người gửi", + "workflow-item.send-back.notification.success.title": "Đã gửi lại cho người gửi", + "workflow-item.send-back.title": "Gửi lại tiến trình tài liệu cho người gửi", + "workflow-item.view.breadcrumbs": "Xem tiến trình", + "workspace.search.results.head": "Biểu ghi bạn đã tải lên", + "workspace-item.view.breadcrumbs": "Xem các tài liệu đang biên mục dở dang", + "workspace-item.view.title": "Xem các tài liệu đang biên mục dở dang", + + "idle-modal.extend-session": "Gia hạn phiên", + "idle-modal.header": "Phiên sẽ sớm hết hạn", + "idle-modal.info": "Vì lý do bảo mật các phiên của người dùng sẽ hết hạn sau {{timeToExpire}} phút không hoạt động. Phiên của bạn sẽ sớm hết hạn. Bạn muốn gia hạn hay đăng xuất?", + "idle-modal.log-out": "Đăng xuất", + + "researcher.profile.action.processing": "Đang xử lý…", + "researcher.profile.associated": "Hồ sơ nhà nghiên cứu đã được liên kết", + "researcher.profile.change-visibility.fail": "Đã xảy ra lỗi khi thay đổi chế độ hiển thị hồ sơ", + "researcher.profile.create.fail": "Đã có lỗi xảy ra trong khi tạo hồ sơ nhà nghiên cứu", + "researcher.profile.create.new": "Tạo mới", + "researcher.profile.create.success": "Đã tạo thành công hồ sơ nhà nghiên cứu", + "researcher.profile.delete": "Xóa", + "researcher.profile.expose": "Hiển thị", + "researcher.profile.hide": "Ẩn", + "researcher.profile.not.associated": "Hồ sơ nhà nghiên cứu chưa được liên kết", + "researcher.profile.private.visibility": "CÁ NHÂN", + "researcher.profile.public.visibility": "CÔNG CỘNG", + "researcher.profile.status": "Trạng thái:", + "researcher.profile.view": "Xem", + + "person.page.orcid": "ORCID", + "person.page.orcid.create": "Tạo một ID trên ORCID", + "person.page.orcid.funding-preferences": "Quỹ ưa thích", + "person.page.orcid.grant-authorizations": "Cấp quyền", + "person.page.orcid.granted-authorizations": "Quyền đã cấp", + "person.page.orcid.link": "Liên kết với ID ORCID", + "person.page.orcid.link.error.message": "Đã xảy ra lỗi khi kết nối hồ sơ với ORCID. Nếu sự cố vẫn tiếp tục xảy ra vui lòng liên hệ với quản trị viên.", + "person.page.orcid.link.processing": "Đang kết nối hồ sơ tới ORCID…", + "person.page.orcid.missing-authorizations": "Thiếu quyền", + "person.page.orcid.missing-authorizations-message": "Những quyền sau đang bị thiếu:", + "person.page.orcid.no-missing-authorizations-message": "Tuyệt! Ô này đang trống vì vậy bạn đã được cấp tất cả các quyền truy cập để sử dụng tất cả các chức năng do tổ chức của bạn cung cấp.", + "person.page.orcid.no-orcid-message": "Chưa có ID ORCID nào được liên kết. Bạn có thể click vào nút dưới đây để liên kết hồ sơ này với một tài khoản ORCID.", + "person.page.orcid.orcid-not-linked-message": "ID ORCID của hồ sơ này ({{ orcid }}) chưa được kết nối với tài khoản trên trang ORCID hoặc kết nối đã hết hạn.", + "person.page.orcid.profile-preferences": "Tham số của hồ sơ", + "person.page.orcid.publications-preferences": "Tham số của ấn phẩm", + "person.page.orcid.remove-orcid-message": "Nếu bạn cần xóa ORCID của bạn vui lòng liên hệ với quản trị viên.", + "person.page.orcid.save.preference.changes": "Cập nhật cài đặt", + "person.page.orcid.scope.activities-update": "Thêm\/cập nhật các hoạt động nghiên cứu của bạn", + "person.page.orcid.scope.authenticate": "Lấy ID ORCID của bạn", + "person.page.orcid.scope.person-update": "Thêm\/cập nhật thông tin cá nhân của bạn", + "person.page.orcid.scope.read-limited": "Thiết lập để cho phép Các bên Tin cậy (Trusted Parties) có khả năng đọc thông tin của bạn ", + "person.page.orcid.sync-fundings.all": "Tất cả quỹ", + "person.page.orcid.sync-fundings.disabled": "Đã ngừng kích hoạt", + "person.page.orcid.sync-fundings.mine": "Quỹ của tôi", + "person.page.orcid.sync-fundings.my_selected": "Quỹ đã chọn", + "person.page.orcid.synchronization-mode": "Chế độ đồng bộ", + "person.page.orcid.synchronization-mode.batch": "Theo lô", + "person.page.orcid.synchronization-mode.label": "Chế độ đồng bộ", + "person.page.orcid.synchronization-mode.manual": "Thủ công", + "person.page.orcid.synchronization-mode-funding-message": "Chọn gửi\/không gửi các thực thể dự án của bạn đến danh sách các quỹ tài trợ trong bản ghi ORCID của bạn hay không.", + "person.page.orcid.synchronization-mode-message": "Vui lòng chọn phương thức đồng bộ hóa với ORCID. Các tùy chọn bao gồm \"Thủ công\" (bạn phải gửi dữ liệu của mình tới ORCID theo cách thủ công) hoặc \"Tự động\" (hệ thống sẽ gửi dữ liệu của bạn tới ORCID thông qua tập lệnh đã lên lịch).", + "person.page.orcid.synchronization-mode-profile-message": "Chọn gửi\/ không gửi thông tin tiểu sử hoặc số định danh cá nhân tới hồ sơ ORCID của bạn.", + "person.page.orcid.synchronization-mode-publication-message": "Chọn gửi\/ không gửi các thực thể Ấn phẩm tới danh sách các tác phẩm trong biểu ghi ORCID của bạn.", + "person.page.orcid.synchronization-settings-update.error": "Cập nhật cài đặt đồng bộ hóa không thành công", + "person.page.orcid.synchronization-settings-update.success": "Cài đặt đồng bộ hóa đã được cập nhật thành công", + "person.page.orcid.sync-profile.affiliation": "Tổ chức", + "person.page.orcid.sync-profile.biographical": "Dữ liệu sinh trắc học", + "person.page.orcid.sync-profile.education": "Giáo dục", + "person.page.orcid.sync-profile.identifiers": "Định danh", + "person.page.orcid.sync-publications.all": "Tất cả ấn phẩm", + "person.page.orcid.sync-publications.disabled": "Đã ngừng kích hoạt", + "person.page.orcid.sync-publications.mine": "Ấn phẩm của tôi", + "person.page.orcid.sync-publications.my_selected": "Ấn phẩm đã chọn", + "person.page.orcid.sync-queue.description.affiliation": "Tổ chức", + "person.page.orcid.sync-queue.description.country": "Quốc gia", + "person.page.orcid.sync-queue.description.education": "Giáo dục", + "person.page.orcid.sync-queue.description.external_ids": "ID ngoài", + "person.page.orcid.sync-queue.description.keywords": "Từ khóa", + "person.page.orcid.sync-queue.description.other_names": "Tên khác", + "person.page.orcid.sync-queue.description.qualification": "Trình độ chuyên môn", + "person.page.orcid.sync-queue.description.researcher_urls": "URL nhà nghiên cứu", + "person.page.orcid.sync-queue.discard": "Hủy thay đổi và không đồng bộ với trang ORCID", + "person.page.orcid.sync-queue.discard.error": "Việc loại bỏ biểu ghi trong danh sách chờ của ORCID đã thất bại", + "person.page.orcid.sync-queue.discard.success": "Biểu ghi trong danh sách chờ của ORCID đã được hủy bỏ thành công", + "person.page.orcid.sync-queue.empty-message": "Danh sách chờ ORCID trống", + "person.page.orcid.sync-queue.send": "Đồng bộ với trang ORCID", + "person.page.orcid.sync-queue.send.bad-request-error": "Đẩy dữ liệu lên ORCID không thành công vì tài nguyên này không hợp lệ", + "person.page.orcid.sync-queue.send.conflict-error": "Đẩy dữ liệu lên ORCID không thành công bởi vì tài nguyên này đã có trên trang ORCID", + "person.page.orcid.sync-queue.send.error": "Đẩy dữ liệu lên ORCID không thành công", + "person.page.orcid.sync-queue.send.not-found-warning": "Tài nguyên không còn tồn tại trên ORCID.", + "person.page.orcid.sync-queue.send.success": "Đẩy dữ liệu lên ORCID thành công", + "person.page.orcid.sync-queue.send.unauthorized-error.content": "Nhấp
vào đây<\/a> để cấp lại các quyền bắt buộc. Nếu vấn đề vẫn còn tồn tại vui lòng liên hệ quản trị viên.", + "person.page.orcid.sync-queue.send.unauthorized-error.title": "Đẩy dữ liệu lên ORCID không thành công do tài khoản của bạn không đủ các quyền cần thiết.", + "person.page.orcid.sync-queue.send.validation-error": "Dữ liệu bạn muốn đồng bộ với ORCID là dữ liệu không hợp lệ", + "person.page.orcid.sync-queue.send.validation-error.amount-currency.required": "Đơn vị tiền tệ là bắt buộc", + "person.page.orcid.sync-queue.send.validation-error.country.invalid": "2 ký tự mã quốc gia theo ISO 3166 là không hợp lệ", + "person.page.orcid.sync-queue.send.validation-error.disambiguated-organization.required": "Cần có số định danh (ID) để phân biệt giữa các tổ chức. ID được hỗ trợ là GRID Ringgold LEI và số định dang Cơ quan đăng ký Crossref Funder", + "person.page.orcid.sync-queue.send.validation-error.disambiguated-organization.value-required": "Định danh của tổ chức yêu cầu phải có một giá trị", + "person.page.orcid.sync-queue.send.validation-error.disambiguation-source.invalid": "Nguồn của một trong các số định danh của tổ chức không hợp lệ. Các nguồn được hỗ trợ là RINGGOLD GRID LEI và FUNDREF", + "person.page.orcid.sync-queue.send.validation-error.disambiguation-source.required": "Phải có một nguồn cho định danh của tổ chức", + "person.page.orcid.sync-queue.send.validation-error.external-id.required": "Tài nguyên được gửi yêu cầu phải có ít nhất một định danh", + "person.page.orcid.sync-queue.send.validation-error.funder.required": "Nhà tài trợ là bắt buộc", + "person.page.orcid.sync-queue.send.validation-error.organization.address-required": "Tổ chức này yêu cầu phải có địa chỉ", + "person.page.orcid.sync-queue.send.validation-error.organization.city-required": "Địa chỉ của tổ chức này phải là một thành phố", + "person.page.orcid.sync-queue.send.validation-error.organization.country-required": "Địa chỉ của tổ chức này phải là một mã quốc gia bao gồm 2 ký tự theo ISO 3166", + "person.page.orcid.sync-queue.send.validation-error.organization.name-required": "Tên của tổ chức là bắt buộc", + "person.page.orcid.sync-queue.send.validation-error.organization.required": "Yêu cầu phải có tổ chức", + "person.page.orcid.sync-queue.send.validation-error.publication.date-invalid": "Năm xuất bản phải là năm sau năm 1900", + "person.page.orcid.sync-queue.send.validation-error.start-date.required": "Ngày bắt đầu là bắt buộc", + "person.page.orcid.sync-queue.send.validation-error.title.required": "Nhan đề là bắt buộc", + "person.page.orcid.sync-queue.send.validation-error.type.required": "Trường dc.type là bắt buộc", + "person.page.orcid.sync-queue.table.header.action": "Hành động", + "person.page.orcid.sync-queue.table.header.description": "Mô tả", + "person.page.orcid.sync-queue.table.header.type": "Loại hình tài liệu", + "person.page.orcid.sync-queue.tooltip.affiliation": "Tổ chức", + "person.page.orcid.sync-queue.tooltip.country": "Quốc gia", + "person.page.orcid.sync-queue.tooltip.delete": "Loại bỏ mục này khỏi trang ORCID", + "person.page.orcid.sync-queue.tooltip.education": "Giáo dục", + "person.page.orcid.sync-queue.tooltip.external_ids": "Định danh ", + "person.page.orcid.sync-queue.tooltip.insert": "Thêm mục mới trong ORCID", + "person.page.orcid.sync-queue.tooltip.keywords": "Từ khóa", + "person.page.orcid.sync-queue.tooltip.other_names": "Tên khác", + "person.page.orcid.sync-queue.tooltip.project": "Dự án", + "person.page.orcid.sync-queue.tooltip.publication": "Ấn phẩm", + "person.page.orcid.sync-queue.tooltip.qualification": "Trình độ chuyên môn", + "person.page.orcid.sync-queue.tooltip.researcher_urls": "URL nhà nghiên cứu", + "person.page.orcid.sync-queue.tooltip.update": "Cập nhật mục này trên trang ORCID", + "person.page.orcid.unlink": "Ngắt kết nối khỏi ORCID", + "person.page.orcid.unlink.error": "Đã xảy ra lỗi khi ngắt kết nối giữa hồ sơ và ORCID. Vui lòng thử lại.", + "person.page.orcid.unlink.processing": "Đang xử lý…", + "person.page.orcid.unlink.success": "Đã ngắt kết nối giữa hồ sơ nhà nghiên cứu và trang ORCID thành công", + + "person.orcid.registry.auth": "Được phép qua ORCID ", + "person.orcid.registry.queue": "Đang xếp hàng đợi đăng ký ORCID", + "person.orcid.sync.setting": "Thiết lập đồng bộ hóa với ORCID", + + "home.recent-submissions.head": "Các tài liệu tải lên gần đây", + + "listable-notification-object.default-message": "Không thể truy xuất", + + "system-wide-alert-banner.retrieval.error": "Đã xảy ra lỗi trong quá trình truy xuất cảnh báo hệ thống", + "system-wide-alert-banner.countdown.prefix": "Trong", + "system-wide-alert-banner.countdown.days": "{{days}} ngày", + "system-wide-alert-banner.countdown.hours": "{{hours}} giờ và", + "system-wide-alert-banner.countdown.minutes": "{{minutes}} phút:", + + "menu.section.system-wide-alert": "Cảnh báo toàn hệ thống", + + "system-wide-alert.form.header": "Cảnh báo toàn hệ thống", + "system-wide-alert-form.retrieval.error": "Đã xảy ra lỗi trong quá trình truy xuất cảnh báo trên toàn hệ thống", + "system-wide-alert.form.cancel": "Hủy", + "system-wide-alert.form.save": "Lưu", + "system-wide-alert.form.label.active": "HOẠT ĐỘNG", + "system-wide-alert.form.label.inactive": "KHÔNG HOẠT ĐỘNG", + "system-wide-alert.form.error.message": "Cảnh báo trên toàn hệ thống phải chứa một nội dung", + "system-wide-alert.form.label.message": "Nội dung cảnh báo", + "system-wide-alert.form.label.countdownTo.enable": "Kích hoạt thời gian tạm dừng máy chủ", + "system-wide-alert.form.label.countdownTo.hint": "Gợi ý: Thiết lập lịch tạm dừng máy chủ. Khi chức năng này được kích hoạt, có thể lựa chọn một ngày tạm dừng máy chủ trong tương lai và nội dung cảnh báo sẽ được đếm ngược tới ngày đã đặt. Khi bộ hẹn giờ này được kết thúc, nội dung này sẽ biến mất khỏi cảnh báo. Máy chủ sẽ không tự động tạm dừng.", + "system-wide-alert.form.label.preview": "Xem trước cảnh báo toàn hệ thống", + "system-wide-alert.form.update.success": "Cảnh báo toàn hệ thống đã được cập nhật thành công", + "system-wide-alert.form.update.error": "Đã xảy ra lỗi trong quá trình cập nhật cảnh báo toàn hệ thống", + "system-wide-alert.form.create.success": "Cảnh báo toàn hệ thống đã được tạo thành công", + "system-wide-alert.form.create.error": "Đã xảy ra lỗi trong quá trình tạo cảnh báo toàn hệ thống", + "admin.system-wide-alert.breadcrumbs": "Cảnh báo toàn hệ thống", + "admin.system-wide-alert.title": "Cảnh báo toàn hệ thống", } \ No newline at end of file From 53b883cb4205b8c591146db67cd611d7bb85df69 Mon Sep 17 00:00:00 2001 From: tuanvu Date: Wed, 26 Apr 2023 16:21:58 +0700 Subject: [PATCH 116/409] Internalization (i18n): Vietnamese translation! Fixes #2172 --- src/assets/i18n/vi.json5 | 204 ++++++++------------------------------- 1 file changed, 39 insertions(+), 165 deletions(-) diff --git a/src/assets/i18n/vi.json5 b/src/assets/i18n/vi.json5 index 4e3528148f..169f19f41a 100644 --- a/src/assets/i18n/vi.json5 +++ b/src/assets/i18n/vi.json5 @@ -11,17 +11,14 @@ "500.help": "Máy chủ tạm thời không thể phục vụ yêu cầu của bạn do đang trong giai đoạn bảo trì hoặc vấn đề về dung lượng. Vui lòng thử lại sau.", "500.link.home-page": "Đi tới trang chủ", "500.page-internal-server-error": "Dịch vụ không sẵn sàng", - "access-status.embargo.listelement.badge": "Ngăn chặn", "access-status.metadata.only.listelement.badge": "Chỉ siêu dữ liệu", "access-status.open.access.listelement.badge": "Truy cập mở", "access-status.restricted.listelement.badge": "Hạn chế", "access-status.unknown.listelement.badge": "Không xác định", - "admin.curation-tasks.breadcrumbs": "Thu thập các tác vụ hệ thống", "admin.curation-tasks.header": "Thu thập các tác vụ hệ thống", "admin.curation-tasks.title": "Thu thập các tác vụ hệ thống", - "admin.registries.bitstream-formats.breadcrumbs": "Tạo định dạng", "admin.registries.bitstream-formats.create.breadcrumbs": "Định dạng tệp tin", "admin.registries.bitstream-formats.create.failure.content": "Đã xảy ra lỗi khi tạo định dạng tệp tin mới.", @@ -106,7 +103,6 @@ "admin.registries.schema.notification.success": "Thành công", "admin.registries.schema.return": "Quay lại", "admin.registries.schema.title": "Tạo lược đồ thông tin mô tả", - "admin.access-control.epeople.actions.delete": "Xóa người dùng", "admin.access-control.epeople.actions.impersonate": "Mạo danh người dùng", "admin.access-control.epeople.actions.reset": "Cài lại mật khẩu", @@ -134,7 +130,7 @@ "admin.access-control.epeople.form.notification.edited.success": "Chỉnh sửa thành công người dùng \"{{name}}\"", "admin.access-control.epeople.form.requireCertificate": "Khóa tài khoản", "admin.access-control.epeople.form.return": "Quay lại", - "admin.access-control.epeople.form.table.collectionOrCommunity": "Đơn vị\/ Bộ sưu tập", + "admin.access-control.epeople.form.table.collectionOrCommunity": "Đơn vị/ Bộ sưu tập", "admin.access-control.epeople.form.table.id": "ID", "admin.access-control.epeople.form.table.name": "Tên", "admin.access-control.epeople.head": "Người dùng", @@ -161,7 +157,7 @@ "admin.access-control.groups.button.see-all": "Duyệt toàn bộ", "admin.access-control.groups.form.actions.delete": "Xóa nhóm người dùng", "admin.access-control.groups.form.alert.permanent": "Nhóm này là cố định vì vậy nó không thể bị chỉnh sửa hoặc xóa. Bạn vẫn có thể thêm và loại bỏ thành viên trong nhóm tại trang này.", - "admin.access-control.groups.form.alert.workflowGroup": "Không thể chỉnh sửa hoặc xóa nhóm này vì nó tương ứng với một vai trò trong quá trình gửi và quy trình xử lý trong \"{{name}}\" {{comcol}}. Bạn có thể xóa nó từ thẻ assign roles<\/a> trên trang chỉnh sửa {{comcol}}. Bạn vẫn có thể thêm và loại bỏ thành viên nhóm bằng trang này.\"", + "admin.access-control.groups.form.alert.workflowGroup": "Không thể chỉnh sửa hoặc xóa nhóm này vì nó tương ứng với một vai trò trong quá trình gửi và quy trình xử lý trong \"{{name}}\" {{comcol}}. Bạn có thể xóa nó từ thẻ assign roles trên trang chỉnh sửa {{comcol}}. Bạn vẫn có thể thêm và loại bỏ thành viên nhóm bằng trang này.\"", "admin.access-control.groups.form.delete-group.modal.cancel": "Hủy", "admin.access-control.groups.form.delete-group.modal.confirm": "Xóa", "admin.access-control.groups.form.delete-group.modal.header": "Xóa nhóm người dùng \"{{ dsoName }}\"", @@ -185,7 +181,7 @@ "admin.access-control.groups.form.members-list.search.head": "Thêm người dùng", "admin.access-control.groups.form.members-list.search.scope.email": "E-mail (chính xác)", "admin.access-control.groups.form.members-list.search.scope.metadata": "Siêu dữ liệu", - "admin.access-control.groups.form.members-list.table.edit": "Loại bỏ \/ Thêm", + "admin.access-control.groups.form.members-list.table.edit": "Loại bỏ / Thêm", "admin.access-control.groups.form.members-list.table.edit.buttons.add": "Thêm thành viên với tên \"{{name}}\"", "admin.access-control.groups.form.members-list.table.edit.buttons.remove": "Loại bỏ thành viên với tên \"{{name}}\"", "admin.access-control.groups.form.members-list.table.email": "Email", @@ -217,8 +213,8 @@ "admin.access-control.groups.form.subgroups-list.notification.success.deleteSubgroup": "Loại bỏ thành công nhóm người dùng: \"{{name}}\" ra khỏi nhóm", "admin.access-control.groups.form.subgroups-list.search.button": "Tìm kiếm", "admin.access-control.groups.form.subgroups-list.search.head": "Thêm nhóm người dùng con", - "admin.access-control.groups.form.subgroups-list.table.collectionOrCommunity": "Đơn vị\/ Bộ sưu tập", - "admin.access-control.groups.form.subgroups-list.table.edit": "Loại bỏ \/ Thêm", + "admin.access-control.groups.form.subgroups-list.table.collectionOrCommunity": "Đơn vị/ Bộ sưu tập", + "admin.access-control.groups.form.subgroups-list.table.edit": "Loại bỏ / Thêm", "admin.access-control.groups.form.subgroups-list.table.edit.buttons.add": "Thêm nhóm người dùng con với tên \"{{name}}\"", "admin.access-control.groups.form.subgroups-list.table.edit.buttons.remove": "Loại bỏ nhóm người dùng con với tên \"{{name}}\"", "admin.access-control.groups.form.subgroups-list.table.edit.currentGroup": "Nhóm người dùng hiện tại", @@ -233,7 +229,7 @@ "admin.access-control.groups.search.head": "Tìm kiếm nhóm người dùng", "admin.access-control.groups.search.placeholder": "Tìm kiếm nhóm người dùng...", "admin.access-control.groups.singleGroup.breadcrumbs": "Chỉnh sửa nhóm người dùng", - "admin.access-control.groups.table.collectionOrCommunity": "Đơn vị\/ Bộ sưu tập", + "admin.access-control.groups.table.collectionOrCommunity": "Đơn vị/ Bộ sưu tập", "admin.access-control.groups.table.edit": "Chỉnh sửa", "admin.access-control.groups.table.edit.buttons.edit": "Chỉnh sửa \"{{name}}\"", "admin.access-control.groups.table.edit.buttons.remove": "Xóa \"{{name}}\"", @@ -243,7 +239,6 @@ "admin.access-control.groups.title": "Nhóm người dùng", "admin.access-control.groups.title.addGroup": "Tạo nhóm người dùng", "admin.access-control.groups.title.singleGroup": "Chỉnh sửa nhóm người dùng", - "admin.search.breadcrumbs": "Tìm kiếm quản trị", "admin.search.collection.edit": "Chỉnh sửa", "admin.search.community.edit": "Chỉnh sửa", @@ -255,9 +250,7 @@ "admin.search.item.reinstate": "Khôi phục", "admin.search.item.withdraw": "Ẩn", "admin.search.title": "Tìm kiếm quản trị", - "administrativeView.search.results.head": "Tìm kiếm quản trị", - "admin.workflow.breadcrumbs": "Quản trị luồng công việc", "admin.workflow.title": "Quản trị luồng công việc", "admin.workflow.item.workflow": "Luồng công việc", @@ -266,7 +259,6 @@ "admin.workflow.item.send-back": "Gửi trở lại", "admin.workflow.item.policies": "Policies", "admin.workflow.item.supervision": "Supervision", - "admin.batch-import.breadcrumbs": "Nhập dữ liệu theo lô", "admin.batch-import.page.dropMsg": "Kéo thả file ZIP để nhập vào", "admin.batch-import.page.dropMsgReplace": "Kéo thả để thay thế file ZIP cần nhập vào", @@ -276,7 +268,6 @@ "admin.batch-import.page.remove": "xóa", "admin.batch-import.title": "Nhập dữ liệu theo lô", "admin.batch-import.page.validateOnly.hint": "Nếu chọn tùy chọn \"Kiểm tra file ZIP tải lên\", hệ thống sẽ chạy một tiến trình kiểm tra việc nhập dữ liệu theo lô thay vì đổ trực tiếp dữ liệu lên hệ thống. Việc này giúp cán bộ xác nhận lại kết quả của quy trình nhập trước khi nhập dữ liệu chính thức. Bỏ chọn tùy chọn này để đổ lô tài liệu lên hệ thống.", - "admin.metadata-import.breadcrumbs": "Nhập thông tin mô tả", "admin.metadata-import.page.button.proceed": "Tiếp tục", "admin.metadata-import.page.button.return": "Quay lại", @@ -289,7 +280,6 @@ "admin.metadata-import.page.validateOnly": "Kiểm tra nhập lô siêu dữ liệu", "admin.metadata-import.page.validateOnly.hint": "Nếu chọn tùy chọn \"Kiểm tra nhập lô siêu dữ liệu\", hệ thống sẽ chạy một tiến trình kiểm tra nhập lô siêu dữ liệu thay vì đổ trực tiếp dữ liệu lên hệ thống. Bỏ chọn tùy chọn này để tiến hành nhập dữ liệu chính thức.", "admin.metadata-import.title": "Nhập thông tin mô tả", - "advanced-workflow-action.rating.form.rating.label": "Xếp hạng", "advanced-workflow-action.rating.form.rating.error": "Bạn phải đánh giá tài liệu/ thực thế này", "advanced-workflow-action.rating.form.review.label": "Kiểm duyệt", @@ -320,16 +310,12 @@ "advanced-workflow-action-select-reviewer.groups.form.reviewers-list.notification.failure.noActiveGroup": "Không có nhóm hoạt động, gửi tên trước.", "advanced-workflow-action-select-reviewer.groups.form.reviewers-list.no-members-yet": "Chưa có thành viên nào trong nhóm, tìm kiếm để thêm.", "advanced-workflow-action-select-reviewer.groups.form.reviewers-list.no-items": "Không tìm thấy người dùng", - "advanced-workflow-action.select-reviewer.no-reviewer-selected.error": "Không có người kiểm duyệt nào được chọn.", - + "advanced-workflow-action.select-reviewer.no-reviewer-selected.error": "Không có người kiểm duyệt nào được chọn.", "auth.errors.invalid-user": "Địa chỉ email hoặc mật khẩu không hợp lệ.", - "auth.messages.expired": "Phiên của bạn đã hết hạn. Xin vui lòng đăng nhập lại.", "auth.messages.token-refresh-failed": "Làm mới mã token phiên làm việc của bạn không thành công. Vui lòng đăng nhập lại.", - "bitstream.download.page": "Đang tải xuống {{bitstream}}... ", "bitstream.download.page.back": "Quay lại", - "bitstream.edit.authorizations.link": "Chỉnh sửa chính sách của tệp tin", "bitstream.edit.authorizations.title": "Chỉnh sửa chính sách của tệp tin", "bitstream.edit.bitstream": "Tệp tin:", @@ -358,7 +344,6 @@ "bitstream.edit.notifications.saved.title": "Đã lưu tệp tin", "bitstream.edit.return": "Quay lại", "bitstream.edit.title": "Chỉnh sửa tệp tin", - "bitstream-request-a-copy.alert.canDownload1": "Bạn đã có quyền truy cập tệp tin này. Nếu muốn tải tệp tin click ", "bitstream-request-a-copy.alert.canDownload2": "vào đây", "bitstream-request-a-copy.allfiles.label": "Các tệp tin", @@ -378,17 +363,13 @@ "bitstream-request-a-copy.submit": "Yêu cầu bản sao", "bitstream-request-a-copy.submit.error": "Đã xảy ra lỗi trong quá trình gửi yêu cầu tài liệu.", "bitstream-request-a-copy.submit.success": "Yêu cầu tài liệu đã được gửi thành công.", - "browse.back.all-results": "Tất cả kết quả", - "browse.comcol.by.author": "Tác giả", "browse.comcol.by.dateissued": "Năm xuất bản", "browse.comcol.by.subject": "Chủ đề", "browse.comcol.by.title": "Nhan đề", "browse.comcol.head": "Duyệt", - "browse.empty": "Không có tài liệu nào để hiển thị.", - "browse.metadata.author": "Tác giả", "browse.metadata.author.breadcrumbs": "Duyệt theo tác giả", "browse.metadata.dateissued": "Năm xuất bản", @@ -399,11 +380,9 @@ "browse.metadata.title.breadcrumbs": "Duyệt theo nhan đề", "browse.metadata.topic": "Topic", "browse.metadata.type": "Kiểu tài liệu", - "pagination.next.button": "Tiếp theo", "pagination.previous.button": "Quay lại", "pagination.next.button.disabled.tooltip": "Không còn trang kết quả khác", - "browse.startsWith.choose_year.label": "Chọn năm xuất bản", "browse.startsWith.choose_year": "(Năm)", "browse.startsWith.jump": "Chuyển tới một điểm trong chỉ mục:", @@ -425,18 +404,13 @@ "browse.startsWith.type_date": "Hoặc nhập một ngày (năm-tháng) và nhấp \"Duyệt\"", "browse.startsWith.type_date.label": "Hoặc nhập một ngày (năm-tháng) à nhấp Duyệt", "browse.startsWith.type_text": "Nhập một vài ký tự đầu tiên và nhấp vào nút Duyệt", - "browse.title": "Duyệt {{ collection }} theo {{ field }}{{ startsWith }} {{ value }}", "browse.title.page": "Duyệt {{ collection }} theo {{ field }} {{ value }}", - "search.browse.item-back": "Quay lại kết quả tìm kiếm", - "chips.remove": "Loại bỏ chip", - "claimed-approved-search-result-list-element.title": "Chấp nhận", "claimed-declined-search-result-list-element.title": "Đã bị từ chối, đã gửi lại cho người nhập liệu", "claimed-declined-task-search-result-list-element.title": "Bị từ chối, đã gửi lại tới người quản lý kiểm duyệt", - "collection.create.head": "Tạo một Bộ sưu tập", "collection.create.notifications.success": "Tạo bộ sưu tập thành công", "collection.create.sub-head": "Tạo một bộ sưu tập cho đơnn vị {{ parent }}", @@ -545,7 +519,7 @@ "collection.select.table.title": "Nhan đề", "collection.source.controls.harvest.last": "Lần thu thập trước:", "collection.source.controls.harvest.message": "Thông tin thu thập:", - "collection.source.controls.harvest.no-information": "N\/A", + "collection.source.controls.harvest.no-information": "N/A", "collection.source.controls.harvest.start": "Thời gian bắt đầu thu thập:", "collection.source.controls.harvest.status": "Trạng thái thu thập:", "collection.source.controls.head": "Quản lý thu thập:", @@ -568,7 +542,6 @@ "collection.source.controls.test.submit.error": "Đã xảy ra lỗi khi bắt đầu cài đặt thử nghiệm", "collection.source.update.notifications.error.content": "Các cài đặt đã được kiểm tra và không hoạt động.", "collection.source.update.notifications.error.title": "Lỗi máy chủ", - "community.create.head": "Tạo đơn vị", "community.create.notifications.success": "Tạo đơn vị thành công", "community.create.sub-head": "Tạo một đơn vị con cho đơn vị {{ parent }}", @@ -621,7 +594,6 @@ "communityList.showMore": "Hiển thị thêm", "communityList.tabTitle": "Danh sách đơn vị", "communityList.title": "Danh sách các đơn vị", - "comcol-role.edit.bitstream_read.anonymous-group": "Quyền đọc được mặc định cho các tài liệu hiện được đặt cho nhóm người dùng ẩn danh.", "comcol-role.edit.bitstream_read.description": "Người có quyền đọc tệp tin có khả năng tải các tệp tin về máy tính cá nhân để sử dụng", "comcol-role.edit.bitstream_read.name": "Quyền đọc tệp tin mặc định", @@ -646,24 +618,19 @@ "comcol-role.edit.reviewer.name": "Người kiểm duyệt", "comcol-role.edit.submitters.description": "Tài khoản người dùng và nhóm người dùng có quyền tải tài liệu mới vào bộ sưu tập này", "comcol-role.edit.submitters.name": "Người tải lên", - "community.form.abstract": "Mô tả ngắn", "community.form.description": "Văn bản giới thiệu (HTML)", "community.form.errors.title.required": "Vui lòng nhập tên đơn vị", "community.form.rights": "Thông tin bản quyền (HTML)", "community.form.tableofcontents": "Tin tức (HTML)", "community.form.title": "Tên", - "community.page.edit": "Chỉnh sửa đơn vị", "community.page.handle": "URL", "community.page.license": "Giấy phép", "community.page.news": "Tin tức", - "community.all-lists.head": "Đơn vị con và bộ sưu tập", - "community.sub-collection-list.head": "Các bộ sưu tập của đơn vị này", "community.sub-community-list.head": "Các đơn vị con của đơn vị này", - "cookies.consent.accept-all": "Chấp thuận tất cả", "cookies.consent.accept-selected": "Chấp nhận các mục đã chọn", "cookies.consent.app.description.acknowledgement": "Bắt buộc để lưu sự xác nhận và đồng ý của bạn", @@ -700,7 +667,6 @@ "cookies.consent.purpose.statistical": "Thống kê", "cookies.consent.save": "Lưu", "cookies.consent.update": "Có 1 vài thay đổi từ lần ghé thăm cuối cùng của bạn vui lòng cập nhập sự đồng ý của bạn.", - "curation-task.task.checklinks.label": "\"Kiểm tra các link trong thông tin mô tả\"", "curation-task.task.citationpage.label": "Tạo trang trích dẫn", "curation-task.task.noop.label": "NOOP", @@ -709,8 +675,7 @@ "curation-task.task.requiredmetadata.label": "Kiểm tra các trường dữ liệu bắt buộc", "curation-task.task.translate.label": "Bộ dịch của Microsoft", "curation-task.task.vscan.label": "Quét Virus", - - "curation.form.handle.hint": "Gợi ý: Nhập [your-handle-prefix]\/0 để chạy một tác vụ trên toàn bộ trang (chú ý rằng không phải tất cả tác vụ đều hỗ trợ khả năng này)", + "curation.form.handle.hint": "Gợi ý: Nhập [your-handle-prefix]/0 để chạy một tác vụ trên toàn bộ trang (chú ý rằng không phải tất cả tác vụ đều hỗ trợ khả năng này)", "curation.form.handle.label": "Handle:", "curation.form.submit": "Bắt đầu", "curation.form.submit.error.content": "Đã có lỗi xảy ra khi cố gắng khởi động tác vụ kiểm tra.", @@ -719,16 +684,13 @@ "curation.form.submit.success.content": "Bạn sẽ được điều hướng đến trang phản hồi quy trình.", "curation.form.submit.success.head": "Tác vụ kiểm tra đã khởi động thành công", "curation.form.task-select.label": "Tác vụ:", - "deny-request-copy.email.message": "Kính gửi {{ recipientName }}\n\nLiên quan đến yêu cầu của bạn Thư viện rất tiếc phải thông báo với bạn rằng chúng tôi không thể gửi cho bạn bản sao của (các) tệp bạn đã yêu cầu liên quan đến tài liệu: \"{{ itemUrl }}\" ({{ itemName }}).\n\nTrân trọng\n,{{ authorName}}<{{ authorEmail }}>", "deny-request-copy.email.subject": "Yêu cầu bản sao tài liệu", "deny-request-copy.error": "Đã xảy ra lỗi", "deny-request-copy.header": "Từ chối yêu cầu bản sao tài liệu", "deny-request-copy.intro": "Tin nhắn này sẽ được gửi đến người yêu cầu", "deny-request-copy.success": "Từ chối thành công yêu cầu tài liệu", - "dso.name.untitled": "Không có nhan đề", - "dso-selector.claim.item.body": "Đây là những hồ sơ hiện có có thể liên quan đến bạn. Nếu bạn nhận ra mình ở một trong những hồ sơ này hãy chọn hồ sơ đó và trên trang chi tiết hãy chọn xác nhận hồ sơ. Nếu không bạn có thể tạo một hồ sơ mới từ đầu bằng cách sử dụng nút bên dưới.", "dso-selector.claim.item.create-from-scratch": "Tạo hồ sơ mới", "dso-selector.claim.item.head": "Mẹo quản lý hồ sơ", @@ -759,7 +721,6 @@ "dso-selector.set-scope.community.head": "Chọn một phạm vi tìm kiếm", "dso-selector.set-scope.community.input-header": "Tìm kiếm một đơn vị hoặc bộ sưu tập", "dso-selector.set-scope.community.or-divider": "hoặc", - "supervision-group-selector.header": "Supervision Group Selector", "supervision-group-selector.select.type-of-order.label": "Select a type of Order", "supervision-group-selector.select.type-of-order.option.none": "NONE", @@ -773,7 +734,6 @@ "supervision-group-selector.notification.create.success.title": "Successfully created supervision order for group {{ name }}", "supervision-group-selector.notification.create.failure.title": "Error", "supervision-group-selector.notification.create.already-existing" : "A supervision order already exists on this item for selected group", - "confirmation-modal.delete-eperson.cancel": "Hủy", "confirmation-modal.delete-eperson.confirm": "Xóa", "confirmation-modal.delete-eperson.header": "Xóa người dùng \"{{ dsoName }}\"", @@ -797,7 +757,6 @@ "confirmation-modal.reset-password-eperson.cancel": "Hủy", "confirmation-modal.reset-password-eperson.confirm": "Thiết lập lại mật khẩu", "confirmation-modal.reset-password-eperson.info": "Bạn có chắc chắn muốn thiết lập lại mật khẩu cho người dùng \"{{ dsoName }}\"", - "error.bitstream": "Lỗi tìm kiếm tệp tin", "error.browse-by": "Lỗi tìm kiếm tài liệu", "error.collection": "Lỗi tìm kiếm bộ sưu tập", @@ -827,11 +786,8 @@ "error-page.description.404": "không tìm thấy trang", "error-page.description.500": "Dịch vụ không sẵn sàng", "error-page.orcid.generic-error": "Đã xảy ra lỗi khi đăng nhập qua ORCID. Make sure you have shared your ORCID account email address with DSpace. If the error persists contact the administrator", - "feed.description": "Nguồn cấp dữ liệu tổng hợp", - "file-section.error.header": "Lỗi khi lấy tệp cho tài liệu này", - "footer.copyright": "bản quyền © 2002-{{ year }}", "footer.link.cookies": "Cài đặt Cookie", "footer.link.dspace": "Phần mềm thư viện số", @@ -839,7 +795,6 @@ "footer.link.feedback": "Gửi phản hồi", "footer.link.lyrasis": "LYRASIS", "footer.link.privacy-policy": "Chính sách riêng tư", - "forgot-email.form.email": "Địa chỉ Email *", "forgot-email.form.email.error.pattern": "Vui lòng nhập một địa chỉ email hợp lệ", "forgot-email.form.email.error.required": "Vui lòng nhập địa chỉ email", @@ -851,7 +806,6 @@ "forgot-email.form.submit": "Lưu", "forgot-email.form.success.content": "Một email đã được gửi tới địa chỉ {{ email }} trong đó có chứa URL và các hướng dẫn chi tiết hơn.", "forgot-email.form.success.head": "Email xác nhận đã được gửi tới bạn", - "forgot-password.form.card.security": "Bảo mật", "forgot-password.form.error.empty-password": "Vui lòng nhập mật khẩu mới trong ô dưới đây.", "forgot-password.form.error.matching-passwords": "Hai mật khẩu không trùng khớp.", @@ -866,7 +820,6 @@ "forgot-password.form.notification.success.title": "Hoàn thành đặt lại mật khẩu", "forgot-password.form.submit": "Gửi mật khẩu", "forgot-password.title": "Quên mật khẩu", - "form.add": "Thêm", "form.add-help": "Nhấp vào đây để thêm mục hiện tại và một mục khác", "form.cancel": "Hủy", @@ -894,7 +847,6 @@ "form.search": "Tìm kiếm", "form.search-help": "Nhấp vào đây để tìm kiếm thư từ đang tồn tại", "form.submit": "Lưu", - "grant-deny-request-copy.deny": "Không gửi bản sao", "grant-deny-request-copy.email.back": "Quay lại", "grant-deny-request-copy.email.message": "Tin nhắn", @@ -916,7 +868,6 @@ "grant-request-copy.header": "Chấp nhận yêu cầu bản sao tài liệu", "grant-request-copy.intro": "Tin nhắn này sẽ được gửi đến người gửi yêu cầu. (Các) tài liệu được yêu cầu sẽ được gửi kèm tin nhắn.", "grant-request-copy.success": "Yêu cầu tài liệu đã được xử lý thành công", - "health.breadcrumbs": "Kiểm tra hệ thống", "health-page.error.msg": "Dịch vụ kiểm tra hệ thống tạm thời không khả dụng", "health-page.heading": "Kiểm tra hệ thống", @@ -937,14 +888,12 @@ "health-page.status.warning.info": "Phát hiện các vấn đề có thể xảy ra", "health-page.status-tab": "Trạng thái", "health-page.title": "Kiểm tra hệ thống", - "home.description": "", "home.breadcrumbs": "Trang chủ", "home.search-form.placeholder": "Tìm kiếm kho lưu trữ", "home.title": "Trang chủ", "home.top-level-communities.head": "Danh sách đơn vị trong DSpace", "home.top-level-communities.help": "Chọn một đơn vị để xem các bộ sưu tập của nó.", - "info.contact.breadcrumbs": "Thông tin liên hệ", "info.contact.head": "Thông tin liên hệ", "info.contact.title": "Thông tin liên hệ", @@ -974,7 +923,6 @@ "info.privacy.breadcrumbs": "Cam kết bảo mật", "info.privacy.head": "Cam kết bảo mật", "info.privacy.title": "Cam kết bảo mật", - "item.alerts.private": "Đây là tài liệu cá nhân", "item.alerts.withdrawn": "Tài liệu này đã được chuyển sang chế độ ẩn", "item.badge.private": "Cá nhân", @@ -990,7 +938,7 @@ "item.bitstreams.upload.notifications.bundle.created.title": "Đã tạo gói tệp tin", "item.bitstreams.upload.notifications.upload.failed": "Tải lên thất bại. Vui lòng xác minh nội dung sau trước khi thực hiện lại.", "item.bitstreams.upload.title": "Tải tệp tin lên", - "item.edit.authorizations.heading": "Với trình chỉnh sửa này bạn có thể xem và chỉnh sửa chính sách phân quyền của một tài liệu (item) cũng như các thành phần của tài liệu đó như: gói tệp tin (bundle) và tệp tin (bitstream). Các tài liệu có thể chứa nhiều gói và mỗi gói có thể chứa nhiều tệp tin. Tài liệu và gói tệp tin thường có các quyền là THÊM\/XÓA\/ĐỌC\/CHỈNH SỬA còn tệp tin chỉ có quyền ĐỌC\/CHỈNH SỬA.", + "item.edit.authorizations.heading": "Với trình chỉnh sửa này bạn có thể xem và chỉnh sửa chính sách phân quyền của một tài liệu (item) cũng như các thành phần của tài liệu đó như: gói tệp tin (bundle) và tệp tin (bitstream). Các tài liệu có thể chứa nhiều gói và mỗi gói có thể chứa nhiều tệp tin. Tài liệu và gói tệp tin thường có các quyền là THÊM/XÓA/ĐỌC/CHỈNH SỬA còn tệp tin chỉ có quyền ĐỌC/CHỈNH SỬA.", "item.edit.authorizations.title": "Chỉnh sửa chính sách phân quyền của tài liệu", "item.edit.bitstreams.bundle.displaying": "Đang hiển thị {{ amount }} trong số {{ total }} tệp tin.", "item.edit.bitstreams.bundle.edit.buttons.upload": "Tải lên", @@ -1294,62 +1242,33 @@ "item.version.history.table.workflowItem": "Đang kiểm duyệt", "item.version.history.table.workspaceItem": "Đang biên mục", "item.version.notice": "Đây không phải là phiên bản mới nhất của tài liệu này. Phiên bản mới nhất có thể xem tại đây.", - "itemtemplate.edit.metadata.add-button": "Add", - "itemtemplate.edit.metadata.discard-button": "Discard", - "itemtemplate.edit.metadata.edit.buttons.confirm": "Confirm", - "itemtemplate.edit.metadata.edit.buttons.drag": "Drag to reorder", - "itemtemplate.edit.metadata.edit.buttons.edit": "Edit", - "itemtemplate.edit.metadata.edit.buttons.remove": "Remove", - "itemtemplate.edit.metadata.edit.buttons.undo": "Undo changes", - "itemtemplate.edit.metadata.edit.buttons.unedit": "Stop editing", - "itemtemplate.edit.metadata.empty": "The item template currently doesn't contain any metadata. Click Add to start adding a metadata value.", - "itemtemplate.edit.metadata.headers.edit": "Edit", - "itemtemplate.edit.metadata.headers.field": "Field", - "itemtemplate.edit.metadata.headers.language": "Lang", - "itemtemplate.edit.metadata.headers.value": "Value", - "itemtemplate.edit.metadata.metadatafield.error": "An error occurred validating the metadata field", - "itemtemplate.edit.metadata.metadatafield.invalid": "Please choose a valid metadata field", - "itemtemplate.edit.metadata.notifications.discarded.content": "Your changes were discarded. To reinstate your changes click the 'Undo' button", - "itemtemplate.edit.metadata.notifications.discarded.title": "Changes discarded", - "itemtemplate.edit.metadata.notifications.error.title": "An error occurred", - "itemtemplate.edit.metadata.notifications.invalid.content": "Your changes were not saved. Please make sure all fields are valid before you save.", - "itemtemplate.edit.metadata.notifications.invalid.title": "Metadata invalid", - "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.title": "Changes outdated", - "itemtemplate.edit.metadata.notifications.saved.content": "Your changes to this item template's metadata were saved.", - "itemtemplate.edit.metadata.notifications.saved.title": "Metadata saved", - "itemtemplate.edit.metadata.reinstate-button": "Undo", - "itemtemplate.edit.metadata.reset-order-button": "Undo reorder", - - "itemtemplate.edit.metadata.save-button": "Save", - - + "itemtemplate.edit.metadata.save-button": "Save", "journal.listelement.badge": "Tạp chí", "journal.page.description": "Mô tả", "journal.page.edit": "Chỉnh sửa tài liệu này", @@ -1376,8 +1295,6 @@ "journalvolume.page.issuedate": "Ngày xuất bản", "journalvolume.page.titleprefix": "Tập của tạp chí:", "journalvolume.page.volume": "Tập", - - "iiif.listelement.badge": "Phương tiện hình ảnh", "iiif.page.description": "Mô tả:", "iiif.page.doi": "Đường dẫn cố định:", @@ -1389,7 +1306,6 @@ "iiifsearchable.page.issue": "Vấn đề:", "iiifsearchable.page.titleprefix": "Tài liệu:", "iiifviewer.fullscreen.notice": "Sử dụng chế độ toàn màn hình để xem tốt hơn.", - "loading.bitstream": "Đang tải tệp tin...", "loading.bitstreams": "Đang tải tệp tin...", "loading.browse-by": "Đang tải tài liệu...", @@ -1408,7 +1324,6 @@ "loading.sub-collections": "Đang tải bộ sưu tập con...", "loading.sub-communities": "Đang tải đơn vị con...", "loading.top-level-communities": "Đang tải các đơn vị lớn...", - "login.breadcrumbs": "Đăng nhập", "login.form.email": "Địa chỉ email", "login.form.forgot-password": "Có phải bạn quên mật khẩu?", @@ -1421,15 +1336,12 @@ "login.form.shibboleth": "Đăng nhập bằng Shibboleth", "login.form.submit": "Đăng nhập", "login.title": "Đăng nhập", - "logout.form.header": "Đăng xuất khỏi DSpace", "logout.form.submit": "Đăng xuất", "logout.title": "Đăng xuất", - "menu.header.admin": "Quản trị", "menu.header.admin.description": "Menu quản trị", "menu.header.image.logo": "Logo của kho lưu trữ", - "menu.section.access_control": "Người dùng và nhóm người dùng", "menu.section.access_control_authorizations": "Chính sách phân quyền", "menu.section.access_control_groups": "Nhóm người dùng", @@ -1505,11 +1417,9 @@ "menu.section.toggle.statistics_task": "Phần chuyển đổi Nhiệm vụ Báo cáo thống kê", "menu.section.unpin": "Bỏ ghim thanh quản trị", "menu.section.workflow": "Quản trị dòng công việc", - "metadata-export-search.submit.error": "Xảy ra lỗi trong quá trình xuất dữ liệu", "metadata-export-search.submit.success": "Quá trình xuất dữ liệu đã được khởi chạy thành công", "metadata-export-search.tooltip": "Xuất kết quả tìm kiếm ra CSV", - "mydspace.breadcrumbs": "Trang cá nhân", "mydspace.messages.controller-help": "Chọn tùy chọn này để gửi tin nhắn tới người biên mục tài liệu.", "mydspace.messages.description-placeholder": "Thêm tin nhắn của bạn tại đây...", @@ -1550,7 +1460,6 @@ "mydspace.upload.upload-failed-moreonefile": "Không thể xử lý yêu cầu. Chỉ cho phép một tệp tin duy nhất.", "mydspace.upload.upload-multiple-successful": "Đã tạo {{qty}} mục không gian làm việc mới.", "mydspace.view-btn": "Xem chi tiết", - "nav.browse.header": "Tất cả DSpace", "nav.community-browse.header": "Theo Đơn vị", "nav.language": "Chuyển ngôn ngữ", @@ -1564,11 +1473,9 @@ "nav.stop-impersonating": "Ngừng giả danh Người dùng", "nav.toggle": "Điều hướng chuyển", "nav.user.description": "Thanh hồ sơ người dùng", - "nav.user-profile-menu-and-logout": "Trình đơn Hồ sơ cá nhân và Đăng xuất", - + "nav.user-profile-menu-and-logout": "Trình đơn Hồ sơ cá nhân và Đăng xuất", "none.listelement.badge": "Tài liệu", - - "orgunit.listelement.badge": "Đơn vị\/Tổ chức", + "orgunit.listelement.badge": "Đơn vị/Tổ chức", "orgunit.listelement.no-title": "Không có nhan đề", "orgunit.page.city": "Thành phố", "orgunit.page.country": "Quốc gia", @@ -1576,17 +1483,15 @@ "orgunit.page.description": "Mô tả", "orgunit.page.edit": "Chỉnh sửa tài liệu", "orgunit.page.id": "ID", - "orgunit.page.titleprefix": "Đơn vị\/Tổ chức", - + "orgunit.page.titleprefix": "Đơn vị/Tổ chức", "pagination.next.button": "Tiếp theo", "pagination.next.button.disabled.tooltip": "Không còn trang kết quả khác", "pagination.options.description": "Tùy chọn Phân trang", "pagination.previous.button": "Quay lại", - "pagination.results-per-page": "Số kết quả\/trang", + "pagination.results-per-page": "Số kết quả/trang", "pagination.showing.detail": "{{ range }} của tổng số {{ total }} kết quả", "pagination.showing.label": "Đang hiển thị ", "pagination.sort-direction": "Tùy chọn sắp xếp", - "person.listelement.badge": "Nhà nghiên cứu", "person.listelement.no-title": "Không tìm thấy tên", "person.orcid.registry.auth": "Được phép qua ORCID ", @@ -1598,7 +1503,7 @@ "person.page.firstname": "Tên", "person.page.jobtitle": "Chức vụ", "person.page.abtract": "Tiểu sử", - "person.page.description": "Mô tả", + "person.page.description": "Mô tả", "person.page.lastname": "Họ", "person.page.link.full": "Hiển thị chi tiết", "person.page.name": "Tên", @@ -1619,9 +1524,9 @@ "person.page.orcid.publications-preferences": "Tham số của ấn phẩm", "person.page.orcid.remove-orcid-message": "Nếu bạn cần xóa ORCID của bạn vui lòng liên hệ với quản trị viên.", "person.page.orcid.save.preference.changes": "Cập nhật cài đặt", - "person.page.orcid.scope.activities-update": "Thêm\/cập nhật các hoạt động nghiên cứu của bạn", + "person.page.orcid.scope.activities-update": "Thêm/cập nhật các hoạt động nghiên cứu của bạn", "person.page.orcid.scope.authenticate": "Lấy ID ORCID của bạn", - "person.page.orcid.scope.person-update": "Thêm\/cập nhật thông tin cá nhân của bạn", + "person.page.orcid.scope.person-update": "Thêm/cập nhật thông tin cá nhân của bạn", "person.page.orcid.scope.read-limited": "Thiết lập để cho phép Các bên Tin cậy (Trusted Parties) có khả năng đọc thông tin của bạn ", "person.page.orcid.sync-fundings.all": "Tất cả quỹ", "person.page.orcid.sync-fundings.disabled": "Đã ngừng kích hoạt", @@ -1631,10 +1536,10 @@ "person.page.orcid.synchronization-mode.batch": "Theo lô", "person.page.orcid.synchronization-mode.label": "Chế độ đồng bộ", "person.page.orcid.synchronization-mode.manual": "Thủ công", - "person.page.orcid.synchronization-mode-funding-message": "Chọn gửi\/không gửi các thực thể dự án của bạn đến danh sách các quỹ tài trợ trong bản ghi ORCID của bạn hay không.", + "person.page.orcid.synchronization-mode-funding-message": "Chọn gửi/không gửi các thực thể dự án của bạn đến danh sách các quỹ tài trợ trong bản ghi ORCID của bạn hay không.", "person.page.orcid.synchronization-mode-message": "Vui lòng chọn phương thức đồng bộ hóa với ORCID. Các tùy chọn bao gồm \"Thủ công\" (bạn phải gửi dữ liệu của mình tới ORCID theo cách thủ công) hoặc \"Tự động\" (hệ thống sẽ gửi dữ liệu của bạn tới ORCID thông qua tập lệnh đã lên lịch).", - "person.page.orcid.synchronization-mode-profile-message": "Chọn gửi\/ không gửi thông tin tiểu sử hoặc số định danh cá nhân tới hồ sơ ORCID của bạn.", - "person.page.orcid.synchronization-mode-publication-message": "Chọn gửi\/ không gửi các thực thể Ấn phẩm tới danh sách các tác phẩm trong biểu ghi ORCID của bạn.", + "person.page.orcid.synchronization-mode-profile-message": "Chọn gửi/ không gửi thông tin tiểu sử hoặc số định danh cá nhân tới hồ sơ ORCID của bạn.", + "person.page.orcid.synchronization-mode-publication-message": "Chọn gửi/ không gửi các thực thể Ấn phẩm tới danh sách các tác phẩm trong biểu ghi ORCID của bạn.", "person.page.orcid.synchronization-settings-update.error": "Cập nhật cài đặt đồng bộ hóa không thành công", "person.page.orcid.synchronization-settings-update.success": "Cài đặt đồng bộ hóa đã được cập nhật thành công", "person.page.orcid.sync-profile.affiliation": "Tổ chức", @@ -1663,7 +1568,7 @@ "person.page.orcid.sync-queue.send.error": "Đẩy dữ liệu lên ORCID không thành công", "person.page.orcid.sync-queue.send.not-found-warning": "Tài nguyên không còn tồn tại trên ORCID.", "person.page.orcid.sync-queue.send.success": "Đẩy dữ liệu lên ORCID thành công", - "person.page.orcid.sync-queue.send.unauthorized-error.content": "Nhấp vào đây<\/a> để cấp lại các quyền bắt buộc. Nếu vấn đề vẫn còn tồn tại vui lòng liên hệ quản trị viên.", + "person.page.orcid.sync-queue.send.unauthorized-error.content": "Nhấp vào đây để cấp lại các quyền bắt buộc. Nếu vấn đề vẫn còn tồn tại vui lòng liên hệ quản trị viên.", "person.page.orcid.sync-queue.send.unauthorized-error.title": "Đẩy dữ liệu lên ORCID không thành công do tài khoản của bạn không đủ các quyền cần thiết.", "person.page.orcid.sync-queue.send.validation-error": "Dữ liệu bạn muốn đồng bộ với ORCID là dữ liệu không hợp lệ", "person.page.orcid.sync-queue.send.validation-error.amount-currency.required": "Đơn vị tiền tệ là bắt buộc", @@ -1707,8 +1612,7 @@ "person.page.titleprefix": "Nhà nghiên cứu", "person.search.results.head": "Kết quả tìm kiếm Nhà nghiên cứu", "person.search.title": "Tìm kiếm Nhà nghiên cứu", - "person-relationships.search.results.head": "Kết quả tìm kiếm Tác giả\/Nhà nghiên cứu", - + "person-relationships.search.results.head": "Kết quả tìm kiếm Tác giả/Nhà nghiên cứu", "process.bulk.delete.error.body": "Không thể xóa tiến trình có ID {{ processId}}. Các tiến trình còn lại sẽ tiếp tục bị xóa.", "process.bulk.delete.error.head": "Đã xảy ra lỗi khi xóa tiến trình", "process.detail.actions": "Hành động", @@ -1767,7 +1671,6 @@ "process.overview.table.status": "Trạng thái", "process.overview.table.user": "Người dùng", "process.overview.title": "Tổng quan tiến trình", - "profile.breadcrumbs": "Cập nhật hồ sơ", "profile.card.identify": "Hồ sơ định danh", "profile.card.researcher": "Định danh", @@ -1799,7 +1702,6 @@ "profile.security.form.notifications.success.title": "Đã lưu mật khẩu", "profile.special.groups.head": "Phân quyền cho các nhóm đặc biệt mà bạn thuộc về", "profile.title": "Cập nhật hồ sơ", - "project.listelement.badge": "Dự án nghiên cứu", "project.page.contributor": "Người tham gia", "project.page.description": "Mô tả", @@ -1812,7 +1714,6 @@ "project.page.titleprefix": "Dự án nghiên cứu:", "project.search.results.head": "Kết quả tìm kiếm dự án", "project-relationships.search.results.head": "Kết quả tìm kiếm dự án", - "publication.listelement.badge": "Ấn phẩm", "publication.page.description": "Mô tả", "publication.page.edit": "Chỉnh sửa tài liệu", @@ -1824,11 +1725,9 @@ "publication.search.results.head": "Kết quả tìm kiếm ấn phẩm", "publication.search.title": "Tìm kiếm ấn phẩm", "publication-relationships.search.results.head": "Kết quả tìm kiếm ấn phẩm", - "media-viewer.next": "Tiếp theot", "media-viewer.playlist": "Danh sách phát", "media-viewer.previous": "Quay lại", - "register-email.title": "Đăng ký tài khoản mới", "register-page.create-profile.header": "Tạo hồ sơ", "register-page.create-profile.identification.contact": "Điện thoại liên hệ", @@ -1857,7 +1756,7 @@ "register-page.registration.error.content": "Đã xảy ra lỗi khi đăng ký địa chỉ email sau: {{ email }}", "register-page.registration.error.head": "Lỗi khi đăng ký email", "register-page.registration.error.recaptcha": "Lỗi khi thực hiện xác minh bằng recaptcha", - "register-page.registration.google-recaptcha.must-accept-cookies": "Để đăng ký bạn phải chấp nhận cookie Đăng ký và khôi phục mật khẩu<\/b> (Google reCaptcha).", + "register-page.registration.google-recaptcha.must-accept-cookies": "Để đăng ký bạn phải chấp nhận cookie Đăng ký và khôi phục mật khẩu (Google reCaptcha).", "register-page.registration.google-recaptcha.notification.message.error": "Xác minh đã hết hạn. Vui lòng xác minh lại.", "register-page.registration.google-recaptcha.notification.message.expired": "Đã xảy ra lỗi trong quá trình xác minh reCaptcha", "register-page.registration.google-recaptcha.notification.title": "Google reCaptcha", @@ -1867,7 +1766,6 @@ "register-page.registration.submit": "Đăng ký", "register-page.registration.success.content": "Một email sẽ được gửi đến địa chỉ email {{ email }} chứa liên kết xác nhận và các hướng dẫn khác.", "register-page.registration.success.head": "Gửi email xác nhận", - "relationships.add.error.relationship-type.content": "Không có kết quả nào phù hợp cho kiểu quan hệ {{ type }} giữa hai tài liệu", "relationships.add.error.server.content": "Máy chủ trả về lỗi", "relationships.add.error.title": "Không thể thêm mối quan hệ", @@ -1889,11 +1787,9 @@ "relationships.isSingleJournalOf": "Tạp chí", "relationships.isSingleVolumeOf": "Số tập của tạp chí", "relationships.isVolumeOf": "Số tập của tạp chí", - "repository.image.logo": "Logo lưu trữ", "repository.title.prefix": "Digital Library ::", "repository.title.prefixDSpace": "Digital Library ::", - "resource-policies.add.button": "Thêm", "resource-policies.add.for.bitstream": "Thêm chính sách dữ liệu số mới", "resource-policies.add.for.bundle": "Thêm chính sách gói dữ liệu mới", @@ -1910,9 +1806,9 @@ "resource-policies.delete.success.content": "Hành động thành công", "resource-policies.edit.page.failure.content": "Đã có lỗi xảy ra khi chỉnh sửa chính sách tài nguyên.", "resource-policies.edit.page.heading": "Chỉnh sửa chính sách tài nguyên", - "resource-policies.edit.page.other-failure.content": "Đã xảy ra lỗi khi chỉnh sửa chính sách phân quyền. Người dùng\/ nhóm người dùng đã được cập nhật thành công.", + "resource-policies.edit.page.other-failure.content": "Đã xảy ra lỗi khi chỉnh sửa chính sách phân quyền. Người dùng/ nhóm người dùng đã được cập nhật thành công.", "resource-policies.edit.page.success.content": "Hành động thành công", - "resource-policies.edit.page.target-failure.content": "Đã xảy ra lỗi khi chỉnh sửa người dùng\/ nhóm người dùng trong chính sách phân quyền.", + "resource-policies.edit.page.target-failure.content": "Đã xảy ra lỗi khi chỉnh sửa người dùng/ nhóm người dùng trong chính sách phân quyền.", "resource-policies.edit.page.title": "Chỉnh sửa chính sách phân quyền", "resource-policies.form.action-type.label": "Lựa chọn kiểu hành động", "resource-policies.form.action-type.required": "Bạn cần phải lựa chọn hành động chính sách phân quyền.", @@ -1951,7 +1847,6 @@ "resource-policies.table.headers.title.for.community": "Chính sách đơn vị", "resource-policies.table.headers.title.for.item": "Chính sách tài liệu", "resource-policies.table.headers.title.for.topic": "Chính sách topic", - "search.breadcrumbs": "Tìm kiếm", "search.browse.item-back": "Quay lại kết quả tìm kiếm", "search.filters.applied.f.author": "Tác giả", @@ -2073,7 +1968,6 @@ "search.view-switch.show-detail": "Xem chi tiết", "search.view-switch.show-grid": "Hiển thị dưới dạng lưới", "search.view-switch.show-list": "Hiển thị dưới dạng danh sách", - "sorting.ASC": "Tăng dần", "sorting.dc.date.accessioned.ASC": "Tăng dần theo ngày lưu trữ", "sorting.dc.date.accessioned.DESC": "Giảm dần theo ngày lưu trữ", @@ -2086,7 +1980,6 @@ "sorting.lastModified.DESC": "Giảm dần theo lần chỉnh sửa cuối cùng", "sorting.score.ASC": "Liên quan ít nhất", "sorting.score.DESC": "Liên quan nhiều nhất", - "statistics.breadcrumbs": "Thống kê", "statistics.header": "Thống kê theo {{ scope }}", "statistics.page.no-data": "Không có dữ liệu", @@ -2098,8 +1991,6 @@ "statistics.table.title.TotalVisits": "Tổng số truy cập", "statistics.table.title.TotalVisitsPerMonth": "Tổng số lượt truy cập theo từng tháng", "statistics.title": "Thống kê", - - "submission.edit.breadcrumbs": "Chỉnh sửa đăng ký", "submission.edit.title": "Chỉnh sửa đăng ký", "submission.general.cancel": "Hủy", @@ -2125,14 +2016,14 @@ "submission.import-external.preview.title.Journal": "Xem trước Tạp chí", "submission.import-external.preview.title.none": "Xem trước tài liệu", "submission.import-external.preview.title.OrgUnit": "Xem trước tổ chức", - "submission.import-external.preview.title.Person": "Xem trước Tác giả\/nhà nghiên cứu", + "submission.import-external.preview.title.Person": "Xem trước Tác giả/nhà nghiên cứu", "submission.import-external.preview.title.Project": "Xem trước dự án", "submission.import-external.preview.title.Publication": "Xem trước ấn phẩm", "submission.import-external.search.button": "Tìm kiếm", "submission.import-external.search.button.hint": "Nhập một từ để tìm kiếm", "submission.import-external.search.placeholder": "Tìm kiếm nguồn bên ngoài", "submission.import-external.search.source.hint": "Chọn một nguồn bên ngoài", - "submission.import-external.source.ads": "NASA\/ADS", + "submission.import-external.source.ads": "NASA/ADS", "submission.import-external.source.arxiv": "arXiv", "submission.import-external.source.cinii": "CiNii", "submission.import-external.source.crossref": "CrossRef", @@ -2158,7 +2049,7 @@ "submission.import-external.title.JournalVolume": "Nhập một tập của tạp chí từ nguồn bên ngoài", "submission.import-external.title.none": "Nhập thông tin mô tả từ nguồn bên ngoài", "submission.import-external.title.OrgUnit": "Nhập nhà xuất bản từ nguồn bên ngoài", - "submission.import-external.title.Person": "Nhập một tác giả\/ nhà nghiên cứu từ nguồn bên ngoài", + "submission.import-external.title.Person": "Nhập một tác giả/ nhà nghiên cứu từ nguồn bên ngoài", "submission.import-external.title.Project": "Nhập một dự án từ nguồn bên ngoài", "submission.import-external.title.Publication": "Nhập một ấn phẩm từ nguồn bên ngoài", "submission.sections.accesses.form.access-condition-hint": "Chọn chính sách phân quyền để áp dụng cho biểu ghi khi nó được nhập vào hệ thống.", @@ -2166,7 +2057,7 @@ "submission.sections.accesses.form.date-required": "Thông tin thời gian là bắt buộc.", "submission.sections.accesses.form.date-required-from": "Bắt buộc phải khai báo thời gian để xác định ngày bắt đầu cấp quyền truy cập", "submission.sections.accesses.form.date-required-until": "Bắt buộc phải khai báo thời gian để xác định ngày bắt đầu cấp quyền truy cập", - "submission.sections.accesses.form.discoverable-description": "Khi được chọn biểu ghi này sẽ có thể được tìm thấy trong các chức năng tìm kiếm\/duyệt. Khi bỏ chọn biểu ghi sẽ chỉ có sẵn qua đường dẫn trực tiếp và sẽ không bao giờ xuất hiện trong tìm kiếm\/duyệt.", + "submission.sections.accesses.form.discoverable-description": "Khi được chọn biểu ghi này sẽ có thể được tìm thấy trong các chức năng tìm kiếm/duyệt. Khi bỏ chọn biểu ghi sẽ chỉ có sẵn qua đường dẫn trực tiếp và sẽ không bao giờ xuất hiện trong tìm kiếm/duyệt.", "submission.sections.accesses.form.discoverable-label": "Có thể khám phá", "submission.sections.accesses.form.from-hint": "Chọn ngày mà quyền được áp dụng", "submission.sections.accesses.form.from-label": "Cấp quyền truy cập từ", @@ -2196,8 +2087,8 @@ "submission.sections.describe.relationship-lookup.external-source.import-button-title.none": "Nhập tài liệu từ cơ sở dữ liệu từ xa", "submission.sections.describe.relationship-lookup.external-source.import-button-title.OrgUnit": "Nhập tổ chức từ cơ sở dữ liệu từ xa", "submission.sections.describe.relationship-lookup.external-source.import-button-title.Patent": "Nhập bằng sáng chế từ cơ sở dữ liệu từ xa", - "submission.sections.describe.relationship-lookup.external-source.import-button-title.Person": "Nhập tác giả\/ nhà nghiên cứu từ cơ sở dữ liệu từ xa", - "submission.sections.describe.relationship-lookup.external-source.import-button-title.Product": "Nhập tác giả\/ nhà nghiên cứu từ cơ sở dữ liệu từ xa", + "submission.sections.describe.relationship-lookup.external-source.import-button-title.Person": "Nhập tác giả/ nhà nghiên cứu từ cơ sở dữ liệu từ xa", + "submission.sections.describe.relationship-lookup.external-source.import-button-title.Product": "Nhập tác giả/ nhà nghiên cứu từ cơ sở dữ liệu từ xa", "submission.sections.describe.relationship-lookup.external-source.import-button-title.Project": "Nhập dự án từ cơ sở dữ liệu từ xa", "submission.sections.describe.relationship-lookup.external-source.import-button-title.Publication": "Nhập ấn phẩm từ cơ sở dữ liệu từ xa", "submission.sections.describe.relationship-lookup.external-source.import-modal.authority": "Kiểm soát", @@ -2350,7 +2241,7 @@ "submission.sections.sherpa.publication.information.zetoPub": "Zeto Pub", "submission.sections.sherpa.publisher.policy": "Chính sách của nhà xuất bản", "submission.sections.sherpa.publisher.policy.conditions": "Điều kiện", - "submission.sections.sherpa.publisher.policy.description": "Thông tin dưới đây được tìm thấy thông qua Sherpa Romeo. Dựa trên các chính sách của nhà xuất bản của bạn hệ thống sẽ đưa ra lời khuyên về việc có cần thiết phải hạn chế hay không và\/hoặc những tệp nào mà bạn được phép tải lên. Nếu bạn có thắc mắc vui lòng liên hệ với quản trị viên.", + "submission.sections.sherpa.publisher.policy.description": "Thông tin dưới đây được tìm thấy thông qua Sherpa Romeo. Dựa trên các chính sách của nhà xuất bản của bạn hệ thống sẽ đưa ra lời khuyên về việc có cần thiết phải hạn chế hay không và/hoặc những tệp nào mà bạn được phép tải lên. Nếu bạn có thắc mắc vui lòng liên hệ với quản trị viên.", "submission.sections.sherpa.publisher.policy.embargo": "Hạn chế", "submission.sections.sherpa.publisher.policy.license": "Bản quyền", "submission.sections.sherpa.publisher.policy.location": "Vị trí", @@ -2450,7 +2341,6 @@ "submission.workflow.tasks.pool.show-detail": "Xem chi tiết", "submission.workspace.generic.view": "Xem", "submission.workspace.generic.view-help": "Chọn tủy chọn để xem thông tin mô tả của tài liệu", - "thumbnail.default.alt": "Hình ảnh thu nhỏ", "thumbnail.default.placeholder": "Không có ảnh thu nhỏ nào", "thumbnail.orgunit.alt": "Logo Đơn vị tổ chức", @@ -2459,9 +2349,7 @@ "thumbnail.person.placeholder": "Không có ảnh hồ sơ nào", "thumbnail.project.alt": "Logo dự án", "thumbnail.project.placeholder": "Hình ảnh giữ chỗ của dự án", - "title": "DSpace", - "vocabulary-treeview.header": "Chế độ xem phân cấp", "vocabulary-treeview.info": "Chọn một chủ đề để thêm làm bộ lọc tìm kiếm", "vocabulary-treeview.load-more": "Xem thêm", @@ -2470,20 +2358,15 @@ "vocabulary-treeview.search.no-result": "Không có tài liệu nào hiển thị", "vocabulary-treeview.tree.description.nsi": "Chỉ số Norwegian Science", "vocabulary-treeview.tree.description.srsc": "Danh mục chủ đề", - "uploader.browse": "duyệt", "uploader.delete.btn-title": "Xóa", "uploader.drag-message": "Kéo & thả tệp tại đây", "uploader.processing": "Đang xử lý", "uploader.queue-length": "Chiều dài hàng đợi", - "virtual-metadata.delete-item.info": "Chọn kiểu mà bạn muốn lưu thông tin mô tả ảo làm thông tin mô tả thực", "virtual-metadata.delete-item.modal-head": "Siêu dữ liệu ảo của mối quan hệ này", "virtual-metadata.delete-relationship.modal-head": "Chọn các tài liệu mà bạn muốn lưu thông tin mô tả ảo làm thông tin mô tả thực", - "supervisedWorkspace.search.results.head": "Supervised Items", - - "workflow.search.results.head": "Tất cả nhiệm vụ", "workflowAdmin.search.results.head": "Tiến trình làm việc của quản trị viên", "workflow-item.delete.button.cancel": "Hủy", @@ -2508,12 +2391,10 @@ "workspace.search.results.head": "Biểu ghi bạn đã tải lên", "workspace-item.view.breadcrumbs": "Xem các tài liệu đang biên mục dở dang", "workspace-item.view.title": "Xem các tài liệu đang biên mục dở dang", - "idle-modal.extend-session": "Gia hạn phiên", "idle-modal.header": "Phiên sẽ sớm hết hạn", "idle-modal.info": "Vì lý do bảo mật các phiên của người dùng sẽ hết hạn sau {{timeToExpire}} phút không hoạt động. Phiên của bạn sẽ sớm hết hạn. Bạn muốn gia hạn hay đăng xuất?", "idle-modal.log-out": "Đăng xuất", - "researcher.profile.action.processing": "Đang xử lý…", "researcher.profile.associated": "Hồ sơ nhà nghiên cứu đã được liên kết", "researcher.profile.change-visibility.fail": "Đã xảy ra lỗi khi thay đổi chế độ hiển thị hồ sơ", @@ -2528,7 +2409,6 @@ "researcher.profile.public.visibility": "CÔNG CỘNG", "researcher.profile.status": "Trạng thái:", "researcher.profile.view": "Xem", - "person.page.orcid": "ORCID", "person.page.orcid.create": "Tạo một ID trên ORCID", "person.page.orcid.funding-preferences": "Quỹ ưa thích", @@ -2546,9 +2426,9 @@ "person.page.orcid.publications-preferences": "Tham số của ấn phẩm", "person.page.orcid.remove-orcid-message": "Nếu bạn cần xóa ORCID của bạn vui lòng liên hệ với quản trị viên.", "person.page.orcid.save.preference.changes": "Cập nhật cài đặt", - "person.page.orcid.scope.activities-update": "Thêm\/cập nhật các hoạt động nghiên cứu của bạn", + "person.page.orcid.scope.activities-update": "Thêm/cập nhật các hoạt động nghiên cứu của bạn", "person.page.orcid.scope.authenticate": "Lấy ID ORCID của bạn", - "person.page.orcid.scope.person-update": "Thêm\/cập nhật thông tin cá nhân của bạn", + "person.page.orcid.scope.person-update": "Thêm/cập nhật thông tin cá nhân của bạn", "person.page.orcid.scope.read-limited": "Thiết lập để cho phép Các bên Tin cậy (Trusted Parties) có khả năng đọc thông tin của bạn ", "person.page.orcid.sync-fundings.all": "Tất cả quỹ", "person.page.orcid.sync-fundings.disabled": "Đã ngừng kích hoạt", @@ -2558,10 +2438,10 @@ "person.page.orcid.synchronization-mode.batch": "Theo lô", "person.page.orcid.synchronization-mode.label": "Chế độ đồng bộ", "person.page.orcid.synchronization-mode.manual": "Thủ công", - "person.page.orcid.synchronization-mode-funding-message": "Chọn gửi\/không gửi các thực thể dự án của bạn đến danh sách các quỹ tài trợ trong bản ghi ORCID của bạn hay không.", + "person.page.orcid.synchronization-mode-funding-message": "Chọn gửi/không gửi các thực thể dự án của bạn đến danh sách các quỹ tài trợ trong bản ghi ORCID của bạn hay không.", "person.page.orcid.synchronization-mode-message": "Vui lòng chọn phương thức đồng bộ hóa với ORCID. Các tùy chọn bao gồm \"Thủ công\" (bạn phải gửi dữ liệu của mình tới ORCID theo cách thủ công) hoặc \"Tự động\" (hệ thống sẽ gửi dữ liệu của bạn tới ORCID thông qua tập lệnh đã lên lịch).", - "person.page.orcid.synchronization-mode-profile-message": "Chọn gửi\/ không gửi thông tin tiểu sử hoặc số định danh cá nhân tới hồ sơ ORCID của bạn.", - "person.page.orcid.synchronization-mode-publication-message": "Chọn gửi\/ không gửi các thực thể Ấn phẩm tới danh sách các tác phẩm trong biểu ghi ORCID của bạn.", + "person.page.orcid.synchronization-mode-profile-message": "Chọn gửi/ không gửi thông tin tiểu sử hoặc số định danh cá nhân tới hồ sơ ORCID của bạn.", + "person.page.orcid.synchronization-mode-publication-message": "Chọn gửi/ không gửi các thực thể Ấn phẩm tới danh sách các tác phẩm trong biểu ghi ORCID của bạn.", "person.page.orcid.synchronization-settings-update.error": "Cập nhật cài đặt đồng bộ hóa không thành công", "person.page.orcid.synchronization-settings-update.success": "Cài đặt đồng bộ hóa đã được cập nhật thành công", "person.page.orcid.sync-profile.affiliation": "Tổ chức", @@ -2590,7 +2470,7 @@ "person.page.orcid.sync-queue.send.error": "Đẩy dữ liệu lên ORCID không thành công", "person.page.orcid.sync-queue.send.not-found-warning": "Tài nguyên không còn tồn tại trên ORCID.", "person.page.orcid.sync-queue.send.success": "Đẩy dữ liệu lên ORCID thành công", - "person.page.orcid.sync-queue.send.unauthorized-error.content": "Nhấp vào đây<\/a> để cấp lại các quyền bắt buộc. Nếu vấn đề vẫn còn tồn tại vui lòng liên hệ quản trị viên.", + "person.page.orcid.sync-queue.send.unauthorized-error.content": "Nhấp vào đây để cấp lại các quyền bắt buộc. Nếu vấn đề vẫn còn tồn tại vui lòng liên hệ quản trị viên.", "person.page.orcid.sync-queue.send.unauthorized-error.title": "Đẩy dữ liệu lên ORCID không thành công do tài khoản của bạn không đủ các quyền cần thiết.", "person.page.orcid.sync-queue.send.validation-error": "Dữ liệu bạn muốn đồng bộ với ORCID là dữ liệu không hợp lệ", "person.page.orcid.sync-queue.send.validation-error.amount-currency.required": "Đơn vị tiền tệ là bắt buộc", @@ -2630,23 +2510,17 @@ "person.page.orcid.unlink.error": "Đã xảy ra lỗi khi ngắt kết nối giữa hồ sơ và ORCID. Vui lòng thử lại.", "person.page.orcid.unlink.processing": "Đang xử lý…", "person.page.orcid.unlink.success": "Đã ngắt kết nối giữa hồ sơ nhà nghiên cứu và trang ORCID thành công", - "person.orcid.registry.auth": "Được phép qua ORCID ", "person.orcid.registry.queue": "Đang xếp hàng đợi đăng ký ORCID", "person.orcid.sync.setting": "Thiết lập đồng bộ hóa với ORCID", - "home.recent-submissions.head": "Các tài liệu tải lên gần đây", - "listable-notification-object.default-message": "Không thể truy xuất", - "system-wide-alert-banner.retrieval.error": "Đã xảy ra lỗi trong quá trình truy xuất cảnh báo hệ thống", "system-wide-alert-banner.countdown.prefix": "Trong", "system-wide-alert-banner.countdown.days": "{{days}} ngày", "system-wide-alert-banner.countdown.hours": "{{hours}} giờ và", "system-wide-alert-banner.countdown.minutes": "{{minutes}} phút:", - "menu.section.system-wide-alert": "Cảnh báo toàn hệ thống", - "system-wide-alert.form.header": "Cảnh báo toàn hệ thống", "system-wide-alert-form.retrieval.error": "Đã xảy ra lỗi trong quá trình truy xuất cảnh báo trên toàn hệ thống", "system-wide-alert.form.cancel": "Hủy", From 0dbbe6cb79790bfdb92e468c0984f924cc3e3036 Mon Sep 17 00:00:00 2001 From: tuanvu Date: Wed, 26 Apr 2023 16:29:12 +0700 Subject: [PATCH 117/409] Update error --- src/assets/i18n/vi.json5 | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/assets/i18n/vi.json5 b/src/assets/i18n/vi.json5 index 169f19f41a..88c537bca8 100644 --- a/src/assets/i18n/vi.json5 +++ b/src/assets/i18n/vi.json5 @@ -310,7 +310,7 @@ "advanced-workflow-action-select-reviewer.groups.form.reviewers-list.notification.failure.noActiveGroup": "Không có nhóm hoạt động, gửi tên trước.", "advanced-workflow-action-select-reviewer.groups.form.reviewers-list.no-members-yet": "Chưa có thành viên nào trong nhóm, tìm kiếm để thêm.", "advanced-workflow-action-select-reviewer.groups.form.reviewers-list.no-items": "Không tìm thấy người dùng", - "advanced-workflow-action.select-reviewer.no-reviewer-selected.error": "Không có người kiểm duyệt nào được chọn.", + "advanced-workflow-action.select-reviewer.no-reviewer-selected.error": "Không có người kiểm duyệt nào được chọn.", "auth.errors.invalid-user": "Địa chỉ email hoặc mật khẩu không hợp lệ.", "auth.messages.expired": "Phiên của bạn đã hết hạn. Xin vui lòng đăng nhập lại.", "auth.messages.token-refresh-failed": "Làm mới mã token phiên làm việc của bạn không thành công. Vui lòng đăng nhập lại.", @@ -733,7 +733,7 @@ "supervision-group-selector.select.group.error": "Please select a group", "supervision-group-selector.notification.create.success.title": "Successfully created supervision order for group {{ name }}", "supervision-group-selector.notification.create.failure.title": "Error", - "supervision-group-selector.notification.create.already-existing" : "A supervision order already exists on this item for selected group", + "supervision-group-selector.notification.create.already-existing": "A supervision order already exists on this item for selected group", "confirmation-modal.delete-eperson.cancel": "Hủy", "confirmation-modal.delete-eperson.confirm": "Xóa", "confirmation-modal.delete-eperson.header": "Xóa người dùng \"{{ dsoName }}\"", @@ -764,7 +764,7 @@ "error.community": "Lỗi tìm kiếm đơn vị", "error.default": "Lỗi", "error.identifier": "Không tìm thấy tài liệu nào cho định danh này", - "error.invalid-search-query": "Truy vấn tìm kiếm không hợp lệ. Vui lòng kiểm tra Cú pháp truy vấn Solr các phương pháp tốt nhất để biết thêm thông tin về lỗi này.", + "error.invalid-search-query": "Truy vấn tìm kiếm không hợp lệ. Vui lòng kiểm tra Cú pháp truy vấn Solr các phương pháp tốt nhất để biết thêm thông tin về lỗi này.", "error.item": "Lỗi tìm kiếm tài liệu", "error.items": "Lỗi tìm kiếm tài liệu", "error.objects": "Lỗi tìm kiếm đối tượng", From 94f52721d45159fa9037111ad8063815dc77a0d5 Mon Sep 17 00:00:00 2001 From: lotte Date: Wed, 26 Apr 2023 11:29:17 +0200 Subject: [PATCH 118/409] 101289: #1578 Removed border from primaryBitstream switch --- .../edit-bitstream-page/edit-bitstream-page.component.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/bitstream-page/edit-bitstream-page/edit-bitstream-page.component.ts b/src/app/bitstream-page/edit-bitstream-page/edit-bitstream-page.component.ts index 5110a5e936..df8f285a6a 100644 --- a/src/app/bitstream-page/edit-bitstream-page/edit-bitstream-page.component.ts +++ b/src/app/bitstream-page/edit-bitstream-page/edit-bitstream-page.component.ts @@ -291,7 +291,7 @@ export class EditBitstreamPageComponent implements OnInit, OnDestroy { }, primaryBitstream: { grid: { - host: 'col col-sm-4 d-inline-block switch' + host: 'col col-sm-4 d-inline-block switch border-0' } }, description: { From b83c218bf116898c83baa21a85c98db0cb94d3eb Mon Sep 17 00:00:00 2001 From: tuanvu Date: Wed, 26 Apr 2023 16:35:44 +0700 Subject: [PATCH 119/409] Update --- src/assets/i18n/vi.json5 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/assets/i18n/vi.json5 b/src/assets/i18n/vi.json5 index 88c537bca8..7627818978 100644 --- a/src/assets/i18n/vi.json5 +++ b/src/assets/i18n/vi.json5 @@ -1268,7 +1268,7 @@ "itemtemplate.edit.metadata.notifications.saved.title": "Metadata saved", "itemtemplate.edit.metadata.reinstate-button": "Undo", "itemtemplate.edit.metadata.reset-order-button": "Undo reorder", - "itemtemplate.edit.metadata.save-button": "Save", + "itemtemplate.edit.metadata.save-button": "Save", "journal.listelement.badge": "Tạp chí", "journal.page.description": "Mô tả", "journal.page.edit": "Chỉnh sửa tài liệu này", @@ -1473,7 +1473,7 @@ "nav.stop-impersonating": "Ngừng giả danh Người dùng", "nav.toggle": "Điều hướng chuyển", "nav.user.description": "Thanh hồ sơ người dùng", - "nav.user-profile-menu-and-logout": "Trình đơn Hồ sơ cá nhân và Đăng xuất", + "nav.user-profile-menu-and-logout": "Trình đơn Hồ sơ cá nhân và Đăng xuất", "none.listelement.badge": "Tài liệu", "orgunit.listelement.badge": "Đơn vị/Tổ chức", "orgunit.listelement.no-title": "Không có nhan đề", From a80cae8fb5d5d76edcc8136999ca4f2e755df87b Mon Sep 17 00:00:00 2001 From: Nona Luypaert Date: Wed, 26 Apr 2023 12:14:09 +0200 Subject: [PATCH 120/409] 101353: Add browse link + queryparams in BrowseByTaxonomyPage --- .../browse-by-taxonomy-page.component.html | 6 +++++- .../browse-by-taxonomy-page.component.ts | 21 +++++++++++++++++++ src/assets/i18n/en.json5 | 2 ++ 3 files changed, 28 insertions(+), 1 deletion(-) diff --git a/src/app/browse-by/browse-by-taxonomy-page/browse-by-taxonomy-page.component.html b/src/app/browse-by/browse-by-taxonomy-page/browse-by-taxonomy-page.component.html index 39fcf1ab30..4b6f3586fe 100644 --- a/src/app/browse-by/browse-by-taxonomy-page/browse-by-taxonomy-page.component.html +++ b/src/app/browse-by/browse-by-taxonomy-page/browse-by-taxonomy-page.component.html @@ -1,5 +1,9 @@
+
+ [multiSelect]="true" + (select)="onSelect($event)"> +
+ {{ 'browse.taxonomy.button' | translate }}
diff --git a/src/app/browse-by/browse-by-taxonomy-page/browse-by-taxonomy-page.component.ts b/src/app/browse-by/browse-by-taxonomy-page/browse-by-taxonomy-page.component.ts index b697c74052..459442aabc 100644 --- a/src/app/browse-by/browse-by-taxonomy-page/browse-by-taxonomy-page.component.ts +++ b/src/app/browse-by/browse-by-taxonomy-page/browse-by-taxonomy-page.component.ts @@ -1,5 +1,6 @@ import { Component, OnInit } from '@angular/core'; import { VocabularyOptions } from '../../core/submission/vocabularies/models/vocabulary-options.model'; +import { VocabularyEntryDetail } from '../../core/submission/vocabularies/models/vocabulary-entry-detail.model'; @Component({ selector: 'ds-browse-by-taxonomy-page', @@ -11,9 +12,29 @@ import { VocabularyOptions } from '../../core/submission/vocabularies/models/voc */ export class BrowseByTaxonomyPageComponent implements OnInit { + /** + * The {@link VocabularyOptions} object + */ vocabularyOptions: VocabularyOptions; + /** + * The selected vocabulary entries + */ + selectedItems: VocabularyEntryDetail[] = []; + + /** + * The query parameters, contain the selected entries + */ + queryParams: { 'f.subject': string[] }; + ngOnInit() { this.vocabularyOptions = { name: 'srsc', closed: true }; } + + onSelect(detail: VocabularyEntryDetail): void { + this.selectedItems.push(detail); + const filterValues = this.selectedItems + .map((item: VocabularyEntryDetail) => `${item.value},equals`); + this.queryParams = { 'f.subject': filterValues }; + } } diff --git a/src/assets/i18n/en.json5 b/src/assets/i18n/en.json5 index 584cb6d53f..5a0f5ce5d0 100644 --- a/src/assets/i18n/en.json5 +++ b/src/assets/i18n/en.json5 @@ -775,6 +775,8 @@ "browse.startsWith.type_text": "Filter results by typing the first few letters", + "browse.taxonomy.button": "Browse", + "browse.title": "Browsing {{ collection }} by {{ field }}{{ startsWith }} {{ value }}", "browse.title.page": "Browsing {{ collection }} by {{ field }} {{ value }}", From 496853671edbd01e4b181cb70f10526911f9544a Mon Sep 17 00:00:00 2001 From: Enea Jahollari Date: Wed, 26 Apr 2023 12:35:50 +0200 Subject: [PATCH 121/409] [CST-9636] Added access control components in community, item and collection edit page --- .../collection-access-control.component.html | 3 ++ .../collection-access-control.component.scss | 0 ...ollection-access-control.component.spec.ts | 25 +++++++++++++ .../collection-access-control.component.ts | 37 +++++++++++++++++++ .../edit-collection-page.module.ts | 3 +- .../edit-collection-page.routing.module.ts | 6 +++ .../community-access-control.component.html | 1 + .../community-access-control.component.scss | 0 ...community-access-control.component.spec.ts | 25 +++++++++++++ .../community-access-control.component.ts | 15 ++++++++ .../edit-community-page.module.ts | 4 +- .../edit-community-page.routing.module.ts | 6 +++ .../edit-item-page/edit-item-page.module.ts | 4 +- .../edit-item-page.routing.module.ts | 6 +++ .../item-access-control.component.html | 1 + .../item-access-control.component.scss | 0 .../item-access-control.component.spec.ts | 25 +++++++++++++ .../item-access-control.component.ts | 15 ++++++++ src/assets/i18n/en.json5 | 12 ++++++ 19 files changed, 185 insertions(+), 3 deletions(-) create mode 100644 src/app/collection-page/edit-collection-page/collection-access-control/collection-access-control.component.html create mode 100644 src/app/collection-page/edit-collection-page/collection-access-control/collection-access-control.component.scss create mode 100644 src/app/collection-page/edit-collection-page/collection-access-control/collection-access-control.component.spec.ts create mode 100644 src/app/collection-page/edit-collection-page/collection-access-control/collection-access-control.component.ts create mode 100644 src/app/community-page/edit-community-page/community-access-control/community-access-control.component.html create mode 100644 src/app/community-page/edit-community-page/community-access-control/community-access-control.component.scss create mode 100644 src/app/community-page/edit-community-page/community-access-control/community-access-control.component.spec.ts create mode 100644 src/app/community-page/edit-community-page/community-access-control/community-access-control.component.ts create mode 100644 src/app/item-page/edit-item-page/item-access-control/item-access-control.component.html create mode 100644 src/app/item-page/edit-item-page/item-access-control/item-access-control.component.scss create mode 100644 src/app/item-page/edit-item-page/item-access-control/item-access-control.component.spec.ts create mode 100644 src/app/item-page/edit-item-page/item-access-control/item-access-control.component.ts diff --git a/src/app/collection-page/edit-collection-page/collection-access-control/collection-access-control.component.html b/src/app/collection-page/edit-collection-page/collection-access-control/collection-access-control.component.html new file mode 100644 index 0000000000..0719a18d94 --- /dev/null +++ b/src/app/collection-page/edit-collection-page/collection-access-control/collection-access-control.component.html @@ -0,0 +1,3 @@ +
+ Access control page!!! +
diff --git a/src/app/collection-page/edit-collection-page/collection-access-control/collection-access-control.component.scss b/src/app/collection-page/edit-collection-page/collection-access-control/collection-access-control.component.scss new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/app/collection-page/edit-collection-page/collection-access-control/collection-access-control.component.spec.ts b/src/app/collection-page/edit-collection-page/collection-access-control/collection-access-control.component.spec.ts new file mode 100644 index 0000000000..5ae7480d66 --- /dev/null +++ b/src/app/collection-page/edit-collection-page/collection-access-control/collection-access-control.component.spec.ts @@ -0,0 +1,25 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { CollectionAccessControlComponent } from './collection-access-control.component'; + +describe('CollectionAccessControlComponent', () => { + let component: CollectionAccessControlComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [ CollectionAccessControlComponent ] + }) + .compileComponents(); + }); + + beforeEach(() => { + fixture = TestBed.createComponent(CollectionAccessControlComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/collection-page/edit-collection-page/collection-access-control/collection-access-control.component.ts b/src/app/collection-page/edit-collection-page/collection-access-control/collection-access-control.component.ts new file mode 100644 index 0000000000..8675e3a83f --- /dev/null +++ b/src/app/collection-page/edit-collection-page/collection-access-control/collection-access-control.component.ts @@ -0,0 +1,37 @@ +import { Component, OnInit } from '@angular/core'; +import { Observable } from 'rxjs'; +import { RemoteData } from '../../../core/data/remote-data'; +import { ActivatedRoute } from '@angular/router'; +import { first, map } from 'rxjs/operators'; +import { DSpaceObject } from '../../../core/shared/dspace-object.model'; + +@Component({ + selector: 'ds-collection-access-control', + templateUrl: './collection-access-control.component.html', + styleUrls: ['./collection-access-control.component.scss'] +}) +export class CollectionAccessControlComponent implements OnInit { + + /** + * The initial DSO object + */ + public dsoRD$: Observable>; + + /** + * Initialize instance variables + * + * @param {ActivatedRoute} route + */ + constructor( + private route: ActivatedRoute + ) { + } + + /** + * Initialize the component, setting up the collection + */ + ngOnInit(): void { + this.dsoRD$ = this.route.parent.parent.data.pipe(first(), map((data) => data.dso)); + } + +} diff --git a/src/app/collection-page/edit-collection-page/edit-collection-page.module.ts b/src/app/collection-page/edit-collection-page/edit-collection-page.module.ts index 18f7feb699..3817122368 100644 --- a/src/app/collection-page/edit-collection-page/edit-collection-page.module.ts +++ b/src/app/collection-page/edit-collection-page/edit-collection-page.module.ts @@ -13,6 +13,7 @@ import { CollectionSourceControlsComponent } from './collection-source/collectio import { ResourcePoliciesModule } from '../../shared/resource-policies/resource-policies.module'; import { FormModule } from '../../shared/form/form.module'; import { ComcolModule } from '../../shared/comcol/comcol.module'; +import { CollectionAccessControlComponent } from './collection-access-control/collection-access-control.component'; /** * Module that contains all components related to the Edit Collection page administrator functionality @@ -33,7 +34,7 @@ import { ComcolModule } from '../../shared/comcol/comcol.module'; CollectionRolesComponent, CollectionCurateComponent, CollectionSourceComponent, - + CollectionAccessControlComponent, CollectionSourceControlsComponent, CollectionAuthorizationsComponent ] diff --git a/src/app/collection-page/edit-collection-page/edit-collection-page.routing.module.ts b/src/app/collection-page/edit-collection-page/edit-collection-page.routing.module.ts index 92fc6efeff..c4481985c0 100644 --- a/src/app/collection-page/edit-collection-page/edit-collection-page.routing.module.ts +++ b/src/app/collection-page/edit-collection-page/edit-collection-page.routing.module.ts @@ -13,6 +13,7 @@ import { ResourcePolicyCreateComponent } from '../../shared/resource-policies/cr import { ResourcePolicyResolver } from '../../shared/resource-policies/resolvers/resource-policy.resolver'; import { ResourcePolicyEditComponent } from '../../shared/resource-policies/edit/resource-policy-edit.component'; import { CollectionAdministratorGuard } from '../../core/data/feature-authorization/feature-authorization-guard/collection-administrator.guard'; +import { CollectionAccessControlComponent } from './collection-access-control/collection-access-control.component'; /** * Routing module that handles the routing for the Edit Collection page administrator functionality @@ -58,6 +59,11 @@ import { CollectionAdministratorGuard } from '../../core/data/feature-authorizat component: CollectionCurateComponent, data: { title: 'collection.edit.tabs.curate.title', showBreadcrumbs: true } }, + { + path: 'access-control', + component: CollectionAccessControlComponent, + data: { title: 'collection.edit.tabs.access-control.title', showBreadcrumbs: true } + }, /* { path: 'authorizations', component: CollectionAuthorizationsComponent, diff --git a/src/app/community-page/edit-community-page/community-access-control/community-access-control.component.html b/src/app/community-page/edit-community-page/community-access-control/community-access-control.component.html new file mode 100644 index 0000000000..cec7f44321 --- /dev/null +++ b/src/app/community-page/edit-community-page/community-access-control/community-access-control.component.html @@ -0,0 +1 @@ +

community-access-control works!

diff --git a/src/app/community-page/edit-community-page/community-access-control/community-access-control.component.scss b/src/app/community-page/edit-community-page/community-access-control/community-access-control.component.scss new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/app/community-page/edit-community-page/community-access-control/community-access-control.component.spec.ts b/src/app/community-page/edit-community-page/community-access-control/community-access-control.component.spec.ts new file mode 100644 index 0000000000..7ec727bbb5 --- /dev/null +++ b/src/app/community-page/edit-community-page/community-access-control/community-access-control.component.spec.ts @@ -0,0 +1,25 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { CommunityAccessControlComponent } from './community-access-control.component'; + +describe('CommunityAccessControlComponent', () => { + let component: CommunityAccessControlComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [ CommunityAccessControlComponent ] + }) + .compileComponents(); + }); + + beforeEach(() => { + fixture = TestBed.createComponent(CommunityAccessControlComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/community-page/edit-community-page/community-access-control/community-access-control.component.ts b/src/app/community-page/edit-community-page/community-access-control/community-access-control.component.ts new file mode 100644 index 0000000000..543d63564e --- /dev/null +++ b/src/app/community-page/edit-community-page/community-access-control/community-access-control.component.ts @@ -0,0 +1,15 @@ +import { Component, OnInit } from '@angular/core'; + +@Component({ + selector: 'ds-community-access-control', + templateUrl: './community-access-control.component.html', + styleUrls: ['./community-access-control.component.scss'] +}) +export class CommunityAccessControlComponent implements OnInit { + + constructor() { } + + ngOnInit(): void { + } + +} diff --git a/src/app/community-page/edit-community-page/edit-community-page.module.ts b/src/app/community-page/edit-community-page/edit-community-page.module.ts index 0479ea6bc6..a9f020a9e6 100644 --- a/src/app/community-page/edit-community-page/edit-community-page.module.ts +++ b/src/app/community-page/edit-community-page/edit-community-page.module.ts @@ -10,6 +10,7 @@ import { CommunityAuthorizationsComponent } from './community-authorizations/com import { CommunityFormModule } from '../community-form/community-form.module'; import { ResourcePoliciesModule } from '../../shared/resource-policies/resource-policies.module'; import { ComcolModule } from '../../shared/comcol/comcol.module'; +import { CommunityAccessControlComponent } from './community-access-control/community-access-control.component'; /** * Module that contains all components related to the Edit Community page administrator functionality @@ -28,7 +29,8 @@ import { ComcolModule } from '../../shared/comcol/comcol.module'; CommunityCurateComponent, CommunityMetadataComponent, CommunityRolesComponent, - CommunityAuthorizationsComponent + CommunityAuthorizationsComponent, + CommunityAccessControlComponent ] }) export class EditCommunityPageModule { diff --git a/src/app/community-page/edit-community-page/edit-community-page.routing.module.ts b/src/app/community-page/edit-community-page/edit-community-page.routing.module.ts index faebb1ef2e..994c6b5e96 100644 --- a/src/app/community-page/edit-community-page/edit-community-page.routing.module.ts +++ b/src/app/community-page/edit-community-page/edit-community-page.routing.module.ts @@ -11,6 +11,7 @@ import { ResourcePolicyCreateComponent } from '../../shared/resource-policies/cr import { ResourcePolicyResolver } from '../../shared/resource-policies/resolvers/resource-policy.resolver'; import { ResourcePolicyEditComponent } from '../../shared/resource-policies/edit/resource-policy-edit.component'; import { CommunityAdministratorGuard } from '../../core/data/feature-authorization/feature-authorization-guard/community-administrator.guard'; +import { CommunityAccessControlComponent } from './community-access-control/community-access-control.component'; /** * Routing module that handles the routing for the Edit Community page administrator functionality @@ -51,6 +52,11 @@ import { CommunityAdministratorGuard } from '../../core/data/feature-authorizati component: CommunityCurateComponent, data: { title: 'community.edit.tabs.curate.title', showBreadcrumbs: true } }, + { + path: 'access-control', + component: CommunityAccessControlComponent, + data: { title: 'collection.edit.tabs.access-control.title', showBreadcrumbs: true } + }, /*{ path: 'authorizations', component: CommunityAuthorizationsComponent, diff --git a/src/app/item-page/edit-item-page/edit-item-page.module.ts b/src/app/item-page/edit-item-page/edit-item-page.module.ts index 24d27b3340..d922cee0a5 100644 --- a/src/app/item-page/edit-item-page/edit-item-page.module.ts +++ b/src/app/item-page/edit-item-page/edit-item-page.module.ts @@ -38,6 +38,7 @@ import { IdentifierDataService } from '../../core/data/identifier-data.service'; import { IdentifierDataComponent } from '../../shared/object-list/identifier-data/identifier-data.component'; import { ItemRegisterDoiComponent } from './item-register-doi/item-register-doi.component'; import { DsoSharedModule } from '../../dso-shared/dso-shared.module'; +import { ItemAccessControlComponent } from './item-access-control/item-access-control.component'; /** @@ -81,7 +82,8 @@ import { DsoSharedModule } from '../../dso-shared/dso-shared.module'; VirtualMetadataComponent, ItemAuthorizationsComponent, IdentifierDataComponent, - ItemRegisterDoiComponent + ItemRegisterDoiComponent, + ItemAccessControlComponent ], providers: [ BundleDataService, diff --git a/src/app/item-page/edit-item-page/edit-item-page.routing.module.ts b/src/app/item-page/edit-item-page/edit-item-page.routing.module.ts index 88172e2620..ce1d258b6b 100644 --- a/src/app/item-page/edit-item-page/edit-item-page.routing.module.ts +++ b/src/app/item-page/edit-item-page/edit-item-page.routing.module.ts @@ -41,6 +41,7 @@ import { ItemPageVersionHistoryGuard } from './item-page-version-history.guard'; import { ItemPageCollectionMapperGuard } from './item-page-collection-mapper.guard'; import { ThemedDsoEditMetadataComponent } from '../../dso-shared/dso-edit-metadata/themed-dso-edit-metadata.component'; import { ItemPageRegisterDoiGuard } from './item-page-register-doi.guard'; +import { ItemAccessControlComponent } from './item-access-control/item-access-control.component'; /** * Routing module that handles the routing for the Edit Item page administrator functionality @@ -106,6 +107,11 @@ import { ItemPageRegisterDoiGuard } from './item-page-register-doi.guard'; data: { title: 'item.edit.tabs.versionhistory.title', showBreadcrumbs: true }, canActivate: [ItemPageVersionHistoryGuard] }, + { + path: 'access-control', + component: ItemAccessControlComponent, + data: { title: 'item.edit.tabs.access-control.title', showBreadcrumbs: true } + }, { path: 'mapper', component: ItemCollectionMapperComponent, diff --git a/src/app/item-page/edit-item-page/item-access-control/item-access-control.component.html b/src/app/item-page/edit-item-page/item-access-control/item-access-control.component.html new file mode 100644 index 0000000000..416b785722 --- /dev/null +++ b/src/app/item-page/edit-item-page/item-access-control/item-access-control.component.html @@ -0,0 +1 @@ +

item-access-control works!

diff --git a/src/app/item-page/edit-item-page/item-access-control/item-access-control.component.scss b/src/app/item-page/edit-item-page/item-access-control/item-access-control.component.scss new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/app/item-page/edit-item-page/item-access-control/item-access-control.component.spec.ts b/src/app/item-page/edit-item-page/item-access-control/item-access-control.component.spec.ts new file mode 100644 index 0000000000..297ffa3822 --- /dev/null +++ b/src/app/item-page/edit-item-page/item-access-control/item-access-control.component.spec.ts @@ -0,0 +1,25 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { ItemAccessControlComponent } from './item-access-control.component'; + +describe('ItemAccessControlComponent', () => { + let component: ItemAccessControlComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [ ItemAccessControlComponent ] + }) + .compileComponents(); + }); + + beforeEach(() => { + fixture = TestBed.createComponent(ItemAccessControlComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/item-page/edit-item-page/item-access-control/item-access-control.component.ts b/src/app/item-page/edit-item-page/item-access-control/item-access-control.component.ts new file mode 100644 index 0000000000..5b42e5bf4e --- /dev/null +++ b/src/app/item-page/edit-item-page/item-access-control/item-access-control.component.ts @@ -0,0 +1,15 @@ +import { Component, OnInit } from '@angular/core'; + +@Component({ + selector: 'ds-item-access-control', + templateUrl: './item-access-control.component.html', + styleUrls: ['./item-access-control.component.scss'] +}) +export class ItemAccessControlComponent implements OnInit { + + constructor() { } + + ngOnInit(): void { + } + +} diff --git a/src/assets/i18n/en.json5 b/src/assets/i18n/en.json5 index 66824e56b3..2c7ae5459f 100644 --- a/src/assets/i18n/en.json5 +++ b/src/assets/i18n/en.json5 @@ -965,6 +965,10 @@ "collection.edit.return": "Back", + "collection.edit.tabs.access-control.head": "Access Control", + + "collection.edit.tabs.access-control.title": "Collection Edit - Access Control", + "collection.edit.tabs.curate.head": "Curate", @@ -1201,6 +1205,10 @@ "community.edit.tabs.curate.title": "Community Edit - Curate", + "community.edit.tabs.access-control.head": "Access Control", + + "community.edit.tabs.access-control.title": "Community Edit - Access Control", + "community.edit.tabs.metadata.head": "Edit Metadata", "community.edit.tabs.metadata.title": "Community Edit - Metadata", @@ -2292,6 +2300,10 @@ "item.edit.tabs.curate.title": "Item Edit - Curate", + "item.edit.tabs.access-control.head": "Access Control", + + "item.edit.tabs.access-control.title": "Item Edit - Access Control", + "item.edit.tabs.metadata.head": "Metadata", "item.edit.tabs.metadata.title": "Item Edit - Metadata", From 3ee09834b1d070c11630d1221ccbbb746982c801 Mon Sep 17 00:00:00 2001 From: lotte Date: Wed, 26 Apr 2023 13:47:39 +0200 Subject: [PATCH 122/409] 101289: #1578 Changed primarybitstream field to primaryBitstreamUUID --- .../edit-bitstream-page/edit-bitstream-page.component.ts | 2 +- src/app/core/shared/bundle.model.ts | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/app/bitstream-page/edit-bitstream-page/edit-bitstream-page.component.ts b/src/app/bitstream-page/edit-bitstream-page/edit-bitstream-page.component.ts index df8f285a6a..d84b8ae4e6 100644 --- a/src/app/bitstream-page/edit-bitstream-page/edit-bitstream-page.component.ts +++ b/src/app/bitstream-page/edit-bitstream-page/edit-bitstream-page.component.ts @@ -371,7 +371,7 @@ export class EditBitstreamPageComponent implements OnInit, OnDestroy { * Path to patch primary bitstream on the bundle * @private */ - private readonly primaryBitstreamPath = '/primarybitstream'; + private readonly primaryBitstreamPath = '/primaryBitstreamUUID'; constructor(private route: ActivatedRoute, private router: Router, diff --git a/src/app/core/shared/bundle.model.ts b/src/app/core/shared/bundle.model.ts index 72c466d2d6..bcaa582703 100644 --- a/src/app/core/shared/bundle.model.ts +++ b/src/app/core/shared/bundle.model.ts @@ -1,4 +1,4 @@ -import { autoserializeAs, deserialize, inheritSerialization } from 'cerialize'; +import { autoserialize, deserialize, inheritSerialization } from 'cerialize'; import { Observable } from 'rxjs'; @@ -30,9 +30,9 @@ export class Bundle extends DSpaceObject { }; /** - * The ID of the primaryBitstream of this Bundle + * The UUID of the primaryBitstream of this Bundle */ - @autoserializeAs('primarybitstream') + @autoserialize primaryBitstreamUUID: string; /** From c89adf4f8118a982818e7eb42e27f6b15a9c410a Mon Sep 17 00:00:00 2001 From: Alisa Ismailati Date: Wed, 26 Apr 2023 15:33:02 +0200 Subject: [PATCH 123/409] [DURACOM-134] send-back action fixed --- .../workflow-item-action-page.component.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/app/workflowitems-edit-page/workflow-item-action-page.component.ts b/src/app/workflowitems-edit-page/workflow-item-action-page.component.ts index b8998a6dd7..2ed5639c5a 100644 --- a/src/app/workflowitems-edit-page/workflow-item-action-page.component.ts +++ b/src/app/workflowitems-edit-page/workflow-item-action-page.component.ts @@ -1,6 +1,6 @@ import { Component, OnInit } from '@angular/core'; import { Location } from '@angular/common'; -import { Observable, forkJoin } from 'rxjs'; +import { Observable, combineLatest } from 'rxjs'; import { map, switchMap, take } from 'rxjs/operators'; import { TranslateService } from '@ngx-translate/core'; import { WorkflowItem } from '../core/submission/models/workflowitem.model'; @@ -52,7 +52,7 @@ export abstract class WorkflowItemActionPageComponent implements OnInit { * Performs the action and shows a notification based on the outcome of the action */ performAction() { - forkJoin([this.wfi$, this.requestService.removeByHrefSubstring('/discover')]).pipe( + combineLatest([this.wfi$, this.requestService.removeByHrefSubstring('/discover')]).pipe( take(1), switchMap(([wfi]) => this.sendRequest(wfi.id)) ).subscribe((successful: boolean) => { From 03bf4befabb3434536cb2b28c66f83ead1503c0f Mon Sep 17 00:00:00 2001 From: Nona Luypaert Date: Wed, 26 Apr 2023 15:57:42 +0200 Subject: [PATCH 124/409] 101353: Fix issues in BrowseByTaxonomyPage and VocabularyTreeview --- .../browse-by-taxonomy-page.component.html | 2 +- .../browse-by-taxonomy-page.component.ts | 21 ++++++++++++++----- .../vocabulary-treeview.component.html | 8 +++---- .../vocabulary-treeview.component.spec.ts | 4 ++-- .../vocabulary-treeview.component.ts | 8 +++++-- 5 files changed, 29 insertions(+), 14 deletions(-) diff --git a/src/app/browse-by/browse-by-taxonomy-page/browse-by-taxonomy-page.component.html b/src/app/browse-by/browse-by-taxonomy-page/browse-by-taxonomy-page.component.html index 4b6f3586fe..f84e3d72b1 100644 --- a/src/app/browse-by/browse-by-taxonomy-page/browse-by-taxonomy-page.component.html +++ b/src/app/browse-by/browse-by-taxonomy-page/browse-by-taxonomy-page.component.html @@ -5,5 +5,5 @@ (select)="onSelect($event)">
- {{ 'browse.taxonomy.button' | translate }} + {{ 'browse.taxonomy.button' | translate }}
diff --git a/src/app/browse-by/browse-by-taxonomy-page/browse-by-taxonomy-page.component.ts b/src/app/browse-by/browse-by-taxonomy-page/browse-by-taxonomy-page.component.ts index 459442aabc..c534c5e205 100644 --- a/src/app/browse-by/browse-by-taxonomy-page/browse-by-taxonomy-page.component.ts +++ b/src/app/browse-by/browse-by-taxonomy-page/browse-by-taxonomy-page.component.ts @@ -25,16 +25,27 @@ export class BrowseByTaxonomyPageComponent implements OnInit { /** * The query parameters, contain the selected entries */ - queryParams: { 'f.subject': string[] }; + filterValues: string[]; ngOnInit() { this.vocabularyOptions = { name: 'srsc', closed: true }; } + /** + * Adds detail to selectedItems, transforms it to be used as query parameter + * and adds that to filterValues. If they already contained the detail, + * it gets deleted from both arrays. + * + * @param detail VocabularyEntryDetail to be added/deleted + */ onSelect(detail: VocabularyEntryDetail): void { - this.selectedItems.push(detail); - const filterValues = this.selectedItems - .map((item: VocabularyEntryDetail) => `${item.value},equals`); - this.queryParams = { 'f.subject': filterValues }; + if (!this.selectedItems.includes(detail)) { + this.selectedItems.push(detail); + this.filterValues = this.selectedItems + .map((item: VocabularyEntryDetail) => `${item.value},equals`); + } else { + this.selectedItems = this.selectedItems.filter((entry: VocabularyEntryDetail) => { return entry !== detail; }); + this.filterValues = this.filterValues.filter((value: string) => { return value !== `${detail.value},equals`; }); + } } } diff --git a/src/app/shared/form/vocabulary-treeview/vocabulary-treeview.component.html b/src/app/shared/form/vocabulary-treeview/vocabulary-treeview.component.html index 2de1d375cb..0c90ae473b 100644 --- a/src/app/shared/form/vocabulary-treeview/vocabulary-treeview.component.html +++ b/src/app/shared/form/vocabulary-treeview/vocabulary-treeview.component.html @@ -33,8 +33,8 @@ container="body" (click)="onSelect(node.item)"> - - + + {{node.item.display}} @@ -57,8 +57,8 @@ container="body" (click)="onSelect(node.item)"> - - + + {{node.item.display}} diff --git a/src/app/shared/form/vocabulary-treeview/vocabulary-treeview.component.spec.ts b/src/app/shared/form/vocabulary-treeview/vocabulary-treeview.component.spec.ts index 29e80cfc94..e5f5145e0a 100644 --- a/src/app/shared/form/vocabulary-treeview/vocabulary-treeview.component.spec.ts +++ b/src/app/shared/form/vocabulary-treeview/vocabulary-treeview.component.spec.ts @@ -264,14 +264,14 @@ describe('VocabularyTreeviewComponent test suite', () => { it('should not display checkboxes by default', async () => { fixture.detectChanges(); - expect(de.query(By.css('input[checkbox]'))).toBeNull(); + expect(de.query(By.css('.form-check-input'))).toBeNull(); expect(de.queryAll(By.css('cdk-tree-node')).length).toEqual(3); }); it('should display checkboxes if multiSelect is true', async () => { comp.multiSelect = true; fixture.detectChanges(); - expect(de.queryAll(By.css('#leaf-node-checkbox')).length).toEqual(3); + expect(de.queryAll(By.css('.form-check-input')).length).toEqual(3); expect(de.queryAll(By.css('cdk-tree-node')).length).toEqual(3); }); }); diff --git a/src/app/shared/form/vocabulary-treeview/vocabulary-treeview.component.ts b/src/app/shared/form/vocabulary-treeview/vocabulary-treeview.component.ts index 572074d644..01225c638a 100644 --- a/src/app/shared/form/vocabulary-treeview/vocabulary-treeview.component.ts +++ b/src/app/shared/form/vocabulary-treeview/vocabulary-treeview.component.ts @@ -245,8 +245,12 @@ export class VocabularyTreeviewComponent implements OnDestroy, OnInit { * Method called on entry select */ onSelect(item: VocabularyEntryDetail) { - this.selectedItems.push(item.id); - this.select.emit(item); + if (!this.selectedItems.includes(item.id)) { + this.selectedItems.push(item.id); + this.select.emit(item); + } else { + this.selectedItems = this.selectedItems.filter((detail: string) => { return detail !== item.id; }); + } } /** From 14b053b70418537a412795545ba6ad933feae779 Mon Sep 17 00:00:00 2001 From: Nona Luypaert Date: Wed, 26 Apr 2023 17:46:10 +0200 Subject: [PATCH 125/409] 101353: Add deselect Output in VocabularyTreeview --- .../browse-by-taxonomy-page.component.html | 3 ++- .../browse-by-taxonomy-page.component.ts | 15 +++++++-------- .../vocabulary-treeview.component.ts | 7 +++++++ 3 files changed, 16 insertions(+), 9 deletions(-) diff --git a/src/app/browse-by/browse-by-taxonomy-page/browse-by-taxonomy-page.component.html b/src/app/browse-by/browse-by-taxonomy-page/browse-by-taxonomy-page.component.html index f84e3d72b1..149e1e6b33 100644 --- a/src/app/browse-by/browse-by-taxonomy-page/browse-by-taxonomy-page.component.html +++ b/src/app/browse-by/browse-by-taxonomy-page/browse-by-taxonomy-page.component.html @@ -2,7 +2,8 @@
+ (select)="onSelect($event)" + (deselect)="onDeselect($event)">
{{ 'browse.taxonomy.button' | translate }} diff --git a/src/app/browse-by/browse-by-taxonomy-page/browse-by-taxonomy-page.component.ts b/src/app/browse-by/browse-by-taxonomy-page/browse-by-taxonomy-page.component.ts index c534c5e205..b132f299d6 100644 --- a/src/app/browse-by/browse-by-taxonomy-page/browse-by-taxonomy-page.component.ts +++ b/src/app/browse-by/browse-by-taxonomy-page/browse-by-taxonomy-page.component.ts @@ -33,19 +33,18 @@ export class BrowseByTaxonomyPageComponent implements OnInit { /** * Adds detail to selectedItems, transforms it to be used as query parameter - * and adds that to filterValues. If they already contained the detail, - * it gets deleted from both arrays. + * and adds that to filterValues. * - * @param detail VocabularyEntryDetail to be added/deleted + * @param detail VocabularyEntryDetail to be added */ onSelect(detail: VocabularyEntryDetail): void { - if (!this.selectedItems.includes(detail)) { this.selectedItems.push(detail); this.filterValues = this.selectedItems .map((item: VocabularyEntryDetail) => `${item.value},equals`); - } else { - this.selectedItems = this.selectedItems.filter((entry: VocabularyEntryDetail) => { return entry !== detail; }); - this.filterValues = this.filterValues.filter((value: string) => { return value !== `${detail.value},equals`; }); - } + } + + onDeselect(detail: VocabularyEntryDetail): void { + this.selectedItems = this.selectedItems.filter((entry: VocabularyEntryDetail) => { return entry !== detail; }); + this.filterValues = this.filterValues.filter((value: string) => { return value !== `${detail.value},equals`; }); } } diff --git a/src/app/shared/form/vocabulary-treeview/vocabulary-treeview.component.ts b/src/app/shared/form/vocabulary-treeview/vocabulary-treeview.component.ts index 01225c638a..2199de920e 100644 --- a/src/app/shared/form/vocabulary-treeview/vocabulary-treeview.component.ts +++ b/src/app/shared/form/vocabulary-treeview/vocabulary-treeview.component.ts @@ -94,6 +94,12 @@ export class VocabularyTreeviewComponent implements OnDestroy, OnInit { */ @Output() select: EventEmitter = new EventEmitter(null); + /** + * An event fired when a vocabulary entry is deselected. + * Event's payload equals to {@link VocabularyEntryDetail} deselected. + */ + @Output() deselect: EventEmitter = new EventEmitter(null); + /** * A boolean representing if user is authenticated */ @@ -250,6 +256,7 @@ export class VocabularyTreeviewComponent implements OnDestroy, OnInit { this.select.emit(item); } else { this.selectedItems = this.selectedItems.filter((detail: string) => { return detail !== item.id; }); + this.deselect.emit(item); } } From bb242d99a6b7715203e2fcc96c1f9512173773a3 Mon Sep 17 00:00:00 2001 From: Nona Luypaert Date: Wed, 26 Apr 2023 18:37:55 +0200 Subject: [PATCH 126/409] 101353: Fix VocabularyTreeview onSelect being called twice --- .../vocabulary-treeview.component.html | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/app/shared/form/vocabulary-treeview/vocabulary-treeview.component.html b/src/app/shared/form/vocabulary-treeview/vocabulary-treeview.component.html index 0c90ae473b..82d8077dbc 100644 --- a/src/app/shared/form/vocabulary-treeview/vocabulary-treeview.component.html +++ b/src/app/shared/form/vocabulary-treeview/vocabulary-treeview.component.html @@ -33,7 +33,9 @@ container="body" (click)="onSelect(node.item)"> - + + {{node.item.display}} @@ -57,7 +59,9 @@ container="body" (click)="onSelect(node.item)"> - + + {{node.item.display}} From ea297d1296c4ee685a57e19efbf3c01fdd69ce06 Mon Sep 17 00:00:00 2001 From: Nona Luypaert Date: Wed, 26 Apr 2023 18:40:38 +0200 Subject: [PATCH 127/409] 101353: Add tests for BrowseByTaxonomyPageComponent --- .../browse-by-taxonomy-page.component.spec.ts | 47 ++++++++++++++++++- 1 file changed, 46 insertions(+), 1 deletion(-) diff --git a/src/app/browse-by/browse-by-taxonomy-page/browse-by-taxonomy-page.component.spec.ts b/src/app/browse-by/browse-by-taxonomy-page/browse-by-taxonomy-page.component.spec.ts index b1ce257ef6..bc9380d7ad 100644 --- a/src/app/browse-by/browse-by-taxonomy-page/browse-by-taxonomy-page.component.spec.ts +++ b/src/app/browse-by/browse-by-taxonomy-page/browse-by-taxonomy-page.component.spec.ts @@ -1,14 +1,21 @@ import { ComponentFixture, TestBed } from '@angular/core/testing'; import { BrowseByTaxonomyPageComponent } from './browse-by-taxonomy-page.component'; +import { VocabularyEntryDetail } from '../../core/submission/vocabularies/models/vocabulary-entry-detail.model'; +import { TranslateModule } from '@ngx-translate/core'; +import { NO_ERRORS_SCHEMA } from '@angular/core'; describe('BrowseByTaxonomyPageComponent', () => { let component: BrowseByTaxonomyPageComponent; let fixture: ComponentFixture; + let detail1: VocabularyEntryDetail; + let detail2: VocabularyEntryDetail; beforeEach(async () => { await TestBed.configureTestingModule({ - declarations: [ BrowseByTaxonomyPageComponent ] + imports: [ TranslateModule.forRoot() ], + declarations: [ BrowseByTaxonomyPageComponent ], + schemas: [NO_ERRORS_SCHEMA] }) .compileComponents(); }); @@ -17,9 +24,47 @@ describe('BrowseByTaxonomyPageComponent', () => { fixture = TestBed.createComponent(BrowseByTaxonomyPageComponent); component = fixture.componentInstance; fixture.detectChanges(); + detail1 = new VocabularyEntryDetail(); + detail2 = new VocabularyEntryDetail(); + detail1.value = 'HUMANITIES and RELIGION'; + detail2.value = 'TECHNOLOGY'; }); it('should create', () => { expect(component).toBeTruthy(); }); + + it('should handle select event', () => { + component.onSelect(detail1); + expect(component.selectedItems.length).toBe(1); + expect(component.selectedItems).toContain(detail1); + expect(component.selectedItems.length).toBe(1); + expect(component.filterValues).toEqual(['HUMANITIES and RELIGION,equals'] ); + }); + + it('should handle select event with multiple selected items', () => { + component.onSelect(detail1); + component.onSelect(detail2); + expect(component.selectedItems.length).toBe(2); + expect(component.selectedItems).toContain(detail1, detail2); + expect(component.selectedItems.length).toBe(2); + expect(component.filterValues).toEqual(['HUMANITIES and RELIGION,equals', 'TECHNOLOGY,equals'] ); + }); + + it('should handle deselect event', () => { + component.onSelect(detail1); + component.onSelect(detail2); + expect(component.selectedItems.length).toBe(2); + expect(component.selectedItems.length).toBe(2); + component.onDeselect(detail1); + expect(component.selectedItems.length).toBe(1); + expect(component.selectedItems).toContain(detail2); + expect(component.selectedItems.length).toBe(1); + expect(component.filterValues).toEqual(['TECHNOLOGY,equals'] ); + }); + + afterEach(() => { + fixture.destroy(); + component = null; + }); }); From fe1be27d4913d99252461e7cb5d06e20a566d5ab Mon Sep 17 00:00:00 2001 From: Yury Bondarenko Date: Wed, 26 Apr 2023 18:46:01 +0200 Subject: [PATCH 128/409] Bump Node heap size in CI --- .github/workflows/build.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 6fae54f1f9..219074780e 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -31,6 +31,8 @@ jobs: # When Chrome version is specified, we pin to a specific version of Chrome # Comment this out to use the latest release #CHROME_VERSION: "90.0.4430.212-1" + # Bump Node heap size (OOM in CI after upgrading to Angular 15) + NODE_OPTIONS: '--max-old-space-size=4096' strategy: # Create a matrix of Node versions to test against (in parallel) matrix: From 09f3dddde4c761ac24d1c2b3d8b6fbaa594e8afd Mon Sep 17 00:00:00 2001 From: Nona Luypaert Date: Thu, 27 Apr 2023 10:52:51 +0200 Subject: [PATCH 129/409] 101393: Fix breadcrumbs on BrowseByTaxonomyPage --- src/app/browse-by/browse-by-routing.module.ts | 5 +++-- src/assets/i18n/en.json5 | 2 ++ 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/app/browse-by/browse-by-routing.module.ts b/src/app/browse-by/browse-by-routing.module.ts index 0bf61957ef..9e078dd4eb 100644 --- a/src/app/browse-by/browse-by-routing.module.ts +++ b/src/app/browse-by/browse-by-routing.module.ts @@ -5,6 +5,7 @@ import { BrowseByDSOBreadcrumbResolver } from './browse-by-dso-breadcrumb.resolv import { BrowseByI18nBreadcrumbResolver } from './browse-by-i18n-breadcrumb.resolver'; import { ThemedBrowseBySwitcherComponent } from './browse-by-switcher/themed-browse-by-switcher.component'; import { BrowseByTaxonomyPageComponent } from './browse-by-taxonomy-page/browse-by-taxonomy-page.component'; +import { I18nBreadcrumbResolver } from '../core/breadcrumbs/i18n-breadcrumb.resolver'; @NgModule({ imports: [ @@ -17,8 +18,8 @@ import { BrowseByTaxonomyPageComponent } from './browse-by-taxonomy-page/browse- path: 'srsc', component: BrowseByTaxonomyPageComponent, canActivate: [BrowseByGuard], - resolve: { breadcrumb: BrowseByI18nBreadcrumbResolver }, - data: { title: 'browse.title.page', breadcrumbKey: 'browse.metadata' } + resolve: { breadcrumb: I18nBreadcrumbResolver }, + data: { title: 'browse.title.page', breadcrumbKey: 'browse.metadata.srsc' } }, { path: ':id', diff --git a/src/assets/i18n/en.json5 b/src/assets/i18n/en.json5 index 5a0f5ce5d0..cf60499344 100644 --- a/src/assets/i18n/en.json5 +++ b/src/assets/i18n/en.json5 @@ -721,6 +721,8 @@ "browse.metadata.subject.breadcrumbs": "Browse by Subject", + "browse.metadata.srsc.breadcrumbs": "Browse by Subject Category", + "browse.metadata.title.breadcrumbs": "Browse by Title", "pagination.next.button": "Next", From da7c980ab1452ad5d7b0503d5389ef4adf748d37 Mon Sep 17 00:00:00 2001 From: Nona Luypaert Date: Thu, 27 Apr 2023 11:04:41 +0200 Subject: [PATCH 130/409] 101393: Add 'Browse by Subject Category' link to 'All of DSpace' --- src/app/menu.resolver.ts | 14 ++++++++++++++ src/assets/i18n/en.json5 | 2 ++ 2 files changed, 16 insertions(+) diff --git a/src/app/menu.resolver.ts b/src/app/menu.resolver.ts index 8630150c58..f771ef8b27 100644 --- a/src/app/menu.resolver.ts +++ b/src/app/menu.resolver.ts @@ -137,6 +137,20 @@ export class MenuResolver implements Resolve { } as TextMenuItemModel, } ); + menuList.push( + { + id: 'browse_global_by_srsc', + parentID: 'browse_global', + active: false, + visible: true, + index: 99, + model: { + type: MenuItemType.LINK, + text: `menu.section.browse_global_by_srsc`, + link: `/browse/srsc` + } as LinkMenuItemModel + } + ); } menuList.forEach((menuSection) => this.menuService.addSection(MenuID.PUBLIC, Object.assign(menuSection, { shouldPersistOnRouteChange: true diff --git a/src/assets/i18n/en.json5 b/src/assets/i18n/en.json5 index cf60499344..0958fc5d29 100644 --- a/src/assets/i18n/en.json5 +++ b/src/assets/i18n/en.json5 @@ -2649,6 +2649,8 @@ "menu.section.browse_global_by_subject": "By Subject", + "menu.section.browse_global_by_srsc": "By Subject Category", + "menu.section.browse_global_by_title": "By Title", "menu.section.browse_global_communities_and_collections": "Communities & Collections", From a5c300aebdceb3d64ff37b65ae7a1a86b852bd29 Mon Sep 17 00:00:00 2001 From: Art Lowel Date: Thu, 27 Apr 2023 14:10:43 +0200 Subject: [PATCH 131/409] refactor mulitselect mode to use labels instead of buttons --- .../vocabulary-treeview.component.html | 63 ++++++++++++------- .../vocabulary-treeview.component.scss | 4 ++ 2 files changed, 43 insertions(+), 24 deletions(-) diff --git a/src/app/shared/form/vocabulary-treeview/vocabulary-treeview.component.html b/src/app/shared/form/vocabulary-treeview/vocabulary-treeview.component.html index 82d8077dbc..a2a0b28a5c 100644 --- a/src/app/shared/form/vocabulary-treeview/vocabulary-treeview.component.html +++ b/src/app/shared/form/vocabulary-treeview/vocabulary-treeview.component.html @@ -25,20 +25,28 @@ - @@ -51,21 +59,28 @@ aria-hidden="true"> - + + {{node.item.display}} + + diff --git a/src/app/shared/form/vocabulary-treeview/vocabulary-treeview.component.scss b/src/app/shared/form/vocabulary-treeview/vocabulary-treeview.component.scss index 39050ff85b..3f0cea10d2 100644 --- a/src/app/shared/form/vocabulary-treeview/vocabulary-treeview.component.scss +++ b/src/app/shared/form/vocabulary-treeview/vocabulary-treeview.component.scss @@ -5,3 +5,7 @@ cdk-tree .btn:focus { box-shadow: none !important; } + +label { + cursor: pointer; +} From 2a84c425314aec536b4f37b8b7b0d18193600900 Mon Sep 17 00:00:00 2001 From: Nona Luypaert Date: Thu, 27 Apr 2023 14:19:14 +0200 Subject: [PATCH 132/409] 101393: Fix VocabularyTreeview tests + Remove template comments --- .../vocabulary-treeview/vocabulary-treeview.component.html | 2 -- .../vocabulary-treeview.component.spec.ts | 6 +++--- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/src/app/shared/form/vocabulary-treeview/vocabulary-treeview.component.html b/src/app/shared/form/vocabulary-treeview/vocabulary-treeview.component.html index a2a0b28a5c..9f14795342 100644 --- a/src/app/shared/form/vocabulary-treeview/vocabulary-treeview.component.html +++ b/src/app/shared/form/vocabulary-treeview/vocabulary-treeview.component.html @@ -31,7 +31,6 @@ [openDelay]="500" container="body" > - - { })); afterEach(() => { - fixture.destroy(); + fixture?.destroy(); comp = null; compAsAny = null; }); @@ -264,14 +264,14 @@ describe('VocabularyTreeviewComponent test suite', () => { it('should not display checkboxes by default', async () => { fixture.detectChanges(); - expect(de.query(By.css('.form-check-input'))).toBeNull(); + expect(de.query(By.css('input[type=checkbox]'))).toBeNull(); expect(de.queryAll(By.css('cdk-tree-node')).length).toEqual(3); }); it('should display checkboxes if multiSelect is true', async () => { comp.multiSelect = true; fixture.detectChanges(); - expect(de.queryAll(By.css('.form-check-input')).length).toEqual(3); + expect(de.queryAll(By.css('input[type=checkbox]')).length).toEqual(3); expect(de.queryAll(By.css('cdk-tree-node')).length).toEqual(3); }); }); From 8ec5d11fcca5743eff1254b7b281fb3ebbf8dea8 Mon Sep 17 00:00:00 2001 From: Alisa Ismailati Date: Thu, 27 Apr 2023 15:58:37 +0200 Subject: [PATCH 133/409] [DURACOM-133] Do not show edit/delete button for observer --- .../workspaceitem-actions.component.html | 6 +- .../workspaceitem-actions.component.spec.ts | 96 ++++++++++++++++++- .../workspaceitem-actions.component.ts | 53 ++++++++-- 3 files changed, 143 insertions(+), 12 deletions(-) diff --git a/src/app/shared/mydspace-actions/workspaceitem/workspaceitem-actions.component.html b/src/app/shared/mydspace-actions/workspaceitem/workspaceitem-actions.component.html index f789f4df47..6c3dd79d7c 100644 --- a/src/app/shared/mydspace-actions/workspaceitem/workspaceitem-actions.component.html +++ b/src/app/shared/mydspace-actions/workspaceitem/workspaceitem-actions.component.html @@ -7,7 +7,8 @@ {{"submission.workspace.generic.view" | translate}} - @@ -15,6 +16,7 @@
- \ No newline at end of file + diff --git a/src/app/shared/mydspace-actions/workspaceitem/workspaceitem-actions.component.spec.ts b/src/app/shared/mydspace-actions/workspaceitem/workspaceitem-actions.component.spec.ts index 14d3c07650..f786782c05 100644 --- a/src/app/shared/mydspace-actions/workspaceitem/workspaceitem-actions.component.spec.ts +++ b/src/app/shared/mydspace-actions/workspaceitem/workspaceitem-actions.component.spec.ts @@ -1,3 +1,4 @@ +import { EPerson } from './../../../core/eperson/models/eperson.model'; import { ChangeDetectionStrategy, Injector, NO_ERRORS_SCHEMA } from '@angular/core'; import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; import { Router } from '@angular/router'; @@ -24,12 +25,16 @@ import { RequestService } from '../../../core/data/request.service'; import { getMockRequestService } from '../../mocks/request.service.mock'; import { getMockSearchService } from '../../mocks/search-service.mock'; import { SearchService } from '../../../core/shared/search/search.service'; +import { AuthService } from '../../../core/auth/auth.service'; +import { AuthorizationDataService } from '../../../core/data/feature-authorization/authorization-data.service'; let component: WorkspaceitemActionsComponent; let fixture: ComponentFixture; let mockObject: WorkspaceItem; let notificationsServiceStub: NotificationsServiceStub; +let authorizationService; +let authService; const mockDataService = jasmine.createSpyObj('WorkspaceitemDataService', { delete: jasmine.createSpy('delete') @@ -71,10 +76,88 @@ const item = Object.assign(new Item(), { const rd = createSuccessfulRemoteDataObject(item); mockObject = Object.assign(new WorkspaceItem(), { item: observableOf(rd), id: '1234', uuid: '1234' }); -describe('WorkspaceitemActionsComponent', () => { - beforeEach(waitForAsync(() => { +const ePersonMock: EPerson = Object.assign(new EPerson(), { + handle: null, + netid: null, + lastActive: '2023-04-27T12:15:57.054+00:00', + canLogIn: true, + email: 'dspacedemo+submit@gmail.com', + requireCertificate: false, + selfRegistered: false, + _name: 'dspacedemo+submit@gmail.com', + id: '914955b1-cf2e-4884-8af7-a166aa24cf73', + uuid: '914955b1-cf2e-4884-8af7-a166aa24cf73', + type: 'eperson', + metadata: { + 'dspace.agreements.cookies': [ + { + uuid: '0a53a0f2-e168-4ed9-b4af-cba9a2d267ca', + language: null, + value: + '{"authentication":true,"preferences":true,"acknowledgement":true,"google-analytics":true}', + place: 0, + authority: null, + confidence: -1, + }, + ], + 'dspace.agreements.end-user': [ + { + uuid: '0879e571-6e4a-4efe-af9b-704c755166be', + language: null, + value: 'true', + place: 0, + authority: null, + confidence: -1, + }, + ], + 'eperson.firstname': [ + { + uuid: '18052a3e-f19b-49ca-b9f9-ee4cf9c71b86', + language: null, + value: 'Demo', + place: 0, + authority: null, + confidence: -1, + }, + ], + 'eperson.language': [ + { + uuid: '98c2abdb-6a6f-4b41-b455-896bcf333ca3', + language: null, + value: 'en', + place: 0, + authority: null, + confidence: -1, + }, + ], + 'eperson.lastname': [ + { + uuid: 'df722e70-9497-468d-a92a-4038e7ef2586', + language: null, + value: 'Submitter', + place: 0, + authority: null, + confidence: -1, + }, + ], + }, + _links: { + groups: { + href: 'http://localhost:8080/server/api/eperson/epersons/914955b1-cf2e-4884-8af7-a166aa24cf73/groups', + }, + self: { + href: 'http://localhost:8080/server/api/eperson/epersons/914955b1-cf2e-4884-8af7-a166aa24cf73', + }, + }, +}); - TestBed.configureTestingModule({ +authService = jasmine.createSpyObj('authService', { + getAuthenticatedUserFromStore: jasmine.createSpy('getAuthenticatedUserFromStore') +}); + +describe('WorkspaceitemActionsComponent', () => { + beforeEach(waitForAsync(async () => { + await TestBed.configureTestingModule({ imports: [ NgbModule, TranslateModule.forRoot({ @@ -92,6 +175,8 @@ describe('WorkspaceitemActionsComponent', () => { { provide: WorkspaceitemDataService, useValue: mockDataService }, { provide: SearchService, useValue: searchService }, { provide: RequestService, useValue: requestServce }, + { provide: AuthService, useValue: authService }, + { provide: AuthorizationDataService, useValue: authorizationService}, NgbModal ], schemas: [NO_ERRORS_SCHEMA] @@ -105,6 +190,10 @@ describe('WorkspaceitemActionsComponent', () => { component = fixture.componentInstance; component.object = mockObject; notificationsServiceStub = TestBed.inject(NotificationsService as any); + authorizationService = jasmine.createSpyObj('authorizationService', { + isAuthorized: observableOf(true) + }); + (authService.getAuthenticatedUserFromStore as jasmine.Spy).and.returnValue(observableOf(ePersonMock)); fixture.detectChanges(); }); @@ -150,7 +239,6 @@ describe('WorkspaceitemActionsComponent', () => { confirmBtn.click(); fixture.detectChanges(); - fixture.whenStable().then(() => { done(); }); diff --git a/src/app/shared/mydspace-actions/workspaceitem/workspaceitem-actions.component.ts b/src/app/shared/mydspace-actions/workspaceitem/workspaceitem-actions.component.ts index a6d30728ac..d758ef1bb5 100644 --- a/src/app/shared/mydspace-actions/workspaceitem/workspaceitem-actions.component.ts +++ b/src/app/shared/mydspace-actions/workspaceitem/workspaceitem-actions.component.ts @@ -1,7 +1,12 @@ -import { Component, Injector, Input } from '@angular/core'; +import { EPerson } from './../../../core/eperson/models/eperson.model'; +import { AuthorizationDataService } from 'src/app/core/data/feature-authorization/authorization-data.service'; +import { AuthService } from './../../../core/auth/auth.service'; +import { Item } from 'src/app/core/shared/item.model'; +import { FeatureID } from './../../../core/data/feature-authorization/feature-id'; +import { Component, Injector, Input, OnInit } from '@angular/core'; import { Router } from '@angular/router'; -import { BehaviorSubject } from 'rxjs'; +import { BehaviorSubject, Observable, switchMap } from 'rxjs'; import { NgbModal } from '@ng-bootstrap/ng-bootstrap'; import { TranslateService } from '@ngx-translate/core'; @@ -11,7 +16,7 @@ import { WorkspaceitemDataService } from '../../../core/submission/workspaceitem import { NotificationsService } from '../../notifications/notifications.service'; import { RequestService } from '../../../core/data/request.service'; import { SearchService } from '../../../core/shared/search/search.service'; -import { getFirstCompletedRemoteData } from '../../../core/shared/operators'; +import { getFirstCompletedRemoteData, getRemoteDataPayload } from '../../../core/shared/operators'; import { RemoteData } from '../../../core/data/remote-data'; import { NoContent } from '../../../core/shared/NoContent.model'; import { getWorkspaceItemViewRoute } from '../../../workspaceitems-edit-page/workspaceitems-edit-page-routing-paths'; @@ -24,7 +29,7 @@ import { getWorkspaceItemViewRoute } from '../../../workspaceitems-edit-page/wor styleUrls: ['./workspaceitem-actions.component.scss'], templateUrl: './workspaceitem-actions.component.html', }) -export class WorkspaceitemActionsComponent extends MyDSpaceActionsComponent { +export class WorkspaceitemActionsComponent extends MyDSpaceActionsComponent implements OnInit { /** * The workspaceitem object @@ -37,6 +42,20 @@ export class WorkspaceitemActionsComponent extends MyDSpaceActionsComponent(false); + /** + * A boolean representing if the user is an admin + * @type {Observable} + */ + isAdmin$: Observable; + + /** + * A boolean representing if the user can edit the item + * and therefore can delete it as well + * (since the user can discard the item also from the edit page) + * @type {Observable} + */ + canEditItem$: Observable; + /** * Initialize instance variables * @@ -54,8 +73,12 @@ export class WorkspaceitemActionsComponent extends MyDSpaceActionsComponent this.authorizationService.isAuthorized(FeatureID.AdministratorOf, user.uuid))); + + this.canEditItem$ = activeEPerson$.pipe( + switchMap((eperson) => { + return this.object?.item.pipe( + getFirstCompletedRemoteData(), + getRemoteDataPayload(), + switchMap((item: Item) => { + return this.authorizationService.isAuthorized(FeatureID.CanEditItem, item?._links?.self.href, eperson.uuid); + }) + ) as Observable; + })); + } + /** * Init the target object * @@ -92,5 +134,4 @@ export class WorkspaceitemActionsComponent extends MyDSpaceActionsComponent Date: Thu, 27 Apr 2023 16:51:41 +0200 Subject: [PATCH 134/409] Work for signposting --- server.ts | 9 +++ .../metadata-item.service.spec.ts | 16 +++++ .../metadata-item/metadata-item.service.ts | 70 +++++++++++++++++++ src/app/core/metadata/metadata.service.ts | 11 ++- src/app/init.service.ts | 3 + src/modules/app/browser-init.service.ts | 3 + src/modules/app/server-init.service.ts | 5 +- 7 files changed, 115 insertions(+), 2 deletions(-) create mode 100644 src/app/core/metadata-item/metadata-item.service.spec.ts create mode 100644 src/app/core/metadata-item/metadata-item.service.ts diff --git a/server.ts b/server.ts index 3e10677a8b..5a3660e4de 100644 --- a/server.ts +++ b/server.ts @@ -180,6 +180,15 @@ export function app() { changeOrigin: true })); + /** + * Proxy the linksets + */ + router.use('/linksets**', createProxyMiddleware({ + target: `${environment.rest.baseUrl}/linksets`, + pathRewrite: path => path.replace(environment.ui.nameSpace, '/'), + changeOrigin: true + })); + /** * Checks if the rateLimiter property is present * When it is present, the rateLimiter will be enabled. When it is undefined, the rateLimiter will be disabled. diff --git a/src/app/core/metadata-item/metadata-item.service.spec.ts b/src/app/core/metadata-item/metadata-item.service.spec.ts new file mode 100644 index 0000000000..89ca15658d --- /dev/null +++ b/src/app/core/metadata-item/metadata-item.service.spec.ts @@ -0,0 +1,16 @@ +import { TestBed } from '@angular/core/testing'; + +import { MetadataItemService } from './metadata-item.service'; + +describe('MetadataItemService', () => { + let service: MetadataItemService; + + beforeEach(() => { + TestBed.configureTestingModule({}); + service = TestBed.inject(MetadataItemService); + }); + + it('should be created', () => { + expect(service).toBeTruthy(); + }); +}); diff --git a/src/app/core/metadata-item/metadata-item.service.ts b/src/app/core/metadata-item/metadata-item.service.ts new file mode 100644 index 0000000000..a4fbcf587b --- /dev/null +++ b/src/app/core/metadata-item/metadata-item.service.ts @@ -0,0 +1,70 @@ +import { Inject, Injectable } from '@angular/core'; +import { MetadataService } from '../metadata/metadata.service'; +import { ActivatedRoute, NavigationEnd, Event as NavigationEvent, NavigationStart, Router } from '@angular/router'; +import { TranslateService } from '@ngx-translate/core'; +import { Meta, Title } from '@angular/platform-browser'; +import { DSONameService } from '../breadcrumbs/dso-name.service'; +import { BundleDataService } from '../data/bundle-data.service'; +import { BitstreamDataService } from '../data/bitstream-data.service'; +import { BitstreamFormatDataService } from '../data/bitstream-format-data.service'; +import { RootDataService } from '../data/root-data.service'; +import { CoreState } from '../core-state.model'; +import { Store } from '@ngrx/store'; +import { HardRedirectService } from '../services/hard-redirect.service'; +import { APP_CONFIG, AppConfig } from 'src/config/app-config.interface'; +import { AuthorizationDataService } from '../data/feature-authorization/authorization-data.service'; +import { filter, map, switchMap, take, mergeMap } from 'rxjs/operators'; +import { DOCUMENT } from '@angular/common'; + +@Injectable({ + providedIn: 'root' +}) +export class MetadataItemService extends MetadataService { + + constructor( + private router1: ActivatedRoute, + router: Router, + translate: TranslateService, + meta: Meta, + title: Title, + dsoNameService: DSONameService, + bundleDataService: BundleDataService, + bitstreamDataService: BitstreamDataService, + bitstreamFormatDataService: BitstreamFormatDataService, + rootService: RootDataService, + store: Store, + hardRedirectService: HardRedirectService, + @Inject(APP_CONFIG) appConfig: AppConfig, + authorizationService: AuthorizationDataService, + @Inject(DOCUMENT) private document: Document + ) { + super(router, translate, meta, title, dsoNameService, bundleDataService, bitstreamDataService, bitstreamFormatDataService, rootService, store, hardRedirectService, appConfig, authorizationService); + } + + public checkCurrentRoute(){ + + console.log(this.router); + + this.router1.url.subscribe(url => { + console.log(url); + console.log(url[0].path); + }); + + // this.router.events.subscribe((event: NavigationEvent) => { + // if(event instanceof NavigationStart) { + // if(event.url.startsWith('/entities')){ + // console.log('We are on ENTITIES!'); + // } + // } + // }); + } + + setLinkTag(){ + this.clearMetaTags(); + + let link: HTMLLinkElement = this.document.createElement('link'); + link.setAttribute('rel', ''); + link.setAttribute('href', ''); + this.document.head.appendChild(link); + } +} diff --git a/src/app/core/metadata/metadata.service.ts b/src/app/core/metadata/metadata.service.ts index 204c925e6b..c46f8b1d6e 100644 --- a/src/app/core/metadata/metadata.service.ts +++ b/src/app/core/metadata/metadata.service.ts @@ -84,7 +84,7 @@ export class MetadataService { ]; constructor( - private router: Router, + protected router: Router, private translate: TranslateService, private meta: Meta, private title: Title, @@ -363,6 +363,15 @@ export class MetadataService { } } + /** + * Add to the + */ + // private setLinkTag(): void { + // const value = this.getMetaTagValue('dc.link'); + // this.meta.addTag({ name: 'Link', content: value }); + // this.addMetaTag('Link', value); + // } + getBitLinkIfDownloadable(bitstream: Bitstream, bitstreamRd: RemoteData>): Observable { return observableOf(bitstream).pipe( getDownloadableBitstream(this.authorizationService), diff --git a/src/app/init.service.ts b/src/app/init.service.ts index 9fef2ca4ed..d5978d782d 100644 --- a/src/app/init.service.ts +++ b/src/app/init.service.ts @@ -24,6 +24,7 @@ import { isAuthenticationBlocking } from './core/auth/selectors'; import { distinctUntilChanged, find } from 'rxjs/operators'; import { Observable } from 'rxjs'; import { MenuService } from './shared/menu/menu.service'; +import { MetadataItemService } from './core/metadata-item/metadata-item.service'; /** * Performs the initialization of the app. @@ -50,6 +51,7 @@ export abstract class InitService { protected localeService: LocaleService, protected angulartics2DSpace: Angulartics2DSpace, protected metadata: MetadataService, + protected metadataItem: MetadataItemService, protected breadcrumbsService: BreadcrumbsService, protected themeService: ThemeService, protected menuService: MenuService, @@ -188,6 +190,7 @@ export abstract class InitService { this.breadcrumbsService.listenForRouteChanges(); this.themeService.listenForRouteChanges(); this.menuService.listenForRouteChanges(); + this.metadataItem.checkCurrentRoute(); } /** diff --git a/src/modules/app/browser-init.service.ts b/src/modules/app/browser-init.service.ts index 61d57f10f9..f38883be1e 100644 --- a/src/modules/app/browser-init.service.ts +++ b/src/modules/app/browser-init.service.ts @@ -32,6 +32,7 @@ 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'; +import { MetadataItemService } from 'src/app/core/metadata-item/metadata-item.service'; /** * Performs client-side initialization. @@ -51,6 +52,7 @@ export class BrowserInitService extends InitService { protected angulartics2DSpace: Angulartics2DSpace, protected googleAnalyticsService: GoogleAnalyticsService, protected metadata: MetadataService, + protected metadataItem: MetadataItemService, protected breadcrumbsService: BreadcrumbsService, protected klaroService: KlaroService, protected authService: AuthService, @@ -66,6 +68,7 @@ export class BrowserInitService extends InitService { localeService, angulartics2DSpace, metadata, + metadataItem, breadcrumbsService, themeService, menuService, diff --git a/src/modules/app/server-init.service.ts b/src/modules/app/server-init.service.ts index d909bb0e8d..074efc31e7 100644 --- a/src/modules/app/server-init.service.ts +++ b/src/modules/app/server-init.service.ts @@ -21,6 +21,7 @@ import { BreadcrumbsService } from '../../app/breadcrumbs/breadcrumbs.service'; import { ThemeService } from '../../app/shared/theme-support/theme.service'; import { take } from 'rxjs/operators'; import { MenuService } from '../../app/shared/menu/menu.service'; +import { MetadataItemService } from 'src/app/core/metadata-item/metadata-item.service'; /** * Performs server-side initialization. @@ -36,9 +37,10 @@ export class ServerInitService extends InitService { protected localeService: LocaleService, protected angulartics2DSpace: Angulartics2DSpace, protected metadata: MetadataService, + protected metadataItem: MetadataItemService, protected breadcrumbsService: BreadcrumbsService, protected themeService: ThemeService, - protected menuService: MenuService, + protected menuService: MenuService ) { super( store, @@ -48,6 +50,7 @@ export class ServerInitService extends InitService { localeService, angulartics2DSpace, metadata, + metadataItem, breadcrumbsService, themeService, menuService, From 3d9100f2d10898caed61926d74434decdd24e969 Mon Sep 17 00:00:00 2001 From: Sondissimo Date: Fri, 28 Apr 2023 16:35:30 +0200 Subject: [PATCH 135/409] DURACOM-138 Added a single line in the process-parameters.component.html, we now check if the parameters selector for the process contains at least 1 value, if not, the selector box is not shown. --- .../form/process-parameters/process-parameters.component.html | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/app/process-page/form/process-parameters/process-parameters.component.html b/src/app/process-page/form/process-parameters/process-parameters.component.html index d7bbce6779..32fbba1b0b 100644 --- a/src/app/process-page/form/process-parameters/process-parameters.component.html +++ b/src/app/process-page/form/process-parameters/process-parameters.component.html @@ -1,3 +1,4 @@ +
+
From 3647292b8fa056503a31ea72e8b65b6fac5f9f6e Mon Sep 17 00:00:00 2001 From: Enea Jahollari Date: Fri, 28 Apr 2023 16:47:07 +0200 Subject: [PATCH 136/409] [CST-9636] Added unit tests and the logic to create file object from payload --- .../collection-access-control.component.html | 91 +++++++++++++- .../collection-access-control.component.ts | 69 +++++++---- .../collection-access-control.service.ts | 54 +++++++++ .../edit-collection-page.module.ts | 6 + .../community-access-control.component.html | 93 ++++++++++++++- .../community-access-control.component.ts | 47 +++++++- .../community-access-control.service.ts | 54 +++++++++ .../edit-community-page.module.ts | 6 + .../edit-item-page/edit-item-page.module.ts | 6 + .../item-access-control.component.html | 111 +++++++++++++++++- .../item-access-control.component.ts | 55 ++++++++- .../item-access-control.service.ts | 71 +++++++++++ .../access-control-array-form.component.html | 68 +++++++++++ .../access-control-array-form.component.scss | 0 ...ccess-control-array-form.component.spec.ts | 101 ++++++++++++++++ .../access-control-array-form.component.ts | 88 ++++++++++++++ .../control-max-end-date.pipe.ts | 26 ++++ .../control-max-start-date.pipe.ts | 26 ++++ 18 files changed, 938 insertions(+), 34 deletions(-) create mode 100644 src/app/collection-page/edit-collection-page/collection-access-control/collection-access-control.service.ts create mode 100644 src/app/community-page/edit-community-page/community-access-control/community-access-control.service.ts create mode 100644 src/app/item-page/edit-item-page/item-access-control/item-access-control.service.ts create mode 100644 src/app/shared/access-control-array-form/access-control-array-form.component.html create mode 100644 src/app/shared/access-control-array-form/access-control-array-form.component.scss create mode 100644 src/app/shared/access-control-array-form/access-control-array-form.component.spec.ts create mode 100644 src/app/shared/access-control-array-form/access-control-array-form.component.ts create mode 100644 src/app/shared/access-control-array-form/control-max-end-date.pipe.ts create mode 100644 src/app/shared/access-control-array-form/control-max-start-date.pipe.ts diff --git a/src/app/collection-page/edit-collection-page/collection-access-control/collection-access-control.component.html b/src/app/collection-page/edit-collection-page/collection-access-control/collection-access-control.component.html index 0719a18d94..52eda57f2c 100644 --- a/src/app/collection-page/edit-collection-page/collection-access-control/collection-access-control.component.html +++ b/src/app/collection-page/edit-collection-page/collection-access-control/collection-access-control.component.html @@ -1,3 +1,92 @@
- Access control page!!! +
+
+

+ This form allows you to perform changes to the access condition of all the items owned by collection under this community. + Changes can be performed on the access condition for the metadata (item) or for the content (bitstream). +

+ +
+
+
+

Item's Metadata

+ +
+ +
+
Mode
+
+
+ + +
+
+ + +
+
+
+ +
+
Access conditions
+ +
+ You have not specified any access conditions, the new items access conditions will be inherited from the owning collection. +
+
+ + + + +
+
+
+

Bitstreams

+ +
+ +
+
Mode
+
+
+ + +
+
+ + +
+
+
+ +
+
Access conditions
+ +
+ You have not specified any access conditions, the new items access conditions will be inherited from the owning collection. +
+
+ + + + +
+
+ +
+ +
+ + +
+
+
diff --git a/src/app/collection-page/edit-collection-page/collection-access-control/collection-access-control.component.ts b/src/app/collection-page/edit-collection-page/collection-access-control/collection-access-control.component.ts index 8675e3a83f..0791e29233 100644 --- a/src/app/collection-page/edit-collection-page/collection-access-control/collection-access-control.component.ts +++ b/src/app/collection-page/edit-collection-page/collection-access-control/collection-access-control.component.ts @@ -1,37 +1,56 @@ -import { Component, OnInit } from '@angular/core'; -import { Observable } from 'rxjs'; -import { RemoteData } from '../../../core/data/remote-data'; -import { ActivatedRoute } from '@angular/router'; -import { first, map } from 'rxjs/operators'; -import { DSpaceObject } from '../../../core/shared/dspace-object.model'; +import { Component, OnInit, ViewChild } from '@angular/core'; +import { shareReplay } from 'rxjs'; +import { + AccessControlArrayFormComponent +} from '../../../shared/access-control-array-form/access-control-array-form.component'; +import { CollectionAccessControlService } from './collection-access-control.service'; @Component({ selector: 'ds-collection-access-control', templateUrl: './collection-access-control.component.html', - styleUrls: ['./collection-access-control.component.scss'] + styleUrls: ['./collection-access-control.component.scss'], + providers: [CollectionAccessControlService] }) -export class CollectionAccessControlComponent implements OnInit { +export class CollectionAccessControlComponent implements OnInit { - /** - * The initial DSO object - */ - public dsoRD$: Observable>; + @ViewChild('bitstreamAccessCmp', { static: true }) bitstreamAccessCmp: AccessControlArrayFormComponent; + @ViewChild('itemAccessCmp', { static: true }) itemAccessCmp: AccessControlArrayFormComponent; + + constructor(private collectionAccessControlService: CollectionAccessControlService) {} + + state = initialState; + + dropdownData$ = this.collectionAccessControlService.dropdownData$.pipe( + shareReplay(1) + ); + + ngOnInit(): void { - /** - * Initialize instance variables - * - * @param {ActivatedRoute} route - */ - constructor( - private route: ActivatedRoute - ) { } - /** - * Initialize the component, setting up the collection - */ - ngOnInit(): void { - this.dsoRD$ = this.route.parent.parent.data.pipe(first(), map((data) => data.dso)); + reset() { + this.bitstreamAccessCmp.reset(); + this.itemAccessCmp.reset(); + this.state = initialState; + } + + submit() { + const bitstreamAccess = this.bitstreamAccessCmp.getValue(); + const itemAccess = this.itemAccessCmp.getValue(); + + console.log('bitstreamAccess', bitstreamAccess); + console.log('itemAccess', itemAccess); } } + +const initialState = { + item: { + toggleStatus: false, + accessMode: '', + }, + bitstream: { + toggleStatus: false, + accessMode: '', + }, +}; diff --git a/src/app/collection-page/edit-collection-page/collection-access-control/collection-access-control.service.ts b/src/app/collection-page/edit-collection-page/collection-access-control/collection-access-control.service.ts new file mode 100644 index 0000000000..9cc7b8d85a --- /dev/null +++ b/src/app/collection-page/edit-collection-page/collection-access-control/collection-access-control.service.ts @@ -0,0 +1,54 @@ +import { Injectable } from '@angular/core'; +import { AccessControlItem } from '../../../shared/access-control-array-form/access-control-array-form.component'; +import { Observable, of } from 'rxjs'; + +export interface AccessControlDropdownDataResponse { + id: string; + itemAccessConditionOptions: AccessControlItem[]; + bitstreamAccessConditionOptions: AccessControlItem[]; +} + +@Injectable() +export class CollectionAccessControlService { + dropdownData$: Observable = of(accessControlDropdownData); +} + +const accessControlDropdownData: AccessControlDropdownDataResponse = { + 'id': 'default', + 'itemAccessConditionOptions': [ + { + 'name': 'openaccess' + }, + { + 'name': 'administrator' + }, + { + 'name': 'embargo', + 'hasStartDate': true, + 'maxStartDate': '2018-06-24T00:40:54.970+0000' + }, + { + 'name': 'lease', + 'hasEndDate': true, + 'maxEndDate': '2017-12-24T00:40:54.970+0000' + } + ], + 'bitstreamAccessConditionOptions': [ + { + 'name': 'openaccess' + }, + { + 'name': 'administrator' + }, + { + 'name': 'embargo', + 'hasStartDate': true, + 'maxStartDate': '2018-06-24T00:40:54.970+0000' + }, + { + 'name': 'lease', + 'hasEndDate': true, + 'maxEndDate': '2017-12-24T00:40:54.970+0000' + } + ] +}; diff --git a/src/app/collection-page/edit-collection-page/edit-collection-page.module.ts b/src/app/collection-page/edit-collection-page/edit-collection-page.module.ts index 3817122368..5af7d3189a 100644 --- a/src/app/collection-page/edit-collection-page/edit-collection-page.module.ts +++ b/src/app/collection-page/edit-collection-page/edit-collection-page.module.ts @@ -14,6 +14,10 @@ import { ResourcePoliciesModule } from '../../shared/resource-policies/resource- import { FormModule } from '../../shared/form/form.module'; import { ComcolModule } from '../../shared/comcol/comcol.module'; import { CollectionAccessControlComponent } from './collection-access-control/collection-access-control.component'; +import { + AccessControlArrayFormModule +} from '../../shared/access-control-array-form/access-control-array-form.component'; +import { UiSwitchModule } from 'ngx-ui-switch'; /** * Module that contains all components related to the Edit Collection page administrator functionality @@ -27,6 +31,8 @@ import { CollectionAccessControlComponent } from './collection-access-control/co ResourcePoliciesModule, FormModule, ComcolModule, + AccessControlArrayFormModule, + UiSwitchModule, ], declarations: [ EditCollectionPageComponent, diff --git a/src/app/community-page/edit-community-page/community-access-control/community-access-control.component.html b/src/app/community-page/edit-community-page/community-access-control/community-access-control.component.html index cec7f44321..52eda57f2c 100644 --- a/src/app/community-page/edit-community-page/community-access-control/community-access-control.component.html +++ b/src/app/community-page/edit-community-page/community-access-control/community-access-control.component.html @@ -1 +1,92 @@ -

community-access-control works!

+
+
+
+

+ This form allows you to perform changes to the access condition of all the items owned by collection under this community. + Changes can be performed on the access condition for the metadata (item) or for the content (bitstream). +

+ +
+
+
+

Item's Metadata

+ +
+ +
+
Mode
+
+
+ + +
+
+ + +
+
+
+ +
+
Access conditions
+ +
+ You have not specified any access conditions, the new items access conditions will be inherited from the owning collection. +
+
+ + + + +
+
+
+

Bitstreams

+ +
+ +
+
Mode
+
+
+ + +
+
+ + +
+
+
+ +
+
Access conditions
+ +
+ You have not specified any access conditions, the new items access conditions will be inherited from the owning collection. +
+
+ + + + +
+
+ +
+ +
+ + +
+
+
+
diff --git a/src/app/community-page/edit-community-page/community-access-control/community-access-control.component.ts b/src/app/community-page/edit-community-page/community-access-control/community-access-control.component.ts index 543d63564e..202c04b7b5 100644 --- a/src/app/community-page/edit-community-page/community-access-control/community-access-control.component.ts +++ b/src/app/community-page/edit-community-page/community-access-control/community-access-control.component.ts @@ -1,15 +1,56 @@ -import { Component, OnInit } from '@angular/core'; +import { Component, OnInit, ViewChild } from '@angular/core'; +import { CommunityAccessControlService } from './community-access-control.service'; +import { shareReplay } from 'rxjs'; +import { + AccessControlArrayFormComponent +} from '../../../shared/access-control-array-form/access-control-array-form.component'; @Component({ selector: 'ds-community-access-control', templateUrl: './community-access-control.component.html', - styleUrls: ['./community-access-control.component.scss'] + styleUrls: ['./community-access-control.component.scss'], + providers: [CommunityAccessControlService] }) export class CommunityAccessControlComponent implements OnInit { - constructor() { } + @ViewChild('bitstreamAccessCmp', { static: true }) bitstreamAccessCmp: AccessControlArrayFormComponent; + @ViewChild('itemAccessCmp', { static: true }) itemAccessCmp: AccessControlArrayFormComponent; + + constructor(private communityAccessControlService: CommunityAccessControlService) {} + + state = initialState; + + dropdownData$ = this.communityAccessControlService.dropdownData$.pipe( + shareReplay(1) + ); ngOnInit(): void { + + } + + reset() { + this.bitstreamAccessCmp.reset(); + this.itemAccessCmp.reset(); + this.state = initialState; + } + + submit() { + const bitstreamAccess = this.bitstreamAccessCmp.getValue(); + const itemAccess = this.itemAccessCmp.getValue(); + + console.log('bitstreamAccess', bitstreamAccess); + console.log('itemAccess', itemAccess); } } + +const initialState = { + item: { + toggleStatus: false, + accessMode: '', + }, + bitstream: { + toggleStatus: false, + accessMode: '', + }, +}; diff --git a/src/app/community-page/edit-community-page/community-access-control/community-access-control.service.ts b/src/app/community-page/edit-community-page/community-access-control/community-access-control.service.ts new file mode 100644 index 0000000000..d78d42ba90 --- /dev/null +++ b/src/app/community-page/edit-community-page/community-access-control/community-access-control.service.ts @@ -0,0 +1,54 @@ +import { Injectable } from '@angular/core'; +import { AccessControlItem } from '../../../shared/access-control-array-form/access-control-array-form.component'; +import { Observable, of } from 'rxjs'; + +export interface AccessControlDropdownDataResponse { + id: string; + itemAccessConditionOptions: AccessControlItem[]; + bitstreamAccessConditionOptions: AccessControlItem[]; +} + +@Injectable() +export class CommunityAccessControlService { + dropdownData$: Observable = of(accessControlDropdownData); +} + +const accessControlDropdownData: AccessControlDropdownDataResponse = { + 'id': 'default', + 'itemAccessConditionOptions': [ + { + 'name': 'openaccess' + }, + { + 'name': 'administrator' + }, + { + 'name': 'embargo', + 'hasStartDate': true, + 'maxStartDate': '2018-06-24T00:40:54.970+0000' + }, + { + 'name': 'lease', + 'hasEndDate': true, + 'maxEndDate': '2017-12-24T00:40:54.970+0000' + } + ], + 'bitstreamAccessConditionOptions': [ + { + 'name': 'openaccess' + }, + { + 'name': 'administrator' + }, + { + 'name': 'embargo', + 'hasStartDate': true, + 'maxStartDate': '2018-06-24T00:40:54.970+0000' + }, + { + 'name': 'lease', + 'hasEndDate': true, + 'maxEndDate': '2017-12-24T00:40:54.970+0000' + } + ] +}; diff --git a/src/app/community-page/edit-community-page/edit-community-page.module.ts b/src/app/community-page/edit-community-page/edit-community-page.module.ts index a9f020a9e6..8aa52086ee 100644 --- a/src/app/community-page/edit-community-page/edit-community-page.module.ts +++ b/src/app/community-page/edit-community-page/edit-community-page.module.ts @@ -11,6 +11,10 @@ import { CommunityFormModule } from '../community-form/community-form.module'; import { ResourcePoliciesModule } from '../../shared/resource-policies/resource-policies.module'; import { ComcolModule } from '../../shared/comcol/comcol.module'; import { CommunityAccessControlComponent } from './community-access-control/community-access-control.component'; +import { UiSwitchModule } from 'ngx-ui-switch'; +import { + AccessControlArrayFormModule +} from '../../shared/access-control-array-form/access-control-array-form.component'; /** * Module that contains all components related to the Edit Community page administrator functionality @@ -23,6 +27,8 @@ import { CommunityAccessControlComponent } from './community-access-control/comm CommunityFormModule, ComcolModule, ResourcePoliciesModule, + UiSwitchModule, + AccessControlArrayFormModule, ], declarations: [ EditCommunityPageComponent, diff --git a/src/app/item-page/edit-item-page/edit-item-page.module.ts b/src/app/item-page/edit-item-page/edit-item-page.module.ts index d922cee0a5..65862b3de8 100644 --- a/src/app/item-page/edit-item-page/edit-item-page.module.ts +++ b/src/app/item-page/edit-item-page/edit-item-page.module.ts @@ -39,6 +39,10 @@ import { IdentifierDataComponent } from '../../shared/object-list/identifier-dat import { ItemRegisterDoiComponent } from './item-register-doi/item-register-doi.component'; import { DsoSharedModule } from '../../dso-shared/dso-shared.module'; import { ItemAccessControlComponent } from './item-access-control/item-access-control.component'; +import { + AccessControlArrayFormModule +} from '../../shared/access-control-array-form/access-control-array-form.component'; +import { UiSwitchModule } from 'ngx-ui-switch'; /** @@ -56,6 +60,8 @@ import { ItemAccessControlComponent } from './item-access-control/item-access-co NgbModule, ItemVersionsModule, DsoSharedModule, + AccessControlArrayFormModule, + UiSwitchModule, ], declarations: [ EditItemPageComponent, diff --git a/src/app/item-page/edit-item-page/item-access-control/item-access-control.component.html b/src/app/item-page/edit-item-page/item-access-control/item-access-control.component.html index 416b785722..f5a02b0452 100644 --- a/src/app/item-page/edit-item-page/item-access-control/item-access-control.component.html +++ b/src/app/item-page/edit-item-page/item-access-control/item-access-control.component.html @@ -1 +1,110 @@ -

item-access-control works!

+
+
+
+

+ This form allows you to perform changes to the access condition of all the items owned by collection under this community. + Changes can be performed on the access condition for the metadata (item) or for the content (bitstream). +

+ +
+
+
+

Item's Metadata

+ +
+ +
+
Mode
+
+
+ + +
+
+ + +
+
+
+ +
+
Access conditions
+ +
+ You have not specified any access conditions, the new items access conditions will be inherited from the owning collection. +
+
+ + + + +
+
+
+

Bitstreams

+ +
+ +
+
Limit the changes to specific bitstreams
+
+
+ + +
+
+ + +
+
+
+ +
+
Mode
+
+
+ + +
+
+ + +
+
+
+ +
+
Access conditions
+ +
+ You have not specified any access conditions, the new items access conditions will be inherited from the owning collection. +
+
+ + + + +
+
+ +
+ +
+ + +
+
+
+
diff --git a/src/app/item-page/edit-item-page/item-access-control/item-access-control.component.ts b/src/app/item-page/edit-item-page/item-access-control/item-access-control.component.ts index 5b42e5bf4e..6882dfb2a1 100644 --- a/src/app/item-page/edit-item-page/item-access-control/item-access-control.component.ts +++ b/src/app/item-page/edit-item-page/item-access-control/item-access-control.component.ts @@ -1,15 +1,64 @@ -import { Component, OnInit } from '@angular/core'; +import { Component, OnInit, ViewChild } from '@angular/core'; +import { + AccessControlArrayFormComponent +} from '../../../shared/access-control-array-form/access-control-array-form.component'; +import { + CollectionAccessControlService +} from '../../../collection-page/edit-collection-page/collection-access-control/collection-access-control.service'; +import { shareReplay } from 'rxjs'; +import { ItemAccessControlService } from './item-access-control.service'; @Component({ selector: 'ds-item-access-control', templateUrl: './item-access-control.component.html', - styleUrls: ['./item-access-control.component.scss'] + styleUrls: ['./item-access-control.component.scss'], + providers: [ItemAccessControlService] }) export class ItemAccessControlComponent implements OnInit { - constructor() { } + @ViewChild('bitstreamAccessCmp', { static: true }) bitstreamAccessCmp: AccessControlArrayFormComponent; + @ViewChild('itemAccessCmp', { static: true }) itemAccessCmp: AccessControlArrayFormComponent; + + constructor(private itemAccessControlService: ItemAccessControlService) {} + + state = initialState; + + dropdownData$ = this.itemAccessControlService.dropdownData$.pipe( + shareReplay(1) + ); ngOnInit(): void { + + } + + reset() { + this.bitstreamAccessCmp.reset(); + this.itemAccessCmp.reset(); + this.state = initialState; + } + + submit() { + const bitstreamAccess = this.bitstreamAccessCmp.getValue(); + const itemAccess = this.itemAccessCmp.getValue(); + + this.itemAccessControlService.execute({ + bitstreamAccess, + itemAccess, + state: this.state + }); } } + +const initialState = { + item: { + toggleStatus: false, + accessMode: '', + }, + bitstream: { + toggleStatus: false, + accessMode: '', + changesLimit: '', // 'all' | 'selected' + selectedBitstreams: [] + }, +}; diff --git a/src/app/item-page/edit-item-page/item-access-control/item-access-control.service.ts b/src/app/item-page/edit-item-page/item-access-control/item-access-control.service.ts new file mode 100644 index 0000000000..3eeacfe1ce --- /dev/null +++ b/src/app/item-page/edit-item-page/item-access-control/item-access-control.service.ts @@ -0,0 +1,71 @@ +import { Injectable } from '@angular/core'; +import { AccessControlItem } from '../../../shared/access-control-array-form/access-control-array-form.component'; +import { Observable, of } from 'rxjs'; + +export interface AccessControlDropdownDataResponse { + id: string; + itemAccessConditionOptions: AccessControlItem[]; + bitstreamAccessConditionOptions: AccessControlItem[]; +} + +@Injectable() +export class ItemAccessControlService { + dropdownData$: Observable = of(accessControlDropdownData); + + + execute(payload: any) { + console.log('execute', payload); + + const blob = new Blob([JSON.stringify(payload, null, 2)], { + type: 'application/json', + }); + + const file = new File([blob], 'data.json', { + type: 'application/json', + }); + + const url = URL.createObjectURL(file); + window.open(url, '_blank'); + + } +} + +const accessControlDropdownData: AccessControlDropdownDataResponse = { + 'id': 'default', + 'itemAccessConditionOptions': [ + { + 'name': 'openaccess' + }, + { + 'name': 'administrator' + }, + { + 'name': 'embargo', + 'hasStartDate': true, + 'maxStartDate': '2018-06-24T00:40:54.970+0000' + }, + { + 'name': 'lease', + 'hasEndDate': true, + 'maxEndDate': '2017-12-24T00:40:54.970+0000' + } + ], + 'bitstreamAccessConditionOptions': [ + { + 'name': 'openaccess' + }, + { + 'name': 'administrator' + }, + { + 'name': 'embargo', + 'hasStartDate': true, + 'maxStartDate': '2018-06-24T00:40:54.970+0000' + }, + { + 'name': 'lease', + 'hasEndDate': true, + 'maxEndDate': '2017-12-24T00:40:54.970+0000' + } + ] +}; diff --git a/src/app/shared/access-control-array-form/access-control-array-form.component.html b/src/app/shared/access-control-array-form/access-control-array-form.component.html new file mode 100644 index 0000000000..dc8caf403c --- /dev/null +++ b/src/app/shared/access-control-array-form/access-control-array-form.component.html @@ -0,0 +1,68 @@ +
+ +
+ +
+ +
+ +
+
+ +
+ +
+
+
+ +
+
+ +
+ +
+
+
+ +
+ +
+
+ +
+ + + +
diff --git a/src/app/shared/access-control-array-form/access-control-array-form.component.scss b/src/app/shared/access-control-array-form/access-control-array-form.component.scss new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/app/shared/access-control-array-form/access-control-array-form.component.spec.ts b/src/app/shared/access-control-array-form/access-control-array-form.component.spec.ts new file mode 100644 index 0000000000..7c3ed06be1 --- /dev/null +++ b/src/app/shared/access-control-array-form/access-control-array-form.component.spec.ts @@ -0,0 +1,101 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { AccessControlArrayFormComponent, AccessControlItemValue } from './access-control-array-form.component'; +import { ReactiveFormsModule } from '@angular/forms'; +import { SharedBrowseByModule } from '../browse-by/shared-browse-by.module'; +import { CommonModule } from '@angular/common'; +import { TranslateModule } from '@ngx-translate/core'; +import { NgbDatepickerModule } from '@ng-bootstrap/ng-bootstrap'; +import { ControlMaxStartDatePipe } from './control-max-start-date.pipe'; +import { ControlMaxEndDatePipe } from './control-max-end-date.pipe'; +import { DebugElement } from '@angular/core'; +import { By } from '@angular/platform-browser'; + +fdescribe('AccessControlArrayFormComponent', () => { + let component: AccessControlArrayFormComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [ CommonModule, ReactiveFormsModule, SharedBrowseByModule, TranslateModule, NgbDatepickerModule ], + declarations: [ AccessControlArrayFormComponent, ControlMaxStartDatePipe, ControlMaxEndDatePipe ] + }) + .compileComponents(); + }); + + beforeEach(() => { + fixture = TestBed.createComponent(AccessControlArrayFormComponent); + component = fixture.componentInstance; + component.dropdownOptions = [{name: 'Option1'}, {name: 'Option2'}]; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); + + it('should have only one empty control access item in the form', () => { + const accessControlItems = fixture.debugElement.queryAll(By.css('[data-testId="access-control-item"]')); + expect(accessControlItems.length).toEqual(1); + }); + + it('should add access control item', () => { + component.addAccessControlItem(); + expect(component.accessControl.length).toEqual(2); + }); + + it('should remove access control item', () => { + component.removeAccessControlItem(0); + expect(component.accessControl.length).toEqual(0); + + component.addAccessControlItem(); + component.removeAccessControlItem(0); + expect(component.accessControl.length).toEqual(0); + }); + + it('should set access control item value', () => { + const item: AccessControlItemValue = { itemName: 'item1', startDate: '2022-01-01', endDate: '2022-02-01' }; + component.addAccessControlItem(item.itemName); + component.accessControl.controls[0].patchValue(item); + expect(component.form.value.accessControl[0]).toEqual(item); + }); + + it('should reset form value', () => { + const item: AccessControlItemValue = { itemName: 'item1', startDate: '2022-01-01', endDate: '2022-02-01' }; + component.addAccessControlItem(item.itemName); + component.accessControl.controls[1].patchValue(item); + component.reset(); + expect(component.form.value.accessControl[1].value).toEqual(undefined); + }); + + + it('should display a select dropdown with options', () => { + const selectElement: DebugElement = fixture.debugElement.query(By.css('select#accesscontroloption')); + expect(selectElement).toBeTruthy(); + + const options = selectElement.nativeElement.querySelectorAll('option'); + expect(options.length).toEqual(3); // 2 options + default empty option + + expect(options[0].value).toEqual(''); + expect(options[1].value).toEqual('Option1'); + expect(options[2].value).toEqual('Option2'); + }); + + it('should add new access control items when clicking "Add more" button', () => { + const addButton: DebugElement = fixture.debugElement.query(By.css('button#add-btn')); + addButton.nativeElement.click(); + fixture.detectChanges(); + + const accessControlItems = fixture.debugElement.queryAll(By.css('[data-testId="access-control-item"]')); + expect(accessControlItems.length).toEqual(2); + }); + + it('should remove access control items when clicking remove button', () => { + const removeButton: DebugElement = fixture.debugElement.query(By.css('button.btn-outline-danger')); + removeButton.nativeElement.click(); + fixture.detectChanges(); + + const accessControlItems = fixture.debugElement.queryAll(By.css('[data-testId="access-control-item"]')); + expect(accessControlItems.length).toEqual(0); + }); +}); diff --git a/src/app/shared/access-control-array-form/access-control-array-form.component.ts b/src/app/shared/access-control-array-form/access-control-array-form.component.ts new file mode 100644 index 0000000000..00ff52c695 --- /dev/null +++ b/src/app/shared/access-control-array-form/access-control-array-form.component.ts @@ -0,0 +1,88 @@ +import { Component, Input, NgModule, OnInit } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { FormArray, FormBuilder, ReactiveFormsModule } from '@angular/forms'; +import { SharedBrowseByModule } from '../browse-by/shared-browse-by.module'; +import { TranslateModule } from '@ngx-translate/core'; +import { NgbDatepickerModule } from '@ng-bootstrap/ng-bootstrap'; +import { ControlMaxStartDatePipe } from './control-max-start-date.pipe'; +import { ControlMaxEndDatePipe } from './control-max-end-date.pipe'; + +// type of the dropdown item that comes from backend +export interface AccessControlItem { + name: string + hasStartDate?: boolean + maxStartDate?: string + hasEndDate?: boolean + maxEndDate?: string +} + +// will be used on the form value +export interface AccessControlItemValue { + itemName: string | null; // item name + startDate?: string; + endDate?: string; +} + +export interface AccessControlArrayFormValue { + accessControl: AccessControlItemValue[]; +} + +@Component({ + selector: 'ds-access-control-array-form', + templateUrl: './access-control-array-form.component.html', + styleUrls: [ './access-control-array-form.component.scss' ] +}) +export class AccessControlArrayFormComponent implements OnInit { + @Input() dropdownOptions: AccessControlItem[] = []; + @Input() accessControlItems: AccessControlItemValue[] = []; + + form = this.fb.group({ + accessControl: this.fb.array([]) + }); + + constructor(private fb: FormBuilder) { + } + + ngOnInit(): void { + if (this.accessControlItems.length === 0) { + this.addAccessControlItem(); + } else { + for (const item of this.accessControlItems) { + this.addAccessControlItem(item.itemName); + } + } + } + + get accessControl() { + return this.form.get('accessControl') as FormArray; + } + + addAccessControlItem(itemName: string = null) { + this.accessControl.push(this.fb.group({ + itemName, + startDate: null, + endDate: null + })); + } + + removeAccessControlItem(index: number) { + this.accessControl.removeAt(index); + } + + getValue() { + return this.form.value; + } + + reset() { + this.accessControl.reset([]); + } + +} + +@NgModule({ + imports: [ CommonModule, ReactiveFormsModule, SharedBrowseByModule, TranslateModule, NgbDatepickerModule ], + declarations: [ AccessControlArrayFormComponent, ControlMaxStartDatePipe, ControlMaxEndDatePipe ], + exports: [ AccessControlArrayFormComponent ], +}) +export class AccessControlArrayFormModule { +} diff --git a/src/app/shared/access-control-array-form/control-max-end-date.pipe.ts b/src/app/shared/access-control-array-form/control-max-end-date.pipe.ts new file mode 100644 index 0000000000..0ddff2a042 --- /dev/null +++ b/src/app/shared/access-control-array-form/control-max-end-date.pipe.ts @@ -0,0 +1,26 @@ +import { Pipe, PipeTransform } from '@angular/core'; +import { AbstractControl } from '@angular/forms'; +import { NgbDateStruct } from '@ng-bootstrap/ng-bootstrap/datepicker/ngb-date-struct'; +import { AccessControlItem } from './access-control-array-form.component'; + +@Pipe({ + // eslint-disable-next-line @angular-eslint/pipe-prefix + name: 'maxEndDate', + pure: false +}) +export class ControlMaxEndDatePipe implements PipeTransform { + transform(control: AbstractControl, dropdownOptions: AccessControlItem[]): NgbDateStruct | null { + const { itemName } = control.value; + const item = dropdownOptions.find((x) => x.name === itemName); + if (!item?.hasEndDate) { + return null; + } + const date = new Date(item.maxEndDate); + return { + year: date.getFullYear(), + month: date.getMonth() + 1, + day: date.getDate() + } as NgbDateStruct; + } + +} diff --git a/src/app/shared/access-control-array-form/control-max-start-date.pipe.ts b/src/app/shared/access-control-array-form/control-max-start-date.pipe.ts new file mode 100644 index 0000000000..01a9607a16 --- /dev/null +++ b/src/app/shared/access-control-array-form/control-max-start-date.pipe.ts @@ -0,0 +1,26 @@ +import { Pipe, PipeTransform } from '@angular/core'; +import { AbstractControl } from '@angular/forms'; +import { NgbDateStruct } from '@ng-bootstrap/ng-bootstrap/datepicker/ngb-date-struct'; +import { AccessControlItem } from './access-control-array-form.component'; + +@Pipe({ + // eslint-disable-next-line @angular-eslint/pipe-prefix + name: 'maxStartDate', + pure: false +}) +export class ControlMaxStartDatePipe implements PipeTransform { + transform(control: AbstractControl, dropdownOptions: AccessControlItem[]): NgbDateStruct | null { + const { itemName } = control.value; + const item = dropdownOptions.find((x) => x.name === itemName); + if (!item?.hasStartDate) { + return null; + } + const date = new Date(item.maxStartDate); + return { + year: date.getFullYear(), + month: date.getMonth() + 1, + day: date.getDate() + } as NgbDateStruct; + } + +} From a94f729faa43a7291c7bea519c86e56d1744031b Mon Sep 17 00:00:00 2001 From: Yury Bondarenko Date: Fri, 28 Apr 2023 18:01:42 +0200 Subject: [PATCH 137/409] Lock webpack version to 5.76.1 This is a strict requirement of `@angular-devkit/build-angular` 15.2.5 Specifying the version as `@^5.0.0` causes multiple versions to be installed side by side, which leads to build issues. Adding this "exact version dependency" gets rid of the warning but does not change yarn.lock (because that same version was already being resolved) --- package.json | 1 + 1 file changed, 1 insertion(+) diff --git a/package.json b/package.json index 2118237c77..59766e993b 100644 --- a/package.json +++ b/package.json @@ -199,6 +199,7 @@ "sass-resources-loader": "^2.2.5", "ts-node": "^8.10.2", "typescript": "~4.8.4", + "webpack": "5.76.1", "webpack-bundle-analyzer": "^4.8.0", "webpack-cli": "^4.2.0", "webpack-dev-server": "^4.13.3" From d98e44185c756d84ea990000f8f16a8c79804b47 Mon Sep 17 00:00:00 2001 From: Yury Bondarenko Date: Fri, 28 Apr 2023 18:01:59 +0200 Subject: [PATCH 138/409] Update JavaScript target version --- tsconfig.server.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tsconfig.server.json b/tsconfig.server.json index d2fb2c9d40..c2f4c06a23 100644 --- a/tsconfig.server.json +++ b/tsconfig.server.json @@ -2,7 +2,7 @@ "extends": "./tsconfig.app.json", "compilerOptions": { "outDir": "./out-tsc/app-server", - "target": "es2016", + "target": "ES2022", "types": [ "node", "grecaptcha" From 2895cfe083a80eec58a5758bd5bd45af62e3bade Mon Sep 17 00:00:00 2001 From: Alisa Ismailati Date: Fri, 28 Apr 2023 18:03:52 +0200 Subject: [PATCH 139/409] [DURACOM-134] Administer workflow actions fixed --- ...m-admin-workflow-actions.component.spec.ts | 4 +- ...e-item-admin-workflow-actions.component.ts | 6 +- .../workflowitems-edit-page-routing-paths.ts | 7 +- ...ed-workspaceitems-delete-page.component.ts | 26 ++++ .../workspaceitems-delete-page.component.html | 24 ++++ .../workspaceitems-delete-page.component.scss | 4 + ...rkspaceitems-delete-page.component.spec.ts | 110 +++++++++++++++++ .../workspaceitems-delete-page.component.ts | 111 ++++++++++++++++++ ...workspaceitems-edit-page-routing.module.ts | 24 +++- .../workspaceitems-edit-page.module.ts | 7 +- src/assets/i18n/en.json5 | 16 ++- .../workspace-items-delete.component.html | 0 .../workspace-items-delete.component.scss | 0 .../workspace-items-delete.component.ts | 10 ++ src/themes/custom/lazy-theme.module.ts | 2 + 15 files changed, 342 insertions(+), 9 deletions(-) create mode 100644 src/app/workspaceitems-edit-page/workspaceitems-delete-page/themed-workspaceitems-delete-page.component.ts create mode 100644 src/app/workspaceitems-edit-page/workspaceitems-delete-page/workspaceitems-delete-page.component.html create mode 100644 src/app/workspaceitems-edit-page/workspaceitems-delete-page/workspaceitems-delete-page.component.scss create mode 100644 src/app/workspaceitems-edit-page/workspaceitems-delete-page/workspaceitems-delete-page.component.spec.ts create mode 100644 src/app/workspaceitems-edit-page/workspaceitems-delete-page/workspaceitems-delete-page.component.ts create mode 100644 src/themes/custom/app/workspace-items-delete-page/workspace-items-delete/workspace-items-delete.component.html create mode 100644 src/themes/custom/app/workspace-items-delete-page/workspace-items-delete/workspace-items-delete.component.scss create mode 100644 src/themes/custom/app/workspace-items-delete-page/workspace-items-delete/workspace-items-delete.component.ts diff --git a/src/app/admin/admin-workflow-page/admin-workflow-search-results/actions/workspace-item/workspace-item-admin-workflow-actions.component.spec.ts b/src/app/admin/admin-workflow-page/admin-workflow-search-results/actions/workspace-item/workspace-item-admin-workflow-actions.component.spec.ts index 628fc3f89c..a8f0581ec0 100644 --- a/src/app/admin/admin-workflow-page/admin-workflow-search-results/actions/workspace-item/workspace-item-admin-workflow-actions.component.spec.ts +++ b/src/app/admin/admin-workflow-page/admin-workflow-search-results/actions/workspace-item/workspace-item-admin-workflow-actions.component.spec.ts @@ -11,7 +11,7 @@ import { URLCombiner } from '../../../../../core/url-combiner/url-combiner'; import { WorkspaceItemAdminWorkflowActionsComponent } from './workspace-item-admin-workflow-actions.component'; import { WorkspaceItem } from '../../../../../core/submission/models/workspaceitem.model'; import { - getWorkflowItemDeleteRoute, + getWorkspaceItemDeleteRoute, } from '../../../../../workflowitems-edit-page/workflowitems-edit-page-routing-paths'; import { Item } from '../../../../../core/shared/item.model'; import { RemoteData } from '../../../../../core/data/remote-data'; @@ -83,7 +83,7 @@ describe('WorkspaceItemAdminWorkflowActionsComponent', () => { it('should render a delete button with the correct link', () => { const button = fixture.debugElement.query(By.css('a.delete-link')); const link = button.nativeElement.href; - expect(link).toContain(new URLCombiner(getWorkflowItemDeleteRoute(wsi.id)).toString()); + expect(link).toContain(new URLCombiner(getWorkspaceItemDeleteRoute(wsi.id)).toString()); }); it('should render a policies button with the correct link', () => { diff --git a/src/app/admin/admin-workflow-page/admin-workflow-search-results/actions/workspace-item/workspace-item-admin-workflow-actions.component.ts b/src/app/admin/admin-workflow-page/admin-workflow-search-results/actions/workspace-item/workspace-item-admin-workflow-actions.component.ts index adbd421628..36678460da 100644 --- a/src/app/admin/admin-workflow-page/admin-workflow-search-results/actions/workspace-item/workspace-item-admin-workflow-actions.component.ts +++ b/src/app/admin/admin-workflow-page/admin-workflow-search-results/actions/workspace-item/workspace-item-admin-workflow-actions.component.ts @@ -11,7 +11,7 @@ import { SupervisionOrderGroupSelectorComponent } from './supervision-order-group-selector/supervision-order-group-selector.component'; import { - getWorkflowItemDeleteRoute + getWorkspaceItemDeleteRoute } from '../../../../../workflowitems-edit-page/workflowitems-edit-page-routing-paths'; import { ITEM_EDIT_AUTHORIZATIONS_PATH } from '../../../../../item-page/edit-item-page/edit-item-page.routing-paths'; import { WorkspaceItem } from '../../../../../core/submission/models/workspaceitem.model'; @@ -105,10 +105,10 @@ export class WorkspaceItemAdminWorkflowActionsComponent implements OnInit { } /** - * Returns the path to the delete page of this workflow item + * Returns the path to the delete page of this workspace item */ getDeleteRoute(): string { - return getWorkflowItemDeleteRoute(this.wsi.id); + return getWorkspaceItemDeleteRoute(this.wsi.id); } /** diff --git a/src/app/workflowitems-edit-page/workflowitems-edit-page-routing-paths.ts b/src/app/workflowitems-edit-page/workflowitems-edit-page-routing-paths.ts index ece61f0321..326eebe4a7 100644 --- a/src/app/workflowitems-edit-page/workflowitems-edit-page-routing-paths.ts +++ b/src/app/workflowitems-edit-page/workflowitems-edit-page-routing-paths.ts @@ -1,5 +1,5 @@ import { URLCombiner } from '../core/url-combiner/url-combiner'; -import { getWorkflowItemModuleRoute } from '../app-routing-paths'; +import { getWorkflowItemModuleRoute, getWorkspaceItemModuleRoute } from '../app-routing-paths'; export function getWorkflowItemPageRoute(wfiId: string) { return new URLCombiner(getWorkflowItemModuleRoute(), wfiId).toString(); @@ -24,8 +24,13 @@ export function getAdvancedWorkflowRoute(wfiId: string) { return new URLCombiner(getWorkflowItemModuleRoute(), wfiId, ADVANCED_WORKFLOW_PATH).toString(); } +export function getWorkspaceItemDeleteRoute(wsiId: string) { + return new URLCombiner(getWorkspaceItemModuleRoute(), wsiId, WORKSPACE_ITEM_DELETE_PATH).toString(); +} + export const WORKFLOW_ITEM_EDIT_PATH = 'edit'; export const WORKFLOW_ITEM_DELETE_PATH = 'delete'; export const WORKFLOW_ITEM_VIEW_PATH = 'view'; export const WORKFLOW_ITEM_SEND_BACK_PATH = 'sendback'; export const ADVANCED_WORKFLOW_PATH = 'advanced'; +export const WORKSPACE_ITEM_DELETE_PATH = 'delete'; diff --git a/src/app/workspaceitems-edit-page/workspaceitems-delete-page/themed-workspaceitems-delete-page.component.ts b/src/app/workspaceitems-edit-page/workspaceitems-delete-page/themed-workspaceitems-delete-page.component.ts new file mode 100644 index 0000000000..681cba21c8 --- /dev/null +++ b/src/app/workspaceitems-edit-page/workspaceitems-delete-page/themed-workspaceitems-delete-page.component.ts @@ -0,0 +1,26 @@ +import { ThemedComponent } from '../../shared/theme-support/themed.component'; +import { Component } from '@angular/core'; +import { WorkspaceItemsDeletePageComponent } from './workspaceitems-delete-page.component'; + +/** + * Themed wrapper for WorkspaceItemsDeletePageComponent + */ + +@Component({ + selector: 'ds-themed-workspace-items-delete', + styleUrls: [], + templateUrl: './../../shared/theme-support/themed.component.html' +}) +export class ThemedWorkspaceItemsDeletePageComponent extends ThemedComponent { + protected getComponentName(): string { + return 'WorkspaceItemsDeletePageComponent'; + } + + protected importThemedComponent(themeName: string): Promise { + return import(`../../../themes/${themeName}/app/workflowitems-edit-page/workflow-item-delete/workflow-item-delete.component`); + } + + protected importUnthemedComponent(): Promise { + return import(`./workspaceitems-delete-page.component`); + } +} diff --git a/src/app/workspaceitems-edit-page/workspaceitems-delete-page/workspaceitems-delete-page.component.html b/src/app/workspaceitems-edit-page/workspaceitems-delete-page/workspaceitems-delete-page.component.html new file mode 100644 index 0000000000..a0f0a1711e --- /dev/null +++ b/src/app/workspaceitems-edit-page/workspaceitems-delete-page/workspaceitems-delete-page.component.html @@ -0,0 +1,24 @@ +
+

{{ 'workspace-item.delete.header' | translate }}

+ + + +
+ + + + + + diff --git a/src/app/workspaceitems-edit-page/workspaceitems-delete-page/workspaceitems-delete-page.component.scss b/src/app/workspaceitems-edit-page/workspaceitems-delete-page/workspaceitems-delete-page.component.scss new file mode 100644 index 0000000000..e52175abea --- /dev/null +++ b/src/app/workspaceitems-edit-page/workspaceitems-delete-page/workspaceitems-delete-page.component.scss @@ -0,0 +1,4 @@ + +:host ::ng-deep ds-modify-item-overview table { + display: inline-table !important; +} diff --git a/src/app/workspaceitems-edit-page/workspaceitems-delete-page/workspaceitems-delete-page.component.spec.ts b/src/app/workspaceitems-edit-page/workspaceitems-delete-page/workspaceitems-delete-page.component.spec.ts new file mode 100644 index 0000000000..f52dd497d8 --- /dev/null +++ b/src/app/workspaceitems-edit-page/workspaceitems-delete-page/workspaceitems-delete-page.component.spec.ts @@ -0,0 +1,110 @@ +import { RouteService } from '../..//core/services/route.service'; +import { NotificationsService } from '../..//shared/notifications/notifications.service'; +import { WorkspaceitemDataService } from '../..//core/submission/workspaceitem-data.service'; +import { RouterMock } from './../../shared/mocks/router.mock'; +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { WorkspaceItemsDeletePageComponent } from './workspaceitems-delete-page.component'; +import { ActivatedRoute, Router } from '@angular/router'; +import { NgbModal } from '@ng-bootstrap/ng-bootstrap'; +import { TranslateModule, TranslateService } from '@ngx-translate/core'; +import { NotificationsServiceStub } from '../../shared/testing/notifications-service.stub'; +import { EventEmitter, NO_ERRORS_SCHEMA } from '@angular/core'; +import { Location } from '@angular/common'; +import { of as observableOf } from 'rxjs'; +import { routeServiceStub } from '../../shared/testing/route-service.stub'; +import { LocationStub } from '../../shared/testing/location.stub'; +import { By } from '@angular/platform-browser'; +import { ActivatedRouteStub } from 'src/app/shared/testing/active-router.stub'; +import { createSuccessfulRemoteDataObject } from 'src/app/shared/remote-data.utils'; +import { WorkspaceItem } from 'src/app/core/submission/models/workspaceitem.model'; +import { DSpaceObject } from 'src/app/core/shared/dspace-object.model'; + +describe('WorkspaceitemsDeletePageComponent', () => { + let component: WorkspaceItemsDeletePageComponent; + let fixture: ComponentFixture; + + const workspaceitemDataServiceSpy = jasmine.createSpyObj('WorkspaceitemDataService', { + delete: jasmine.createSpy('delete') + }); + + const wsi = new WorkspaceItem(); + wsi.id = '1234'; + const dso = new DSpaceObject(); + dso.uuid = '1234'; + + const translateServiceStub = { + get: () => observableOf('test-message'), + onLangChange: new EventEmitter(), + onTranslationChange: new EventEmitter(), + onDefaultLangChange: new EventEmitter() + }; + + const modalService = { + open: () => {/** empty */}, + }; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [TranslateModule.forRoot()], + declarations: [WorkspaceItemsDeletePageComponent], + providers: [ + { + provide: ActivatedRoute, + useValue: new ActivatedRouteStub( + {}, + { + wsi: createSuccessfulRemoteDataObject(wsi), + dso: createSuccessfulRemoteDataObject(dso), + } + ), + }, + { provide: Router, useValue: new RouterMock() }, + { + provide: WorkspaceitemDataService, + useValue: workspaceitemDataServiceSpy, + }, + { provide: Location, useValue: new LocationStub() }, + { provide: NgbModal, useValue: modalService }, + { + provide: NotificationsService, + useValue: new NotificationsServiceStub(), + }, + { provide: TranslateService, useValue: translateServiceStub }, + { provide: RouteService, useValue: routeServiceStub }, + ], + schemas: [NO_ERRORS_SCHEMA], + }).compileComponents(); + }); + + beforeEach(() => { + fixture = TestBed.createComponent(WorkspaceItemsDeletePageComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); + + it('should have the current WorkspaceItem', () => { + console.log( (component as any).activatedRoute, 'data wsi'); + (component as any).activatedRoute.data.subscribe((data) => { + console.log(data, 'dataaa'); + expect(data.wsi.payload.id).toEqual('1234'); + }); + }); + + it('should delete the target workspace item', () => { + spyOn((component as any).modalService, 'open').and.returnValue({}); + component.confirmDelete(By.css('#delete-modal')); + fixture.detectChanges(); + expect((component as any).modalService.open).toHaveBeenCalled(); + }); + + it('should call workspaceItemService.delete', () => { + spyOn(workspaceitemDataServiceSpy, 'delete').and.returnValue(observableOf(createSuccessfulRemoteDataObject({}))); + component.sendDeleteRequest(); + expect((component as any).workspaceItemService.delete).toHaveBeenCalledWith('1234'); + }); +}); diff --git a/src/app/workspaceitems-edit-page/workspaceitems-delete-page/workspaceitems-delete-page.component.ts b/src/app/workspaceitems-edit-page/workspaceitems-delete-page/workspaceitems-delete-page.component.ts new file mode 100644 index 0000000000..cff5fd6994 --- /dev/null +++ b/src/app/workspaceitems-edit-page/workspaceitems-delete-page/workspaceitems-delete-page.component.ts @@ -0,0 +1,111 @@ +import { NotificationsService } from 'src/app/shared/notifications/notifications.service'; +import { NoContent } from './../../core/shared/NoContent.model'; +import { RouteService } from 'src/app/core/services/route.service'; +import { getFirstCompletedRemoteData, getRemoteDataPayload } from './../../core/shared/operators'; +import { RemoteData } from 'src/app/core/data/remote-data'; +import { Component, OnInit } from '@angular/core'; +import { WorkspaceItem } from '../../core/submission/models/workspaceitem.model'; +import { Observable, map, switchMap, take } from 'rxjs'; +import { ActivatedRoute, Data, Params, Router } from '@angular/router'; +import { Location } from '@angular/common'; +import { WorkspaceitemDataService } from 'src/app/core/submission/workspaceitem-data.service'; +import { TranslateService } from '@ngx-translate/core'; +import { NgbModal } from '@ng-bootstrap/ng-bootstrap'; +import { DSpaceObject } from 'src/app/core/shared/dspace-object.model'; + +@Component({ + selector: 'ds-workspaceitems-delete-page', + templateUrl: './workspaceitems-delete-page.component.html', + styleUrls: ['./workspaceitems-delete-page.component.scss'] +}) +export class WorkspaceItemsDeletePageComponent implements OnInit { + + /** + * The workspaceitem to delete + */ + public wsi$: Observable; + + /** + * The dspace object + */ + public dso$: Observable; + + /** + * The previous query parameters + */ + private previousQueryParameters?: Params; + + constructor( + private activatedRoute: ActivatedRoute, + private router: Router, + private routeService: RouteService, + private workspaceItemService: WorkspaceitemDataService, + private notificationsService: NotificationsService, + private translationService: TranslateService, + private location: Location, + private modalService: NgbModal, + ) { } + + ngOnInit(): void { + this.wsi$ = this.activatedRoute.data.pipe(map((data: Data) => data.wsi as RemoteData), getRemoteDataPayload()); + this.dso$ = this.activatedRoute.data.pipe(map((data: Data) => data.dso as RemoteData), getRemoteDataPayload()); + this.previousQueryParameters = (this.location.getState() as { [key: string]: any }).previousQueryParams; + } + + /** + * Navigates to the previous url + * If there's not previous url, it continues to the mydspace page instead + */ + previousPage() { + this.routeService.getPreviousUrl().pipe(take(1)) + .subscribe((url: string) => { + let params: Params = {}; + if (!url) { + url = '/mydspace'; + params = this.previousQueryParameters; + } + if (url.split('?').length > 1) { + for (const param of url.split('?')[1].split('&')) { + params[param.split('=')[0]] = decodeURIComponent(param.split('=')[1]); + } + } + void this.router.navigate([url.split('?')[0]], { queryParams: params }); + } + ); + } + + /** + * Open the modal to confirm the deletion of the workspaceitem + */ + public async confirmDelete(content) { + await this.modalService.open(content).result.then( + (result) => { + if (result === 'ok') { + this.sendDeleteRequest(); + } + } + ); + } + + /** + * Delete the target workspaceitem object + */ + sendDeleteRequest() { + this.wsi$.pipe( + switchMap((wsi: WorkspaceItem) => this.workspaceItemService.delete(wsi.id).pipe( + getFirstCompletedRemoteData(), + )) + ).subscribe((response: RemoteData) => { + if (response.hasSucceeded) { + const title = this.translationService.get('workspace-item.delete.notification.success.title'); + const content = this.translationService.get('workspace-item.delete.title'); + this.notificationsService.success(title, content); + this.previousPage(); + } else { + const title = this.translationService.get('workspace-item.delete.notification.error.title'); + const content = this.translationService.get('workspace-item.delete.notification.error.content'); + this.notificationsService.error(title, content); + } + }); + } +} diff --git a/src/app/workspaceitems-edit-page/workspaceitems-edit-page-routing.module.ts b/src/app/workspaceitems-edit-page/workspaceitems-edit-page-routing.module.ts index cc76634c03..61393d9f64 100644 --- a/src/app/workspaceitems-edit-page/workspaceitems-edit-page-routing.module.ts +++ b/src/app/workspaceitems-edit-page/workspaceitems-edit-page-routing.module.ts @@ -7,6 +7,8 @@ import { I18nBreadcrumbResolver } from '../core/breadcrumbs/i18n-breadcrumb.reso import { ThemedFullItemPageComponent } from '../item-page/full/themed-full-item-page.component'; import { ItemFromWorkspaceResolver } from './item-from-workspace.resolver'; import { WorkspaceItemPageResolver } from './workspace-item-page.resolver'; +import { WorkspaceItemsDeletePageComponent } from './workspaceitems-delete-page/workspaceitems-delete-page.component'; +import { ThemedWorkspaceItemsDeletePageComponent } from './workspaceitems-delete-page/themed-workspaceitems-delete-page.component'; @NgModule({ imports: [ @@ -34,7 +36,27 @@ import { WorkspaceItemPageResolver } from './workspace-item-page.resolver'; breadcrumb: I18nBreadcrumbResolver }, data: { title: 'workspace-item.view.title', breadcrumbKey: 'workspace-item.view' } - } + }, + { + canActivate: [AuthenticatedGuard], + path: 'delete', + component: WorkspaceItemsDeletePageComponent, + resolve: { + dso: ItemFromWorkspaceResolver, + breadcrumb: I18nBreadcrumbResolver + }, + data: { title: 'workspace-item.delete', breadcrumbKey: 'workspace-item.delete' } + }, + { + canActivate: [AuthenticatedGuard], + path: 'delete', + component: ThemedWorkspaceItemsDeletePageComponent, + resolve: { + dso: ItemFromWorkspaceResolver, + breadcrumb: I18nBreadcrumbResolver + }, + data: { title: 'workspace-item.delete', breadcrumbKey: 'workspace-item.delete' } + }, ] } ]) diff --git a/src/app/workspaceitems-edit-page/workspaceitems-edit-page.module.ts b/src/app/workspaceitems-edit-page/workspaceitems-edit-page.module.ts index 65a40f3f7c..77cb7a6e66 100644 --- a/src/app/workspaceitems-edit-page/workspaceitems-edit-page.module.ts +++ b/src/app/workspaceitems-edit-page/workspaceitems-edit-page.module.ts @@ -3,6 +3,8 @@ import { NgModule } from '@angular/core'; import { SharedModule } from '../shared/shared.module'; import { WorkspaceitemsEditPageRoutingModule } from './workspaceitems-edit-page-routing.module'; import { SubmissionModule } from '../submission/submission.module'; +import { WorkspaceItemsDeletePageComponent } from './workspaceitems-delete-page/workspaceitems-delete-page.component'; +import { ThemedWorkspaceItemsDeletePageComponent } from './workspaceitems-delete-page/themed-workspaceitems-delete-page.component'; @NgModule({ imports: [ @@ -11,7 +13,10 @@ import { SubmissionModule } from '../submission/submission.module'; SharedModule, SubmissionModule, ], - declarations: [] + declarations: [ + WorkspaceItemsDeletePageComponent, + ThemedWorkspaceItemsDeletePageComponent, + ] }) /** * This module handles all modules that need to access the workspaceitems edit page. diff --git a/src/assets/i18n/en.json5 b/src/assets/i18n/en.json5 index 66824e56b3..f493abbe87 100644 --- a/src/assets/i18n/en.json5 +++ b/src/assets/i18n/en.json5 @@ -4959,10 +4959,24 @@ "workspace-item.view.title": "Workspace View", + "workspace-item.delete.breadcrumbs": "Workspace Delete", + + "workspace-item.delete.header": "Delete workspace item", + + "workspace-item.delete.button.confirm": "Delete", + + "workspace-item.delete.button.cancel": "Cancel", + + "workspace-item.delete.notification.success.title": "Deleted", + + "workspace-item.delete.title": "This workspace item was successfully deleted", + + "workspace-item.delete.notification.error.title": "Something went wrong", + + "workspace-item.delete.notification.error.content": "The workspace item could not be deleted", "workflow-item.advanced.title": "Advanced workflow", - "workflow-item.selectrevieweraction.notification.success.title": "Selected reviewer", "workflow-item.selectrevieweraction.notification.success.content": "The reviewer for this workflow item has been successfully selected", diff --git a/src/themes/custom/app/workspace-items-delete-page/workspace-items-delete/workspace-items-delete.component.html b/src/themes/custom/app/workspace-items-delete-page/workspace-items-delete/workspace-items-delete.component.html new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/themes/custom/app/workspace-items-delete-page/workspace-items-delete/workspace-items-delete.component.scss b/src/themes/custom/app/workspace-items-delete-page/workspace-items-delete/workspace-items-delete.component.scss new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/themes/custom/app/workspace-items-delete-page/workspace-items-delete/workspace-items-delete.component.ts b/src/themes/custom/app/workspace-items-delete-page/workspace-items-delete/workspace-items-delete.component.ts new file mode 100644 index 0000000000..95494d76dd --- /dev/null +++ b/src/themes/custom/app/workspace-items-delete-page/workspace-items-delete/workspace-items-delete.component.ts @@ -0,0 +1,10 @@ +import { Component } from '@angular/core'; +import { WorkspaceItemsDeletePageComponent as BaseComponent } from '../../../../../app/workspaceitems-edit-page/workspaceitems-delete-page/workspaceitems-delete-page.component'; + + +@Component({ + selector: 'ds-workspaceitems-delete-page', + templateUrl: '../../../../../app/workspaceitems-edit-page/workspaceitems-delete-page/workspaceitems-delete-page.component.html', +}) +export class WorkspaceItemsDeletePageComponent extends BaseComponent { +} diff --git a/src/themes/custom/lazy-theme.module.ts b/src/themes/custom/lazy-theme.module.ts index b1290cc634..4297d8a024 100644 --- a/src/themes/custom/lazy-theme.module.ts +++ b/src/themes/custom/lazy-theme.module.ts @@ -145,6 +145,7 @@ import { MediaViewerVideoComponent } from './app/item-page/media-viewer/media-viewer-video/media-viewer-video.component'; import { NgxGalleryModule } from '@kolkov/ngx-gallery'; +import { WorkspaceItemsDeletePageComponent } from './app/workspace-items-delete-page/workspace-items-delete/workspace-items-delete.component'; const DECLARATIONS = [ FileSectionComponent, @@ -212,6 +213,7 @@ const DECLARATIONS = [ MediaViewerComponent, MediaViewerImageComponent, MediaViewerVideoComponent, + WorkspaceItemsDeletePageComponent, ]; @NgModule({ From ef9c42804c0acccbde460e0be9a26597519c99c8 Mon Sep 17 00:00:00 2001 From: Alexandre Vryghem Date: Sun, 30 Apr 2023 13:19:00 +0100 Subject: [PATCH 140/409] Fixed --ds-header-icon-color & --ds-header-icon-color-hover not being applied to all header icons --- src/app/header/header.component.scss | 11 +++++------ src/app/search-navbar/search-navbar.component.scss | 1 + .../shared/auth-nav-menu/auth-nav-menu.component.html | 4 ++-- .../shared/auth-nav-menu/auth-nav-menu.component.scss | 2 +- .../auth-nav-menu/auth-nav-menu.component.spec.ts | 2 +- src/themes/dspace/app/header/header.component.html | 2 +- src/themes/dspace/app/header/header.component.scss | 9 ++++++++- src/themes/dspace/app/navbar/navbar.component.scss | 1 - 8 files changed, 19 insertions(+), 13 deletions(-) diff --git a/src/app/header/header.component.scss b/src/app/header/header.component.scss index 546f6a06fa..cca3ed2abb 100644 --- a/src/app/header/header.component.scss +++ b/src/app/header/header.component.scss @@ -11,13 +11,12 @@ line-height: 1.5; } -.navbar ::ng-deep { - a { - color: var(--ds-header-icon-color); +.navbar-toggler { + border: none; + color: var(--ds-header-icon-color); - &:hover, &:focus { - color: var(--ds-header-icon-color-hover); - } + &:hover, &:focus { + color: var(--ds-header-icon-color-hover); } } diff --git a/src/app/search-navbar/search-navbar.component.scss b/src/app/search-navbar/search-navbar.component.scss index d5f3d8d615..4cfb0cb1eb 100644 --- a/src/app/search-navbar/search-navbar.component.scss +++ b/src/app/search-navbar/search-navbar.component.scss @@ -1,6 +1,7 @@ input[type="text"] { margin-top: calc(-0.5 * var(--bs-font-size-base)); background-color: #fff !important; + border-color: var(--ds-header-icon-color); &.collapsed { opacity: 0; diff --git a/src/app/shared/auth-nav-menu/auth-nav-menu.component.html b/src/app/shared/auth-nav-menu/auth-nav-menu.component.html index 94cbd4368a..05f502afa1 100644 --- a/src/app/shared/auth-nav-menu/auth-nav-menu.component.html +++ b/src/app/shared/auth-nav-menu/auth-nav-menu.component.html @@ -19,7 +19,7 @@
- + diff --git a/src/themes/dspace/app/header/header.component.scss b/src/themes/dspace/app/header/header.component.scss index ab418865f1..2fc857826f 100644 --- a/src/themes/dspace/app/header/header.component.scss +++ b/src/themes/dspace/app/header/header.component.scss @@ -15,5 +15,12 @@ .navbar-toggler .navbar-toggler-icon { background-image: none !important; line-height: 1.5; - color: var(--bs-link-color); +} + +.navbar-toggler { + color: var(--ds-header-icon-color); + + &:hover, &:focus { + color: var(--ds-header-icon-color-hover); + } } diff --git a/src/themes/dspace/app/navbar/navbar.component.scss b/src/themes/dspace/app/navbar/navbar.component.scss index 9079470b94..d3aea9f078 100644 --- a/src/themes/dspace/app/navbar/navbar.component.scss +++ b/src/themes/dspace/app/navbar/navbar.component.scss @@ -2,7 +2,6 @@ nav.navbar { border-top: 1px var(--ds-header-navbar-border-top-color) solid; border-bottom: 5px var(--ds-header-navbar-border-bottom-color) solid; align-items: baseline; - color: var(--ds-header-icon-color); } /** Mobile menu styling **/ From c042a5cf1a1a6abe1a0afb812e47af741371465f Mon Sep 17 00:00:00 2001 From: Alexandre Vryghem Date: Mon, 1 May 2023 11:49:16 +0200 Subject: [PATCH 141/409] Fixed mobile nav not opening/displaying correctly --- .../header-navbar-wrapper.component.scss | 9 +++------ .../themed-header-navbar-wrapper.component.scss | 3 --- .../header-navbar-wrapper.component.ts | 2 +- 3 files changed, 4 insertions(+), 10 deletions(-) delete mode 100644 src/app/header-nav-wrapper/themed-header-navbar-wrapper.component.scss diff --git a/src/app/header-nav-wrapper/header-navbar-wrapper.component.scss b/src/app/header-nav-wrapper/header-navbar-wrapper.component.scss index b297979fd0..b02b3c378c 100644 --- a/src/app/header-nav-wrapper/header-navbar-wrapper.component.scss +++ b/src/app/header-nav-wrapper/header-navbar-wrapper.component.scss @@ -1,7 +1,4 @@ -@media screen and (max-width: map-get($grid-breakpoints, md)) { - :host.open { - background-color: var(--bs-white); - top: 0; - position: sticky; - } +:host { + position: relative; + z-index: var(--ds-nav-z-index); } diff --git a/src/app/header-nav-wrapper/themed-header-navbar-wrapper.component.scss b/src/app/header-nav-wrapper/themed-header-navbar-wrapper.component.scss deleted file mode 100644 index db392096aa..0000000000 --- a/src/app/header-nav-wrapper/themed-header-navbar-wrapper.component.scss +++ /dev/null @@ -1,3 +0,0 @@ -:host { - z-index: var(--ds-nav-z-index); -} diff --git a/src/themes/dspace/app/header-nav-wrapper/header-navbar-wrapper.component.ts b/src/themes/dspace/app/header-nav-wrapper/header-navbar-wrapper.component.ts index 36e23e174a..57ade022ae 100644 --- a/src/themes/dspace/app/header-nav-wrapper/header-navbar-wrapper.component.ts +++ b/src/themes/dspace/app/header-nav-wrapper/header-navbar-wrapper.component.ts @@ -6,7 +6,7 @@ import { HeaderNavbarWrapperComponent as BaseComponent } from '../../../../app/h */ @Component({ selector: 'ds-header-navbar-wrapper', - styleUrls: ['header-navbar-wrapper.component.scss'], + styleUrls: ['../../../../app/header-nav-wrapper/header-navbar-wrapper.component.scss'], templateUrl: 'header-navbar-wrapper.component.html', }) export class HeaderNavbarWrapperComponent extends BaseComponent { From 6b9f6bf7672280f6f906f0825ad55bdb5089deed Mon Sep 17 00:00:00 2001 From: Giuseppe Digilio Date: Tue, 2 May 2023 15:49:41 +0200 Subject: [PATCH 142/409] [DURACOM-134] Fix import paths --- .../workspaceitems-delete-page.component.spec.ts | 16 ++++++++-------- .../workspaceitems-delete-page.component.ts | 16 ++++++++-------- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/src/app/workspaceitems-edit-page/workspaceitems-delete-page/workspaceitems-delete-page.component.spec.ts b/src/app/workspaceitems-edit-page/workspaceitems-delete-page/workspaceitems-delete-page.component.spec.ts index f52dd497d8..fc0bef83f0 100644 --- a/src/app/workspaceitems-edit-page/workspaceitems-delete-page/workspaceitems-delete-page.component.spec.ts +++ b/src/app/workspaceitems-edit-page/workspaceitems-delete-page/workspaceitems-delete-page.component.spec.ts @@ -1,7 +1,7 @@ -import { RouteService } from '../..//core/services/route.service'; -import { NotificationsService } from '../..//shared/notifications/notifications.service'; -import { WorkspaceitemDataService } from '../..//core/submission/workspaceitem-data.service'; -import { RouterMock } from './../../shared/mocks/router.mock'; +import { RouteService } from '../../core/services/route.service'; +import { NotificationsService } from '../../shared/notifications/notifications.service'; +import { WorkspaceitemDataService } from '../../core/submission/workspaceitem-data.service'; +import { RouterMock } from '../../shared/mocks/router.mock'; import { ComponentFixture, TestBed } from '@angular/core/testing'; import { WorkspaceItemsDeletePageComponent } from './workspaceitems-delete-page.component'; @@ -15,10 +15,10 @@ import { of as observableOf } from 'rxjs'; import { routeServiceStub } from '../../shared/testing/route-service.stub'; import { LocationStub } from '../../shared/testing/location.stub'; import { By } from '@angular/platform-browser'; -import { ActivatedRouteStub } from 'src/app/shared/testing/active-router.stub'; -import { createSuccessfulRemoteDataObject } from 'src/app/shared/remote-data.utils'; -import { WorkspaceItem } from 'src/app/core/submission/models/workspaceitem.model'; -import { DSpaceObject } from 'src/app/core/shared/dspace-object.model'; +import { ActivatedRouteStub } from '../../shared/testing/active-router.stub'; +import { createSuccessfulRemoteDataObject } from '../../shared/remote-data.utils'; +import { WorkspaceItem } from '../../core/submission/models/workspaceitem.model'; +import { DSpaceObject } from '../../core/shared/dspace-object.model'; describe('WorkspaceitemsDeletePageComponent', () => { let component: WorkspaceItemsDeletePageComponent; diff --git a/src/app/workspaceitems-edit-page/workspaceitems-delete-page/workspaceitems-delete-page.component.ts b/src/app/workspaceitems-edit-page/workspaceitems-delete-page/workspaceitems-delete-page.component.ts index cff5fd6994..77ed0519d6 100644 --- a/src/app/workspaceitems-edit-page/workspaceitems-delete-page/workspaceitems-delete-page.component.ts +++ b/src/app/workspaceitems-edit-page/workspaceitems-delete-page/workspaceitems-delete-page.component.ts @@ -1,17 +1,17 @@ -import { NotificationsService } from 'src/app/shared/notifications/notifications.service'; -import { NoContent } from './../../core/shared/NoContent.model'; -import { RouteService } from 'src/app/core/services/route.service'; -import { getFirstCompletedRemoteData, getRemoteDataPayload } from './../../core/shared/operators'; -import { RemoteData } from 'src/app/core/data/remote-data'; +import { NotificationsService } from '../../shared/notifications/notifications.service'; +import { NoContent } from '../../core/shared/NoContent.model'; +import { RouteService } from '../../core/services/route.service'; +import { getFirstCompletedRemoteData, getRemoteDataPayload } from '../../core/shared/operators'; +import { RemoteData } from '../../core/data/remote-data'; import { Component, OnInit } from '@angular/core'; import { WorkspaceItem } from '../../core/submission/models/workspaceitem.model'; -import { Observable, map, switchMap, take } from 'rxjs'; +import { map, Observable, switchMap, take } from 'rxjs'; import { ActivatedRoute, Data, Params, Router } from '@angular/router'; import { Location } from '@angular/common'; -import { WorkspaceitemDataService } from 'src/app/core/submission/workspaceitem-data.service'; +import { WorkspaceitemDataService } from '../../core/submission/workspaceitem-data.service'; import { TranslateService } from '@ngx-translate/core'; import { NgbModal } from '@ng-bootstrap/ng-bootstrap'; -import { DSpaceObject } from 'src/app/core/shared/dspace-object.model'; +import { DSpaceObject } from '../../core/shared/dspace-object.model'; @Component({ selector: 'ds-workspaceitems-delete-page', From 983769cf5991753748352689869c573d2e343486 Mon Sep 17 00:00:00 2001 From: Giuseppe Digilio Date: Tue, 2 May 2023 15:52:24 +0200 Subject: [PATCH 143/409] [DURACOM-133] Fix import paths --- .../workspaceitem/workspaceitem-actions.component.spec.ts | 2 +- .../workspaceitem/workspaceitem-actions.component.ts | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/app/shared/mydspace-actions/workspaceitem/workspaceitem-actions.component.spec.ts b/src/app/shared/mydspace-actions/workspaceitem/workspaceitem-actions.component.spec.ts index f786782c05..1072d088a4 100644 --- a/src/app/shared/mydspace-actions/workspaceitem/workspaceitem-actions.component.spec.ts +++ b/src/app/shared/mydspace-actions/workspaceitem/workspaceitem-actions.component.spec.ts @@ -1,4 +1,4 @@ -import { EPerson } from './../../../core/eperson/models/eperson.model'; +import { EPerson } from '../../../core/eperson/models/eperson.model'; import { ChangeDetectionStrategy, Injector, NO_ERRORS_SCHEMA } from '@angular/core'; import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; import { Router } from '@angular/router'; diff --git a/src/app/shared/mydspace-actions/workspaceitem/workspaceitem-actions.component.ts b/src/app/shared/mydspace-actions/workspaceitem/workspaceitem-actions.component.ts index d758ef1bb5..3ce3751fec 100644 --- a/src/app/shared/mydspace-actions/workspaceitem/workspaceitem-actions.component.ts +++ b/src/app/shared/mydspace-actions/workspaceitem/workspaceitem-actions.component.ts @@ -1,8 +1,8 @@ -import { EPerson } from './../../../core/eperson/models/eperson.model'; +import { EPerson } from '../../../core/eperson/models/eperson.model'; import { AuthorizationDataService } from 'src/app/core/data/feature-authorization/authorization-data.service'; -import { AuthService } from './../../../core/auth/auth.service'; -import { Item } from 'src/app/core/shared/item.model'; -import { FeatureID } from './../../../core/data/feature-authorization/feature-id'; +import { AuthService } from '../../../core/auth/auth.service'; +import { Item } from '../../../core/shared/item.model'; +import { FeatureID } from '../../../core/data/feature-authorization/feature-id'; import { Component, Injector, Input, OnInit } from '@angular/core'; import { Router } from '@angular/router'; From 27d3c58d003f4e82026bb77b8b7d20a3e9ea5a78 Mon Sep 17 00:00:00 2001 From: Art Lowel Date: Tue, 2 May 2023 17:09:55 +0200 Subject: [PATCH 144/409] add referrer to pageview events --- .../services/browser.referrer.service.spec.ts | 53 +++++++++++++++++++ .../core/services/browser.referrer.service.ts | 48 +++++++++++++++++ src/app/core/services/referrer.service.ts | 15 ++++++ .../services/server.referrer.service.spec.ts | 34 ++++++++++++ .../core/services/server.referrer.service.ts | 31 +++++++++++ .../angulartics/dspace-provider.spec.ts | 7 ++- .../statistics/angulartics/dspace-provider.ts | 2 +- .../dspace/view-tracker.component.ts | 43 ++++++++++++--- src/app/statistics/statistics.service.spec.ts | 3 +- src/app/statistics/statistics.service.ts | 9 +++- src/modules/app/browser-app.module.ts | 6 +++ src/modules/app/server-app.module.ts | 6 +++ 12 files changed, 244 insertions(+), 13 deletions(-) create mode 100644 src/app/core/services/browser.referrer.service.spec.ts create mode 100644 src/app/core/services/browser.referrer.service.ts create mode 100644 src/app/core/services/referrer.service.ts create mode 100644 src/app/core/services/server.referrer.service.spec.ts create mode 100644 src/app/core/services/server.referrer.service.ts diff --git a/src/app/core/services/browser.referrer.service.spec.ts b/src/app/core/services/browser.referrer.service.spec.ts new file mode 100644 index 0000000000..bff01bf913 --- /dev/null +++ b/src/app/core/services/browser.referrer.service.spec.ts @@ -0,0 +1,53 @@ +import { of as observableOf } from 'rxjs'; +import { RouteService } from './route.service'; +import { BrowserReferrerService } from './browser.referrer.service'; + +describe(`BrowserReferrerService`, () => { + let service: BrowserReferrerService; + const documentReferrer = 'https://www.referrer.com'; + const origin = 'https://www.dspace.org'; + let routeService: RouteService; + + beforeEach(() => { + routeService = { + getPreviousUrl: () => observableOf('') + } as any; + service = new BrowserReferrerService( + { referrer: documentReferrer }, + routeService, + { getCurrentOrigin: () => origin } as any + ); + }); + + describe(`getReferrer`, () => { + let prevUrl: string; + + describe(`when getPreviousUrl is an empty string`, () => { + beforeEach(() => { + prevUrl = ''; + spyOn(routeService, 'getPreviousUrl').and.returnValue(observableOf(prevUrl)); + }); + + it(`should return document.referrer`, (done: DoneFn) => { + service.getReferrer().subscribe((emittedReferrer: string) => { + expect(emittedReferrer).toBe(documentReferrer); + done(); + }); + }); + }); + + describe(`when getPreviousUrl is not empty`, () => { + beforeEach(() => { + prevUrl = '/some/local/route'; + spyOn(routeService, 'getPreviousUrl').and.returnValue(observableOf(prevUrl)); + }); + + it(`should return the value emitted by getPreviousUrl combined with the origin from HardRedirectService`, (done: DoneFn) => { + service.getReferrer().subscribe((emittedReferrer: string) => { + expect(emittedReferrer).toBe(origin + prevUrl); + done(); + }); + }); + }); + }); +}); diff --git a/src/app/core/services/browser.referrer.service.ts b/src/app/core/services/browser.referrer.service.ts new file mode 100644 index 0000000000..1bf1cf2d4a --- /dev/null +++ b/src/app/core/services/browser.referrer.service.ts @@ -0,0 +1,48 @@ +import { ReferrerService } from './referrer.service'; +import { Observable } from 'rxjs'; +import { map } from 'rxjs/operators'; +import { isEmpty } from '../../shared/empty.util'; +import { URLCombiner } from '../url-combiner/url-combiner'; +import { Inject, Injectable } from '@angular/core'; +import { DOCUMENT } from '@angular/common'; +import { HardRedirectService } from './hard-redirect.service'; +import { RouteService } from './route.service'; + +/** + * A service to determine the referrer + * + * The browser implementation will get the referrer from document.referrer, in the event that the + * previous page visited was not an angular URL. If it was, the route history in the store must be + * used, since document.referrer doesn't get updated on route changes + */ +@Injectable() +export class BrowserReferrerService extends ReferrerService { + + constructor( + @Inject(DOCUMENT) protected document: any, + protected routeService: RouteService, + protected hardRedirectService: HardRedirectService, + ) { + super(); + } + + /** + * Return the referrer + * + * Return the referrer URL based on the route history in the store. If there is no route history + * in the store yet, document.referrer will be used + */ + public getReferrer(): Observable { + return this.routeService.getPreviousUrl().pipe( + map((prevUrl: string) => { + // if we don't have anything in the history yet, return document.referrer + // (note that that may be empty too, e.g. if you've just opened a new browser tab) + if (isEmpty(prevUrl)) { + return this.document.referrer; + } else { + return new URLCombiner(this.hardRedirectService.getCurrentOrigin(), prevUrl).toString(); + } + }) + ); + } +} diff --git a/src/app/core/services/referrer.service.ts b/src/app/core/services/referrer.service.ts new file mode 100644 index 0000000000..79621fdbeb --- /dev/null +++ b/src/app/core/services/referrer.service.ts @@ -0,0 +1,15 @@ +import { Injectable } from '@angular/core'; +import { Observable } from 'rxjs'; + +/** + * A service to determine the referrer, i.e. the previous URL that led the user to the current one + */ +@Injectable() +export abstract class ReferrerService { + + /** + * Return the referrer + */ + abstract getReferrer(): Observable; + +} diff --git a/src/app/core/services/server.referrer.service.spec.ts b/src/app/core/services/server.referrer.service.spec.ts new file mode 100644 index 0000000000..4a7f841093 --- /dev/null +++ b/src/app/core/services/server.referrer.service.spec.ts @@ -0,0 +1,34 @@ +import { ServerReferrerService } from './server.referrer.service'; + +describe(`ServerReferrerService`, () => { + let service: ServerReferrerService; + const referrer = 'https://www.referrer.com'; + + describe(`getReferrer`, () => { + describe(`when the referer header is set`, () => { + beforeEach(() => { + service = new ServerReferrerService({ headers: { referer: referrer }}); + }); + + it(`should return the referer header`, (done: DoneFn) => { + service.getReferrer().subscribe((emittedReferrer: string) => { + expect(emittedReferrer).toBe(referrer); + done(); + }); + }); + }); + + describe(`when the referer header is not set`, () => { + beforeEach(() => { + service = new ServerReferrerService({ headers: {}}); + }); + + it(`should return an empty string`, (done: DoneFn) => { + service.getReferrer().subscribe((emittedReferrer: string) => { + expect(emittedReferrer).toBe(''); + done(); + }); + }); + }); + }); +}); diff --git a/src/app/core/services/server.referrer.service.ts b/src/app/core/services/server.referrer.service.ts new file mode 100644 index 0000000000..b2f063a07c --- /dev/null +++ b/src/app/core/services/server.referrer.service.ts @@ -0,0 +1,31 @@ +import { ReferrerService } from './referrer.service'; +import { Observable, of as observableOf } from 'rxjs'; +import { Inject, Injectable } from '@angular/core'; +import { REQUEST } from '@nguniversal/express-engine/tokens'; + +/** + * A service to determine the referrer + * + * The server implementation will get the referrer from the 'Referer' header of the request sent to + * the express server + */ +@Injectable() +export class ServerReferrerService extends ReferrerService { + + constructor( + @Inject(REQUEST) protected request: any, + ) { + super(); + } + + /** + * Return the referrer + * + * Return the 'Referer' header from the request, or an empty string if the header wasn't set + * (for consistency with the document.referrer property on the browser side) + */ + public getReferrer(): Observable { + const referrer = this.request.headers.referer || ''; + return observableOf(referrer); + } +} diff --git a/src/app/statistics/angulartics/dspace-provider.spec.ts b/src/app/statistics/angulartics/dspace-provider.spec.ts index 8491d8e80c..b917337648 100644 --- a/src/app/statistics/angulartics/dspace-provider.spec.ts +++ b/src/app/statistics/angulartics/dspace-provider.spec.ts @@ -11,7 +11,10 @@ describe('Angulartics2DSpace', () => { beforeEach(() => { angulartics2 = { - eventTrack: observableOf({action: 'pageView', properties: {object: 'mock-object'}}), + eventTrack: observableOf({action: 'pageView', properties: { + object: 'mock-object', + referrer: 'https://www.referrer.com' + }}), filterDeveloperMode: () => filter(() => true) } as any; statisticsService = jasmine.createSpyObj('statisticsService', {trackViewEvent: null}); @@ -20,7 +23,7 @@ describe('Angulartics2DSpace', () => { it('should use the statisticsService', () => { provider.startTracking(); - expect(statisticsService.trackViewEvent).toHaveBeenCalledWith('mock-object' as any); + expect(statisticsService.trackViewEvent).toHaveBeenCalledWith('mock-object' as any, 'https://www.referrer.com'); }); }); diff --git a/src/app/statistics/angulartics/dspace-provider.ts b/src/app/statistics/angulartics/dspace-provider.ts index cd1aab94bd..8d6607b1c4 100644 --- a/src/app/statistics/angulartics/dspace-provider.ts +++ b/src/app/statistics/angulartics/dspace-provider.ts @@ -25,7 +25,7 @@ export class Angulartics2DSpace { private eventTrack(event) { if (event.action === 'pageView') { - this.statisticsService.trackViewEvent(event.properties.object); + this.statisticsService.trackViewEvent(event.properties.object, event.properties.referrer); } else if (event.action === 'search') { this.statisticsService.trackSearchEvent( event.properties.searchOptions, diff --git a/src/app/statistics/angulartics/dspace/view-tracker.component.ts b/src/app/statistics/angulartics/dspace/view-tracker.component.ts index 85588aeb97..af9c62f98e 100644 --- a/src/app/statistics/angulartics/dspace/view-tracker.component.ts +++ b/src/app/statistics/angulartics/dspace/view-tracker.component.ts @@ -1,6 +1,10 @@ -import { Component, Input, OnInit } from '@angular/core'; +import { Component, Input, OnInit, OnDestroy } from '@angular/core'; import { Angulartics2 } from 'angulartics2'; import { DSpaceObject } from '../../../core/shared/dspace-object.model'; +import { Subscription } from 'rxjs/internal/Subscription'; +import { take } from 'rxjs/operators'; +import { hasValue } from '../../../shared/empty.util'; +import { ReferrerService } from '../../../core/services/referrer.service'; /** * This component triggers a page view statistic @@ -10,18 +14,43 @@ import { DSpaceObject } from '../../../core/shared/dspace-object.model'; styleUrls: ['./view-tracker.component.scss'], templateUrl: './view-tracker.component.html', }) -export class ViewTrackerComponent implements OnInit { +export class ViewTrackerComponent implements OnInit, OnDestroy { + /** + * The DSpaceObject to track a view event about + */ @Input() object: DSpaceObject; + /** + * The subscription on this.referrerService.getReferrer() + * @protected + */ + protected sub: Subscription; + constructor( - public angulartics2: Angulartics2 + public angulartics2: Angulartics2, + public referrerService: ReferrerService ) { } ngOnInit(): void { - this.angulartics2.eventTrack.next({ - action: 'pageView', - properties: {object: this.object}, - }); + this.sub = this.referrerService.getReferrer() + .pipe(take(1)) + .subscribe((referrer: string) => { + this.angulartics2.eventTrack.next({ + action: 'pageView', + properties: { + object: this.object, + referrer + }, + }); + }); + } + + ngOnDestroy(): void { + // unsubscribe in the case that this component is destroyed before + // this.referrerService.getReferrer() has emitted + if (hasValue(this.sub)) { + this.sub.unsubscribe(); + } } } diff --git a/src/app/statistics/statistics.service.spec.ts b/src/app/statistics/statistics.service.spec.ts index cdf81afdb6..2f04755143 100644 --- a/src/app/statistics/statistics.service.spec.ts +++ b/src/app/statistics/statistics.service.spec.ts @@ -26,12 +26,13 @@ describe('StatisticsService', () => { it('should send a request to track an item view ', () => { const mockItem: any = {uuid: 'mock-item-uuid', type: 'item'}; - service.trackViewEvent(mockItem); + service.trackViewEvent(mockItem, 'https://www.referrer.com'); const request: TrackRequest = requestService.send.calls.mostRecent().args[0]; expect(request.body).toBeDefined('request.body'); const body = JSON.parse(request.body); expect(body.targetId).toBe('mock-item-uuid'); expect(body.targetType).toBe('item'); + expect(body.referrer).toBe('https://www.referrer.com'); }); }); diff --git a/src/app/statistics/statistics.service.ts b/src/app/statistics/statistics.service.ts index 9e12e627b5..4835b55e7d 100644 --- a/src/app/statistics/statistics.service.ts +++ b/src/app/statistics/statistics.service.ts @@ -31,11 +31,16 @@ export class StatisticsService { /** * To track a page view * @param dso: The dso which was viewed + * @param referrer: The referrer used by the client to reach the dso page */ - trackViewEvent(dso: DSpaceObject) { + trackViewEvent( + dso: DSpaceObject, + referrer: string + ) { this.sendEvent('/statistics/viewevents', { targetId: dso.uuid, - targetType: (dso as any).type + targetType: (dso as any).type, + referrer }); } diff --git a/src/modules/app/browser-app.module.ts b/src/modules/app/browser-app.module.ts index 29d138be1a..20895cb9a6 100644 --- a/src/modules/app/browser-app.module.ts +++ b/src/modules/app/browser-app.module.ts @@ -33,6 +33,8 @@ import { GoogleAnalyticsService } from '../../app/statistics/google-analytics.se import { RouterModule, NoPreloading } from '@angular/router'; import { AuthRequestService } from '../../app/core/auth/auth-request.service'; import { BrowserAuthRequestService } from '../../app/core/auth/browser-auth-request.service'; +import { ReferrerService } from '../../app/core/services/referrer.service'; +import { BrowserReferrerService } from '../../app/core/services/browser.referrer.service'; export const REQ_KEY = makeStateKey('req'); @@ -111,6 +113,10 @@ export function getRequest(transferState: TransferState): any { provide: AuthRequestService, useClass: BrowserAuthRequestService, }, + { + provide: ReferrerService, + useClass: BrowserReferrerService, + }, { provide: LocationToken, useFactory: locationProvider, diff --git a/src/modules/app/server-app.module.ts b/src/modules/app/server-app.module.ts index dad3a60d5c..34ab29b71b 100644 --- a/src/modules/app/server-app.module.ts +++ b/src/modules/app/server-app.module.ts @@ -33,6 +33,8 @@ import { Angulartics2Mock } from '../../app/shared/mocks/angulartics2.service.mo import { RouterModule } from '@angular/router'; import { AuthRequestService } from '../../app/core/auth/auth-request.service'; import { ServerAuthRequestService } from '../../app/core/auth/server-auth-request.service'; +import { ReferrerService } from '../../app/core/services/referrer.service'; +import { ServerReferrerService } from '../../app/core/services/server.referrer.service'; export function createTranslateLoader() { return new TranslateJson5UniversalLoader('dist/server/assets/i18n/', '.json5'); @@ -102,6 +104,10 @@ export function createTranslateLoader() { provide: HardRedirectService, useClass: ServerHardRedirectService, }, + { + provide: ReferrerService, + useClass: ServerReferrerService, + }, ] }) export class ServerAppModule { From 5aaa4ef371046049f624d1b99d8f3acde8486a04 Mon Sep 17 00:00:00 2001 From: Art Lowel Date: Tue, 2 May 2023 18:11:57 +0200 Subject: [PATCH 145/409] ensure the rel="noopener" attribute is only set when target="_blank" and remove "noreferrer" in all cases --- .../journal-issue-search-result-grid-element.component.html | 4 ++-- .../journal-volume-search-result-grid-element.component.html | 4 ++-- .../journal/journal-search-result-grid-element.component.html | 4 ++-- .../journal-issue-search-result-list-element.component.html | 2 +- .../journal-volume-search-result-list-element.component.html | 2 +- .../journal/journal-search-result-list-element.component.html | 2 +- .../org-unit-search-result-grid-element.component.html | 4 ++-- .../person/person-search-result-grid-element.component.html | 4 ++-- .../project/project-search-result-grid-element.component.html | 4 ++-- .../org-unit-search-result-list-element.component.html | 2 +- .../person/person-search-result-list-element.component.html | 2 +- .../project/project-search-result-list-element.component.html | 2 +- .../collection-grid-element.component.html | 4 ++-- .../community-grid-element.component.html | 4 ++-- .../collection-search-result-grid-element.component.html | 4 ++-- .../community-search-result-grid-element.component.html | 4 ++-- .../item/item-search-result-grid-element.component.html | 4 ++-- .../browse-entry-list-element.component.html | 2 +- .../collection-list-element.component.html | 2 +- .../community-list-element.component.html | 2 +- .../collection-search-result-list-element.component.html | 2 +- .../community-search-result-list-element.component.html | 2 +- .../item/item-search-result-list-element.component.html | 2 +- .../cc-license/submission-section-cc-licenses.component.html | 2 +- 24 files changed, 35 insertions(+), 35 deletions(-) diff --git a/src/app/entity-groups/journal-entities/item-grid-elements/search-result-grid-elements/journal-issue/journal-issue-search-result-grid-element.component.html b/src/app/entity-groups/journal-entities/item-grid-elements/search-result-grid-elements/journal-issue/journal-issue-search-result-grid-element.component.html index 028876b3d0..a54c78fb78 100644 --- a/src/app/entity-groups/journal-entities/item-grid-elements/search-result-grid-elements/journal-issue/journal-issue-search-result-grid-element.component.html +++ b/src/app/entity-groups/journal-entities/item-grid-elements/search-result-grid-elements/journal-issue/journal-issue-search-result-grid-element.component.html @@ -5,7 +5,7 @@
diff --git a/src/app/entity-groups/journal-entities/item-grid-elements/search-result-grid-elements/journal-volume/journal-volume-search-result-grid-element.component.html b/src/app/entity-groups/journal-entities/item-grid-elements/search-result-grid-elements/journal-volume/journal-volume-search-result-grid-element.component.html index 65ff75a731..0ae775a9de 100644 --- a/src/app/entity-groups/journal-entities/item-grid-elements/search-result-grid-elements/journal-volume/journal-volume-search-result-grid-element.component.html +++ b/src/app/entity-groups/journal-entities/item-grid-elements/search-result-grid-elements/journal-volume/journal-volume-search-result-grid-element.component.html @@ -5,7 +5,7 @@
diff --git a/src/app/entity-groups/journal-entities/item-grid-elements/search-result-grid-elements/journal/journal-search-result-grid-element.component.html b/src/app/entity-groups/journal-entities/item-grid-elements/search-result-grid-elements/journal/journal-search-result-grid-element.component.html index 0c5824c6d6..e71049bdbc 100644 --- a/src/app/entity-groups/journal-entities/item-grid-elements/search-result-grid-elements/journal/journal-search-result-grid-element.component.html +++ b/src/app/entity-groups/journal-entities/item-grid-elements/search-result-grid-elements/journal/journal-search-result-grid-element.component.html @@ -5,7 +5,7 @@
diff --git a/src/app/entity-groups/journal-entities/item-list-elements/search-result-list-elements/journal-issue/journal-issue-search-result-list-element.component.html b/src/app/entity-groups/journal-entities/item-list-elements/search-result-list-elements/journal-issue/journal-issue-search-result-list-element.component.html index fa4c06d36a..a51f55f5a1 100644 --- a/src/app/entity-groups/journal-entities/item-list-elements/search-result-list-elements/journal-issue/journal-issue-search-result-list-element.component.html +++ b/src/app/entity-groups/journal-entities/item-list-elements/search-result-list-elements/journal-issue/journal-issue-search-result-list-element.component.html @@ -1,6 +1,6 @@ - - - diff --git a/src/app/entity-groups/research-entities/item-grid-elements/search-result-grid-elements/person/person-search-result-grid-element.component.html b/src/app/entity-groups/research-entities/item-grid-elements/search-result-grid-elements/person/person-search-result-grid-element.component.html index 680a9909bc..7dafbf0dc2 100644 --- a/src/app/entity-groups/research-entities/item-grid-elements/search-result-grid-elements/person/person-search-result-grid-element.component.html +++ b/src/app/entity-groups/research-entities/item-grid-elements/search-result-grid-elements/person/person-search-result-grid-element.component.html @@ -5,7 +5,7 @@
diff --git a/src/app/entity-groups/research-entities/item-grid-elements/search-result-grid-elements/project/project-search-result-grid-element.component.html b/src/app/entity-groups/research-entities/item-grid-elements/search-result-grid-elements/project/project-search-result-grid-element.component.html index 204f8fc8cb..54f7d73cdc 100644 --- a/src/app/entity-groups/research-entities/item-grid-elements/search-result-grid-elements/project/project-search-result-grid-element.component.html +++ b/src/app/entity-groups/research-entities/item-grid-elements/search-result-grid-elements/project/project-search-result-grid-element.component.html @@ -5,7 +5,7 @@
diff --git a/src/app/entity-groups/research-entities/item-list-elements/search-result-list-elements/org-unit/org-unit-search-result-list-element.component.html b/src/app/entity-groups/research-entities/item-list-elements/search-result-list-elements/org-unit/org-unit-search-result-list-element.component.html index fb0ad21b6e..52273d18aa 100644 --- a/src/app/entity-groups/research-entities/item-list-elements/search-result-list-elements/org-unit/org-unit-search-result-list-element.component.html +++ b/src/app/entity-groups/research-entities/item-list-elements/search-result-list-elements/org-unit/org-unit-search-result-list-element.component.html @@ -1,6 +1,6 @@ - - - - + @@ -11,7 +11,7 @@

{{object.name}}

{{object.shortDescription}}

- View + View
diff --git a/src/app/shared/object-grid/community-grid-element/community-grid-element.component.html b/src/app/shared/object-grid/community-grid-element/community-grid-element.component.html index 63097c4f57..9049d8ad18 100644 --- a/src/app/shared/object-grid/community-grid-element/community-grid-element.component.html +++ b/src/app/shared/object-grid/community-grid-element/community-grid-element.component.html @@ -1,5 +1,5 @@
- + @@ -11,7 +11,7 @@

{{object.name}}

{{object.shortDescription}}

- View + View
diff --git a/src/app/shared/object-grid/search-result-grid-element/collection-search-result/collection-search-result-grid-element.component.html b/src/app/shared/object-grid/search-result-grid-element/collection-search-result/collection-search-result-grid-element.component.html index 739fa6c7a8..e452353a95 100644 --- a/src/app/shared/object-grid/search-result-grid-element/collection-search-result/collection-search-result-grid-element.component.html +++ b/src/app/shared/object-grid/search-result-grid-element/collection-search-result/collection-search-result-grid-element.component.html @@ -1,5 +1,5 @@
- + @@ -12,7 +12,7 @@

{{dso.name}}

{{dso.shortDescription}}

- View + View
diff --git a/src/app/shared/object-grid/search-result-grid-element/community-search-result/community-search-result-grid-element.component.html b/src/app/shared/object-grid/search-result-grid-element/community-search-result/community-search-result-grid-element.component.html index d8c253c8a9..4674d3d750 100644 --- a/src/app/shared/object-grid/search-result-grid-element/community-search-result/community-search-result-grid-element.component.html +++ b/src/app/shared/object-grid/search-result-grid-element/community-search-result/community-search-result-grid-element.component.html @@ -1,5 +1,5 @@
- + @@ -12,7 +12,7 @@

{{dso.name}}

{{dso.shortDescription}}

- View + View
diff --git a/src/app/shared/object-grid/search-result-grid-element/item-search-result/item/item-search-result-grid-element.component.html b/src/app/shared/object-grid/search-result-grid-element/item-search-result/item/item-search-result-grid-element.component.html index d2454b28e6..8d4421a15c 100644 --- a/src/app/shared/object-grid/search-result-grid-element/item-search-result/item/item-search-result-grid-element.component.html +++ b/src/app/shared/object-grid/search-result-grid-element/item-search-result/item/item-search-result-grid-element.component.html @@ -3,7 +3,7 @@
- diff --git a/src/app/shared/object-list/browse-entry-list-element/browse-entry-list-element.component.html b/src/app/shared/object-list/browse-entry-list-element/browse-entry-list-element.component.html index e3455bf095..99d79f3670 100644 --- a/src/app/shared/object-list/browse-entry-list-element/browse-entry-list-element.component.html +++ b/src/app/shared/object-list/browse-entry-list-element/browse-entry-list-element.component.html @@ -1,5 +1,5 @@
- + {{object.value}} diff --git a/src/app/shared/object-list/collection-list-element/collection-list-element.component.html b/src/app/shared/object-list/collection-list-element/collection-list-element.component.html index c61adf5dad..3f2cff33c2 100644 --- a/src/app/shared/object-list/collection-list-element/collection-list-element.component.html +++ b/src/app/shared/object-list/collection-list-element/collection-list-element.component.html @@ -1,4 +1,4 @@ - + {{object.name}} diff --git a/src/app/shared/object-list/community-list-element/community-list-element.component.html b/src/app/shared/object-list/community-list-element/community-list-element.component.html index af01999ca7..fca6ff77c2 100644 --- a/src/app/shared/object-list/community-list-element/community-list-element.component.html +++ b/src/app/shared/object-list/community-list-element/community-list-element.component.html @@ -1,4 +1,4 @@ - + {{object.name}} diff --git a/src/app/shared/object-list/search-result-list-element/collection-search-result/collection-search-result-list-element.component.html b/src/app/shared/object-list/search-result-list-element/collection-search-result/collection-search-result-list-element.component.html index c98003cd1d..e85667382c 100644 --- a/src/app/shared/object-list/search-result-list-element/collection-search-result/collection-search-result-list-element.component.html +++ b/src/app/shared/object-list/search-result-list-element/collection-search-result/collection-search-result-list-element.component.html @@ -1,4 +1,4 @@ - +
diff --git a/src/app/shared/object-list/search-result-list-element/community-search-result/community-search-result-list-element.component.html b/src/app/shared/object-list/search-result-list-element/community-search-result/community-search-result-list-element.component.html index e0f0319ffc..bba6bf2c5e 100644 --- a/src/app/shared/object-list/search-result-list-element/community-search-result/community-search-result-list-element.component.html +++ b/src/app/shared/object-list/search-result-list-element/community-search-result/community-search-result-list-element.component.html @@ -1,4 +1,4 @@ - +
diff --git a/src/app/shared/object-list/search-result-list-element/item-search-result/item-types/item/item-search-result-list-element.component.html b/src/app/shared/object-list/search-result-list-element/item-search-result/item-types/item/item-search-result-list-element.component.html index 80a4fd81fd..a12989ada3 100644 --- a/src/app/shared/object-list/search-result-list-element/item-search-result/item-types/item/item-search-result-list-element.component.html +++ b/src/app/shared/object-list/search-result-list-element/item-search-result/item-types/item/item-search-result-list-element.component.html @@ -1,7 +1,7 @@ - {{ 'submission.sections.ccLicense.link' | translate }}
- + {{ licenseLink }}
From 3a45ecf5784bc622b993baf80fc7b5c4d7cca762 Mon Sep 17 00:00:00 2001 From: Enea Jahollari Date: Wed, 3 May 2023 09:31:01 +0200 Subject: [PATCH 146/409] [CST-9636] Added bulk access condition options service --- .../community-access-control.service.ts | 23 ++++++---- .../bulk-access-condition-options.service.ts | 33 ++++++++++++++ .../bulk-access-condition-options.model.ts | 45 +++++++++++++++++++ .../access-control-array-form.component.ts | 13 +----- 4 files changed, 93 insertions(+), 21 deletions(-) create mode 100644 src/app/core/data/bulk-access-condition-options.service.ts create mode 100644 src/app/core/shared/bulk-access-condition-options.model.ts diff --git a/src/app/community-page/edit-community-page/community-access-control/community-access-control.service.ts b/src/app/community-page/edit-community-page/community-access-control/community-access-control.service.ts index d78d42ba90..89534683b7 100644 --- a/src/app/community-page/edit-community-page/community-access-control/community-access-control.service.ts +++ b/src/app/community-page/edit-community-page/community-access-control/community-access-control.service.ts @@ -1,19 +1,24 @@ import { Injectable } from '@angular/core'; -import { AccessControlItem } from '../../../shared/access-control-array-form/access-control-array-form.component'; -import { Observable, of } from 'rxjs'; +import { of } from 'rxjs'; +import { BulkAccessConditionOptionsService } from '../../../core/data/bulk-access-condition-options.service'; +import { BulkAccessConditionOptions } from '../../../core/shared/bulk-access-condition-options.model'; -export interface AccessControlDropdownDataResponse { - id: string; - itemAccessConditionOptions: AccessControlItem[]; - bitstreamAccessConditionOptions: AccessControlItem[]; -} @Injectable() export class CommunityAccessControlService { - dropdownData$: Observable = of(accessControlDropdownData); + constructor(private service: BulkAccessConditionOptionsService) {} + + dropdownData$ = of(accessControlDropdownData); + + // dropdownData$ = this.service.getAll().pipe( + // getAllSucceededRemoteData(), + // filter((data) => data.hasSucceeded), + // map((data) => data.payload) + // ); } -const accessControlDropdownData: AccessControlDropdownDataResponse = { +const accessControlDropdownData: BulkAccessConditionOptions = { + _links: { self: undefined }, type: undefined, uuid: '', 'id': 'default', 'itemAccessConditionOptions': [ { diff --git a/src/app/core/data/bulk-access-condition-options.service.ts b/src/app/core/data/bulk-access-condition-options.service.ts new file mode 100644 index 0000000000..bfff0a8dd6 --- /dev/null +++ b/src/app/core/data/bulk-access-condition-options.service.ts @@ -0,0 +1,33 @@ +import { Injectable } from '@angular/core'; +import { Observable } from 'rxjs'; +import { RemoteDataBuildService } from '../cache/builders/remote-data-build.service'; +import { ObjectCacheService } from '../cache/object-cache.service'; +import { HALEndpointService } from '../shared/hal-endpoint.service'; +import { RemoteData } from './remote-data'; +import { RequestService } from './request.service'; +import { IdentifiableDataService } from './base/identifiable-data.service'; +import { BulkAccessConditionOptions } from '../shared/bulk-access-condition-options.model'; + +@Injectable() +/** + * Data Service responsible for retrieving Bulk Access Condition Options from the REST API + */ +export class BulkAccessConditionOptionsService extends IdentifiableDataService { + + constructor( + protected requestService: RequestService, + protected rdbService: RemoteDataBuildService, + protected objectCache: ObjectCacheService, + protected halService: HALEndpointService, + ) { + super('bulkaccessconditionoptions', requestService, rdbService, objectCache, halService); + } + + getAll(): Observable> { + return this.findByHref(this.halService.getEndpoint(this.linkPath)); + } + + // findByPropertyName(name: string): Observable> { + // return this.findById(name); + // } +} diff --git a/src/app/core/shared/bulk-access-condition-options.model.ts b/src/app/core/shared/bulk-access-condition-options.model.ts new file mode 100644 index 0000000000..a1c8fe0702 --- /dev/null +++ b/src/app/core/shared/bulk-access-condition-options.model.ts @@ -0,0 +1,45 @@ +import { autoserialize, autoserializeAs, deserialize } from 'cerialize'; +import { typedObject } from '../cache/builders/build-decorators'; +import { excludeFromEquals } from '../utilities/equals.decorators'; +import { ResourceType } from './resource-type'; +import { CacheableObject } from '../cache/cacheable-object.model'; +import { HALLink } from './hal-link.model'; + +export const BULK_ACCESS_CONDITION_OPTIONS = new ResourceType('bulkAccessConditionOptions'); + +/** + * Model class for a bulk access condition options + */ +@typedObject +export class BulkAccessConditionOptions implements CacheableObject { + static type = BULK_ACCESS_CONDITION_OPTIONS; + + /** + * The object type + */ + @excludeFromEquals + @autoserialize + type: ResourceType; + + @autoserializeAs(String, 'name') + uuid: string; + + @autoserialize + id: string; + + @deserialize + itemAccessConditionOptions: AccessControlItem[]; + + @deserialize + bitstreamAccessConditionOptions: AccessControlItem[]; + + _links: { self: HALLink }; +} + +export interface AccessControlItem { + name: string + hasStartDate?: boolean + maxStartDate?: string + hasEndDate?: boolean + maxEndDate?: string +} diff --git a/src/app/shared/access-control-array-form/access-control-array-form.component.ts b/src/app/shared/access-control-array-form/access-control-array-form.component.ts index 00ff52c695..bde7d30be8 100644 --- a/src/app/shared/access-control-array-form/access-control-array-form.component.ts +++ b/src/app/shared/access-control-array-form/access-control-array-form.component.ts @@ -6,15 +6,8 @@ import { TranslateModule } from '@ngx-translate/core'; import { NgbDatepickerModule } from '@ng-bootstrap/ng-bootstrap'; import { ControlMaxStartDatePipe } from './control-max-start-date.pipe'; import { ControlMaxEndDatePipe } from './control-max-end-date.pipe'; +import { AccessControlItem } from '../../core/shared/bulk-access-condition-options.model'; -// type of the dropdown item that comes from backend -export interface AccessControlItem { - name: string - hasStartDate?: boolean - maxStartDate?: string - hasEndDate?: boolean - maxEndDate?: string -} // will be used on the form value export interface AccessControlItemValue { @@ -23,10 +16,6 @@ export interface AccessControlItemValue { endDate?: string; } -export interface AccessControlArrayFormValue { - accessControl: AccessControlItemValue[]; -} - @Component({ selector: 'ds-access-control-array-form', templateUrl: './access-control-array-form.component.html', From 06f3b68048ab7e780f8d4161439fbda281d414a8 Mon Sep 17 00:00:00 2001 From: Alisa Ismailati Date: Wed, 3 May 2023 10:26:48 +0200 Subject: [PATCH 147/409] [DURACOM-133] Fixed failing test --- .../workspaceitem/workspaceitem-actions.component.spec.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/app/shared/mydspace-actions/workspaceitem/workspaceitem-actions.component.spec.ts b/src/app/shared/mydspace-actions/workspaceitem/workspaceitem-actions.component.spec.ts index f786782c05..b0a08a70bb 100644 --- a/src/app/shared/mydspace-actions/workspaceitem/workspaceitem-actions.component.spec.ts +++ b/src/app/shared/mydspace-actions/workspaceitem/workspaceitem-actions.component.spec.ts @@ -157,6 +157,9 @@ authService = jasmine.createSpyObj('authService', { describe('WorkspaceitemActionsComponent', () => { beforeEach(waitForAsync(async () => { + authorizationService = jasmine.createSpyObj('authorizationService', { + isAuthorized: observableOf(true) + }); await TestBed.configureTestingModule({ imports: [ NgbModule, @@ -190,9 +193,6 @@ describe('WorkspaceitemActionsComponent', () => { component = fixture.componentInstance; component.object = mockObject; notificationsServiceStub = TestBed.inject(NotificationsService as any); - authorizationService = jasmine.createSpyObj('authorizationService', { - isAuthorized: observableOf(true) - }); (authService.getAuthenticatedUserFromStore as jasmine.Spy).and.returnValue(observableOf(ePersonMock)); fixture.detectChanges(); }); From 7b19ba7be26aab733aad426127955103970a4049 Mon Sep 17 00:00:00 2001 From: Alisa Ismailati Date: Wed, 3 May 2023 11:11:10 +0200 Subject: [PATCH 148/409] [DURACOM-134] Fixes --- .../workspaceitems-delete-page.component.spec.ts | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/app/workspaceitems-edit-page/workspaceitems-delete-page/workspaceitems-delete-page.component.spec.ts b/src/app/workspaceitems-edit-page/workspaceitems-delete-page/workspaceitems-delete-page.component.spec.ts index f52dd497d8..3d9646af38 100644 --- a/src/app/workspaceitems-edit-page/workspaceitems-delete-page/workspaceitems-delete-page.component.spec.ts +++ b/src/app/workspaceitems-edit-page/workspaceitems-delete-page/workspaceitems-delete-page.component.spec.ts @@ -25,7 +25,7 @@ describe('WorkspaceitemsDeletePageComponent', () => { let fixture: ComponentFixture; const workspaceitemDataServiceSpy = jasmine.createSpyObj('WorkspaceitemDataService', { - delete: jasmine.createSpy('delete') + delete: observableOf(createSuccessfulRemoteDataObject({})) }); const wsi = new WorkspaceItem(); @@ -88,9 +88,7 @@ describe('WorkspaceitemsDeletePageComponent', () => { }); it('should have the current WorkspaceItem', () => { - console.log( (component as any).activatedRoute, 'data wsi'); (component as any).activatedRoute.data.subscribe((data) => { - console.log(data, 'dataaa'); expect(data.wsi.payload.id).toEqual('1234'); }); }); @@ -103,7 +101,6 @@ describe('WorkspaceitemsDeletePageComponent', () => { }); it('should call workspaceItemService.delete', () => { - spyOn(workspaceitemDataServiceSpy, 'delete').and.returnValue(observableOf(createSuccessfulRemoteDataObject({}))); component.sendDeleteRequest(); expect((component as any).workspaceItemService.delete).toHaveBeenCalledWith('1234'); }); From 89eb4e3cb2a8a07f45ee939f74387f1624c4e0c5 Mon Sep 17 00:00:00 2001 From: Enea Jahollari Date: Wed, 3 May 2023 15:29:12 +0200 Subject: [PATCH 149/409] [DURACOM-131] Show output files in separate lines --- src/app/process-page/detail/process-detail.component.html | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/app/process-page/detail/process-detail.component.html b/src/app/process-page/detail/process-detail.component.html index 29cbfc113f..8825c71cee 100644 --- a/src/app/process-page/detail/process-detail.component.html +++ b/src/app/process-page/detail/process-detail.component.html @@ -17,10 +17,12 @@
+
- {{getFileName(file)}} - ({{(file?.sizeBytes) | dsFileSize }}) + {{getFileName(file)}} + ({{(file?.sizeBytes) | dsFileSize }}) +
From c066bc9d54e7ea0c9256ffedc7bb02b4ff2ee6b9 Mon Sep 17 00:00:00 2001 From: Enea Jahollari Date: Wed, 3 May 2023 17:22:20 +0200 Subject: [PATCH 150/409] [DURACOM-131] Added automatic refresh every 5 seconds if the status is running --- .../detail/process-detail.component.html | 19 ++-- .../detail/process-detail.component.ts | 102 ++++++++++++++---- 2 files changed, 93 insertions(+), 28 deletions(-) diff --git a/src/app/process-page/detail/process-detail.component.html b/src/app/process-page/detail/process-detail.component.html index 8825c71cee..9e7a24d3af 100644 --- a/src/app/process-page/detail/process-detail.component.html +++ b/src/app/process-page/detail/process-detail.component.html @@ -1,10 +1,15 @@ -
-
-

{{'process.detail.title' | translate:{ - id: process?.processId, - name: process?.scriptName - } }}

+
+
+
+

+ {{ 'process.detail.title' | translate:{ id: process?.processId, name: process?.scriptName } }} +

+
+
+ Refreshing in {{ seconds }}s +
+
{{ process?.scriptName }}
@@ -72,7 +77,7 @@ -
+
diff --git a/src/app/shared/object-list/my-dspace-result-list-element/claimed-search-result/claimed-search-result-list-element.component.html b/src/app/shared/object-list/my-dspace-result-list-element/claimed-search-result/claimed-search-result-list-element.component.html index 99d1bca135..42af008cdd 100644 --- a/src/app/shared/object-list/my-dspace-result-list-element/claimed-search-result/claimed-search-result-list-element.component.html +++ b/src/app/shared/object-list/my-dspace-result-list-element/claimed-search-result/claimed-search-result-list-element.component.html @@ -2,7 +2,7 @@
diff --git a/src/app/shared/object-list/my-dspace-result-list-element/claimed-search-result/claimed-search-result-list-element.component.spec.ts b/src/app/shared/object-list/my-dspace-result-list-element/claimed-search-result/claimed-search-result-list-element.component.spec.ts index 17d8a81011..c1778c1792 100644 --- a/src/app/shared/object-list/my-dspace-result-list-element/claimed-search-result/claimed-search-result-list-element.component.spec.ts +++ b/src/app/shared/object-list/my-dspace-result-list-element/claimed-search-result/claimed-search-result-list-element.component.spec.ts @@ -112,8 +112,8 @@ describe('ClaimedSearchResultListElementComponent', () => { expect(component.item$.value).toEqual(item); })); - it('should have the correct child context', () => { - expect(component.childContext).toEqual(Context.MyDSpaceValidation); + it('should have the correct badge context', () => { + expect(component.badgeContext).toEqual(Context.MyDSpaceValidation); }); it('should forward claimed-task-actions processComplete event to reloadObject event emitter', fakeAsync(() => { diff --git a/src/app/shared/object-list/my-dspace-result-list-element/item-list-preview/item-list-preview.component.html b/src/app/shared/object-list/my-dspace-result-list-element/item-list-preview/item-list-preview.component.html index bdaf7b681e..c8ef730faf 100644 --- a/src/app/shared/object-list/my-dspace-result-list-element/item-list-preview/item-list-preview.component.html +++ b/src/app/shared/object-list/my-dspace-result-list-element/item-list-preview/item-list-preview.component.html @@ -6,7 +6,7 @@
- +

@@ -43,4 +43,4 @@
-
\ No newline at end of file +
diff --git a/src/app/shared/object-list/my-dspace-result-list-element/item-list-preview/item-list-preview.component.ts b/src/app/shared/object-list/my-dspace-result-list-element/item-list-preview/item-list-preview.component.ts index da80ef70b4..3195fad0f2 100644 --- a/src/app/shared/object-list/my-dspace-result-list-element/item-list-preview/item-list-preview.component.ts +++ b/src/app/shared/object-list/my-dspace-result-list-element/item-list-preview/item-list-preview.component.ts @@ -30,9 +30,9 @@ export class ItemListPreviewComponent implements OnInit { @Input() object: SearchResult; /** - * Represent context + * Represents the badge context */ - @Input() context: Context; + @Input() badgeContext: Context; /** * A boolean representing if to show submitter information diff --git a/src/app/shared/object-list/my-dspace-result-list-element/item-list-preview/themed-item-list-preview.component.ts b/src/app/shared/object-list/my-dspace-result-list-element/item-list-preview/themed-item-list-preview.component.ts index b4ac267a59..fc50b49d51 100644 --- a/src/app/shared/object-list/my-dspace-result-list-element/item-list-preview/themed-item-list-preview.component.ts +++ b/src/app/shared/object-list/my-dspace-result-list-element/item-list-preview/themed-item-list-preview.component.ts @@ -15,13 +15,13 @@ import { WorkflowItem } from 'src/app/core/submission/models/workflowitem.model' templateUrl: '../../../theme-support/themed.component.html' }) export class ThemedItemListPreviewComponent extends ThemedComponent { - protected inAndOutputNames: (keyof ItemListPreviewComponent & keyof this)[] = ['item', 'object', 'context', 'showSubmitter', 'workflowItem']; + protected inAndOutputNames: (keyof ItemListPreviewComponent & keyof this)[] = ['item', 'object', 'badgeContext', 'showSubmitter', 'workflowItem']; @Input() item: Item; @Input() object: SearchResult; - @Input() context: Context; + @Input() badgeContext: Context; @Input() showSubmitter: boolean; diff --git a/src/app/shared/object-list/my-dspace-result-list-element/item-search-result/item-search-result-list-element-submission.component.html b/src/app/shared/object-list/my-dspace-result-list-element/item-search-result/item-search-result-list-element-submission.component.html index 0a0ad7fa5c..c1f7098d5f 100644 --- a/src/app/shared/object-list/my-dspace-result-list-element/item-search-result/item-search-result-list-element-submission.component.html +++ b/src/app/shared/object-list/my-dspace-result-list-element/item-search-result/item-search-result-list-element-submission.component.html @@ -1,6 +1,6 @@ + [badgeContext]="badgeContext">
diff --git a/src/app/shared/object-list/my-dspace-result-list-element/item-search-result/item-search-result-list-element-submission.component.spec.ts b/src/app/shared/object-list/my-dspace-result-list-element/item-search-result/item-search-result-list-element-submission.component.spec.ts index 586013af1e..a26fbaaf57 100644 --- a/src/app/shared/object-list/my-dspace-result-list-element/item-search-result/item-search-result-list-element-submission.component.spec.ts +++ b/src/app/shared/object-list/my-dspace-result-list-element/item-search-result/item-search-result-list-element-submission.component.spec.ts @@ -77,8 +77,8 @@ describe('ItemMyDSpaceResultListElementComponent', () => { fixture.detectChanges(); }); - it('should have correct child context', () => { - expect(component.childContext).toEqual(Context.MyDSpaceArchived); + it('should have correct badge context', () => { + expect(component.badgeContext).toEqual(Context.MyDSpaceArchived); }); it('should forward item-actions processComplete event to reloadObject event emitter', fakeAsync(() => { diff --git a/src/app/shared/object-list/my-dspace-result-list-element/pool-search-result/pool-search-result-list-element.component.html b/src/app/shared/object-list/my-dspace-result-list-element/pool-search-result/pool-search-result-list-element.component.html index d27c8a11c5..9fe6e37c9e 100644 --- a/src/app/shared/object-list/my-dspace-result-list-element/pool-search-result/pool-search-result-list-element.component.html +++ b/src/app/shared/object-list/my-dspace-result-list-element/pool-search-result/pool-search-result-list-element.component.html @@ -2,7 +2,7 @@
diff --git a/src/app/shared/object-list/my-dspace-result-list-element/pool-search-result/pool-search-result-list-element.component.spec.ts b/src/app/shared/object-list/my-dspace-result-list-element/pool-search-result/pool-search-result-list-element.component.spec.ts index 4c4b7c72b6..d63ee4ba13 100644 --- a/src/app/shared/object-list/my-dspace-result-list-element/pool-search-result/pool-search-result-list-element.component.spec.ts +++ b/src/app/shared/object-list/my-dspace-result-list-element/pool-search-result/pool-search-result-list-element.component.spec.ts @@ -118,8 +118,8 @@ describe('PoolSearchResultListElementComponent', () => { expect(component.item$.value).toEqual(item); })); - it('should have correct child context', () => { - expect(component.childContext).toEqual(Context.MyDSpaceWaitingController); + it('should have correct badge context', () => { + expect(component.badgeContext).toEqual(Context.MyDSpaceWaitingController); }); it('should forward pool-task-actions processCompleted event to the reloadedObject event emitter', fakeAsync(() => { diff --git a/src/app/shared/object-list/my-dspace-result-list-element/workflow-item-search-result/workflow-item-search-result-list-element.component.html b/src/app/shared/object-list/my-dspace-result-list-element/workflow-item-search-result/workflow-item-search-result-list-element.component.html index 4c7baccaa0..ffc3df53f8 100644 --- a/src/app/shared/object-list/my-dspace-result-list-element/workflow-item-search-result/workflow-item-search-result-list-element.component.html +++ b/src/app/shared/object-list/my-dspace-result-list-element/workflow-item-search-result/workflow-item-search-result-list-element.component.html @@ -2,7 +2,7 @@ + [context]="badgeContext">
diff --git a/src/app/shared/object-list/my-dspace-result-list-element/workflow-item-search-result/workflow-item-search-result-list-element.component.spec.ts b/src/app/shared/object-list/my-dspace-result-list-element/workflow-item-search-result/workflow-item-search-result-list-element.component.spec.ts index 4a62707edf..52a13a69e1 100644 --- a/src/app/shared/object-list/my-dspace-result-list-element/workflow-item-search-result/workflow-item-search-result-list-element.component.spec.ts +++ b/src/app/shared/object-list/my-dspace-result-list-element/workflow-item-search-result/workflow-item-search-result-list-element.component.spec.ts @@ -105,8 +105,8 @@ describe('WorkflowItemSearchResultListElementComponent', () => { }); }); - it('should have the correct child context', () => { - expect(component.childContext).toEqual(Context.MyDSpaceWorkflow); + it('should have the correct badge context', () => { + expect(component.badgeContext).toEqual(Context.MyDSpaceWorkflow); }); it('should forward workflowitem-actions processCompleted event to the reloadedObject event emitter', fakeAsync(() => { diff --git a/src/app/shared/object-list/my-dspace-result-list-element/workspace-item-search-result/workspace-item-search-result-list-element.component.html b/src/app/shared/object-list/my-dspace-result-list-element/workspace-item-search-result/workspace-item-search-result-list-element.component.html index 2e7165795e..724db2892d 100644 --- a/src/app/shared/object-list/my-dspace-result-list-element/workspace-item-search-result/workspace-item-search-result-list-element.component.html +++ b/src/app/shared/object-list/my-dspace-result-list-element/workspace-item-search-result/workspace-item-search-result-list-element.component.html @@ -2,7 +2,7 @@ + [context]="badgeContext">
diff --git a/src/app/shared/object-list/my-dspace-result-list-element/workspace-item-search-result/workspace-item-search-result-list-element.component.spec.ts b/src/app/shared/object-list/my-dspace-result-list-element/workspace-item-search-result/workspace-item-search-result-list-element.component.spec.ts index 1ae64fd88a..54344bb879 100644 --- a/src/app/shared/object-list/my-dspace-result-list-element/workspace-item-search-result/workspace-item-search-result-list-element.component.spec.ts +++ b/src/app/shared/object-list/my-dspace-result-list-element/workspace-item-search-result/workspace-item-search-result-list-element.component.spec.ts @@ -104,8 +104,8 @@ describe('WorkspaceItemSearchResultListElementComponent', () => { }); }); - it('should have correct child context', () => { - expect(component.childContext).toEqual(Context.MyDSpaceWorkspace); + it('should have correct badge context', () => { + expect(component.badgeContext).toEqual(Context.MyDSpaceWorkspace); }); it('should forward workspaceitem-actions processCompleted event to the reloadedObject event emitter', fakeAsync(() => { From f44bdc9c772d06c83a0d9616c3ca42539222f24a Mon Sep 17 00:00:00 2001 From: Art Lowel Date: Thu, 4 May 2023 17:41:47 +0200 Subject: [PATCH 158/409] fix an issue where the current page would be used instead of a third party referrer --- .../services/browser.referrer.service.spec.ts | 35 +++++++++++++------ .../core/services/browser.referrer.service.ts | 18 ++++++---- 2 files changed, 37 insertions(+), 16 deletions(-) diff --git a/src/app/core/services/browser.referrer.service.spec.ts b/src/app/core/services/browser.referrer.service.spec.ts index bff01bf913..9dc8f466b6 100644 --- a/src/app/core/services/browser.referrer.service.spec.ts +++ b/src/app/core/services/browser.referrer.service.spec.ts @@ -10,7 +10,7 @@ describe(`BrowserReferrerService`, () => { beforeEach(() => { routeService = { - getPreviousUrl: () => observableOf('') + getHistory: () => observableOf([]) } as any; service = new BrowserReferrerService( { referrer: documentReferrer }, @@ -20,12 +20,9 @@ describe(`BrowserReferrerService`, () => { }); describe(`getReferrer`, () => { - let prevUrl: string; - - describe(`when getPreviousUrl is an empty string`, () => { + describe(`when the history is an empty`, () => { beforeEach(() => { - prevUrl = ''; - spyOn(routeService, 'getPreviousUrl').and.returnValue(observableOf(prevUrl)); + spyOn(routeService, 'getHistory').and.returnValue(observableOf([])); }); it(`should return document.referrer`, (done: DoneFn) => { @@ -36,13 +33,31 @@ describe(`BrowserReferrerService`, () => { }); }); - describe(`when getPreviousUrl is not empty`, () => { + describe(`when the history only contains the current route`, () => { beforeEach(() => { - prevUrl = '/some/local/route'; - spyOn(routeService, 'getPreviousUrl').and.returnValue(observableOf(prevUrl)); + spyOn(routeService, 'getHistory').and.returnValue(observableOf(['/current/route'])); }); - it(`should return the value emitted by getPreviousUrl combined with the origin from HardRedirectService`, (done: DoneFn) => { + it(`should return document.referrer`, (done: DoneFn) => { + service.getReferrer().subscribe((emittedReferrer: string) => { + expect(emittedReferrer).toBe(documentReferrer); + done(); + }); + }); + }); + + describe(`when the history contains multiple routes`, () => { + const prevUrl = '/the/route/we/need'; + beforeEach(() => { + spyOn(routeService, 'getHistory').and.returnValue(observableOf([ + '/first/route', + '/second/route', + prevUrl, + '/current/route' + ])); + }); + + it(`should return the last route before the current one combined with the origin from HardRedirectService`, (done: DoneFn) => { service.getReferrer().subscribe((emittedReferrer: string) => { expect(emittedReferrer).toBe(origin + prevUrl); done(); diff --git a/src/app/core/services/browser.referrer.service.ts b/src/app/core/services/browser.referrer.service.ts index 1bf1cf2d4a..5aae750599 100644 --- a/src/app/core/services/browser.referrer.service.ts +++ b/src/app/core/services/browser.referrer.service.ts @@ -1,7 +1,7 @@ import { ReferrerService } from './referrer.service'; import { Observable } from 'rxjs'; import { map } from 'rxjs/operators'; -import { isEmpty } from '../../shared/empty.util'; +import { isEmpty, hasNoValue } from '../../shared/empty.util'; import { URLCombiner } from '../url-combiner/url-combiner'; import { Inject, Injectable } from '@angular/core'; import { DOCUMENT } from '@angular/common'; @@ -33,13 +33,19 @@ export class BrowserReferrerService extends ReferrerService { * in the store yet, document.referrer will be used */ public getReferrer(): Observable { - return this.routeService.getPreviousUrl().pipe( - map((prevUrl: string) => { - // if we don't have anything in the history yet, return document.referrer - // (note that that may be empty too, e.g. if you've just opened a new browser tab) - if (isEmpty(prevUrl)) { + return this.routeService.getHistory().pipe( + map((history: string[]) => { + const currentURL = history[history.length - 1]; + // if the current URL isn't set yet, or the only URL in the history is the current one, + // return document.referrer (note that that may be empty too, e.g. if you've just opened a + // new browser tab) + if (hasNoValue(currentURL) || history.every((url: string) => url === currentURL)) { return this.document.referrer; } else { + // reverse the history + const reversedHistory = [...history].reverse(); + // and find the first URL that differs from the current one + const prevUrl = reversedHistory.find((url: string) => url !== currentURL); return new URLCombiner(this.hardRedirectService.getCurrentOrigin(), prevUrl).toString(); } }) From 325d7cc9e858429260989ff66e405a0a95bdcf83 Mon Sep 17 00:00:00 2001 From: lotte Date: Fri, 5 May 2023 09:53:29 +0200 Subject: [PATCH 159/409] Added aria label to navbar search button --- src/app/search-navbar/search-navbar.component.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/search-navbar/search-navbar.component.html b/src/app/search-navbar/search-navbar.component.html index c480066872..34207c0fed 100644 --- a/src/app/search-navbar/search-navbar.component.html +++ b/src/app/search-navbar/search-navbar.component.html @@ -4,7 +4,7 @@ - From 091d0fccf7121f1cfce2e7f98dfdec8d2e6e5528 Mon Sep 17 00:00:00 2001 From: Alexandre Vryghem Date: Fri, 5 May 2023 17:45:00 +0100 Subject: [PATCH 160/409] 100553: Explicitly request EditInPlaceFieldComponent's metadata field suggestions with the sort by fieldName,ASC --- .../edit-in-place-field/edit-in-place-field.component.html | 2 +- .../edit-in-place-field/edit-in-place-field.component.ts | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/app/item-page/edit-item-page/item-metadata/edit-in-place-field/edit-in-place-field.component.html b/src/app/item-page/edit-item-page/item-metadata/edit-in-place-field/edit-in-place-field.component.html index 64e863b8bf..c6b3a62007 100644 --- a/src/app/item-page/edit-item-page/item-metadata/edit-in-place-field/edit-in-place-field.component.html +++ b/src/app/item-page/edit-item-page/item-metadata/edit-in-place-field/edit-in-place-field.component.html @@ -12,7 +12,7 @@ (clickSuggestion)="update(suggestionControl)" (typeSuggestion)="update(suggestionControl)" (dsClickOutside)="checkValidity(suggestionControl)" - (findSuggestions)="findMetadataFieldSuggestions($event, { elementsPerPage: 10 })" + (findSuggestions)="findMetadataFieldSuggestions($event, { elementsPerPage: 10, sort: defaultMetadataSort })" #suggestionControl="ngModel" [valid]="(valid | async) !== false" dsAutoFocus autoFocusSelector=".suggestion_input" diff --git a/src/app/item-page/edit-item-page/item-metadata/edit-in-place-field/edit-in-place-field.component.ts b/src/app/item-page/edit-item-page/item-metadata/edit-in-place-field/edit-in-place-field.component.ts index 6ed057bc6a..f069e3edfc 100644 --- a/src/app/item-page/edit-item-page/item-metadata/edit-in-place-field/edit-in-place-field.component.ts +++ b/src/app/item-page/edit-item-page/item-metadata/edit-in-place-field/edit-in-place-field.component.ts @@ -16,6 +16,7 @@ import { followLink } from '../../../../shared/utils/follow-link-config.model'; import { FieldUpdate } from '../../../../core/data/object-updates/field-update.model'; import { FieldChangeType } from '../../../../core/data/object-updates/field-change-type.model'; import { FindListOptions } from '../../../../core/data/find-list-options.model'; +import { SortDirection, SortOptions } from '../../../../core/cache/models/sort-options.model'; @Component({ // eslint-disable-next-line @angular-eslint/component-selector @@ -57,6 +58,8 @@ export class EditInPlaceFieldComponent implements OnInit, OnChanges { */ metadataFieldSuggestions: BehaviorSubject = new BehaviorSubject([]); + defaultMetadataSort: SortOptions = new SortOptions('fieldName', SortDirection.ASC); + constructor( private registryService: RegistryService, private objectUpdatesService: ObjectUpdatesService, From 74cd70d8609c2d3d703ca921fa7af29e9a2dd1e5 Mon Sep 17 00:00:00 2001 From: Alexandre Vryghem Date: Sun, 30 Apr 2023 13:19:00 +0100 Subject: [PATCH 161/409] Fixed communities collection and sub-community sorting not working after page refresh --- ...nity-page-sub-collection-list.component.ts | 17 +++++++++----- ...unity-page-sub-community-list.component.ts | 23 ++++++++----------- 2 files changed, 20 insertions(+), 20 deletions(-) diff --git a/src/app/community-page/sub-collection-list/community-page-sub-collection-list.component.ts b/src/app/community-page/sub-collection-list/community-page-sub-collection-list.component.ts index 181ee7cd6f..3a77149e5b 100644 --- a/src/app/community-page/sub-collection-list/community-page-sub-collection-list.component.ts +++ b/src/app/community-page/sub-collection-list/community-page-sub-collection-list.component.ts @@ -1,4 +1,5 @@ import { Component, Input, OnDestroy, OnInit } from '@angular/core'; +import { ActivatedRoute } from '@angular/router'; import { BehaviorSubject, combineLatest as observableCombineLatest } from 'rxjs'; @@ -49,19 +50,23 @@ export class CommunityPageSubCollectionListComponent implements OnInit, OnDestro */ subCollectionsRDObs: BehaviorSubject>> = new BehaviorSubject>>({} as any); - constructor(private cds: CollectionDataService, - private paginationService: PaginationService, - - ) {} + constructor( + protected cds: CollectionDataService, + protected paginationService: PaginationService, + protected route: ActivatedRoute, + ) { + } ngOnInit(): void { this.config = new PaginationComponentOptions(); this.config.id = this.pageId; if (hasValue(this.pageSize)) { this.config.pageSize = this.pageSize; + } else { + this.config.pageSize = this.route.snapshot.queryParams[this.pageId + '.rpp'] ?? this.config.pageSize; } - this.config.currentPage = 1; - this.sortConfig = new SortOptions('dc.title', SortDirection.ASC); + this.config.currentPage = this.route.snapshot.queryParams[this.pageId + '.page'] ?? 1; + this.sortConfig = new SortOptions('dc.title', SortDirection[this.route.snapshot.queryParams[this.pageId + '.sd']] ?? SortDirection.ASC); this.initPage(); } diff --git a/src/app/community-page/sub-community-list/community-page-sub-community-list.component.ts b/src/app/community-page/sub-community-list/community-page-sub-community-list.component.ts index e9da10bfa1..5a0409a051 100644 --- a/src/app/community-page/sub-community-list/community-page-sub-community-list.component.ts +++ b/src/app/community-page/sub-community-list/community-page-sub-community-list.component.ts @@ -1,4 +1,5 @@ import { Component, Input, OnDestroy, OnInit } from '@angular/core'; +import { ActivatedRoute } from '@angular/router'; import { BehaviorSubject, combineLatest as observableCombineLatest } from 'rxjs'; @@ -9,7 +10,6 @@ import { PaginatedList } from '../../core/data/paginated-list.model'; import { PaginationComponentOptions } from '../../shared/pagination/pagination-component-options.model'; import { SortDirection, SortOptions } from '../../core/cache/models/sort-options.model'; import { CommunityDataService } from '../../core/data/community-data.service'; -import { takeUntilCompletedRemoteData } from '../../core/shared/operators'; import { switchMap } from 'rxjs/operators'; import { PaginationService } from '../../core/pagination/pagination.service'; import { hasValue } from '../../shared/empty.util'; @@ -52,8 +52,10 @@ export class CommunityPageSubCommunityListComponent implements OnInit, OnDestroy */ subCommunitiesRDObs: BehaviorSubject>> = new BehaviorSubject>>({} as any); - constructor(private cds: CommunityDataService, - private paginationService: PaginationService + constructor( + protected cds: CommunityDataService, + protected paginationService: PaginationService, + protected route: ActivatedRoute, ) { } @@ -62,9 +64,11 @@ export class CommunityPageSubCommunityListComponent implements OnInit, OnDestroy this.config.id = this.pageId; if (hasValue(this.pageSize)) { this.config.pageSize = this.pageSize; + } else { + this.config.pageSize = this.route.snapshot.queryParams[this.pageId + '.rpp'] ?? this.config.pageSize; } - this.config.currentPage = 1; - this.sortConfig = new SortOptions('dc.title', SortDirection.ASC); + this.config.currentPage = this.route.snapshot.queryParams[this.pageId + '.page'] ?? 1; + this.sortConfig = new SortOptions('dc.title', SortDirection[this.route.snapshot.queryParams[this.pageId + '.sd']] ?? SortDirection.ASC); this.initPage(); } @@ -86,15 +90,6 @@ export class CommunityPageSubCommunityListComponent implements OnInit, OnDestroy ).subscribe((results) => { this.subCommunitiesRDObs.next(results); }); - - - this.cds.findByParent(this.community.id, { - currentPage: this.config.currentPage, - elementsPerPage: this.config.pageSize, - sort: { field: this.sortConfig.field, direction: this.sortConfig.direction } - }).pipe(takeUntilCompletedRemoteData()).subscribe((results) => { - this.subCommunitiesRDObs.next(results); - }); } ngOnDestroy(): void { From 9ab022c2251002d3a438e2f7189445cd7d7fba4a Mon Sep 17 00:00:00 2001 From: "Gantner, Florian Klaus" Date: Mon, 8 May 2023 09:17:13 +0200 Subject: [PATCH 162/409] remove buggy translation object fixes https://github.com/DSpace/dspace-angular/issues/2219 by removing the json object for key form.other-information which avoids to load subordinated translation keys --- src/assets/i18n/ar.json5 | 4 ---- src/assets/i18n/bn.json5 | 3 --- src/assets/i18n/ca.json5 | 3 --- src/assets/i18n/cs.json5 | 4 ---- src/assets/i18n/de.json5 | 3 --- src/assets/i18n/en.json5 | 2 -- src/assets/i18n/es.json5 | 3 --- src/assets/i18n/fi.json5 | 3 --- src/assets/i18n/fr.json5 | 3 --- src/assets/i18n/gd.json5 | 3 --- src/assets/i18n/hu.json5 | 5 +---- src/assets/i18n/ja.json5 | 4 ---- src/assets/i18n/kk.json5 | 3 --- src/assets/i18n/lv.json5 | 3 --- src/assets/i18n/nl.json5 | 3 --- src/assets/i18n/pl.json5 | 3 --- src/assets/i18n/pt-BR.json5 | 3 --- src/assets/i18n/pt-PT.json5 | 3 --- src/assets/i18n/sv.json5 | 3 --- src/assets/i18n/sw.json5 | 4 ---- src/assets/i18n/tr.json5 | 3 --- src/assets/i18n/uk.json5 | 3 --- 22 files changed, 1 insertion(+), 70 deletions(-) diff --git a/src/assets/i18n/ar.json5 b/src/assets/i18n/ar.json5 index c2b00b0cd6..70f5fdadb1 100644 --- a/src/assets/i18n/ar.json5 +++ b/src/assets/i18n/ar.json5 @@ -2489,10 +2489,6 @@ // TODO New key - Add a translation "form.no-value": "No value entered", - // "form.other-information": {}, - // TODO New key - Add a translation - "form.other-information": {}, - // "form.remove": "Remove", // TODO New key - Add a translation "form.remove": "Remove", diff --git a/src/assets/i18n/bn.json5 b/src/assets/i18n/bn.json5 index d39c8e8985..cc05d12828 100644 --- a/src/assets/i18n/bn.json5 +++ b/src/assets/i18n/bn.json5 @@ -2205,9 +2205,6 @@ // "form.no-value": "No value entered", "form.no-value": "কোন মান প্রবেশ", - // "form.other-information": {}, - "form.other-information": {}, - // "form.remove": "Remove", "form.remove": "অপসারণ", diff --git a/src/assets/i18n/ca.json5 b/src/assets/i18n/ca.json5 index af5820ea3d..34279548bb 100644 --- a/src/assets/i18n/ca.json5 +++ b/src/assets/i18n/ca.json5 @@ -2386,9 +2386,6 @@ // "form.no-value": "No value entered", "form.no-value": "No s'ha introduït cap valor", - // "form.other-information": {}, - "form.other-information": {}, - // "form.remove": "Remove", "form.remove": "Eliminar", diff --git a/src/assets/i18n/cs.json5 b/src/assets/i18n/cs.json5 index 36d137ebe3..f3155e9f57 100644 --- a/src/assets/i18n/cs.json5 +++ b/src/assets/i18n/cs.json5 @@ -2436,10 +2436,6 @@ // "form.no-value": "No value entered", "form.no-value": "Nebyla zadána hodnota", - // "form.other-information": {}, - // TODO New key - Add a translation - "form.other-information": {}, - // "form.remove": "Remove", "form.remove": "Smazat", diff --git a/src/assets/i18n/de.json5 b/src/assets/i18n/de.json5 index 661c102577..546b705679 100644 --- a/src/assets/i18n/de.json5 +++ b/src/assets/i18n/de.json5 @@ -2077,9 +2077,6 @@ // "form.no-value": "No value entered", "form.no-value": "Kein Wert eingegeben", - // "form.other-information": {}, - "form.other-information": {}, - // "form.remove": "Remove", "form.remove": "Entfernen", diff --git a/src/assets/i18n/en.json5 b/src/assets/i18n/en.json5 index 66824e56b3..f3e4d938ff 100644 --- a/src/assets/i18n/en.json5 +++ b/src/assets/i18n/en.json5 @@ -1737,8 +1737,6 @@ "form.no-value": "No value entered", - "form.other-information": {}, - "form.remove": "Remove", "form.save": "Save", diff --git a/src/assets/i18n/es.json5 b/src/assets/i18n/es.json5 index 4d5e909af0..7a2f2fa3db 100644 --- a/src/assets/i18n/es.json5 +++ b/src/assets/i18n/es.json5 @@ -2565,9 +2565,6 @@ // "form.no-value": "No value entered", "form.no-value": "No se introdujo ningún valor", - // "form.other-information": {}, - "form.other-information": {}, - // "form.remove": "Remove", "form.remove": "Eliminar", diff --git a/src/assets/i18n/fi.json5 b/src/assets/i18n/fi.json5 index 7461c7aa41..ca41138eda 100644 --- a/src/assets/i18n/fi.json5 +++ b/src/assets/i18n/fi.json5 @@ -1896,9 +1896,6 @@ // "form.no-value": "No value entered", "form.no-value": "Ei syötettyä arvoa", - // "form.other-information": {}, - "form.other-information": {}, - // "form.remove": "Remove", "form.remove": "Poista", diff --git a/src/assets/i18n/fr.json5 b/src/assets/i18n/fr.json5 index 548de64241..8ee4dc7d22 100644 --- a/src/assets/i18n/fr.json5 +++ b/src/assets/i18n/fr.json5 @@ -2163,9 +2163,6 @@ // "form.no-value": "No value entered", "form.no-value": "Aucune valeur entrée", - // "form.other-information": {}, - "form.other-information": {}, - // "form.remove": "Remove", "form.remove": "Supprimer", diff --git a/src/assets/i18n/gd.json5 b/src/assets/i18n/gd.json5 index 64d22b2faf..6096073d56 100644 --- a/src/assets/i18n/gd.json5 +++ b/src/assets/i18n/gd.json5 @@ -2220,9 +2220,6 @@ // "form.no-value": "No value entered", "form.no-value": "Cha deach luach a chur a-steach", - // "form.other-information": {}, - "form.other-information": {}, - // "form.remove": "Remove", "form.remove": "Thoir às", diff --git a/src/assets/i18n/hu.json5 b/src/assets/i18n/hu.json5 index 3b2ef45afa..373d73aec5 100644 --- a/src/assets/i18n/hu.json5 +++ b/src/assets/i18n/hu.json5 @@ -2769,9 +2769,6 @@ // "form.no-value": "No value entered", "form.no-value": "Nem adott meg értéket", - // "form.other-information": {}, - "form.other-information": {}, - // "form.remove": "Remove", "form.remove": "Törlés", @@ -8713,4 +8710,4 @@ "admin.system-wide-alert.title": "System-wide Alerts", -} \ No newline at end of file +} diff --git a/src/assets/i18n/ja.json5 b/src/assets/i18n/ja.json5 index acf655b025..94dfc9aa98 100644 --- a/src/assets/i18n/ja.json5 +++ b/src/assets/i18n/ja.json5 @@ -2489,10 +2489,6 @@ // TODO New key - Add a translation "form.no-value": "No value entered", - // "form.other-information": {}, - // TODO New key - Add a translation - "form.other-information": {}, - // "form.remove": "Remove", // TODO New key - Add a translation "form.remove": "Remove", diff --git a/src/assets/i18n/kk.json5 b/src/assets/i18n/kk.json5 index d45eba67f9..354eb1104a 100644 --- a/src/assets/i18n/kk.json5 +++ b/src/assets/i18n/kk.json5 @@ -2328,9 +2328,6 @@ // "form.no-value": "No value entered", "form.no-value": "Мәні енгізілмеді", - // "form.other-information": {}, - "form.other-information": {}, - // "form.remove": "Remove", "form.remove": "Өшіру", diff --git a/src/assets/i18n/lv.json5 b/src/assets/i18n/lv.json5 index 3ef306e8bf..9b4058a3e6 100644 --- a/src/assets/i18n/lv.json5 +++ b/src/assets/i18n/lv.json5 @@ -2069,9 +2069,6 @@ // "form.no-value": "No value entered", "form.no-value": "Vērtība netika ievadīta", - // "form.other-information": {}, - "form.other-information": {}, - // "form.remove": "Remove", "form.remove": "Dzēst", diff --git a/src/assets/i18n/nl.json5 b/src/assets/i18n/nl.json5 index 21682f8516..520a8ca427 100644 --- a/src/assets/i18n/nl.json5 +++ b/src/assets/i18n/nl.json5 @@ -2267,9 +2267,6 @@ // "form.no-value": "No value entered", "form.no-value": "Geen waarde ingevoerd", - // "form.other-information": {}, - "form.other-information": {}, - // "form.remove": "Remove", "form.remove": "Verwijder", diff --git a/src/assets/i18n/pl.json5 b/src/assets/i18n/pl.json5 index c690f765be..d748b94888 100644 --- a/src/assets/i18n/pl.json5 +++ b/src/assets/i18n/pl.json5 @@ -2089,9 +2089,6 @@ "form.group-collapse-help": "Kliknij tutaj, aby zwinąć", "form.group-expand": "Rozwiń", "form.group-expand-help": "Kliknij tutaj, aby rozwinąć", - "form.other-information": { - - }, "health.breadcrumbs": "Stan systemu", "health-page.heading": "Stan systemu", "health-page.info-tab": "Informacje", diff --git a/src/assets/i18n/pt-BR.json5 b/src/assets/i18n/pt-BR.json5 index 26897da5ed..25f1e0fb7c 100644 --- a/src/assets/i18n/pt-BR.json5 +++ b/src/assets/i18n/pt-BR.json5 @@ -2254,9 +2254,6 @@ // "form.no-value": "No value entered", "form.no-value": "Nenhum valor informado", - // "form.other-information": {}, - "form.other-information": {}, - // "form.remove": "Remove", "form.remove": "Apagar", diff --git a/src/assets/i18n/pt-PT.json5 b/src/assets/i18n/pt-PT.json5 index 0e2c3d0cc0..557a5f29d7 100644 --- a/src/assets/i18n/pt-PT.json5 +++ b/src/assets/i18n/pt-PT.json5 @@ -2102,9 +2102,6 @@ // "form.no-value": "No value entered", "form.no-value": "Nenhum valor informado", - // "form.other-information": {}, - "form.other-information": {}, - // "form.remove": "Remove", "form.remove": "Apagar", diff --git a/src/assets/i18n/sv.json5 b/src/assets/i18n/sv.json5 index 0694499292..c988577c92 100644 --- a/src/assets/i18n/sv.json5 +++ b/src/assets/i18n/sv.json5 @@ -2232,9 +2232,6 @@ // "form.no-value": "No value entered", "form.no-value": "Inget värde har angivits", - // "form.other-information": {}, - "form.other-information": {}, - // "form.remove": "Remove", "form.remove": "Ta bort", diff --git a/src/assets/i18n/sw.json5 b/src/assets/i18n/sw.json5 index 947022a53b..47253dea9f 100644 --- a/src/assets/i18n/sw.json5 +++ b/src/assets/i18n/sw.json5 @@ -2489,10 +2489,6 @@ // TODO New key - Add a translation "form.no-value": "No value entered", - // "form.other-information": {}, - // TODO New key - Add a translation - "form.other-information": {}, - // "form.remove": "Remove", // TODO New key - Add a translation "form.remove": "Remove", diff --git a/src/assets/i18n/tr.json5 b/src/assets/i18n/tr.json5 index 0ca6e9dce6..e9869e0019 100644 --- a/src/assets/i18n/tr.json5 +++ b/src/assets/i18n/tr.json5 @@ -1894,9 +1894,6 @@ // "form.no-value": "No value entered", "form.no-value": "Değer girilmez", - // "form.other-information": {}, - "form.other-information": {}, - // "form.remove": "Remove", "form.remove": "Kaldır", diff --git a/src/assets/i18n/uk.json5 b/src/assets/i18n/uk.json5 index 7ed4d4ead6..5cbb480179 100644 --- a/src/assets/i18n/uk.json5 +++ b/src/assets/i18n/uk.json5 @@ -2011,9 +2011,6 @@ // "form.no-value": "No value entered", "form.no-value": "Значення не введено", - // "form.other-information": {}, - "form.other-information": {}, - // "form.remove": "Remove", "form.remove": "Видалити", From 77c19d9fb1b31b2a1f34c377116e7cdd30f90c47 Mon Sep 17 00:00:00 2001 From: Michael Spalti Date: Mon, 8 May 2023 11:54:40 -0700 Subject: [PATCH 163/409] Updated mirador webpack configuration. --- .gitignore | 2 ++ src/mirador-viewer/{index.js => config.default.js} | 13 +++++++++++++ webpack/webpack.mirador.config.ts | 5 ++++- 3 files changed, 19 insertions(+), 1 deletion(-) rename src/mirador-viewer/{index.js => config.default.js} (88%) diff --git a/.gitignore b/.gitignore index bdd0d4e589..7d065aca06 100644 --- a/.gitignore +++ b/.gitignore @@ -39,3 +39,5 @@ package-lock.json /nbproject/ junit.xml + +/src/mirador-viewer/config.local.js diff --git a/src/mirador-viewer/index.js b/src/mirador-viewer/config.default.js similarity index 88% rename from src/mirador-viewer/index.js rename to src/mirador-viewer/config.default.js index 6cc4303f1f..0f625093a5 100644 --- a/src/mirador-viewer/index.js +++ b/src/mirador-viewer/config.default.js @@ -1,4 +1,17 @@ import Mirador from 'mirador/dist/es/src/index'; + +// You can modify this default Mirador configuration file. However, +// you should consider creating a copy of this file named +// 'index.local.js'. If that file exists it will be used to build +// your local Mirador instance. This allows you to keep local +// Mirador configuration separate from this default distribution +// copy. + +// For an example of all Mirador configuration options, see +// https://github.com/ProjectMirador/mirador/blob/master/src/config/settings.js + +// You can add or remove plugins. When adding new plugins be sure to also +// import them into the project via your package.json dependencies. import miradorShareDialogPlugin from 'mirador-share-plugin/es/MiradorShareDialog'; import miradorSharePlugin from 'mirador-share-plugin/es/miradorSharePlugin'; import miradorDownloadPlugin from 'mirador-dl-plugin/es/miradorDownloadPlugin'; diff --git a/webpack/webpack.mirador.config.ts b/webpack/webpack.mirador.config.ts index c0083ded6e..7699cf1bdc 100644 --- a/webpack/webpack.mirador.config.ts +++ b/webpack/webpack.mirador.config.ts @@ -1,10 +1,13 @@ const CopyWebpackPlugin = require('copy-webpack-plugin'); const path = require('path'); +// @ts-ignore +const fs = require('fs'); module.exports = { mode: 'production', entry: { - mirador: './src/mirador-viewer/index.js' + mirador: fs.existsSync('./src/mirador-viewer/config.local.js')? './src/mirador-viewer/config.local.js' : + './src/mirador-viewer/config.default.js' }, output: { path: path.resolve(__dirname, '..' , 'dist/iiif/mirador'), From 508fa76e45d29dd04112324cd6b877d975a312ee Mon Sep 17 00:00:00 2001 From: Michael Spalti Date: Mon, 8 May 2023 12:20:55 -0700 Subject: [PATCH 164/409] Updated comment. --- src/mirador-viewer/config.default.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mirador-viewer/config.default.js b/src/mirador-viewer/config.default.js index 0f625093a5..71df8adcc3 100644 --- a/src/mirador-viewer/config.default.js +++ b/src/mirador-viewer/config.default.js @@ -2,7 +2,7 @@ import Mirador from 'mirador/dist/es/src/index'; // You can modify this default Mirador configuration file. However, // you should consider creating a copy of this file named -// 'index.local.js'. If that file exists it will be used to build +// 'config.local.js'. If that file exists it will be used to build // your local Mirador instance. This allows you to keep local // Mirador configuration separate from this default distribution // copy. From 2d326d1f467457117136852ee48886793d8010e4 Mon Sep 17 00:00:00 2001 From: Kristof De Langhe Date: Tue, 9 May 2023 11:34:57 +0200 Subject: [PATCH 165/409] 101108: Fix SSR animation console error --- src/app/root/root.component.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/app/root/root.component.ts b/src/app/root/root.component.ts index 2bbeec6282..3c2d65fc1f 100644 --- a/src/app/root/root.component.ts +++ b/src/app/root/root.component.ts @@ -19,6 +19,7 @@ import { environment } from '../../environments/environment'; import { slideSidebarPadding } from '../shared/animations/slide'; import { MenuID } from '../shared/menu/menu-id.model'; import { getPageInternalServerErrorRoute } from '../app-routing-paths'; +import { hasValueOperator } from '../shared/empty.util'; @Component({ selector: 'ds-root', @@ -63,8 +64,8 @@ export class RootComponent implements OnInit { ngOnInit() { this.sidebarVisible = this.menuService.isMenuVisibleWithVisibleSections(MenuID.ADMIN); - this.collapsedSidebarWidth = this.cssService.getVariable('--ds-collapsed-sidebar-width'); - this.totalSidebarWidth = this.cssService.getVariable('--ds-total-sidebar-width'); + this.collapsedSidebarWidth = this.cssService.getVariable('--ds-collapsed-sidebar-width').pipe(hasValueOperator()); + this.totalSidebarWidth = this.cssService.getVariable('--ds-total-sidebar-width').pipe(hasValueOperator()); const sidebarCollapsed = this.menuService.isMenuCollapsed(MenuID.ADMIN); this.slideSidebarOver = combineLatestObservable([sidebarCollapsed, this.windowService.isXsOrSm()]) From 301863fb807563941ccd443a97faa824cb949505 Mon Sep 17 00:00:00 2001 From: Enea Jahollari Date: Tue, 9 May 2023 12:42:08 +0200 Subject: [PATCH 166/409] [CST-9636] Added translations and validations to item, community and collection access control --- .../collection-access-control.component.html | 74 +++++++++---- .../collection-access-control.component.ts | 8 ++ .../collection-access-control.service.ts | 2 +- .../community-access-control.component.html | 74 +++++++++---- .../community-access-control.component.ts | 7 ++ .../bulk-access-condition-options.service.ts | 2 +- .../item-access-control.component.html | 101 ++++++++++++------ .../item-access-control.component.ts | 10 +- .../item-access-control.service.ts | 5 +- .../access-control-array-form.component.html | 16 ++- .../access-control-array-form.component.ts | 70 ++++++++++-- .../control-max-end-date.pipe.ts | 2 +- .../control-max-start-date.pipe.ts | 2 +- src/assets/i18n/en.json5 | 20 ++++ 14 files changed, 296 insertions(+), 97 deletions(-) diff --git a/src/app/collection-page/edit-collection-page/collection-access-control/collection-access-control.component.html b/src/app/collection-page/edit-collection-page/collection-access-control/collection-access-control.component.html index 52eda57f2c..ac07f30f84 100644 --- a/src/app/collection-page/edit-collection-page/collection-access-control/collection-access-control.component.html +++ b/src/app/collection-page/edit-collection-page/collection-access-control/collection-access-control.component.html @@ -1,39 +1,51 @@
-

- This form allows you to perform changes to the access condition of all the items owned by collection under this community. - Changes can be performed on the access condition for the metadata (item) or for the content (bitstream). -

+

{{'collection-access-control-title' | translate}}

-

Item's Metadata

- +

+ {{ 'access-control-item-header-toggle' | translate }} +

+ +
-
Mode
+
+ {{'access-control-mode' | translate}} +
- + name="itemMode" id="itemReplace" value="replace" + [disabled]="!state.item.toggleStatus" + [(ngModel)]="state.item.accessMode"> +
- + name="itemMode" id="itemAdd" value="add" + [disabled]="!state.item.toggleStatus" + [(ngModel)]="state.item.accessMode"> +
-
Access conditions
+
{{'access-control-access-conditions' | translate}}
- You have not specified any access conditions, the new items access conditions will be inherited from the owning collection. + {{'access-control-no-access-conditions-warning-message' | translate}}
@@ -45,31 +57,43 @@
-

Bitstreams

+

+ {{ 'access-control-bitstream-header-toggle' | translate }} +

-
Mode
+
+ {{'access-control-mode' | translate}} +
- + name="bitstreamMode" id="bitstreamReplace" value="replace" + [disabled]="!state.bitstream.toggleStatus" + [(ngModel)]="state.bitstream.accessMode"> +
- + name="bitstreamMode" id="bitstreamAdd" value="add" + [disabled]="!state.bitstream.toggleStatus" + [(ngModel)]="state.bitstream.accessMode"> +
-
Access conditions
+
{{'access-control-access-conditions' | translate}}
- You have not specified any access conditions, the new items access conditions will be inherited from the owning collection. + {{'access-control-no-access-conditions-warning-message' | translate}}
@@ -84,8 +108,12 @@
- - + +
diff --git a/src/app/collection-page/edit-collection-page/collection-access-control/collection-access-control.component.ts b/src/app/collection-page/edit-collection-page/collection-access-control/collection-access-control.component.ts index 0791e29233..35ba6076f9 100644 --- a/src/app/collection-page/edit-collection-page/collection-access-control/collection-access-control.component.ts +++ b/src/app/collection-page/edit-collection-page/collection-access-control/collection-access-control.component.ts @@ -42,6 +42,14 @@ export class CollectionAccessControlComponent implements OnInit { console.log('itemAccess', itemAccess); } + handleStatusChange(type: 'item' | 'bitstream', active: boolean) { + if (type === 'bitstream') { + active ? this.bitstreamAccessCmp.enable() : this.bitstreamAccessCmp.disable(); + } else if (type === 'item') { + active ? this.itemAccessCmp.enable() : this.itemAccessCmp.disable(); + } + } + } const initialState = { diff --git a/src/app/collection-page/edit-collection-page/collection-access-control/collection-access-control.service.ts b/src/app/collection-page/edit-collection-page/collection-access-control/collection-access-control.service.ts index 9cc7b8d85a..3267461fe6 100644 --- a/src/app/collection-page/edit-collection-page/collection-access-control/collection-access-control.service.ts +++ b/src/app/collection-page/edit-collection-page/collection-access-control/collection-access-control.service.ts @@ -1,5 +1,5 @@ import { Injectable } from '@angular/core'; -import { AccessControlItem } from '../../../shared/access-control-array-form/access-control-array-form.component'; +import { AccessControlItem } from 'src/app/core/shared/bulk-access-condition-options.model'; import { Observable, of } from 'rxjs'; export interface AccessControlDropdownDataResponse { diff --git a/src/app/community-page/edit-community-page/community-access-control/community-access-control.component.html b/src/app/community-page/edit-community-page/community-access-control/community-access-control.component.html index 52eda57f2c..26f394620a 100644 --- a/src/app/community-page/edit-community-page/community-access-control/community-access-control.component.html +++ b/src/app/community-page/edit-community-page/community-access-control/community-access-control.component.html @@ -1,39 +1,51 @@
-

- This form allows you to perform changes to the access condition of all the items owned by collection under this community. - Changes can be performed on the access condition for the metadata (item) or for the content (bitstream). -

+

{{ 'community-access-control-title' | translate }}

-

Item's Metadata

- +

+ {{ 'access-control-item-header-toggle' | translate }} +

+ +
-
Mode
+
+ {{'access-control-mode' | translate}} +
- + name="itemMode" id="itemReplace" value="replace" + [disabled]="!state.item.toggleStatus" + [(ngModel)]="state.item.accessMode"> +
- + name="itemMode" id="itemAdd" value="add" + [disabled]="!state.item.toggleStatus" + [(ngModel)]="state.item.accessMode"> +
-
Access conditions
+
{{'access-control-access-conditions' | translate}}
- You have not specified any access conditions, the new items access conditions will be inherited from the owning collection. + {{'access-control-no-access-conditions-warning-message' | translate}}
@@ -45,31 +57,43 @@
-

Bitstreams

+

+ {{ 'access-control-bitstream-header-toggle' | translate }} +

-
Mode
+
+ {{'access-control-mode' | translate}} +
- + name="bitstreamMode" id="bitstreamReplace" value="replace" + [disabled]="!state.bitstream.toggleStatus" + [(ngModel)]="state.bitstream.accessMode"> +
- + name="bitstreamMode" id="bitstreamAdd" value="add" + [disabled]="!state.bitstream.toggleStatus" + [(ngModel)]="state.bitstream.accessMode"> +
-
Access conditions
+
{{'access-control-access-conditions' | translate}}
- You have not specified any access conditions, the new items access conditions will be inherited from the owning collection. + {{'access-control-no-access-conditions-warning-message' | translate}}
@@ -84,8 +108,12 @@
- - + +
diff --git a/src/app/community-page/edit-community-page/community-access-control/community-access-control.component.ts b/src/app/community-page/edit-community-page/community-access-control/community-access-control.component.ts index 202c04b7b5..a25adb177c 100644 --- a/src/app/community-page/edit-community-page/community-access-control/community-access-control.component.ts +++ b/src/app/community-page/edit-community-page/community-access-control/community-access-control.component.ts @@ -42,6 +42,13 @@ export class CommunityAccessControlComponent implements OnInit { console.log('itemAccess', itemAccess); } + handleStatusChange(type: 'item' | 'bitstream', active: boolean) { + if (type === 'bitstream') { + active ? this.bitstreamAccessCmp.enable() : this.bitstreamAccessCmp.disable(); + } else if (type === 'item') { + active ? this.itemAccessCmp.enable() : this.itemAccessCmp.disable(); + } + } } const initialState = { diff --git a/src/app/core/data/bulk-access-condition-options.service.ts b/src/app/core/data/bulk-access-condition-options.service.ts index bfff0a8dd6..30e0402dbf 100644 --- a/src/app/core/data/bulk-access-condition-options.service.ts +++ b/src/app/core/data/bulk-access-condition-options.service.ts @@ -8,7 +8,7 @@ import { RequestService } from './request.service'; import { IdentifiableDataService } from './base/identifiable-data.service'; import { BulkAccessConditionOptions } from '../shared/bulk-access-condition-options.model'; -@Injectable() +@Injectable({ providedIn: 'root' }) /** * Data Service responsible for retrieving Bulk Access Condition Options from the REST API */ diff --git a/src/app/item-page/edit-item-page/item-access-control/item-access-control.component.html b/src/app/item-page/edit-item-page/item-access-control/item-access-control.component.html index f5a02b0452..4e72d0905f 100644 --- a/src/app/item-page/edit-item-page/item-access-control/item-access-control.component.html +++ b/src/app/item-page/edit-item-page/item-access-control/item-access-control.component.html @@ -1,39 +1,50 @@
-

- This form allows you to perform changes to the access condition of all the items owned by collection under this community. - Changes can be performed on the access condition for the metadata (item) or for the content (bitstream). -

+

{{ 'item-access-control-title' | translate }}

-

Item's Metadata

- +

+ {{ 'access-control-item-header-toggle' | translate }} +

+ +
-
Mode
+
+ {{ 'access-control-mode' | translate }} +
- + name="itemMode" id="itemReplace" value="replace" + [disabled]="!state.item.toggleStatus" + [(ngModel)]="state.item.accessMode"> +
- + name="itemMode" id="itemAdd" value="add" + [disabled]="!state.item.toggleStatus" + [(ngModel)]="state.item.accessMode"> +
-
Access conditions
- +
{{'access-control-access-conditions' | translate}}
- You have not specified any access conditions, the new items access conditions will be inherited from the owning collection. + {{'access-control-no-access-conditions-warning-message' | translate}}
@@ -45,49 +56,75 @@
-

Bitstreams

- +

+ {{'access-control-bitstream-header-toggle' | translate}} +

+ +
-
Limit the changes to specific bitstreams
+
+ {{'access-control-limit-to-specific' | translate}} +
- + name="changesLimit" id="processAll" value="all" + [disabled]="!state.bitstream.toggleStatus" + [(ngModel)]="state.bitstream.changesLimit"> +
+ name="changesLimit" id="processSelected" value="selected" + [disabled]="!state.bitstream.toggleStatus" + [(ngModel)]="state.bitstream.changesLimit">
-
Mode
+
+ {{'access-control-mode' | translate}} +
- + name="bitstreamMode" id="bitstreamReplace" value="replace" + [disabled]="!state.bitstream.toggleStatus" + [(ngModel)]="state.bitstream.accessMode"> +
- + name="bitstreamMode" id="bitstreamAdd" value="add" + [disabled]="!state.bitstream.toggleStatus" + [(ngModel)]="state.bitstream.accessMode"> +
-
Access conditions
+
+ {{'access-control-access-conditions' | translate}} +
- You have not specified any access conditions, the new items access conditions will be inherited from the owning collection. + {{'access-control-no-access-conditions-warning-message' | translate}}
@@ -102,8 +139,12 @@
- - + +
diff --git a/src/app/item-page/edit-item-page/item-access-control/item-access-control.component.ts b/src/app/item-page/edit-item-page/item-access-control/item-access-control.component.ts index 6882dfb2a1..5bd614537a 100644 --- a/src/app/item-page/edit-item-page/item-access-control/item-access-control.component.ts +++ b/src/app/item-page/edit-item-page/item-access-control/item-access-control.component.ts @@ -2,9 +2,6 @@ import { Component, OnInit, ViewChild } from '@angular/core'; import { AccessControlArrayFormComponent } from '../../../shared/access-control-array-form/access-control-array-form.component'; -import { - CollectionAccessControlService -} from '../../../collection-page/edit-collection-page/collection-access-control/collection-access-control.service'; import { shareReplay } from 'rxjs'; import { ItemAccessControlService } from './item-access-control.service'; @@ -48,6 +45,13 @@ export class ItemAccessControlComponent implements OnInit { }); } + handleStatusChange(type: 'item' | 'bitstream', active: boolean) { + if (type === 'bitstream') { + active ? this.bitstreamAccessCmp.enable() : this.bitstreamAccessCmp.disable(); + } else if (type === 'item') { + active ? this.itemAccessCmp.enable() : this.itemAccessCmp.disable(); + } + } } const initialState = { diff --git a/src/app/item-page/edit-item-page/item-access-control/item-access-control.service.ts b/src/app/item-page/edit-item-page/item-access-control/item-access-control.service.ts index 3eeacfe1ce..57b28f81b0 100644 --- a/src/app/item-page/edit-item-page/item-access-control/item-access-control.service.ts +++ b/src/app/item-page/edit-item-page/item-access-control/item-access-control.service.ts @@ -1,6 +1,6 @@ import { Injectable } from '@angular/core'; -import { AccessControlItem } from '../../../shared/access-control-array-form/access-control-array-form.component'; import { Observable, of } from 'rxjs'; +import { AccessControlItem } from '../../../core/shared/bulk-access-condition-options.model'; export interface AccessControlDropdownDataResponse { id: string; @@ -26,7 +26,6 @@ export class ItemAccessControlService { const url = URL.createObjectURL(file); window.open(url, '_blank'); - } } @@ -42,7 +41,7 @@ const accessControlDropdownData: AccessControlDropdownDataResponse = { { 'name': 'embargo', 'hasStartDate': true, - 'maxStartDate': '2018-06-24T00:40:54.970+0000' + 'maxStartDate': '2023-05-12T00:40:54.970+0000' }, { 'name': 'lease', diff --git a/src/app/shared/access-control-array-form/access-control-array-form.component.html b/src/app/shared/access-control-array-form/access-control-array-form.component.html index dc8caf403c..24dcc11120 100644 --- a/src/app/shared/access-control-array-form/access-control-array-form.component.html +++ b/src/app/shared/access-control-array-form/access-control-array-form.component.html @@ -25,7 +25,9 @@ #d="ngbDatepicker" />
-
@@ -43,15 +45,18 @@ #d1="ngbDatepicker" />
-
-
@@ -60,9 +65,10 @@ diff --git a/src/app/shared/access-control-array-form/access-control-array-form.component.ts b/src/app/shared/access-control-array-form/access-control-array-form.component.ts index bde7d30be8..ace507a3a6 100644 --- a/src/app/shared/access-control-array-form/access-control-array-form.component.ts +++ b/src/app/shared/access-control-array-form/access-control-array-form.component.ts @@ -1,12 +1,14 @@ -import { Component, Input, NgModule, OnInit } from '@angular/core'; +import { Component, Input, NgModule, OnDestroy, OnInit } from '@angular/core'; import { CommonModule } from '@angular/common'; -import { FormArray, FormBuilder, ReactiveFormsModule } from '@angular/forms'; +import { FormArray, FormBuilder, FormControl, ReactiveFormsModule } from '@angular/forms'; import { SharedBrowseByModule } from '../browse-by/shared-browse-by.module'; import { TranslateModule } from '@ngx-translate/core'; import { NgbDatepickerModule } from '@ng-bootstrap/ng-bootstrap'; import { ControlMaxStartDatePipe } from './control-max-start-date.pipe'; import { ControlMaxEndDatePipe } from './control-max-end-date.pipe'; import { AccessControlItem } from '../../core/shared/bulk-access-condition-options.model'; +import { distinctUntilChanged, takeUntil } from 'rxjs/operators'; +import { Subject } from 'rxjs'; // will be used on the form value @@ -19,12 +21,15 @@ export interface AccessControlItemValue { @Component({ selector: 'ds-access-control-array-form', templateUrl: './access-control-array-form.component.html', - styleUrls: [ './access-control-array-form.component.scss' ] + styleUrls: [ './access-control-array-form.component.scss' ], + exportAs: 'accessControlArrayForm' }) -export class AccessControlArrayFormComponent implements OnInit { +export class AccessControlArrayFormComponent implements OnInit, OnDestroy { @Input() dropdownOptions: AccessControlItem[] = []; @Input() accessControlItems: AccessControlItemValue[] = []; + private destroy$ = new Subject(); + form = this.fb.group({ accessControl: this.fb.array([]) }); @@ -40,6 +45,34 @@ export class AccessControlArrayFormComponent implements OnInit { this.addAccessControlItem(item.itemName); } } + + this.accessControl.valueChanges + .pipe( + distinctUntilChanged((a, b) => JSON.stringify(a) === JSON.stringify(b)), + takeUntil(this.destroy$) + ) + .subscribe((value) => { + for (const [ index, controlValue ] of value.entries()) { + if (controlValue.itemName) { + const item = this.dropdownOptions.find((x) => x.name === controlValue.itemName); + const startDateCtrl = this.accessControl.controls[index].get('startDate'); + const endDateCtrl = this.accessControl.controls[index].get('endDate'); + + if (item?.hasStartDate) { + startDateCtrl.enable({ emitEvent: false }); + } else { + startDateCtrl.patchValue(null); + startDateCtrl.disable({ emitEvent: false }); + } + if (item?.hasEndDate) { + endDateCtrl.enable({ emitEvent: false }); + } else { + endDateCtrl.patchValue(null); + endDateCtrl.disable({ emitEvent: false }); + } + } + } + }); } get accessControl() { @@ -49,8 +82,8 @@ export class AccessControlArrayFormComponent implements OnInit { addAccessControlItem(itemName: string = null) { this.accessControl.push(this.fb.group({ itemName, - startDate: null, - endDate: null + startDate: new FormControl({ value: null, disabled: true }), + endDate: new FormControl({ value: null, disabled: true }) })); } @@ -66,6 +99,31 @@ export class AccessControlArrayFormComponent implements OnInit { this.accessControl.reset([]); } + disable() { + this.form.disable(); + + // disable all date controls + for (const control of this.accessControl.controls) { + control.get('startDate').disable(); + control.get('endDate').disable(); + } + } + + enable() { + this.form.enable(); + + // enable date controls + for (const control of this.accessControl.controls) { + control.get('startDate').enable(); + control.get('endDate').enable(); + } + } + + ngOnDestroy() { + this.destroy$.next(); + this.destroy$.complete(); + } + } @NgModule({ diff --git a/src/app/shared/access-control-array-form/control-max-end-date.pipe.ts b/src/app/shared/access-control-array-form/control-max-end-date.pipe.ts index 0ddff2a042..810f3e71d0 100644 --- a/src/app/shared/access-control-array-form/control-max-end-date.pipe.ts +++ b/src/app/shared/access-control-array-form/control-max-end-date.pipe.ts @@ -1,7 +1,7 @@ import { Pipe, PipeTransform } from '@angular/core'; import { AbstractControl } from '@angular/forms'; import { NgbDateStruct } from '@ng-bootstrap/ng-bootstrap/datepicker/ngb-date-struct'; -import { AccessControlItem } from './access-control-array-form.component'; +import { AccessControlItem } from 'src/app/core/shared/bulk-access-condition-options.model'; @Pipe({ // eslint-disable-next-line @angular-eslint/pipe-prefix diff --git a/src/app/shared/access-control-array-form/control-max-start-date.pipe.ts b/src/app/shared/access-control-array-form/control-max-start-date.pipe.ts index 01a9607a16..458cb36465 100644 --- a/src/app/shared/access-control-array-form/control-max-start-date.pipe.ts +++ b/src/app/shared/access-control-array-form/control-max-start-date.pipe.ts @@ -1,7 +1,7 @@ import { Pipe, PipeTransform } from '@angular/core'; import { AbstractControl } from '@angular/forms'; import { NgbDateStruct } from '@ng-bootstrap/ng-bootstrap/datepicker/ngb-date-struct'; -import { AccessControlItem } from './access-control-array-form.component'; +import { AccessControlItem } from 'src/app/core/shared/bulk-access-condition-options.model'; @Pipe({ // eslint-disable-next-line @angular-eslint/pipe-prefix diff --git a/src/assets/i18n/en.json5 b/src/assets/i18n/en.json5 index 2c7ae5459f..6541848df2 100644 --- a/src/assets/i18n/en.json5 +++ b/src/assets/i18n/en.json5 @@ -5311,4 +5311,24 @@ "admin.system-wide-alert.breadcrumbs": "System-wide Alerts", "admin.system-wide-alert.title": "System-wide Alerts", + + "item-access-control-title": "This form allows you to perform changes to the access condition of all the items owned by collection under this community. Changes can be performed on the access condition for the metadata (item) or for the content (bitstream).", + "collection-access-control-title": "This form allows you to perform changes to the access condition of all the items owned by collection under this community. Changes can be performed on the access condition for the metadata (item) or for the content (bitstream).", + "community-access-control-title": "This form allows you to perform changes to the access condition of all the items owned by collection under this community. Changes can be performed on the access condition for the metadata (item) or for the content (bitstream).", + "access-control-item-header-toggle": "Item's Metadata", + "access-control-bitstream-header-toggle": "Bitstreams", + "access-control-mode": "Mode", + "access-control-access-conditions": "Access conditions", + "access-control-no-access-conditions-warning-message": "You have not specified any access conditions, the new items access conditions will be inherited from the owning collection.", + "access-control-replace-all": "Replace access conditions", + "access-control-add-to-existing": "Add to existing ones", + "access-control-limit-to-specific": "Limit the changes to specific bitstreams", + "access-control-process-all-bitstreams": "process all the bitstreams in the item", + "access-control-bitstreams-selected": "bitstreams selected", + "access-control-reset": "Reset", + "access-control-execute": "Execute", + "access-control-add-more": "Add more" + + + } From ed24204f8939564860d1077a04484dd67b6245c0 Mon Sep 17 00:00:00 2001 From: lotte Date: Tue, 9 May 2023 14:03:34 +0200 Subject: [PATCH 167/409] 101198: Made aria label i18n --- src/app/search-navbar/search-navbar.component.html | 2 +- src/assets/i18n/en.json5 | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/app/search-navbar/search-navbar.component.html b/src/app/search-navbar/search-navbar.component.html index 34207c0fed..2b30507f3e 100644 --- a/src/app/search-navbar/search-navbar.component.html +++ b/src/app/search-navbar/search-navbar.component.html @@ -4,7 +4,7 @@ - diff --git a/src/assets/i18n/en.json5 b/src/assets/i18n/en.json5 index 66824e56b3..0d14ccaa45 100644 --- a/src/assets/i18n/en.json5 +++ b/src/assets/i18n/en.json5 @@ -3146,6 +3146,9 @@ "nav.search": "Search", + "nav.search.button": "Submit search", + + "nav.statistics.header": "Statistics", "nav.stop-impersonating": "Stop impersonating EPerson", From a088641e5cee0c561b2fb00ffa968554a5d69150 Mon Sep 17 00:00:00 2001 From: Enea Jahollari Date: Tue, 9 May 2023 16:41:40 +0200 Subject: [PATCH 168/409] [CST-9636] Added select bitstreams modal and made it work --- src/app/core/shared/context.model.ts | 1 + .../edit-item-page/edit-item-page.module.ts | 8 ++- ...rol-select-bitstreams-modal.component.html | 33 ++++++++++ ...rol-select-bitstreams-modal.component.scss | 0 ...-select-bitstreams-modal.component.spec.ts | 25 ++++++++ ...ntrol-select-bitstreams-modal.component.ts | 62 +++++++++++++++++++ .../item-access-control.component.html | 8 +++ .../item-access-control.component.ts | 56 ++++++++++++++--- .../bitstream-list-item.component.html | 0 .../bitstream-list-item.component.scss | 0 .../bitstream-list-item.component.spec.ts | 25 ++++++++ .../bitstream-list-item.component.ts | 17 +++++ .../themed-object-list.component.ts | 2 +- src/app/shared/shared.module.ts | 2 + 14 files changed, 229 insertions(+), 10 deletions(-) create mode 100644 src/app/item-page/edit-item-page/item-access-control/item-access-control-select-bitstreams-modal/item-access-control-select-bitstreams-modal.component.html create mode 100644 src/app/item-page/edit-item-page/item-access-control/item-access-control-select-bitstreams-modal/item-access-control-select-bitstreams-modal.component.scss create mode 100644 src/app/item-page/edit-item-page/item-access-control/item-access-control-select-bitstreams-modal/item-access-control-select-bitstreams-modal.component.spec.ts create mode 100644 src/app/item-page/edit-item-page/item-access-control/item-access-control-select-bitstreams-modal/item-access-control-select-bitstreams-modal.component.ts create mode 100644 src/app/shared/object-list/bitstream-list-item/bitstream-list-item.component.html create mode 100644 src/app/shared/object-list/bitstream-list-item/bitstream-list-item.component.scss create mode 100644 src/app/shared/object-list/bitstream-list-item/bitstream-list-item.component.spec.ts create mode 100644 src/app/shared/object-list/bitstream-list-item/bitstream-list-item.component.ts diff --git a/src/app/core/shared/context.model.ts b/src/app/core/shared/context.model.ts index dbe5a64552..acc3313bb7 100644 --- a/src/app/core/shared/context.model.ts +++ b/src/app/core/shared/context.model.ts @@ -16,4 +16,5 @@ export enum Context { AdminWorkflowSearch = 'adminWorkflowSearch', SideBarSearchModal = 'sideBarSearchModal', SideBarSearchModalCurrent = 'sideBarSearchModalCurrent', + Bitstream = 'bitstream', } diff --git a/src/app/item-page/edit-item-page/edit-item-page.module.ts b/src/app/item-page/edit-item-page/edit-item-page.module.ts index 65862b3de8..fb46697c7d 100644 --- a/src/app/item-page/edit-item-page/edit-item-page.module.ts +++ b/src/app/item-page/edit-item-page/edit-item-page.module.ts @@ -43,6 +43,10 @@ import { AccessControlArrayFormModule } from '../../shared/access-control-array-form/access-control-array-form.component'; import { UiSwitchModule } from 'ngx-ui-switch'; +import { + ItemAccessControlSelectBitstreamsModalComponent +} from './item-access-control/item-access-control-select-bitstreams-modal/item-access-control-select-bitstreams-modal.component'; +import { ResultsBackButtonModule } from '../../shared/results-back-button/results-back-button.module'; /** @@ -62,6 +66,7 @@ import { UiSwitchModule } from 'ngx-ui-switch'; DsoSharedModule, AccessControlArrayFormModule, UiSwitchModule, + ResultsBackButtonModule, ], declarations: [ EditItemPageComponent, @@ -89,7 +94,8 @@ import { UiSwitchModule } from 'ngx-ui-switch'; ItemAuthorizationsComponent, IdentifierDataComponent, ItemRegisterDoiComponent, - ItemAccessControlComponent + ItemAccessControlComponent, + ItemAccessControlSelectBitstreamsModalComponent ], providers: [ BundleDataService, diff --git a/src/app/item-page/edit-item-page/item-access-control/item-access-control-select-bitstreams-modal/item-access-control-select-bitstreams-modal.component.html b/src/app/item-page/edit-item-page/item-access-control/item-access-control-select-bitstreams-modal/item-access-control-select-bitstreams-modal.component.html new file mode 100644 index 0000000000..e4159f3505 --- /dev/null +++ b/src/app/item-page/edit-item-page/item-access-control/item-access-control-select-bitstreams-modal/item-access-control-select-bitstreams-modal.component.html @@ -0,0 +1,33 @@ + + + diff --git a/src/app/item-page/edit-item-page/item-access-control/item-access-control-select-bitstreams-modal/item-access-control-select-bitstreams-modal.component.scss b/src/app/item-page/edit-item-page/item-access-control/item-access-control-select-bitstreams-modal/item-access-control-select-bitstreams-modal.component.scss new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/app/item-page/edit-item-page/item-access-control/item-access-control-select-bitstreams-modal/item-access-control-select-bitstreams-modal.component.spec.ts b/src/app/item-page/edit-item-page/item-access-control/item-access-control-select-bitstreams-modal/item-access-control-select-bitstreams-modal.component.spec.ts new file mode 100644 index 0000000000..7716bda735 --- /dev/null +++ b/src/app/item-page/edit-item-page/item-access-control/item-access-control-select-bitstreams-modal/item-access-control-select-bitstreams-modal.component.spec.ts @@ -0,0 +1,25 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { ItemAccessControlSelectBitstreamsModalComponent } from './item-access-control-select-bitstreams-modal.component'; + +describe('ItemAccessControlSelectBitstreamsModalComponent', () => { + let component: ItemAccessControlSelectBitstreamsModalComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [ ItemAccessControlSelectBitstreamsModalComponent ] + }) + .compileComponents(); + }); + + beforeEach(() => { + fixture = TestBed.createComponent(ItemAccessControlSelectBitstreamsModalComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/item-page/edit-item-page/item-access-control/item-access-control-select-bitstreams-modal/item-access-control-select-bitstreams-modal.component.ts b/src/app/item-page/edit-item-page/item-access-control/item-access-control-select-bitstreams-modal/item-access-control-select-bitstreams-modal.component.ts new file mode 100644 index 0000000000..dbae803c44 --- /dev/null +++ b/src/app/item-page/edit-item-page/item-access-control/item-access-control-select-bitstreams-modal/item-access-control-select-bitstreams-modal.component.ts @@ -0,0 +1,62 @@ +import { Component, Input, OnInit } from '@angular/core'; +import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap'; +import { PaginationService } from '../../../../core/pagination/pagination.service'; +import { TranslateService } from '@ngx-translate/core'; +import { BitstreamDataService } from '../../../../core/data/bitstream-data.service'; +import { BehaviorSubject } from 'rxjs'; +import { Item } from '../../../../core/shared/item.model'; +import { getFirstCompletedRemoteData } from '../../../../core/shared/operators'; +import { PaginatedList } from '../../../../core/data/paginated-list.model'; +import { Bitstream } from '../../../../core/shared/bitstream.model'; +import { RemoteData } from '../../../../core/data/remote-data'; +import { PaginationComponentOptions } from '../../../../shared/pagination/pagination-component-options.model'; +import { hasValue } from '../../../../shared/empty.util'; +import { Context } from '../../../../core/shared/context.model'; + +export const ITEM_ACCESS_CONTROL_SELECT_BITSTREAMS_LIST_ID = 'item-access-control-select-bitstreams' + +@Component({ + selector: 'ds-item-access-control-select-bitstreams-modal', + templateUrl: './item-access-control-select-bitstreams-modal.component.html', + styleUrls: [ './item-access-control-select-bitstreams-modal.component.scss' ] +}) +export class ItemAccessControlSelectBitstreamsModalComponent implements OnInit { + + LIST_ID = ITEM_ACCESS_CONTROL_SELECT_BITSTREAMS_LIST_ID; + + @Input() item!: Item; + @Input() selectedBitstreams: string[] = []; + + data$ = new BehaviorSubject> | null>(null); + paginationConfig: PaginationComponentOptions; + pageSize = 5; + + context: Context = Context.Bitstream; + + constructor( + private bitstreamService: BitstreamDataService, + protected paginationService: PaginationService, + protected translateService: TranslateService, + public activeModal: NgbActiveModal + ) { } + + ngOnInit() { + this.loadForPage(1); + + this.paginationConfig = new PaginationComponentOptions(); + this.paginationConfig.id = 'iacsbm'; + this.paginationConfig.currentPage = 1; + if (hasValue(this.pageSize)) { + this.paginationConfig.pageSize = this.pageSize; + } + } + + loadForPage(page: number) { + this.bitstreamService.findAllByItemAndBundleName(this.item, 'ORIGINAL', { currentPage: page}, false) + .pipe( + getFirstCompletedRemoteData(), + ) + .subscribe(this.data$); + } + +} diff --git a/src/app/item-page/edit-item-page/item-access-control/item-access-control.component.html b/src/app/item-page/edit-item-page/item-access-control/item-access-control.component.html index 4e72d0905f..6b65f2fe8b 100644 --- a/src/app/item-page/edit-item-page/item-access-control/item-access-control.component.html +++ b/src/app/item-page/edit-item-page/item-access-control/item-access-control.component.html @@ -87,6 +87,14 @@
diff --git a/src/app/item-page/edit-item-page/item-access-control/item-access-control.component.ts b/src/app/item-page/edit-item-page/item-access-control/item-access-control.component.ts index 5bd614537a..29f1d55ada 100644 --- a/src/app/item-page/edit-item-page/item-access-control/item-access-control.component.ts +++ b/src/app/item-page/edit-item-page/item-access-control/item-access-control.component.ts @@ -1,22 +1,42 @@ -import { Component, OnInit, ViewChild } from '@angular/core'; +import { ChangeDetectorRef, Component, OnDestroy, OnInit, ViewChild } from '@angular/core'; import { AccessControlArrayFormComponent } from '../../../shared/access-control-array-form/access-control-array-form.component'; -import { shareReplay } from 'rxjs'; +import { concatMap, Observable, shareReplay } from 'rxjs'; import { ItemAccessControlService } from './item-access-control.service'; +import { NgbModal } from '@ng-bootstrap/ng-bootstrap'; +import { + ITEM_ACCESS_CONTROL_SELECT_BITSTREAMS_LIST_ID, + ItemAccessControlSelectBitstreamsModalComponent +} from './item-access-control-select-bitstreams-modal/item-access-control-select-bitstreams-modal.component'; +import { map, take } from 'rxjs/operators'; +import { getFirstSucceededRemoteData } from '../../../core/shared/operators'; +import { RemoteData } from '../../../core/data/remote-data'; +import { Item } from '../../../core/shared/item.model'; +import { ActivatedRoute } from '@angular/router'; +import { SelectableListService } from '../../../shared/object-list/selectable-list/selectable-list.service'; +import { ListableObject } from '../../../shared/object-collection/shared/listable-object.model'; @Component({ selector: 'ds-item-access-control', templateUrl: './item-access-control.component.html', - styleUrls: ['./item-access-control.component.scss'], - providers: [ItemAccessControlService] + styleUrls: [ './item-access-control.component.scss' ], + providers: [ ItemAccessControlService ] }) -export class ItemAccessControlComponent implements OnInit { +export class ItemAccessControlComponent implements OnInit, OnDestroy { + + itemRD$: Observable>; @ViewChild('bitstreamAccessCmp', { static: true }) bitstreamAccessCmp: AccessControlArrayFormComponent; @ViewChild('itemAccessCmp', { static: true }) itemAccessCmp: AccessControlArrayFormComponent; - constructor(private itemAccessControlService: ItemAccessControlService) {} + constructor( + private itemAccessControlService: ItemAccessControlService, + private selectableListService: SelectableListService, + protected modalService: NgbModal, + private route: ActivatedRoute, + private cdr: ChangeDetectorRef + ) {} state = initialState; @@ -25,7 +45,9 @@ export class ItemAccessControlComponent implements OnInit { ); ngOnInit(): void { - + this.itemRD$ = this.route.parent.parent.data.pipe( + map((data) => data.dso) + ).pipe(getFirstSucceededRemoteData()) as Observable>; } reset() { @@ -52,6 +74,24 @@ export class ItemAccessControlComponent implements OnInit { active ? this.itemAccessCmp.enable() : this.itemAccessCmp.disable(); } } + + openSelectBitstreamsModal(item: Item) { + const ref = this.modalService.open(ItemAccessControlSelectBitstreamsModalComponent); + ref.componentInstance.selectedBitstreams = this.state.bitstream.selectedBitstreams; + ref.componentInstance.item = item; + + ref.closed.pipe( + concatMap(() => this.selectableListService.getSelectableList(ITEM_ACCESS_CONTROL_SELECT_BITSTREAMS_LIST_ID)), + take(1) + ).subscribe((list) => { + this.state.bitstream.selectedBitstreams = list.selection; + this.cdr.detectChanges(); + }); + } + + ngOnDestroy(): void { + this.selectableListService.deselectAll(ITEM_ACCESS_CONTROL_SELECT_BITSTREAMS_LIST_ID); + } } const initialState = { @@ -63,6 +103,6 @@ const initialState = { toggleStatus: false, accessMode: '', changesLimit: '', // 'all' | 'selected' - selectedBitstreams: [] + selectedBitstreams: [] as ListableObject[], }, }; diff --git a/src/app/shared/object-list/bitstream-list-item/bitstream-list-item.component.html b/src/app/shared/object-list/bitstream-list-item/bitstream-list-item.component.html new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/app/shared/object-list/bitstream-list-item/bitstream-list-item.component.scss b/src/app/shared/object-list/bitstream-list-item/bitstream-list-item.component.scss new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/app/shared/object-list/bitstream-list-item/bitstream-list-item.component.spec.ts b/src/app/shared/object-list/bitstream-list-item/bitstream-list-item.component.spec.ts new file mode 100644 index 0000000000..25d6a56295 --- /dev/null +++ b/src/app/shared/object-list/bitstream-list-item/bitstream-list-item.component.spec.ts @@ -0,0 +1,25 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { BitstreamListItemComponent } from './bitstream-list-item.component'; + +describe('BitstreamListItemComponent', () => { + let component: BitstreamListItemComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [ BitstreamListItemComponent ] + }) + .compileComponents(); + }); + + beforeEach(() => { + fixture = TestBed.createComponent(BitstreamListItemComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/shared/object-list/bitstream-list-item/bitstream-list-item.component.ts b/src/app/shared/object-list/bitstream-list-item/bitstream-list-item.component.ts new file mode 100644 index 0000000000..f281c0bd77 --- /dev/null +++ b/src/app/shared/object-list/bitstream-list-item/bitstream-list-item.component.ts @@ -0,0 +1,17 @@ +import { Component } from '@angular/core'; +import { listableObjectComponent } from '../../object-collection/shared/listable-object/listable-object.decorator'; +import { ViewMode } from '../../../core/shared/view-mode.model'; +import { + AbstractListableElementComponent +} from '../../object-collection/shared/object-collection-element/abstract-listable-element.component'; +import { Bitstream } from '../../../core/shared/bitstream.model'; +import { Context } from '../../../core/shared/context.model'; + + +@listableObjectComponent(Bitstream, ViewMode.ListElement, Context.Bitstream) +@Component({ + selector: 'ds-bitstream-list-item', + template: ` {{object.name}} `, + styleUrls: ['./bitstream-list-item.component.scss'] +}) +export class BitstreamListItemComponent extends AbstractListableElementComponent{} diff --git a/src/app/shared/object-list/themed-object-list.component.ts b/src/app/shared/object-list/themed-object-list.component.ts index 913302351f..8e2280a163 100644 --- a/src/app/shared/object-list/themed-object-list.component.ts +++ b/src/app/shared/object-list/themed-object-list.component.ts @@ -48,7 +48,7 @@ export class ThemedObjectListComponent extends ThemedComponent Date: Tue, 9 May 2023 17:27:06 +0200 Subject: [PATCH 169/409] [DURACOM-145] Handled collection step on a submission form --- .../submission-form-collection.component.html | 2 +- ...bmission-form-collection.component.spec.ts | 6 +++ .../submission-form-collection.component.ts | 5 ++ .../form/submission-form.component.html | 3 ++ .../form/submission-form.component.spec.ts | 27 +++++++++++ .../form/submission-form.component.ts | 46 ++++++++++++++++++- src/app/submission/sections/sections-type.ts | 1 + .../submission/sections/visibility-type.ts | 4 ++ 8 files changed, 91 insertions(+), 3 deletions(-) create mode 100644 src/app/submission/sections/visibility-type.ts diff --git a/src/app/submission/form/collection/submission-form-collection.component.html b/src/app/submission/form/collection/submission-form-collection.component.html index c1227eeccc..a78d737640 100644 --- a/src/app/submission/form/collection/submission-form-collection.component.html +++ b/src/app/submission/form/collection/submission-form-collection.component.html @@ -25,7 +25,7 @@ class="btn btn-outline-primary" (blur)="onClose()" (click)="onClose()" - [disabled]="(processingChange$ | async) || collectionModifiable == false" + [disabled]="(processingChange$ | async) || collectionModifiable == false || isReadonly" ngbDropdownToggle> {{ selectedCollectionName$ | async }} diff --git a/src/app/submission/form/collection/submission-form-collection.component.spec.ts b/src/app/submission/form/collection/submission-form-collection.component.spec.ts index 5b9946e1a4..a277e50286 100644 --- a/src/app/submission/form/collection/submission-form-collection.component.spec.ts +++ b/src/app/submission/form/collection/submission-form-collection.component.spec.ts @@ -249,6 +249,12 @@ describe('SubmissionFormCollectionComponent Component', () => { expect(dropDown).toBeFalsy(); }); + it('the dropdown button should be disabled when isReadonly is true', () => { + comp.isReadonly = true; + fixture.detectChanges(); + expect(dropdowBtn.nativeNode.attributes.disabled).toBeDefined(); + }); + it('should be simulated when the drop-down menu is closed', () => { spyOn(comp, 'onClose'); comp.onClose(); diff --git a/src/app/submission/form/collection/submission-form-collection.component.ts b/src/app/submission/form/collection/submission-form-collection.component.ts index 4eac4c506a..70a4cebf45 100644 --- a/src/app/submission/form/collection/submission-form-collection.component.ts +++ b/src/app/submission/form/collection/submission-form-collection.component.ts @@ -64,6 +64,11 @@ export class SubmissionFormCollectionComponent implements OnChanges, OnInit { */ @Input() submissionId; + /** + * Flag to indicate if the submission dropdown is read only + */ + @Input() isReadonly = false; + /** * An event fired when a different collection is selected. * Event's payload equals to new SubmissionObject. diff --git a/src/app/submission/form/submission-form.component.html b/src/app/submission/form/submission-form.component.html index f75af08f8e..4a916cfe23 100644 --- a/src/app/submission/form/submission-form.component.html +++ b/src/app/submission/form/submission-form.component.html @@ -8,12 +8,15 @@
+ +
{ @@ -156,6 +157,32 @@ describe('SubmissionFormComponent Component', () => { done(); }); + it('should return the visibility object of the collection section', () => { + comp.submissionDefinition = submissionDefinition; + fixture.detectChanges(); + const result = compAsAny.getCollectionVisibility(); + expect(result).toEqual({ + main: VisibilityType.HIDDEN, + other: VisibilityType.HIDDEN, + }); + }); + + it('should return true if collection section visibility is hidden', () => { + comp.submissionDefinition = submissionDefinition; + fixture.detectChanges(); + expect(comp.isSectionHidden).toBe(true); + }); + + it('should return false for isSectionReadonly when collection section visibility is not READONLY', () => { + const visibility = { + main: VisibilityType.READONLY, + other: VisibilityType.READONLY, + }; + comp.submissionDefinition = Object.assign({}, submissionDefinition, { visibility: visibility }); + fixture.detectChanges(); + expect(comp.isSectionReadonly).toBe(false); + }); + it('should update properly on collection change', (done) => { comp.collectionId = collectionId; comp.submissionId = submissionId; diff --git a/src/app/submission/form/submission-form.component.ts b/src/app/submission/form/submission-form.component.ts index 0e17e128bc..216aefcfc3 100644 --- a/src/app/submission/form/submission-form.component.ts +++ b/src/app/submission/form/submission-form.component.ts @@ -9,7 +9,7 @@ import { HALEndpointService } from '../../core/shared/hal-endpoint.service'; import { SubmissionObject } from '../../core/submission/models/submission-object.model'; import { WorkspaceitemSectionsObject } from '../../core/submission/models/workspaceitem-sections.model'; -import { hasValue, isNotEmpty } from '../../shared/empty.util'; +import { hasValue, isNotEmpty, isNotUndefined } from '../../shared/empty.util'; import { UploaderOptions } from '../../shared/upload/uploader/uploader-options.model'; import { SubmissionObjectEntry } from '../objects/submission-objects.reducer'; import { SectionDataObject } from '../sections/models/section-data.model'; @@ -18,6 +18,10 @@ import { Item } from '../../core/shared/item.model'; import { SectionsType } from '../sections/sections-type'; import { SectionsService } from '../sections/sections.service'; import { SubmissionError } from '../objects/submission-error.model'; +import { SubmissionSectionVisibility } from './../../core/config/models/config-submission-section.model'; +import { SubmissionSectionModel } from './../../core/config/models/config-submission-section.model'; +import { VisibilityType } from '../sections/visibility-type'; +import isEqual from 'lodash/isEqual'; /** * This component represents the submission form. @@ -188,6 +192,42 @@ export class SubmissionFormComponent implements OnChanges, OnDestroy { } } + /** + * Returns the visibility object of the collection section + */ + private getCollectionVisibility(): SubmissionSectionVisibility { + const submissionSectionModel: SubmissionSectionModel = + this.submissionDefinition.sections.page.find( + (section) => isEqual(section.sectionType, SectionsType.Collection) + ); + + return isNotUndefined(submissionSectionModel.visibility) ? submissionSectionModel.visibility : null; + } + + /** + * Getter to see if the collection section visibility is hidden + */ + get isSectionHidden(): boolean { + const visibility = this.getCollectionVisibility(); + return ( + hasValue(visibility) && + isEqual(visibility.main, VisibilityType.HIDDEN) && + isEqual(visibility.other, VisibilityType.HIDDEN) + ); + } + + /** + * Getter to see if the collection section visibility is readonly + */ + get isSectionReadonly(): boolean { + const visibility = this.getCollectionVisibility(); + return ( + hasValue(visibility) && + isEqual(visibility.main, VisibilityType.READONLY) && + isEqual(visibility.other, VisibilityType.READONLY) + ); + } + /** * Unsubscribe from all subscriptions, destroy instance variables * and reset submission state @@ -239,6 +279,8 @@ export class SubmissionFormComponent implements OnChanges, OnDestroy { protected getSectionsList(): Observable { return this.submissionService.getSubmissionSections(this.submissionId).pipe( filter((sections: SectionDataObject[]) => isNotEmpty(sections)), - map((sections: SectionDataObject[]) => sections)); + map((sections: SectionDataObject[]) => + sections.filter((section: SectionDataObject) => !isEqual(section.sectionType,SectionsType.Collection))), + ); } } diff --git a/src/app/submission/sections/sections-type.ts b/src/app/submission/sections/sections-type.ts index 6fb7380822..6bca8a7252 100644 --- a/src/app/submission/sections/sections-type.ts +++ b/src/app/submission/sections/sections-type.ts @@ -8,4 +8,5 @@ export enum SectionsType { AccessesCondition = 'accessCondition', SherpaPolicies = 'sherpaPolicy', Identifiers = 'identifiers', + Collection = 'collection', } diff --git a/src/app/submission/sections/visibility-type.ts b/src/app/submission/sections/visibility-type.ts new file mode 100644 index 0000000000..b2e167285c --- /dev/null +++ b/src/app/submission/sections/visibility-type.ts @@ -0,0 +1,4 @@ +export enum VisibilityType { + HIDDEN = 'HIDDEN', + READONLY = 'READONLY', +} From 40cb6a18bea543ce2bc983e29be041b3880ed1b8 Mon Sep 17 00:00:00 2001 From: Giuseppe Digilio Date: Tue, 22 Nov 2022 14:59:40 +0100 Subject: [PATCH 170/409] [CST-9636] Add flag to show or not thumbnail along list element by component's input firstly --- ...ue-search-result-list-element.component.ts | 10 --------- ...me-search-result-list-element.component.ts | 10 --------- ...al-search-result-list-element.component.ts | 10 --------- ...it-search-result-list-element.component.ts | 10 --------- ...on-search-result-list-element.component.ts | 22 +------------------ ...ct-search-result-list-element.component.ts | 10 --------- .../object-collection.component.html | 3 +++ .../object-collection.component.ts | 5 +++++ ...table-object-component-loader.component.ts | 6 +++++ .../abstract-listable-element.component.ts | 5 +++++ .../object-detail.component.html | 1 + .../object-detail/object-detail.component.ts | 5 +++++ .../object-grid/object-grid.component.html | 6 ++++- .../object-grid/object-grid.component.ts | 12 +++++++--- .../object-list/object-list.component.html | 9 ++++---- .../object-list/object-list.component.ts | 5 +++++ ...em-search-result-list-element.component.ts | 7 +----- .../themed-object-list.component.ts | 6 +++++ .../search-results.component.html | 1 + .../search-results.component.ts | 5 +++++ .../themed-search-results.component.ts | 4 +++- src/app/shared/search/search.component.html | 1 + src/app/shared/search/search.component.ts | 5 +++++ .../shared/search/themed-search.component.ts | 4 +++- 24 files changed, 75 insertions(+), 87 deletions(-) diff --git a/src/app/entity-groups/journal-entities/item-list-elements/search-result-list-elements/journal-issue/journal-issue-search-result-list-element.component.ts b/src/app/entity-groups/journal-entities/item-list-elements/search-result-list-elements/journal-issue/journal-issue-search-result-list-element.component.ts index 88f93d9d85..d804006eb1 100644 --- a/src/app/entity-groups/journal-entities/item-list-elements/search-result-list-elements/journal-issue/journal-issue-search-result-list-element.component.ts +++ b/src/app/entity-groups/journal-entities/item-list-elements/search-result-list-elements/journal-issue/journal-issue-search-result-list-element.component.ts @@ -14,14 +14,4 @@ import { ItemSearchResultListElementComponent } from '../../../../../shared/obje */ export class JournalIssueSearchResultListElementComponent extends ItemSearchResultListElementComponent { - /** - * Display thumbnails if required by configuration - */ - showThumbnails: boolean; - - ngOnInit(): void { - super.ngOnInit(); - this.showThumbnails = this.appConfig.browseBy.showThumbnails; - } - } diff --git a/src/app/entity-groups/journal-entities/item-list-elements/search-result-list-elements/journal-volume/journal-volume-search-result-list-element.component.ts b/src/app/entity-groups/journal-entities/item-list-elements/search-result-list-elements/journal-volume/journal-volume-search-result-list-element.component.ts index ec98946937..2a01d20668 100644 --- a/src/app/entity-groups/journal-entities/item-list-elements/search-result-list-elements/journal-volume/journal-volume-search-result-list-element.component.ts +++ b/src/app/entity-groups/journal-entities/item-list-elements/search-result-list-elements/journal-volume/journal-volume-search-result-list-element.component.ts @@ -14,14 +14,4 @@ import { ItemSearchResultListElementComponent } from '../../../../../shared/obje */ export class JournalVolumeSearchResultListElementComponent extends ItemSearchResultListElementComponent { - /** - * Display thumbnails if required by configuration - */ - showThumbnails: boolean; - - ngOnInit(): void { - super.ngOnInit(); - this.showThumbnails = this.appConfig.browseBy.showThumbnails; - } - } diff --git a/src/app/entity-groups/journal-entities/item-list-elements/search-result-list-elements/journal/journal-search-result-list-element.component.ts b/src/app/entity-groups/journal-entities/item-list-elements/search-result-list-elements/journal/journal-search-result-list-element.component.ts index 199bd3a748..38150d1a6a 100644 --- a/src/app/entity-groups/journal-entities/item-list-elements/search-result-list-elements/journal/journal-search-result-list-element.component.ts +++ b/src/app/entity-groups/journal-entities/item-list-elements/search-result-list-elements/journal/journal-search-result-list-element.component.ts @@ -14,14 +14,4 @@ import { ItemSearchResultListElementComponent } from '../../../../../shared/obje */ export class JournalSearchResultListElementComponent extends ItemSearchResultListElementComponent { - /** - * Display thumbnails if required by configuration - */ - showThumbnails: boolean; - - ngOnInit(): void { - super.ngOnInit(); - this.showThumbnails = this.appConfig.browseBy.showThumbnails; - } - } diff --git a/src/app/entity-groups/research-entities/item-list-elements/search-result-list-elements/org-unit/org-unit-search-result-list-element.component.ts b/src/app/entity-groups/research-entities/item-list-elements/search-result-list-elements/org-unit/org-unit-search-result-list-element.component.ts index baa27cdf0c..a9edb530cb 100644 --- a/src/app/entity-groups/research-entities/item-list-elements/search-result-list-elements/org-unit/org-unit-search-result-list-element.component.ts +++ b/src/app/entity-groups/research-entities/item-list-elements/search-result-list-elements/org-unit/org-unit-search-result-list-element.component.ts @@ -14,14 +14,4 @@ import { ItemSearchResultListElementComponent } from '../../../../../shared/obje */ export class OrgUnitSearchResultListElementComponent extends ItemSearchResultListElementComponent { - /** - * Display thumbnail if required by configuration - */ - showThumbnails: boolean; - - ngOnInit(): void { - super.ngOnInit(); - this.showThumbnails = this.appConfig.browseBy.showThumbnails; - } - } diff --git a/src/app/entity-groups/research-entities/item-list-elements/search-result-list-elements/person/person-search-result-list-element.component.ts b/src/app/entity-groups/research-entities/item-list-elements/search-result-list-elements/person/person-search-result-list-element.component.ts index 217d7baef9..67c01ed8f7 100644 --- a/src/app/entity-groups/research-entities/item-list-elements/search-result-list-elements/person/person-search-result-list-element.component.ts +++ b/src/app/entity-groups/research-entities/item-list-elements/search-result-list-elements/person/person-search-result-list-element.component.ts @@ -1,4 +1,4 @@ -import { Component, Inject } from '@angular/core'; +import { Component } from '@angular/core'; import { listableObjectComponent } from '../../../../../shared/object-collection/shared/listable-object/listable-object.decorator'; @@ -6,9 +6,6 @@ import { ViewMode } from '../../../../../core/shared/view-mode.model'; import { ItemSearchResultListElementComponent } from '../../../../../shared/object-list/search-result-list-element/item-search-result/item-types/item/item-search-result-list-element.component'; -import { TruncatableService } from '../../../../../shared/truncatable/truncatable.service'; -import { DSONameService } from '../../../../../core/breadcrumbs/dso-name.service'; -import { APP_CONFIG, AppConfig } from '../../../../../../config/app-config.interface'; @listableObjectComponent('PersonSearchResult', ViewMode.ListElement) @Component({ @@ -21,21 +18,4 @@ import { APP_CONFIG, AppConfig } from '../../../../../../config/app-config.inter */ export class PersonSearchResultListElementComponent extends ItemSearchResultListElementComponent { - public constructor( - protected truncatableService: TruncatableService, - protected dsoNameService: DSONameService, - @Inject(APP_CONFIG) protected appConfig: AppConfig - ) { - super(truncatableService, dsoNameService, appConfig); - } - - /** - * Display thumbnail if required by configuration - */ - showThumbnails: boolean; - - ngOnInit(): void { - super.ngOnInit(); - this.showThumbnails = this.appConfig.browseBy.showThumbnails; - } } diff --git a/src/app/entity-groups/research-entities/item-list-elements/search-result-list-elements/project/project-search-result-list-element.component.ts b/src/app/entity-groups/research-entities/item-list-elements/search-result-list-elements/project/project-search-result-list-element.component.ts index 88e95528ac..aaf98a8091 100644 --- a/src/app/entity-groups/research-entities/item-list-elements/search-result-list-elements/project/project-search-result-list-element.component.ts +++ b/src/app/entity-groups/research-entities/item-list-elements/search-result-list-elements/project/project-search-result-list-element.component.ts @@ -14,14 +14,4 @@ import { ItemSearchResultListElementComponent } from '../../../../../shared/obje */ export class ProjectSearchResultListElementComponent extends ItemSearchResultListElementComponent { - /** - * Display thumbnail if required by configuration - */ - showThumbnails: boolean; - - ngOnInit(): void { - super.ngOnInit(); - this.showThumbnails = this.appConfig.browseBy.showThumbnails; - } - } diff --git a/src/app/shared/object-collection/object-collection.component.html b/src/app/shared/object-collection/object-collection.component.html index 3dafba8298..3b0dca80ac 100644 --- a/src/app/shared/object-collection/object-collection.component.html +++ b/src/app/shared/object-collection/object-collection.component.html @@ -8,6 +8,7 @@ [context]="context" [hidePaginationDetail]="hidePaginationDetail" [showPaginator]="showPaginator" + [showThumbnails]="showThumbnails" (paginationChange)="onPaginationChange($event)" (pageChange)="onPageChange($event)" (pageSizeChange)="onPageSizeChange($event)" @@ -34,6 +35,7 @@ [context]="context" [hidePaginationDetail]="hidePaginationDetail" [showPaginator]="showPaginator" + [showThumbnails]="showThumbnails" (paginationChange)="onPaginationChange($event)" (pageChange)="onPageChange($event)" (pageSizeChange)="onPageSizeChange($event)" @@ -50,6 +52,7 @@ [context]="context" [hidePaginationDetail]="hidePaginationDetail" [showPaginator]="showPaginator" + [showThumbnails]="showThumbnails" (contentChange)="contentChange.emit($event)" *ngIf="(currentMode$ | async) === viewModeEnum.DetailedListElement"> diff --git a/src/app/shared/object-collection/object-collection.component.ts b/src/app/shared/object-collection/object-collection.component.ts index 369192c488..e1f9182562 100644 --- a/src/app/shared/object-collection/object-collection.component.ts +++ b/src/app/shared/object-collection/object-collection.component.ts @@ -107,6 +107,11 @@ export class ObjectCollectionComponent implements OnInit { */ @Input() showPaginator = true; + /** + * Whether to show the thumbnail preview + */ + @Input() showThumbnails; + /** * the page info of the list */ diff --git a/src/app/shared/object-collection/shared/listable-object/listable-object-component-loader.component.ts b/src/app/shared/object-collection/shared/listable-object/listable-object-component-loader.component.ts index 6b75c59181..18b3d96d14 100644 --- a/src/app/shared/object-collection/shared/listable-object/listable-object-component-loader.component.ts +++ b/src/app/shared/object-collection/shared/listable-object/listable-object-component-loader.component.ts @@ -71,6 +71,11 @@ export class ListableObjectComponentLoaderComponent implements OnInit, OnChanges */ @Input() showLabel = true; + /** + * Whether to show the thumbnail preview + */ + @Input() showThumbnails; + /** * The value to display for this element */ @@ -127,6 +132,7 @@ export class ListableObjectComponentLoaderComponent implements OnInit, OnChanges 'linkType', 'listID', 'showLabel', + 'showThumbnails', 'context', 'viewMode', 'value', diff --git a/src/app/shared/object-collection/shared/object-collection-element/abstract-listable-element.component.ts b/src/app/shared/object-collection/shared/object-collection-element/abstract-listable-element.component.ts index 7d4e107b2b..d145b8146b 100644 --- a/src/app/shared/object-collection/shared/object-collection-element/abstract-listable-element.component.ts +++ b/src/app/shared/object-collection/shared/object-collection-element/abstract-listable-element.component.ts @@ -41,6 +41,11 @@ export class AbstractListableElementComponent { */ @Input() showLabel = true; + /** + * Whether to show the thumbnail preview + */ + @Input() showThumbnails; + /** * The context we matched on to get this component */ diff --git a/src/app/shared/object-detail/object-detail.component.html b/src/app/shared/object-detail/object-detail.component.html index 05b8342ca3..d077e2fd2b 100644 --- a/src/app/shared/object-detail/object-detail.component.html +++ b/src/app/shared/object-detail/object-detail.component.html @@ -21,6 +21,7 @@
diff --git a/src/app/shared/object-detail/object-detail.component.ts b/src/app/shared/object-detail/object-detail.component.ts index 15bd5b7bca..1a32be74b8 100644 --- a/src/app/shared/object-detail/object-detail.component.ts +++ b/src/app/shared/object-detail/object-detail.component.ts @@ -64,6 +64,11 @@ export class ObjectDetailComponent { */ @Input() showPaginator = true; + /** + * Whether to show the thumbnail preview + */ + @Input() showThumbnails; + /** * Emit when one of the listed object has changed. */ diff --git a/src/app/shared/object-grid/object-grid.component.html b/src/app/shared/object-grid/object-grid.component.html index 4050f93f77..59fe18820d 100644 --- a/src/app/shared/object-grid/object-grid.component.html +++ b/src/app/shared/object-grid/object-grid.component.html @@ -19,7 +19,11 @@
- +
diff --git a/src/app/shared/object-grid/object-grid.component.ts b/src/app/shared/object-grid/object-grid.component.ts index 1b5ab075e2..91630ca007 100644 --- a/src/app/shared/object-grid/object-grid.component.ts +++ b/src/app/shared/object-grid/object-grid.component.ts @@ -1,11 +1,12 @@ -import { combineLatest as observableCombineLatest, BehaviorSubject, Observable } from 'rxjs'; +import { BehaviorSubject, combineLatest as observableCombineLatest, Observable } from 'rxjs'; -import { startWith, distinctUntilChanged, map } from 'rxjs/operators'; +import { distinctUntilChanged, map, startWith } from 'rxjs/operators'; import { ChangeDetectionStrategy, Component, EventEmitter, - Input, OnInit, + Input, + OnInit, Output, ViewEncapsulation } from '@angular/core'; @@ -54,6 +55,11 @@ export class ObjectGridComponent implements OnInit { */ @Input() showPaginator = true; + /** + * Whether to show the thumbnail preview + */ + @Input() showThumbnails; + /** * The whether or not the gear is hidden */ diff --git a/src/app/shared/object-list/object-list.component.html b/src/app/shared/object-list/object-list.component.html index b8712b85c5..8e0482b1f7 100644 --- a/src/app/shared/object-list/object-list.component.html +++ b/src/app/shared/object-list/object-list.component.html @@ -25,12 +25,13 @@ - diff --git a/src/app/shared/object-list/object-list.component.ts b/src/app/shared/object-list/object-list.component.ts index 65e2b508da..5161b75459 100644 --- a/src/app/shared/object-list/object-list.component.ts +++ b/src/app/shared/object-list/object-list.component.ts @@ -81,6 +81,11 @@ export class ObjectListComponent { */ @Input() showPaginator = true; + /** + * Whether to show the thumbnail preview + */ + @Input() showThumbnails; + /** * Emit when one of the listed object has changed. */ diff --git a/src/app/shared/object-list/search-result-list-element/item-search-result/item-types/item/item-search-result-list-element.component.ts b/src/app/shared/object-list/search-result-list-element/item-search-result/item-types/item/item-search-result-list-element.component.ts index f84ae642ad..99251d3c24 100644 --- a/src/app/shared/object-list/search-result-list-element/item-search-result/item-types/item/item-search-result-list-element.component.ts +++ b/src/app/shared/object-list/search-result-list-element/item-search-result/item-types/item/item-search-result-list-element.component.ts @@ -22,14 +22,9 @@ export class ItemSearchResultListElementComponent extends SearchResultListElemen */ itemPageRoute: string; - /** - * Display thumbnails if required by configuration - */ - showThumbnails: boolean; - ngOnInit(): void { super.ngOnInit(); - this.showThumbnails = this.appConfig.browseBy.showThumbnails; + this.showThumbnails = this.showThumbnails ?? this.appConfig.browseBy.showThumbnails; this.itemPageRoute = getItemPageRoute(this.dso); } } diff --git a/src/app/shared/object-list/themed-object-list.component.ts b/src/app/shared/object-list/themed-object-list.component.ts index 913302351f..4d7b5ca77b 100644 --- a/src/app/shared/object-list/themed-object-list.component.ts +++ b/src/app/shared/object-list/themed-object-list.component.ts @@ -78,6 +78,11 @@ export class ThemedObjectListComponent extends ThemedComponent diff --git a/src/app/shared/search/search-results/search-results.component.ts b/src/app/shared/search/search-results/search-results.component.ts index 0a83d3e5c6..15d2cc0f00 100644 --- a/src/app/shared/search/search-results/search-results.component.ts +++ b/src/app/shared/search/search-results/search-results.component.ts @@ -52,6 +52,11 @@ export class SearchResultsComponent { */ @Input() showCsvExport = false; + /** + * Whether to show the thumbnail preview + */ + @Input() showThumbnails; + /** * The current sorting configuration of the search */ diff --git a/src/app/shared/search/search-results/themed-search-results.component.ts b/src/app/shared/search/search-results/themed-search-results.component.ts index 7abfb2dfa8..01ee5761f3 100644 --- a/src/app/shared/search/search-results/themed-search-results.component.ts +++ b/src/app/shared/search/search-results/themed-search-results.component.ts @@ -21,7 +21,7 @@ import { ListableObject } from '../../object-collection/shared/listable-object.m templateUrl: '../../theme-support/themed.component.html', }) export class ThemedSearchResultsComponent extends ThemedComponent { - protected inAndOutputNames: (keyof SearchResultsComponent & keyof this)[] = ['linkType', 'searchResults', 'searchConfig', 'showCsvExport', 'sortConfig', 'viewMode', 'configuration', 'disableHeader', 'selectable', 'context', 'hidePaginationDetail', 'selectionConfig', 'contentChange', 'deselectObject', 'selectObject']; + protected inAndOutputNames: (keyof SearchResultsComponent & keyof this)[] = ['linkType', 'searchResults', 'searchConfig', 'showCsvExport', 'showThumbnails', 'sortConfig', 'viewMode', 'configuration', 'disableHeader', 'selectable', 'context', 'hidePaginationDetail', 'selectionConfig', 'contentChange', 'deselectObject', 'selectObject']; @Input() linkType: CollectionElementLinkType; @@ -31,6 +31,8 @@ export class ThemedSearchResultsComponent extends ThemedComponent diff --git a/src/app/shared/search/search.component.ts b/src/app/shared/search/search.component.ts index a5b9fb9c7d..5dd84344d4 100644 --- a/src/app/shared/search/search.component.ts +++ b/src/app/shared/search/search.component.ts @@ -128,6 +128,11 @@ export class SearchComponent implements OnInit { */ @Input() showSidebar = true; + /** + * Whether to show the thumbnail preview + */ + @Input() showThumbnails; + /** * Whether to show the view mode switch */ diff --git a/src/app/shared/search/themed-search.component.ts b/src/app/shared/search/themed-search.component.ts index 44c22c8925..fe531e4f0f 100644 --- a/src/app/shared/search/themed-search.component.ts +++ b/src/app/shared/search/themed-search.component.ts @@ -19,7 +19,7 @@ import { ListableObject } from '../object-collection/shared/listable-object.mode templateUrl: '../theme-support/themed.component.html', }) export class ThemedSearchComponent extends ThemedComponent { - 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']; + protected inAndOutputNames: (keyof SearchComponent & keyof this)[] = ['configurationList', 'context', 'configuration', 'fixedFilterQuery', 'useCachedVersionIfAvailable', 'inPlaceSearch', 'linkType', 'paginationId', 'searchEnabled', 'sideBarWidth', 'searchFormPlaceholder', 'selectable', 'selectionConfig', 'showCsvExport', 'showSidebar', 'showThumbnails', 'showViewModes', 'useUniquePageId', 'viewModeList', 'showScopeSelector', 'resultFound', 'deselectObject', 'selectObject', 'trackStatistics', 'query']; @Input() configurationList: SearchConfigurationOption[]; @@ -51,6 +51,8 @@ export class ThemedSearchComponent extends ThemedComponent { @Input() showSidebar: boolean; + @Input() showThumbnails; + @Input() showViewModes: boolean; @Input() useUniquePageId: boolean; From 06fef61f02c156e4b22d0d590ee301421f08d2c4 Mon Sep 17 00:00:00 2001 From: Giuseppe Digilio Date: Tue, 9 May 2023 18:39:04 +0200 Subject: [PATCH 171/409] [CST-9636] Create page for bulk access --- .../access-control-routing.module.ts | 20 +++++- .../access-control/access-control.module.ts | 24 +++++-- .../browse/bulk-access-browse.component.html | 51 ++++++++++++++ .../browse/bulk-access-browse.component.scss | 0 .../bulk-access-browse.component.spec.ts | 25 +++++++ .../browse/bulk-access-browse.component.ts | 67 +++++++++++++++++++ .../bulk-access/bulk-access.component.html | 9 +++ .../bulk-access/bulk-access.component.scss | 0 .../bulk-access/bulk-access.component.spec.ts | 25 +++++++ .../bulk-access/bulk-access.component.ts | 15 +++++ .../bulk-access-settings.component.html | 21 ++++++ .../bulk-access-settings.component.scss | 0 .../bulk-access-settings.component.spec.ts | 25 +++++++ .../bulk-access-settings.component.ts | 15 +++++ src/app/menu.resolver.ts | 11 +++ src/assets/i18n/en.json5 | 14 ++++ 16 files changed, 312 insertions(+), 10 deletions(-) create mode 100644 src/app/access-control/bulk-access/browse/bulk-access-browse.component.html create mode 100644 src/app/access-control/bulk-access/browse/bulk-access-browse.component.scss create mode 100644 src/app/access-control/bulk-access/browse/bulk-access-browse.component.spec.ts create mode 100644 src/app/access-control/bulk-access/browse/bulk-access-browse.component.ts create mode 100644 src/app/access-control/bulk-access/bulk-access.component.html create mode 100644 src/app/access-control/bulk-access/bulk-access.component.scss create mode 100644 src/app/access-control/bulk-access/bulk-access.component.spec.ts create mode 100644 src/app/access-control/bulk-access/bulk-access.component.ts create mode 100644 src/app/access-control/bulk-access/settings/bulk-access-settings.component.html create mode 100644 src/app/access-control/bulk-access/settings/bulk-access-settings.component.scss create mode 100644 src/app/access-control/bulk-access/settings/bulk-access-settings.component.spec.ts create mode 100644 src/app/access-control/bulk-access/settings/bulk-access-settings.component.ts diff --git a/src/app/access-control/access-control-routing.module.ts b/src/app/access-control/access-control-routing.module.ts index e64b0d170a..6f6de6cb26 100644 --- a/src/app/access-control/access-control-routing.module.ts +++ b/src/app/access-control/access-control-routing.module.ts @@ -6,8 +6,13 @@ import { GroupsRegistryComponent } from './group-registry/groups-registry.compon import { GROUP_EDIT_PATH } from './access-control-routing-paths'; import { I18nBreadcrumbResolver } from '../core/breadcrumbs/i18n-breadcrumb.resolver'; import { GroupPageGuard } from './group-registry/group-page.guard'; -import { GroupAdministratorGuard } from '../core/data/feature-authorization/feature-authorization-guard/group-administrator.guard'; -import { SiteAdministratorGuard } from '../core/data/feature-authorization/feature-authorization-guard/site-administrator.guard'; +import { + GroupAdministratorGuard +} from '../core/data/feature-authorization/feature-authorization-guard/group-administrator.guard'; +import { + SiteAdministratorGuard +} from '../core/data/feature-authorization/feature-authorization-guard/site-administrator.guard'; +import { BulkAccessComponent } from './bulk-access/bulk-access.component'; @NgModule({ imports: [ @@ -47,7 +52,16 @@ import { SiteAdministratorGuard } from '../core/data/feature-authorization/featu }, data: { title: 'admin.access-control.groups.title.singleGroup', breadcrumbKey: 'admin.access-control.groups.singleGroup' }, canActivate: [GroupPageGuard] - } + }, + { + path: 'bulk-access', + component: BulkAccessComponent, + resolve: { + breadcrumb: I18nBreadcrumbResolver + }, + data: { title: 'admin.access-control.bulk-access.title', breadcrumbKey: 'admin.access-control.bulk-access' }, + canActivate: [SiteAdministratorGuard] + }, ]) ] }) diff --git a/src/app/access-control/access-control.module.ts b/src/app/access-control/access-control.module.ts index 47a971a882..ba7334d24f 100644 --- a/src/app/access-control/access-control.module.ts +++ b/src/app/access-control/access-control.module.ts @@ -12,6 +12,11 @@ import { GroupsRegistryComponent } from './group-registry/groups-registry.compon import { FormModule } from '../shared/form/form.module'; import { DYNAMIC_ERROR_MESSAGES_MATCHER, DynamicErrorMessagesMatcher } from '@ng-dynamic-forms/core'; import { AbstractControl } from '@angular/forms'; +import { BulkAccessComponent } from './bulk-access/bulk-access.component'; +import { NgbAccordionModule } from '@ng-bootstrap/ng-bootstrap'; +import { BulkAccessBrowseComponent } from './bulk-access/browse/bulk-access-browse.component'; +import { BulkAccessSettingsComponent } from './bulk-access/settings/bulk-access-settings.component'; +import { SearchModule } from '../shared/search/search.module'; /** * Condition for displaying error messages on email form field @@ -22,13 +27,15 @@ export const ValidateEmailErrorStateMatcher: DynamicErrorMessagesMatcher = }; @NgModule({ - imports: [ - CommonModule, - SharedModule, - RouterModule, - AccessControlRoutingModule, - FormModule, - ], + imports: [ + CommonModule, + SharedModule, + RouterModule, + AccessControlRoutingModule, + FormModule, + NgbAccordionModule, + SearchModule, + ], exports: [ MembersListComponent, ], @@ -39,6 +46,9 @@ export const ValidateEmailErrorStateMatcher: DynamicErrorMessagesMatcher = GroupFormComponent, SubgroupsListComponent, MembersListComponent, + BulkAccessComponent, + BulkAccessBrowseComponent, + BulkAccessSettingsComponent, ], providers: [ { diff --git a/src/app/access-control/bulk-access/browse/bulk-access-browse.component.html b/src/app/access-control/bulk-access/browse/bulk-access-browse.component.html new file mode 100644 index 0000000000..760134aba5 --- /dev/null +++ b/src/app/access-control/bulk-access/browse/bulk-access-browse.component.html @@ -0,0 +1,51 @@ + + + +
+ +
+
+ + +
+
+
+
+ + +
+
+
+
+ + + diff --git a/src/app/access-control/bulk-access/browse/bulk-access-browse.component.scss b/src/app/access-control/bulk-access/browse/bulk-access-browse.component.scss new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/app/access-control/bulk-access/browse/bulk-access-browse.component.spec.ts b/src/app/access-control/bulk-access/browse/bulk-access-browse.component.spec.ts new file mode 100644 index 0000000000..12cfabae08 --- /dev/null +++ b/src/app/access-control/bulk-access/browse/bulk-access-browse.component.spec.ts @@ -0,0 +1,25 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { BulkAccessBrowseComponent } from './bulk-access-browse.component'; + +describe('BrowseComponent', () => { + let component: BulkAccessBrowseComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [ BulkAccessBrowseComponent ] + }) + .compileComponents(); + }); + + beforeEach(() => { + fixture = TestBed.createComponent(BulkAccessBrowseComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/access-control/bulk-access/browse/bulk-access-browse.component.ts b/src/app/access-control/bulk-access/browse/bulk-access-browse.component.ts new file mode 100644 index 0000000000..a91cdf35df --- /dev/null +++ b/src/app/access-control/bulk-access/browse/bulk-access-browse.component.ts @@ -0,0 +1,67 @@ +import { Component, OnInit } from '@angular/core'; + +import { BehaviorSubject, Subscription } from 'rxjs'; +import { distinctUntilChanged, map } from 'rxjs/operators'; + +import { SEARCH_CONFIG_SERVICE } from '../../../my-dspace-page/my-dspace-page.component'; +import { SearchConfigurationService } from '../../../core/shared/search/search-configuration.service'; +import { SelectableListService } from '../../../shared/object-list/selectable-list/selectable-list.service'; +import { SelectableListState } from '../../../shared/object-list/selectable-list/selectable-list.reducer'; +import { RemoteData } from '../../../core/data/remote-data'; +import { buildPaginatedList, PaginatedList } from '../../../core/data/paginated-list.model'; +import { ListableObject } from '../../../shared/object-collection/shared/listable-object.model'; +import { createSuccessfulRemoteDataObject } from '../../../shared/remote-data.utils'; +import { PageInfo } from '../../../core/shared/page-info.model'; +import { PaginationComponentOptions } from '../../../shared/pagination/pagination-component-options.model'; + +@Component({ + selector: 'ds-bulk-access-browse', + templateUrl: './bulk-access-browse.component.html', + styleUrls: ['./bulk-access-browse.component.scss'], + providers: [ + { + provide: SEARCH_CONFIG_SERVICE, + useClass: SearchConfigurationService + } + ] +}) +export class BulkAccessBrowseComponent implements OnInit { + /** + * The active nav id + */ + activateId = 'search'; + + /** + * The selection list id + */ + listId: string = 'bulk-access-list'; + + /** + * The list of the objects already selected + */ + objectsSelected$: BehaviorSubject>> = new BehaviorSubject>>(null); + + paginationOptions: PaginationComponentOptions; + private subs: Subscription[] = []; + + constructor(private selectableListService: SelectableListService) { + } + + ngOnInit(): void { + this.paginationOptions = Object.assign(new PaginationComponentOptions(), { + id: 'elp', + pageSize: 10, + currentPage: 1 + }); + this.subs.push( + this.selectableListService.getSelectableList(this.listId).pipe( + distinctUntilChanged(), + map((list: SelectableListState) => { + console.log(list); + return createSuccessfulRemoteDataObject(buildPaginatedList(new PageInfo(), list?.selection || [])) + }) + ).subscribe(this.objectsSelected$) + ) + } + +} diff --git a/src/app/access-control/bulk-access/bulk-access.component.html b/src/app/access-control/bulk-access/bulk-access.component.html new file mode 100644 index 0000000000..e0eafb6e36 --- /dev/null +++ b/src/app/access-control/bulk-access/bulk-access.component.html @@ -0,0 +1,9 @@ + +
+ +
+ +
+ + + diff --git a/src/app/access-control/bulk-access/bulk-access.component.scss b/src/app/access-control/bulk-access/bulk-access.component.scss new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/app/access-control/bulk-access/bulk-access.component.spec.ts b/src/app/access-control/bulk-access/bulk-access.component.spec.ts new file mode 100644 index 0000000000..61fab1e5a9 --- /dev/null +++ b/src/app/access-control/bulk-access/bulk-access.component.spec.ts @@ -0,0 +1,25 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { BulkAccessComponent } from './bulk-access.component'; + +describe('BulkAccessComponent', () => { + let component: BulkAccessComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [ BulkAccessComponent ] + }) + .compileComponents(); + }); + + beforeEach(() => { + fixture = TestBed.createComponent(BulkAccessComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/access-control/bulk-access/bulk-access.component.ts b/src/app/access-control/bulk-access/bulk-access.component.ts new file mode 100644 index 0000000000..9e45b2c59b --- /dev/null +++ b/src/app/access-control/bulk-access/bulk-access.component.ts @@ -0,0 +1,15 @@ +import { Component, OnInit } from '@angular/core'; + +@Component({ + selector: 'ds-bulk-access', + templateUrl: './bulk-access.component.html', + styleUrls: ['./bulk-access.component.scss'] +}) +export class BulkAccessComponent implements OnInit { + + constructor() { } + + ngOnInit(): void { + } + +} diff --git a/src/app/access-control/bulk-access/settings/bulk-access-settings.component.html b/src/app/access-control/bulk-access/settings/bulk-access-settings.component.html new file mode 100644 index 0000000000..a5c292eddd --- /dev/null +++ b/src/app/access-control/bulk-access/settings/bulk-access-settings.component.html @@ -0,0 +1,21 @@ + + + +
+ +
+
+ + +
+
+
+
+ +

bulk-access-settings works!

+
+
+
diff --git a/src/app/access-control/bulk-access/settings/bulk-access-settings.component.scss b/src/app/access-control/bulk-access/settings/bulk-access-settings.component.scss new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/app/access-control/bulk-access/settings/bulk-access-settings.component.spec.ts b/src/app/access-control/bulk-access/settings/bulk-access-settings.component.spec.ts new file mode 100644 index 0000000000..435f2828b9 --- /dev/null +++ b/src/app/access-control/bulk-access/settings/bulk-access-settings.component.spec.ts @@ -0,0 +1,25 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { BulkAccessSettingsComponent } from './bulk-access-settings.component'; + +describe('BulkAccessSettingsComponent', () => { + let component: BulkAccessSettingsComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [ BulkAccessSettingsComponent ] + }) + .compileComponents(); + }); + + beforeEach(() => { + fixture = TestBed.createComponent(BulkAccessSettingsComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/access-control/bulk-access/settings/bulk-access-settings.component.ts b/src/app/access-control/bulk-access/settings/bulk-access-settings.component.ts new file mode 100644 index 0000000000..631b786b01 --- /dev/null +++ b/src/app/access-control/bulk-access/settings/bulk-access-settings.component.ts @@ -0,0 +1,15 @@ +import { Component, OnInit } from '@angular/core'; + +@Component({ + selector: 'ds-bulk-access-settings', + templateUrl: './bulk-access-settings.component.html', + styleUrls: ['./bulk-access-settings.component.scss'] +}) +export class BulkAccessSettingsComponent implements OnInit { + + constructor() { } + + ngOnInit(): void { + } + +} diff --git a/src/app/menu.resolver.ts b/src/app/menu.resolver.ts index 3ec1df85fd..cad6a6ec57 100644 --- a/src/app/menu.resolver.ts +++ b/src/app/menu.resolver.ts @@ -659,6 +659,17 @@ export class MenuResolver implements Resolve { link: '/access-control/groups' } as LinkMenuItemModel, }, + { + id: 'access_control_bulk', + parentID: 'access_control', + active: false, + visible: isSiteAdmin, + model: { + type: MenuItemType.LINK, + text: 'menu.section.access_control_bulk', + link: '/access-control/bulk-access' + } as LinkMenuItemModel, + }, // TODO: enable this menu item once the feature has been implemented // { // id: 'access_control_authorizations', diff --git a/src/assets/i18n/en.json5 b/src/assets/i18n/en.json5 index 6541848df2..00f2bd46b0 100644 --- a/src/assets/i18n/en.json5 +++ b/src/assets/i18n/en.json5 @@ -227,6 +227,18 @@ + "admin.access-control.bulk-access": "Bulk access", + + "admin.access-control.bulk-access.title": "Bulk Access", + + "admin.access-control.bulk-access-browse.header": "Step 1: select objects", + + "admin.access-control.bulk-access-browse.search.header": "Search", + + "admin.access-control.bulk-access-browse.selected.header": "Current selection({{number}})", + + "admin.access-control.bulk-access-settings.header": "Step 2: operation to perform", + "admin.access-control.epeople.actions.delete": "Delete EPerson", "admin.access-control.epeople.actions.impersonate": "Impersonate EPerson", @@ -2878,6 +2890,8 @@ "menu.section.access_control_authorizations": "Authorizations", + "menu.section.access_control_bulk": "Bulk access", + "menu.section.access_control_groups": "Groups", "menu.section.access_control_people": "People", From fbfe55db35b4427d71cadf1262e78ea019553c5f Mon Sep 17 00:00:00 2001 From: Tim Donohue Date: Tue, 9 May 2023 16:37:33 -0500 Subject: [PATCH 172/409] Enable Vietnamese language pack --- config/config.example.yml | 3 +++ src/config/default-app-config.ts | 1 + 2 files changed, 4 insertions(+) diff --git a/config/config.example.yml b/config/config.example.yml index f1e6be76aa..a62cce13eb 100644 --- a/config/config.example.yml +++ b/config/config.example.yml @@ -214,6 +214,9 @@ languages: - code: tr label: Türkçe active: true + - code: vi + label: Tiếng Việt + active: true - code: kk label: Қазақ active: true diff --git a/src/config/default-app-config.ts b/src/config/default-app-config.ts index 67c2feada8..77422e4eff 100644 --- a/src/config/default-app-config.ts +++ b/src/config/default-app-config.ts @@ -229,6 +229,7 @@ export class DefaultAppConfig implements AppConfig { { code: 'fi', label: 'Suomi', active: true }, { code: 'sv', label: 'Svenska', active: true }, { code: 'tr', label: 'Türkçe', active: true }, + { code: 'vi', label: 'Tiếng Việt', active: true }, { code: 'kk', label: 'Қазақ', active: true }, { code: 'bn', label: 'বাংলা', active: true }, { code: 'hi', label: 'हिंदी', active: true}, From c10e660e0b1da868065f1c8ecdd4709636a1e5b9 Mon Sep 17 00:00:00 2001 From: Nona Luypaert Date: Wed, 10 May 2023 10:11:06 +0200 Subject: [PATCH 173/409] 101623: Refactor BrowseDefinition model/resource-type to FlatBrowseDefinition --- src/app/browse-by/browse-by-guard.spec.ts | 4 ++-- src/app/browse-by/browse-by-guard.ts | 4 ++-- .../browse-by-switcher.component.spec.ts | 14 +++++++------- .../browse-by-switcher.component.ts | 4 ++-- .../core/browse/browse-definition-data.service.ts | 8 ++++---- src/app/core/browse/browse.service.spec.ts | 6 +++--- src/app/core/browse/browse.service.ts | 10 +++++----- src/app/core/core.module.ts | 4 ++-- ...on.model.ts => flat-browse-definition.model.ts} | 9 ++++----- .../shared/flat-browse-definition.resource-type.ts | 9 +++++++++ src/app/core/shared/operators.ts | 12 ++++++------ src/app/menu.resolver.ts | 8 ++++---- src/app/navbar/navbar.component.spec.ts | 10 +++++----- .../comcol-page-browse-by.component.ts | 8 ++++---- 14 files changed, 59 insertions(+), 51 deletions(-) rename src/app/core/shared/{browse-definition.model.ts => flat-browse-definition.model.ts} (81%) create mode 100644 src/app/core/shared/flat-browse-definition.resource-type.ts diff --git a/src/app/browse-by/browse-by-guard.spec.ts b/src/app/browse-by/browse-by-guard.spec.ts index 933c95a3cb..8a9f9b8c50 100644 --- a/src/app/browse-by/browse-by-guard.spec.ts +++ b/src/app/browse-by/browse-by-guard.spec.ts @@ -2,7 +2,7 @@ import { first } from 'rxjs/operators'; import { BrowseByGuard } from './browse-by-guard'; import { of as observableOf } from 'rxjs'; import { createSuccessfulRemoteDataObject$ } from '../shared/remote-data.utils'; -import { BrowseDefinition } from '../core/shared/browse-definition.model'; +import { FlatBrowseDefinition } from '../core/shared/flat-browse-definition.model'; import { BrowseByDataType } from './browse-by-switcher/browse-by-decorator'; describe('BrowseByGuard', () => { @@ -18,7 +18,7 @@ describe('BrowseByGuard', () => { const id = 'author'; const scope = '1234-65487-12354-1235'; const value = 'Filter'; - const browseDefinition = Object.assign(new BrowseDefinition(), { type: BrowseByDataType.Metadata, metadataKeys: ['dc.contributor'] }); + const browseDefinition = Object.assign(new FlatBrowseDefinition(), { type: BrowseByDataType.Metadata, metadataKeys: ['dc.contributor'] }); beforeEach(() => { dsoService = { diff --git a/src/app/browse-by/browse-by-guard.ts b/src/app/browse-by/browse-by-guard.ts index e4582cb77a..f42359b56b 100644 --- a/src/app/browse-by/browse-by-guard.ts +++ b/src/app/browse-by/browse-by-guard.ts @@ -7,7 +7,7 @@ import { getFirstSucceededRemoteData, getFirstSucceededRemoteDataPayload } from import { TranslateService } from '@ngx-translate/core'; import { Observable, of as observableOf } from 'rxjs'; import { BrowseDefinitionDataService } from '../core/browse/browse-definition-data.service'; -import { BrowseDefinition } from '../core/shared/browse-definition.model'; +import { FlatBrowseDefinition } from '../core/shared/flat-browse-definition.model'; @Injectable() /** @@ -23,7 +23,7 @@ export class BrowseByGuard implements CanActivate { canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) { const title = route.data.title; const id = route.params.id || route.queryParams.id || route.data.id; - let browseDefinition$: Observable; + let browseDefinition$: Observable; if (hasNoValue(route.data.browseDefinition) && hasValue(id)) { browseDefinition$ = this.browseDefinitionService.findById(id).pipe(getFirstSucceededRemoteDataPayload()); } else { diff --git a/src/app/browse-by/browse-by-switcher/browse-by-switcher.component.spec.ts b/src/app/browse-by/browse-by-switcher/browse-by-switcher.component.spec.ts index c2e1c9cb68..91c6c29252 100644 --- a/src/app/browse-by/browse-by-switcher/browse-by-switcher.component.spec.ts +++ b/src/app/browse-by/browse-by-switcher/browse-by-switcher.component.spec.ts @@ -3,7 +3,7 @@ import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; import { NO_ERRORS_SCHEMA } from '@angular/core'; import { ActivatedRoute } from '@angular/router'; import { BROWSE_BY_COMPONENT_FACTORY, BrowseByDataType } from './browse-by-decorator'; -import { BrowseDefinition } from '../../core/shared/browse-definition.model'; +import { FlatBrowseDefinition } from '../../core/shared/flat-browse-definition.model'; import { BehaviorSubject } from 'rxjs'; import { ThemeService } from '../../shared/theme-support/theme.service'; @@ -13,33 +13,33 @@ describe('BrowseBySwitcherComponent', () => { const types = [ Object.assign( - new BrowseDefinition(), { + new FlatBrowseDefinition(), { id: 'title', dataType: BrowseByDataType.Title, } ), Object.assign( - new BrowseDefinition(), { + new FlatBrowseDefinition(), { id: 'dateissued', dataType: BrowseByDataType.Date, metadataKeys: ['dc.date.issued'] } ), Object.assign( - new BrowseDefinition(), { + new FlatBrowseDefinition(), { id: 'author', dataType: BrowseByDataType.Metadata, } ), Object.assign( - new BrowseDefinition(), { + new FlatBrowseDefinition(), { id: 'subject', dataType: BrowseByDataType.Metadata, } ), ]; - const data = new BehaviorSubject(createDataWithBrowseDefinition(new BrowseDefinition())); + const data = new BehaviorSubject(createDataWithBrowseDefinition(new FlatBrowseDefinition())); const activatedRouteStub = { data @@ -70,7 +70,7 @@ describe('BrowseBySwitcherComponent', () => { comp = fixture.componentInstance; })); - types.forEach((type: BrowseDefinition) => { + types.forEach((type: FlatBrowseDefinition) => { describe(`when switching to a browse-by page for "${type.id}"`, () => { beforeEach(() => { data.next(createDataWithBrowseDefinition(type)); diff --git a/src/app/browse-by/browse-by-switcher/browse-by-switcher.component.ts b/src/app/browse-by/browse-by-switcher/browse-by-switcher.component.ts index 0d3a35bebf..3cfc735135 100644 --- a/src/app/browse-by/browse-by-switcher/browse-by-switcher.component.ts +++ b/src/app/browse-by/browse-by-switcher/browse-by-switcher.component.ts @@ -4,7 +4,7 @@ import { Observable } from 'rxjs'; import { map } from 'rxjs/operators'; import { BROWSE_BY_COMPONENT_FACTORY } from './browse-by-decorator'; import { GenericConstructor } from '../../core/shared/generic-constructor'; -import { BrowseDefinition } from '../../core/shared/browse-definition.model'; +import { FlatBrowseDefinition } from '../../core/shared/flat-browse-definition.model'; import { ThemeService } from '../../shared/theme-support/theme.service'; @Component({ @@ -31,7 +31,7 @@ export class BrowseBySwitcherComponent implements OnInit { */ ngOnInit(): void { this.browseByComponent = this.route.data.pipe( - map((data: { browseDefinition: BrowseDefinition }) => this.getComponentByBrowseByType(data.browseDefinition.dataType, this.themeService.getThemeName())) + map((data: { browseDefinition: FlatBrowseDefinition }) => this.getComponentByBrowseByType(data.browseDefinition.dataType, this.themeService.getThemeName())) ); } diff --git a/src/app/core/browse/browse-definition-data.service.ts b/src/app/core/browse/browse-definition-data.service.ts index 32c3b44e14..d9c401fc3f 100644 --- a/src/app/core/browse/browse-definition-data.service.ts +++ b/src/app/core/browse/browse-definition-data.service.ts @@ -1,6 +1,6 @@ import { Injectable } from '@angular/core'; import { BROWSE_DEFINITION } from '../shared/browse-definition.resource-type'; -import { BrowseDefinition } from '../shared/browse-definition.model'; +import { FlatBrowseDefinition } from '../shared/flat-browse-definition.model'; import { RequestService } from '../data/request.service'; import { RemoteDataBuildService } from '../cache/builders/remote-data-build.service'; import { ObjectCacheService } from '../cache/object-cache.service'; @@ -21,8 +21,8 @@ import { dataService } from '../data/base/data-service.decorator'; providedIn: 'root', }) @dataService(BROWSE_DEFINITION) -export class BrowseDefinitionDataService extends IdentifiableDataService implements FindAllData { - private findAllData: FindAllDataImpl; +export class BrowseDefinitionDataService extends IdentifiableDataService implements FindAllData { + private findAllData: FindAllDataImpl; constructor( protected requestService: RequestService, @@ -49,7 +49,7 @@ export class BrowseDefinitionDataService extends IdentifiableDataService>>} * Return an observable that emits object list */ - findAll(options: FindListOptions = {}, useCachedVersionIfAvailable = true, reRequestOnStale = true, ...linksToFollow: FollowLinkConfig[]): Observable>> { + findAll(options: FindListOptions = {}, useCachedVersionIfAvailable = true, reRequestOnStale = true, ...linksToFollow: FollowLinkConfig[]): Observable>> { return this.findAllData.findAll(options, useCachedVersionIfAvailable, reRequestOnStale, ...linksToFollow); } } diff --git a/src/app/core/browse/browse.service.spec.ts b/src/app/core/browse/browse.service.spec.ts index 46ac8c44f4..9e0615385b 100644 --- a/src/app/core/browse/browse.service.spec.ts +++ b/src/app/core/browse/browse.service.spec.ts @@ -6,7 +6,7 @@ import { getMockRequestService } from '../../shared/mocks/request.service.mock'; import { HALEndpointServiceStub } from '../../shared/testing/hal-endpoint-service.stub'; import { RemoteDataBuildService } from '../cache/builders/remote-data-build.service'; import { RequestService } from '../data/request.service'; -import { BrowseDefinition } from '../shared/browse-definition.model'; +import { FlatBrowseDefinition } from '../shared/flat-browse-definition.model'; import { BrowseEntrySearchOptions } from './browse-entry-search-options.model'; import { BrowseService } from './browse.service'; import { createSuccessfulRemoteDataObject, createSuccessfulRemoteDataObject$ } from '../../shared/remote-data.utils'; @@ -23,7 +23,7 @@ describe('BrowseService', () => { const browsesEndpointURL = 'https://rest.api/browses'; const halService: any = new HALEndpointServiceStub(browsesEndpointURL); const browseDefinitions = [ - Object.assign(new BrowseDefinition(), { + Object.assign(new FlatBrowseDefinition(), { id: 'date', metadataBrowse: false, sortOptions: [ @@ -50,7 +50,7 @@ describe('BrowseService', () => { items: { href: 'https://rest.api/discover/browses/dateissued/items' } } }), - Object.assign(new BrowseDefinition(), { + Object.assign(new FlatBrowseDefinition(), { id: 'author', metadataBrowse: true, sortOptions: [ diff --git a/src/app/core/browse/browse.service.ts b/src/app/core/browse/browse.service.ts index 2fab189254..9e5589e3d8 100644 --- a/src/app/core/browse/browse.service.ts +++ b/src/app/core/browse/browse.service.ts @@ -6,7 +6,7 @@ import { RemoteDataBuildService } from '../cache/builders/remote-data-build.serv import { PaginatedList } from '../data/paginated-list.model'; import { RemoteData } from '../data/remote-data'; import { RequestService } from '../data/request.service'; -import { BrowseDefinition } from '../shared/browse-definition.model'; +import { FlatBrowseDefinition } from '../shared/flat-browse-definition.model'; import { BrowseEntry } from '../shared/browse-entry.model'; import { HALEndpointService } from '../shared/hal-endpoint.service'; import { Item } from '../shared/item.model'; @@ -60,7 +60,7 @@ export class BrowseService { /** * Get all BrowseDefinitions */ - getBrowseDefinitions(): Observable>> { + getBrowseDefinitions(): Observable>> { // TODO properly support pagination return this.browseDefinitionDataService.findAll({ elementsPerPage: 9999 }).pipe( getFirstSucceededRemoteData(), @@ -233,13 +233,13 @@ export class BrowseService { return this.getBrowseDefinitions().pipe( getRemoteDataPayload(), getPaginatedListPayload(), - map((browseDefinitions: BrowseDefinition[]) => browseDefinitions - .find((def: BrowseDefinition) => { + map((browseDefinitions: FlatBrowseDefinition[]) => browseDefinitions + .find((def: FlatBrowseDefinition) => { const matchingKeys = def.metadataKeys.find((key: string) => searchKeyArray.indexOf(key) >= 0); return isNotEmpty(matchingKeys); }) ), - map((def: BrowseDefinition) => { + map((def: FlatBrowseDefinition) => { if (isEmpty(def) || isEmpty(def._links) || isEmpty(def._links[linkPath])) { throw new Error(`A browse endpoint for ${linkPath} on ${metadataKey} isn't configured`); } else { diff --git a/src/app/core/core.module.ts b/src/app/core/core.module.ts index ede23ba43b..81b70e42c2 100644 --- a/src/app/core/core.module.ts +++ b/src/app/core/core.module.ts @@ -73,7 +73,7 @@ import { ServerResponseService } from './services/server-response.service'; import { NativeWindowFactory, NativeWindowService } from './services/window.service'; import { BitstreamFormat } from './shared/bitstream-format.model'; import { Bitstream } from './shared/bitstream.model'; -import { BrowseDefinition } from './shared/browse-definition.model'; +import { FlatBrowseDefinition } from './shared/flat-browse-definition.model'; import { BrowseEntry } from './shared/browse-entry.model'; import { Bundle } from './shared/bundle.model'; import { Collection } from './shared/collection.model'; @@ -324,7 +324,7 @@ export const models = SubmissionUploadsModel, AuthStatus, BrowseEntry, - BrowseDefinition, + FlatBrowseDefinition, ClaimedTask, TaskObject, PoolTask, diff --git a/src/app/core/shared/browse-definition.model.ts b/src/app/core/shared/flat-browse-definition.model.ts similarity index 81% rename from src/app/core/shared/browse-definition.model.ts rename to src/app/core/shared/flat-browse-definition.model.ts index 863f454422..38df4a562d 100644 --- a/src/app/core/shared/browse-definition.model.ts +++ b/src/app/core/shared/flat-browse-definition.model.ts @@ -1,7 +1,7 @@ import { autoserialize, autoserializeAs, deserialize } from 'cerialize'; import { typedObject } from '../cache/builders/build-decorators'; import { excludeFromEquals } from '../utilities/equals.decorators'; -import { BROWSE_DEFINITION } from './browse-definition.resource-type'; +import { FLAT_BROWSE_DEFINITION } from './flat-browse-definition.resource-type'; import { HALLink } from './hal-link.model'; import { ResourceType } from './resource-type'; import { SortOption } from './sort-option.model'; @@ -9,15 +9,14 @@ import { CacheableObject } from '../cache/cacheable-object.model'; import { BrowseByDataType } from '../../browse-by/browse-by-switcher/browse-by-decorator'; @typedObject -export class BrowseDefinition extends CacheableObject { - static type = BROWSE_DEFINITION; +export class FlatBrowseDefinition extends CacheableObject { + static type = FLAT_BROWSE_DEFINITION; /** * The object type */ @excludeFromEquals - @autoserialize - type: ResourceType; + type: ResourceType = FLAT_BROWSE_DEFINITION; @autoserialize id: string; diff --git a/src/app/core/shared/flat-browse-definition.resource-type.ts b/src/app/core/shared/flat-browse-definition.resource-type.ts new file mode 100644 index 0000000000..bfb01cd98c --- /dev/null +++ b/src/app/core/shared/flat-browse-definition.resource-type.ts @@ -0,0 +1,9 @@ +import { ResourceType } from './resource-type'; + +/** + * The resource type for FlatBrowseDefinition + * + * Needs to be in a separate file to prevent circular + * dependencies in webpack. + */ +export const FLAT_BROWSE_DEFINITION = new ResourceType('flatBrowse'); diff --git a/src/app/core/shared/operators.ts b/src/app/core/shared/operators.ts index 32610c82fd..dd0ade112a 100644 --- a/src/app/core/shared/operators.ts +++ b/src/app/core/shared/operators.ts @@ -6,7 +6,7 @@ import { PaginatedList } from '../data/paginated-list.model'; import { RemoteData } from '../data/remote-data'; import { MetadataField } from '../metadata/metadata-field.model'; import { MetadataSchema } from '../metadata/metadata-schema.model'; -import { BrowseDefinition } from './browse-definition.model'; +import { FlatBrowseDefinition } from './flat-browse-definition.model'; import { DSpaceObject } from './dspace-object.model'; import { InjectionToken } from '@angular/core'; import { MonoTypeOperatorFunction, SchedulerLike } from 'rxjs/internal/types'; @@ -171,17 +171,17 @@ export const toDSpaceObjectListRD = () => /** * Get the browse links from a definition by ID given an array of all definitions * @param {string} definitionID - * @returns {(source: Observable>) => Observable} + * @returns {(source: Observable>) => Observable} */ export const getBrowseDefinitionLinks = (definitionID: string) => - (source: Observable>>): Observable => + (source: Observable>>): Observable => source.pipe( getRemoteDataPayload(), getPaginatedListPayload(), - map((browseDefinitions: BrowseDefinition[]) => browseDefinitions - .find((def: BrowseDefinition) => def.id === definitionID) + map((browseDefinitions: FlatBrowseDefinition[]) => browseDefinitions + .find((def: FlatBrowseDefinition) => def.id === definitionID) ), - map((def: BrowseDefinition) => { + map((def: FlatBrowseDefinition) => { if (isNotEmpty(def)) { return def._links; } else { diff --git a/src/app/menu.resolver.ts b/src/app/menu.resolver.ts index f771ef8b27..d423d3bc33 100644 --- a/src/app/menu.resolver.ts +++ b/src/app/menu.resolver.ts @@ -7,7 +7,7 @@ import { MenuItemType } from './shared/menu/menu-item-type.model'; import { LinkMenuItemModel } from './shared/menu/menu-item/models/link.model'; import { getFirstCompletedRemoteData } from './core/shared/operators'; import { PaginatedList } from './core/data/paginated-list.model'; -import { BrowseDefinition } from './core/shared/browse-definition.model'; +import { FlatBrowseDefinition } from './core/shared/flat-browse-definition.model'; import { RemoteData } from './core/data/remote-data'; import { TextMenuItemModel } from './shared/menu/menu-item/models/text.model'; import { BrowseService } from './core/browse/browse.service'; @@ -108,10 +108,10 @@ export class MenuResolver implements Resolve { ]; // Read the different Browse-By types from config and add them to the browse menu this.browseService.getBrowseDefinitions() - .pipe(getFirstCompletedRemoteData>()) - .subscribe((browseDefListRD: RemoteData>) => { + .pipe(getFirstCompletedRemoteData>()) + .subscribe((browseDefListRD: RemoteData>) => { if (browseDefListRD.hasSucceeded) { - browseDefListRD.payload.page.forEach((browseDef: BrowseDefinition) => { + browseDefListRD.payload.page.forEach((browseDef: FlatBrowseDefinition) => { menuList.push({ id: `browse_global_by_${browseDef.id}`, parentID: 'browse_global', diff --git a/src/app/navbar/navbar.component.spec.ts b/src/app/navbar/navbar.component.spec.ts index ada9be9d0b..084047fc46 100644 --- a/src/app/navbar/navbar.component.spec.ts +++ b/src/app/navbar/navbar.component.spec.ts @@ -16,7 +16,7 @@ import { RouterTestingModule } from '@angular/router/testing'; import { BrowseService } from '../core/browse/browse.service'; import { createSuccessfulRemoteDataObject, createSuccessfulRemoteDataObject$ } from '../shared/remote-data.utils'; import { buildPaginatedList } from '../core/data/paginated-list.model'; -import { BrowseDefinition } from '../core/shared/browse-definition.model'; +import { FlatBrowseDefinition } from '../core/shared/flat-browse-definition.model'; import { BrowseByDataType } from '../browse-by/browse-by-switcher/browse-by-decorator'; import { Item } from '../core/shared/item.model'; import { AuthorizationDataService } from '../core/data/feature-authorization/authorization-data.service'; @@ -66,26 +66,26 @@ describe('NavbarComponent', () => { beforeEach(waitForAsync(() => { browseDefinitions = [ Object.assign( - new BrowseDefinition(), { + new FlatBrowseDefinition(), { id: 'title', dataType: BrowseByDataType.Title, } ), Object.assign( - new BrowseDefinition(), { + new FlatBrowseDefinition(), { id: 'dateissued', dataType: BrowseByDataType.Date, metadataKeys: ['dc.date.issued'] } ), Object.assign( - new BrowseDefinition(), { + new FlatBrowseDefinition(), { id: 'author', dataType: BrowseByDataType.Metadata, } ), Object.assign( - new BrowseDefinition(), { + new FlatBrowseDefinition(), { id: 'subject', dataType: BrowseByDataType.Metadata, } diff --git a/src/app/shared/comcol/comcol-page-browse-by/comcol-page-browse-by.component.ts b/src/app/shared/comcol/comcol-page-browse-by/comcol-page-browse-by.component.ts index 0527d283f0..668bd138c8 100644 --- a/src/app/shared/comcol/comcol-page-browse-by/comcol-page-browse-by.component.ts +++ b/src/app/shared/comcol/comcol-page-browse-by/comcol-page-browse-by.component.ts @@ -6,7 +6,7 @@ import { getCommunityPageRoute } from '../../../community-page/community-page-ro import { getCollectionPageRoute } from '../../../collection-page/collection-page-routing-paths'; import { getFirstCompletedRemoteData } from '../../../core/shared/operators'; import { PaginatedList } from '../../../core/data/paginated-list.model'; -import { BrowseDefinition } from '../../../core/shared/browse-definition.model'; +import { FlatBrowseDefinition } from '../../../core/shared/flat-browse-definition.model'; import { RemoteData } from '../../../core/data/remote-data'; import { BrowseService } from '../../../core/browse/browse.service'; @@ -46,11 +46,11 @@ export class ComcolPageBrowseByComponent implements OnInit { ngOnInit(): void { this.browseService.getBrowseDefinitions() - .pipe(getFirstCompletedRemoteData>()) - .subscribe((browseDefListRD: RemoteData>) => { + .pipe(getFirstCompletedRemoteData>()) + .subscribe((browseDefListRD: RemoteData>) => { if (browseDefListRD.hasSucceeded) { this.allOptions = browseDefListRD.payload.page - .map((config: BrowseDefinition) => ({ + .map((config: FlatBrowseDefinition) => ({ id: config.id, label: `browse.comcol.by.${config.id}`, routerLink: `/browse/${config.id}`, From 581ed432f9843c8f5a417a93e80494e2125bcffd Mon Sep 17 00:00:00 2001 From: Giuseppe Digilio Date: Wed, 10 May 2023 11:09:41 +0200 Subject: [PATCH 174/409] [CST-9636] Use show thumbnail flag for community and collection list elements --- .../collection-search-result-list-element.component.ts | 2 +- .../community-search-result-list-element.component.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/app/shared/object-list/search-result-list-element/collection-search-result/collection-search-result-list-element.component.ts b/src/app/shared/object-list/search-result-list-element/collection-search-result/collection-search-result-list-element.component.ts index 60415f649e..23e9e5ee57 100644 --- a/src/app/shared/object-list/search-result-list-element/collection-search-result/collection-search-result-list-element.component.ts +++ b/src/app/shared/object-list/search-result-list-element/collection-search-result/collection-search-result-list-element.component.ts @@ -23,7 +23,7 @@ export class CollectionSearchResultListElementComponent extends SearchResultList ngOnInit(): void { super.ngOnInit(); - this.showThumbnails = this.appConfig.browseBy.showThumbnails; + this.showThumbnails = this.showThumbnails ?? this.appConfig.browseBy.showThumbnails; } } diff --git a/src/app/shared/object-list/search-result-list-element/community-search-result/community-search-result-list-element.component.ts b/src/app/shared/object-list/search-result-list-element/community-search-result/community-search-result-list-element.component.ts index 4cc25b8b76..f31e36ce82 100644 --- a/src/app/shared/object-list/search-result-list-element/community-search-result/community-search-result-list-element.component.ts +++ b/src/app/shared/object-list/search-result-list-element/community-search-result/community-search-result-list-element.component.ts @@ -23,6 +23,6 @@ export class CommunitySearchResultListElementComponent extends SearchResultListE ngOnInit(): void { super.ngOnInit(); - this.showThumbnails = this.appConfig.browseBy.showThumbnails; + this.showThumbnails = this.showThumbnails ?? this.appConfig.browseBy.showThumbnails; } } From c2f2cb5b3abecdd358876a4462efaea7ae686be4 Mon Sep 17 00:00:00 2001 From: Nona Luypaert Date: Wed, 10 May 2023 11:01:15 +0200 Subject: [PATCH 175/409] 101623: Add HierarchicalBrowseDefinition model + base BrowseDefinition class --- src/app/core/shared/browse-definition.ts | 10 ++++ .../shared/flat-browse-definition.model.ts | 7 ++- .../hierarchical-browse-definition.model.ts | 47 +++++++++++++++++++ ...rchical-browse-definition.resource-type.ts | 9 ++++ 4 files changed, 72 insertions(+), 1 deletion(-) create mode 100644 src/app/core/shared/browse-definition.ts create mode 100644 src/app/core/shared/hierarchical-browse-definition.model.ts create mode 100644 src/app/core/shared/hierarchical-browse-definition.resource-type.ts diff --git a/src/app/core/shared/browse-definition.ts b/src/app/core/shared/browse-definition.ts new file mode 100644 index 0000000000..788ef65739 --- /dev/null +++ b/src/app/core/shared/browse-definition.ts @@ -0,0 +1,10 @@ +/** + * Base class for BrowseDefinition models + */ +export abstract class BrowseDefinition { + + /** + * Get the render type of the BrowseDefinition model + */ + abstract getRenderType(): string; +} diff --git a/src/app/core/shared/flat-browse-definition.model.ts b/src/app/core/shared/flat-browse-definition.model.ts index 38df4a562d..2002d6bbab 100644 --- a/src/app/core/shared/flat-browse-definition.model.ts +++ b/src/app/core/shared/flat-browse-definition.model.ts @@ -7,9 +7,10 @@ import { ResourceType } from './resource-type'; import { SortOption } from './sort-option.model'; import { CacheableObject } from '../cache/cacheable-object.model'; import { BrowseByDataType } from '../../browse-by/browse-by-switcher/browse-by-decorator'; +import { BrowseDefinition } from './browse-definition'; @typedObject -export class FlatBrowseDefinition extends CacheableObject { +export class FlatBrowseDefinition extends CacheableObject implements BrowseDefinition { static type = FLAT_BROWSE_DEFINITION; /** @@ -46,4 +47,8 @@ export class FlatBrowseDefinition extends CacheableObject { entries: HALLink; items: HALLink; }; + + getRenderType(): string { + return this.dataType; + } } diff --git a/src/app/core/shared/hierarchical-browse-definition.model.ts b/src/app/core/shared/hierarchical-browse-definition.model.ts new file mode 100644 index 0000000000..a57550e1b3 --- /dev/null +++ b/src/app/core/shared/hierarchical-browse-definition.model.ts @@ -0,0 +1,47 @@ +import { autoserialize, autoserializeAs, deserialize } from 'cerialize'; +import { typedObject } from '../cache/builders/build-decorators'; +import { excludeFromEquals } from '../utilities/equals.decorators'; +import { HIERARCHICAL_BROWSE_DEFINITION } from './hierarchical-browse-definition.resource-type'; +import { HALLink } from './hal-link.model'; +import { ResourceType } from './resource-type'; +import { CacheableObject } from '../cache/cacheable-object.model'; +import { BrowseDefinition } from './browse-definition'; + +@typedObject +export class HierarchicalBrowseDefinition extends CacheableObject implements BrowseDefinition { + static type = HIERARCHICAL_BROWSE_DEFINITION; + + /** + * The object type + */ + @excludeFromEquals + type: ResourceType = HIERARCHICAL_BROWSE_DEFINITION; + + @autoserialize + id: string; + + @autoserialize + facetType: string; + + @autoserialize + vocabulary: string; + + @autoserializeAs('metadata') + metadataKeys: string[]; + + get self(): string { + return this._links.self.href; + } + + @deserialize + _links: { + self: HALLink; + entries: HALLink; + items: HALLink; + vocabulary: HALLink; + }; + + getRenderType(): string { + return 'hierarchy'; + } +} diff --git a/src/app/core/shared/hierarchical-browse-definition.resource-type.ts b/src/app/core/shared/hierarchical-browse-definition.resource-type.ts new file mode 100644 index 0000000000..df06d67c7a --- /dev/null +++ b/src/app/core/shared/hierarchical-browse-definition.resource-type.ts @@ -0,0 +1,9 @@ +import { ResourceType } from './resource-type'; + +/** + * The resource type for HierarchicalBrowseDefinition + * + * Needs to be in a separate file to prevent circular + * dependencies in webpack. + */ +export const HIERARCHICAL_BROWSE_DEFINITION = new ResourceType('hierarchicalBrowse'); From 3924a820482944055d8ac6d3f7efab95f433050e Mon Sep 17 00:00:00 2001 From: Giuseppe Digilio Date: Wed, 10 May 2023 13:08:08 +0200 Subject: [PATCH 176/409] [CST-9636] Provide possibility to paginate a full list of elements --- .../object-list/object-list.component.html | 59 +++++++++++++------ .../object-list/object-list.component.ts | 5 ++ .../themed-object-list.component.ts | 6 ++ .../pagination/pagination.component.html | 4 +- src/app/shared/shared.module.ts | 4 +- 5 files changed, 57 insertions(+), 21 deletions(-) diff --git a/src/app/shared/object-list/object-list.component.html b/src/app/shared/object-list/object-list.component.html index 8e0482b1f7..541a4794b0 100644 --- a/src/app/shared/object-list/object-list.component.html +++ b/src/app/shared/object-list/object-list.component.html @@ -16,23 +16,46 @@ (prev)="goPrev()" (next)="goNext()">
    -
  • - - - -
  • + +
  • + + + +
  • +
    + +
  • + + + +
  • +
diff --git a/src/app/shared/object-list/object-list.component.ts b/src/app/shared/object-list/object-list.component.ts index 5161b75459..72bff54f59 100644 --- a/src/app/shared/object-list/object-list.component.ts +++ b/src/app/shared/object-list/object-list.component.ts @@ -76,6 +76,11 @@ export class ObjectListComponent { */ @Input() importConfig: { buttonLabel: string }; + /** + * If true the object list provided needs to be paginated using the `paginate` pipe + */ + @Input() listToPaginate = false; + /** * Whether or not the pagination should be rendered as simple previous and next buttons instead of the normal pagination */ diff --git a/src/app/shared/object-list/themed-object-list.component.ts b/src/app/shared/object-list/themed-object-list.component.ts index 4a04061a5c..9448ed5939 100644 --- a/src/app/shared/object-list/themed-object-list.component.ts +++ b/src/app/shared/object-list/themed-object-list.component.ts @@ -44,6 +44,11 @@ export class ThemedObjectListComponent extends ThemedComponent - -
-
-
-
diff --git a/src/app/collection-page/edit-collection-page/collection-access-control/collection-access-control.component.ts b/src/app/collection-page/edit-collection-page/collection-access-control/collection-access-control.component.ts index 35ba6076f9..4192fe5a9a 100644 --- a/src/app/collection-page/edit-collection-page/collection-access-control/collection-access-control.component.ts +++ b/src/app/collection-page/edit-collection-page/collection-access-control/collection-access-control.component.ts @@ -1,64 +1,24 @@ -import { Component, OnInit, ViewChild } from '@angular/core'; -import { shareReplay } from 'rxjs'; -import { - AccessControlArrayFormComponent -} from '../../../shared/access-control-array-form/access-control-array-form.component'; -import { CollectionAccessControlService } from './collection-access-control.service'; +import { Component, OnInit } from '@angular/core'; +import { Observable } from 'rxjs'; +import { RemoteData } from '../../../core/data/remote-data'; +import { Community } from '../../../core/shared/community.model'; +import { ActivatedRoute } from '@angular/router'; +import { map } from 'rxjs/operators'; +import { getFirstSucceededRemoteData } from '../../../core/shared/operators'; @Component({ selector: 'ds-collection-access-control', templateUrl: './collection-access-control.component.html', styleUrls: ['./collection-access-control.component.scss'], - providers: [CollectionAccessControlService] }) export class CollectionAccessControlComponent implements OnInit { + itemRD$: Observable>; - @ViewChild('bitstreamAccessCmp', { static: true }) bitstreamAccessCmp: AccessControlArrayFormComponent; - @ViewChild('itemAccessCmp', { static: true }) itemAccessCmp: AccessControlArrayFormComponent; - - constructor(private collectionAccessControlService: CollectionAccessControlService) {} - - state = initialState; - - dropdownData$ = this.collectionAccessControlService.dropdownData$.pipe( - shareReplay(1) - ); + constructor(private route: ActivatedRoute) {} ngOnInit(): void { - + this.itemRD$ = this.route.parent.parent.data.pipe( + map((data) => data.dso) + ).pipe(getFirstSucceededRemoteData()) as Observable>; } - - reset() { - this.bitstreamAccessCmp.reset(); - this.itemAccessCmp.reset(); - this.state = initialState; - } - - submit() { - const bitstreamAccess = this.bitstreamAccessCmp.getValue(); - const itemAccess = this.itemAccessCmp.getValue(); - - console.log('bitstreamAccess', bitstreamAccess); - console.log('itemAccess', itemAccess); - } - - handleStatusChange(type: 'item' | 'bitstream', active: boolean) { - if (type === 'bitstream') { - active ? this.bitstreamAccessCmp.enable() : this.bitstreamAccessCmp.disable(); - } else if (type === 'item') { - active ? this.itemAccessCmp.enable() : this.itemAccessCmp.disable(); - } - } - } - -const initialState = { - item: { - toggleStatus: false, - accessMode: '', - }, - bitstream: { - toggleStatus: false, - accessMode: '', - }, -}; diff --git a/src/app/collection-page/edit-collection-page/collection-access-control/collection-access-control.service.ts b/src/app/collection-page/edit-collection-page/collection-access-control/collection-access-control.service.ts deleted file mode 100644 index 3267461fe6..0000000000 --- a/src/app/collection-page/edit-collection-page/collection-access-control/collection-access-control.service.ts +++ /dev/null @@ -1,54 +0,0 @@ -import { Injectable } from '@angular/core'; -import { AccessControlItem } from 'src/app/core/shared/bulk-access-condition-options.model'; -import { Observable, of } from 'rxjs'; - -export interface AccessControlDropdownDataResponse { - id: string; - itemAccessConditionOptions: AccessControlItem[]; - bitstreamAccessConditionOptions: AccessControlItem[]; -} - -@Injectable() -export class CollectionAccessControlService { - dropdownData$: Observable = of(accessControlDropdownData); -} - -const accessControlDropdownData: AccessControlDropdownDataResponse = { - 'id': 'default', - 'itemAccessConditionOptions': [ - { - 'name': 'openaccess' - }, - { - 'name': 'administrator' - }, - { - 'name': 'embargo', - 'hasStartDate': true, - 'maxStartDate': '2018-06-24T00:40:54.970+0000' - }, - { - 'name': 'lease', - 'hasEndDate': true, - 'maxEndDate': '2017-12-24T00:40:54.970+0000' - } - ], - 'bitstreamAccessConditionOptions': [ - { - 'name': 'openaccess' - }, - { - 'name': 'administrator' - }, - { - 'name': 'embargo', - 'hasStartDate': true, - 'maxStartDate': '2018-06-24T00:40:54.970+0000' - }, - { - 'name': 'lease', - 'hasEndDate': true, - 'maxEndDate': '2017-12-24T00:40:54.970+0000' - } - ] -}; diff --git a/src/app/collection-page/edit-collection-page/edit-collection-page.module.ts b/src/app/collection-page/edit-collection-page/edit-collection-page.module.ts index 5af7d3189a..9d703c0cf4 100644 --- a/src/app/collection-page/edit-collection-page/edit-collection-page.module.ts +++ b/src/app/collection-page/edit-collection-page/edit-collection-page.module.ts @@ -18,6 +18,9 @@ import { AccessControlArrayFormModule } from '../../shared/access-control-array-form/access-control-array-form.component'; import { UiSwitchModule } from 'ngx-ui-switch'; +import { + AccessControlFormContainerModule +} from '../../shared/access-control-form-container/access-control-form-container.component'; /** * Module that contains all components related to the Edit Collection page administrator functionality @@ -33,6 +36,7 @@ import { UiSwitchModule } from 'ngx-ui-switch'; ComcolModule, AccessControlArrayFormModule, UiSwitchModule, + AccessControlFormContainerModule, ], declarations: [ EditCollectionPageComponent, diff --git a/src/app/community-page/edit-community-page/community-access-control/community-access-control.component.html b/src/app/community-page/edit-community-page/community-access-control/community-access-control.component.html index 26f394620a..89999955eb 100644 --- a/src/app/community-page/edit-community-page/community-access-control/community-access-control.component.html +++ b/src/app/community-page/edit-community-page/community-access-control/community-access-control.component.html @@ -1,120 +1,6 @@ -
-
-
-

{{ 'community-access-control-title' | translate }}

- -
-
-
-

- {{ 'access-control-item-header-toggle' | translate }} -

- - -
- -
-
- {{'access-control-mode' | translate}} -
-
-
- - -
-
- - -
-
-
- -
-
{{'access-control-access-conditions' | translate}}
- -
- {{'access-control-no-access-conditions-warning-message' | translate}} -
-
- - - - -
-
-
-

- {{ 'access-control-bitstream-header-toggle' | translate }} -

- -
- -
-
- {{'access-control-mode' | translate}} -
-
-
- - -
-
- - -
-
-
- -
-
{{'access-control-access-conditions' | translate}}
- -
- {{'access-control-no-access-conditions-warning-message' | translate}} -
-
- - - - -
-
- -
- -
- - -
-
-
-
+ +

{{'community-access-control-title' | translate }}

+
diff --git a/src/app/community-page/edit-community-page/community-access-control/community-access-control.component.ts b/src/app/community-page/edit-community-page/community-access-control/community-access-control.component.ts index a25adb177c..b24069b9ac 100644 --- a/src/app/community-page/edit-community-page/community-access-control/community-access-control.component.ts +++ b/src/app/community-page/edit-community-page/community-access-control/community-access-control.component.ts @@ -1,63 +1,26 @@ -import { Component, OnInit, ViewChild } from '@angular/core'; -import { CommunityAccessControlService } from './community-access-control.service'; -import { shareReplay } from 'rxjs'; -import { - AccessControlArrayFormComponent -} from '../../../shared/access-control-array-form/access-control-array-form.component'; +import { Component, OnInit } from '@angular/core'; +import { Observable } from 'rxjs'; +import { RemoteData } from '../../../core/data/remote-data'; +import { SelectableListService } from '../../../shared/object-list/selectable-list/selectable-list.service'; +import { NgbModal } from '@ng-bootstrap/ng-bootstrap'; +import { ActivatedRoute } from '@angular/router'; +import { map } from 'rxjs/operators'; +import { getFirstSucceededRemoteData } from '../../../core/shared/operators'; +import { Community } from '../../../core/shared/community.model'; @Component({ selector: 'ds-community-access-control', templateUrl: './community-access-control.component.html', styleUrls: ['./community-access-control.component.scss'], - providers: [CommunityAccessControlService] }) export class CommunityAccessControlComponent implements OnInit { + itemRD$: Observable>; - @ViewChild('bitstreamAccessCmp', { static: true }) bitstreamAccessCmp: AccessControlArrayFormComponent; - @ViewChild('itemAccessCmp', { static: true }) itemAccessCmp: AccessControlArrayFormComponent; - - constructor(private communityAccessControlService: CommunityAccessControlService) {} - - state = initialState; - - dropdownData$ = this.communityAccessControlService.dropdownData$.pipe( - shareReplay(1) - ); + constructor(private route: ActivatedRoute) {} ngOnInit(): void { - - } - - reset() { - this.bitstreamAccessCmp.reset(); - this.itemAccessCmp.reset(); - this.state = initialState; - } - - submit() { - const bitstreamAccess = this.bitstreamAccessCmp.getValue(); - const itemAccess = this.itemAccessCmp.getValue(); - - console.log('bitstreamAccess', bitstreamAccess); - console.log('itemAccess', itemAccess); - } - - handleStatusChange(type: 'item' | 'bitstream', active: boolean) { - if (type === 'bitstream') { - active ? this.bitstreamAccessCmp.enable() : this.bitstreamAccessCmp.disable(); - } else if (type === 'item') { - active ? this.itemAccessCmp.enable() : this.itemAccessCmp.disable(); - } + this.itemRD$ = this.route.parent.parent.data.pipe( + map((data) => data.dso) + ).pipe(getFirstSucceededRemoteData()) as Observable>; } } - -const initialState = { - item: { - toggleStatus: false, - accessMode: '', - }, - bitstream: { - toggleStatus: false, - accessMode: '', - }, -}; diff --git a/src/app/community-page/edit-community-page/edit-community-page.module.ts b/src/app/community-page/edit-community-page/edit-community-page.module.ts index 8aa52086ee..5ed2e401c6 100644 --- a/src/app/community-page/edit-community-page/edit-community-page.module.ts +++ b/src/app/community-page/edit-community-page/edit-community-page.module.ts @@ -15,6 +15,9 @@ import { UiSwitchModule } from 'ngx-ui-switch'; import { AccessControlArrayFormModule } from '../../shared/access-control-array-form/access-control-array-form.component'; +import { + AccessControlFormContainerModule +} from '../../shared/access-control-form-container/access-control-form-container.component'; /** * Module that contains all components related to the Edit Community page administrator functionality @@ -29,6 +32,7 @@ import { ResourcePoliciesModule, UiSwitchModule, AccessControlArrayFormModule, + AccessControlFormContainerModule, ], declarations: [ EditCommunityPageComponent, diff --git a/src/app/item-page/edit-item-page/edit-item-page.module.ts b/src/app/item-page/edit-item-page/edit-item-page.module.ts index fb46697c7d..322c6c6999 100644 --- a/src/app/item-page/edit-item-page/edit-item-page.module.ts +++ b/src/app/item-page/edit-item-page/edit-item-page.module.ts @@ -1,7 +1,7 @@ import { NgModule } from '@angular/core'; import { CommonModule } from '@angular/common'; -import { NgbTooltipModule, NgbModule } from '@ng-bootstrap/ng-bootstrap'; +import { NgbModule, NgbTooltipModule } from '@ng-bootstrap/ng-bootstrap'; import { SharedModule } from '../../shared/shared.module'; import { EditItemPageRoutingModule } from './edit-item-page.routing.module'; @@ -20,14 +20,22 @@ import { SearchPageModule } from '../../search-page/search-page.module'; import { ItemCollectionMapperComponent } from './item-collection-mapper/item-collection-mapper.component'; import { ItemRelationshipsComponent } from './item-relationships/item-relationships.component'; import { EditRelationshipComponent } from './item-relationships/edit-relationship/edit-relationship.component'; -import { EditRelationshipListComponent } from './item-relationships/edit-relationship-list/edit-relationship-list.component'; +import { + EditRelationshipListComponent +} from './item-relationships/edit-relationship-list/edit-relationship-list.component'; import { AbstractItemUpdateComponent } from './abstract-item-update/abstract-item-update.component'; import { ItemMoveComponent } from './item-move/item-move.component'; -import { ItemEditBitstreamBundleComponent } from './item-bitstreams/item-edit-bitstream-bundle/item-edit-bitstream-bundle.component'; +import { + ItemEditBitstreamBundleComponent +} from './item-bitstreams/item-edit-bitstream-bundle/item-edit-bitstream-bundle.component'; import { BundleDataService } from '../../core/data/bundle-data.service'; import { DragDropModule } from '@angular/cdk/drag-drop'; -import { ItemEditBitstreamDragHandleComponent } from './item-bitstreams/item-edit-bitstream-drag-handle/item-edit-bitstream-drag-handle.component'; -import { PaginatedDragAndDropBitstreamListComponent } from './item-bitstreams/item-edit-bitstream-bundle/paginated-drag-and-drop-bitstream-list/paginated-drag-and-drop-bitstream-list.component'; +import { + ItemEditBitstreamDragHandleComponent +} from './item-bitstreams/item-edit-bitstream-drag-handle/item-edit-bitstream-drag-handle.component'; +import { + PaginatedDragAndDropBitstreamListComponent +} from './item-bitstreams/item-edit-bitstream-bundle/paginated-drag-and-drop-bitstream-list/paginated-drag-and-drop-bitstream-list.component'; import { VirtualMetadataComponent } from './virtual-metadata/virtual-metadata.component'; import { ItemVersionHistoryComponent } from './item-version-history/item-version-history.component'; import { ItemAuthorizationsComponent } from './item-authorizations/item-authorizations.component'; @@ -43,10 +51,10 @@ import { AccessControlArrayFormModule } from '../../shared/access-control-array-form/access-control-array-form.component'; import { UiSwitchModule } from 'ngx-ui-switch'; -import { - ItemAccessControlSelectBitstreamsModalComponent -} from './item-access-control/item-access-control-select-bitstreams-modal/item-access-control-select-bitstreams-modal.component'; import { ResultsBackButtonModule } from '../../shared/results-back-button/results-back-button.module'; +import { + AccessControlFormContainerModule +} from '../../shared/access-control-form-container/access-control-form-container.component'; /** @@ -67,6 +75,7 @@ import { ResultsBackButtonModule } from '../../shared/results-back-button/result AccessControlArrayFormModule, UiSwitchModule, ResultsBackButtonModule, + AccessControlFormContainerModule, ], declarations: [ EditItemPageComponent, @@ -95,7 +104,6 @@ import { ResultsBackButtonModule } from '../../shared/results-back-button/result IdentifierDataComponent, ItemRegisterDoiComponent, ItemAccessControlComponent, - ItemAccessControlSelectBitstreamsModalComponent ], providers: [ BundleDataService, diff --git a/src/app/item-page/edit-item-page/item-access-control/item-access-control.component.html b/src/app/item-page/edit-item-page/item-access-control/item-access-control.component.html index 6b65f2fe8b..7bef310717 100644 --- a/src/app/item-page/edit-item-page/item-access-control/item-access-control.component.html +++ b/src/app/item-page/edit-item-page/item-access-control/item-access-control.component.html @@ -1,159 +1,6 @@ -
-
-
-

{{ 'item-access-control-title' | translate }}

- -
-
-
-

- {{ 'access-control-item-header-toggle' | translate }} -

- - -
- -
-
- {{ 'access-control-mode' | translate }} -
-
-
- - -
-
- - -
-
-
- -
-
{{'access-control-access-conditions' | translate}}
-
- {{'access-control-no-access-conditions-warning-message' | translate}} -
-
- - - - -
-
-
-

- {{'access-control-bitstream-header-toggle' | translate}} -

- - -
- -
-
- {{'access-control-limit-to-specific' | translate}} -
-
-
- - -
-
- - -
-
-
- -
-
- {{'access-control-mode' | translate}} -
-
-
- - -
-
- - -
-
-
- -
-
- {{'access-control-access-conditions' | translate}} -
- -
- {{'access-control-no-access-conditions-warning-message' | translate}} -
-
- - - - -
-
- -
- -
- - -
-
-
-
+ +

{{ 'item-access-control-title' | translate }}

+
diff --git a/src/app/item-page/edit-item-page/item-access-control/item-access-control.component.ts b/src/app/item-page/edit-item-page/item-access-control/item-access-control.component.ts index 29f1d55ada..096c66577a 100644 --- a/src/app/item-page/edit-item-page/item-access-control/item-access-control.component.ts +++ b/src/app/item-page/edit-item-page/item-access-control/item-access-control.component.ts @@ -1,48 +1,24 @@ -import { ChangeDetectorRef, Component, OnDestroy, OnInit, ViewChild } from '@angular/core'; -import { - AccessControlArrayFormComponent -} from '../../../shared/access-control-array-form/access-control-array-form.component'; -import { concatMap, Observable, shareReplay } from 'rxjs'; +import { Component, OnInit } from '@angular/core'; +import { Observable } from 'rxjs'; import { ItemAccessControlService } from './item-access-control.service'; import { NgbModal } from '@ng-bootstrap/ng-bootstrap'; -import { - ITEM_ACCESS_CONTROL_SELECT_BITSTREAMS_LIST_ID, - ItemAccessControlSelectBitstreamsModalComponent -} from './item-access-control-select-bitstreams-modal/item-access-control-select-bitstreams-modal.component'; -import { map, take } from 'rxjs/operators'; +import { map } from 'rxjs/operators'; import { getFirstSucceededRemoteData } from '../../../core/shared/operators'; import { RemoteData } from '../../../core/data/remote-data'; import { Item } from '../../../core/shared/item.model'; import { ActivatedRoute } from '@angular/router'; import { SelectableListService } from '../../../shared/object-list/selectable-list/selectable-list.service'; -import { ListableObject } from '../../../shared/object-collection/shared/listable-object.model'; @Component({ selector: 'ds-item-access-control', templateUrl: './item-access-control.component.html', styleUrls: [ './item-access-control.component.scss' ], - providers: [ ItemAccessControlService ] }) -export class ItemAccessControlComponent implements OnInit, OnDestroy { +export class ItemAccessControlComponent implements OnInit { itemRD$: Observable>; - @ViewChild('bitstreamAccessCmp', { static: true }) bitstreamAccessCmp: AccessControlArrayFormComponent; - @ViewChild('itemAccessCmp', { static: true }) itemAccessCmp: AccessControlArrayFormComponent; - - constructor( - private itemAccessControlService: ItemAccessControlService, - private selectableListService: SelectableListService, - protected modalService: NgbModal, - private route: ActivatedRoute, - private cdr: ChangeDetectorRef - ) {} - - state = initialState; - - dropdownData$ = this.itemAccessControlService.dropdownData$.pipe( - shareReplay(1) - ); + constructor(private route: ActivatedRoute) {} ngOnInit(): void { this.itemRD$ = this.route.parent.parent.data.pipe( @@ -50,59 +26,4 @@ export class ItemAccessControlComponent implements OnInit, OnDestroy { ).pipe(getFirstSucceededRemoteData()) as Observable>; } - reset() { - this.bitstreamAccessCmp.reset(); - this.itemAccessCmp.reset(); - this.state = initialState; - } - - submit() { - const bitstreamAccess = this.bitstreamAccessCmp.getValue(); - const itemAccess = this.itemAccessCmp.getValue(); - - this.itemAccessControlService.execute({ - bitstreamAccess, - itemAccess, - state: this.state - }); - } - - handleStatusChange(type: 'item' | 'bitstream', active: boolean) { - if (type === 'bitstream') { - active ? this.bitstreamAccessCmp.enable() : this.bitstreamAccessCmp.disable(); - } else if (type === 'item') { - active ? this.itemAccessCmp.enable() : this.itemAccessCmp.disable(); - } - } - - openSelectBitstreamsModal(item: Item) { - const ref = this.modalService.open(ItemAccessControlSelectBitstreamsModalComponent); - ref.componentInstance.selectedBitstreams = this.state.bitstream.selectedBitstreams; - ref.componentInstance.item = item; - - ref.closed.pipe( - concatMap(() => this.selectableListService.getSelectableList(ITEM_ACCESS_CONTROL_SELECT_BITSTREAMS_LIST_ID)), - take(1) - ).subscribe((list) => { - this.state.bitstream.selectedBitstreams = list.selection; - this.cdr.detectChanges(); - }); - } - - ngOnDestroy(): void { - this.selectableListService.deselectAll(ITEM_ACCESS_CONTROL_SELECT_BITSTREAMS_LIST_ID); - } } - -const initialState = { - item: { - toggleStatus: false, - accessMode: '', - }, - bitstream: { - toggleStatus: false, - accessMode: '', - changesLimit: '', // 'all' | 'selected' - selectedBitstreams: [] as ListableObject[], - }, -}; diff --git a/src/app/item-page/edit-item-page/item-access-control/item-access-control.service.ts b/src/app/item-page/edit-item-page/item-access-control/item-access-control.service.ts index 57b28f81b0..6bdc523aa8 100644 --- a/src/app/item-page/edit-item-page/item-access-control/item-access-control.service.ts +++ b/src/app/item-page/edit-item-page/item-access-control/item-access-control.service.ts @@ -8,7 +8,7 @@ export interface AccessControlDropdownDataResponse { bitstreamAccessConditionOptions: AccessControlItem[]; } -@Injectable() +@Injectable({ providedIn: 'root' }) export class ItemAccessControlService { dropdownData$: Observable = of(accessControlDropdownData); diff --git a/src/app/shared/access-control-form-container/access-control-form-container.component.html b/src/app/shared/access-control-form-container/access-control-form-container.component.html new file mode 100644 index 0000000000..bcf385f0d4 --- /dev/null +++ b/src/app/shared/access-control-form-container/access-control-form-container.component.html @@ -0,0 +1,163 @@ +
+
+
+ + + + + + +
+
+
+

+ {{ 'access-control-item-header-toggle' | translate }} +

+ + +
+ +
+
+ {{ 'access-control-mode' | translate }} +
+
+
+ + +
+
+ + +
+
+
+ +
+
{{'access-control-access-conditions' | translate}}
+
+ {{'access-control-no-access-conditions-warning-message' | translate}} +
+
+ + + + +
+
+
+

+ {{'access-control-bitstream-header-toggle' | translate}} +

+ + +
+ +
+
+ {{'access-control-limit-to-specific' | translate}} +
+
+
+ + +
+
+ + +
+
+
+ +
+
+ {{'access-control-mode' | translate}} +
+
+
+ + +
+
+ + +
+
+
+ +
+
+ {{'access-control-access-conditions' | translate}} +
+ +
+ {{'access-control-no-access-conditions-warning-message' | translate}} +
+
+ + + + +
+
+ +
+ +
+ + +
+
+
+
diff --git a/src/app/item-page/edit-item-page/item-access-control/item-access-control-select-bitstreams-modal/item-access-control-select-bitstreams-modal.component.scss b/src/app/shared/access-control-form-container/access-control-form-container.component.scss similarity index 100% rename from src/app/item-page/edit-item-page/item-access-control/item-access-control-select-bitstreams-modal/item-access-control-select-bitstreams-modal.component.scss rename to src/app/shared/access-control-form-container/access-control-form-container.component.scss diff --git a/src/app/shared/access-control-form-container/access-control-form-container.component.spec.ts b/src/app/shared/access-control-form-container/access-control-form-container.component.spec.ts new file mode 100644 index 0000000000..871e301209 --- /dev/null +++ b/src/app/shared/access-control-form-container/access-control-form-container.component.spec.ts @@ -0,0 +1,25 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { AccessControlFormContainerComponent } from './access-control-form-container.component'; + +describe('AccessControlFormContainerComponent', () => { + let component: AccessControlFormContainerComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [ AccessControlFormContainerComponent ] + }) + .compileComponents(); + }); + + beforeEach(() => { + fixture = TestBed.createComponent(AccessControlFormContainerComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/shared/access-control-form-container/access-control-form-container.component.ts b/src/app/shared/access-control-form-container/access-control-form-container.component.ts new file mode 100644 index 0000000000..00030f8474 --- /dev/null +++ b/src/app/shared/access-control-form-container/access-control-form-container.component.ts @@ -0,0 +1,119 @@ +import { ChangeDetectorRef, Component, Input, NgModule, ViewChild } from '@angular/core'; +import { concatMap, shareReplay } from 'rxjs'; +import { RemoteData } from '../../core/data/remote-data'; +import { Item } from '../../core/shared/item.model'; +import { + AccessControlArrayFormComponent, + AccessControlArrayFormModule +} from '../access-control-array-form/access-control-array-form.component'; +import { + ItemAccessControlService +} from '../../item-page/edit-item-page/item-access-control/item-access-control.service'; +import { SelectableListService } from '../object-list/selectable-list/selectable-list.service'; +import { NgbModal } from '@ng-bootstrap/ng-bootstrap'; +import { take } from 'rxjs/operators'; +import { CommonModule } from '@angular/common'; +import { ListableObject } from '../object-collection/shared/listable-object.model'; +import { SharedModule } from '../shared.module'; +import { TranslateModule } from '@ngx-translate/core'; +import { UiSwitchModule } from 'ngx-ui-switch'; +import { DSpaceObject } from '../../core/shared/dspace-object.model'; +import { + ITEM_ACCESS_CONTROL_SELECT_BITSTREAMS_LIST_ID, + ItemAccessControlSelectBitstreamsModalComponent +} from './item-access-control-select-bitstreams-modal/item-access-control-select-bitstreams-modal.component'; + +@Component({ + selector: 'ds-access-control-form-container', + templateUrl: './access-control-form-container.component.html', + styleUrls: ['./access-control-form-container.component.scss'] +}) +export class AccessControlFormContainerComponent { + + @Input() showLimitToSpecificBitstreams = false; + @Input() itemRD: RemoteData; + + @ViewChild('bitstreamAccessCmp', { static: true }) bitstreamAccessCmp: AccessControlArrayFormComponent; + @ViewChild('itemAccessCmp', { static: true }) itemAccessCmp: AccessControlArrayFormComponent; + + constructor( + private itemAccessControlService: ItemAccessControlService, + private selectableListService: SelectableListService, + protected modalService: NgbModal, + private cdr: ChangeDetectorRef + ) {} + + state = initialState; + + dropdownData$ = this.itemAccessControlService.dropdownData$.pipe( + shareReplay(1) + ); + + reset() { + this.bitstreamAccessCmp.reset(); + this.itemAccessCmp.reset(); + this.state = initialState; + } + + submit() { + const bitstreamAccess = this.bitstreamAccessCmp.getValue(); + const itemAccess = this.itemAccessCmp.getValue(); + + this.itemAccessControlService.execute({ + bitstreamAccess, + itemAccess, + state: this.state + }); + } + + handleStatusChange(type: 'item' | 'bitstream', active: boolean) { + if (type === 'bitstream') { + active ? this.bitstreamAccessCmp.enable() : this.bitstreamAccessCmp.disable(); + } else if (type === 'item') { + active ? this.itemAccessCmp.enable() : this.itemAccessCmp.disable(); + } + } + + openSelectBitstreamsModal(item: Item) { + const ref = this.modalService.open(ItemAccessControlSelectBitstreamsModalComponent); + ref.componentInstance.selectedBitstreams = this.state.bitstream.selectedBitstreams; + ref.componentInstance.item = item; + + ref.closed.pipe( + concatMap(() => this.selectableListService.getSelectableList(ITEM_ACCESS_CONTROL_SELECT_BITSTREAMS_LIST_ID)), + take(1) + ).subscribe((list) => { + this.state.bitstream.selectedBitstreams = list.selection; + this.cdr.detectChanges(); + }); + } + + // eslint-disable-next-line @angular-eslint/use-lifecycle-interface + ngOnDestroy(): void { + this.selectableListService.deselectAll(ITEM_ACCESS_CONTROL_SELECT_BITSTREAMS_LIST_ID); + } +} + + +const initialState = { + item: { + toggleStatus: false, + accessMode: '', + }, + bitstream: { + toggleStatus: false, + accessMode: '', + changesLimit: '', // 'all' | 'selected' + selectedBitstreams: [] as ListableObject[], + }, +}; + + +@NgModule({ + imports: [ CommonModule, AccessControlArrayFormModule, SharedModule, TranslateModule, UiSwitchModule ], + exports: [AccessControlFormContainerComponent], + declarations: [ AccessControlFormContainerComponent, ItemAccessControlSelectBitstreamsModalComponent ], +}) +export class AccessControlFormContainerModule {} + + diff --git a/src/app/item-page/edit-item-page/item-access-control/item-access-control-select-bitstreams-modal/item-access-control-select-bitstreams-modal.component.html b/src/app/shared/access-control-form-container/item-access-control-select-bitstreams-modal/item-access-control-select-bitstreams-modal.component.html similarity index 100% rename from src/app/item-page/edit-item-page/item-access-control/item-access-control-select-bitstreams-modal/item-access-control-select-bitstreams-modal.component.html rename to src/app/shared/access-control-form-container/item-access-control-select-bitstreams-modal/item-access-control-select-bitstreams-modal.component.html diff --git a/src/app/shared/access-control-form-container/item-access-control-select-bitstreams-modal/item-access-control-select-bitstreams-modal.component.scss b/src/app/shared/access-control-form-container/item-access-control-select-bitstreams-modal/item-access-control-select-bitstreams-modal.component.scss new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/app/item-page/edit-item-page/item-access-control/item-access-control-select-bitstreams-modal/item-access-control-select-bitstreams-modal.component.spec.ts b/src/app/shared/access-control-form-container/item-access-control-select-bitstreams-modal/item-access-control-select-bitstreams-modal.component.spec.ts similarity index 100% rename from src/app/item-page/edit-item-page/item-access-control/item-access-control-select-bitstreams-modal/item-access-control-select-bitstreams-modal.component.spec.ts rename to src/app/shared/access-control-form-container/item-access-control-select-bitstreams-modal/item-access-control-select-bitstreams-modal.component.spec.ts diff --git a/src/app/item-page/edit-item-page/item-access-control/item-access-control-select-bitstreams-modal/item-access-control-select-bitstreams-modal.component.ts b/src/app/shared/access-control-form-container/item-access-control-select-bitstreams-modal/item-access-control-select-bitstreams-modal.component.ts similarity index 69% rename from src/app/item-page/edit-item-page/item-access-control/item-access-control-select-bitstreams-modal/item-access-control-select-bitstreams-modal.component.ts rename to src/app/shared/access-control-form-container/item-access-control-select-bitstreams-modal/item-access-control-select-bitstreams-modal.component.ts index dbae803c44..171b1d59c1 100644 --- a/src/app/item-page/edit-item-page/item-access-control/item-access-control-select-bitstreams-modal/item-access-control-select-bitstreams-modal.component.ts +++ b/src/app/shared/access-control-form-container/item-access-control-select-bitstreams-modal/item-access-control-select-bitstreams-modal.component.ts @@ -1,17 +1,17 @@ import { Component, Input, OnInit } from '@angular/core'; import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap'; -import { PaginationService } from '../../../../core/pagination/pagination.service'; -import { TranslateService } from '@ngx-translate/core'; -import { BitstreamDataService } from '../../../../core/data/bitstream-data.service'; import { BehaviorSubject } from 'rxjs'; -import { Item } from '../../../../core/shared/item.model'; -import { getFirstCompletedRemoteData } from '../../../../core/shared/operators'; -import { PaginatedList } from '../../../../core/data/paginated-list.model'; -import { Bitstream } from '../../../../core/shared/bitstream.model'; -import { RemoteData } from '../../../../core/data/remote-data'; -import { PaginationComponentOptions } from '../../../../shared/pagination/pagination-component-options.model'; -import { hasValue } from '../../../../shared/empty.util'; -import { Context } from '../../../../core/shared/context.model'; +import { PaginatedList } from 'src/app/core/data/paginated-list.model'; +import { RemoteData } from 'src/app/core/data/remote-data'; +import { Bitstream } from 'src/app/core/shared/bitstream.model'; +import { Context } from 'src/app/core/shared/context.model'; +import { PaginationComponentOptions } from '../../pagination/pagination-component-options.model'; +import { Item } from '../../../core/shared/item.model'; +import { BitstreamDataService } from '../../../core/data/bitstream-data.service'; +import { PaginationService } from '../../../core/pagination/pagination.service'; +import { TranslateService } from '@ngx-translate/core'; +import { hasValue } from '../../empty.util'; +import { getFirstCompletedRemoteData } from '../../../core/shared/operators'; export const ITEM_ACCESS_CONTROL_SELECT_BITSTREAMS_LIST_ID = 'item-access-control-select-bitstreams' From 723e1e1278a3c5a12f02d5b0375cc53da3999614 Mon Sep 17 00:00:00 2001 From: Enea Jahollari Date: Wed, 10 May 2023 15:11:44 +0200 Subject: [PATCH 180/409] [CST-9636] Make access control form container reusable --- .../browse/bulk-access-browse.component.ts | 54 +++++++++++++++++-- .../item-access-control.component.ts | 3 -- ...cess-control-form-container.component.html | 11 ++-- ...access-control-form-container.component.ts | 45 ++++++++++++---- .../bulk-access-control.service.ts} | 25 +++++++-- 5 files changed, 110 insertions(+), 28 deletions(-) rename src/app/{item-page/edit-item-page/item-access-control/item-access-control.service.ts => shared/access-control-form-container/bulk-access-control.service.ts} (66%) diff --git a/src/app/access-control/bulk-access/browse/bulk-access-browse.component.ts b/src/app/access-control/bulk-access/browse/bulk-access-browse.component.ts index a91cdf35df..e6dba0cafe 100644 --- a/src/app/access-control/bulk-access/browse/bulk-access-browse.component.ts +++ b/src/app/access-control/bulk-access/browse/bulk-access-browse.component.ts @@ -16,7 +16,56 @@ import { PaginationComponentOptions } from '../../../shared/pagination/paginatio @Component({ selector: 'ds-bulk-access-browse', - templateUrl: './bulk-access-browse.component.html', + template: ` + + + +
+ +
+
+ + +
+
+
+
+ + +
+
+
+
+ `, styleUrls: ['./bulk-access-browse.component.scss'], providers: [ { @@ -44,8 +93,7 @@ export class BulkAccessBrowseComponent implements OnInit { paginationOptions: PaginationComponentOptions; private subs: Subscription[] = []; - constructor(private selectableListService: SelectableListService) { - } + constructor(private selectableListService: SelectableListService) {} ngOnInit(): void { this.paginationOptions = Object.assign(new PaginationComponentOptions(), { diff --git a/src/app/item-page/edit-item-page/item-access-control/item-access-control.component.ts b/src/app/item-page/edit-item-page/item-access-control/item-access-control.component.ts index 096c66577a..874b624494 100644 --- a/src/app/item-page/edit-item-page/item-access-control/item-access-control.component.ts +++ b/src/app/item-page/edit-item-page/item-access-control/item-access-control.component.ts @@ -1,13 +1,10 @@ import { Component, OnInit } from '@angular/core'; import { Observable } from 'rxjs'; -import { ItemAccessControlService } from './item-access-control.service'; -import { NgbModal } from '@ng-bootstrap/ng-bootstrap'; import { map } from 'rxjs/operators'; import { getFirstSucceededRemoteData } from '../../../core/shared/operators'; import { RemoteData } from '../../../core/data/remote-data'; import { Item } from '../../../core/shared/item.model'; import { ActivatedRoute } from '@angular/router'; -import { SelectableListService } from '../../../shared/object-list/selectable-list/selectable-list.service'; @Component({ selector: 'ds-item-access-control', diff --git a/src/app/shared/access-control-form-container/access-control-form-container.component.html b/src/app/shared/access-control-form-container/access-control-form-container.component.html index bcf385f0d4..71175ce588 100644 --- a/src/app/shared/access-control-form-container/access-control-form-container.component.html +++ b/src/app/shared/access-control-form-container/access-control-form-container.component.html @@ -3,10 +3,6 @@
- - - -
@@ -95,7 +91,8 @@ @@ -148,9 +145,9 @@
-
+
-
+
diff --git a/src/app/shared/access-control-form-container/access-control-form-container.component.ts b/src/app/shared/access-control-form-container/access-control-form-container.component.ts index 00030f8474..a2e9cb08ab 100644 --- a/src/app/shared/access-control-form-container/access-control-form-container.component.ts +++ b/src/app/shared/access-control-form-container/access-control-form-container.component.ts @@ -6,9 +6,7 @@ import { AccessControlArrayFormComponent, AccessControlArrayFormModule } from '../access-control-array-form/access-control-array-form.component'; -import { - ItemAccessControlService -} from '../../item-page/edit-item-page/item-access-control/item-access-control.service'; +import { BulkAccessControlService } from './bulk-access-control.service'; import { SelectableListService } from '../object-list/selectable-list/selectable-list.service'; import { NgbModal } from '@ng-bootstrap/ng-bootstrap'; import { take } from 'rxjs/operators'; @@ -26,18 +24,21 @@ import { @Component({ selector: 'ds-access-control-form-container', templateUrl: './access-control-form-container.component.html', - styleUrls: ['./access-control-form-container.component.scss'] + styleUrls: [ './access-control-form-container.component.scss' ], + exportAs: 'dsAccessControlForm' }) export class AccessControlFormContainerComponent { @Input() showLimitToSpecificBitstreams = false; @Input() itemRD: RemoteData; + @Input() hideSubmit = false; + @ViewChild('bitstreamAccessCmp', { static: true }) bitstreamAccessCmp: AccessControlArrayFormComponent; @ViewChild('itemAccessCmp', { static: true }) itemAccessCmp: AccessControlArrayFormComponent; constructor( - private itemAccessControlService: ItemAccessControlService, + private bulkAccessControlService: BulkAccessControlService, private selectableListService: SelectableListService, protected modalService: NgbModal, private cdr: ChangeDetectorRef @@ -45,10 +46,18 @@ export class AccessControlFormContainerComponent { state = initialState; - dropdownData$ = this.itemAccessControlService.dropdownData$.pipe( + dropdownData$ = this.bulkAccessControlService.dropdownData$.pipe( shareReplay(1) ); + getFormValue() { + return { + bitstream: this.bitstreamAccessCmp.getValue(), + item: this.itemAccessCmp.getValue(), + state: this.state + }; + } + reset() { this.bitstreamAccessCmp.reset(); this.itemAccessCmp.reset(); @@ -59,11 +68,18 @@ export class AccessControlFormContainerComponent { const bitstreamAccess = this.bitstreamAccessCmp.getValue(); const itemAccess = this.itemAccessCmp.getValue(); - this.itemAccessControlService.execute({ + const { file } = this.bulkAccessControlService.createPayloadFile({ bitstreamAccess, itemAccess, state: this.state }); + + this.bulkAccessControlService.executeScript( + [ this.itemRD.payload.uuid ], + file + ).pipe(take(1)).subscribe((res) => { + console.log('success', res); + }); } handleStatusChange(type: 'item' | 'bitstream', active: boolean) { @@ -110,9 +126,18 @@ const initialState = { @NgModule({ - imports: [ CommonModule, AccessControlArrayFormModule, SharedModule, TranslateModule, UiSwitchModule ], - exports: [AccessControlFormContainerComponent], - declarations: [ AccessControlFormContainerComponent, ItemAccessControlSelectBitstreamsModalComponent ], + imports: [ + CommonModule, + AccessControlArrayFormModule, + SharedModule, + TranslateModule, + UiSwitchModule + ], + declarations: [ + AccessControlFormContainerComponent, + ItemAccessControlSelectBitstreamsModalComponent + ], + exports: [ AccessControlFormContainerComponent ], }) export class AccessControlFormContainerModule {} diff --git a/src/app/item-page/edit-item-page/item-access-control/item-access-control.service.ts b/src/app/shared/access-control-form-container/bulk-access-control.service.ts similarity index 66% rename from src/app/item-page/edit-item-page/item-access-control/item-access-control.service.ts rename to src/app/shared/access-control-form-container/bulk-access-control.service.ts index 6bdc523aa8..85ec05cd60 100644 --- a/src/app/item-page/edit-item-page/item-access-control/item-access-control.service.ts +++ b/src/app/shared/access-control-form-container/bulk-access-control.service.ts @@ -1,6 +1,8 @@ import { Injectable } from '@angular/core'; import { Observable, of } from 'rxjs'; -import { AccessControlItem } from '../../../core/shared/bulk-access-condition-options.model'; +import { AccessControlItem } from '../../core/shared/bulk-access-condition-options.model'; +import { ScriptDataService } from '../../core/data/processes/script-data.service'; +import { ProcessParameter } from '../../process-page/processes/process-parameter.model'; export interface AccessControlDropdownDataResponse { id: string; @@ -9,11 +11,12 @@ export interface AccessControlDropdownDataResponse { } @Injectable({ providedIn: 'root' }) -export class ItemAccessControlService { +export class BulkAccessControlService { + constructor(private scriptService: ScriptDataService) {} + dropdownData$: Observable = of(accessControlDropdownData); - - execute(payload: any) { + createPayloadFile(payload: any) { console.log('execute', payload); const blob = new Blob([JSON.stringify(payload, null, 2)], { @@ -25,7 +28,19 @@ export class ItemAccessControlService { }); const url = URL.createObjectURL(file); - window.open(url, '_blank'); + window.open(url, '_blank'); // remove this later + + return { url, file }; + } + + executeScript(uuids: string[], file: File) { + console.log('execute', { uuids, file }); + + const params: ProcessParameter[] = [ + { name: 'uuid', value: uuids.join(',') }, + ]; + + return this.scriptService.invoke('bulk-access-control', params, [file]); } } From 35d4561d53f75c40c307c01a084d50fb780020b0 Mon Sep 17 00:00:00 2001 From: Giuseppe Digilio Date: Wed, 10 May 2023 15:12:55 +0200 Subject: [PATCH 181/409] [CST-9636] WIP improve bulk access page --- .../browse/bulk-access-browse.component.html | 23 +++-- .../browse/bulk-access-browse.component.ts | 89 +++++++++++++++---- .../bulk-access/bulk-access.component.html | 4 +- .../bulk-access/bulk-access.component.ts | 6 ++ .../bulk-access-settings.component.ts | 7 +- 5 files changed, 100 insertions(+), 29 deletions(-) diff --git a/src/app/access-control/bulk-access/browse/bulk-access-browse.component.html b/src/app/access-control/bulk-access/browse/bulk-access-browse.component.html index 760134aba5..9851aab835 100644 --- a/src/app/access-control/bulk-access/browse/bulk-access-browse.component.html +++ b/src/app/access-control/bulk-access/browse/bulk-access-browse.component.html @@ -22,7 +22,7 @@ {{'admin.access-control.bulk-access-browse.search.header' | translate}}
- @@ -30,15 +30,20 @@
  • - {{'admin.access-control.bulk-access-browse.selected.header' | translate: {number: ((objectsSelected$ | async)?.payload?.totalElements) ? (objectsSelected$ | async)?.payload?.totalElements : '0'} }} + + {{'admin.access-control.bulk-access-browse.selected.header' | translate: {number: ((objectsSelected$ | async)?.payload?.totalElements) ? (objectsSelected$ | async)?.payload?.totalElements : '0'} }} + - +
  • diff --git a/src/app/access-control/bulk-access/browse/bulk-access-browse.component.ts b/src/app/access-control/bulk-access/browse/bulk-access-browse.component.ts index a91cdf35df..ed94398f6d 100644 --- a/src/app/access-control/bulk-access/browse/bulk-access-browse.component.ts +++ b/src/app/access-control/bulk-access/browse/bulk-access-browse.component.ts @@ -1,4 +1,4 @@ -import { Component, OnInit } from '@angular/core'; +import { Component, Input, OnDestroy, OnInit } from '@angular/core'; import { BehaviorSubject, Subscription } from 'rxjs'; import { distinctUntilChanged, map } from 'rxjs/operators'; @@ -13,6 +13,7 @@ import { ListableObject } from '../../../shared/object-collection/shared/listabl import { createSuccessfulRemoteDataObject } from '../../../shared/remote-data.utils'; import { PageInfo } from '../../../core/shared/page-info.model'; import { PaginationComponentOptions } from '../../../shared/pagination/pagination-component-options.model'; +import { hasValue } from '../../../shared/empty.util'; @Component({ selector: 'ds-bulk-access-browse', @@ -25,43 +26,97 @@ import { PaginationComponentOptions } from '../../../shared/pagination/paginatio } ] }) -export class BulkAccessBrowseComponent implements OnInit { +export class BulkAccessBrowseComponent implements OnInit, OnDestroy { + + /** + * The selection list id + */ + @Input() listId!: string; + /** * The active nav id */ activateId = 'search'; - /** - * The selection list id - */ - listId: string = 'bulk-access-list'; - /** * The list of the objects already selected */ objectsSelected$: BehaviorSubject>> = new BehaviorSubject>>(null); - paginationOptions: PaginationComponentOptions; + /** + * The pagination options object used for the list of selected elements + */ + paginationOptions$: BehaviorSubject = new BehaviorSubject(Object.assign(new PaginationComponentOptions(), { + id: 'bas', + pageSize: 5, + currentPage: 1 + })); + + /** + * Array to track all subscriptions and unsubscribe them onDestroy + */ private subs: Subscription[] = []; constructor(private selectableListService: SelectableListService) { } + /** + * Subscribe to selectable list updates + */ ngOnInit(): void { - this.paginationOptions = Object.assign(new PaginationComponentOptions(), { - id: 'elp', - pageSize: 10, - currentPage: 1 - }); + this.subs.push( this.selectableListService.getSelectableList(this.listId).pipe( distinctUntilChanged(), - map((list: SelectableListState) => { - console.log(list); - return createSuccessfulRemoteDataObject(buildPaginatedList(new PageInfo(), list?.selection || [])) - }) + map((list: SelectableListState) => this.generatePaginatedListBySelectedElements(list)) ).subscribe(this.objectsSelected$) ) } + pageNext() { + this.paginationOptions$.next(Object.assign(new PaginationComponentOptions(), this.paginationOptions$.value, { + currentPage: this.paginationOptions$.value.currentPage + 1 + })); + console.log(this.paginationOptions$.value); + } + + pagePrev() { + this.paginationOptions$.next(Object.assign(new PaginationComponentOptions(), this.paginationOptions$.value, { + currentPage: this.paginationOptions$.value.currentPage - 1 + })); + console.log(this.paginationOptions$.value); + } + + private calculatePageCount(pageSize, totalCount = 0) { + // we suppose that if we have 0 items we want 1 empty page + return totalCount < pageSize ? 1 : Math.ceil(totalCount / pageSize); + }; + + /** + * Generate The RemoteData object containing the list of the selected elements + * @param list + * @private + */ + private generatePaginatedListBySelectedElements(list: SelectableListState): RemoteData> { + const pageInfo = new PageInfo({ + elementsPerPage: this.paginationOptions$.value.pageSize, + totalElements: list?.selection.length, + totalPages: this.calculatePageCount(this.paginationOptions$.value.pageSize, list?.selection.length), + currentPage: this.paginationOptions$.value.currentPage + }); + if (pageInfo.currentPage > pageInfo.totalPages) { + pageInfo.currentPage = pageInfo.totalPages; + this.paginationOptions$.next(Object.assign(new PaginationComponentOptions(), this.paginationOptions$.value, { + currentPage: pageInfo.currentPage + })); + } + return createSuccessfulRemoteDataObject(buildPaginatedList(pageInfo, list?.selection || [])); + } + + ngOnDestroy(): void { + this.subs + .filter((sub) => hasValue(sub)) + .forEach((sub) => sub.unsubscribe()); + this.selectableListService.deselectAll(this.listId) + } } diff --git a/src/app/access-control/bulk-access/bulk-access.component.html b/src/app/access-control/bulk-access/bulk-access.component.html index e0eafb6e36..12ab88cd1a 100644 --- a/src/app/access-control/bulk-access/bulk-access.component.html +++ b/src/app/access-control/bulk-access/bulk-access.component.html @@ -1,8 +1,8 @@
    - +
    - +
    diff --git a/src/app/access-control/bulk-access/bulk-access.component.ts b/src/app/access-control/bulk-access/bulk-access.component.ts index 9e45b2c59b..bc0d293e61 100644 --- a/src/app/access-control/bulk-access/bulk-access.component.ts +++ b/src/app/access-control/bulk-access/bulk-access.component.ts @@ -7,6 +7,12 @@ import { Component, OnInit } from '@angular/core'; }) export class BulkAccessComponent implements OnInit { + + /** + * The selection list id + */ + listId: string = 'bulk-access-list'; + constructor() { } ngOnInit(): void { diff --git a/src/app/access-control/bulk-access/settings/bulk-access-settings.component.ts b/src/app/access-control/bulk-access/settings/bulk-access-settings.component.ts index 631b786b01..cad9e5b981 100644 --- a/src/app/access-control/bulk-access/settings/bulk-access-settings.component.ts +++ b/src/app/access-control/bulk-access/settings/bulk-access-settings.component.ts @@ -1,4 +1,4 @@ -import { Component, OnInit } from '@angular/core'; +import { Component, Input, OnInit } from '@angular/core'; @Component({ selector: 'ds-bulk-access-settings', @@ -7,6 +7,11 @@ import { Component, OnInit } from '@angular/core'; }) export class BulkAccessSettingsComponent implements OnInit { + /** + * The selection list id + */ + @Input() listId!: string; + constructor() { } ngOnInit(): void { From 5455c79563d75b69e80240ad981f4e7c684d541d Mon Sep 17 00:00:00 2001 From: Giuseppe Digilio Date: Wed, 10 May 2023 15:53:00 +0200 Subject: [PATCH 182/409] [CST-9636] WIP add bulk-access-config-data.service --- .../browse/bulk-access-browse.component.ts | 51 +--------------- .../community-access-control.service.ts | 59 ------------------- .../bulk-access-config-data.service.ts} | 18 +++--- src/app/core/config/config-data.service.ts | 8 ++- .../bulk-access-condition-options.model.ts | 38 ++++++++++++ .../bulk-access-condition-options.model.ts | 45 -------------- .../access-control-array-form.component.html | 6 +- .../access-control-array-form.component.ts | 29 ++++++--- .../control-max-end-date.pipe.ts | 4 +- .../control-max-start-date.pipe.ts | 5 +- ...cess-control-form-container.component.html | 10 +--- ...access-control-form-container.component.ts | 17 ++++-- .../bulk-access-control.service.ts | 51 +--------------- 13 files changed, 97 insertions(+), 244 deletions(-) delete mode 100644 src/app/community-page/edit-community-page/community-access-control/community-access-control.service.ts rename src/app/core/{data/bulk-access-condition-options.service.ts => config/bulk-access-config-data.service.ts} (53%) create mode 100644 src/app/core/config/models/bulk-access-condition-options.model.ts delete mode 100644 src/app/core/shared/bulk-access-condition-options.model.ts diff --git a/src/app/access-control/bulk-access/browse/bulk-access-browse.component.ts b/src/app/access-control/bulk-access/browse/bulk-access-browse.component.ts index 43adae7ec0..7cbb8740a7 100644 --- a/src/app/access-control/bulk-access/browse/bulk-access-browse.component.ts +++ b/src/app/access-control/bulk-access/browse/bulk-access-browse.component.ts @@ -17,56 +17,7 @@ import { hasValue } from '../../../shared/empty.util'; @Component({ selector: 'ds-bulk-access-browse', - template: ` - - - -
    - -
    -
    - - -
    -
    -
    -
    - - -
    -
    -
    -
    - `, + templateUrl: 'bulk-access-browse.component.html', styleUrls: ['./bulk-access-browse.component.scss'], providers: [ { diff --git a/src/app/community-page/edit-community-page/community-access-control/community-access-control.service.ts b/src/app/community-page/edit-community-page/community-access-control/community-access-control.service.ts deleted file mode 100644 index 89534683b7..0000000000 --- a/src/app/community-page/edit-community-page/community-access-control/community-access-control.service.ts +++ /dev/null @@ -1,59 +0,0 @@ -import { Injectable } from '@angular/core'; -import { of } from 'rxjs'; -import { BulkAccessConditionOptionsService } from '../../../core/data/bulk-access-condition-options.service'; -import { BulkAccessConditionOptions } from '../../../core/shared/bulk-access-condition-options.model'; - - -@Injectable() -export class CommunityAccessControlService { - constructor(private service: BulkAccessConditionOptionsService) {} - - dropdownData$ = of(accessControlDropdownData); - - // dropdownData$ = this.service.getAll().pipe( - // getAllSucceededRemoteData(), - // filter((data) => data.hasSucceeded), - // map((data) => data.payload) - // ); -} - -const accessControlDropdownData: BulkAccessConditionOptions = { - _links: { self: undefined }, type: undefined, uuid: '', - 'id': 'default', - 'itemAccessConditionOptions': [ - { - 'name': 'openaccess' - }, - { - 'name': 'administrator' - }, - { - 'name': 'embargo', - 'hasStartDate': true, - 'maxStartDate': '2018-06-24T00:40:54.970+0000' - }, - { - 'name': 'lease', - 'hasEndDate': true, - 'maxEndDate': '2017-12-24T00:40:54.970+0000' - } - ], - 'bitstreamAccessConditionOptions': [ - { - 'name': 'openaccess' - }, - { - 'name': 'administrator' - }, - { - 'name': 'embargo', - 'hasStartDate': true, - 'maxStartDate': '2018-06-24T00:40:54.970+0000' - }, - { - 'name': 'lease', - 'hasEndDate': true, - 'maxEndDate': '2017-12-24T00:40:54.970+0000' - } - ] -}; diff --git a/src/app/core/data/bulk-access-condition-options.service.ts b/src/app/core/config/bulk-access-config-data.service.ts similarity index 53% rename from src/app/core/data/bulk-access-condition-options.service.ts rename to src/app/core/config/bulk-access-config-data.service.ts index 30e0402dbf..f27b59eee1 100644 --- a/src/app/core/data/bulk-access-condition-options.service.ts +++ b/src/app/core/config/bulk-access-config-data.service.ts @@ -3,16 +3,16 @@ import { Observable } from 'rxjs'; import { RemoteDataBuildService } from '../cache/builders/remote-data-build.service'; import { ObjectCacheService } from '../cache/object-cache.service'; import { HALEndpointService } from '../shared/hal-endpoint.service'; -import { RemoteData } from './remote-data'; -import { RequestService } from './request.service'; -import { IdentifiableDataService } from './base/identifiable-data.service'; -import { BulkAccessConditionOptions } from '../shared/bulk-access-condition-options.model'; +import { RemoteData } from '../data/remote-data'; +import { RequestService } from '../data/request.service'; +import { BulkAccessConditionOptions } from './models/bulk-access-condition-options.model'; +import { ConfigDataService } from './config-data.service'; @Injectable({ providedIn: 'root' }) /** * Data Service responsible for retrieving Bulk Access Condition Options from the REST API */ -export class BulkAccessConditionOptionsService extends IdentifiableDataService { +export class BulkAccessConfigDataService extends ConfigDataService { constructor( protected requestService: RequestService, @@ -23,11 +23,7 @@ export class BulkAccessConditionOptionsService extends IdentifiableDataService> { - return this.findByHref(this.halService.getEndpoint(this.linkPath)); + findByPropertyName(name: string): Observable> { + return this.findById(name) as Observable>; } - - // findByPropertyName(name: string): Observable> { - // return this.findById(name); - // } } diff --git a/src/app/core/config/config-data.service.ts b/src/app/core/config/config-data.service.ts index 9ef2f11ad1..f8f46435c5 100644 --- a/src/app/core/config/config-data.service.ts +++ b/src/app/core/config/config-data.service.ts @@ -4,13 +4,13 @@ import { RemoteData } from '../data/remote-data'; import { FollowLinkConfig } from '../../shared/utils/follow-link-config.model'; import { getFirstCompletedRemoteData } from '../shared/operators'; import { map } from 'rxjs/operators'; -import { BaseDataService } from '../data/base/base-data.service'; +import { IdentifiableDataService } from '../data/base/identifiable-data.service'; /** * Abstract data service to retrieve configuration objects from the REST server. * Common logic for configuration objects should be implemented here. */ -export abstract class ConfigDataService extends BaseDataService { +export abstract class ConfigDataService extends IdentifiableDataService { /** * Returns an observable of {@link RemoteData} of an object, based on an href, with a list of * {@link FollowLinkConfig}, to automatically resolve {@link HALLink}s of the object @@ -37,4 +37,8 @@ export abstract class ConfigDataService extends BaseDataService { }), ); } + + findByName(name: string, useCachedVersionIfAvailable = true, reRequestOnStale = true, ...linksToFollow: FollowLinkConfig[]): Observable> { + return super.findById(name, useCachedVersionIfAvailable, reRequestOnStale, ...linksToFollow); + } } diff --git a/src/app/core/config/models/bulk-access-condition-options.model.ts b/src/app/core/config/models/bulk-access-condition-options.model.ts new file mode 100644 index 0000000000..f10965ea31 --- /dev/null +++ b/src/app/core/config/models/bulk-access-condition-options.model.ts @@ -0,0 +1,38 @@ +import { autoserialize, autoserializeAs, deserialize } from 'cerialize'; +import { typedObject } from '../../cache/builders/build-decorators'; +import { excludeFromEquals } from '../../utilities/equals.decorators'; +import { ResourceType } from '../../shared/resource-type'; +import { HALLink } from '../../shared/hal-link.model'; +import { ConfigObject } from './config.model'; +import { AccessesConditionOption } from './config-accesses-conditions-options.model'; + +export const BULK_ACCESS_CONDITION_OPTIONS = new ResourceType('bulkAccessConditionOptions'); + +/** + * Model class for a bulk access condition options + */ +@typedObject +export class BulkAccessConditionOptions extends ConfigObject { + static type = BULK_ACCESS_CONDITION_OPTIONS; + + /** + * The object type + */ + @excludeFromEquals + @autoserialize + type: ResourceType; + + @autoserializeAs(String, 'name') + uuid: string; + + @autoserialize + id: string; + + @deserialize + itemAccessConditionOptions: AccessesConditionOption[]; + + @deserialize + bitstreamAccessConditionOptions: AccessesConditionOption[]; + + _links: { self: HALLink }; +} diff --git a/src/app/core/shared/bulk-access-condition-options.model.ts b/src/app/core/shared/bulk-access-condition-options.model.ts deleted file mode 100644 index a1c8fe0702..0000000000 --- a/src/app/core/shared/bulk-access-condition-options.model.ts +++ /dev/null @@ -1,45 +0,0 @@ -import { autoserialize, autoserializeAs, deserialize } from 'cerialize'; -import { typedObject } from '../cache/builders/build-decorators'; -import { excludeFromEquals } from '../utilities/equals.decorators'; -import { ResourceType } from './resource-type'; -import { CacheableObject } from '../cache/cacheable-object.model'; -import { HALLink } from './hal-link.model'; - -export const BULK_ACCESS_CONDITION_OPTIONS = new ResourceType('bulkAccessConditionOptions'); - -/** - * Model class for a bulk access condition options - */ -@typedObject -export class BulkAccessConditionOptions implements CacheableObject { - static type = BULK_ACCESS_CONDITION_OPTIONS; - - /** - * The object type - */ - @excludeFromEquals - @autoserialize - type: ResourceType; - - @autoserializeAs(String, 'name') - uuid: string; - - @autoserialize - id: string; - - @deserialize - itemAccessConditionOptions: AccessControlItem[]; - - @deserialize - bitstreamAccessConditionOptions: AccessControlItem[]; - - _links: { self: HALLink }; -} - -export interface AccessControlItem { - name: string - hasStartDate?: boolean - maxStartDate?: string - hasEndDate?: boolean - maxEndDate?: string -} diff --git a/src/app/shared/access-control-array-form/access-control-array-form.component.html b/src/app/shared/access-control-array-form/access-control-array-form.component.html index 24dcc11120..5d0fb6d97e 100644 --- a/src/app/shared/access-control-array-form/access-control-array-form.component.html +++ b/src/app/shared/access-control-array-form/access-control-array-form.component.html @@ -7,7 +7,7 @@
    @@ -20,7 +20,7 @@ placeholder="yyyy-mm-dd" name="dp" formControlName="startDate" - [minDate]="control | maxStartDate: dropdownOptions" + [minDate]="control | maxStartDate: (dropdownData$ | async)" ngbDatepicker #d="ngbDatepicker" /> @@ -40,7 +40,7 @@ placeholder="yyyy-mm-dd" name="dp" formControlName="endDate" - [maxDate]="control | maxEndDate: dropdownOptions" + [maxDate]="control | maxEndDate: (dropdownData$ | async)" ngbDatepicker #d1="ngbDatepicker" /> diff --git a/src/app/shared/access-control-array-form/access-control-array-form.component.ts b/src/app/shared/access-control-array-form/access-control-array-form.component.ts index ace507a3a6..13d13375b2 100644 --- a/src/app/shared/access-control-array-form/access-control-array-form.component.ts +++ b/src/app/shared/access-control-array-form/access-control-array-form.component.ts @@ -1,4 +1,4 @@ -import { Component, Input, NgModule, OnDestroy, OnInit } from '@angular/core'; +import { Component, NgModule, OnDestroy, OnInit } from '@angular/core'; import { CommonModule } from '@angular/common'; import { FormArray, FormBuilder, FormControl, ReactiveFormsModule } from '@angular/forms'; import { SharedBrowseByModule } from '../browse-by/shared-browse-by.module'; @@ -6,9 +6,13 @@ import { TranslateModule } from '@ngx-translate/core'; import { NgbDatepickerModule } from '@ng-bootstrap/ng-bootstrap'; import { ControlMaxStartDatePipe } from './control-max-start-date.pipe'; import { ControlMaxEndDatePipe } from './control-max-end-date.pipe'; -import { AccessControlItem } from '../../core/shared/bulk-access-condition-options.model'; -import { distinctUntilChanged, takeUntil } from 'rxjs/operators'; + +import { distinctUntilChanged, map, shareReplay, takeUntil, tap } from 'rxjs/operators'; import { Subject } from 'rxjs'; +import { getFirstCompletedRemoteData } from '../../core/shared/operators'; +import { RemoteData } from '../../core/data/remote-data'; +import { BulkAccessConditionOptions } from '../../core/config/models/bulk-access-condition-options.model'; +import { BulkAccessConfigDataService } from '../../core/config/bulk-access-config-data.service'; // will be used on the form value @@ -25,8 +29,6 @@ export interface AccessControlItemValue { exportAs: 'accessControlArrayForm' }) export class AccessControlArrayFormComponent implements OnInit, OnDestroy { - @Input() dropdownOptions: AccessControlItem[] = []; - @Input() accessControlItems: AccessControlItemValue[] = []; private destroy$ = new Subject(); @@ -34,17 +36,28 @@ export class AccessControlArrayFormComponent implements OnInit, OnDestroy { accessControl: this.fb.array([]) }); - constructor(private fb: FormBuilder) { + constructor(private bulkAccessConfigService: BulkAccessConfigDataService, + private fb: FormBuilder) { } + dropdownData$ = this.bulkAccessConfigService.findByPropertyName('default').pipe( + getFirstCompletedRemoteData(), + map((configRD: RemoteData) => configRD.hasSucceeded ? configRD.payload : null), + shareReplay(1), + tap(console.log) + ); + ngOnInit(): void { - if (this.accessControlItems.length === 0) { + // console.log(this.dropdownOptions); +/* if (this.accessControlItems.length === 0) { this.addAccessControlItem(); } else { for (const item of this.accessControlItems) { this.addAccessControlItem(item.itemName); } - } + }*/ + + this.addAccessControlItem(); this.accessControl.valueChanges .pipe( diff --git a/src/app/shared/access-control-array-form/control-max-end-date.pipe.ts b/src/app/shared/access-control-array-form/control-max-end-date.pipe.ts index 810f3e71d0..86ba3b996a 100644 --- a/src/app/shared/access-control-array-form/control-max-end-date.pipe.ts +++ b/src/app/shared/access-control-array-form/control-max-end-date.pipe.ts @@ -1,7 +1,7 @@ import { Pipe, PipeTransform } from '@angular/core'; import { AbstractControl } from '@angular/forms'; import { NgbDateStruct } from '@ng-bootstrap/ng-bootstrap/datepicker/ngb-date-struct'; -import { AccessControlItem } from 'src/app/core/shared/bulk-access-condition-options.model'; +import { AccessesConditionOption } from '../../core/config/models/config-accesses-conditions-options.model'; @Pipe({ // eslint-disable-next-line @angular-eslint/pipe-prefix @@ -9,7 +9,7 @@ import { AccessControlItem } from 'src/app/core/shared/bulk-access-condition-opt pure: false }) export class ControlMaxEndDatePipe implements PipeTransform { - transform(control: AbstractControl, dropdownOptions: AccessControlItem[]): NgbDateStruct | null { + transform(control: AbstractControl, dropdownOptions: AccessesConditionOption[]): NgbDateStruct | null { const { itemName } = control.value; const item = dropdownOptions.find((x) => x.name === itemName); if (!item?.hasEndDate) { diff --git a/src/app/shared/access-control-array-form/control-max-start-date.pipe.ts b/src/app/shared/access-control-array-form/control-max-start-date.pipe.ts index 458cb36465..77be77b029 100644 --- a/src/app/shared/access-control-array-form/control-max-start-date.pipe.ts +++ b/src/app/shared/access-control-array-form/control-max-start-date.pipe.ts @@ -1,7 +1,8 @@ import { Pipe, PipeTransform } from '@angular/core'; import { AbstractControl } from '@angular/forms'; import { NgbDateStruct } from '@ng-bootstrap/ng-bootstrap/datepicker/ngb-date-struct'; -import { AccessControlItem } from 'src/app/core/shared/bulk-access-condition-options.model'; +import { AccessesConditionOption } from '../../core/config/models/config-accesses-conditions-options.model'; + @Pipe({ // eslint-disable-next-line @angular-eslint/pipe-prefix @@ -9,7 +10,7 @@ import { AccessControlItem } from 'src/app/core/shared/bulk-access-condition-opt pure: false }) export class ControlMaxStartDatePipe implements PipeTransform { - transform(control: AbstractControl, dropdownOptions: AccessControlItem[]): NgbDateStruct | null { + transform(control: AbstractControl, dropdownOptions: AccessesConditionOption[]): NgbDateStruct | null { const { itemName } = control.value; const item = dropdownOptions.find((x) => x.name === itemName); if (!item?.hasStartDate) { diff --git a/src/app/shared/access-control-form-container/access-control-form-container.component.html b/src/app/shared/access-control-form-container/access-control-form-container.component.html index 71175ce588..70f1b1e6cd 100644 --- a/src/app/shared/access-control-form-container/access-control-form-container.component.html +++ b/src/app/shared/access-control-form-container/access-control-form-container.component.html @@ -48,10 +48,7 @@
    - - +
    @@ -137,10 +134,7 @@
    - - +
    diff --git a/src/app/shared/access-control-form-container/access-control-form-container.component.ts b/src/app/shared/access-control-form-container/access-control-form-container.component.ts index a2e9cb08ab..0807236796 100644 --- a/src/app/shared/access-control-form-container/access-control-form-container.component.ts +++ b/src/app/shared/access-control-form-container/access-control-form-container.component.ts @@ -1,5 +1,5 @@ import { ChangeDetectorRef, Component, Input, NgModule, ViewChild } from '@angular/core'; -import { concatMap, shareReplay } from 'rxjs'; +import { concatMap } from 'rxjs'; import { RemoteData } from '../../core/data/remote-data'; import { Item } from '../../core/shared/item.model'; import { @@ -20,6 +20,7 @@ import { ITEM_ACCESS_CONTROL_SELECT_BITSTREAMS_LIST_ID, ItemAccessControlSelectBitstreamsModalComponent } from './item-access-control-select-bitstreams-modal/item-access-control-select-bitstreams-modal.component'; +import { BulkAccessConfigDataService } from '../../core/config/bulk-access-config-data.service'; @Component({ selector: 'ds-access-control-form-container', @@ -27,7 +28,7 @@ import { styleUrls: [ './access-control-form-container.component.scss' ], exportAs: 'dsAccessControlForm' }) -export class AccessControlFormContainerComponent { +export class AccessControlFormContainerComponent implements OnInit { @Input() showLimitToSpecificBitstreams = false; @Input() itemRD: RemoteData; @@ -38,6 +39,7 @@ export class AccessControlFormContainerComponent { @ViewChild('itemAccessCmp', { static: true }) itemAccessCmp: AccessControlArrayFormComponent; constructor( + private bulkAccessConfigService: BulkAccessConfigDataService, private bulkAccessControlService: BulkAccessControlService, private selectableListService: SelectableListService, protected modalService: NgbModal, @@ -46,9 +48,16 @@ export class AccessControlFormContainerComponent { state = initialState; - dropdownData$ = this.bulkAccessControlService.dropdownData$.pipe( +/* dropdownData$ = this.bulkAccessConfigService.findByPropertyName('default').pipe( + getFirstCompletedRemoteData(), + map((configRD: RemoteData) => configRD.hasSucceeded ? configRD.payload : null), + shareReplay(1), + tap(console.log) + );*/ + +/* dropdownData$ = this.bulkAccessControlService.dropdownData$.pipe( shareReplay(1) - ); + );*/ getFormValue() { return { diff --git a/src/app/shared/access-control-form-container/bulk-access-control.service.ts b/src/app/shared/access-control-form-container/bulk-access-control.service.ts index 85ec05cd60..1cce44d828 100644 --- a/src/app/shared/access-control-form-container/bulk-access-control.service.ts +++ b/src/app/shared/access-control-form-container/bulk-access-control.service.ts @@ -1,21 +1,12 @@ import { Injectable } from '@angular/core'; -import { Observable, of } from 'rxjs'; -import { AccessControlItem } from '../../core/shared/bulk-access-condition-options.model'; + import { ScriptDataService } from '../../core/data/processes/script-data.service'; import { ProcessParameter } from '../../process-page/processes/process-parameter.model'; -export interface AccessControlDropdownDataResponse { - id: string; - itemAccessConditionOptions: AccessControlItem[]; - bitstreamAccessConditionOptions: AccessControlItem[]; -} - @Injectable({ providedIn: 'root' }) export class BulkAccessControlService { constructor(private scriptService: ScriptDataService) {} - dropdownData$: Observable = of(accessControlDropdownData); - createPayloadFile(payload: any) { console.log('execute', payload); @@ -43,43 +34,3 @@ export class BulkAccessControlService { return this.scriptService.invoke('bulk-access-control', params, [file]); } } - -const accessControlDropdownData: AccessControlDropdownDataResponse = { - 'id': 'default', - 'itemAccessConditionOptions': [ - { - 'name': 'openaccess' - }, - { - 'name': 'administrator' - }, - { - 'name': 'embargo', - 'hasStartDate': true, - 'maxStartDate': '2023-05-12T00:40:54.970+0000' - }, - { - 'name': 'lease', - 'hasEndDate': true, - 'maxEndDate': '2017-12-24T00:40:54.970+0000' - } - ], - 'bitstreamAccessConditionOptions': [ - { - 'name': 'openaccess' - }, - { - 'name': 'administrator' - }, - { - 'name': 'embargo', - 'hasStartDate': true, - 'maxStartDate': '2018-06-24T00:40:54.970+0000' - }, - { - 'name': 'lease', - 'hasEndDate': true, - 'maxEndDate': '2017-12-24T00:40:54.970+0000' - } - ] -}; From 4bf10c880a4b4ace19b1ea692fc85f18981ed512 Mon Sep 17 00:00:00 2001 From: Enea Jahollari Date: Wed, 10 May 2023 16:02:01 +0200 Subject: [PATCH 183/409] [CST-9636] Refactor access control array form to accept dropdown options --- .../access-control-array-form.component.html | 6 +-- .../access-control-array-form.component.ts | 37 +++---------------- ...cess-control-form-container.component.html | 18 +++++---- ...access-control-form-container.component.ts | 20 +++++----- 4 files changed, 28 insertions(+), 53 deletions(-) diff --git a/src/app/shared/access-control-array-form/access-control-array-form.component.html b/src/app/shared/access-control-array-form/access-control-array-form.component.html index 5d0fb6d97e..24dcc11120 100644 --- a/src/app/shared/access-control-array-form/access-control-array-form.component.html +++ b/src/app/shared/access-control-array-form/access-control-array-form.component.html @@ -7,7 +7,7 @@
    @@ -20,7 +20,7 @@ placeholder="yyyy-mm-dd" name="dp" formControlName="startDate" - [minDate]="control | maxStartDate: (dropdownData$ | async)" + [minDate]="control | maxStartDate: dropdownOptions" ngbDatepicker #d="ngbDatepicker" /> @@ -40,7 +40,7 @@ placeholder="yyyy-mm-dd" name="dp" formControlName="endDate" - [maxDate]="control | maxEndDate: (dropdownData$ | async)" + [maxDate]="control | maxEndDate: dropdownOptions" ngbDatepicker #d1="ngbDatepicker" /> diff --git a/src/app/shared/access-control-array-form/access-control-array-form.component.ts b/src/app/shared/access-control-array-form/access-control-array-form.component.ts index 13d13375b2..090b22d94c 100644 --- a/src/app/shared/access-control-array-form/access-control-array-form.component.ts +++ b/src/app/shared/access-control-array-form/access-control-array-form.component.ts @@ -1,4 +1,4 @@ -import { Component, NgModule, OnDestroy, OnInit } from '@angular/core'; +import { Component, Input, NgModule, OnDestroy, OnInit } from '@angular/core'; import { CommonModule } from '@angular/common'; import { FormArray, FormBuilder, FormControl, ReactiveFormsModule } from '@angular/forms'; import { SharedBrowseByModule } from '../browse-by/shared-browse-by.module'; @@ -7,21 +7,11 @@ import { NgbDatepickerModule } from '@ng-bootstrap/ng-bootstrap'; import { ControlMaxStartDatePipe } from './control-max-start-date.pipe'; import { ControlMaxEndDatePipe } from './control-max-end-date.pipe'; -import { distinctUntilChanged, map, shareReplay, takeUntil, tap } from 'rxjs/operators'; +import { distinctUntilChanged, takeUntil } from 'rxjs/operators'; import { Subject } from 'rxjs'; -import { getFirstCompletedRemoteData } from '../../core/shared/operators'; -import { RemoteData } from '../../core/data/remote-data'; -import { BulkAccessConditionOptions } from '../../core/config/models/bulk-access-condition-options.model'; -import { BulkAccessConfigDataService } from '../../core/config/bulk-access-config-data.service'; +import { AccessesConditionOption } from '../../core/config/models/config-accesses-conditions-options.model'; -// will be used on the form value -export interface AccessControlItemValue { - itemName: string | null; // item name - startDate?: string; - endDate?: string; -} - @Component({ selector: 'ds-access-control-array-form', templateUrl: './access-control-array-form.component.html', @@ -29,6 +19,7 @@ export interface AccessControlItemValue { exportAs: 'accessControlArrayForm' }) export class AccessControlArrayFormComponent implements OnInit, OnDestroy { + @Input() dropdownOptions: AccessesConditionOption[] = []; private destroy$ = new Subject(); @@ -36,27 +27,9 @@ export class AccessControlArrayFormComponent implements OnInit, OnDestroy { accessControl: this.fb.array([]) }); - constructor(private bulkAccessConfigService: BulkAccessConfigDataService, - private fb: FormBuilder) { - } - - dropdownData$ = this.bulkAccessConfigService.findByPropertyName('default').pipe( - getFirstCompletedRemoteData(), - map((configRD: RemoteData) => configRD.hasSucceeded ? configRD.payload : null), - shareReplay(1), - tap(console.log) - ); + constructor(private fb: FormBuilder) {} ngOnInit(): void { - // console.log(this.dropdownOptions); -/* if (this.accessControlItems.length === 0) { - this.addAccessControlItem(); - } else { - for (const item of this.accessControlItems) { - this.addAccessControlItem(item.itemName); - } - }*/ - this.addAccessControlItem(); this.accessControl.valueChanges diff --git a/src/app/shared/access-control-form-container/access-control-form-container.component.html b/src/app/shared/access-control-form-container/access-control-form-container.component.html index 70f1b1e6cd..c45774dcf9 100644 --- a/src/app/shared/access-control-form-container/access-control-form-container.component.html +++ b/src/app/shared/access-control-form-container/access-control-form-container.component.html @@ -48,7 +48,10 @@
    - + +
    @@ -125,23 +128,24 @@
    -
    - {{'access-control-access-conditions' | translate}} -
    +
    {{'access-control-access-conditions' | translate}}
    {{'access-control-no-access-conditions-warning-message' | translate}}
    - + +
    -
    +
    -
    +
    diff --git a/src/app/shared/access-control-form-container/access-control-form-container.component.ts b/src/app/shared/access-control-form-container/access-control-form-container.component.ts index 0807236796..9efc90a3f2 100644 --- a/src/app/shared/access-control-form-container/access-control-form-container.component.ts +++ b/src/app/shared/access-control-form-container/access-control-form-container.component.ts @@ -1,5 +1,5 @@ import { ChangeDetectorRef, Component, Input, NgModule, ViewChild } from '@angular/core'; -import { concatMap } from 'rxjs'; +import { concatMap, Observable, shareReplay } from 'rxjs'; import { RemoteData } from '../../core/data/remote-data'; import { Item } from '../../core/shared/item.model'; import { @@ -9,7 +9,7 @@ import { import { BulkAccessControlService } from './bulk-access-control.service'; import { SelectableListService } from '../object-list/selectable-list/selectable-list.service'; import { NgbModal } from '@ng-bootstrap/ng-bootstrap'; -import { take } from 'rxjs/operators'; +import { map, take, tap } from 'rxjs/operators'; import { CommonModule } from '@angular/common'; import { ListableObject } from '../object-collection/shared/listable-object.model'; import { SharedModule } from '../shared.module'; @@ -21,6 +21,8 @@ import { ItemAccessControlSelectBitstreamsModalComponent } from './item-access-control-select-bitstreams-modal/item-access-control-select-bitstreams-modal.component'; 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'; @Component({ selector: 'ds-access-control-form-container', @@ -28,12 +30,12 @@ import { BulkAccessConfigDataService } from '../../core/config/bulk-access-confi styleUrls: [ './access-control-form-container.component.scss' ], exportAs: 'dsAccessControlForm' }) -export class AccessControlFormContainerComponent implements OnInit { +export class AccessControlFormContainerComponent { @Input() showLimitToSpecificBitstreams = false; @Input() itemRD: RemoteData; - @Input() hideSubmit = false; + @Input() showSubmit = true; @ViewChild('bitstreamAccessCmp', { static: true }) bitstreamAccessCmp: AccessControlArrayFormComponent; @ViewChild('itemAccessCmp', { static: true }) itemAccessCmp: AccessControlArrayFormComponent; @@ -48,16 +50,12 @@ export class AccessControlFormContainerComponent impleme state = initialState; -/* dropdownData$ = this.bulkAccessConfigService.findByPropertyName('default').pipe( + dropdownData$: Observable = this.bulkAccessConfigService.findByPropertyName('default').pipe( getFirstCompletedRemoteData(), map((configRD: RemoteData) => configRD.hasSucceeded ? configRD.payload : null), shareReplay(1), - tap(console.log) - );*/ - -/* dropdownData$ = this.bulkAccessControlService.dropdownData$.pipe( - shareReplay(1) - );*/ + tap(x => console.log('options', x)) + ); getFormValue() { return { From b279b97c37b4e6682f89d71fdaf9ecc9a2de3893 Mon Sep 17 00:00:00 2001 From: Giuseppe Digilio Date: Wed, 10 May 2023 16:23:27 +0200 Subject: [PATCH 184/409] [CST-9636] WIP Fix bulk-access-config-data.service --- .../config/bulk-access-config-data.service.ts | 11 ++++------- src/app/core/config/config-data.service.ts | 18 ++++++++++++++++-- .../bulk-access-condition-options.model.ts | 10 +++++----- src/app/core/config/models/config-type.ts | 2 ++ src/app/core/core.module.ts | 2 ++ .../access-control-form-container.component.ts | 7 +++---- 6 files changed, 32 insertions(+), 18 deletions(-) diff --git a/src/app/core/config/bulk-access-config-data.service.ts b/src/app/core/config/bulk-access-config-data.service.ts index f27b59eee1..28b4029ea2 100644 --- a/src/app/core/config/bulk-access-config-data.service.ts +++ b/src/app/core/config/bulk-access-config-data.service.ts @@ -1,17 +1,17 @@ import { Injectable } from '@angular/core'; -import { Observable } from 'rxjs'; import { RemoteDataBuildService } from '../cache/builders/remote-data-build.service'; import { ObjectCacheService } from '../cache/object-cache.service'; import { HALEndpointService } from '../shared/hal-endpoint.service'; -import { RemoteData } from '../data/remote-data'; import { RequestService } from '../data/request.service'; -import { BulkAccessConditionOptions } from './models/bulk-access-condition-options.model'; import { ConfigDataService } from './config-data.service'; +import { dataService } from '../data/base/data-service.decorator'; +import { BULK_ACCESS_CONDITION_OPTIONS } from './models/config-type'; -@Injectable({ providedIn: 'root' }) /** * Data Service responsible for retrieving Bulk Access Condition Options from the REST API */ +@Injectable({ providedIn: 'root' }) +@dataService(BULK_ACCESS_CONDITION_OPTIONS) export class BulkAccessConfigDataService extends ConfigDataService { constructor( @@ -23,7 +23,4 @@ export class BulkAccessConfigDataService extends ConfigDataService { super('bulkaccessconditionoptions', requestService, rdbService, objectCache, halService); } - findByPropertyName(name: string): Observable> { - return this.findById(name) as Observable>; - } } diff --git a/src/app/core/config/config-data.service.ts b/src/app/core/config/config-data.service.ts index f8f46435c5..58b023e62c 100644 --- a/src/app/core/config/config-data.service.ts +++ b/src/app/core/config/config-data.service.ts @@ -1,9 +1,10 @@ import { Observable } from 'rxjs'; +import { map } from 'rxjs/operators'; + import { ConfigObject } from './models/config.model'; import { RemoteData } from '../data/remote-data'; import { FollowLinkConfig } from '../../shared/utils/follow-link-config.model'; import { getFirstCompletedRemoteData } from '../shared/operators'; -import { map } from 'rxjs/operators'; import { IdentifiableDataService } from '../data/base/identifiable-data.service'; /** @@ -38,7 +39,20 @@ export abstract class ConfigDataService extends IdentifiableDataService[]): Observable> { + /** + * Returns a config object by given name + * + * Throws an error if a configuration object cannot be retrieved. + * + * @param name The name of configuration to retrieve + * @param useCachedVersionIfAvailable If this is true, the request will only be sent if there's + * no valid cached version. Defaults to true + * @param reRequestOnStale Whether or not the request should automatically be re- + * requested after the response becomes stale + * @param linksToFollow List of {@link FollowLinkConfig} that indicate which + * {@link HALLink}s should be automatically resolved + */ + public findByName(name: string, useCachedVersionIfAvailable = true, reRequestOnStale = true, ...linksToFollow: FollowLinkConfig[]): Observable> { return super.findById(name, useCachedVersionIfAvailable, reRequestOnStale, ...linksToFollow); } } diff --git a/src/app/core/config/models/bulk-access-condition-options.model.ts b/src/app/core/config/models/bulk-access-condition-options.model.ts index f10965ea31..d84e14b95d 100644 --- a/src/app/core/config/models/bulk-access-condition-options.model.ts +++ b/src/app/core/config/models/bulk-access-condition-options.model.ts @@ -1,17 +1,17 @@ -import { autoserialize, autoserializeAs, deserialize } from 'cerialize'; +import { autoserialize, autoserializeAs, inheritSerialization } from 'cerialize'; import { typedObject } from '../../cache/builders/build-decorators'; import { excludeFromEquals } from '../../utilities/equals.decorators'; import { ResourceType } from '../../shared/resource-type'; import { HALLink } from '../../shared/hal-link.model'; import { ConfigObject } from './config.model'; import { AccessesConditionOption } from './config-accesses-conditions-options.model'; - -export const BULK_ACCESS_CONDITION_OPTIONS = new ResourceType('bulkAccessConditionOptions'); +import { BULK_ACCESS_CONDITION_OPTIONS } from './config-type'; /** * Model class for a bulk access condition options */ @typedObject +@inheritSerialization(ConfigObject) export class BulkAccessConditionOptions extends ConfigObject { static type = BULK_ACCESS_CONDITION_OPTIONS; @@ -28,10 +28,10 @@ export class BulkAccessConditionOptions extends ConfigObject { @autoserialize id: string; - @deserialize + @autoserialize itemAccessConditionOptions: AccessesConditionOption[]; - @deserialize + @autoserialize bitstreamAccessConditionOptions: AccessesConditionOption[]; _links: { self: HALLink }; diff --git a/src/app/core/config/models/config-type.ts b/src/app/core/config/models/config-type.ts index 19864536f0..5733f5bfad 100644 --- a/src/app/core/config/models/config-type.ts +++ b/src/app/core/config/models/config-type.ts @@ -17,3 +17,5 @@ export const SUBMISSION_UPLOADS_TYPE = new ResourceType('submissionuploads'); export const SUBMISSION_UPLOAD_TYPE = new ResourceType('submissionupload'); export const SUBMISSION_ACCESSES_TYPE = new ResourceType('submissionaccessoption'); + +export const BULK_ACCESS_CONDITION_OPTIONS = new ResourceType('bulkaccessconditionoption'); diff --git a/src/app/core/core.module.ts b/src/app/core/core.module.ts index 319b42d58b..7d540ccfcf 100644 --- a/src/app/core/core.module.ts +++ b/src/app/core/core.module.ts @@ -177,6 +177,7 @@ import { IdentifierData } from '../shared/object-list/identifier-data/identifier import { Subscription } from '../shared/subscriptions/models/subscription.model'; import { SupervisionOrderDataService } from './supervision-order/supervision-order-data.service'; import { ItemRequest } from './shared/item-request.model'; +import { BulkAccessConditionOptions } from './config/models/bulk-access-condition-options.model'; /** * When not in production, endpoint responses can be mocked for testing purposes @@ -371,6 +372,7 @@ export const models = IdentifierData, Subscription, ItemRequest, + BulkAccessConditionOptions ]; @NgModule({ diff --git a/src/app/shared/access-control-form-container/access-control-form-container.component.ts b/src/app/shared/access-control-form-container/access-control-form-container.component.ts index 9efc90a3f2..d09911a9d6 100644 --- a/src/app/shared/access-control-form-container/access-control-form-container.component.ts +++ b/src/app/shared/access-control-form-container/access-control-form-container.component.ts @@ -9,7 +9,7 @@ import { import { BulkAccessControlService } from './bulk-access-control.service'; import { SelectableListService } from '../object-list/selectable-list/selectable-list.service'; import { NgbModal } from '@ng-bootstrap/ng-bootstrap'; -import { map, take, tap } from 'rxjs/operators'; +import { map, take } from 'rxjs/operators'; import { CommonModule } from '@angular/common'; import { ListableObject } from '../object-collection/shared/listable-object.model'; import { SharedModule } from '../shared.module'; @@ -50,11 +50,10 @@ export class AccessControlFormContainerComponent { state = initialState; - dropdownData$: Observable = this.bulkAccessConfigService.findByPropertyName('default').pipe( + dropdownData$: Observable = this.bulkAccessConfigService.findByName('default').pipe( getFirstCompletedRemoteData(), map((configRD: RemoteData) => configRD.hasSucceeded ? configRD.payload : null), - shareReplay(1), - tap(x => console.log('options', x)) + shareReplay(1) ); getFormValue() { From 5f74446bf50ac07a3e6ece2b6cf437a2d733f6da Mon Sep 17 00:00:00 2001 From: Enea Jahollari Date: Wed, 10 May 2023 16:27:53 +0200 Subject: [PATCH 185/409] [CST-9636] Added jsdoc comments --- ...ccess-control-array-form.component.spec.ts | 8 +- .../access-control-array-form.component.ts | 126 ++++++++++++------ ...s-control-form-container.component.spec.ts | 4 +- ...access-control-form-container.component.ts | 39 +++++- 4 files changed, 124 insertions(+), 53 deletions(-) diff --git a/src/app/shared/access-control-array-form/access-control-array-form.component.spec.ts b/src/app/shared/access-control-array-form/access-control-array-form.component.spec.ts index 7c3ed06be1..b99a0fff8e 100644 --- a/src/app/shared/access-control-array-form/access-control-array-form.component.spec.ts +++ b/src/app/shared/access-control-array-form/access-control-array-form.component.spec.ts @@ -1,6 +1,6 @@ import { ComponentFixture, TestBed } from '@angular/core/testing'; -import { AccessControlArrayFormComponent, AccessControlItemValue } from './access-control-array-form.component'; +import { AccessControlArrayFormComponent } from './access-control-array-form.component'; import { ReactiveFormsModule } from '@angular/forms'; import { SharedBrowseByModule } from '../browse-by/shared-browse-by.module'; import { CommonModule } from '@angular/common'; @@ -26,7 +26,7 @@ fdescribe('AccessControlArrayFormComponent', () => { beforeEach(() => { fixture = TestBed.createComponent(AccessControlArrayFormComponent); component = fixture.componentInstance; - component.dropdownOptions = [{name: 'Option1'}, {name: 'Option2'}]; + component.dropdownOptions = [{name: 'Option1'}, {name: 'Option2'}] as any; fixture.detectChanges(); }); @@ -54,14 +54,14 @@ fdescribe('AccessControlArrayFormComponent', () => { }); it('should set access control item value', () => { - const item: AccessControlItemValue = { itemName: 'item1', startDate: '2022-01-01', endDate: '2022-02-01' }; + const item = { itemName: 'item1', startDate: '2022-01-01', endDate: '2022-02-01' }; component.addAccessControlItem(item.itemName); component.accessControl.controls[0].patchValue(item); expect(component.form.value.accessControl[0]).toEqual(item); }); it('should reset form value', () => { - const item: AccessControlItemValue = { itemName: 'item1', startDate: '2022-01-01', endDate: '2022-02-01' }; + const item = { itemName: 'item1', startDate: '2022-01-01', endDate: '2022-02-01' }; component.addAccessControlItem(item.itemName); component.accessControl.controls[1].patchValue(item); component.reset(); diff --git a/src/app/shared/access-control-array-form/access-control-array-form.component.ts b/src/app/shared/access-control-array-form/access-control-array-form.component.ts index 090b22d94c..60060dec16 100644 --- a/src/app/shared/access-control-array-form/access-control-array-form.component.ts +++ b/src/app/shared/access-control-array-form/access-control-array-form.component.ts @@ -31,7 +31,89 @@ export class AccessControlArrayFormComponent implements OnInit, OnDestroy { ngOnInit(): void { this.addAccessControlItem(); + this.handleValidationOnFormArrayChanges(); + } + /** + * Get the access control form array. + */ + get accessControl() { + return this.form.get('accessControl') as FormArray; + } + + /** + * Add a new access control item to the form. + * Start and end date are disabled by default. + * @param itemName The name of the item to add + */ + addAccessControlItem(itemName: string = null) { + this.accessControl.push(this.fb.group({ + itemName, + startDate: new FormControl({ value: null, disabled: true }), + endDate: new FormControl({ value: null, disabled: true }) + })); + } + + /** + * Remove an access control item from the form. + * @param index + */ + removeAccessControlItem(index: number) { + this.accessControl.removeAt(index); + } + + /** + * Get the value of the form. + * This will be used to read the form value from the parent component. + * @return The form value + */ + getValue() { + return this.form.value; + } + + /** + * Set the value of the form from the parent component. + */ + reset() { + this.accessControl.reset([]); + } + + /** + * Disable the form. + * This will be used to disable the form from the parent component. + * This will also disable all date controls. + */ + disable() { + this.form.disable(); + + // disable all date controls + for (const control of this.accessControl.controls) { + control.get('startDate').disable(); + control.get('endDate').disable(); + } + } + + /** + * Enable the form. + * This will be used to enable the form from the parent component. + * This will also enable all date controls. + */ + enable() { + this.form.enable(); + + // enable date controls + for (const control of this.accessControl.controls) { + control.get('startDate').enable(); + control.get('endDate').enable(); + } + } + + /** + * Handle validation on form array changes. + * This will be used to enable/disable date controls based on the selected item. + * @private + */ + private handleValidationOnFormArrayChanges() { this.accessControl.valueChanges .pipe( distinctUntilChanged((a, b) => JSON.stringify(a) === JSON.stringify(b)), @@ -61,50 +143,6 @@ export class AccessControlArrayFormComponent implements OnInit, OnDestroy { }); } - get accessControl() { - return this.form.get('accessControl') as FormArray; - } - - addAccessControlItem(itemName: string = null) { - this.accessControl.push(this.fb.group({ - itemName, - startDate: new FormControl({ value: null, disabled: true }), - endDate: new FormControl({ value: null, disabled: true }) - })); - } - - removeAccessControlItem(index: number) { - this.accessControl.removeAt(index); - } - - getValue() { - return this.form.value; - } - - reset() { - this.accessControl.reset([]); - } - - disable() { - this.form.disable(); - - // disable all date controls - for (const control of this.accessControl.controls) { - control.get('startDate').disable(); - control.get('endDate').disable(); - } - } - - enable() { - this.form.enable(); - - // enable date controls - for (const control of this.accessControl.controls) { - control.get('startDate').enable(); - control.get('endDate').enable(); - } - } - ngOnDestroy() { this.destroy$.next(); this.destroy$.complete(); diff --git a/src/app/shared/access-control-form-container/access-control-form-container.component.spec.ts b/src/app/shared/access-control-form-container/access-control-form-container.component.spec.ts index 871e301209..7412b9569f 100644 --- a/src/app/shared/access-control-form-container/access-control-form-container.component.spec.ts +++ b/src/app/shared/access-control-form-container/access-control-form-container.component.spec.ts @@ -3,8 +3,8 @@ import { ComponentFixture, TestBed } from '@angular/core/testing'; import { AccessControlFormContainerComponent } from './access-control-form-container.component'; describe('AccessControlFormContainerComponent', () => { - let component: AccessControlFormContainerComponent; - let fixture: ComponentFixture; + let component: AccessControlFormContainerComponent; + let fixture: ComponentFixture>; beforeEach(async () => { await TestBed.configureTestingModule({ diff --git a/src/app/shared/access-control-form-container/access-control-form-container.component.ts b/src/app/shared/access-control-form-container/access-control-form-container.component.ts index 9efc90a3f2..23ba64c4f6 100644 --- a/src/app/shared/access-control-form-container/access-control-form-container.component.ts +++ b/src/app/shared/access-control-form-container/access-control-form-container.component.ts @@ -1,4 +1,4 @@ -import { ChangeDetectorRef, Component, Input, NgModule, ViewChild } from '@angular/core'; +import { ChangeDetectorRef, Component, Input, NgModule, OnDestroy, ViewChild } from '@angular/core'; import { concatMap, Observable, shareReplay } from 'rxjs'; import { RemoteData } from '../../core/data/remote-data'; import { Item } from '../../core/shared/item.model'; @@ -30,11 +30,23 @@ import { BulkAccessConditionOptions } from '../../core/config/models/bulk-access styleUrls: [ './access-control-form-container.component.scss' ], exportAs: 'dsAccessControlForm' }) -export class AccessControlFormContainerComponent { +export class AccessControlFormContainerComponent implements OnDestroy { + /** + * Will be used to determine if we need to show the limit changes to specific bitstreams radio buttons + */ @Input() showLimitToSpecificBitstreams = false; + + /** + * The item to which the access control form applies + */ @Input() itemRD: RemoteData; + /** + * Whether to show the submit and cancel button + * We want to hide these buttons when the form is + * used in an accordion, and we want to show buttons somewhere else + */ @Input() showSubmit = true; @ViewChild('bitstreamAccessCmp', { static: true }) bitstreamAccessCmp: AccessControlArrayFormComponent; @@ -57,6 +69,9 @@ export class AccessControlFormContainerComponent { tap(x => console.log('options', x)) ); + /** + * Will be used from a parent component to read the value of the form + */ getFormValue() { return { bitstream: this.bitstreamAccessCmp.getValue(), @@ -65,12 +80,20 @@ export class AccessControlFormContainerComponent { }; } + /** + * Reset the form to its initial state + * This will also reset the state of the child components (bitstream and item access) + */ reset() { this.bitstreamAccessCmp.reset(); this.itemAccessCmp.reset(); this.state = initialState; } + /** + * Submit the form + * This will create a payload file and execute the script + */ submit() { const bitstreamAccess = this.bitstreamAccessCmp.getValue(); const itemAccess = this.itemAccessCmp.getValue(); @@ -89,6 +112,12 @@ export class AccessControlFormContainerComponent { }); } + /** + * Handle the status change of the access control form (item or bitstream) + * This will enable/disable the access control form for the item or bitstream + * @param type The type of the access control form (item or bitstream) + * @param active boolean indicating whether the access control form should be enabled or disabled + */ handleStatusChange(type: 'item' | 'bitstream', active: boolean) { if (type === 'bitstream') { active ? this.bitstreamAccessCmp.enable() : this.bitstreamAccessCmp.disable(); @@ -97,6 +126,11 @@ export class AccessControlFormContainerComponent { } } + /** + * Open the modal to select bitstreams for which to change the access control + * This will open the modal and pass the currently selected bitstreams + * @param item The item for which to change the access control + */ openSelectBitstreamsModal(item: Item) { const ref = this.modalService.open(ItemAccessControlSelectBitstreamsModalComponent); ref.componentInstance.selectedBitstreams = this.state.bitstream.selectedBitstreams; @@ -111,7 +145,6 @@ export class AccessControlFormContainerComponent { }); } - // eslint-disable-next-line @angular-eslint/use-lifecycle-interface ngOnDestroy(): void { this.selectableListService.deselectAll(ITEM_ACCESS_CONTROL_SELECT_BITSTREAMS_LIST_ID); } From 628732b93238bceff518eea93f66872925e4d804 Mon Sep 17 00:00:00 2001 From: Enea Jahollari Date: Wed, 10 May 2023 16:45:17 +0200 Subject: [PATCH 186/409] [CST-9636] Show warning only when there are no controls and form is not disabled --- .../edit-collection-page.module.ts | 2 +- .../edit-community-page.module.ts | 2 +- .../edit-item-page/edit-item-page.module.ts | 4 ---- .../access-control-array-form.component.html | 4 ++++ .../access-control-array-form.component.scss | 0 .../access-control-array-form.component.spec.ts | 2 +- .../access-control-array-form.component.ts | 4 ++-- .../control-max-end-date.pipe.ts | 2 +- .../control-max-start-date.pipe.ts | 2 +- .../access-control-form-container.component.html | 15 ++------------- .../access-control-form-container.component.ts | 4 ++-- 11 files changed, 15 insertions(+), 26 deletions(-) rename src/app/shared/{ => access-control-form-container}/access-control-array-form/access-control-array-form.component.html (92%) rename src/app/shared/{ => access-control-form-container}/access-control-array-form/access-control-array-form.component.scss (100%) rename src/app/shared/{ => access-control-form-container}/access-control-array-form/access-control-array-form.component.spec.ts (98%) rename src/app/shared/{ => access-control-form-container}/access-control-array-form/access-control-array-form.component.ts (96%) rename src/app/shared/{ => access-control-form-container}/access-control-array-form/control-max-end-date.pipe.ts (87%) rename src/app/shared/{ => access-control-form-container}/access-control-array-form/control-max-start-date.pipe.ts (87%) diff --git a/src/app/collection-page/edit-collection-page/edit-collection-page.module.ts b/src/app/collection-page/edit-collection-page/edit-collection-page.module.ts index 9d703c0cf4..58563f440b 100644 --- a/src/app/collection-page/edit-collection-page/edit-collection-page.module.ts +++ b/src/app/collection-page/edit-collection-page/edit-collection-page.module.ts @@ -16,7 +16,7 @@ import { ComcolModule } from '../../shared/comcol/comcol.module'; import { CollectionAccessControlComponent } from './collection-access-control/collection-access-control.component'; import { AccessControlArrayFormModule -} from '../../shared/access-control-array-form/access-control-array-form.component'; +} from '../../shared/access-control-form-container/access-control-array-form/access-control-array-form.component'; import { UiSwitchModule } from 'ngx-ui-switch'; import { AccessControlFormContainerModule diff --git a/src/app/community-page/edit-community-page/edit-community-page.module.ts b/src/app/community-page/edit-community-page/edit-community-page.module.ts index 5ed2e401c6..d88aadfd8e 100644 --- a/src/app/community-page/edit-community-page/edit-community-page.module.ts +++ b/src/app/community-page/edit-community-page/edit-community-page.module.ts @@ -14,7 +14,7 @@ import { CommunityAccessControlComponent } from './community-access-control/comm import { UiSwitchModule } from 'ngx-ui-switch'; import { AccessControlArrayFormModule -} from '../../shared/access-control-array-form/access-control-array-form.component'; +} from '../../shared/access-control-form-container/access-control-array-form/access-control-array-form.component'; import { AccessControlFormContainerModule } from '../../shared/access-control-form-container/access-control-form-container.component'; diff --git a/src/app/item-page/edit-item-page/edit-item-page.module.ts b/src/app/item-page/edit-item-page/edit-item-page.module.ts index 322c6c6999..9d132abe53 100644 --- a/src/app/item-page/edit-item-page/edit-item-page.module.ts +++ b/src/app/item-page/edit-item-page/edit-item-page.module.ts @@ -47,9 +47,6 @@ import { IdentifierDataComponent } from '../../shared/object-list/identifier-dat import { ItemRegisterDoiComponent } from './item-register-doi/item-register-doi.component'; import { DsoSharedModule } from '../../dso-shared/dso-shared.module'; import { ItemAccessControlComponent } from './item-access-control/item-access-control.component'; -import { - AccessControlArrayFormModule -} from '../../shared/access-control-array-form/access-control-array-form.component'; import { UiSwitchModule } from 'ngx-ui-switch'; import { ResultsBackButtonModule } from '../../shared/results-back-button/results-back-button.module'; import { @@ -72,7 +69,6 @@ import { NgbModule, ItemVersionsModule, DsoSharedModule, - AccessControlArrayFormModule, UiSwitchModule, ResultsBackButtonModule, AccessControlFormContainerModule, diff --git a/src/app/shared/access-control-array-form/access-control-array-form.component.html b/src/app/shared/access-control-form-container/access-control-array-form/access-control-array-form.component.html similarity index 92% rename from src/app/shared/access-control-array-form/access-control-array-form.component.html rename to src/app/shared/access-control-form-container/access-control-array-form/access-control-array-form.component.html index 24dcc11120..9b1f018ffb 100644 --- a/src/app/shared/access-control-array-form/access-control-array-form.component.html +++ b/src/app/shared/access-control-form-container/access-control-array-form/access-control-array-form.component.html @@ -1,4 +1,8 @@
    +
    + {{'access-control-no-access-conditions-warning-message' | translate}} +
    +
    -
    -
    {{'access-control-access-conditions' | translate}}
    -
    - {{'access-control-no-access-conditions-warning-message' | translate}} -
    -
    +
    {{'access-control-access-conditions' | translate}}
    -
    -
    {{'access-control-access-conditions' | translate}}
    - -
    - {{'access-control-no-access-conditions-warning-message' | translate}} -
    -
    +
    {{'access-control-access-conditions' | translate}}
    Date: Wed, 10 May 2023 17:12:53 +0200 Subject: [PATCH 187/409] [CST-9636] Added state transformer to file model, added tests for bulk access control service --- .../access-control-array-form.component.ts | 4 +- ...s-control-form-container.component.spec.ts | 63 +++++++++++-------- ...access-control-form-container.component.ts | 14 ++++- .../bulk-access-control.service.spec.ts | 51 +++++++++++++++ .../bulk-access-control.service.ts | 47 +++++++++++++- 5 files changed, 149 insertions(+), 30 deletions(-) create mode 100644 src/app/shared/access-control-form-container/bulk-access-control.service.spec.ts diff --git a/src/app/shared/access-control-form-container/access-control-array-form/access-control-array-form.component.ts b/src/app/shared/access-control-form-container/access-control-array-form/access-control-array-form.component.ts index 171bec8395..41b51d73dc 100644 --- a/src/app/shared/access-control-form-container/access-control-array-form/access-control-array-form.component.ts +++ b/src/app/shared/access-control-form-container/access-control-array-form/access-control-array-form.component.ts @@ -68,7 +68,9 @@ export class AccessControlArrayFormComponent implements OnInit, OnDestroy { * @return The form value */ getValue() { - return this.form.value; + return this.form.value.accessControl + .filter(x => x.itemName !== null && x.itemName !== '') + .map(x => ({ name: x.itemName, startDate: x.startDate || null, endDate: x.endDate || null })); } /** diff --git a/src/app/shared/access-control-form-container/access-control-form-container.component.spec.ts b/src/app/shared/access-control-form-container/access-control-form-container.component.spec.ts index 7412b9569f..66ef20444e 100644 --- a/src/app/shared/access-control-form-container/access-control-form-container.component.spec.ts +++ b/src/app/shared/access-control-form-container/access-control-form-container.component.spec.ts @@ -1,25 +1,38 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing'; - -import { AccessControlFormContainerComponent } from './access-control-form-container.component'; - -describe('AccessControlFormContainerComponent', () => { - let component: AccessControlFormContainerComponent; - let fixture: ComponentFixture>; - - beforeEach(async () => { - await TestBed.configureTestingModule({ - declarations: [ AccessControlFormContainerComponent ] - }) - .compileComponents(); - }); - - beforeEach(() => { - fixture = TestBed.createComponent(AccessControlFormContainerComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); -}); +// +// describe('AccessControlFormContainerComponent', () => { +// let component: AccessControlFormContainerComponent; +// let fixture: ComponentFixture>; +// +// let bulkAccessConfigDataServiceMock: BulkAccessConfigDataService; +// +// beforeEach(async () => { +// +// bulkAccessConfigDataServiceMock = jasmine.createSpyObj('BulkAccessConfigDataService', { +// findByName: jasmine.createSpy('findByName'), +// }); +// +// +// await TestBed.configureTestingModule({ +// declarations: [ AccessControlFormContainerComponent ], +// imports: [ CommonModule, ReactiveFormsModule, SharedBrowseByModule, TranslateModule, NgbDatepickerModule ], +// providers: [ +// { provide: BulkAccessConfigDataService, useValue: bulkAccessConfigDataServiceMock }, +// // private bulkAccessControlService: BulkAccessControlService, +// // private selectableListService: SelectableListService, +// // protected modalService: NgbModal, +// // private cdr: ChangeDetectorRef +// ] +// }) +// .compileComponents(); +// }); +// +// beforeEach(() => { +// fixture = TestBed.createComponent(AccessControlFormContainerComponent); +// component = fixture.componentInstance; +// fixture.detectChanges(); +// }); +// +// it('should create', () => { +// expect(component).toBeTruthy(); +// }); +// }); diff --git a/src/app/shared/access-control-form-container/access-control-form-container.component.ts b/src/app/shared/access-control-form-container/access-control-form-container.component.ts index eec4996073..e34928361f 100644 --- a/src/app/shared/access-control-form-container/access-control-form-container.component.ts +++ b/src/app/shared/access-control-form-container/access-control-form-container.component.ts @@ -150,7 +150,7 @@ export class AccessControlFormContainerComponent impleme } -const initialState = { +const initialState: AccessControlFormState = { item: { toggleStatus: false, accessMode: '', @@ -163,6 +163,18 @@ const initialState = { }, }; +export interface AccessControlFormState { + item: { + toggleStatus: boolean, + accessMode: string, + }, + bitstream: { + toggleStatus: boolean, + accessMode: string, + changesLimit: string, + selectedBitstreams: ListableObject[], + } +} @NgModule({ imports: [ diff --git a/src/app/shared/access-control-form-container/bulk-access-control.service.spec.ts b/src/app/shared/access-control-form-container/bulk-access-control.service.spec.ts new file mode 100644 index 0000000000..9e733b5694 --- /dev/null +++ b/src/app/shared/access-control-form-container/bulk-access-control.service.spec.ts @@ -0,0 +1,51 @@ +import { TestBed } from '@angular/core/testing'; +import { BulkAccessControlService } from './bulk-access-control.service'; +import { ScriptDataService } from '../../core/data/processes/script-data.service'; +import { ProcessParameter } from '../../process-page/processes/process-parameter.model'; + +fdescribe('BulkAccessControlService', () => { + let service: BulkAccessControlService; + let scriptServiceSpy: jasmine.SpyObj; + + beforeEach(() => { + const spy = jasmine.createSpyObj('ScriptDataService', ['invoke']); + TestBed.configureTestingModule({ + providers: [ + BulkAccessControlService, + { provide: ScriptDataService, useValue: spy } + ] + }); + service = TestBed.inject(BulkAccessControlService); + scriptServiceSpy = TestBed.inject(ScriptDataService) as jasmine.SpyObj; + }); + + it('should be created', () => { + expect(service).toBeTruthy(); + }); + + describe('createPayloadFile', () => { + it('should create a file and return the URL and file object', () => { + const payload = { data: 'test' }; + const result = service.createPayloadFile(payload); + + expect(result.url).toBeTruthy(); + expect(result.file).toBeTruthy(); + }); + }); + + describe('executeScript', () => { + it('should invoke the script service with the correct parameters', () => { + const uuids = ['123', '456']; + const file = new File(['test'], 'data.json', { type: 'application/json' }); + const expectedParams: ProcessParameter[] = [{ name: 'uuid', value: '123,456' }]; + + // @ts-ignore + scriptServiceSpy.invoke.and.returnValue(Promise.resolve({})); + + const result = service.executeScript(uuids, file); + + expect(scriptServiceSpy.invoke).toHaveBeenCalledWith('bulk-access-control', expectedParams, [file]); + expect(result).toBeTruthy(); + }); + }); +}); diff --git a/src/app/shared/access-control-form-container/bulk-access-control.service.ts b/src/app/shared/access-control-form-container/bulk-access-control.service.ts index 1cce44d828..f5afe338dd 100644 --- a/src/app/shared/access-control-form-container/bulk-access-control.service.ts +++ b/src/app/shared/access-control-form-container/bulk-access-control.service.ts @@ -2,15 +2,16 @@ import { Injectable } from '@angular/core'; import { ScriptDataService } from '../../core/data/processes/script-data.service'; import { ProcessParameter } from '../../process-page/processes/process-parameter.model'; +import { AccessControlFormState } from './access-control-form-container.component'; @Injectable({ providedIn: 'root' }) export class BulkAccessControlService { constructor(private scriptService: ScriptDataService) {} - createPayloadFile(payload: any) { - console.log('execute', payload); + createPayloadFile(payload: { state: AccessControlFormState, bitstreamAccess, itemAccess }) { + const content = convertToBulkAccessControlFileModel(payload); - const blob = new Blob([JSON.stringify(payload, null, 2)], { + const blob = new Blob([JSON.stringify(content, null, 2)], { type: 'application/json', }); @@ -34,3 +35,43 @@ export class BulkAccessControlService { return this.scriptService.invoke('bulk-access-control', params, [file]); } } + +export const convertToBulkAccessControlFileModel = (payload: { state: AccessControlFormState, bitstreamAccess: AccessCondition[], itemAccess: AccessCondition[] }): BulkAccessControlFileModel => { + const constraints = { uuid: [] }; + + if (payload.state.bitstream.changesLimit === 'selected') { + // @ts-ignore + constraints.uuid = payload.state.bitstream.selectedBitstreams.map((x) => x.id); + } + + return { + item: { + mode: payload.state.item.accessMode, + accessConditions: payload.itemAccess + }, + bitstream: { + constraints, + mode: payload.state.bitstream.accessMode, + accessConditions: payload.bitstreamAccess + } + }; +}; + + +export interface BulkAccessControlFileModel { + item: { + mode: string; + accessConditions: AccessCondition[]; + }, + bitstream: { + constraints: { uuid: string[] }; + mode: string; + accessConditions: AccessCondition[]; + } +} + +interface AccessCondition { + name: string; + startDate?: string; + endDate?: string; +} From e31fc562c5ab4006ffb8a6220f6001a4b0fb929f Mon Sep 17 00:00:00 2001 From: Giuseppe Digilio Date: Wed, 10 May 2023 18:25:41 +0200 Subject: [PATCH 188/409] [CST-9636] WIP Create the access-control.module --- .../edit-collection-page.module.ts | 16 +++------ .../community-access-control.component.ts | 2 -- .../edit-community-page.module.ts | 12 ++----- .../edit-item-page/edit-item-page.module.ts | 9 ++--- .../access-control-array-form.component.ts | 19 ++-------- ...access-control-form-container.component.ts | 29 ++------------- .../access-control-form.module.ts | 36 +++++++++++++++++++ 7 files changed, 51 insertions(+), 72 deletions(-) create mode 100644 src/app/shared/access-control-form-container/access-control-form.module.ts diff --git a/src/app/collection-page/edit-collection-page/edit-collection-page.module.ts b/src/app/collection-page/edit-collection-page/edit-collection-page.module.ts index 58563f440b..8d0cb179f1 100644 --- a/src/app/collection-page/edit-collection-page/edit-collection-page.module.ts +++ b/src/app/collection-page/edit-collection-page/edit-collection-page.module.ts @@ -9,18 +9,14 @@ import { CollectionCurateComponent } from './collection-curate/collection-curate import { CollectionSourceComponent } from './collection-source/collection-source.component'; import { CollectionAuthorizationsComponent } from './collection-authorizations/collection-authorizations.component'; import { CollectionFormModule } from '../collection-form/collection-form.module'; -import { CollectionSourceControlsComponent } from './collection-source/collection-source-controls/collection-source-controls.component'; +import { + CollectionSourceControlsComponent +} from './collection-source/collection-source-controls/collection-source-controls.component'; import { ResourcePoliciesModule } from '../../shared/resource-policies/resource-policies.module'; import { FormModule } from '../../shared/form/form.module'; import { ComcolModule } from '../../shared/comcol/comcol.module'; import { CollectionAccessControlComponent } from './collection-access-control/collection-access-control.component'; -import { - AccessControlArrayFormModule -} from '../../shared/access-control-form-container/access-control-array-form/access-control-array-form.component'; -import { UiSwitchModule } from 'ngx-ui-switch'; -import { - AccessControlFormContainerModule -} from '../../shared/access-control-form-container/access-control-form-container.component'; +import { AccessControlFormModule } from '../../shared/access-control-form-container/access-control-form.module'; /** * Module that contains all components related to the Edit Collection page administrator functionality @@ -34,9 +30,7 @@ import { ResourcePoliciesModule, FormModule, ComcolModule, - AccessControlArrayFormModule, - UiSwitchModule, - AccessControlFormContainerModule, + AccessControlFormModule, ], declarations: [ EditCollectionPageComponent, diff --git a/src/app/community-page/edit-community-page/community-access-control/community-access-control.component.ts b/src/app/community-page/edit-community-page/community-access-control/community-access-control.component.ts index b24069b9ac..8a216e38df 100644 --- a/src/app/community-page/edit-community-page/community-access-control/community-access-control.component.ts +++ b/src/app/community-page/edit-community-page/community-access-control/community-access-control.component.ts @@ -1,8 +1,6 @@ import { Component, OnInit } from '@angular/core'; import { Observable } from 'rxjs'; import { RemoteData } from '../../../core/data/remote-data'; -import { SelectableListService } from '../../../shared/object-list/selectable-list/selectable-list.service'; -import { NgbModal } from '@ng-bootstrap/ng-bootstrap'; import { ActivatedRoute } from '@angular/router'; import { map } from 'rxjs/operators'; import { getFirstSucceededRemoteData } from '../../../core/shared/operators'; diff --git a/src/app/community-page/edit-community-page/edit-community-page.module.ts b/src/app/community-page/edit-community-page/edit-community-page.module.ts index d88aadfd8e..5190d6a008 100644 --- a/src/app/community-page/edit-community-page/edit-community-page.module.ts +++ b/src/app/community-page/edit-community-page/edit-community-page.module.ts @@ -11,13 +11,9 @@ import { CommunityFormModule } from '../community-form/community-form.module'; import { ResourcePoliciesModule } from '../../shared/resource-policies/resource-policies.module'; import { ComcolModule } from '../../shared/comcol/comcol.module'; import { CommunityAccessControlComponent } from './community-access-control/community-access-control.component'; -import { UiSwitchModule } from 'ngx-ui-switch'; import { - AccessControlArrayFormModule -} from '../../shared/access-control-form-container/access-control-array-form/access-control-array-form.component'; -import { - AccessControlFormContainerModule -} from '../../shared/access-control-form-container/access-control-form-container.component'; + AccessControlFormModule +} from '../../shared/access-control-form-container/access-control-form.module'; /** * Module that contains all components related to the Edit Community page administrator functionality @@ -30,9 +26,7 @@ import { CommunityFormModule, ComcolModule, ResourcePoliciesModule, - UiSwitchModule, - AccessControlArrayFormModule, - AccessControlFormContainerModule, + AccessControlFormModule, ], declarations: [ EditCommunityPageComponent, diff --git a/src/app/item-page/edit-item-page/edit-item-page.module.ts b/src/app/item-page/edit-item-page/edit-item-page.module.ts index 9d132abe53..ef6abf4a84 100644 --- a/src/app/item-page/edit-item-page/edit-item-page.module.ts +++ b/src/app/item-page/edit-item-page/edit-item-page.module.ts @@ -47,12 +47,10 @@ import { IdentifierDataComponent } from '../../shared/object-list/identifier-dat import { ItemRegisterDoiComponent } from './item-register-doi/item-register-doi.component'; import { DsoSharedModule } from '../../dso-shared/dso-shared.module'; import { ItemAccessControlComponent } from './item-access-control/item-access-control.component'; -import { UiSwitchModule } from 'ngx-ui-switch'; import { ResultsBackButtonModule } from '../../shared/results-back-button/results-back-button.module'; import { - AccessControlFormContainerModule -} from '../../shared/access-control-form-container/access-control-form-container.component'; - + AccessControlFormModule +} from '../../shared/access-control-form-container/access-control-form.module'; /** * Module that contains all components related to the Edit Item page administrator functionality @@ -69,9 +67,8 @@ import { NgbModule, ItemVersionsModule, DsoSharedModule, - UiSwitchModule, ResultsBackButtonModule, - AccessControlFormContainerModule, + AccessControlFormModule, ], declarations: [ EditItemPageComponent, diff --git a/src/app/shared/access-control-form-container/access-control-array-form/access-control-array-form.component.ts b/src/app/shared/access-control-form-container/access-control-array-form/access-control-array-form.component.ts index 41b51d73dc..1e978d9aa9 100644 --- a/src/app/shared/access-control-form-container/access-control-array-form/access-control-array-form.component.ts +++ b/src/app/shared/access-control-form-container/access-control-array-form/access-control-array-form.component.ts @@ -1,17 +1,10 @@ -import { Component, Input, NgModule, OnDestroy, OnInit } from '@angular/core'; -import { CommonModule } from '@angular/common'; -import { FormArray, FormBuilder, FormControl, ReactiveFormsModule } from '@angular/forms'; -import { SharedBrowseByModule } from '../../browse-by/shared-browse-by.module'; -import { TranslateModule } from '@ngx-translate/core'; -import { NgbDatepickerModule } from '@ng-bootstrap/ng-bootstrap'; -import { ControlMaxStartDatePipe } from './control-max-start-date.pipe'; -import { ControlMaxEndDatePipe } from './control-max-end-date.pipe'; +import { Component, Input, OnDestroy, OnInit } from '@angular/core'; +import { FormArray, FormBuilder, FormControl } from '@angular/forms'; import { distinctUntilChanged, takeUntil } from 'rxjs/operators'; import { Subject } from 'rxjs'; import { AccessesConditionOption } from '../../../core/config/models/config-accesses-conditions-options.model'; - @Component({ selector: 'ds-access-control-array-form', templateUrl: './access-control-array-form.component.html', @@ -151,11 +144,3 @@ export class AccessControlArrayFormComponent implements OnInit, OnDestroy { } } - -@NgModule({ - imports: [ CommonModule, ReactiveFormsModule, SharedBrowseByModule, TranslateModule, NgbDatepickerModule ], - declarations: [ AccessControlArrayFormComponent, ControlMaxStartDatePipe, ControlMaxEndDatePipe ], - exports: [ AccessControlArrayFormComponent ], -}) -export class AccessControlArrayFormModule { -} diff --git a/src/app/shared/access-control-form-container/access-control-form-container.component.ts b/src/app/shared/access-control-form-container/access-control-form-container.component.ts index e34928361f..10ce81d6fc 100644 --- a/src/app/shared/access-control-form-container/access-control-form-container.component.ts +++ b/src/app/shared/access-control-form-container/access-control-form-container.component.ts @@ -1,20 +1,13 @@ -import { ChangeDetectorRef, Component, Input, NgModule, OnDestroy, ViewChild } from '@angular/core'; +import { ChangeDetectorRef, Component, Input, OnDestroy, ViewChild } from '@angular/core'; import { concatMap, Observable, shareReplay } from 'rxjs'; import { RemoteData } from '../../core/data/remote-data'; import { Item } from '../../core/shared/item.model'; -import { - AccessControlArrayFormComponent, - AccessControlArrayFormModule -} from './access-control-array-form/access-control-array-form.component'; +import { AccessControlArrayFormComponent } from './access-control-array-form/access-control-array-form.component'; import { BulkAccessControlService } from './bulk-access-control.service'; import { SelectableListService } from '../object-list/selectable-list/selectable-list.service'; import { NgbModal } from '@ng-bootstrap/ng-bootstrap'; import { map, take } from 'rxjs/operators'; -import { CommonModule } from '@angular/common'; import { ListableObject } from '../object-collection/shared/listable-object.model'; -import { SharedModule } from '../shared.module'; -import { TranslateModule } from '@ngx-translate/core'; -import { UiSwitchModule } from 'ngx-ui-switch'; import { DSpaceObject } from '../../core/shared/dspace-object.model'; import { ITEM_ACCESS_CONTROL_SELECT_BITSTREAMS_LIST_ID, @@ -175,21 +168,3 @@ export interface AccessControlFormState { selectedBitstreams: ListableObject[], } } - -@NgModule({ - imports: [ - CommonModule, - AccessControlArrayFormModule, - SharedModule, - TranslateModule, - UiSwitchModule - ], - declarations: [ - AccessControlFormContainerComponent, - ItemAccessControlSelectBitstreamsModalComponent - ], - exports: [ AccessControlFormContainerComponent, AccessControlArrayFormModule ], -}) -export class AccessControlFormContainerModule {} - - diff --git a/src/app/shared/access-control-form-container/access-control-form.module.ts b/src/app/shared/access-control-form-container/access-control-form.module.ts new file mode 100644 index 0000000000..4bba26033f --- /dev/null +++ b/src/app/shared/access-control-form-container/access-control-form.module.ts @@ -0,0 +1,36 @@ +import { NgModule } from '@angular/core'; +import { CommonModule } from '@angular/common'; + +import { TranslateModule } from '@ngx-translate/core'; +import { UiSwitchModule } from 'ngx-ui-switch'; + +import { + AccessControlArrayFormComponent +} from './access-control-array-form/access-control-array-form.component'; +import { SharedModule } from '../shared.module'; +import { + ItemAccessControlSelectBitstreamsModalComponent +} from './item-access-control-select-bitstreams-modal/item-access-control-select-bitstreams-modal.component'; +import { AccessControlFormContainerComponent } from './access-control-form-container.component'; +import { ControlMaxStartDatePipe } from './access-control-array-form/control-max-start-date.pipe'; +import { ControlMaxEndDatePipe } from './access-control-array-form/control-max-end-date.pipe'; +import { NgbDatepickerModule } from '@ng-bootstrap/ng-bootstrap'; + +@NgModule({ + imports: [ + CommonModule, + SharedModule, + TranslateModule, + UiSwitchModule, + NgbDatepickerModule + ], + declarations: [ + AccessControlFormContainerComponent, + AccessControlArrayFormComponent, + ItemAccessControlSelectBitstreamsModalComponent, + ControlMaxStartDatePipe, + ControlMaxEndDatePipe + ], + exports: [ AccessControlFormContainerComponent, AccessControlArrayFormComponent ], +}) +export class AccessControlFormModule {} From 64c0fff37010897427ecd72323378050bf0858a6 Mon Sep 17 00:00:00 2001 From: Giuseppe Digilio Date: Wed, 10 May 2023 20:18:20 +0200 Subject: [PATCH 189/409] [CST-9636] WIP Create unit tests --- .../access-control/access-control.module.ts | 20 ++-- .../browse/bulk-access-browse.component.html | 3 - .../bulk-access-browse.component.spec.ts | 75 ++++++++++++-- .../browse/bulk-access-browse.component.ts | 7 +- .../bulk-access/bulk-access.component.html | 14 ++- .../bulk-access/bulk-access.component.spec.ts | 96 +++++++++++++++++- .../bulk-access/bulk-access.component.ts | 98 ++++++++++++++++++- .../bulk-access-settings.component.html | 2 +- .../bulk-access-settings.component.spec.ts | 65 +++++++++++- .../bulk-access-settings.component.ts | 30 ++++-- ...ccess-control-array-form.component.spec.ts | 2 +- ...access-control-form-container.component.ts | 5 + .../bulk-access-control.service.spec.ts | 8 +- .../bulk-access-control.service.ts | 8 +- .../selectable-list.service.spec.ts | 2 +- 15 files changed, 382 insertions(+), 53 deletions(-) diff --git a/src/app/access-control/access-control.module.ts b/src/app/access-control/access-control.module.ts index ba7334d24f..3dc4b6cedc 100644 --- a/src/app/access-control/access-control.module.ts +++ b/src/app/access-control/access-control.module.ts @@ -17,6 +17,7 @@ import { NgbAccordionModule } from '@ng-bootstrap/ng-bootstrap'; import { BulkAccessBrowseComponent } from './bulk-access/browse/bulk-access-browse.component'; import { BulkAccessSettingsComponent } from './bulk-access/settings/bulk-access-settings.component'; import { SearchModule } from '../shared/search/search.module'; +import { AccessControlFormModule } from '../shared/access-control-form-container/access-control-form.module'; /** * Condition for displaying error messages on email form field @@ -27,15 +28,16 @@ export const ValidateEmailErrorStateMatcher: DynamicErrorMessagesMatcher = }; @NgModule({ - imports: [ - CommonModule, - SharedModule, - RouterModule, - AccessControlRoutingModule, - FormModule, - NgbAccordionModule, - SearchModule, - ], + imports: [ + CommonModule, + SharedModule, + RouterModule, + AccessControlRoutingModule, + FormModule, + NgbAccordionModule, + SearchModule, + AccessControlFormModule, + ], exports: [ MembersListComponent, ], diff --git a/src/app/access-control/bulk-access/browse/bulk-access-browse.component.html b/src/app/access-control/bulk-access/browse/bulk-access-browse.component.html index 9851aab835..6ef45cdd5b 100644 --- a/src/app/access-control/bulk-access/browse/bulk-access-browse.component.html +++ b/src/app/access-control/bulk-access/browse/bulk-access-browse.component.html @@ -51,6 +51,3 @@ - - - diff --git a/src/app/access-control/bulk-access/browse/bulk-access-browse.component.spec.ts b/src/app/access-control/bulk-access/browse/bulk-access-browse.component.spec.ts index 12cfabae08..c8379b06ee 100644 --- a/src/app/access-control/bulk-access/browse/bulk-access-browse.component.spec.ts +++ b/src/app/access-control/bulk-access/browse/bulk-access-browse.component.spec.ts @@ -1,25 +1,82 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; +import { NO_ERRORS_SCHEMA } from '@angular/core'; + +import { of } from 'rxjs'; +import { NgbAccordionModule, NgbNavModule } from '@ng-bootstrap/ng-bootstrap'; +import { TranslateModule } from '@ngx-translate/core'; import { BulkAccessBrowseComponent } from './bulk-access-browse.component'; +import { SelectableListService } from '../../../shared/object-list/selectable-list/selectable-list.service'; +import { SelectableObject } from '../../../shared/object-list/selectable-list/selectable-list.service.spec'; +import { PageInfo } from '../../../core/shared/page-info.model'; +import { buildPaginatedList } from '../../../core/data/paginated-list.model'; +import { createSuccessfulRemoteDataObject } from '../../../shared/remote-data.utils'; -describe('BrowseComponent', () => { +describe('BulkAccessBrowseComponent', () => { let component: BulkAccessBrowseComponent; let fixture: ComponentFixture; - beforeEach(async () => { - await TestBed.configureTestingModule({ - declarations: [ BulkAccessBrowseComponent ] - }) - .compileComponents(); - }); + const listID1 = 'id1'; + const value1 = 'Selected object'; + const value2 = 'Another selected object'; + + const selected1 = new SelectableObject(value1); + const selected2 = new SelectableObject(value2); + + const testSelection = { id: listID1, selection: [selected1, selected2] } ; + + const selectableListService = jasmine.createSpyObj('SelectableListService', ['getSelectableList', 'deselectAll']); + beforeEach(waitForAsync(() => { + TestBed.configureTestingModule({ + imports: [ + NgbAccordionModule, + NgbNavModule, + TranslateModule.forRoot() + ], + declarations: [BulkAccessBrowseComponent], + providers: [ { provide: SelectableListService, useValue: selectableListService }, ], + schemas: [ + NO_ERRORS_SCHEMA + ] + }).compileComponents(); + })); beforeEach(() => { fixture = TestBed.createComponent(BulkAccessBrowseComponent); component = fixture.componentInstance; + (component as any).selectableListService.getSelectableList.and.returnValue(of(testSelection)); fixture.detectChanges(); }); - it('should create', () => { + afterEach(() => { + fixture.destroy(); + component = null; + }); + + it('should create the component', () => { expect(component).toBeTruthy(); }); + + it('should have an initial active nav id of "search"', () => { + expect(component.activateId).toEqual('search'); + }); + + it('should have an initial pagination options object with default values', () => { + expect(component.paginationOptions$.getValue().id).toEqual('bas'); + expect(component.paginationOptions$.getValue().pageSize).toEqual(5); + expect(component.paginationOptions$.getValue().currentPage).toEqual(1); + }); + + it('should have an initial remote data with a paginated list as value', () => { + const list = buildPaginatedList(new PageInfo({ + "elementsPerPage": 5, + "totalElements": 2, + "totalPages": 1, + "currentPage": 1 + }), [selected1, selected2]) ; + const rd = createSuccessfulRemoteDataObject(list); + + expect(component.objectsSelected$.value).toEqual(rd); + }); + }); diff --git a/src/app/access-control/bulk-access/browse/bulk-access-browse.component.ts b/src/app/access-control/bulk-access/browse/bulk-access-browse.component.ts index 7cbb8740a7..53a7302b46 100644 --- a/src/app/access-control/bulk-access/browse/bulk-access-browse.component.ts +++ b/src/app/access-control/bulk-access/browse/bulk-access-browse.component.ts @@ -1,7 +1,7 @@ import { Component, Input, OnDestroy, OnInit } from '@angular/core'; import { BehaviorSubject, Subscription } from 'rxjs'; -import { distinctUntilChanged, map } from 'rxjs/operators'; +import { distinctUntilChanged, map, tap } from 'rxjs/operators'; import { SEARCH_CONFIG_SERVICE } from '../../../my-dspace-page/my-dspace-page.component'; import { SearchConfigurationService } from '../../../core/shared/search/search-configuration.service'; @@ -67,7 +67,8 @@ export class BulkAccessBrowseComponent implements OnInit, OnDestroy { this.subs.push( this.selectableListService.getSelectableList(this.listId).pipe( distinctUntilChanged(), - map((list: SelectableListState) => this.generatePaginatedListBySelectedElements(list)) + map((list: SelectableListState) => this.generatePaginatedListBySelectedElements(list)), + tap(console.log) ).subscribe(this.objectsSelected$) ) } @@ -76,14 +77,12 @@ export class BulkAccessBrowseComponent implements OnInit, OnDestroy { this.paginationOptions$.next(Object.assign(new PaginationComponentOptions(), this.paginationOptions$.value, { currentPage: this.paginationOptions$.value.currentPage + 1 })); - console.log(this.paginationOptions$.value); } pagePrev() { this.paginationOptions$.next(Object.assign(new PaginationComponentOptions(), this.paginationOptions$.value, { currentPage: this.paginationOptions$.value.currentPage - 1 })); - console.log(this.paginationOptions$.value); } private calculatePageCount(pageSize, totalCount = 0) { diff --git a/src/app/access-control/bulk-access/bulk-access.component.html b/src/app/access-control/bulk-access/bulk-access.component.html index 12ab88cd1a..aa6c82e133 100644 --- a/src/app/access-control/bulk-access/bulk-access.component.html +++ b/src/app/access-control/bulk-access/bulk-access.component.html @@ -1,8 +1,18 @@ -
    - + + +
    + +
    + + +
    diff --git a/src/app/access-control/bulk-access/bulk-access.component.spec.ts b/src/app/access-control/bulk-access/bulk-access.component.spec.ts index 61fab1e5a9..3372f98dab 100644 --- a/src/app/access-control/bulk-access/bulk-access.component.spec.ts +++ b/src/app/access-control/bulk-access/bulk-access.component.spec.ts @@ -1,25 +1,115 @@ import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { NO_ERRORS_SCHEMA } from '@angular/core'; + +import { TranslateModule } from '@ngx-translate/core'; +import { of } from 'rxjs'; import { BulkAccessComponent } from './bulk-access.component'; +import { BulkAccessControlService } from '../../shared/access-control-form-container/bulk-access-control.service'; +import { SelectableListService } from '../../shared/object-list/selectable-list/selectable-list.service'; +import { SelectableListState } from '../../shared/object-list/selectable-list/selectable-list.reducer'; +import { createSuccessfulRemoteDataObject$ } from '../../shared/remote-data.utils'; +import { Process } from '../../process-page/processes/process.model'; -describe('BulkAccessComponent', () => { +fdescribe('BulkAccessComponent', () => { let component: BulkAccessComponent; let fixture: ComponentFixture; + let bulkAccessControlService: any; + let selectableListService: any; + + const selectableListServiceMock = jasmine.createSpyObj('SelectableListService', ['getSelectableList', 'deselectAll']); + const bulkAccessControlServiceMock = jasmine.createSpyObj('bulkAccessControlService', ['createPayloadFile', 'executeScript']); + + const mockFormState = { + "bitstream": [], + "item": [ + { + "name": "embargo", + "startDate": { + "year": 2026, + "month": 5, + "day": 31 + }, + "endDate": null + } + ], + "state": { + "item": { + "toggleStatus": true, + "accessMode": "replace" + }, + "bitstream": { + "toggleStatus": false, + "accessMode": "", + "changesLimit": "", + "selectedBitstreams": [] + } + } + }; + + const mockSettings: any = jasmine.createSpyObj('AccessControlFormContainerComponent', { + getValue: jasmine.createSpy('getValue'), + reset: jasmine.createSpy('reset') + }); + const selection: any[] = [{ indexableObject: { uuid: '1234' } }, { indexableObject: { uuid: '5678' } }]; + const selectableListState: SelectableListState = { id: 'test', selection }; + const expectedIdList = ['1234', '5678']; beforeEach(async () => { await TestBed.configureTestingModule({ - declarations: [ BulkAccessComponent ] + imports: [ TranslateModule.forRoot() ], + declarations: [ BulkAccessComponent ], + providers: [ + { provide: BulkAccessControlService, useValue: bulkAccessControlServiceMock }, + { provide: SelectableListService, useValue: selectableListServiceMock } + ], + schemas: [NO_ERRORS_SCHEMA] }) - .compileComponents(); + .compileComponents(); }); beforeEach(() => { fixture = TestBed.createComponent(BulkAccessComponent); component = fixture.componentInstance; + bulkAccessControlService = TestBed.inject(BulkAccessControlService); + selectableListService = TestBed.inject(SelectableListService); + (component as any).selectableListService.getSelectableList.and.returnValue(of(selectableListState)); fixture.detectChanges(); + component.settings = mockSettings; + }); + + afterEach(() => { + fixture.destroy(); }); it('should create', () => { expect(component).toBeTruthy(); }); + + it('should generate the id list by selected elements', () => { + expect(component.objectsSelected$.value).toEqual(expectedIdList); + }); + + it('should disable the execute button when there are no objects selected', () => { + expect(component.canExport()).toBe(false); + }); + + it('should enable the execute button when there are objects selected', () => { + component.objectsSelected$.next(['1234']); + expect(component.canExport()).toBe(true); + }); + + it('should call the settings reset method when reset is called', () => { + spyOn(component.settings, 'reset'); + component.reset(); + expect(component.settings.reset).toHaveBeenCalled(); + }); + + it('should call the bulkAccessControlService executeScript method when submit is called', () => { + (component.settings as any).getValue.and.returnValue(mockFormState) + bulkAccessControlService.executeScript.and.returnValue(createSuccessfulRemoteDataObject$(new Process())); + component.objectsSelected$.next(['1234']); + component.submit(); + expect(bulkAccessControlService.executeScript).toHaveBeenCalled(); + }); }); diff --git a/src/app/access-control/bulk-access/bulk-access.component.ts b/src/app/access-control/bulk-access/bulk-access.component.ts index bc0d293e61..8a82edb273 100644 --- a/src/app/access-control/bulk-access/bulk-access.component.ts +++ b/src/app/access-control/bulk-access/bulk-access.component.ts @@ -1,8 +1,31 @@ -import { Component, OnInit } from '@angular/core'; +import { Component, OnInit, ViewChild } from '@angular/core'; + +import { BulkAccessSettingsComponent } from './settings/bulk-access-settings.component'; +import { distinctUntilChanged, map, take, tap } from 'rxjs/operators'; +import { BulkAccessControlService } from '../../shared/access-control-form-container/bulk-access-control.service'; +import { SelectableListState } from '../../shared/object-list/selectable-list/selectable-list.reducer'; +import { BehaviorSubject, Subscription } from 'rxjs'; +import { SelectableListService } from '../../shared/object-list/selectable-list/selectable-list.service'; @Component({ selector: 'ds-bulk-access', - templateUrl: './bulk-access.component.html', + // templateUrl: './bulk-access.component.html', + template: `
    + +
    + + +
    + +
    + + +
    +
    `, styleUrls: ['./bulk-access.component.scss'] }) export class BulkAccessComponent implements OnInit { @@ -13,9 +36,78 @@ export class BulkAccessComponent implements OnInit { */ listId: string = 'bulk-access-list'; - constructor() { } + /** + * The list of the objects already selected + */ + objectsSelected$: BehaviorSubject = new BehaviorSubject([]); + + /** + * Array to track all subscriptions and unsubscribe them onDestroy + */ + private subs: Subscription[] = []; + + /** + * The SectionsDirective reference + */ + @ViewChild('dsBulkSettings') settings: BulkAccessSettingsComponent; + + constructor( + private bulkAccessControlService: BulkAccessControlService, + private selectableListService: SelectableListService + ) { } ngOnInit(): void { + this.subs.push( + this.selectableListService.getSelectableList(this.listId).pipe( + distinctUntilChanged(), + tap(console.log), + map((list: SelectableListState) => this.generateIdListBySelectedElements(list)), + tap(console.log) + ).subscribe(this.objectsSelected$) + ) } + canExport(): boolean { + return this.objectsSelected$.value?.length > 0; + } + + /** + * Reset the form to its initial state + * This will also reset the state of the child components (bitstream and item access) + */ + reset(): void { + this.settings.reset() + } + + /** + * Submit the form + * This will create a payload file and execute the script + */ + submit(): void { + const settings = this.settings.getValue(); + const bitstreamAccess = settings.bitstream; + const itemAccess = settings.item; + + const { file } = this.bulkAccessControlService.createPayloadFile({ + bitstreamAccess, + itemAccess, + state: settings.state + }); + + this.bulkAccessControlService.executeScript( + this.objectsSelected$.value || [], + file + ).pipe(take(1)).subscribe((res) => { + console.log('success', res); + }); + } + + /** + * Generate The RemoteData object containing the list of the selected elements + * @param list + * @private + */ + private generateIdListBySelectedElements(list: SelectableListState): string[] { + return list?.selection?.map((entry: any) => entry.indexableObject.uuid); + } } diff --git a/src/app/access-control/bulk-access/settings/bulk-access-settings.component.html b/src/app/access-control/bulk-access/settings/bulk-access-settings.component.html index a5c292eddd..01f36ef03f 100644 --- a/src/app/access-control/bulk-access/settings/bulk-access-settings.component.html +++ b/src/app/access-control/bulk-access/settings/bulk-access-settings.component.html @@ -15,7 +15,7 @@
    -

    bulk-access-settings works!

    +
    diff --git a/src/app/access-control/bulk-access/settings/bulk-access-settings.component.spec.ts b/src/app/access-control/bulk-access/settings/bulk-access-settings.component.spec.ts index 435f2828b9..306d4eebde 100644 --- a/src/app/access-control/bulk-access/settings/bulk-access-settings.component.spec.ts +++ b/src/app/access-control/bulk-access/settings/bulk-access-settings.component.spec.ts @@ -1,25 +1,80 @@ import { ComponentFixture, TestBed } from '@angular/core/testing'; - +import { NgbAccordionModule } from '@ng-bootstrap/ng-bootstrap'; +import { TranslateModule } from '@ngx-translate/core'; import { BulkAccessSettingsComponent } from './bulk-access-settings.component'; +import { NO_ERRORS_SCHEMA } from '@angular/core'; describe('BulkAccessSettingsComponent', () => { let component: BulkAccessSettingsComponent; let fixture: ComponentFixture; + const mockFormState = { + "bitstream": [], + "item": [ + { + "name": "embargo", + "startDate": { + "year": 2026, + "month": 5, + "day": 31 + }, + "endDate": null + } + ], + "state": { + "item": { + "toggleStatus": true, + "accessMode": "replace" + }, + "bitstream": { + "toggleStatus": false, + "accessMode": "", + "changesLimit": "", + "selectedBitstreams": [] + } + } + }; + + const mockControl: any = jasmine.createSpyObj('AccessControlFormContainerComponent', { + getFormValue: jasmine.createSpy('getFormValue'), + reset: jasmine.createSpy('reset') + }); beforeEach(async () => { await TestBed.configureTestingModule({ - declarations: [ BulkAccessSettingsComponent ] - }) - .compileComponents(); + imports: [NgbAccordionModule, TranslateModule.forRoot()], + declarations: [BulkAccessSettingsComponent], + schemas: [NO_ERRORS_SCHEMA] + }).compileComponents(); }); beforeEach(() => { fixture = TestBed.createComponent(BulkAccessSettingsComponent); component = fixture.componentInstance; fixture.detectChanges(); + component.controlForm = mockControl; }); - it('should create', () => { + it('should create the component', () => { expect(component).toBeTruthy(); }); + + it('should have a method to get the form value', () => { + expect(component.getValue).toBeDefined(); + }); + + it('should have a method to reset the form', () => { + expect(component.reset).toBeDefined(); + }); + + it('should return the correct form value', () => { + const expectedValue = mockFormState; + (component.controlForm as any).getFormValue.and.returnValue(mockFormState) + const actualValue = component.getValue(); + expect(actualValue).toEqual(expectedValue); + }); + + it('should call reset on the control form', () => { + component.reset(); + expect(component.controlForm.reset).toHaveBeenCalled(); + }); }); diff --git a/src/app/access-control/bulk-access/settings/bulk-access-settings.component.ts b/src/app/access-control/bulk-access/settings/bulk-access-settings.component.ts index cad9e5b981..978fc41ed8 100644 --- a/src/app/access-control/bulk-access/settings/bulk-access-settings.component.ts +++ b/src/app/access-control/bulk-access/settings/bulk-access-settings.component.ts @@ -1,20 +1,34 @@ -import { Component, Input, OnInit } from '@angular/core'; +import { Component, ViewChild } from '@angular/core'; +import { + AccessControlFormContainerComponent +} from '../../../shared/access-control-form-container/access-control-form-container.component'; @Component({ selector: 'ds-bulk-access-settings', - templateUrl: './bulk-access-settings.component.html', - styleUrls: ['./bulk-access-settings.component.scss'] + templateUrl: 'bulk-access-settings.component.html', + styleUrls: ['./bulk-access-settings.component.scss'], + exportAs: 'dsBulkSettings' }) -export class BulkAccessSettingsComponent implements OnInit { +export class BulkAccessSettingsComponent { /** - * The selection list id + * The SectionsDirective reference */ - @Input() listId!: string; + @ViewChild('dsAccessControlForm') controlForm: AccessControlFormContainerComponent; - constructor() { } + /** + * Will be used from a parent component to read the value of the form + */ + getValue() { + return this.controlForm.getFormValue(); + } - ngOnInit(): void { + /** + * Reset the form to its initial state + * This will also reset the state of the child components (bitstream and item access) + */ + reset() { + this.controlForm.reset() } } diff --git a/src/app/shared/access-control-form-container/access-control-array-form/access-control-array-form.component.spec.ts b/src/app/shared/access-control-form-container/access-control-array-form/access-control-array-form.component.spec.ts index 5c97e3abc5..ca715a238c 100644 --- a/src/app/shared/access-control-form-container/access-control-array-form/access-control-array-form.component.spec.ts +++ b/src/app/shared/access-control-form-container/access-control-array-form/access-control-array-form.component.spec.ts @@ -11,7 +11,7 @@ import { ControlMaxEndDatePipe } from './control-max-end-date.pipe'; import { DebugElement } from '@angular/core'; import { By } from '@angular/platform-browser'; -fdescribe('AccessControlArrayFormComponent', () => { +describe('AccessControlArrayFormComponent', () => { let component: AccessControlArrayFormComponent; let fixture: ComponentFixture; diff --git a/src/app/shared/access-control-form-container/access-control-form-container.component.ts b/src/app/shared/access-control-form-container/access-control-form-container.component.ts index 10ce81d6fc..7e46a53ed5 100644 --- a/src/app/shared/access-control-form-container/access-control-form-container.component.ts +++ b/src/app/shared/access-control-form-container/access-control-form-container.component.ts @@ -65,6 +65,11 @@ export class AccessControlFormContainerComponent impleme * Will be used from a parent component to read the value of the form */ getFormValue() { + console.log({ + bitstream: this.bitstreamAccessCmp.getValue(), + item: this.itemAccessCmp.getValue(), + state: this.state + }); return { bitstream: this.bitstreamAccessCmp.getValue(), item: this.itemAccessCmp.getValue(), diff --git a/src/app/shared/access-control-form-container/bulk-access-control.service.spec.ts b/src/app/shared/access-control-form-container/bulk-access-control.service.spec.ts index 9e733b5694..1bd2efcfef 100644 --- a/src/app/shared/access-control-form-container/bulk-access-control.service.spec.ts +++ b/src/app/shared/access-control-form-container/bulk-access-control.service.spec.ts @@ -1,12 +1,14 @@ import { TestBed } from '@angular/core/testing'; -import { BulkAccessControlService } from './bulk-access-control.service'; +import { BulkAccessControlService, BulkAccessPayload } from './bulk-access-control.service'; import { ScriptDataService } from '../../core/data/processes/script-data.service'; import { ProcessParameter } from '../../process-page/processes/process-parameter.model'; -fdescribe('BulkAccessControlService', () => { +describe('BulkAccessControlService', () => { let service: BulkAccessControlService; let scriptServiceSpy: jasmine.SpyObj; + + beforeEach(() => { const spy = jasmine.createSpyObj('ScriptDataService', ['invoke']); TestBed.configureTestingModule({ @@ -25,7 +27,7 @@ fdescribe('BulkAccessControlService', () => { describe('createPayloadFile', () => { it('should create a file and return the URL and file object', () => { - const payload = { data: 'test' }; + const payload: BulkAccessPayload = { state: null, bitstreamAccess: null, itemAccess: null }; const result = service.createPayloadFile(payload); expect(result.url).toBeTruthy(); diff --git a/src/app/shared/access-control-form-container/bulk-access-control.service.ts b/src/app/shared/access-control-form-container/bulk-access-control.service.ts index f5afe338dd..77fbcbffb2 100644 --- a/src/app/shared/access-control-form-container/bulk-access-control.service.ts +++ b/src/app/shared/access-control-form-container/bulk-access-control.service.ts @@ -4,11 +4,17 @@ import { ScriptDataService } from '../../core/data/processes/script-data.service import { ProcessParameter } from '../../process-page/processes/process-parameter.model'; import { AccessControlFormState } from './access-control-form-container.component'; +export interface BulkAccessPayload { + state: AccessControlFormState; + bitstreamAccess: any; + itemAccess: any; +} + @Injectable({ providedIn: 'root' }) export class BulkAccessControlService { constructor(private scriptService: ScriptDataService) {} - createPayloadFile(payload: { state: AccessControlFormState, bitstreamAccess, itemAccess }) { + createPayloadFile(payload: BulkAccessPayload) { const content = convertToBulkAccessControlFileModel(payload); const blob = new Blob([JSON.stringify(content, null, 2)], { diff --git a/src/app/shared/object-list/selectable-list/selectable-list.service.spec.ts b/src/app/shared/object-list/selectable-list/selectable-list.service.spec.ts index 1535671f79..496ef28761 100644 --- a/src/app/shared/object-list/selectable-list/selectable-list.service.spec.ts +++ b/src/app/shared/object-list/selectable-list/selectable-list.service.spec.ts @@ -11,7 +11,7 @@ import { } from './selectable-list.actions'; import { AppState } from '../../../app.reducer'; -class SelectableObject extends ListableObject { +export class SelectableObject extends ListableObject { constructor(private value: string) { super(); } From f3aa2d47a6dc5b1397a3f683452b90d6fe1f4784 Mon Sep 17 00:00:00 2001 From: Giuseppe Digilio Date: Thu, 11 May 2023 11:10:00 +0200 Subject: [PATCH 190/409] [CST-9636] finalize implementation --- .../browse/bulk-access-browse.component.ts | 5 +- .../bulk-access/bulk-access.component.spec.ts | 97 +++++++++++++------ .../bulk-access/bulk-access.component.ts | 65 +++++++------ 3 files changed, 109 insertions(+), 58 deletions(-) diff --git a/src/app/access-control/bulk-access/browse/bulk-access-browse.component.ts b/src/app/access-control/bulk-access/browse/bulk-access-browse.component.ts index 53a7302b46..eff5942d4e 100644 --- a/src/app/access-control/bulk-access/browse/bulk-access-browse.component.ts +++ b/src/app/access-control/bulk-access/browse/bulk-access-browse.component.ts @@ -1,7 +1,7 @@ import { Component, Input, OnDestroy, OnInit } from '@angular/core'; import { BehaviorSubject, Subscription } from 'rxjs'; -import { distinctUntilChanged, map, tap } from 'rxjs/operators'; +import { distinctUntilChanged, map } from 'rxjs/operators'; import { SEARCH_CONFIG_SERVICE } from '../../../my-dspace-page/my-dspace-page.component'; import { SearchConfigurationService } from '../../../core/shared/search/search-configuration.service'; @@ -67,8 +67,7 @@ export class BulkAccessBrowseComponent implements OnInit, OnDestroy { this.subs.push( this.selectableListService.getSelectableList(this.listId).pipe( distinctUntilChanged(), - map((list: SelectableListState) => this.generatePaginatedListBySelectedElements(list)), - tap(console.log) + map((list: SelectableListState) => this.generatePaginatedListBySelectedElements(list)) ).subscribe(this.objectsSelected$) ) } diff --git a/src/app/access-control/bulk-access/bulk-access.component.spec.ts b/src/app/access-control/bulk-access/bulk-access.component.spec.ts index 3372f98dab..8a64d01df4 100644 --- a/src/app/access-control/bulk-access/bulk-access.component.spec.ts +++ b/src/app/access-control/bulk-access/bulk-access.component.spec.ts @@ -10,6 +10,9 @@ import { SelectableListService } from '../../shared/object-list/selectable-list/ import { SelectableListState } from '../../shared/object-list/selectable-list/selectable-list.reducer'; import { createSuccessfulRemoteDataObject$ } from '../../shared/remote-data.utils'; import { Process } from '../../process-page/processes/process.model'; +import { RouterTestingModule } from '@angular/router/testing'; +import { NotificationsService } from '../../shared/notifications/notifications.service'; +import { NotificationsServiceStub } from '../../shared/testing/notifications-service.stub'; fdescribe('BulkAccessComponent', () => { let component: BulkAccessComponent; @@ -47,6 +50,13 @@ fdescribe('BulkAccessComponent', () => { } }; + const mockFile = { + "uuids": [ + '1234', '5678' + ], + "file": { } + } + const mockSettings: any = jasmine.createSpyObj('AccessControlFormContainerComponent', { getValue: jasmine.createSpy('getValue'), reset: jasmine.createSpy('reset') @@ -55,12 +65,18 @@ fdescribe('BulkAccessComponent', () => { const selectableListState: SelectableListState = { id: 'test', selection }; const expectedIdList = ['1234', '5678']; + const selectableListStateEmpty: SelectableListState = { id: 'test', selection: [] }; + beforeEach(async () => { await TestBed.configureTestingModule({ - imports: [ TranslateModule.forRoot() ], + imports: [ + RouterTestingModule, + TranslateModule.forRoot() + ], declarations: [ BulkAccessComponent ], providers: [ { provide: BulkAccessControlService, useValue: bulkAccessControlServiceMock }, + { provide: NotificationsService, useValue: NotificationsServiceStub }, { provide: SelectableListService, useValue: selectableListServiceMock } ], schemas: [NO_ERRORS_SCHEMA] @@ -73,43 +89,70 @@ fdescribe('BulkAccessComponent', () => { component = fixture.componentInstance; bulkAccessControlService = TestBed.inject(BulkAccessControlService); selectableListService = TestBed.inject(SelectableListService); - (component as any).selectableListService.getSelectableList.and.returnValue(of(selectableListState)); - fixture.detectChanges(); - component.settings = mockSettings; + }); afterEach(() => { fixture.destroy(); }); - it('should create', () => { - expect(component).toBeTruthy(); + describe('when there are no elements selected', () => { + + beforeEach(() => { + + (component as any).selectableListService.getSelectableList.and.returnValue(of(selectableListStateEmpty)); + fixture.detectChanges(); + component.settings = mockSettings; + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); + + it('should generate the id list by selected elements', () => { + expect(component.objectsSelected$.value).toEqual([]); + }); + + it('should disable the execute button when there are no objects selected', () => { + expect(component.canExport()).toBe(false); + }); + }); - it('should generate the id list by selected elements', () => { - expect(component.objectsSelected$.value).toEqual(expectedIdList); - }); + describe('when there are elements selected', () => { - it('should disable the execute button when there are no objects selected', () => { - expect(component.canExport()).toBe(false); - }); + beforeEach(() => { - it('should enable the execute button when there are objects selected', () => { - component.objectsSelected$.next(['1234']); - expect(component.canExport()).toBe(true); - }); + (component as any).selectableListService.getSelectableList.and.returnValue(of(selectableListState)); + fixture.detectChanges(); + component.settings = mockSettings; + }); - it('should call the settings reset method when reset is called', () => { - spyOn(component.settings, 'reset'); - component.reset(); - expect(component.settings.reset).toHaveBeenCalled(); - }); + it('should create', () => { + expect(component).toBeTruthy(); + }); - it('should call the bulkAccessControlService executeScript method when submit is called', () => { - (component.settings as any).getValue.and.returnValue(mockFormState) - bulkAccessControlService.executeScript.and.returnValue(createSuccessfulRemoteDataObject$(new Process())); - component.objectsSelected$.next(['1234']); - component.submit(); - expect(bulkAccessControlService.executeScript).toHaveBeenCalled(); + it('should generate the id list by selected elements', () => { + expect(component.objectsSelected$.value).toEqual(expectedIdList); + }); + + it('should enable the execute button when there are objects selected', () => { + component.objectsSelected$.next(['1234']); + expect(component.canExport()).toBe(true); + }); + + it('should call the settings reset method when reset is called', () => { + component.reset(); + expect(component.settings.reset).toHaveBeenCalled(); + }); + + it('should call the bulkAccessControlService executeScript method when submit is called', () => { + (component.settings as any).getValue.and.returnValue(mockFormState); + bulkAccessControlService.createPayloadFile.and.returnValue(mockFile); + bulkAccessControlService.executeScript.and.returnValue(createSuccessfulRemoteDataObject$(new Process())); + component.objectsSelected$.next(['1234']); + component.submit(); + expect(bulkAccessControlService.executeScript).toHaveBeenCalled(); + }); }); }); diff --git a/src/app/access-control/bulk-access/bulk-access.component.ts b/src/app/access-control/bulk-access/bulk-access.component.ts index 8a82edb273..b928f3da4a 100644 --- a/src/app/access-control/bulk-access/bulk-access.component.ts +++ b/src/app/access-control/bulk-access/bulk-access.component.ts @@ -1,36 +1,28 @@ import { Component, OnInit, ViewChild } from '@angular/core'; +import { Router } from '@angular/router'; + +import { BehaviorSubject, Subscription } from 'rxjs'; +import { distinctUntilChanged, map } from 'rxjs/operators'; +import { TranslateService } from '@ngx-translate/core'; import { BulkAccessSettingsComponent } from './settings/bulk-access-settings.component'; -import { distinctUntilChanged, map, take, tap } from 'rxjs/operators'; import { BulkAccessControlService } from '../../shared/access-control-form-container/bulk-access-control.service'; import { SelectableListState } from '../../shared/object-list/selectable-list/selectable-list.reducer'; -import { BehaviorSubject, Subscription } from 'rxjs'; import { SelectableListService } from '../../shared/object-list/selectable-list/selectable-list.service'; +import { getFirstCompletedRemoteData } from '../../core/shared/operators'; +import { RemoteData } from '../../core/data/remote-data'; +import { Process } from '../../process-page/processes/process.model'; +import { isNotEmpty } from '../../shared/empty.util'; +import { getProcessDetailRoute } from '../../process-page/process-page-routing.paths'; +import { NotificationsService } from '../../shared/notifications/notifications.service'; @Component({ selector: 'ds-bulk-access', - // templateUrl: './bulk-access.component.html', - template: `
    - -
    - - -
    - -
    - - -
    -
    `, + templateUrl: './bulk-access.component.html', styleUrls: ['./bulk-access.component.scss'] }) export class BulkAccessComponent implements OnInit { - /** * The selection list id */ @@ -53,16 +45,18 @@ export class BulkAccessComponent implements OnInit { constructor( private bulkAccessControlService: BulkAccessControlService, - private selectableListService: SelectableListService - ) { } + private notificationsService: NotificationsService, + private router: Router, + private selectableListService: SelectableListService, + private translationService: TranslateService + ) { + } ngOnInit(): void { this.subs.push( this.selectableListService.getSelectableList(this.listId).pipe( distinctUntilChanged(), - tap(console.log), - map((list: SelectableListState) => this.generateIdListBySelectedElements(list)), - tap(console.log) + map((list: SelectableListState) => this.generateIdListBySelectedElements(list)) ).subscribe(this.objectsSelected$) ) } @@ -97,9 +91,24 @@ export class BulkAccessComponent implements OnInit { this.bulkAccessControlService.executeScript( this.objectsSelected$.value || [], file - ).pipe(take(1)).subscribe((res) => { - console.log('success', res); - }); + ).pipe( + getFirstCompletedRemoteData(), + map((rd: RemoteData) => { + if (rd.hasSucceeded) { + const title = this.translationService.get('process.new.notification.success.title'); + const content = this.translationService.get('process.new.notification.success.content'); + this.notificationsService.success(title, content); + if (isNotEmpty(rd.payload)) { + this.router.navigateByUrl(getProcessDetailRoute(rd.payload.processId)); + } + return true; + } else { + const title = this.translationService.get('process.new.notification.error.title'); + const content = this.translationService.get('process.new.notification.error.content'); + this.notificationsService.error(title, content); + return false; + } + })).subscribe(); } /** From 3221621e6cab233c2efdf217c6dc06c011ee48fe Mon Sep 17 00:00:00 2001 From: Kristof De Langhe Date: Thu, 11 May 2023 11:17:19 +0200 Subject: [PATCH 191/409] 100414: Missing search result statistics - renaming object to clickedObject --- src/app/search-page/search-tracker.component.ts | 6 +++--- src/app/statistics/angulartics/dspace-provider.ts | 2 +- src/app/statistics/statistics.service.ts | 8 ++++---- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/app/search-page/search-tracker.component.ts b/src/app/search-page/search-tracker.component.ts index 6aa043cb54..1912b237ec 100644 --- a/src/app/search-page/search-tracker.component.ts +++ b/src/app/search-page/search-tracker.component.ts @@ -80,7 +80,7 @@ export class SearchTrackerComponent extends SearchComponent implements OnInit, O this.getSearchOptionsAndObjects().pipe( take(1), map((options) => this.transformOptionsToEventProperties(Object.assign({}, options, { - object: uuid, + clickedObject: uuid, }))) ) ), @@ -112,7 +112,7 @@ export class SearchTrackerComponent extends SearchComponent implements OnInit, O * that can be sent to Angularitics for triggering a search event * @param options */ - transformOptionsToEventProperties(options: { config: PaginatedSearchOptions, searchQueryResponse: SearchObjects, object?: string }): any { + transformOptionsToEventProperties(options: { config: PaginatedSearchOptions, searchQueryResponse: SearchObjects, clickedObject?: string }): any { const filters: { filter: string, operator: string, value: string, label: string; }[] = []; const appliedFilters = options.searchQueryResponse.appliedFilters || []; for (let i = 0, filtersLength = appliedFilters.length; i < filtersLength; i++) { @@ -134,7 +134,7 @@ export class SearchTrackerComponent extends SearchComponent implements OnInit, O order: options.config.sort.direction }, filters: filters, - object: options.object, + clickedObject: options.clickedObject, }, }; } diff --git a/src/app/statistics/angulartics/dspace-provider.ts b/src/app/statistics/angulartics/dspace-provider.ts index 30a56ad505..5297f6fc38 100644 --- a/src/app/statistics/angulartics/dspace-provider.ts +++ b/src/app/statistics/angulartics/dspace-provider.ts @@ -32,7 +32,7 @@ export class Angulartics2DSpace { event.properties.page, event.properties.sort, event.properties.filters, - event.properties.object, + event.properties.clickedObject, ); } } diff --git a/src/app/statistics/statistics.service.ts b/src/app/statistics/statistics.service.ts index b9d078ad22..e9c21aa37d 100644 --- a/src/app/statistics/statistics.service.ts +++ b/src/app/statistics/statistics.service.ts @@ -45,14 +45,14 @@ export class StatisticsService { * @param page: An object that describes the pagination status * @param sort: An object that describes the sort status * @param filters: An array of search filters used to filter the result set - * @param object: Object clicked + * @param clickedObject: UUID of object clicked */ trackSearchEvent( searchOptions: SearchOptions, page: { size: number, totalElements: number, totalPages: number, number: number }, sort: { by: string, order: string }, filters?: { filter: string, operator: string, value: string, label: string }[], - object?: string, + clickedObject?: string, ) { const body = { query: searchOptions.query, @@ -89,8 +89,8 @@ export class StatisticsService { } Object.assign(body, { appliedFilters: bodyFilters }); } - if (hasValue(object)) { - Object.assign(body, { object }); + if (hasValue(clickedObject)) { + Object.assign(body, { clickedObject }); } this.sendEvent('/statistics/searchevents', body); } From 0f0847c069388e92472e6dbc91be74a15de0db79 Mon Sep 17 00:00:00 2001 From: Kristof De Langhe Date: Thu, 20 Apr 2023 11:48:16 +0200 Subject: [PATCH 192/409] 100414: Refactor SearchTrackerComponent to SearchComponent --- src/app/core/shared/search/search.service.ts | 4 +- src/app/search-page/search-page.module.ts | 2 - .../search-page/search-tracker.component.html | 1 - .../search-page/search-tracker.component.scss | 3 - .../search-page/search-tracker.component.ts | 171 ------------------ src/app/shared/search/search.component.ts | 74 ++++++-- 6 files changed, 66 insertions(+), 189 deletions(-) delete mode 100644 src/app/search-page/search-tracker.component.html delete mode 100644 src/app/search-page/search-tracker.component.scss delete mode 100644 src/app/search-page/search-tracker.component.ts diff --git a/src/app/core/shared/search/search.service.ts b/src/app/core/shared/search/search.service.ts index c8ce4b0348..2f3d3bd184 100644 --- a/src/app/core/shared/search/search.service.ts +++ b/src/app/core/shared/search/search.service.ts @@ -334,8 +334,9 @@ export class SearchService implements OnDestroy { * Send search event to rest api using angularitics * @param config Paginated search options used * @param searchQueryResponse The response objects of the performed search + * @param object Optional UUID of an object a search was performed and clicked for */ - trackSearch(config: PaginatedSearchOptions, searchQueryResponse: SearchObjects) { + trackSearch(config: PaginatedSearchOptions, searchQueryResponse: SearchObjects, object?: string) { const filters: { filter: string, operator: string, value: string, label: string; }[] = []; const appliedFilters = searchQueryResponse.appliedFilters || []; for (let i = 0, filtersLength = appliedFilters.length; i < filtersLength; i++) { @@ -357,6 +358,7 @@ export class SearchService implements OnDestroy { order: config.sort.direction }, filters: filters, + object, }, }); } diff --git a/src/app/search-page/search-page.module.ts b/src/app/search-page/search-page.module.ts index 758eca15c0..82d4dbbe67 100644 --- a/src/app/search-page/search-page.module.ts +++ b/src/app/search-page/search-page.module.ts @@ -4,7 +4,6 @@ import { CoreModule } from '../core/core.module'; import { SharedModule } from '../shared/shared.module'; import { SidebarService } from '../shared/sidebar/sidebar.service'; import { ConfigurationSearchPageGuard } from './configuration-search-page.guard'; -import { SearchTrackerComponent } from './search-tracker.component'; import { StatisticsModule } from '../statistics/statistics.module'; import { SearchPageComponent } from './search-page.component'; import { SidebarFilterService } from '../shared/sidebar/filter/sidebar-filter.service'; @@ -17,7 +16,6 @@ import { SearchModule } from '../shared/search/search.module'; const components = [ SearchPageComponent, - SearchTrackerComponent, ThemedSearchPageComponent ]; diff --git a/src/app/search-page/search-tracker.component.html b/src/app/search-page/search-tracker.component.html deleted file mode 100644 index c0c0ffe181..0000000000 --- a/src/app/search-page/search-tracker.component.html +++ /dev/null @@ -1 +0,0 @@ -  diff --git a/src/app/search-page/search-tracker.component.scss b/src/app/search-page/search-tracker.component.scss deleted file mode 100644 index c76cafbe44..0000000000 --- a/src/app/search-page/search-tracker.component.scss +++ /dev/null @@ -1,3 +0,0 @@ -:host { - display: none -} diff --git a/src/app/search-page/search-tracker.component.ts b/src/app/search-page/search-tracker.component.ts deleted file mode 100644 index c33496eaaa..0000000000 --- a/src/app/search-page/search-tracker.component.ts +++ /dev/null @@ -1,171 +0,0 @@ -import { Component, Inject, OnDestroy, OnInit } from '@angular/core'; -import { Angulartics2 } from 'angulartics2'; -import { filter, map, switchMap, take } from 'rxjs/operators'; -import { SearchComponent } from '../shared/search/search.component'; -import { SidebarService } from '../shared/sidebar/sidebar.service'; -import { HostWindowService } from '../shared/host-window.service'; -import { SEARCH_CONFIG_SERVICE } from '../my-dspace-page/my-dspace-page.component'; -import { RouteService } from '../core/services/route.service'; -import { SearchConfigurationService } from '../core/shared/search/search-configuration.service'; -import { SearchService } from '../core/shared/search/search.service'; -import { PaginatedSearchOptions } from '../shared/search/models/paginated-search-options.model'; -import { SearchObjects } from '../shared/search/models/search-objects.model'; -import { NavigationStart, Router } from '@angular/router'; -import { RemoteData } from '../core/data/remote-data'; -import { DSpaceObject } from '../core/shared/dspace-object.model'; -import { getFirstSucceededRemoteData } from '../core/shared/operators'; -import { inspect } from 'util'; -import { hasValue, hasValueOperator, isNotEmpty } from '../shared/empty.util'; -import { Subscription } from 'rxjs/internal/Subscription'; -import { Observable } from 'rxjs/internal/Observable'; -import { ITEM_MODULE_PATH } from '../item-page/item-page-routing-paths'; -import { COLLECTION_MODULE_PATH } from '../collection-page/collection-page-routing-paths'; -import { COMMUNITY_MODULE_PATH } from '../community-page/community-page-routing-paths'; - -/** - * This component triggers a page view statistic - */ -@Component({ - selector: 'ds-search-tracker', - styleUrls: ['./search-tracker.component.scss'], - templateUrl: './search-tracker.component.html', - providers: [ - { - provide: SEARCH_CONFIG_SERVICE, - useClass: SearchConfigurationService - } - ] -}) -export class SearchTrackerComponent extends SearchComponent implements OnInit, OnDestroy { - /** - * Regex to match UUIDs - */ - uuidRegex = /\b[0-9a-f]{8}\b-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-\b[0-9a-f]{12}\b/g; - - /** - * List of paths that are considered to be the start of a route to an object page (excluding "/", e.g. "items") - * These are expected to end on an object UUID - * If they match the route we're navigating to, an object property will be added to the search event sent - */ - allowedObjectPaths: string[] = ['entities', ITEM_MODULE_PATH, COLLECTION_MODULE_PATH, COMMUNITY_MODULE_PATH]; - - /** - * Array to track all subscriptions and unsubscribe them onDestroy - * @type {Array} - */ - subs: Subscription[] = []; - - constructor( - protected service: SearchService, - protected sidebarService: SidebarService, - protected windowService: HostWindowService, - @Inject(SEARCH_CONFIG_SERVICE) public searchConfigService: SearchConfigurationService, - protected routeService: RouteService, - public angulartics2: Angulartics2, - protected router: Router - ) { - super(service, sidebarService, windowService, searchConfigService, routeService, router); - } - - ngOnInit(): void { - this.subs.push( - this.getSearchOptionsAndObjects().subscribe((options) => { - this.trackEvent(this.transformOptionsToEventProperties(options)); - }), - this.router.events.pipe( - filter((event) => event instanceof NavigationStart), - map((event: NavigationStart) => this.getDsoUUIDFromUrl(event.url)), - hasValueOperator(), - switchMap((uuid) => - this.getSearchOptionsAndObjects().pipe( - take(1), - map((options) => this.transformOptionsToEventProperties(Object.assign({}, options, { - clickedObject: uuid, - }))) - ) - ), - ).subscribe((options) => { - this.trackEvent(options); - }), - ); - } - - /** - * Get a combination of the currently applied search options and search query response - */ - getSearchOptionsAndObjects(): Observable<{ config: PaginatedSearchOptions, searchQueryResponse: SearchObjects }> { - return this.getSearchOptions().pipe( - switchMap((options: PaginatedSearchOptions) => - this.service.searchEntries(options).pipe( - getFirstSucceededRemoteData(), - map((rd: RemoteData>) => ({ - config: options, - searchQueryResponse: rd.payload - })) - ) - ), - ); - } - - /** - * Transform the given options containing search-options, query-response and optional object UUID into properties - * that can be sent to Angularitics for triggering a search event - * @param options - */ - transformOptionsToEventProperties(options: { config: PaginatedSearchOptions, searchQueryResponse: SearchObjects, clickedObject?: string }): any { - const filters: { filter: string, operator: string, value: string, label: string; }[] = []; - const appliedFilters = options.searchQueryResponse.appliedFilters || []; - for (let i = 0, filtersLength = appliedFilters.length; i < filtersLength; i++) { - const appliedFilter = appliedFilters[i]; - filters.push(appliedFilter); - } - return { - action: 'search', - properties: { - searchOptions: options.config, - page: { - size: options.config.pagination.size, // same as searchQueryResponse.page.elementsPerPage - totalElements: options.searchQueryResponse.pageInfo.totalElements, - totalPages: options.searchQueryResponse.pageInfo.totalPages, - number: options.config.pagination.currentPage, // same as searchQueryResponse.page.currentPage - }, - sort: { - by: options.config.sort.field, - order: options.config.sort.direction - }, - filters: filters, - clickedObject: options.clickedObject, - }, - }; - } - - /** - * Track an event with given properties - * @param properties - */ - trackEvent(properties: any) { - this.angulartics2.eventTrack.next(properties); - } - - /** - * Get the UUID from a DSO url - * Return null if the url isn't an object page (allowedObjectPaths) or the UUID couldn't be found - * @param url - */ - getDsoUUIDFromUrl(url: string): string { - if (isNotEmpty(url)) { - if (this.allowedObjectPaths.some((path) => url.startsWith(`/${path}`))) { - const uuid = url.substring(url.lastIndexOf('/') + 1); - if (uuid.match(this.uuidRegex)) { - return uuid; - } - } - } - return null; - } - - ngOnDestroy() { - super.ngOnDestroy(); - this.subs.filter((sub) => hasValue(sub)).forEach((sub) => sub.unsubscribe()); - } -} diff --git a/src/app/shared/search/search.component.ts b/src/app/shared/search/search.component.ts index 2abd5290cb..1d1a6a5f2f 100644 --- a/src/app/shared/search/search.component.ts +++ b/src/app/shared/search/search.component.ts @@ -1,8 +1,8 @@ import { ChangeDetectionStrategy, Component, EventEmitter, Inject, Input, OnInit, Output } from '@angular/core'; -import { Router } from '@angular/router'; +import { NavigationStart, Router } from '@angular/router'; import { BehaviorSubject, combineLatest, Observable, Subscription } from 'rxjs'; -import { debounceTime, distinctUntilChanged, filter, map, switchMap } from 'rxjs/operators'; +import { debounceTime, distinctUntilChanged, filter, map, switchMap, take } from 'rxjs/operators'; import { uniqueId } from 'lodash'; import { PaginatedList } from '../../core/data/paginated-list.model'; @@ -11,7 +11,7 @@ import { DSpaceObject } from '../../core/shared/dspace-object.model'; import { pushInOut } from '../animations/push'; import { HostWindowService } from '../host-window.service'; import { SidebarService } from '../sidebar/sidebar.service'; -import { hasValue } from '../empty.util'; +import { hasValue, hasValueOperator, isNotEmpty } from '../empty.util'; import { RouteService } from '../../core/services/route.service'; import { SEARCH_CONFIG_SERVICE } from '../../my-dspace-page/my-dspace-page.component'; import { PaginatedSearchOptions } from './models/paginated-search-options.model'; @@ -34,6 +34,9 @@ import { CollectionElementLinkType } from '../object-collection/collection-eleme import { environment } from 'src/environments/environment'; import { SubmissionObject } from '../../core/submission/models/submission-object.model'; import { SearchFilterConfig } from './models/search-filter-config.model'; +import { ITEM_MODULE_PATH } from '../../item-page/item-page-routing-paths'; +import { COLLECTION_MODULE_PATH } from '../../collection-page/collection-page-routing-paths'; +import { COMMUNITY_MODULE_PATH } from '../../community-page/community-page-routing-paths'; @Component({ selector: 'ds-search', @@ -218,9 +221,21 @@ export class SearchComponent implements OnInit { searchLink: string; /** - * Subscription to unsubscribe from + * Regex to match UUIDs */ - sub: Subscription; + uuidRegex = /\b[0-9a-f]{8}\b-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-\b[0-9a-f]{12}\b/g; + + /** + * List of paths that are considered to be the start of a route to an object page (excluding "/", e.g. "items") + * These are expected to end on an object UUID + * If they match the route we're navigating to, an object property will be added to the search event sent + */ + allowedObjectPaths: string[] = ['entities', ITEM_MODULE_PATH, COLLECTION_MODULE_PATH, COMMUNITY_MODULE_PATH]; + + /** + * Subscriptions to unsubscribe from + */ + subs: Subscription[] = []; /** * Emits an event with the current search result entries @@ -290,7 +305,7 @@ export class SearchComponent implements OnInit { ); const searchOptions$: Observable = this.getSearchOptions().pipe(distinctUntilChanged()); - this.sub = combineLatest([configuration$, searchSortOptions$, searchOptions$, sortOption$]).pipe( + this.subs.push(combineLatest([configuration$, searchSortOptions$, searchOptions$, sortOption$]).pipe( filter(([configuration, searchSortOptions, searchOptions, sortOption]: [string, SortOptions[], PaginatedSearchOptions, SortOptions]) => { // filter for search options related to instanced paginated id return searchOptions.pagination.id === this.paginationId; @@ -318,7 +333,9 @@ export class SearchComponent implements OnInit { this.retrieveSearchResults(newSearchOptions); this.retrieveFilters(searchOptions); } - }); + })); + + this.subscribeToRoutingEvents(); } /** @@ -360,12 +377,10 @@ export class SearchComponent implements OnInit { } /** - * Unsubscribe from the subscription + * Unsubscribe from the subscriptions */ ngOnDestroy(): void { - if (hasValue(this.sub)) { - this.sub.unsubscribe(); - } + this.subs.filter((sub) => hasValue(sub)).forEach((sub) => sub.unsubscribe()); } /** @@ -420,6 +435,43 @@ export class SearchComponent implements OnInit { }); } + /** + * Subscribe to routing events to detect when a user moves away from the search page + * When the user is routing to an object page, it needs to send out a separate search event containing that object's UUID + * This method should only be called once and is essentially what SearchTrackingComponent used to do (now removed) + * @private + */ + private subscribeToRoutingEvents() { + this.subs.push( + this.router.events.pipe( + filter((event) => event instanceof NavigationStart), + map((event: NavigationStart) => this.getDsoUUIDFromUrl(event.url)), + hasValueOperator(), + ).subscribe((uuid) => { + if (this.resultsRD$.value.hasSucceeded) { + this.service.trackSearch(this.searchOptions$.value, this.resultsRD$.value.payload as SearchObjects, uuid); + } + }), + ); + } + + /** + * Get the UUID from a DSO url + * Return null if the url isn't an object page (allowedObjectPaths) or the UUID couldn't be found + * @param url + */ + private getDsoUUIDFromUrl(url: string): string { + if (isNotEmpty(url)) { + if (this.allowedObjectPaths.some((path) => url.startsWith(`/${path}`))) { + const uuid = url.substring(url.lastIndexOf('/') + 1); + if (uuid.match(this.uuidRegex)) { + return uuid; + } + } + } + return null; + } + /** * Check if the sidebar is collapsed * @returns {Observable} emits true if the sidebar is currently collapsed, false if it is expanded From 540ce4d7c4454f47a06c79e48893430e90da4136 Mon Sep 17 00:00:00 2001 From: Kristof De Langhe Date: Thu, 11 May 2023 12:29:07 +0200 Subject: [PATCH 193/409] 100414: Rename object to clickedObject --- src/app/core/shared/search/search.service.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/app/core/shared/search/search.service.ts b/src/app/core/shared/search/search.service.ts index 2f3d3bd184..fc433d8dd8 100644 --- a/src/app/core/shared/search/search.service.ts +++ b/src/app/core/shared/search/search.service.ts @@ -334,9 +334,9 @@ export class SearchService implements OnDestroy { * Send search event to rest api using angularitics * @param config Paginated search options used * @param searchQueryResponse The response objects of the performed search - * @param object Optional UUID of an object a search was performed and clicked for + * @param clickedObject Optional UUID of an object a search was performed and clicked for */ - trackSearch(config: PaginatedSearchOptions, searchQueryResponse: SearchObjects, object?: string) { + trackSearch(config: PaginatedSearchOptions, searchQueryResponse: SearchObjects, clickedObject?: string) { const filters: { filter: string, operator: string, value: string, label: string; }[] = []; const appliedFilters = searchQueryResponse.appliedFilters || []; for (let i = 0, filtersLength = appliedFilters.length; i < filtersLength; i++) { @@ -358,7 +358,7 @@ export class SearchService implements OnDestroy { order: config.sort.direction }, filters: filters, - object, + clickedObject, }, }); } From e8ff0fbf3638f419a0673ccd7ab6838a53ebe88c Mon Sep 17 00:00:00 2001 From: Alban Imami Date: Thu, 11 May 2023 12:53:18 +0200 Subject: [PATCH 194/409] [CST-5729] implemented functionality to add link tags in head html section when on item page --- server.ts | 12 ++-- .../data/signposting-data.service.spec.ts | 16 +++++ src/app/core/data/signposting-data.service.ts | 52 ++++++++++++++ src/app/core/data/signposting-data.ts | 5 ++ .../core/dspace-rest/dspace-rest.service.ts | 15 +++- .../metadata-item.service.spec.ts | 16 ----- .../metadata-item/metadata-item.service.ts | 70 ------------------- src/app/core/metadata/metadata.service.ts | 56 ++++++++++++--- src/app/init.service.ts | 4 +- src/modules/app/browser-init.service.ts | 3 - src/modules/app/server-init.service.ts | 3 - 11 files changed, 139 insertions(+), 113 deletions(-) create mode 100644 src/app/core/data/signposting-data.service.spec.ts create mode 100644 src/app/core/data/signposting-data.service.ts create mode 100644 src/app/core/data/signposting-data.ts delete mode 100644 src/app/core/metadata-item/metadata-item.service.spec.ts delete mode 100644 src/app/core/metadata-item/metadata-item.service.ts diff --git a/server.ts b/server.ts index 5a3660e4de..b8796eb05d 100644 --- a/server.ts +++ b/server.ts @@ -180,14 +180,14 @@ export function app() { changeOrigin: true })); - /** + /** * Proxy the linksets */ - router.use('/linksets**', createProxyMiddleware({ - target: `${environment.rest.baseUrl}/linksets`, - pathRewrite: path => path.replace(environment.ui.nameSpace, '/'), - changeOrigin: true - })); + router.use('/linkset**', createProxyMiddleware({ + target: `${environment.rest.baseUrl}/signposting/linksets`, + pathRewrite: path => path.replace(environment.ui.nameSpace, '/'), + changeOrigin: true + })); /** * Checks if the rateLimiter property is present diff --git a/src/app/core/data/signposting-data.service.spec.ts b/src/app/core/data/signposting-data.service.spec.ts new file mode 100644 index 0000000000..45c0abb29b --- /dev/null +++ b/src/app/core/data/signposting-data.service.spec.ts @@ -0,0 +1,16 @@ +import { TestBed } from '@angular/core/testing'; + +import { SignpostingDataService } from './signposting-data.service'; + +describe('SignpostingDataService', () => { + let service: SignpostingDataService; + + beforeEach(() => { + TestBed.configureTestingModule({}); + service = TestBed.inject(SignpostingDataService); + }); + + it('should be created', () => { + expect(service).toBeTruthy(); + }); +}); diff --git a/src/app/core/data/signposting-data.service.ts b/src/app/core/data/signposting-data.service.ts new file mode 100644 index 0000000000..25bac49f17 --- /dev/null +++ b/src/app/core/data/signposting-data.service.ts @@ -0,0 +1,52 @@ +import { Injectable } from '@angular/core'; +import { DspaceRestService } from '../dspace-rest/dspace-rest.service'; +// import { HttpHeaders, HttpResponse } from '@angular/common/http'; +import { catchError, map } from 'rxjs/operators'; +// import { throwError } from 'rxjs'; +import { Observable, of as observableOf } from 'rxjs'; +import { HALEndpointService } from '../shared/hal-endpoint.service'; +import { RawRestResponse } from '../dspace-rest/raw-rest-response.model'; +import { HttpHeaders } from '@angular/common/http'; + +@Injectable({ + providedIn: 'root' +}) +export class SignpostingDataService { + + constructor(private restService: DspaceRestService, protected halService: HALEndpointService) { } + + getLinks(uuid: string): Observable { + const url = this.halService.getRootHref().split('/'); + const baseUrl = `${url[0]}//${url[2]}/${url[3]}`; + + return this.restService.get(`${baseUrl}/signposting/links/${uuid}`).pipe( + catchError((err ) => { + console.error(err); + return observableOf(false); + }), + map((res: RawRestResponse) => res) + ); + } + + getLinksets(uuid: string): Observable { + const url = this.halService.getRootHref().split('/'); + const baseUrl = `${url[0]}//${url[2]}/${url[3]}`; + + const requestOptions = { + observe: 'response' as any, + headers: new HttpHeaders({ + 'accept': 'application/linkset', + 'Content-Type': 'application/linkset' + }), + responseType: 'text' + } as any; + + return this.restService.getWithHeaders(`${baseUrl}/signposting/linksets/${uuid}`, requestOptions).pipe( + catchError((err ) => { + console.error(err); + return observableOf(false); + }), + map((res: RawRestResponse) => res) + ); + } +} diff --git a/src/app/core/data/signposting-data.ts b/src/app/core/data/signposting-data.ts new file mode 100644 index 0000000000..5734d324ec --- /dev/null +++ b/src/app/core/data/signposting-data.ts @@ -0,0 +1,5 @@ +export interface SignpostingDataLink { + href: string, + rel: string, + type: string +} diff --git a/src/app/core/dspace-rest/dspace-rest.service.ts b/src/app/core/dspace-rest/dspace-rest.service.ts index ea4e8c2831..737714869d 100644 --- a/src/app/core/dspace-rest/dspace-rest.service.ts +++ b/src/app/core/dspace-rest/dspace-rest.service.ts @@ -1,4 +1,4 @@ -import { Observable, throwError as observableThrowError } from 'rxjs'; +import { Observable, throwError as observableThrowError, throwError } from 'rxjs'; import { catchError, map } from 'rxjs/operators'; import { Injectable } from '@angular/core'; import { HttpClient, HttpHeaders, HttpParams, HttpResponse } from '@angular/common/http'; @@ -58,6 +58,19 @@ export class DspaceRestService { })); } + getWithHeaders(absoluteURL: string, reqOptions: any): Observable { + const requestOptions = reqOptions; + + return this.http.get(absoluteURL, requestOptions).pipe( + map((res) => ({ + payload: res + })), + catchError((err) => { + console.log('Error: ', err); + return throwError(() => new Error(err.error)); + })); + } + /** * Performs a request to the REST API. * diff --git a/src/app/core/metadata-item/metadata-item.service.spec.ts b/src/app/core/metadata-item/metadata-item.service.spec.ts deleted file mode 100644 index 89ca15658d..0000000000 --- a/src/app/core/metadata-item/metadata-item.service.spec.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { TestBed } from '@angular/core/testing'; - -import { MetadataItemService } from './metadata-item.service'; - -describe('MetadataItemService', () => { - let service: MetadataItemService; - - beforeEach(() => { - TestBed.configureTestingModule({}); - service = TestBed.inject(MetadataItemService); - }); - - it('should be created', () => { - expect(service).toBeTruthy(); - }); -}); diff --git a/src/app/core/metadata-item/metadata-item.service.ts b/src/app/core/metadata-item/metadata-item.service.ts deleted file mode 100644 index a4fbcf587b..0000000000 --- a/src/app/core/metadata-item/metadata-item.service.ts +++ /dev/null @@ -1,70 +0,0 @@ -import { Inject, Injectable } from '@angular/core'; -import { MetadataService } from '../metadata/metadata.service'; -import { ActivatedRoute, NavigationEnd, Event as NavigationEvent, NavigationStart, Router } from '@angular/router'; -import { TranslateService } from '@ngx-translate/core'; -import { Meta, Title } from '@angular/platform-browser'; -import { DSONameService } from '../breadcrumbs/dso-name.service'; -import { BundleDataService } from '../data/bundle-data.service'; -import { BitstreamDataService } from '../data/bitstream-data.service'; -import { BitstreamFormatDataService } from '../data/bitstream-format-data.service'; -import { RootDataService } from '../data/root-data.service'; -import { CoreState } from '../core-state.model'; -import { Store } from '@ngrx/store'; -import { HardRedirectService } from '../services/hard-redirect.service'; -import { APP_CONFIG, AppConfig } from 'src/config/app-config.interface'; -import { AuthorizationDataService } from '../data/feature-authorization/authorization-data.service'; -import { filter, map, switchMap, take, mergeMap } from 'rxjs/operators'; -import { DOCUMENT } from '@angular/common'; - -@Injectable({ - providedIn: 'root' -}) -export class MetadataItemService extends MetadataService { - - constructor( - private router1: ActivatedRoute, - router: Router, - translate: TranslateService, - meta: Meta, - title: Title, - dsoNameService: DSONameService, - bundleDataService: BundleDataService, - bitstreamDataService: BitstreamDataService, - bitstreamFormatDataService: BitstreamFormatDataService, - rootService: RootDataService, - store: Store, - hardRedirectService: HardRedirectService, - @Inject(APP_CONFIG) appConfig: AppConfig, - authorizationService: AuthorizationDataService, - @Inject(DOCUMENT) private document: Document - ) { - super(router, translate, meta, title, dsoNameService, bundleDataService, bitstreamDataService, bitstreamFormatDataService, rootService, store, hardRedirectService, appConfig, authorizationService); - } - - public checkCurrentRoute(){ - - console.log(this.router); - - this.router1.url.subscribe(url => { - console.log(url); - console.log(url[0].path); - }); - - // this.router.events.subscribe((event: NavigationEvent) => { - // if(event instanceof NavigationStart) { - // if(event.url.startsWith('/entities')){ - // console.log('We are on ENTITIES!'); - // } - // } - // }); - } - - setLinkTag(){ - this.clearMetaTags(); - - let link: HTMLLinkElement = this.document.createElement('link'); - link.setAttribute('rel', ''); - link.setAttribute('href', ''); - this.document.head.appendChild(link); - } -} diff --git a/src/app/core/metadata/metadata.service.ts b/src/app/core/metadata/metadata.service.ts index c46f8b1d6e..6d5ca91b8d 100644 --- a/src/app/core/metadata/metadata.service.ts +++ b/src/app/core/metadata/metadata.service.ts @@ -45,6 +45,7 @@ import { CoreState } from '../core-state.model'; import { AuthorizationDataService } from '../data/feature-authorization/authorization-data.service'; import { getDownloadableBitstream } from '../shared/bitstream.operators'; import { APP_CONFIG, AppConfig } from '../../../config/app-config.interface'; +import { SignpostingDataService } from '../data/signposting-data.service'; /** * The base selector function to select the metaTag section in the store @@ -96,7 +97,8 @@ export class MetadataService { private store: Store, private hardRedirectService: HardRedirectService, @Inject(APP_CONFIG) private appConfig: AppConfig, - private authorizationService: AuthorizationDataService + private authorizationService: AuthorizationDataService, + private signpostginDataService: SignpostingDataService ) { } @@ -138,7 +140,7 @@ export class MetadataService { } } - private getCurrentRoute(route: ActivatedRoute): ActivatedRoute { + public getCurrentRoute(route: ActivatedRoute): ActivatedRoute { while (route.firstChild) { route = route.firstChild; } @@ -162,6 +164,8 @@ export class MetadataService { this.setCitationAbstractUrlTag(); this.setCitationPdfUrlTag(); this.setCitationPublisherTag(); + this.setSignpostingLinks(); + this.setSignpostingLinksets(); if (this.isDissertation()) { this.setCitationDissertationNameTag(); @@ -184,6 +188,45 @@ export class MetadataService { } + /** + * Add to the + */ + private setSignpostingLinks() { + if (this.currentObject.value instanceof Item){ + const value = this.signpostginDataService.getLinks(this.currentObject.getValue().id); + value.subscribe(links => { + links.payload.forEach(link => { + this.setLinkTag(link.href, link.rel, link.type); + }); + }); + } + } + + setLinkTag(href: string, rel: string, type: string){ + let link: HTMLLinkElement = document.createElement('link'); + link.href = href; + link.rel = rel; + link.type = type; + document.head.appendChild(link); + console.log(link); + } + + private setSignpostingLinksets() { + if (this.currentObject.value instanceof Item){ + const value = this.signpostginDataService.getLinksets(this.currentObject.getValue().id); + value.subscribe(linksets => { + this.setLinkAttribute(linksets); + }); + } + } + + setLinkAttribute(linksets){ + console.log('ANDREA', linksets); + const linkAttribute = `Link: ${linksets.payload.body}`; + const textNode = document.createTextNode(linkAttribute); + document.head.appendChild(textNode); + } + /** * Add to the */ @@ -363,15 +406,6 @@ export class MetadataService { } } - /** - * Add to the - */ - // private setLinkTag(): void { - // const value = this.getMetaTagValue('dc.link'); - // this.meta.addTag({ name: 'Link', content: value }); - // this.addMetaTag('Link', value); - // } - getBitLinkIfDownloadable(bitstream: Bitstream, bitstreamRd: RemoteData>): Observable { return observableOf(bitstream).pipe( getDownloadableBitstream(this.authorizationService), diff --git a/src/app/init.service.ts b/src/app/init.service.ts index d5978d782d..2bbc589cc0 100644 --- a/src/app/init.service.ts +++ b/src/app/init.service.ts @@ -24,7 +24,6 @@ import { isAuthenticationBlocking } from './core/auth/selectors'; import { distinctUntilChanged, find } from 'rxjs/operators'; import { Observable } from 'rxjs'; import { MenuService } from './shared/menu/menu.service'; -import { MetadataItemService } from './core/metadata-item/metadata-item.service'; /** * Performs the initialization of the app. @@ -51,7 +50,6 @@ export abstract class InitService { protected localeService: LocaleService, protected angulartics2DSpace: Angulartics2DSpace, protected metadata: MetadataService, - protected metadataItem: MetadataItemService, protected breadcrumbsService: BreadcrumbsService, protected themeService: ThemeService, protected menuService: MenuService, @@ -190,7 +188,7 @@ export abstract class InitService { this.breadcrumbsService.listenForRouteChanges(); this.themeService.listenForRouteChanges(); this.menuService.listenForRouteChanges(); - this.metadataItem.checkCurrentRoute(); + // this.metadataItem.checkCurrentRoute(); } /** diff --git a/src/modules/app/browser-init.service.ts b/src/modules/app/browser-init.service.ts index f38883be1e..61d57f10f9 100644 --- a/src/modules/app/browser-init.service.ts +++ b/src/modules/app/browser-init.service.ts @@ -32,7 +32,6 @@ 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'; -import { MetadataItemService } from 'src/app/core/metadata-item/metadata-item.service'; /** * Performs client-side initialization. @@ -52,7 +51,6 @@ export class BrowserInitService extends InitService { protected angulartics2DSpace: Angulartics2DSpace, protected googleAnalyticsService: GoogleAnalyticsService, protected metadata: MetadataService, - protected metadataItem: MetadataItemService, protected breadcrumbsService: BreadcrumbsService, protected klaroService: KlaroService, protected authService: AuthService, @@ -68,7 +66,6 @@ export class BrowserInitService extends InitService { localeService, angulartics2DSpace, metadata, - metadataItem, breadcrumbsService, themeService, menuService, diff --git a/src/modules/app/server-init.service.ts b/src/modules/app/server-init.service.ts index 074efc31e7..715f872cd9 100644 --- a/src/modules/app/server-init.service.ts +++ b/src/modules/app/server-init.service.ts @@ -21,7 +21,6 @@ import { BreadcrumbsService } from '../../app/breadcrumbs/breadcrumbs.service'; import { ThemeService } from '../../app/shared/theme-support/theme.service'; import { take } from 'rxjs/operators'; import { MenuService } from '../../app/shared/menu/menu.service'; -import { MetadataItemService } from 'src/app/core/metadata-item/metadata-item.service'; /** * Performs server-side initialization. @@ -37,7 +36,6 @@ export class ServerInitService extends InitService { protected localeService: LocaleService, protected angulartics2DSpace: Angulartics2DSpace, protected metadata: MetadataService, - protected metadataItem: MetadataItemService, protected breadcrumbsService: BreadcrumbsService, protected themeService: ThemeService, protected menuService: MenuService @@ -50,7 +48,6 @@ export class ServerInitService extends InitService { localeService, angulartics2DSpace, metadata, - metadataItem, breadcrumbsService, themeService, menuService, From 9ddd75dbdf2f3db1eafd4bd132ea5cdc6216d463 Mon Sep 17 00:00:00 2001 From: Adam Doan Date: Thu, 11 May 2023 11:50:28 +0000 Subject: [PATCH 195/409] Use more semantically appropriate elements and explicit names --- .../view-mode-switch.component.html | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/app/shared/view-mode-switch/view-mode-switch.component.html b/src/app/shared/view-mode-switch/view-mode-switch.component.html index 5f70bc699c..45d219eb91 100644 --- a/src/app/shared/view-mode-switch/view-mode-switch.component.html +++ b/src/app/shared/view-mode-switch/view-mode-switch.component.html @@ -1,5 +1,5 @@ From cc34e27c20db7947ea2be87f438fde1e4a827f2e Mon Sep 17 00:00:00 2001 From: Kristof De Langhe Date: Thu, 11 May 2023 13:56:54 +0200 Subject: [PATCH 196/409] 100414: test cases --- .../shared/search/search.component.spec.ts | 73 ++++++++++++++++++- 1 file changed, 69 insertions(+), 4 deletions(-) diff --git a/src/app/shared/search/search.component.spec.ts b/src/app/shared/search/search.component.spec.ts index 3f00cf354f..85d4111b78 100644 --- a/src/app/shared/search/search.component.spec.ts +++ b/src/app/shared/search/search.component.spec.ts @@ -13,7 +13,7 @@ import { PaginationComponentOptions } from '../pagination/pagination-component-o import { SearchComponent } from './search.component'; import { SearchService } from '../../core/shared/search/search.service'; import { NoopAnimationsModule } from '@angular/platform-browser/animations'; -import { ActivatedRoute } from '@angular/router'; +import { ActivatedRoute, NavigationStart } from '@angular/router'; import { By } from '@angular/platform-browser'; import { NgbCollapseModule } from '@ng-bootstrap/ng-bootstrap'; import { SidebarService } from '../sidebar/sidebar.service'; @@ -31,6 +31,10 @@ import { SearchObjects } from './models/search-objects.model'; import { DSpaceObject } from '../../core/shared/dspace-object.model'; import { SearchFilterConfig } from './models/search-filter-config.model'; import { FilterType } from './models/filter-type.model'; +import { createPaginatedList } from '../testing/utils.test'; +import { COMMUNITY_MODULE_PATH, getCommunityPageRoute } from '../../community-page/community-page-routing-paths'; +import { getCollectionPageRoute } from '../../collection-page/collection-page-routing-paths'; +import { getItemPageRoute } from '../../item-page/item-page-routing-paths'; let comp: SearchComponent; let fixture: ComponentFixture; @@ -101,8 +105,9 @@ const searchServiceStub = jasmine.createSpyObj('SearchService', { search: mockResultsRD$, getSearchLink: '/search', getScopes: observableOf(['test-scope']), - getSearchConfigurationFor: createSuccessfulRemoteDataObject$(searchConfig) -}); + getSearchConfigurationFor: createSuccessfulRemoteDataObject$(searchConfig), + trackSearch: {}, +}) as SearchService; const configurationParam = 'default'; const queryParam = 'test query'; const scopeParam = '7669c72a-3f2a-451f-a3b9-9210e7a4c02f'; @@ -237,7 +242,7 @@ export function configureSearchComponentTestingModule(compType, additionalDeclar }).compileComponents(); } -describe('SearchComponent', () => { +fdescribe('SearchComponent', () => { beforeEach(waitForAsync(() => { configureSearchComponentTestingModule(SearchComponent); })); @@ -327,4 +332,64 @@ describe('SearchComponent', () => { })); }); + + describe('getDsoUUIDFromUrl', () => { + let url: string; + let result: string; + + describe('when the navigated URL is an entity route', () => { + beforeEach(() => { + url = '/entities/publication/9a364471-3f19-4e7b-916a-a24a44ff48e3'; + result = (comp as any).getDsoUUIDFromUrl(url); + }); + + it('should return the UUID', () => { + expect(result).toEqual('9a364471-3f19-4e7b-916a-a24a44ff48e3'); + }); + }); + + describe('when the navigated URL is a community route', () => { + beforeEach(() => { + url = `${getCommunityPageRoute('9a364471-3f19-4e7b-916a-a24a44ff48e3')}`; + result = (comp as any).getDsoUUIDFromUrl(url); + }); + + it('should return the UUID', () => { + expect(result).toEqual('9a364471-3f19-4e7b-916a-a24a44ff48e3'); + }); + }); + + describe('when the navigated URL is a collection route', () => { + beforeEach(() => { + url = `${getCollectionPageRoute('9a364471-3f19-4e7b-916a-a24a44ff48e3')}`; + result = (comp as any).getDsoUUIDFromUrl(url); + }); + + it('should return the UUID', () => { + expect(result).toEqual('9a364471-3f19-4e7b-916a-a24a44ff48e3'); + }); + }); + + describe('when the navigated URL is an item route', () => { + beforeEach(() => { + url = '/items/9a364471-3f19-4e7b-916a-a24a44ff48e3'; + result = (comp as any).getDsoUUIDFromUrl(url); + }); + + it('should return the UUID', () => { + expect(result).toEqual('9a364471-3f19-4e7b-916a-a24a44ff48e3'); + }); + }); + + describe('when the navigated URL is an invalid route', () => { + beforeEach(() => { + url = '/invalid/object/route/9a364471-3f19-4e7b-916a-a24a44ff48e3'; + result = (comp as any).getDsoUUIDFromUrl(url); + }); + + it('should return null', () => { + expect(result).toBeNull(); + }); + }); + }); }); From 6675b61f81220b8ee46566182567f0bf764accb8 Mon Sep 17 00:00:00 2001 From: Kristof De Langhe Date: Thu, 11 May 2023 13:56:54 +0200 Subject: [PATCH 197/409] 100414: test cases --- .../shared/search/search.component.spec.ts | 73 ++++++++++++++++++- 1 file changed, 69 insertions(+), 4 deletions(-) diff --git a/src/app/shared/search/search.component.spec.ts b/src/app/shared/search/search.component.spec.ts index 3f00cf354f..85d4111b78 100644 --- a/src/app/shared/search/search.component.spec.ts +++ b/src/app/shared/search/search.component.spec.ts @@ -13,7 +13,7 @@ import { PaginationComponentOptions } from '../pagination/pagination-component-o import { SearchComponent } from './search.component'; import { SearchService } from '../../core/shared/search/search.service'; import { NoopAnimationsModule } from '@angular/platform-browser/animations'; -import { ActivatedRoute } from '@angular/router'; +import { ActivatedRoute, NavigationStart } from '@angular/router'; import { By } from '@angular/platform-browser'; import { NgbCollapseModule } from '@ng-bootstrap/ng-bootstrap'; import { SidebarService } from '../sidebar/sidebar.service'; @@ -31,6 +31,10 @@ import { SearchObjects } from './models/search-objects.model'; import { DSpaceObject } from '../../core/shared/dspace-object.model'; import { SearchFilterConfig } from './models/search-filter-config.model'; import { FilterType } from './models/filter-type.model'; +import { createPaginatedList } from '../testing/utils.test'; +import { COMMUNITY_MODULE_PATH, getCommunityPageRoute } from '../../community-page/community-page-routing-paths'; +import { getCollectionPageRoute } from '../../collection-page/collection-page-routing-paths'; +import { getItemPageRoute } from '../../item-page/item-page-routing-paths'; let comp: SearchComponent; let fixture: ComponentFixture; @@ -101,8 +105,9 @@ const searchServiceStub = jasmine.createSpyObj('SearchService', { search: mockResultsRD$, getSearchLink: '/search', getScopes: observableOf(['test-scope']), - getSearchConfigurationFor: createSuccessfulRemoteDataObject$(searchConfig) -}); + getSearchConfigurationFor: createSuccessfulRemoteDataObject$(searchConfig), + trackSearch: {}, +}) as SearchService; const configurationParam = 'default'; const queryParam = 'test query'; const scopeParam = '7669c72a-3f2a-451f-a3b9-9210e7a4c02f'; @@ -237,7 +242,7 @@ export function configureSearchComponentTestingModule(compType, additionalDeclar }).compileComponents(); } -describe('SearchComponent', () => { +fdescribe('SearchComponent', () => { beforeEach(waitForAsync(() => { configureSearchComponentTestingModule(SearchComponent); })); @@ -327,4 +332,64 @@ describe('SearchComponent', () => { })); }); + + describe('getDsoUUIDFromUrl', () => { + let url: string; + let result: string; + + describe('when the navigated URL is an entity route', () => { + beforeEach(() => { + url = '/entities/publication/9a364471-3f19-4e7b-916a-a24a44ff48e3'; + result = (comp as any).getDsoUUIDFromUrl(url); + }); + + it('should return the UUID', () => { + expect(result).toEqual('9a364471-3f19-4e7b-916a-a24a44ff48e3'); + }); + }); + + describe('when the navigated URL is a community route', () => { + beforeEach(() => { + url = `${getCommunityPageRoute('9a364471-3f19-4e7b-916a-a24a44ff48e3')}`; + result = (comp as any).getDsoUUIDFromUrl(url); + }); + + it('should return the UUID', () => { + expect(result).toEqual('9a364471-3f19-4e7b-916a-a24a44ff48e3'); + }); + }); + + describe('when the navigated URL is a collection route', () => { + beforeEach(() => { + url = `${getCollectionPageRoute('9a364471-3f19-4e7b-916a-a24a44ff48e3')}`; + result = (comp as any).getDsoUUIDFromUrl(url); + }); + + it('should return the UUID', () => { + expect(result).toEqual('9a364471-3f19-4e7b-916a-a24a44ff48e3'); + }); + }); + + describe('when the navigated URL is an item route', () => { + beforeEach(() => { + url = '/items/9a364471-3f19-4e7b-916a-a24a44ff48e3'; + result = (comp as any).getDsoUUIDFromUrl(url); + }); + + it('should return the UUID', () => { + expect(result).toEqual('9a364471-3f19-4e7b-916a-a24a44ff48e3'); + }); + }); + + describe('when the navigated URL is an invalid route', () => { + beforeEach(() => { + url = '/invalid/object/route/9a364471-3f19-4e7b-916a-a24a44ff48e3'; + result = (comp as any).getDsoUUIDFromUrl(url); + }); + + it('should return null', () => { + expect(result).toBeNull(); + }); + }); + }); }); From f5b7bea3ec7fb17e15cab82ee1d37918594c3813 Mon Sep 17 00:00:00 2001 From: Kristof De Langhe Date: Thu, 11 May 2023 14:08:05 +0200 Subject: [PATCH 198/409] 100414: Lint fixes --- src/app/shared/search/search.component.spec.ts | 6 ++---- src/app/shared/search/search.component.ts | 2 +- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/src/app/shared/search/search.component.spec.ts b/src/app/shared/search/search.component.spec.ts index 85d4111b78..ff849a17d2 100644 --- a/src/app/shared/search/search.component.spec.ts +++ b/src/app/shared/search/search.component.spec.ts @@ -13,7 +13,7 @@ import { PaginationComponentOptions } from '../pagination/pagination-component-o import { SearchComponent } from './search.component'; import { SearchService } from '../../core/shared/search/search.service'; import { NoopAnimationsModule } from '@angular/platform-browser/animations'; -import { ActivatedRoute, NavigationStart } from '@angular/router'; +import { ActivatedRoute } from '@angular/router'; import { By } from '@angular/platform-browser'; import { NgbCollapseModule } from '@ng-bootstrap/ng-bootstrap'; import { SidebarService } from '../sidebar/sidebar.service'; @@ -31,10 +31,8 @@ import { SearchObjects } from './models/search-objects.model'; import { DSpaceObject } from '../../core/shared/dspace-object.model'; import { SearchFilterConfig } from './models/search-filter-config.model'; import { FilterType } from './models/filter-type.model'; -import { createPaginatedList } from '../testing/utils.test'; -import { COMMUNITY_MODULE_PATH, getCommunityPageRoute } from '../../community-page/community-page-routing-paths'; +import { getCommunityPageRoute } from '../../community-page/community-page-routing-paths'; import { getCollectionPageRoute } from '../../collection-page/collection-page-routing-paths'; -import { getItemPageRoute } from '../../item-page/item-page-routing-paths'; let comp: SearchComponent; let fixture: ComponentFixture; diff --git a/src/app/shared/search/search.component.ts b/src/app/shared/search/search.component.ts index 1d1a6a5f2f..e376c4c429 100644 --- a/src/app/shared/search/search.component.ts +++ b/src/app/shared/search/search.component.ts @@ -2,7 +2,7 @@ import { ChangeDetectionStrategy, Component, EventEmitter, Inject, Input, OnInit import { NavigationStart, Router } from '@angular/router'; import { BehaviorSubject, combineLatest, Observable, Subscription } from 'rxjs'; -import { debounceTime, distinctUntilChanged, filter, map, switchMap, take } from 'rxjs/operators'; +import { debounceTime, distinctUntilChanged, filter, map, switchMap } from 'rxjs/operators'; import { uniqueId } from 'lodash'; import { PaginatedList } from '../../core/data/paginated-list.model'; From c306dfd30927e5bf0f9881f26b51ca64f0498cd5 Mon Sep 17 00:00:00 2001 From: Kristof De Langhe Date: Thu, 11 May 2023 14:10:20 +0200 Subject: [PATCH 199/409] 100414: remove fdescribe --- src/app/shared/search/search.component.spec.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/shared/search/search.component.spec.ts b/src/app/shared/search/search.component.spec.ts index ff849a17d2..d0d9bdda86 100644 --- a/src/app/shared/search/search.component.spec.ts +++ b/src/app/shared/search/search.component.spec.ts @@ -240,7 +240,7 @@ export function configureSearchComponentTestingModule(compType, additionalDeclar }).compileComponents(); } -fdescribe('SearchComponent', () => { +describe('SearchComponent', () => { beforeEach(waitForAsync(() => { configureSearchComponentTestingModule(SearchComponent); })); From bd9f70acc8993912a368fd6f822cdfebc15b3b75 Mon Sep 17 00:00:00 2001 From: Adam Doan Date: Thu, 11 May 2023 12:57:44 +0000 Subject: [PATCH 200/409] Update tests --- .../view-mode-switch/view-mode-switch.component.spec.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/app/shared/view-mode-switch/view-mode-switch.component.spec.ts b/src/app/shared/view-mode-switch/view-mode-switch.component.spec.ts index 5780ea5cf3..248a843316 100644 --- a/src/app/shared/view-mode-switch/view-mode-switch.component.spec.ts +++ b/src/app/shared/view-mode-switch/view-mode-switch.component.spec.ts @@ -61,7 +61,7 @@ describe('ViewModeSwitchComponent', () => { searchService.setViewMode(ViewMode.ListElement); tick(); fixture.detectChanges(); - const debugElements = fixture.debugElement.queryAll(By.css('a')); + const debugElements = fixture.debugElement.queryAll(By.css('button')); listButton = debugElements[0].nativeElement; gridButton = debugElements[1].nativeElement; })); @@ -96,7 +96,7 @@ describe('ViewModeSwitchComponent', () => { searchService.setViewMode(ViewMode.ListElement); tick(); fixture.detectChanges(); - const debugElements = fixture.debugElement.queryAll(By.css('a')); + const debugElements = fixture.debugElement.queryAll(By.css('button')); listButton = debugElements[0].nativeElement; detailButton = debugElements[1].nativeElement; })); From a6897e9a6de8e2a1e1b7236453e83294ca03ccdb Mon Sep 17 00:00:00 2001 From: Enea Jahollari Date: Thu, 11 May 2023 15:01:12 +0200 Subject: [PATCH 201/409] [CST-9639] Validation, translations and style fixes --- .../collection-access-control.component.html | 2 +- .../community-access-control.component.html | 2 +- .../item-access-control.component.html | 2 +- .../access-control-array-form.component.html | 2 +- .../access-control-array-form.component.ts | 7 +++++++ .../access-control-form-container.component.html | 14 +++++++++----- .../access-control-form-container.component.ts | 15 ++++++++++++--- .../bulk-access-control.service.ts | 13 ++++++++----- ...control-select-bitstreams-modal.component.html | 8 +++++--- src/assets/i18n/en.json5 | 9 +++++---- 10 files changed, 50 insertions(+), 24 deletions(-) diff --git a/src/app/collection-page/edit-collection-page/collection-access-control/collection-access-control.component.html b/src/app/collection-page/edit-collection-page/collection-access-control/collection-access-control.component.html index c53bf9c6ac..4e957cf867 100644 --- a/src/app/collection-page/edit-collection-page/collection-access-control/collection-access-control.component.html +++ b/src/app/collection-page/edit-collection-page/collection-access-control/collection-access-control.component.html @@ -1,7 +1,7 @@ -

    {{'collection-access-control-title' | translate}}

    diff --git a/src/app/community-page/edit-community-page/community-access-control/community-access-control.component.html b/src/app/community-page/edit-community-page/community-access-control/community-access-control.component.html index 89999955eb..b4f2123b86 100644 --- a/src/app/community-page/edit-community-page/community-access-control/community-access-control.component.html +++ b/src/app/community-page/edit-community-page/community-access-control/community-access-control.component.html @@ -1,6 +1,6 @@ -

    {{'community-access-control-title' | translate }}

    diff --git a/src/app/item-page/edit-item-page/item-access-control/item-access-control.component.html b/src/app/item-page/edit-item-page/item-access-control/item-access-control.component.html index 7bef310717..782e24fa2d 100644 --- a/src/app/item-page/edit-item-page/item-access-control/item-access-control.component.html +++ b/src/app/item-page/edit-item-page/item-access-control/item-access-control.component.html @@ -1,6 +1,6 @@ -

    {{ 'item-access-control-title' | translate }}

    diff --git a/src/app/shared/access-control-form-container/access-control-array-form/access-control-array-form.component.html b/src/app/shared/access-control-form-container/access-control-array-form/access-control-array-form.component.html index 9b1f018ffb..71f327423f 100644 --- a/src/app/shared/access-control-form-container/access-control-array-form/access-control-array-form.component.html +++ b/src/app/shared/access-control-form-container/access-control-array-form/access-control-array-form.component.html @@ -1,5 +1,5 @@ -
    +
    {{'access-control-no-access-conditions-warning-message' | translate}}
    diff --git a/src/app/shared/access-control-form-container/access-control-array-form/access-control-array-form.component.ts b/src/app/shared/access-control-form-container/access-control-array-form/access-control-array-form.component.ts index 1e978d9aa9..d4cd923128 100644 --- a/src/app/shared/access-control-form-container/access-control-array-form/access-control-array-form.component.ts +++ b/src/app/shared/access-control-form-container/access-control-array-form/access-control-array-form.component.ts @@ -34,6 +34,13 @@ export class AccessControlArrayFormComponent implements OnInit, OnDestroy { return this.form.get('accessControl') as FormArray; } + get allControlsAreEmpty() { + if (this.accessControl.length === 0) { + return true; + } + return this.accessControl.value.every(x => x.itemName === null || x.itemName === ''); + } + /** * Add a new access control item to the form. * Start and end date are disabled by default. diff --git a/src/app/shared/access-control-form-container/access-control-form-container.component.html b/src/app/shared/access-control-form-container/access-control-form-container.component.html index 5e5c8311c4..a5965839c1 100644 --- a/src/app/shared/access-control-form-container/access-control-form-container.component.html +++ b/src/app/shared/access-control-form-container/access-control-form-container.component.html @@ -1,7 +1,11 @@
    -
    +
    - + +
    @@ -75,7 +79,7 @@
    - @@ -85,9 +89,9 @@ diff --git a/src/app/shared/access-control-form-container/access-control-form-container.component.ts b/src/app/shared/access-control-form-container/access-control-form-container.component.ts index 7e46a53ed5..f27fb4b5f0 100644 --- a/src/app/shared/access-control-form-container/access-control-form-container.component.ts +++ b/src/app/shared/access-control-form-container/access-control-form-container.component.ts @@ -16,6 +16,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'; @Component({ selector: 'ds-access-control-form-container', @@ -30,6 +31,11 @@ export class AccessControlFormContainerComponent impleme */ @Input() showLimitToSpecificBitstreams = false; + /** + * The title message of the access control form (translate key) + */ + @Input() titleMessage = ''; + /** * The item to which the access control form applies */ @@ -45,6 +51,8 @@ export class AccessControlFormContainerComponent impleme @ViewChild('bitstreamAccessCmp', { static: true }) bitstreamAccessCmp: AccessControlArrayFormComponent; @ViewChild('itemAccessCmp', { static: true }) itemAccessCmp: AccessControlArrayFormComponent; + readonly AlertType = AlertType; + constructor( private bulkAccessConfigService: BulkAccessConfigDataService, private bulkAccessControlService: BulkAccessControlService, @@ -145,18 +153,19 @@ export class AccessControlFormContainerComponent impleme ngOnDestroy(): void { this.selectableListService.deselectAll(ITEM_ACCESS_CONTROL_SELECT_BITSTREAMS_LIST_ID); } + } const initialState: AccessControlFormState = { item: { toggleStatus: false, - accessMode: '', + accessMode: 'replace', }, bitstream: { toggleStatus: false, - accessMode: '', - changesLimit: '', // 'all' | 'selected' + accessMode: 'replace', + changesLimit: 'all', // 'all' | 'selected' selectedBitstreams: [] as ListableObject[], }, }; diff --git a/src/app/shared/access-control-form-container/bulk-access-control.service.ts b/src/app/shared/access-control-form-container/bulk-access-control.service.ts index 77fbcbffb2..057a64906f 100644 --- a/src/app/shared/access-control-form-container/bulk-access-control.service.ts +++ b/src/app/shared/access-control-form-container/bulk-access-control.service.ts @@ -43,22 +43,25 @@ export class BulkAccessControlService { } export const convertToBulkAccessControlFileModel = (payload: { state: AccessControlFormState, bitstreamAccess: AccessCondition[], itemAccess: AccessCondition[] }): BulkAccessControlFileModel => { + const itemEnabled = payload.state.item.toggleStatus; + const bitstreamEnabled = payload.state.bitstream.toggleStatus; + const constraints = { uuid: [] }; - if (payload.state.bitstream.changesLimit === 'selected') { + if (bitstreamEnabled && payload.state.bitstream.changesLimit === 'selected') { // @ts-ignore constraints.uuid = payload.state.bitstream.selectedBitstreams.map((x) => x.id); } return { item: { - mode: payload.state.item.accessMode, - accessConditions: payload.itemAccess + mode: itemEnabled ? payload.state.item.accessMode : '', + accessConditions: itemEnabled ? payload.itemAccess : [] }, bitstream: { constraints, - mode: payload.state.bitstream.accessMode, - accessConditions: payload.bitstreamAccess + mode: bitstreamEnabled ? payload.state.bitstream.accessMode : '', + accessConditions: bitstreamEnabled ? payload.bitstreamAccess : [] } }; }; diff --git a/src/app/shared/access-control-form-container/item-access-control-select-bitstreams-modal/item-access-control-select-bitstreams-modal.component.html b/src/app/shared/access-control-form-container/item-access-control-select-bitstreams-modal/item-access-control-select-bitstreams-modal.component.html index e4159f3505..8cf0ecea38 100644 --- a/src/app/shared/access-control-form-container/item-access-control-select-bitstreams-modal/item-access-control-select-bitstreams-modal.component.html +++ b/src/app/shared/access-control-form-container/item-access-control-select-bitstreams-modal/item-access-control-select-bitstreams-modal.component.html @@ -1,5 +1,7 @@ diff --git a/src/assets/i18n/en.json5 b/src/assets/i18n/en.json5 index 00f2bd46b0..315b0e03fc 100644 --- a/src/assets/i18n/en.json5 +++ b/src/assets/i18n/en.json5 @@ -5326,7 +5326,7 @@ "admin.system-wide-alert.title": "System-wide Alerts", - "item-access-control-title": "This form allows you to perform changes to the access condition of all the items owned by collection under this community. Changes can be performed on the access condition for the metadata (item) or for the content (bitstream).", + "item-access-control-title": "This form allows you to perform changes to the access condition of all the item's metadata and all its bitstreams.", "collection-access-control-title": "This form allows you to perform changes to the access condition of all the items owned by collection under this community. Changes can be performed on the access condition for the metadata (item) or for the content (bitstream).", "community-access-control-title": "This form allows you to perform changes to the access condition of all the items owned by collection under this community. Changes can be performed on the access condition for the metadata (item) or for the content (bitstream).", "access-control-item-header-toggle": "Item's Metadata", @@ -5341,8 +5341,9 @@ "access-control-bitstreams-selected": "bitstreams selected", "access-control-reset": "Reset", "access-control-execute": "Execute", - "access-control-add-more": "Add more" - - + "access-control-add-more": "Add more", + "access-control-select-bitstreams-modal.title": "Select bitstreams", + "access-control-select-bitstreams-modal.no-items": "No items to show.", + "access-control-select-bitstreams-modal.close": "Close" } From fe8bbddac25a40be99193a98232c1bf8ba334968 Mon Sep 17 00:00:00 2001 From: Giuseppe Digilio Date: Thu, 11 May 2023 15:05:35 +0200 Subject: [PATCH 202/409] [CST-5729] Fix proxying for signposting --- server.ts | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/server.ts b/server.ts index b8796eb05d..282b1ce29a 100644 --- a/server.ts +++ b/server.ts @@ -26,7 +26,6 @@ import * as ejs from 'ejs'; import * as compression from 'compression'; import * as expressStaticGzip from 'express-static-gzip'; /* eslint-enable import/no-namespace */ - import axios from 'axios'; import LRU from 'lru-cache'; import isbot from 'isbot'; @@ -34,7 +33,7 @@ import { createCertificate } from 'pem'; import { createServer } from 'https'; import { json } from 'body-parser'; -import { existsSync, readFileSync } from 'fs'; +import { readFileSync } from 'fs'; import { join } from 'path'; import { enableProdMode } from '@angular/core'; @@ -183,8 +182,8 @@ export function app() { /** * Proxy the linksets */ - router.use('/linkset**', createProxyMiddleware({ - target: `${environment.rest.baseUrl}/signposting/linksets`, + router.use('/links**', createProxyMiddleware({ + target: `${environment.rest.baseUrl}/signposting`, pathRewrite: path => path.replace(environment.ui.nameSpace, '/'), changeOrigin: true })); From 558f8f51fb8cd6a8a0d6547b1c660e5f1d8fc917 Mon Sep 17 00:00:00 2001 From: Alban Imami Date: Thu, 11 May 2023 18:47:01 +0200 Subject: [PATCH 203/409] [CST-5729] Implemented functionality to add Links in Response Headers on Item Page --- src/app/core/data/signposting-data.service.ts | 10 +++--- src/app/core/metadata/metadata.service.ts | 32 ++++++++++--------- .../services/server-hard-redirect.service.ts | 12 +++++++ .../core/services/server-response.service.ts | 6 ++++ .../full/full-item-page.component.ts | 8 +++-- .../item-page/simple/item-page.component.ts | 11 ++++++- 6 files changed, 55 insertions(+), 24 deletions(-) diff --git a/src/app/core/data/signposting-data.service.ts b/src/app/core/data/signposting-data.service.ts index 25bac49f17..0ef2b49f0f 100644 --- a/src/app/core/data/signposting-data.service.ts +++ b/src/app/core/data/signposting-data.service.ts @@ -16,8 +16,7 @@ export class SignpostingDataService { constructor(private restService: DspaceRestService, protected halService: HALEndpointService) { } getLinks(uuid: string): Observable { - const url = this.halService.getRootHref().split('/'); - const baseUrl = `${url[0]}//${url[2]}/${url[3]}`; + const baseUrl = this.halService.getRootHref().replace('/api', ''); return this.restService.get(`${baseUrl}/signposting/links/${uuid}`).pipe( catchError((err ) => { @@ -28,9 +27,8 @@ export class SignpostingDataService { ); } - getLinksets(uuid: string): Observable { - const url = this.halService.getRootHref().split('/'); - const baseUrl = `${url[0]}//${url[2]}/${url[3]}`; + getLinksets(uuid: string): Observable { + const baseUrl = this.halService.getRootHref().replace('/api', ''); const requestOptions = { observe: 'response' as any, @@ -46,7 +44,7 @@ export class SignpostingDataService { console.error(err); return observableOf(false); }), - map((res: RawRestResponse) => res) + map((res: RawRestResponse) => res.payload.body) ); } } diff --git a/src/app/core/metadata/metadata.service.ts b/src/app/core/metadata/metadata.service.ts index 6d5ca91b8d..3cc678fb15 100644 --- a/src/app/core/metadata/metadata.service.ts +++ b/src/app/core/metadata/metadata.service.ts @@ -165,7 +165,6 @@ export class MetadataService { this.setCitationPdfUrlTag(); this.setCitationPublisherTag(); this.setSignpostingLinks(); - this.setSignpostingLinksets(); if (this.isDissertation()) { this.setCitationDissertationNameTag(); @@ -211,21 +210,24 @@ export class MetadataService { console.log(link); } - private setSignpostingLinksets() { - if (this.currentObject.value instanceof Item){ - const value = this.signpostginDataService.getLinksets(this.currentObject.getValue().id); - value.subscribe(linksets => { - this.setLinkAttribute(linksets); - }); - } - } + // public setSignpostingLinksets(itemId: string) { + // let linkSet: string; - setLinkAttribute(linksets){ - console.log('ANDREA', linksets); - const linkAttribute = `Link: ${linksets.payload.body}`; - const textNode = document.createTextNode(linkAttribute); - document.head.appendChild(textNode); - } + // const value = this.signpostginDataService.getLinksets(itemId); + + // value.subscribe(linksets => { + // linkSet = linksets.payload.body; + // }); + + // return linkSet; + // } + + // setLinkAttribute(linksets){ + // console.log('ANDREA', linksets); + // const linkAttribute = `Link: ${linksets.payload.body}`; + // const textNode = document.createTextNode(linkAttribute); + // document.head.appendChild(textNode); + // } /** * Add to the diff --git a/src/app/core/services/server-hard-redirect.service.ts b/src/app/core/services/server-hard-redirect.service.ts index 94b9ed6198..a6c0e09aee 100644 --- a/src/app/core/services/server-hard-redirect.service.ts +++ b/src/app/core/services/server-hard-redirect.service.ts @@ -2,6 +2,9 @@ import { Inject, Injectable } from '@angular/core'; import { Request, Response } from 'express'; import { REQUEST, RESPONSE } from '@nguniversal/express-engine/tokens'; import { HardRedirectService } from './hard-redirect.service'; +import { SignpostingDataService } from '../data/signposting-data.service'; +import { ActivatedRoute } from '@angular/router'; +import { take } from 'rxjs'; /** * Service for performing hard redirects within the server app module @@ -12,6 +15,8 @@ export class ServerHardRedirectService extends HardRedirectService { constructor( @Inject(REQUEST) protected req: Request, @Inject(RESPONSE) protected res: Response, + private signpostginDataService: SignpostingDataService, + protected route: ActivatedRoute ) { super(); } @@ -46,6 +51,13 @@ export class ServerHardRedirectService extends HardRedirectService { } console.log(`Redirecting from ${this.req.url} to ${url} with ${status}`); + + this.route.params.subscribe(params => { + this.signpostginDataService.getLinksets(params.id).pipe(take(1)).subscribe(linksets => { + this.res.setHeader('Link', linksets); + }); + }); + this.res.redirect(status, url); this.res.end(); // I haven't found a way to correctly stop Angular rendering. diff --git a/src/app/core/services/server-response.service.ts b/src/app/core/services/server-response.service.ts index 02e00446bc..6dd50506e9 100644 --- a/src/app/core/services/server-response.service.ts +++ b/src/app/core/services/server-response.service.ts @@ -35,4 +35,10 @@ export class ServerResponseService { setInternalServerError(message = 'Internal Server Error'): this { return this.setStatus(500, message); } + + setLinksetsHeader(linksets: string){ + if (this.response) { + this.response.setHeader('Link', linksets); + } + } } diff --git a/src/app/item-page/full/full-item-page.component.ts b/src/app/item-page/full/full-item-page.component.ts index 118e436004..44766bac7b 100644 --- a/src/app/item-page/full/full-item-page.component.ts +++ b/src/app/item-page/full/full-item-page.component.ts @@ -16,6 +16,8 @@ import { hasValue } from '../../shared/empty.util'; import { AuthService } from '../../core/auth/auth.service'; import { Location } from '@angular/common'; import { AuthorizationDataService } from '../../core/data/feature-authorization/authorization-data.service'; +import { ServerResponseService } from 'src/app/core/services/server-response.service'; +import { SignpostingDataService } from 'src/app/core/data/signposting-data.service'; /** @@ -48,8 +50,10 @@ export class FullItemPageComponent extends ItemPageComponent implements OnInit, items: ItemDataService, authService: AuthService, authorizationService: AuthorizationDataService, - private _location: Location) { - super(route, router, items, authService, authorizationService); + private _location: Location, + responseService: ServerResponseService, + signpostginDataService: SignpostingDataService) { + super(route, router, items, authService, authorizationService, responseService, signpostginDataService); } /*** AoT inheritance fix, will hopefully be resolved in the near future **/ diff --git a/src/app/item-page/simple/item-page.component.ts b/src/app/item-page/simple/item-page.component.ts index 6e0db386db..058cbc667a 100644 --- a/src/app/item-page/simple/item-page.component.ts +++ b/src/app/item-page/simple/item-page.component.ts @@ -15,6 +15,8 @@ import { getItemPageRoute } from '../item-page-routing-paths'; import { redirectOn4xx } from '../../core/shared/authorized.operators'; import { AuthorizationDataService } from '../../core/data/feature-authorization/authorization-data.service'; import { FeatureID } from '../../core/data/feature-authorization/feature-id'; +import { ServerResponseService } from '../../core/services/server-response.service'; +import { SignpostingDataService } from '../../core/data/signposting-data.service'; /** * This component renders a simple item page. @@ -62,8 +64,15 @@ export class ItemPageComponent implements OnInit { private router: Router, private items: ItemDataService, private authService: AuthService, - private authorizationService: AuthorizationDataService + private authorizationService: AuthorizationDataService, + private responseService: ServerResponseService, + private signpostginDataService: SignpostingDataService ) { + this.route.params.subscribe(params => { + this.signpostginDataService.getLinksets(params.id).subscribe(linksets => { + this.responseService.setLinksetsHeader(linksets); + }); + }); } /** From 8e5c4a73dc81069ccbcfbef0a58d3433cc05470e Mon Sep 17 00:00:00 2001 From: "Mark H. Wood" Date: Thu, 11 May 2023 13:55:53 -0400 Subject: [PATCH 204/409] Make some request-copy components themeable. --- .../deny-request-copy.component.html | 2 +- .../themed-email-request-copy.component.ts | 45 +++++++++++++++++++ .../grant-request-copy.component.html | 4 +- .../themed-grant-request-copy.component.ts | 26 +++++++++++ .../request-copy-routing.module.ts | 4 +- src/app/request-copy/request-copy.module.ts | 4 ++ 6 files changed, 80 insertions(+), 5 deletions(-) create mode 100644 src/app/request-copy/email-request-copy/themed-email-request-copy.component.ts create mode 100644 src/app/request-copy/grant-request-copy/themed-grant-request-copy.component.ts diff --git a/src/app/request-copy/deny-request-copy/deny-request-copy.component.html b/src/app/request-copy/deny-request-copy/deny-request-copy.component.html index c9e909ccf1..e513212f94 100644 --- a/src/app/request-copy/deny-request-copy/deny-request-copy.component.html +++ b/src/app/request-copy/deny-request-copy/deny-request-copy.component.html @@ -3,7 +3,7 @@

    {{'deny-request-copy.intro' | translate}}

    - +
    diff --git a/src/app/request-copy/email-request-copy/themed-email-request-copy.component.ts b/src/app/request-copy/email-request-copy/themed-email-request-copy.component.ts new file mode 100644 index 0000000000..6b808288ad --- /dev/null +++ b/src/app/request-copy/email-request-copy/themed-email-request-copy.component.ts @@ -0,0 +1,45 @@ +import { Component, EventEmitter, Input, Output } from '@angular/core'; +import { ThemedComponent } from 'src/app/shared/theme-support/themed.component'; + +import { EmailRequestCopyComponent } from './email-request-copy.component'; +import { RequestCopyEmail } from './request-copy-email.model'; + +/** + * Themed wrapper for email-request-copy.component + */ +@Component({ + selector: 'ds-themed-email-request-copy', + styleUrls: [], + templateUrl: './../../shared/theme-support/themed.component.html', +}) + +export class ThemedEmailRequestCopyComponent extends ThemedComponent { + /** + * Event emitter for sending the email + */ + @Output() send: EventEmitter = new EventEmitter(); + + /** + * The subject of the email + */ + @Input() subject: string; + + /** + * The contents of the email + */ + @Input() message: string; + + protected inAndOutputNames: (keyof EmailRequestCopyComponent & keyof this)[] = ['send', 'subject', 'message']; + + protected getComponentName(): string { + return 'EmailRequestCopyComponent'; + } + + protected importThemedComponent(themeName: string): Promise { + return import(`../../../themes/${themeName}/app/request-copy/email-request-copy/email-request-copy.component`); + } + + protected importUnthemedComponent(): Promise { + return import('./email-request-copy.component'); + } +} diff --git a/src/app/request-copy/grant-request-copy/grant-request-copy.component.html b/src/app/request-copy/grant-request-copy/grant-request-copy.component.html index 5cb4dbac36..179206566e 100644 --- a/src/app/request-copy/grant-request-copy/grant-request-copy.component.html +++ b/src/app/request-copy/grant-request-copy/grant-request-copy.component.html @@ -3,7 +3,7 @@

    {{'grant-request-copy.intro' | translate}}

    - +

    {{ 'grant-deny-request-copy.email.permissions.info' | translate }}

    @@ -11,7 +11,7 @@
    -
    +
    diff --git a/src/app/request-copy/grant-request-copy/themed-grant-request-copy.component.ts b/src/app/request-copy/grant-request-copy/themed-grant-request-copy.component.ts new file mode 100644 index 0000000000..625dcef57a --- /dev/null +++ b/src/app/request-copy/grant-request-copy/themed-grant-request-copy.component.ts @@ -0,0 +1,26 @@ +import { Component } from '@angular/core'; +import { ThemedComponent } from 'src/app/shared/theme-support/themed.component'; +import { GrantRequestCopyComponent } from './grant-request-copy.component'; + +/** + * Themed wrapper for grant-request-copy.component + */ +@Component({ + selector: 'ds-themed-grant-request-copy', + styleUrls: [], + templateUrl: './../../shared/theme-support/themed.component.html', +}) + +export class ThemedGrantRequestCopyComponent extends ThemedComponent { + protected getComponentName(): string { + return 'GrantRequestCopyComponent'; + } + + protected importThemedComponent(themeName: string): Promise { + return import(`../../../themes/${themeName}/app/request-copy/grant-request-copy/grant-request-copy.component`); + } + + protected importUnthemedComponent(): Promise { + return import('./grant-request-copy.component'); + } +} diff --git a/src/app/request-copy/request-copy-routing.module.ts b/src/app/request-copy/request-copy-routing.module.ts index e7a205d0aa..c3ac0be46a 100644 --- a/src/app/request-copy/request-copy-routing.module.ts +++ b/src/app/request-copy/request-copy-routing.module.ts @@ -4,7 +4,7 @@ import { RequestCopyResolver } from './request-copy.resolver'; import { GrantDenyRequestCopyComponent } from './grant-deny-request-copy/grant-deny-request-copy.component'; import { REQUEST_COPY_DENY_PATH, REQUEST_COPY_GRANT_PATH } from './request-copy-routing-paths'; import { DenyRequestCopyComponent } from './deny-request-copy/deny-request-copy.component'; -import { GrantRequestCopyComponent } from './grant-request-copy/grant-request-copy.component'; +import { ThemedGrantRequestCopyComponent } from './grant-request-copy/themed-grant-request-copy.component'; @NgModule({ imports: [ @@ -25,7 +25,7 @@ import { GrantRequestCopyComponent } from './grant-request-copy/grant-request-co }, { path: REQUEST_COPY_GRANT_PATH, - component: GrantRequestCopyComponent, + component: ThemedGrantRequestCopyComponent, }, ] } diff --git a/src/app/request-copy/request-copy.module.ts b/src/app/request-copy/request-copy.module.ts index d55d5ad83f..b5ea3da50c 100644 --- a/src/app/request-copy/request-copy.module.ts +++ b/src/app/request-copy/request-copy.module.ts @@ -5,7 +5,9 @@ import { GrantDenyRequestCopyComponent } from './grant-deny-request-copy/grant-d import { RequestCopyRoutingModule } from './request-copy-routing.module'; import { DenyRequestCopyComponent } from './deny-request-copy/deny-request-copy.component'; import { EmailRequestCopyComponent } from './email-request-copy/email-request-copy.component'; +import { ThemedEmailRequestCopyComponent } from './email-request-copy/themed-email-request-copy.component'; import { GrantRequestCopyComponent } from './grant-request-copy/grant-request-copy.component'; +import { ThemedGrantRequestCopyComponent } from './grant-request-copy/themed-grant-request-copy.component'; @NgModule({ imports: [ @@ -17,7 +19,9 @@ import { GrantRequestCopyComponent } from './grant-request-copy/grant-request-co GrantDenyRequestCopyComponent, DenyRequestCopyComponent, EmailRequestCopyComponent, + ThemedEmailRequestCopyComponent, GrantRequestCopyComponent, + ThemedGrantRequestCopyComponent, ], providers: [] }) From 67976299de7ab657ccbdb60b7f4efde2e112d63f Mon Sep 17 00:00:00 2001 From: Nona Luypaert Date: Fri, 12 May 2023 08:12:04 +0200 Subject: [PATCH 205/409] 101623: Fixes for rendersBrowseBy, BrowseResponseParsingService, BrowseByRoutingModule --- src/app/browse-by/browse-by-routing.module.ts | 7 ------- .../browse-by/browse-by-switcher/browse-by-decorator.ts | 2 +- .../browse-by-switcher/browse-by-switcher.component.ts | 2 +- .../themed-browse-by-taxonomy-page.component.ts | 4 +++- src/app/core/data/browse-response-parsing.service.ts | 4 +++- 5 files changed, 8 insertions(+), 11 deletions(-) diff --git a/src/app/browse-by/browse-by-routing.module.ts b/src/app/browse-by/browse-by-routing.module.ts index b555390225..5d3697f391 100644 --- a/src/app/browse-by/browse-by-routing.module.ts +++ b/src/app/browse-by/browse-by-routing.module.ts @@ -14,13 +14,6 @@ import { I18nBreadcrumbResolver } from '../core/breadcrumbs/i18n-breadcrumb.reso path: '', resolve: { breadcrumb: BrowseByDSOBreadcrumbResolver }, children: [ - { - path: 'srsc', - component: ThemedBrowseByTaxonomyPageComponent, - canActivate: [BrowseByGuard], - resolve: { breadcrumb: I18nBreadcrumbResolver }, - data: { title: 'browse.title.page', breadcrumbKey: 'browse.metadata.srsc' } - }, { path: ':id', component: ThemedBrowseBySwitcherComponent, diff --git a/src/app/browse-by/browse-by-switcher/browse-by-decorator.ts b/src/app/browse-by/browse-by-switcher/browse-by-decorator.ts index ceb4c6a6c6..b59a46cae1 100644 --- a/src/app/browse-by/browse-by-switcher/browse-by-decorator.ts +++ b/src/app/browse-by/browse-by-switcher/browse-by-decorator.ts @@ -26,7 +26,7 @@ const map = new Map(); * @param browseByType The type of page * @param theme The optional theme for the component */ -export function rendersBrowseBy(browseByType: BrowseByDataType, theme = DEFAULT_THEME) { +export function rendersBrowseBy(browseByType: string, theme = DEFAULT_THEME) { return function decorator(component: any) { if (hasNoValue(map.get(browseByType))) { map.set(browseByType, new Map()); diff --git a/src/app/browse-by/browse-by-switcher/browse-by-switcher.component.ts b/src/app/browse-by/browse-by-switcher/browse-by-switcher.component.ts index 3cfc735135..e4746129dc 100644 --- a/src/app/browse-by/browse-by-switcher/browse-by-switcher.component.ts +++ b/src/app/browse-by/browse-by-switcher/browse-by-switcher.component.ts @@ -31,7 +31,7 @@ export class BrowseBySwitcherComponent implements OnInit { */ ngOnInit(): void { this.browseByComponent = this.route.data.pipe( - map((data: { browseDefinition: FlatBrowseDefinition }) => this.getComponentByBrowseByType(data.browseDefinition.dataType, this.themeService.getThemeName())) + map((data: { browseDefinition: FlatBrowseDefinition }) => this.getComponentByBrowseByType(data.browseDefinition.getRenderType(), this.themeService.getThemeName())) ); } diff --git a/src/app/browse-by/browse-by-taxonomy-page/themed-browse-by-taxonomy-page.component.ts b/src/app/browse-by/browse-by-taxonomy-page/themed-browse-by-taxonomy-page.component.ts index 9e491aeaac..212044b853 100644 --- a/src/app/browse-by/browse-by-taxonomy-page/themed-browse-by-taxonomy-page.component.ts +++ b/src/app/browse-by/browse-by-taxonomy-page/themed-browse-by-taxonomy-page.component.ts @@ -1,15 +1,17 @@ import { Component } from '@angular/core'; import { ThemedComponent } from '../../shared/theme-support/themed.component'; +import { rendersBrowseBy } from '../browse-by-switcher/browse-by-decorator'; import { BrowseByTaxonomyPageComponent } from './browse-by-taxonomy-page.component'; @Component({ selector: 'ds-themed-browse-by-taxonomy-page', - templateUrl: './browse-by-taxonomy-page.component.html', + templateUrl: '../../shared/theme-support/themed.component.html', styleUrls: [] }) /** * Themed wrapper for BrowseByTaxonomyPageComponent */ +@rendersBrowseBy('hierarchy') export class ThemedBrowseByTaxonomyPageComponent extends ThemedComponent{ protected getComponentName(): string { diff --git a/src/app/core/data/browse-response-parsing.service.ts b/src/app/core/data/browse-response-parsing.service.ts index aecba9cb50..9aa508ccf0 100644 --- a/src/app/core/data/browse-response-parsing.service.ts +++ b/src/app/core/data/browse-response-parsing.service.ts @@ -10,7 +10,9 @@ import { DSOResponseParsingService } from './dso-response-parsing.service'; /** * A ResponseParsingService used to parse RawRestResponse coming from the REST API to a BrowseDefinition object */ -@Injectable() +@Injectable({ + providedIn: 'root', + }) export class BrowseResponseParsingService extends DSOResponseParsingService { protected objectCache: ObjectCacheService; protected toCache: boolean; From 377e27b305bcc000ce28972775c9d60c14dd4567 Mon Sep 17 00:00:00 2001 From: Giuseppe Digilio Date: Fri, 12 May 2023 09:25:47 +0200 Subject: [PATCH 206/409] [CST-9636] Fix lint --- .../bulk-access-browse.component.spec.ts | 8 ++-- .../browse/bulk-access-browse.component.ts | 6 +-- .../bulk-access/bulk-access.component.spec.ts | 40 +++++++++---------- .../bulk-access/bulk-access.component.ts | 6 +-- .../bulk-access-settings.component.spec.ts | 36 ++++++++--------- .../bulk-access-settings.component.ts | 2 +- ...ntrol-select-bitstreams-modal.component.ts | 2 +- .../themed-object-list.component.ts | 18 ++++----- src/assets/i18n/en.json5 | 2 +- 9 files changed, 60 insertions(+), 60 deletions(-) diff --git a/src/app/access-control/bulk-access/browse/bulk-access-browse.component.spec.ts b/src/app/access-control/bulk-access/browse/bulk-access-browse.component.spec.ts index c8379b06ee..87b2a8d568 100644 --- a/src/app/access-control/bulk-access/browse/bulk-access-browse.component.spec.ts +++ b/src/app/access-control/bulk-access/browse/bulk-access-browse.component.spec.ts @@ -69,10 +69,10 @@ describe('BulkAccessBrowseComponent', () => { it('should have an initial remote data with a paginated list as value', () => { const list = buildPaginatedList(new PageInfo({ - "elementsPerPage": 5, - "totalElements": 2, - "totalPages": 1, - "currentPage": 1 + 'elementsPerPage': 5, + 'totalElements': 2, + 'totalPages': 1, + 'currentPage': 1 }), [selected1, selected2]) ; const rd = createSuccessfulRemoteDataObject(list); diff --git a/src/app/access-control/bulk-access/browse/bulk-access-browse.component.ts b/src/app/access-control/bulk-access/browse/bulk-access-browse.component.ts index eff5942d4e..e806e729c8 100644 --- a/src/app/access-control/bulk-access/browse/bulk-access-browse.component.ts +++ b/src/app/access-control/bulk-access/browse/bulk-access-browse.component.ts @@ -69,7 +69,7 @@ export class BulkAccessBrowseComponent implements OnInit, OnDestroy { distinctUntilChanged(), map((list: SelectableListState) => this.generatePaginatedListBySelectedElements(list)) ).subscribe(this.objectsSelected$) - ) + ); } pageNext() { @@ -87,7 +87,7 @@ export class BulkAccessBrowseComponent implements OnInit, OnDestroy { private calculatePageCount(pageSize, totalCount = 0) { // we suppose that if we have 0 items we want 1 empty page return totalCount < pageSize ? 1 : Math.ceil(totalCount / pageSize); - }; + } /** * Generate The RemoteData object containing the list of the selected elements @@ -114,6 +114,6 @@ export class BulkAccessBrowseComponent implements OnInit, OnDestroy { this.subs .filter((sub) => hasValue(sub)) .forEach((sub) => sub.unsubscribe()); - this.selectableListService.deselectAll(this.listId) + this.selectableListService.deselectAll(this.listId); } } diff --git a/src/app/access-control/bulk-access/bulk-access.component.spec.ts b/src/app/access-control/bulk-access/bulk-access.component.spec.ts index 8a64d01df4..ccbdabb7a6 100644 --- a/src/app/access-control/bulk-access/bulk-access.component.spec.ts +++ b/src/app/access-control/bulk-access/bulk-access.component.spec.ts @@ -24,38 +24,38 @@ fdescribe('BulkAccessComponent', () => { const bulkAccessControlServiceMock = jasmine.createSpyObj('bulkAccessControlService', ['createPayloadFile', 'executeScript']); const mockFormState = { - "bitstream": [], - "item": [ + 'bitstream': [], + 'item': [ { - "name": "embargo", - "startDate": { - "year": 2026, - "month": 5, - "day": 31 + 'name': 'embargo', + 'startDate': { + 'year': 2026, + 'month': 5, + 'day': 31 }, - "endDate": null + 'endDate': null } ], - "state": { - "item": { - "toggleStatus": true, - "accessMode": "replace" + 'state': { + 'item': { + 'toggleStatus': true, + 'accessMode': 'replace' }, - "bitstream": { - "toggleStatus": false, - "accessMode": "", - "changesLimit": "", - "selectedBitstreams": [] + 'bitstream': { + 'toggleStatus': false, + 'accessMode': '', + 'changesLimit': '', + 'selectedBitstreams': [] } } }; const mockFile = { - "uuids": [ + 'uuids': [ '1234', '5678' ], - "file": { } - } + 'file': { } + }; const mockSettings: any = jasmine.createSpyObj('AccessControlFormContainerComponent', { getValue: jasmine.createSpy('getValue'), diff --git a/src/app/access-control/bulk-access/bulk-access.component.ts b/src/app/access-control/bulk-access/bulk-access.component.ts index b928f3da4a..074dbc7f55 100644 --- a/src/app/access-control/bulk-access/bulk-access.component.ts +++ b/src/app/access-control/bulk-access/bulk-access.component.ts @@ -26,7 +26,7 @@ export class BulkAccessComponent implements OnInit { /** * The selection list id */ - listId: string = 'bulk-access-list'; + listId = 'bulk-access-list'; /** * The list of the objects already selected @@ -58,7 +58,7 @@ export class BulkAccessComponent implements OnInit { distinctUntilChanged(), map((list: SelectableListState) => this.generateIdListBySelectedElements(list)) ).subscribe(this.objectsSelected$) - ) + ); } canExport(): boolean { @@ -70,7 +70,7 @@ export class BulkAccessComponent implements OnInit { * This will also reset the state of the child components (bitstream and item access) */ reset(): void { - this.settings.reset() + this.settings.reset(); } /** diff --git a/src/app/access-control/bulk-access/settings/bulk-access-settings.component.spec.ts b/src/app/access-control/bulk-access/settings/bulk-access-settings.component.spec.ts index 306d4eebde..229f7eeb11 100644 --- a/src/app/access-control/bulk-access/settings/bulk-access-settings.component.spec.ts +++ b/src/app/access-control/bulk-access/settings/bulk-access-settings.component.spec.ts @@ -8,28 +8,28 @@ describe('BulkAccessSettingsComponent', () => { let component: BulkAccessSettingsComponent; let fixture: ComponentFixture; const mockFormState = { - "bitstream": [], - "item": [ + 'bitstream': [], + 'item': [ { - "name": "embargo", - "startDate": { - "year": 2026, - "month": 5, - "day": 31 + 'name': 'embargo', + 'startDate': { + 'year': 2026, + 'month': 5, + 'day': 31 }, - "endDate": null + 'endDate': null } ], - "state": { - "item": { - "toggleStatus": true, - "accessMode": "replace" + 'state': { + 'item': { + 'toggleStatus': true, + 'accessMode': 'replace' }, - "bitstream": { - "toggleStatus": false, - "accessMode": "", - "changesLimit": "", - "selectedBitstreams": [] + 'bitstream': { + 'toggleStatus': false, + 'accessMode': '', + 'changesLimit': '', + 'selectedBitstreams': [] } } }; @@ -68,7 +68,7 @@ describe('BulkAccessSettingsComponent', () => { it('should return the correct form value', () => { const expectedValue = mockFormState; - (component.controlForm as any).getFormValue.and.returnValue(mockFormState) + (component.controlForm as any).getFormValue.and.returnValue(mockFormState); const actualValue = component.getValue(); expect(actualValue).toEqual(expectedValue); }); diff --git a/src/app/access-control/bulk-access/settings/bulk-access-settings.component.ts b/src/app/access-control/bulk-access/settings/bulk-access-settings.component.ts index 978fc41ed8..eecc016245 100644 --- a/src/app/access-control/bulk-access/settings/bulk-access-settings.component.ts +++ b/src/app/access-control/bulk-access/settings/bulk-access-settings.component.ts @@ -28,7 +28,7 @@ export class BulkAccessSettingsComponent { * This will also reset the state of the child components (bitstream and item access) */ reset() { - this.controlForm.reset() + this.controlForm.reset(); } } diff --git a/src/app/shared/access-control-form-container/item-access-control-select-bitstreams-modal/item-access-control-select-bitstreams-modal.component.ts b/src/app/shared/access-control-form-container/item-access-control-select-bitstreams-modal/item-access-control-select-bitstreams-modal.component.ts index 171b1d59c1..617803a0c4 100644 --- a/src/app/shared/access-control-form-container/item-access-control-select-bitstreams-modal/item-access-control-select-bitstreams-modal.component.ts +++ b/src/app/shared/access-control-form-container/item-access-control-select-bitstreams-modal/item-access-control-select-bitstreams-modal.component.ts @@ -13,7 +13,7 @@ import { TranslateService } from '@ngx-translate/core'; import { hasValue } from '../../empty.util'; import { getFirstCompletedRemoteData } from '../../../core/shared/operators'; -export const ITEM_ACCESS_CONTROL_SELECT_BITSTREAMS_LIST_ID = 'item-access-control-select-bitstreams' +export const ITEM_ACCESS_CONTROL_SELECT_BITSTREAMS_LIST_ID = 'item-access-control-select-bitstreams'; @Component({ selector: 'ds-item-access-control-select-bitstreams-modal', diff --git a/src/app/shared/object-list/themed-object-list.component.ts b/src/app/shared/object-list/themed-object-list.component.ts index 9448ed5939..04a95de1cb 100644 --- a/src/app/shared/object-list/themed-object-list.component.ts +++ b/src/app/shared/object-list/themed-object-list.component.ts @@ -1,13 +1,13 @@ -import {Component, EventEmitter, Input, Output} from '@angular/core'; +import { Component, EventEmitter, Input, Output } from '@angular/core'; import { ObjectListComponent } from './object-list.component'; import { ThemedComponent } from '../theme-support/themed.component'; -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'; -import {Context} from '../../core/shared/context.model'; -import {RemoteData} from '../../core/data/remote-data'; -import {PaginatedList} from '../../core/data/paginated-list.model'; -import {ListableObject} from '../object-collection/shared/listable-object.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'; +import { Context } from '../../core/shared/context.model'; +import { RemoteData } from '../../core/data/remote-data'; +import { PaginatedList } from '../../core/data/paginated-list.model'; +import { ListableObject } from '../object-collection/shared/listable-object.model'; /** * Themed wrapper for ObjectListComponent @@ -53,7 +53,7 @@ export class ThemedObjectListComponent extends ThemedComponent Date: Tue, 25 Oct 2022 19:18:27 +0200 Subject: [PATCH 207/409] [DURACOM-99] Italian support added --- config/config.example.yml | 3 +++ src/config/default-app-config.ts | 1 + 2 files changed, 4 insertions(+) diff --git a/config/config.example.yml b/config/config.example.yml index a62cce13eb..ea38303fa3 100644 --- a/config/config.example.yml +++ b/config/config.example.yml @@ -187,6 +187,9 @@ languages: - code: gd label: Gàidhlig active: true + - code: it + label: Italiano + active: true - code: lv label: Latviešu active: true diff --git a/src/config/default-app-config.ts b/src/config/default-app-config.ts index 77422e4eff..80420407c7 100644 --- a/src/config/default-app-config.ts +++ b/src/config/default-app-config.ts @@ -220,6 +220,7 @@ export class DefaultAppConfig implements AppConfig { { code: 'es', label: 'Español', active: true }, { code: 'fr', label: 'Français', active: true }, { code: 'gd', label: 'Gàidhlig', active: true }, + { code: 'it', label: 'Italiano', active: true }, { code: 'lv', label: 'Latviešu', active: true }, { code: 'hu', label: 'Magyar', active: true }, { code: 'nl', label: 'Nederlands', active: true }, From d332296da8f827f390388763f11b759e1dbd46c7 Mon Sep 17 00:00:00 2001 From: Davide Negretti Date: Fri, 4 Nov 2022 15:57:46 +0100 Subject: [PATCH 208/409] [DURACOM-99] First italian translations (2022-11-04) --- src/assets/i18n/it.json5 | 7357 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 7357 insertions(+) create mode 100644 src/assets/i18n/it.json5 diff --git a/src/assets/i18n/it.json5 b/src/assets/i18n/it.json5 new file mode 100644 index 0000000000..ab8bf0feef --- /dev/null +++ b/src/assets/i18n/it.json5 @@ -0,0 +1,7357 @@ +{ + + // "401.help": "You're not authorized to access this page. You can use the button below to get back to the home page.", + "401.help": "Non sei autorizzato ad accedere a questa pagina. Puoi usare il pulsante qui sotto per tornare alla home page.", + + // "401.link.home-page": "Take me to the home page", + "401.link.home-page": "Torna alla home page", + + // "401.unauthorized": "unauthorized", + "401.unauthorized": "Non autorizzato", + + + + // "403.help": "You don't have permission to access this page. You can use the button below to get back to the home page.", + "403.help": "Non si dispone dell'autorizzazione per accedere a questa pagina. Puoi usare il pulsante qui sotto per tornare alla home page.", + + // "403.link.home-page": "Take me to the home page", + "403.link.home-page": "Torna alla home page", + + // "403.forbidden": "forbidden", + "403.forbidden": "vietato", + + // "500.page-internal-server-error": "Service Unavailable", + "500.page-internal-server-error": "Servizio non disponibile", + + // "500.help": "The server is temporarily unable to service your request due to maintenance downtime or capacity problems. Please try again later.", + "500.help": "Il server non è temporaneamente in grado di soddisfare la richiesta a causa di tempi di inattività di manutenzione o problemi di capacità. Riprova più tardi.", + + // "500.link.home-page": "Take me to the home page", + "500.link.home-page": "Torna alla home page", + + + // "404.help": "We can't find the page you're looking for. The page may have been moved or deleted. You can use the button below to get back to the home page. ", + "404.help": "Non riusciamo a trovare la pagina che stai cercando. La pagina potrebbe essere stata spostata o eliminata. Puoi usare il pulsante qui sotto per tornare alla home page.", + + // "404.link.home-page": "Take me to the home page", + "404.link.home-page": "Torna alla home page", + + // "404.page-not-found": "page not found", + "404.page-not-found": "Pagina non trovata", + + // "error-page.description.401": "unauthorized", + "error-page.description.401": "non autorizzato", + + // "error-page.description.403": "forbidden", + "error-page.description.403": "accesso negato", + + // "error-page.description.500": "Service Unavailable", + "error-page.description.500": "Servizio non disponibile", + + // "error-page.description.404": "page not found", + "error-page.description.404": "Pagina non trovata", + + // "error-page.orcid.generic-error": "An error occurred during login via ORCID. Make sure you have shared your ORCID account email address with DSpace. If the error persists, contact the administrator", + "error-page.orcid.generic-error": "Si è verificato un errore con il login via ORCID. Verifica di avere condiviso il tuo account ORCID con DSpace. Se l'errore persiste, contatta l'amministratore", + + // "access-status.embargo.listelement.badge": "Embargo", + "access-status.embargo.listelement.badge": "Embargo", + + // "access-status.metadata.only.listelement.badge": "Metadata only", + "access-status.metadata.only.listelement.badge": "Solo metadata", + + // "access-status.open.access.listelement.badge": "Open Access", + "access-status.open.access.listelement.badge": "Open Access", + + // "access-status.restricted.listelement.badge": "Restricted", + "access-status.restricted.listelement.badge": "Limitato", + + // "access-status.unknown.listelement.badge": "Unknown", + "access-status.unknown.listelement.badge": "Sconosciuto", + + // "admin.curation-tasks.breadcrumbs": "System curation tasks", + "admin.curation-tasks.breadcrumbs": "Curation task del sistema", + + // "admin.curation-tasks.title": "System curation tasks", + "admin.curation-tasks.title": "Curation task del sistema", + + // "admin.curation-tasks.header": "System curation tasks", + "admin.curation-tasks.header": "Curation task del sistema", + + // "admin.registries.bitstream-formats.breadcrumbs": "Format registry", + "admin.registries.bitstream-formats.breadcrumbs": "Formattare il registro", + + // "admin.registries.bitstream-formats.create.breadcrumbs": "Bitstream format", + "admin.registries.bitstream-formats.create.breadcrumbs": "Formato del bitstream", + + // "admin.registries.bitstream-formats.create.failure.content": "An error occurred while creating the new bitstream format.", + "admin.registries.bitstream-formats.create.failure.content": "Si è verificato un errore durante la creazione del nuovo formato bitstream.", + + // "admin.registries.bitstream-formats.create.failure.head": "Failure", + "admin.registries.bitstream-formats.create.failure.head": "Fallimento", + + // "admin.registries.bitstream-formats.create.head": "Create Bitstream format", + "admin.registries.bitstream-formats.create.head": "Crea formato Bitstream", + + // "admin.registries.bitstream-formats.create.new": "Add a new bitstream format", + "admin.registries.bitstream-formats.create.new": "Aggiungere un nuovo formato bitstream", + + // "admin.registries.bitstream-formats.create.success.content": "The new bitstream format was successfully created.", + "admin.registries.bitstream-formats.create.success.content": "Il nuovo formato bitstream è stato creato correttamente.", + + // "admin.registries.bitstream-formats.create.success.head": "Success", + "admin.registries.bitstream-formats.create.success.head": "Successo", + + // "admin.registries.bitstream-formats.delete.failure.amount": "Failed to remove {{ amount }} format(s)", + "admin.registries.bitstream-formats.delete.failure.amount": "Impossibile rimuovere i formati {{ amount }}", + + // "admin.registries.bitstream-formats.delete.failure.head": "Failure", + "admin.registries.bitstream-formats.delete.failure.head": "Fallimento", + + // "admin.registries.bitstream-formats.delete.success.amount": "Successfully removed {{ amount }} format(s)", + "admin.registries.bitstream-formats.delete.success.amount": "Rimosso con successo i formati {{ amount }}", + + // "admin.registries.bitstream-formats.delete.success.head": "Success", + "admin.registries.bitstream-formats.delete.success.head": "Successo", + + // "admin.registries.bitstream-formats.description": "This list of bitstream formats provides information about known formats and their support level.", + "admin.registries.bitstream-formats.description": "Questo elenco di formati bitstream fornisce informazioni sui formati noti e sul loro livello di supporto.", + + // "admin.registries.bitstream-formats.edit.breadcrumbs": "Bitstream format", + "admin.registries.bitstream-formats.edit.breadcrumbs": "Formato bitstream", + + // "admin.registries.bitstream-formats.edit.description.hint": "", + "admin.registries.bitstream-formats.edit.description.hint": "", + + // "admin.registries.bitstream-formats.edit.description.label": "Description", + "admin.registries.bitstream-formats.edit.description.label": "Descrizione", + + // "admin.registries.bitstream-formats.edit.extensions.hint": "Extensions are file extensions that are used to automatically identify the format of uploaded files. You can enter several extensions for each format.", + "admin.registries.bitstream-formats.edit.extensions.hint": "Le estensioni sono estensioni di file che vengono utilizzate per identificare automaticamente il formato dei file caricati. È possibile immettere diverse estensioni per ogni formato.", + + // "admin.registries.bitstream-formats.edit.extensions.label": "File extensions", + "admin.registries.bitstream-formats.edit.extensions.label": "Estensione", + + // "admin.registries.bitstream-formats.edit.extensions.placeholder": "Enter a file extension without the dot", + "admin.registries.bitstream-formats.edit.extensions.placeholder": "Inserisci un'estensione di file senza il punto", + + // "admin.registries.bitstream-formats.edit.failure.content": "An error occurred while editing the bitstream format.", + "admin.registries.bitstream-formats.edit.failure.content": "Si è verificato un errore durante la modifica del formato bitstream.", + + // "admin.registries.bitstream-formats.edit.failure.head": "Failure", + "admin.registries.bitstream-formats.edit.failure.head": "Fallimento", + + // "admin.registries.bitstream-formats.edit.head": "Bitstream format: {{ format }}", + "admin.registries.bitstream-formats.edit.head": "Formato Bitstream: {{ format }}", + + // "admin.registries.bitstream-formats.edit.internal.hint": "Formats marked as internal are hidden from the user, and used for administrative purposes.", + "admin.registries.bitstream-formats.edit.internal.hint": "I formati contrassegnati come interni sono nascosti all'utente e utilizzati per scopi amministrativi.", + + // "admin.registries.bitstream-formats.edit.internal.label": "Internal", + "admin.registries.bitstream-formats.edit.internal.label": "Interno", + + // "admin.registries.bitstream-formats.edit.mimetype.hint": "The MIME type associated with this format, does not have to be unique.", + "admin.registries.bitstream-formats.edit.mimetype.hint": "Non è necessario che il tipo MIME associato a questo formato sia univoco.", + + // "admin.registries.bitstream-formats.edit.mimetype.label": "MIME Type", + "admin.registries.bitstream-formats.edit.mimetype.label": "Tipo MIME", + + // "admin.registries.bitstream-formats.edit.shortDescription.hint": "A unique name for this format, (e.g. Microsoft Word XP or Microsoft Word 2000)", + "admin.registries.bitstream-formats.edit.shortDescription.hint": "Un nome univoco per questo formato (ad esempio, Microsoft Word XP o Microsoft Word 2000)", + + // "admin.registries.bitstream-formats.edit.shortDescription.label": "Name", + "admin.registries.bitstream-formats.edit.shortDescription.label": "Nome", + + // "admin.registries.bitstream-formats.edit.success.content": "The bitstream format was successfully edited.", + "admin.registries.bitstream-formats.edit.success.content": "Il formato bitstream è stato modificato correttamente.", + + // "admin.registries.bitstream-formats.edit.success.head": "Success", + "admin.registries.bitstream-formats.edit.success.head": "Successo", + + // "admin.registries.bitstream-formats.edit.supportLevel.hint": "The level of support your institution pledges for this format.", + "admin.registries.bitstream-formats.edit.supportLevel.hint": "Il livello di supporto che la vostra istituzione si impegna a dare a questo formato.", + + // "admin.registries.bitstream-formats.edit.supportLevel.label": "Support level", + "admin.registries.bitstream-formats.edit.supportLevel.label": "Livello di supporto", + + // "admin.registries.bitstream-formats.head": "Bitstream Format Registry", + "admin.registries.bitstream-formats.head": "Registro di sistema del formato Bitstream", + + // "admin.registries.bitstream-formats.no-items": "No bitstream formats to show.", + "admin.registries.bitstream-formats.no-items": "Nessun formato bitstream da mostrare.", + + // "admin.registries.bitstream-formats.table.delete": "Delete selected", + "admin.registries.bitstream-formats.table.delete": "Elimina selezionato", + + // "admin.registries.bitstream-formats.table.deselect-all": "Deselect all", + "admin.registries.bitstream-formats.table.deselect-all": "Deseleziona tutto", + + // "admin.registries.bitstream-formats.table.internal": "internal", + "admin.registries.bitstream-formats.table.internal": "interno", + + // "admin.registries.bitstream-formats.table.mimetype": "MIME Type", + "admin.registries.bitstream-formats.table.mimetype": "Tipo MIME", + + // "admin.registries.bitstream-formats.table.name": "Name", + "admin.registries.bitstream-formats.table.name": "Nome", + // "admin.registries.bitstream-formats.table.id" : "ID", + // TODO New key - Add a translation + "admin.registries.bitstream-formats.table.id" : "ID", + + // "admin.registries.bitstream-formats.table.return": "Back", + "admin.registries.bitstream-formats.table.return": "Indietro", + + // "admin.registries.bitstream-formats.table.supportLevel.KNOWN": "Known", + "admin.registries.bitstream-formats.table.supportLevel.KNOWN": "Conosciuto", + + // "admin.registries.bitstream-formats.table.supportLevel.SUPPORTED": "Supported", + "admin.registries.bitstream-formats.table.supportLevel.SUPPORTED": "Sostenuto", + + // "admin.registries.bitstream-formats.table.supportLevel.UNKNOWN": "Unknown", + "admin.registries.bitstream-formats.table.supportLevel.UNKNOWN": "Sconosciuto", + + // "admin.registries.bitstream-formats.table.supportLevel.head": "Support Level", + "admin.registries.bitstream-formats.table.supportLevel.head": "Livello di supporto", + + // "admin.registries.bitstream-formats.title": "Bitstream Format Registry", + "admin.registries.bitstream-formats.title": "Registro di sistema del formato Bitstream", + + + + // "admin.registries.metadata.breadcrumbs": "Metadata registry", + "admin.registries.metadata.breadcrumbs": "Registro dei metadati", + + // "admin.registries.metadata.description": "The metadata registry maintains a list of all metadata fields available in the repository. These fields may be divided amongst multiple schemas. However, DSpace requires the qualified Dublin Core schema.", + "admin.registries.metadata.description": "Il Registro dei metadati mantiene un elenco di tutti i campi di metadati disponibili nel repository. Questi campi possono essere suddivisi tra più schemi. Tuttavia, DSpace richiede lo schema Dublin Core qualificato.", + + // "admin.registries.metadata.form.create": "Create metadata schema", + "admin.registries.metadata.form.create": "Creare un Metadata Schema", + + // "admin.registries.metadata.form.edit": "Edit metadata schema", + "admin.registries.metadata.form.edit": "Modificare il Metadata Schema", + + // "admin.registries.metadata.form.name": "Name", + "admin.registries.metadata.form.name": "Nome", + + // "admin.registries.metadata.form.namespace": "Namespace", + "admin.registries.metadata.form.namespace": "Namespace", + + // "admin.registries.metadata.head": "Metadata Registry", + "admin.registries.metadata.head": "Registro dei metadati", + + // "admin.registries.metadata.schemas.no-items": "No metadata schemas to show.", + "admin.registries.metadata.schemas.no-items": "Nessun Metadata Schema da mostrare.", + + // "admin.registries.metadata.schemas.table.delete": "Delete selected", + "admin.registries.metadata.schemas.table.delete": "Elimina selezionato", + + // "admin.registries.metadata.schemas.table.id": "ID", + "admin.registries.metadata.schemas.table.id": "ID", + + // "admin.registries.metadata.schemas.table.name": "Name", + "admin.registries.metadata.schemas.table.name": "Nome", + + // "admin.registries.metadata.schemas.table.namespace": "Namespace", + "admin.registries.metadata.schemas.table.namespace": "Namespace", + + // "admin.registries.metadata.title": "Metadata Registry", + "admin.registries.metadata.title": "Registro dei metadati", + + + + // "admin.registries.schema.breadcrumbs": "Metadata schema", + "admin.registries.schema.breadcrumbs": "Metadata Schema", + + // "admin.registries.schema.description": "This is the metadata schema for \"{{namespace}}\".", + "admin.registries.schema.description": "Questo è il Metadata Schema per \"{{namespace}}.", + + // "admin.registries.schema.fields.head": "Schema metadata fields", + "admin.registries.schema.fields.head": "Campi dei metadati dello schema", + + // "admin.registries.schema.fields.no-items": "No metadata fields to show.", + "admin.registries.schema.fields.no-items": "Nessun campo di metadati da mostrare.", + + // "admin.registries.schema.fields.table.delete": "Delete selected", + "admin.registries.schema.fields.table.delete": "Elimina selezionato", + + // "admin.registries.schema.fields.table.field": "Field", + "admin.registries.schema.fields.table.field": "Campo", + // "admin.registries.schema.fields.table.id" : "ID", + // TODO New key - Add a translation + "admin.registries.schema.fields.table.id" : "ID", + + // "admin.registries.schema.fields.table.scopenote": "Scope Note", + "admin.registries.schema.fields.table.scopenote": "Nota di ambito", + + // "admin.registries.schema.form.create": "Create metadata field", + "admin.registries.schema.form.create": "Creare un campo di metadati", + + // "admin.registries.schema.form.edit": "Edit metadata field", + "admin.registries.schema.form.edit": "Modificare il campo dei metadati", + + // "admin.registries.schema.form.element": "Element", + "admin.registries.schema.form.element": "Elemento", + + // "admin.registries.schema.form.qualifier": "Qualifier", + "admin.registries.schema.form.qualifier": "Qualificatore", + + // "admin.registries.schema.form.scopenote": "Scope Note", + "admin.registries.schema.form.scopenote": "Nota di ambito", + + // "admin.registries.schema.head": "Metadata Schema", + "admin.registries.schema.head": "Metadata Schema", + + // "admin.registries.schema.notification.created": "Successfully created metadata schema \"{{prefix}}\"", + "admin.registries.schema.notification.created": "Metadata Schema creato correttamente \"{{prefix}}\"", + + // "admin.registries.schema.notification.deleted.failure": "Failed to delete {{amount}} metadata schemas", + "admin.registries.schema.notification.deleted.failure": "Impossibile eliminare il Metadata Schema {{amount}}", + + // "admin.registries.schema.notification.deleted.success": "Successfully deleted {{amount}} metadata schemas", + "admin.registries.schema.notification.deleted.success": "Metadata Schema {{amount}} eliminato correttamente", + + // "admin.registries.schema.notification.edited": "Successfully edited metadata schema \"{{prefix}}\"", + "admin.registries.schema.notification.edited": "Schema di metadati modificato correttamente \"{{prefix}}\"", + + // "admin.registries.schema.notification.failure": "Error", + "admin.registries.schema.notification.failure": "Errore", + + // "admin.registries.schema.notification.field.created": "Successfully created metadata field \"{{field}}\"", + "admin.registries.schema.notification.field.created": "Campo dei metadati creato correttamente \"{{field}}\"", + + // "admin.registries.schema.notification.field.deleted.failure": "Failed to delete {{amount}} metadata fields", + "admin.registries.schema.notification.field.deleted.failure": "Impossibile eliminare i campi di metadati {{amount}}", + + // "admin.registries.schema.notification.field.deleted.success": "Successfully deleted {{amount}} metadata fields", + "admin.registries.schema.notification.field.deleted.success": "Campi di metadati {{amount}} eliminati correttamente", + + // "admin.registries.schema.notification.field.edited": "Successfully edited metadata field \"{{field}}\"", + "admin.registries.schema.notification.field.edited": "Campo dei metadati modificato correttamente \"{{field}}\"", + + // "admin.registries.schema.notification.success": "Success", + "admin.registries.schema.notification.success": "Successo", + + // "admin.registries.schema.return": "Back", + "admin.registries.schema.return": "Indietro", + + // "admin.registries.schema.title": "Metadata Schema Registry", + "admin.registries.schema.title": "Registro del Metadata Schema", + + + + // "admin.access-control.epeople.actions.delete": "Delete EPerson", + "admin.access-control.epeople.actions.delete": "Eliminare EPerson", + + // "admin.access-control.epeople.actions.impersonate": "Impersonate EPerson", + "admin.access-control.epeople.actions.impersonate": "Impersonare EPerson", + + // "admin.access-control.epeople.actions.reset": "Reset password", + "admin.access-control.epeople.actions.reset": "Reimposta password", + + // "admin.access-control.epeople.actions.stop-impersonating": "Stop impersonating EPerson", + "admin.access-control.epeople.actions.stop-impersonating": "Smetti di impersonare EPerson", + + // "admin.access-control.epeople.breadcrumbs": "EPeople", + "admin.access-control.epeople.breadcrumbs": "EPeople", + + // "admin.access-control.epeople.title": "EPeople", + "admin.access-control.epeople.title": "EPeople", + + // "admin.access-control.epeople.head": "EPeople", + "admin.access-control.epeople.head": "EPeople", + + // "admin.access-control.epeople.search.head": "Search", + "admin.access-control.epeople.search.head": "Ricerca", + + // "admin.access-control.epeople.button.see-all": "Browse All", + "admin.access-control.epeople.button.see-all": "Sfoglia tutto", + + // "admin.access-control.epeople.search.scope.metadata": "Metadata", + "admin.access-control.epeople.search.scope.metadata": "Metadati", + + // "admin.access-control.epeople.search.scope.email": "E-mail (exact)", + "admin.access-control.epeople.search.scope.email": "E-mail (esatta)", + + // "admin.access-control.epeople.search.button": "Search", + "admin.access-control.epeople.search.button": "Ricerca", + + // "admin.access-control.epeople.search.placeholder": "Search people...", + "admin.access-control.epeople.search.placeholder": "Cerca persone...", + + // "admin.access-control.epeople.button.add": "Add EPerson", + "admin.access-control.epeople.button.add": "Aggiungi EPerson", + + // "admin.access-control.epeople.table.id": "ID", + "admin.access-control.epeople.table.id": "ID", + + // "admin.access-control.epeople.table.name": "Name", + "admin.access-control.epeople.table.name": "Nome", + + // "admin.access-control.epeople.table.email": "E-mail (exact)", + "admin.access-control.epeople.table.email": "E-mail (esatta)", + + // "admin.access-control.epeople.table.edit": "Edit", + "admin.access-control.epeople.table.edit": "Editare", + + // "admin.access-control.epeople.table.edit.buttons.edit": "Edit \"{{name}}\"", + "admin.access-control.epeople.table.edit.buttons.edit": "Modifica \"{{name}}\"", + + // "admin.access-control.epeople.table.edit.buttons.edit-disabled": "You are not authorized to edit this group", + "admin.access-control.epeople.table.edit.buttons.edit-disabled": "Non sei autorizzato a modificare questo gruppo", + + // "admin.access-control.epeople.table.edit.buttons.remove": "Delete \"{{name}}\"", + "admin.access-control.epeople.table.edit.buttons.remove": "Eliminare \"{{name}}\"", + + // "admin.access-control.epeople.no-items": "No EPeople to show.", + "admin.access-control.epeople.no-items": "Nessuna EPersona da mostrare.", + + // "admin.access-control.epeople.form.create": "Create EPerson", + "admin.access-control.epeople.form.create": "Crea EPersona", + + // "admin.access-control.epeople.form.edit": "Edit EPerson", + "admin.access-control.epeople.form.edit": "Modifica EPersona", + + // "admin.access-control.epeople.form.firstName": "First name", + "admin.access-control.epeople.form.firstName": "Nome di battesimo", + + // "admin.access-control.epeople.form.lastName": "Last name", + "admin.access-control.epeople.form.lastName": "Cognome", + + // "admin.access-control.epeople.form.email": "E-mail", + "admin.access-control.epeople.form.email": "Posta elettronica", + + // "admin.access-control.epeople.form.emailHint": "Must be valid e-mail address", + "admin.access-control.epeople.form.emailHint": "Deve essere un indirizzo e-mail valido", + + // "admin.access-control.epeople.form.canLogIn": "Can log in", + "admin.access-control.epeople.form.canLogIn": "Può accedere", + + // "admin.access-control.epeople.form.requireCertificate": "Requires certificate", + "admin.access-control.epeople.form.requireCertificate": "Richiede certificato", + + // "admin.access-control.epeople.form.return": "Back", + "admin.access-control.epeople.form.return": "Indietro", + + // "admin.access-control.epeople.form.notification.created.success": "Successfully created EPerson \"{{name}}\"", + "admin.access-control.epeople.form.notification.created.success": "EPerson creato con successo \"{{name}}\"", + + // "admin.access-control.epeople.form.notification.created.failure": "Failed to create EPerson \"{{name}}\"", + "admin.access-control.epeople.form.notification.created.failure": "Impossibile creare EPerson \"{{name}}\"", + + // "admin.access-control.epeople.form.notification.created.failure.emailInUse": "Failed to create EPerson \"{{name}}\", email \"{{email}}\" already in use.", + "admin.access-control.epeople.form.notification.created.failure.emailInUse": "Impossibile creare EPerson \"{{name}}\", email \"{{email}}\" già in uso.", + + // "admin.access-control.epeople.form.notification.edited.failure.emailInUse": "Failed to edit EPerson \"{{name}}\", email \"{{email}}\" already in use.", + "admin.access-control.epeople.form.notification.edited.failure.emailInUse": "Impossibile modificare EPerson \"{{name}}\", email \"{{email}}\" già in uso.", + + // "admin.access-control.epeople.form.notification.edited.success": "Successfully edited EPerson \"{{name}}\"", + "admin.access-control.epeople.form.notification.edited.success": "EPerson modificato con successo \"{{name}}\"", + + // "admin.access-control.epeople.form.notification.edited.failure": "Failed to edit EPerson \"{{name}}\"", + "admin.access-control.epeople.form.notification.edited.failure": "Impossibile modificare EPerson \"{{name}}\"", + + // "admin.access-control.epeople.form.notification.deleted.success": "Successfully deleted EPerson \"{{name}}\"", + "admin.access-control.epeople.form.notification.deleted.success": "EPerson eliminato con successo \"{{name}}\"", + + // "admin.access-control.epeople.form.notification.deleted.failure": "Failed to delete EPerson \"{{name}}\"", + "admin.access-control.epeople.form.notification.deleted.failure": "Impossibile eliminare EPerson \"{{name}}\"", + + // "admin.access-control.epeople.form.groupsEPersonIsMemberOf": "Member of these groups:", + "admin.access-control.epeople.form.groupsEPersonIsMemberOf": "Membro dei seguenti gruppi:", + + // "admin.access-control.epeople.form.table.id": "ID", + "admin.access-control.epeople.form.table.id": "ID", + + // "admin.access-control.epeople.form.table.name": "Name", + "admin.access-control.epeople.form.table.name": "Nome", + + // "admin.access-control.epeople.form.table.collectionOrCommunity": "Collection/Community", + "admin.access-control.epeople.form.table.collectionOrCommunity": "collection/Community", + + // "admin.access-control.epeople.form.memberOfNoGroups": "This EPerson is not a member of any groups", + "admin.access-control.epeople.form.memberOfNoGroups": "Questo EPerson non è membro di alcun gruppo", + + // "admin.access-control.epeople.form.goToGroups": "Add to groups", + "admin.access-control.epeople.form.goToGroups": "Aggiungi ai gruppi", + + // "admin.access-control.epeople.notification.deleted.failure": "Failed to delete EPerson: \"{{name}}\"", + "admin.access-control.epeople.notification.deleted.failure": "Impossibile eliminare l'EPerson: \"{{name}}\"", + + // "admin.access-control.epeople.notification.deleted.success": "Successfully deleted EPerson: \"{{name}}\"", + "admin.access-control.epeople.notification.deleted.success": "EPerson eliminata con successo: \"{{name}}\"", + + + + // "admin.access-control.groups.title": "Groups", + "admin.access-control.groups.title": "Gruppi", + + // "admin.access-control.groups.breadcrumbs": "Groups", + "admin.access-control.groups.breadcrumbs": "Gruppi", + + // "admin.access-control.groups.singleGroup.breadcrumbs": "Edit Group", + "admin.access-control.groups.singleGroup.breadcrumbs": "Modifica gruppo", + + // "admin.access-control.groups.title.singleGroup": "Edit Group", + "admin.access-control.groups.title.singleGroup": "Modifica gruppo", + + // "admin.access-control.groups.title.addGroup": "New Group", + "admin.access-control.groups.title.addGroup": "Nuovo Gruppo", + + // "admin.access-control.groups.addGroup.breadcrumbs": "New Group", + "admin.access-control.groups.addGroup.breadcrumbs": "Nuovo Gruppo", + + // "admin.access-control.groups.head": "Groups", + // TODO Source message changed - Revise the translation + "admin.access-control.groups.head": "Gruppi/Ruoli", + + // "admin.access-control.groups.button.add": "Add group", + "admin.access-control.groups.button.add": "Aggiungi gruppo", + + // "admin.access-control.groups.search.head": "Search groups", + "admin.access-control.groups.search.head": "Gruppi di ricerca", + + // "admin.access-control.groups.button.see-all": "Browse all", + "admin.access-control.groups.button.see-all": "Sfoglia tutti", + + // "admin.access-control.groups.search.button": "Search", + "admin.access-control.groups.search.button": "Ricerca", + + // "admin.access-control.groups.search.placeholder": "Search groups...", + "admin.access-control.groups.search.placeholder": "Cerca gruppi...", + + // "admin.access-control.groups.table.id": "ID", + "admin.access-control.groups.table.id": "ID", + + // "admin.access-control.groups.table.name": "Name", + "admin.access-control.groups.table.name": "Nome", + + // "admin.access-control.groups.table.collectionOrCommunity": "Collection/Community", + "admin.access-control.groups.table.collectionOrCommunity": "Collection/Community", + + // "admin.access-control.groups.table.members": "Members", + "admin.access-control.groups.table.members": "Membri", + + // "admin.access-control.groups.table.edit": "Edit", + "admin.access-control.groups.table.edit": "Editare", + + // "admin.access-control.groups.table.edit.buttons.edit": "Edit \"{{name}}\"", + "admin.access-control.groups.table.edit.buttons.edit": "Modifica \"{{name}}\"", + + // "admin.access-control.groups.table.edit.buttons.remove": "Delete \"{{name}}\"", + // TODO New key - Add a translation + "admin.access-control.groups.table.edit.buttons.remove": "Delete \"{{name}}\"", + + // "admin.access-control.groups.no-items": "No groups found with this in their name or this as UUID", + "admin.access-control.groups.no-items": "Nessun gruppo trovato con questo nel loro nome o questo come UUID", + + // "admin.access-control.groups.notification.deleted.success": "Successfully deleted group \"{{name}}\"", + "admin.access-control.groups.notification.deleted.success": "Gruppo eliminato con successo \"{{name}}\"", + + // "admin.access-control.groups.notification.deleted.failure.title": "Failed to delete group \"{{name}}\"", + "admin.access-control.groups.notification.deleted.failure.title": "Impossibile eliminare il gruppo \"{{name}}\"", + + // "admin.access-control.groups.notification.deleted.failure.content": "Cause: \"{{cause}}\"", + "admin.access-control.groups.notification.deleted.failure.content": "Causa: \"{{cause}}\"", + + + + // "admin.access-control.groups.form.alert.permanent": "This group is permanent, so it can't be edited or deleted. You can still add and remove group members using this page.", + "admin.access-control.groups.form.alert.permanent": "Questo gruppo è permanente, quindi non può essere modificato o eliminato. Puoi comunque aggiungere e rimuovere membri del gruppo utilizzando questa pagina.", + + // "admin.access-control.groups.form.alert.workflowGroup": "This group can’t be modified or deleted because it corresponds to a role in the submission and workflow process in the \"{{name}}\" {{comcol}}. You can delete it from the \"assign roles\" tab on the edit {{comcol}} page. You can still add and remove group members using this page.", + "admin.access-control.groups.form.alert.workflowGroup": "Questo gruppo non può essere modificato o eliminato perché corrisponde a un ruolo nella submission e processo del workflow nel \"{{name}}\" {{comcol}}. Puoi eliminarlo dal Tab \"assegna ruoli\" nella pagina di modifica {{comcol}}. Puoi ancora aggiungere e rimuovere membri del gruppo da questa pagina.", + + // "admin.access-control.groups.form.head.create": "Create group", + "admin.access-control.groups.form.head.create": "Crea gruppo", + + // "admin.access-control.groups.form.head.edit": "Edit group", + "admin.access-control.groups.form.head.edit": "Modifica gruppo", + + // "admin.access-control.groups.form.groupName": "Group name", + "admin.access-control.groups.form.groupName": "Nome del gruppo", + + // "admin.access-control.groups.form.groupCommunity": "Community or Collection", + "admin.access-control.groups.form.groupCommunity": "Community o collection", + + // "admin.access-control.groups.form.groupDescription": "Description", + "admin.access-control.groups.form.groupDescription": "Descrizione", + + // "admin.access-control.groups.form.notification.created.success": "Successfully created Group \"{{name}}\"", + "admin.access-control.groups.form.notification.created.success": "Gruppo creato con successo \"{{name}}\"", + + // "admin.access-control.groups.form.notification.created.failure": "Failed to create Group \"{{name}}\"", + "admin.access-control.groups.form.notification.created.failure": "Impossibile creare il gruppo \"{{name}}\"", + + // "admin.access-control.groups.form.notification.created.failure.groupNameInUse": "Failed to create Group with name: \"{{name}}\", make sure the name is not already in use.", + "admin.access-control.groups.form.notification.created.failure.groupNameInUse": "Impossibile creare il Gruppo con nome: \"{{name}}\", assicurarsi che il nome non sia già in uso.", + + // "admin.access-control.groups.form.notification.edited.failure": "Failed to edit Group \"{{name}}\"", + "admin.access-control.groups.form.notification.edited.failure": "Impossibile modificare il gruppo \"{{name}}\"", + + // "admin.access-control.groups.form.notification.edited.failure.groupNameInUse": "Name \"{{name}}\" already in use!", + "admin.access-control.groups.form.notification.edited.failure.groupNameInUse": "Nome \"{{name}}\" già in uso!", + + // "admin.access-control.groups.form.notification.edited.success": "Successfully edited Group \"{{name}}\"", + "admin.access-control.groups.form.notification.edited.success": "Gruppo modificato correttamente \"{{name}}\"", + + // "admin.access-control.groups.form.actions.delete": "Delete Group", + "admin.access-control.groups.form.actions.delete": "Elimina gruppo", + + // "admin.access-control.groups.form.delete-group.modal.header": "Delete Group \"{{ dsoName }}\"", + "admin.access-control.groups.form.delete-group.modal.header": "Elimina gruppo \"{{ dsoName }}\"", + + // "admin.access-control.groups.form.delete-group.modal.info": "Are you sure you want to delete Group \"{{ dsoName }}\"", + "admin.access-control.groups.form.delete-group.modal.info": "Sei sicuro di voler eliminare gruppo \"{{ dsoName }}\"", + + // "admin.access-control.groups.form.delete-group.modal.cancel": "Cancel", + "admin.access-control.groups.form.delete-group.modal.cancel": "Annulla", + + // "admin.access-control.groups.form.delete-group.modal.confirm": "Delete", + "admin.access-control.groups.form.delete-group.modal.confirm": "Cancellare", + + // "admin.access-control.groups.form.notification.deleted.success": "Successfully deleted group \"{{ name }}\"", + "admin.access-control.groups.form.notification.deleted.success": "Gruppo eliminato con successo \"{{ name }}\"", + + // "admin.access-control.groups.form.notification.deleted.failure.title": "Failed to delete group \"{{ name }}\"", + "admin.access-control.groups.form.notification.deleted.failure.title": "Impossibile eliminare il gruppo \"{{ name }}\"", + + // "admin.access-control.groups.form.notification.deleted.failure.content": "Cause: \"{{ cause }}\"", + "admin.access-control.groups.form.notification.deleted.failure.content": "Causa: \"{{ cause }}\"", + + // "admin.access-control.groups.form.members-list.head": "EPeople", + "admin.access-control.groups.form.members-list.head": "EPeople", + + // "admin.access-control.groups.form.members-list.search.head": "Add EPeople", + "admin.access-control.groups.form.members-list.search.head": "Aggiungi EPeople", + + // "admin.access-control.groups.form.members-list.button.see-all": "Browse All", + "admin.access-control.groups.form.members-list.button.see-all": "Sfoglia tutto", + + // "admin.access-control.groups.form.members-list.headMembers": "Current Members", + "admin.access-control.groups.form.members-list.headMembers": "Membri attuali", + + // "admin.access-control.groups.form.members-list.search.scope.metadata": "Metadata", + "admin.access-control.groups.form.members-list.search.scope.metadata": "Metadati", + + // "admin.access-control.groups.form.members-list.search.scope.email": "E-mail (exact)", + "admin.access-control.groups.form.members-list.search.scope.email": "E-mail (esatta)", + + // "admin.access-control.groups.form.members-list.search.button": "Search", + "admin.access-control.groups.form.members-list.search.button": "Ricerca", + + // "admin.access-control.groups.form.members-list.table.id": "ID", + "admin.access-control.groups.form.members-list.table.id": "ID", + + // "admin.access-control.groups.form.members-list.table.name": "Name", + "admin.access-control.groups.form.members-list.table.name": "Nome", + + // "admin.access-control.groups.form.members-list.table.identity": "Identity", + "admin.access-control.groups.form.members-list.table.identity": "Identità", + + // "admin.access-control.groups.form.members-list.table.email": "Email", + "admin.access-control.groups.form.members-list.table.email": "E-mail", + + // "admin.access-control.groups.form.members-list.table.netid": "NetID", + "admin.access-control.groups.form.members-list.table.netid": "NetID", + + // "admin.access-control.groups.form.members-list.table.edit": "Remove / Add", + "admin.access-control.groups.form.members-list.table.edit": "Rimuovi / Aggiungi", + + // "admin.access-control.groups.form.members-list.table.edit.buttons.remove": "Remove member with name \"{{name}}\"", + "admin.access-control.groups.form.members-list.table.edit.buttons.remove": "Rimuovi membro con nome \"{{name}}\"", + + // "admin.access-control.groups.form.members-list.notification.success.addMember": "Successfully added member: \"{{name}}\"", + "admin.access-control.groups.form.members-list.notification.success.addMember": "Membro aggiunto con successo: \"{{name}}\"", + + // "admin.access-control.groups.form.members-list.notification.failure.addMember": "Failed to add member: \"{{name}}\"", + "admin.access-control.groups.form.members-list.notification.failure.addMember": "Impossibile aggiungere il membro: \"{{name}}\"", + + // "admin.access-control.groups.form.members-list.notification.success.deleteMember": "Successfully deleted member: \"{{name}}\"", + "admin.access-control.groups.form.members-list.notification.success.deleteMember": "Membro eliminato con successo: \"{{name}}\"", + + // "admin.access-control.groups.form.members-list.notification.failure.deleteMember": "Failed to delete member: \"{{name}}\"", + "admin.access-control.groups.form.members-list.notification.failure.deleteMember": "Impossibile eliminare il membro: \"{{name}}\"", + + // "admin.access-control.groups.form.members-list.table.edit.buttons.add": "Add member with name \"{{name}}\"", + "admin.access-control.groups.form.members-list.table.edit.buttons.add": "Aggiungi membro con nome \"{{name}}\"", + + // "admin.access-control.groups.form.members-list.notification.failure.noActiveGroup": "No current active group, submit a name first.", + "admin.access-control.groups.form.members-list.notification.failure.noActiveGroup": "Nessun gruppo corrente attivo, invia prima un nome.", + + // "admin.access-control.groups.form.members-list.no-members-yet": "No members in group yet, search and add.", + "admin.access-control.groups.form.members-list.no-members-yet": "Ancora nessun membro del gruppo, cercali e aggiungili.", + + // "admin.access-control.groups.form.members-list.no-items": "No EPeople found in that search", + "admin.access-control.groups.form.members-list.no-items": "Nessun EPeople trovato in quella ricerca", + + // "admin.access-control.groups.form.subgroups-list.notification.failure": "Something went wrong: \"{{cause}}\"", + "admin.access-control.groups.form.subgroups-list.notification.failure": "Qualcosa è andato storto: \"{{cause}}\"", + + // "admin.access-control.groups.form.subgroups-list.head": "Groups", + "admin.access-control.groups.form.subgroups-list.head": "Gruppi", + + // "admin.access-control.groups.form.subgroups-list.search.head": "Add Subgroup", + "admin.access-control.groups.form.subgroups-list.search.head": "Aggiungi sottogruppo", + + // "admin.access-control.groups.form.subgroups-list.button.see-all": "Browse All", + "admin.access-control.groups.form.subgroups-list.button.see-all": "Sfoglia tutto", + + // "admin.access-control.groups.form.subgroups-list.headSubgroups": "Current Subgroups", + "admin.access-control.groups.form.subgroups-list.headSubgroups": "Sottogruppi attuali", + + // "admin.access-control.groups.form.subgroups-list.search.button": "Search", + "admin.access-control.groups.form.subgroups-list.search.button": "Ricerca", + + // "admin.access-control.groups.form.subgroups-list.table.id": "ID", + "admin.access-control.groups.form.subgroups-list.table.id": "ID", + + // "admin.access-control.groups.form.subgroups-list.table.name": "Name", + "admin.access-control.groups.form.subgroups-list.table.name": "Nome", + + // "admin.access-control.groups.form.subgroups-list.table.collectionOrCommunity": "Collection/Community", + "admin.access-control.groups.form.subgroups-list.table.collectionOrCommunity": "collection/Community", + + // "admin.access-control.groups.form.subgroups-list.table.edit": "Remove / Add", + "admin.access-control.groups.form.subgroups-list.table.edit": "Rimuovi / Aggiungi", + + // "admin.access-control.groups.form.subgroups-list.table.edit.buttons.remove": "Remove subgroup with name \"{{name}}\"", + "admin.access-control.groups.form.subgroups-list.table.edit.buttons.remove": "Rimuovi sottogruppo con nome \"{{name}}\"", + + // "admin.access-control.groups.form.subgroups-list.table.edit.buttons.add": "Add subgroup with name \"{{name}}\"", + "admin.access-control.groups.form.subgroups-list.table.edit.buttons.add": "Aggiungi sottogruppo con nome \"{{name}}\"", + + // "admin.access-control.groups.form.subgroups-list.table.edit.currentGroup": "Current group", + "admin.access-control.groups.form.subgroups-list.table.edit.currentGroup": "Gruppo attuale", + + // "admin.access-control.groups.form.subgroups-list.notification.success.addSubgroup": "Successfully added subgroup: \"{{name}}\"", + "admin.access-control.groups.form.subgroups-list.notification.success.addSubgroup": "Sottogruppo aggiunto con successo: \"{{name}}\"", + + // "admin.access-control.groups.form.subgroups-list.notification.failure.addSubgroup": "Failed to add subgroup: \"{{name}}\"", + "admin.access-control.groups.form.subgroups-list.notification.failure.addSubgroup": "Impossibile aggiungere il sottogruppo: \"{{name}}\"", + + // "admin.access-control.groups.form.subgroups-list.notification.success.deleteSubgroup": "Successfully deleted subgroup: \"{{name}}\"", + "admin.access-control.groups.form.subgroups-list.notification.success.deleteSubgroup": "Sottogruppo eliminato con successo: \"{{name}}\"", + + // "admin.access-control.groups.form.subgroups-list.notification.failure.deleteSubgroup": "Failed to delete subgroup: \"{{name}}\"", + "admin.access-control.groups.form.subgroups-list.notification.failure.deleteSubgroup": "Impossibile eliminare il sottogruppo: \"{{name}}\"", + + // "admin.access-control.groups.form.subgroups-list.notification.failure.noActiveGroup": "No current active group, submit a name first.", + "admin.access-control.groups.form.subgroups-list.notification.failure.noActiveGroup": "Al momento nessun gruppo attivo, invia prima un nome.", + + // "admin.access-control.groups.form.subgroups-list.notification.failure.subgroupToAddIsActiveGroup": "This is the current group, can't be added.", + "admin.access-control.groups.form.subgroups-list.notification.failure.subgroupToAddIsActiveGroup": "Questo è il gruppo corrente, non può essere aggiunto.", + + // "admin.access-control.groups.form.subgroups-list.no-items": "No groups found with this in their name or this as UUID", + "admin.access-control.groups.form.subgroups-list.no-items": "Nessun gruppo trovato con questo nel loro nome o questo come UUID", + + // "admin.access-control.groups.form.subgroups-list.no-subgroups-yet": "No subgroups in group yet.", + "admin.access-control.groups.form.subgroups-list.no-subgroups-yet": "Nessun sottogruppo ancora nel gruppo.", + + // "admin.access-control.groups.form.return": "Back", + "admin.access-control.groups.form.return": "Indietro", + + + + // "admin.search.breadcrumbs": "Administrative Search", + "admin.search.breadcrumbs": "Ricerca amministrativa", + + // "admin.search.collection.edit": "Edit", + "admin.search.collection.edit": "Editare", + + // "admin.search.community.edit": "Edit", + "admin.search.community.edit": "Editare", + + // "admin.search.item.delete": "Delete", + "admin.search.item.delete": "Cancellare", + + // "admin.search.item.edit": "Edit", + "admin.search.item.edit": "Editare", + + // "admin.search.item.make-private": "Make non-discoverable", + "admin.search.item.make-private": "Rendi privato", + + // "admin.search.item.make-public": "Make discoverable", + "admin.search.item.make-public": "Rendi pubblico", + + // "admin.search.item.move": "Move", + "admin.search.item.move": "Sposta", + + // "admin.search.item.reinstate": "Reinstate", + "admin.search.item.reinstate": "Reintegrare", + + // "admin.search.item.withdraw": "Withdraw", + "admin.search.item.withdraw": "Ritirare", + + // "admin.search.title": "Administrative Search", + "admin.search.title": "Ricerca amministrativa", + + // "administrativeView.search.results.head": "Administrative Search", + "administrativeView.search.results.head": "Ricerca amministrativa", + + + + + // "admin.workflow.breadcrumbs": "Administer Workflow", + "admin.workflow.breadcrumbs": "Amministrare il flusso di lavoro", + + // "admin.workflow.title": "Administer Workflow", + "admin.workflow.title": "Amministrare il flusso di lavoro", + + // "admin.workflow.item.workflow": "Workflow", + "admin.workflow.item.workflow": "Flusso di lavoro", + + // "admin.workflow.item.delete": "Delete", + "admin.workflow.item.delete": "Cancellare", + + // "admin.workflow.item.send-back": "Send back", + "admin.workflow.item.send-back": "Rinviare", + + + + // "admin.metadata-import.breadcrumbs": "Import Metadata", + "admin.metadata-import.breadcrumbs": "Importare metadati", + + // "admin.batch-import.breadcrumbs": "Import Batch", + // TODO New key - Add a translation + "admin.batch-import.breadcrumbs": "Import Batch", + + // "admin.metadata-import.title": "Import Metadata", + "admin.metadata-import.title": "Importare metadati", + + // "admin.batch-import.title": "Import Batch", + // TODO New key - Add a translation + "admin.batch-import.title": "Import Batch", + + // "admin.metadata-import.page.header": "Import Metadata", + "admin.metadata-import.page.header": "Importare metadati", + + // "admin.batch-import.page.header": "Import Batch", + // TODO New key - Add a translation + "admin.batch-import.page.header": "Import Batch", + + // "admin.metadata-import.page.help": "You can drop or browse CSV files that contain batch metadata operations on files here", + "admin.metadata-import.page.help": "È possibile eliminare o sfogliare i file CSV che contengono operazioni di metadati batch sui file qui", + + // "admin.batch-import.page.help": "Select the Collection to import into. Then, drop or browse to a Simple Archive Format (SAF) zip file that includes the Items to import", + // TODO New key - Add a translation + "admin.batch-import.page.help": "Select the Collection to import into. Then, drop or browse to a Simple Archive Format (SAF) zip file that includes the Items to import", + + // "admin.metadata-import.page.dropMsg": "Drop a metadata CSV to import", + "admin.metadata-import.page.dropMsg": "Rilasciare un CSV di metadati da importare", + + // "admin.batch-import.page.dropMsg": "Drop a batch ZIP to import", + // TODO New key - Add a translation + "admin.batch-import.page.dropMsg": "Drop a batch ZIP to import", + + // "admin.metadata-import.page.dropMsgReplace": "Drop to replace the metadata CSV to import", + "admin.metadata-import.page.dropMsgReplace": "Rilascia per sostituire i metadati CSV da importare", + + // "admin.batch-import.page.dropMsgReplace": "Drop to replace the batch ZIP to import", + // TODO New key - Add a translation + "admin.batch-import.page.dropMsgReplace": "Drop to replace the batch ZIP to import", + + // "admin.metadata-import.page.button.return": "Back", + "admin.metadata-import.page.button.return": "Indietro", + + // "admin.metadata-import.page.button.proceed": "Proceed", + "admin.metadata-import.page.button.proceed": "Procedere", + + // "admin.metadata-import.page.button.select-collection": "Select Collection", + // TODO New key - Add a translation + "admin.metadata-import.page.button.select-collection": "Select Collection", + + // "admin.metadata-import.page.error.addFile": "Select file first!", + "admin.metadata-import.page.error.addFile": "Seleziona prima il file!", + + // "admin.batch-import.page.error.addFile": "Select Zip file first!", + // TODO New key - Add a translation + "admin.batch-import.page.error.addFile": "Select Zip file first!", + + // "admin.metadata-import.page.validateOnly": "Validate Only", + "admin.metadata-import.page.validateOnly": "Solo Validazione", + + // "admin.metadata-import.page.validateOnly.hint": "When selected, the uploaded CSV will be validated. You will receive a report of detected changes, but no changes will be saved.", + "admin.metadata-import.page.validateOnly.hint": "Una volta selezionato, il CSV caricato sarà validato. Riceverai un report delle modifiche rilevate, ma nessuna modifica verrà salvata.", + + // "admin.batch-import.page.validateOnly.hint": "When selected, the uploaded ZIP will be validated. You will receive a report of detected changes, but no changes will be saved.", + // TODO New key - Add a translation + "admin.batch-import.page.validateOnly.hint": "When selected, the uploaded ZIP will be validated. You will receive a report of detected changes, but no changes will be saved.", + + // "admin.batch-import.page.remove": "remove", + // TODO New key - Add a translation + "admin.batch-import.page.remove": "remove", + + // "auth.errors.invalid-user": "Invalid email address or password.", + "auth.errors.invalid-user": "Indirizzo e-mail o password non validi.", + + // "auth.messages.expired": "Your session has expired. Please log in again.", + "auth.messages.expired": "La sessione è scaduta. Effettua nuovamente l'accesso.", + + // "auth.messages.token-refresh-failed": "Refreshing your session token failed. Please log in again.", + "auth.messages.token-refresh-failed": "Aggiornamento del token di sessione non riuscito. Effettua nuovamente l'accesso.", + + + + // "bitstream.download.page": "Now downloading {{bitstream}}..." , + "bitstream.download.page": "Sto scaricando {{bitstream}}...", + + // "bitstream.download.page.back": "Back" , + // TODO Source message changed - Revise the translation + "bitstream.download.page.back": "Indietro", + + + // "bitstream.edit.authorizations.link": "Edit bitstream's Policies", + "bitstream.edit.authorizations.link": "Modificare i criteri di bitstream", + + // "bitstream.edit.authorizations.title": "Edit bitstream's Policies", + "bitstream.edit.authorizations.title": "Modificare i criteri di bitstream", + + // "bitstream.edit.return": "Back", + "bitstream.edit.return": "Indietro", + + // "bitstream.edit.bitstream": "Bitstream: ", + "bitstream.edit.bitstream": "Bitstream: ", + + // "bitstream.edit.form.description.hint": "Optionally, provide a brief description of the file, for example \"Main article\" or \"Experiment data readings\".", + "bitstream.edit.form.description.hint": "Facoltativamente, fornire una breve descrizione del file, ad esempio \"Articolo principale\" o \"Dati dell'esperimento \".", + + // "bitstream.edit.form.description.label": "Description", + "bitstream.edit.form.description.label": "Descrizione", + + // "bitstream.edit.form.embargo.hint": "The first day from which access is allowed. This date cannot be modified on this form. To set an embargo date for a bitstream, go to the Item Status tab, click Authorizations..., create or edit the bitstream's READ policy, and set the Start Date as desired.", + "bitstream.edit.form.embargo.hint": "Si tratta del primo giorno da cui è consentito l'accesso. Questa data non può essere modificata in questo form. Per impostare una data di embargo per un bitstream, vai alla scheda Item Status fare clic su Autorizzazioni... creare o modifica la policy del READ e imposta la Start Date come desiderato.", + + // "bitstream.edit.form.embargo.label": "Embargo until specific date", + "bitstream.edit.form.embargo.label": "Embargo fino a data specifica", + + // "bitstream.edit.form.fileName.hint": "Change the filename for the bitstream. Note that this will change the display bitstream URL, but old links will still resolve as long as the sequence ID does not change.", + "bitstream.edit.form.fileName.hint": "Modificare il nome del file per il bitstream. Si noti che questo cambierà il display bitstream URL , i vecchi collegamenti verranno comunque risolti finché il sequence ID non cambierà  .", + + // "bitstream.edit.form.fileName.label": "Filename", + "bitstream.edit.form.fileName.label": "Filename", + + // "bitstream.edit.form.newFormat.label": "Describe new format", + "bitstream.edit.form.newFormat.label": "Descrivi il nuovo formato", + + // "bitstream.edit.form.newFormat.hint": "The application you used to create the file, and the version number (for example, \"ACMESoft SuperApp version 1.5\").", + "bitstream.edit.form.newFormat.hint": "L'applicazione utilizzata per creare il file e il numero di versione (ad esempio \"ACMESoft SuperApp versione 1.5\").", + + // "bitstream.edit.form.primaryBitstream.label": "Primary bitstream", + "bitstream.edit.form.primaryBitstream.label": "Primary bitstream", + + // "bitstream.edit.form.selectedFormat.hint": "If the format is not in the above list, select \"format not in list\" above and describe it under \"Describe new format\".", + "bitstream.edit.form.selectedFormat.hint": "Se il formato non è presente nell'elenco precedente, selezionare \"formato non presente in elenco\" sopra e descriverlo in \"Descrivi nuovo formato.", + + // "bitstream.edit.form.selectedFormat.label": "Selected Format", + "bitstream.edit.form.selectedFormat.label": "Formato selezionato", + + // "bitstream.edit.form.selectedFormat.unknown": "Format not in list", + "bitstream.edit.form.selectedFormat.unknown": "Formato non presente nell'elenco", + + // "bitstream.edit.notifications.error.format.title": "An error occurred saving the bitstream's format", + "bitstream.edit.notifications.error.format.title": "Si è verificato un errore durante il salvataggio del formato del bitstream", + + // "bitstream.edit.form.iiifLabel.label": "IIIF Label", + "bitstream.edit.form.iiifLabel.label": "Etichetta IIIF", + + // "bitstream.edit.form.iiifLabel.hint": "Canvas label for this image. If not provided default label will be used.", + "bitstream.edit.form.iiifLabel.hint": "Etichetta canvas per questa immagine. Se non viene fornita, verrà utilizzata l'etichetta predefinita.", + + // "bitstream.edit.form.iiifToc.label": "IIIF Table of Contents", + "bitstream.edit.form.iiifToc.label": "Sommario IIIF", + + // "bitstream.edit.form.iiifToc.hint": "Adding text here makes this the start of a new table of contents range.", + "bitstream.edit.form.iiifToc.hint": "L'aggiunta di testo qui rende questo l'inizio di un nuovo intervallo di sommario.", + + // "bitstream.edit.form.iiifWidth.label": "IIIF Canvas Width", + "bitstream.edit.form.iiifWidth.label": "Larghezza area di lavoro IIIF", + + // "bitstream.edit.form.iiifWidth.hint": "The canvas width should usually match the image width.", + "bitstream.edit.form.iiifWidth.hint": "La larghezza dell'area di lavoro deve in genere corrispondere alla larghezza dell'immagine.", + + // "bitstream.edit.form.iiifHeight.label": "IIIF Canvas Height", + "bitstream.edit.form.iiifHeight.label": "Altezza area di lavoro IIIF", + + // "bitstream.edit.form.iiifHeight.hint": "The canvas height should usually match the image height.", + "bitstream.edit.form.iiifHeight.hint": "L'altezza dell'area di lavoro deve in genere corrispondere all'altezza dell'immagine.", + + + // "bitstream.edit.notifications.saved.content": "Your changes to this bitstream were saved.", + "bitstream.edit.notifications.saved.content": "Le modifiche apportate a questo bitstream sono state salvate.", + + // "bitstream.edit.notifications.saved.title": "Bitstream saved", + "bitstream.edit.notifications.saved.title": "Bitstream salvato", + + // "bitstream.edit.title": "Edit bitstream", + "bitstream.edit.title": "Modifica bitstream", + + // "bitstream-request-a-copy.alert.canDownload1": "You already have access to this file. If you want to download the file, click ", + "bitstream-request-a-copy.alert.canDownload1": "Hai già accesso a questo file. Se si desidera scaricare il file, fare clic su", + + // "bitstream-request-a-copy.alert.canDownload2": "here", + "bitstream-request-a-copy.alert.canDownload2": "qui", + + // "bitstream-request-a-copy.header": "Request a copy of the file", + "bitstream-request-a-copy.header": "Richiedi una copia del file", + + // "bitstream-request-a-copy.intro": "Enter the following information to request a copy for the following item: ", + "bitstream-request-a-copy.intro": "Inserisci le seguenti informazioni per richiedere una copia per l'item seguente: ", + + // "bitstream-request-a-copy.intro.bitstream.one": "Requesting the following file: ", + "bitstream-request-a-copy.intro.bitstream.one": "Richiesta del seguente file: ", + // "bitstream-request-a-copy.intro.bitstream.all": "Requesting all files. ", + "bitstream-request-a-copy.intro.bitstream.all": "Richiesta di tutti i file.", + + // "bitstream-request-a-copy.name.label": "Name *", + "bitstream-request-a-copy.name.label": "Nome *", + + // "bitstream-request-a-copy.name.error": "The name is required", + "bitstream-request-a-copy.name.error": "Il nome è obbligatorio", + + // "bitstream-request-a-copy.email.label": "Your e-mail address *", + "bitstream-request-a-copy.email.label": "Il tuo indirizzo e-mail *", + + // "bitstream-request-a-copy.email.hint": "This email address is used for sending the file.", + "bitstream-request-a-copy.email.hint": "Questo indirizzo e-mail viene utilizzato per l'invio del file.", + + // "bitstream-request-a-copy.email.error": "Please enter a valid email address.", + "bitstream-request-a-copy.email.error": "Inserisci un indirizzo email valido.", + + // "bitstream-request-a-copy.allfiles.label": "Files", + "bitstream-request-a-copy.allfiles.label": "File", + + // "bitstream-request-a-copy.files-all-false.label": "Only the requested file", + "bitstream-request-a-copy.files-all-false.label": "Solo il file richiesto", + + // "bitstream-request-a-copy.files-all-true.label": "All files (of this item) in restricted access", + "bitstream-request-a-copy.files-all-true.label": "Tutti i file (di questo item) in accesso limitato", + + // "bitstream-request-a-copy.message.label": "Message", + "bitstream-request-a-copy.message.label": "Messaggio", + + // "bitstream-request-a-copy.return": "Back", + "bitstream-request-a-copy.return": "Indietro", + + // "bitstream-request-a-copy.submit": "Request copy", + "bitstream-request-a-copy.submit": "Richiedi copia", + + // "bitstream-request-a-copy.submit.success": "The item request was submitted successfully.", + "bitstream-request-a-copy.submit.success": "La richiesta di invio è stata inviata correttamente.", + + // "bitstream-request-a-copy.submit.error": "Something went wrong with submitting the item request.", + "bitstream-request-a-copy.submit.error": "Qualcosa è andato storto con l'invio della richiesta dell'item.", + + + + // "browse.back.all-results": "All browse results", + "browse.back.all-results": "Tutti i risultati", + + // "browse.comcol.by.author": "By Author", + "browse.comcol.by.author": "Per Autore", + + // "browse.comcol.by.dateissued": "By Issue Date", + "browse.comcol.by.dateissued": "Per data di pubblicazione", + + // "browse.comcol.by.subject": "By Subject", + "browse.comcol.by.subject": "Per argomento", + + // "browse.comcol.by.title": "By Title", + "browse.comcol.by.title": "Per titolo", + + // "browse.comcol.head": "Browse", + "browse.comcol.head": "Sfogliare", + + // "browse.empty": "No items to show.", + "browse.empty": "Nessun item da mostrare.", + + // "browse.metadata.author": "Author", + "browse.metadata.author": "Autore", + + // "browse.metadata.dateissued": "Issue Date", + "browse.metadata.dateissued": "Data di pubblicazione", + + // "browse.metadata.subject": "Subject", + "browse.metadata.subject": "Subject", + + // "browse.metadata.title": "Title", + "browse.metadata.title": "Titolo", + + // "browse.metadata.author.breadcrumbs": "Browse by Author", + "browse.metadata.author.breadcrumbs": "Sfoglia per Autore", + + // "browse.metadata.dateissued.breadcrumbs": "Browse by Date", + "browse.metadata.dateissued.breadcrumbs": "Sfoglia per Data", + + // "browse.metadata.subject.breadcrumbs": "Browse by Subject", + "browse.metadata.subject.breadcrumbs": "Sfoglia per Argomento", + + // "browse.metadata.title.breadcrumbs": "Browse by Title", + "browse.metadata.title.breadcrumbs": "Sfoglia per Titolo", + + // "pagination.next.button": "Next", + "pagination.next.button": "Avanti", + + // "pagination.previous.button": "Previous", + "pagination.previous.button": "Precedente", + + // "pagination.next.button.disabled.tooltip": "No more pages of results", + "pagination.next.button.disabled.tooltip": "Non ci sono ulteriori pagine di risultati", + + // "browse.startsWith": ", starting with {{ startsWith }}", + // TODO New key - Add a translation + "browse.startsWith": ", starting with {{ startsWith }}", + + // "browse.startsWith.choose_start": "(Choose start)", + "browse.startsWith.choose_start": "(Scegli start)", + + // "browse.startsWith.choose_year": "(Choose year)", + "browse.startsWith.choose_year": "(Scegli l'anno)", + + // "browse.startsWith.choose_year.label": "Choose the issue year", + "browse.startsWith.choose_year.label": "Scegli l'anno di pubblicazione", + + // "browse.startsWith.jump": "Filter results by year or month", + "browse.startsWith.jump": "Filtra i risultati per anno o mese", + + // "browse.startsWith.months.april": "April", + "browse.startsWith.months.april": "Aprile", + + // "browse.startsWith.months.august": "August", + "browse.startsWith.months.august": "Agosto", + + // "browse.startsWith.months.december": "December", + "browse.startsWith.months.december": "Dicembre", + + // "browse.startsWith.months.february": "February", + "browse.startsWith.months.february": "Febbraio", + + // "browse.startsWith.months.january": "January", + "browse.startsWith.months.january": "Gennaio", + + // "browse.startsWith.months.july": "July", + "browse.startsWith.months.july": "Luglio", + + // "browse.startsWith.months.june": "June", + "browse.startsWith.months.june": "Giugno", + + // "browse.startsWith.months.march": "March", + "browse.startsWith.months.march": "Marzo", + + // "browse.startsWith.months.may": "May", + "browse.startsWith.months.may": "Maggio", + + // "browse.startsWith.months.none": "(Choose month)", + "browse.startsWith.months.none": "(Scegli il mese)", + + // "browse.startsWith.months.none.label": "Choose the issue month", + "browse.startsWith.months.none.label": "Scegli il mese di pubblicazione", + + // "browse.startsWith.months.november": "November", + "browse.startsWith.months.november": "Novembre", + + // "browse.startsWith.months.october": "October", + "browse.startsWith.months.october": "Ottobre", + + // "browse.startsWith.months.september": "September", + "browse.startsWith.months.september": "Settembre", + + // "browse.startsWith.submit": "Browse", + "browse.startsWith.submit": "Sfogliare", + + // "browse.startsWith.type_date": "Filter results by date", + "browse.startsWith.type_date": "Filtra per data", + + // "browse.startsWith.type_date.label": "Or type in a date (year-month) and click on the Browse button", + "browse.startsWith.type_date.label": "Oppure digita una data (anno-mese) e clicca sul pulsante Sfoglia", + + // "browse.startsWith.type_text": "Filter results by typing the first few letters", + "browse.startsWith.type_text": "Per filtrare i risultati inizia a digitare le prime lettere", + + // "browse.title": "Browsing {{ collection }} by {{ field }}{{ startsWith }} {{ value }}", + "browse.title": "Mostra il contenuto di {{ collection }} per {{ field }}{{ startsWith }} {{ value }}", + + // "browse.title.page": "Browsing {{ collection }} by {{ field }} {{ value }}", + "browse.title.page": "Mostra il contenuto di {{ collection }} per {{ field }} {{ value }}", + + + // "chips.remove": "Remove chip", + "chips.remove": "Rimuovere il chip", + + + + // "collection.create.head": "Create a Collection", + "collection.create.head": "Creare una collection", + + // "collection.create.notifications.success": "Successfully created the Collection", + "collection.create.notifications.success": "Creata con successo la collection", + + // "collection.create.sub-head": "Create a Collection for Community {{ parent }}", + "collection.create.sub-head": "Creare una collection per la Community {{ parent }}", + + // "collection.curate.header": "Curate Collection: {{collection}}", + "collection.curate.header": "Curate della collezione: {{collection}}", + + // "collection.delete.cancel": "Cancel", + "collection.delete.cancel": "Annulla", + + // "collection.delete.confirm": "Confirm", + "collection.delete.confirm": "Confermare", + + // "collection.delete.processing": "Deleting", + "collection.delete.processing": "Eliminazione", + + // "collection.delete.head": "Delete Collection", + "collection.delete.head": "Elimina collection", + + // "collection.delete.notification.fail": "Collection could not be deleted", + "collection.delete.notification.fail": "Impossibile eliminare la collection", + + // "collection.delete.notification.success": "Successfully deleted collection", + "collection.delete.notification.success": "collection eliminata correttamente", + + // "collection.delete.text": "Are you sure you want to delete collection \"{{ dso }}\"", + "collection.delete.text": "Sei sicuro di voler eliminare la collection \"{{ dso }}\"", + + + + // "collection.edit.delete": "Delete this collection", + "collection.edit.delete": "Elimina questa collection", + + // "collection.edit.head": "Edit Collection", + "collection.edit.head": "Modifica collection", + + // "collection.edit.breadcrumbs": "Edit Collection", + "collection.edit.breadcrumbs": "Modifica collection", + + + + // "collection.edit.tabs.mapper.head": "Item Mapper", + "collection.edit.tabs.mapper.head": "Mapper dell' Item", + + // "collection.edit.tabs.item-mapper.title": "Collection Edit - Item Mapper", + "collection.edit.tabs.item-mapper.title": "Modifica collection - Mapper dell'item", + + // "collection.edit.item-mapper.cancel": "Cancel", + "collection.edit.item-mapper.cancel": "Annulla", + + // "collection.edit.item-mapper.collection": "Collection: \"{{name}}\"", + "collection.edit.item-mapper.collection": "Collezione: \"{{name}}\"", + + // "collection.edit.item-mapper.confirm": "Map selected items", + "collection.edit.item-mapper.confirm": "Mappare gli item selezionati", + + // "collection.edit.item-mapper.description": "This is the item mapper tool that allows collection administrators to map items from other collections into this collection. You can search for items from other collections and map them, or browse the list of currently mapped items.", + "collection.edit.item-mapper.description": "Si tratta dello strumento di mapping degli item che consente agli amministratori della collection di mappare gli item di altre collections in questa collection. È possibile cercare item di altre collections e mapparli o sfogliare l'elenco degli item attualmente mappati.", + + // "collection.edit.item-mapper.head": "Item Mapper - Map Items from Other Collections", + "collection.edit.item-mapper.head": "Item Mapper - Mappa item di altre collections", + + // "collection.edit.item-mapper.no-search": "Please enter a query to search", + "collection.edit.item-mapper.no-search": "Inserisci una query per avviare la ricerca", + + // "collection.edit.item-mapper.notifications.map.error.content": "Errors occurred for mapping of {{amount}} items.", + "collection.edit.item-mapper.notifications.map.error.content": "Si sono verificati errori per la mappatura degli item {{amount}}.", + + // "collection.edit.item-mapper.notifications.map.error.head": "Mapping errors", + "collection.edit.item-mapper.notifications.map.error.head": "Errori di mappatura", + + // "collection.edit.item-mapper.notifications.map.success.content": "Successfully mapped {{amount}} items.", + "collection.edit.item-mapper.notifications.map.success.content": "Mappato correttamente gli item {{amount}}.", + + // "collection.edit.item-mapper.notifications.map.success.head": "Mapping completed", + "collection.edit.item-mapper.notifications.map.success.head": "Mappatura completata", + + // "collection.edit.item-mapper.notifications.unmap.error.content": "Errors occurred for removing the mappings of {{amount}} items.", + "collection.edit.item-mapper.notifications.unmap.error.content": "Si sono verificati errori per la rimozione dei mapping degli item {{amount}}.", + + // "collection.edit.item-mapper.notifications.unmap.error.head": "Remove mapping errors", + "collection.edit.item-mapper.notifications.unmap.error.head": "Rimuovere gli errori di mappatura", + + // "collection.edit.item-mapper.notifications.unmap.success.content": "Successfully removed the mappings of {{amount}} items.", + "collection.edit.item-mapper.notifications.unmap.success.content": "Rimosse con successo le mappature degli item {{amount}}.", + + // "collection.edit.item-mapper.notifications.unmap.success.head": "Remove mapping completed", + "collection.edit.item-mapper.notifications.unmap.success.head": "Rimuovere la mappatura completata", + + // "collection.edit.item-mapper.remove": "Remove selected item mappings", + "collection.edit.item-mapper.remove": "Rimuovere i mapping degli item selezionati", + + // "collection.edit.item-mapper.search-form.placeholder": "Search items...", + "collection.edit.item-mapper.search-form.placeholder": "Cerca item...", + + // "collection.edit.item-mapper.tabs.browse": "Browse mapped items", + "collection.edit.item-mapper.tabs.browse": "Sfoglia gli item mappati", + + // "collection.edit.item-mapper.tabs.map": "Map new items", + "collection.edit.item-mapper.tabs.map": "Mappare nuovi item", + + + // "collection.edit.logo.delete.title": "Delete logo", + "collection.edit.logo.delete.title": "Annulla eliminazione", + + // "collection.edit.logo.delete-undo.title": "Undo delete", + "collection.edit.logo.delete-undo.title": "Elimina logo", + + // "collection.edit.logo.label": "Collection logo", + "collection.edit.logo.label": "Logo della collection", + + // "collection.edit.logo.notifications.add.error": "Uploading Collection logo failed. Please verify the content before retrying.", + "collection.edit.logo.notifications.add.error": "Caricamento del logo della collection non riuscito. Verifica il contenuto prima di riprovare.", + + // "collection.edit.logo.notifications.add.success": "Upload Collection logo successful.", + "collection.edit.logo.notifications.add.success": "Caricamento del logo della collection riuscito.", + + // "collection.edit.logo.notifications.delete.success.title": "Logo deleted", + "collection.edit.logo.notifications.delete.success.title": "Logo cancellato", + + // "collection.edit.logo.notifications.delete.success.content": "Successfully deleted the collection's logo", + "collection.edit.logo.notifications.delete.success.content": "Eliminato con successo il logo della collection", + + // "collection.edit.logo.notifications.delete.error.title": "Error deleting logo", + "collection.edit.logo.notifications.delete.error.title": "Errore durante l'eliminazione del logo", + + // "collection.edit.logo.upload": "Drop a Collection Logo to upload", + "collection.edit.logo.upload": "Rilascia un logo della collection da caricare", + + + + // "collection.edit.notifications.success": "Successfully edited the Collection", + "collection.edit.notifications.success": "Modificata correttamente la collection", + + // "collection.edit.return": "Back", + "collection.edit.return": "Indietro", + + + + // "collection.edit.tabs.curate.head": "Curate", + "collection.edit.tabs.curate.head": "Curate", + + // "collection.edit.tabs.curate.title": "Collection Edit - Curate", + "collection.edit.tabs.curate.title": "Modifica collection - Curate", + + // "collection.edit.tabs.authorizations.head": "Authorizations", + "collection.edit.tabs.authorizations.head": "Autorizzazioni", + + // "collection.edit.tabs.authorizations.title": "Collection Edit - Authorizations", + "collection.edit.tabs.authorizations.title": "Collection Edit - Autorizzazioni", + + // "collection.edit.item.authorizations.load-bundle-button": "Load more bundles", + "collection.edit.item.authorizations.load-bundle-button": "Carica più bundles", + + // "collection.edit.item.authorizations.load-more-button": "Load more", + "collection.edit.item.authorizations.load-more-button": "Carica più risorse", + + // "collection.edit.item.authorizations.show-bitstreams-button": "Show bitstream policies for bundle", + // TODO New key - Add a translation + "collection.edit.item.authorizations.show-bitstreams-button": "Show bitstream policies for bundle", + + // "collection.edit.tabs.metadata.head": "Edit Metadata", + "collection.edit.tabs.metadata.head": "Modifica metadati", + + // "collection.edit.tabs.metadata.title": "Collection Edit - Metadata", + "collection.edit.tabs.metadata.title": "Modifica collection - Metadati", + + // "collection.edit.tabs.roles.head": "Assign Roles", + "collection.edit.tabs.roles.head": "Assegna ruoli", + + // "collection.edit.tabs.roles.title": "Collection Edit - Roles", + "collection.edit.tabs.roles.title": "Modifica collection - Ruoli", + + // "collection.edit.tabs.source.external": "This collection harvests its content from an external source", + "collection.edit.tabs.source.external": "Questa collection raccoglie il suo contenuto da una fonte esterna", + + // "collection.edit.tabs.source.form.errors.oaiSource.required": "You must provide a set id of the target collection.", + "collection.edit.tabs.source.form.errors.oaiSource.required": "È necessario fornire un ID impostato della collection di destinazione.", + + // "collection.edit.tabs.source.form.harvestType": "Content being harvested", + "collection.edit.tabs.source.form.harvestType": "Contenuto che è stato harvestato", + + // "collection.edit.tabs.source.form.head": "Configure an external source", + "collection.edit.tabs.source.form.head": "Configurare un'origine esterna", + + // "collection.edit.tabs.source.form.metadataConfigId": "Metadata Format", + "collection.edit.tabs.source.form.metadataConfigId": "Formato dei metadati", + + // "collection.edit.tabs.source.form.oaiSetId": "OAI specific set id", + "collection.edit.tabs.source.form.oaiSetId": "ID set specifico OAI", + + // "collection.edit.tabs.source.form.oaiSource": "OAI Provider", + "collection.edit.tabs.source.form.oaiSource": "OAI Provider", + + // "collection.edit.tabs.source.form.options.harvestType.METADATA_AND_BITSTREAMS": "Harvest metadata and bitstreams (requires ORE support)", + "collection.edit.tabs.source.form.options.harvestType.METADATA_AND_BITSTREAMS": "Harvest metadati e flussi di bit (richiede il supporto ORE)", + + // "collection.edit.tabs.source.form.options.harvestType.METADATA_AND_REF": "Harvest metadata and references to bitstreams (requires ORE support)", + "collection.edit.tabs.source.form.options.harvestType.METADATA_AND_REF": "Harvest di metadati e riferimenti a bitstream (richiede il supporto ORE)", + + // "collection.edit.tabs.source.form.options.harvestType.METADATA_ONLY": "Harvest metadata only", + "collection.edit.tabs.source.form.options.harvestType.METADATA_ONLY": "Harvesta solo metadati", + + // "collection.edit.tabs.source.head": "Content Source", + "collection.edit.tabs.source.head": "Origine del contenuto", + + // "collection.edit.tabs.source.notifications.discarded.content": "Your changes were discarded. To reinstate your changes click the 'Undo' button", + "collection.edit.tabs.source.notifications.discarded.content": "Le modifiche sono state annullate. Per ripristinarle, fai clic sul pulsante \"Annulla\"", + + // "collection.edit.tabs.source.notifications.discarded.title": "Changes discarded", + // TODO Source message changed - Revise the translation + "collection.edit.tabs.source.notifications.discarded.title": "Modifiche eliminate", + + // "collection.edit.tabs.source.notifications.invalid.content": "Your changes were not saved. Please make sure all fields are valid before you save.", + "collection.edit.tabs.source.notifications.invalid.content": "Le modifiche non sono state salvate. Assicurati che tutti i campi siano validi prima di salvare.", + + // "collection.edit.tabs.source.notifications.invalid.title": "Metadata invalid", + "collection.edit.tabs.source.notifications.invalid.title": "Metadati non validi", + + // "collection.edit.tabs.source.notifications.saved.content": "Your changes to this collection's content source were saved.", + "collection.edit.tabs.source.notifications.saved.content": "Le modifiche apportate all'origine di contenuto della collection sono state salvate.", + + // "collection.edit.tabs.source.notifications.saved.title": "Content Source saved", + "collection.edit.tabs.source.notifications.saved.title": "Origine contenuto salvata", + + // "collection.edit.tabs.source.title": "Collection Edit - Content Source", + "collection.edit.tabs.source.title": "Modifica collection - Origine contenuto", + + + + // "collection.edit.template.add-button": "Add", + "collection.edit.template.add-button": "Aggiungere", + + // "collection.edit.template.breadcrumbs": "Item template", + "collection.edit.template.breadcrumbs": "Modello di Item", + + // "collection.edit.template.cancel": "Cancel", + "collection.edit.template.cancel": "Annulla", + + // "collection.edit.template.delete-button": "Delete", + "collection.edit.template.delete-button": "Cancellare", + + // "collection.edit.template.edit-button": "Edit", + "collection.edit.template.edit-button": "Editare", + + // "collection.edit.template.error": "An error occurred retrieving the template item", + "collection.edit.template.error": "Si è verificato un errore durante il recupero del modello dell' Item", + + // "collection.edit.template.head": "Edit Template Item for Collection \"{{ collection }}\"", + "collection.edit.template.head": "Modifica item modello per la collection \"{{ collection }}\"", + + // "collection.edit.template.label": "Template item", + "collection.edit.template.label": "Template per Item", + + // "collection.edit.template.loading": "Loading template item...", + "collection.edit.template.loading": "Caricamento del Template per Item...", + + // "collection.edit.template.notifications.delete.error": "Failed to delete the item template", + "collection.edit.template.notifications.delete.error": "Impossibile eliminare il Template dell' Item", + + // "collection.edit.template.notifications.delete.success": "Successfully deleted the item template", + "collection.edit.template.notifications.delete.success": "Eliminato correttamente il Template dell' Item", + + // "collection.edit.template.title": "Edit Template Item", + "collection.edit.template.title": "Modifica Template dell' Item", + + + + // "collection.form.abstract": "Short Description", + "collection.form.abstract": "Breve descrizione", + + // "collection.form.description": "Introductory text (HTML)", + "collection.form.description": "Testo introduttivo (HTML)", + + // "collection.form.errors.title.required": "Please enter a collection name", + "collection.form.errors.title.required": "Inserisci il nome di una collection", + + // "collection.form.license": "License", + "collection.form.license": "Licenza", + + // "collection.form.provenance": "Provenance", + "collection.form.provenance": "Provenienza", + + // "collection.form.rights": "Copyright text (HTML)", + "collection.form.rights": "Testo protetto da copyright (HTML)", + + // "collection.form.tableofcontents": "News (HTML)", + "collection.form.tableofcontents": "News (HTML)", + + // "collection.form.title": "Name", + "collection.form.title": "Nome", + + // "collection.form.entityType": "Entity Type", + "collection.form.entityType": "Tipo di entità", + + + + // "collection.listelement.badge": "Collection", + "collection.listelement.badge": "collection", + + + + // "collection.page.browse.recent.head": "Recent Submissions", + "collection.page.browse.recent.head": "submissions recenti", + + // "collection.page.browse.recent.empty": "No items to show", + "collection.page.browse.recent.empty": "Nessun item da mostrare", + + // "collection.page.edit": "Edit this collection", + "collection.page.edit": "Modifica questa collection", + + // "collection.page.handle": "Permanent URI for this collection", + "collection.page.handle": "URI permanente per questa collection", + + // "collection.page.license": "License", + "collection.page.license": "Licenza", + + // "collection.page.news": "News", + "collection.page.news": "News", + + + + // "collection.select.confirm": "Confirm selected", + "collection.select.confirm": "Conferma selezionato", + + // "collection.select.empty": "No collections to show", + "collection.select.empty": "Nessuna collection da mostrare", + + // "collection.select.table.title": "Title", + "collection.select.table.title": "Titolo", + + + // "collection.source.controls.head": "Harvest Controls", + "collection.source.controls.head": "Controlli del Harvester", + // "collection.source.controls.test.submit.error": "Something went wrong with initiating the testing of the settings", + "collection.source.controls.test.submit.error": "Qualcosa è andato storto con l'avvio del test delle impostazioni", + // "collection.source.controls.test.failed": "The script to test the settings has failed", + "collection.source.controls.test.failed": "Lo script per testare le impostazioni non è riuscito", + // "collection.source.controls.test.completed": "The script to test the settings has successfully finished", + "collection.source.controls.test.completed": "Lo script per testare le impostazioni è stato completato correttamente", + // "collection.source.controls.test.submit": "Test configuration", + "collection.source.controls.test.submit": "Configurazione di prova", + // "collection.source.controls.test.running": "Testing configuration...", + "collection.source.controls.test.running": "Configurazione di test...", + // "collection.source.controls.import.submit.success": "The import has been successfully initiated", + "collection.source.controls.import.submit.success": "L'importazione è stata avviata correttamente", + // "collection.source.controls.import.submit.error": "Something went wrong with initiating the import", + "collection.source.controls.import.submit.error": "Qualcosa è andato storto con l'avvio dell'importazione", + // "collection.source.controls.import.submit": "Import now", + "collection.source.controls.import.submit": "Importa ora", + // "collection.source.controls.import.running": "Importing...", + "collection.source.controls.import.running": "Importazione...", + // "collection.source.controls.import.failed": "An error occurred during the import", + "collection.source.controls.import.failed": "Si è verificato un errore durante l'importazione", + // "collection.source.controls.import.completed": "The import completed", + "collection.source.controls.import.completed": "L'importazione completata", + // "collection.source.controls.reset.submit.success": "The reset and reimport has been successfully initiated", + "collection.source.controls.reset.submit.success": "Il ripristino e la reimportazione sono stati avviati correttamente", + // "collection.source.controls.reset.submit.error": "Something went wrong with initiating the reset and reimport", + "collection.source.controls.reset.submit.error": "Qualcosa è andato storto con l'avvio del ripristino e della reimportazione", + // "collection.source.controls.reset.failed": "An error occurred during the reset and reimport", + "collection.source.controls.reset.failed": "Si è verificato un errore durante il ripristino e la reimportazione", + // "collection.source.controls.reset.completed": "The reset and reimport completed", + "collection.source.controls.reset.completed": "Il ripristino e la reimportazione completati", + // "collection.source.controls.reset.submit": "Reset and reimport", + "collection.source.controls.reset.submit": "Reimpostazione e reimportazione", + // "collection.source.controls.reset.running": "Resetting and reimporting...", + "collection.source.controls.reset.running": "Reimpostazione e reimportazione...", + // "collection.source.controls.harvest.status": "Harvest status:", + // TODO New key - Add a translation + "collection.source.controls.harvest.status": "Harvest status:", + // "collection.source.controls.harvest.start": "Harvest start time:", + // TODO New key - Add a translation + "collection.source.controls.harvest.start": "Harvest start time:", + // "collection.source.controls.harvest.last": "Last time harvested:", + // TODO New key - Add a translation + "collection.source.controls.harvest.last": "Last time harvested:", + // "collection.source.controls.harvest.message": "Harvest info:", + // TODO New key - Add a translation + "collection.source.controls.harvest.message": "Harvest info:", + // "collection.source.controls.harvest.no-information": "N/A", + "collection.source.controls.harvest.no-information": "N/D", + + + // "collection.source.update.notifications.error.content": "The provided settings have been tested and didn't work.", + "collection.source.update.notifications.error.content": "Le impostazioni fornite sono state testate e non hanno funzionato.", + + // "collection.source.update.notifications.error.title": "Server Error", + "collection.source.update.notifications.error.title": "Errore del server", + + + + // "communityList.breadcrumbs": "Community List", + "communityList.breadcrumbs": "Elenco della Community", + + // "communityList.tabTitle": "Community List", + "communityList.tabTitle": "Elenco della Community", + + // "communityList.title": "List of Communities", + "communityList.title": "Elenco delle Community", + + // "communityList.showMore": "Show More", + "communityList.showMore": "Mostra di più", + + + + // "community.create.head": "Create a Community", + "community.create.head": "Crea una Community", + + // "community.create.notifications.success": "Successfully created the Community", + "community.create.notifications.success": "Community creata con successo", + + // "community.create.sub-head": "Create a Sub-Community for Community {{ parent }}", + "community.create.sub-head": "Creare una sotto-Community per la Community {{ parent }}", + + // "community.curate.header": "Curate Community: {{community}}", + "community.curate.header": "Curate della Community: {{community}}", + + // "community.delete.cancel": "Cancel", + "community.delete.cancel": "Annulla", + + // "community.delete.confirm": "Confirm", + "community.delete.confirm": "Conferma", + + // "community.delete.processing": "Deleting...", + "community.delete.processing": "Eliminazione...", + + // "community.delete.head": "Delete Community", + "community.delete.head": "Elimina la community", + + // "community.delete.notification.fail": "Community could not be deleted", + "community.delete.notification.fail": "Impossibile eliminare la community", + + // "community.delete.notification.success": "Successfully deleted community", + "community.delete.notification.success": "Community eliminata con successo", + + // "community.delete.text": "Are you sure you want to delete community \"{{ dso }}\"", + "community.delete.text": "Sei sicuro di voler eliminare la community \"{{ dso }}\"", + + // "community.edit.delete": "Delete this community", + "community.edit.delete": "Elimina questa community", + + // "community.edit.head": "Edit Community", + "community.edit.head": "Modifica la community", + + // "community.edit.breadcrumbs": "Edit Community", + "community.edit.breadcrumbs": "Modifica la community", + + + // "community.edit.logo.delete.title": "Delete logo", + "community.edit.logo.delete.title": "Elimina logo", + + // "community.edit.logo.delete-undo.title": "Undo delete", + "community.edit.logo.delete-undo.title": "Annulla l'eliminazione", + + // "community.edit.logo.label": "Community logo", + "community.edit.logo.label": "Logo della community", + + // "community.edit.logo.notifications.add.error": "Uploading Community logo failed. Please verify the content before retrying.", + "community.edit.logo.notifications.add.error": "Caricamento del logo della community non riuscito. Verifica il contenuto prima di riprovare.", + + // "community.edit.logo.notifications.add.success": "Upload Community logo successful.", + "community.edit.logo.notifications.add.success": "Il logo della community è stato caricato con successo.", + + // "community.edit.logo.notifications.delete.success.title": "Logo deleted", + "community.edit.logo.notifications.delete.success.title": "Logo eliminato", + + // "community.edit.logo.notifications.delete.success.content": "Successfully deleted the community's logo", + "community.edit.logo.notifications.delete.success.content": "Il logo della community è stato eliminato con successo", + + // "community.edit.logo.notifications.delete.error.title": "Error deleting logo", + "community.edit.logo.notifications.delete.error.title": "Errore durante l'eliminazione del logo", + + // "community.edit.logo.upload": "Drop a Community Logo to upload", + "community.edit.logo.upload": "Rilascia un logo della community da caricare", + + + + // "community.edit.notifications.success": "Successfully edited the Community", + "community.edit.notifications.success": "La community è stata modificata con successo", + + // "community.edit.notifications.unauthorized": "You do not have privileges to make this change", + "community.edit.notifications.unauthorized": "Non si dispone dei privilegi per apportare questa modifica", + + // "community.edit.notifications.error": "An error occured while editing the Community", + "community.edit.notifications.error": "Si è verificato un errore durante la modifica della community", + + // "community.edit.return": "Back", + "community.edit.return": "Indietro", + + + + // "community.edit.tabs.curate.head": "Curate", + "community.edit.tabs.curate.head": "Curate", + + // "community.edit.tabs.curate.title": "Community Edit - Curate", + "community.edit.tabs.curate.title": "Modifica community - Curate", + + // "community.edit.tabs.metadata.head": "Edit Metadata", + "community.edit.tabs.metadata.head": "Modifica metadati", + + // "community.edit.tabs.metadata.title": "Community Edit - Metadata", + "community.edit.tabs.metadata.title": "Modifica community - Metadati", + + // "community.edit.tabs.roles.head": "Assign Roles", + "community.edit.tabs.roles.head": "Assegna ruoli", + + // "community.edit.tabs.roles.title": "Community Edit - Roles", + "community.edit.tabs.roles.title": "Modifica community - Ruoli", + + // "community.edit.tabs.authorizations.head": "Authorizations", + "community.edit.tabs.authorizations.head": "Autorizzazioni", + + // "community.edit.tabs.authorizations.title": "Community Edit - Authorizations", + "community.edit.tabs.authorizations.title": "Modifica community - Autorizzazioni", + + + + // "community.listelement.badge": "Community", + "community.listelement.badge": "Community", + + + + // "comcol-role.edit.no-group": "None", + "comcol-role.edit.no-group": "Nessuno", + + // "comcol-role.edit.create": "Create", + "comcol-role.edit.create": "Crea", + + // "comcol-role.edit.create.error.title": "Failed to create a group for the '{{ role }}' role", + "comcol-role.edit.create.error.title": "Non è stato possibile creare un gruppo per il ruolo '{{ role }}'", + + // "comcol-role.edit.restrict": "Restrict", + "comcol-role.edit.restrict": "Restringi", + + // "comcol-role.edit.delete": "Delete", + "comcol-role.edit.delete": "Cancella", + + // "comcol-role.edit.delete.error.title": "Failed to delete the '{{ role }}' role's group", + "comcol-role.edit.delete.error.title": "Non è stato possibile cancellare il ruolo '{{ role }}' del gruppo", + + + // "comcol-role.edit.community-admin.name": "Administrators", + "comcol-role.edit.community-admin.name": "Amministratori", + + // "comcol-role.edit.collection-admin.name": "Administrators", + "comcol-role.edit.collection-admin.name": "Amministratori", + + + // "comcol-role.edit.community-admin.description": "Community administrators can create sub-communities or collections, and manage or assign management for those sub-communities or collections. In addition, they decide who can submit items to any sub-collections, edit item metadata (after submission), and add (map) existing items from other collections (subject to authorization).", + "comcol-role.edit.community-admin.description": "Gli amministratori della community possono creare sotto-community o collections e gestire o assegnare la loro gestione. Inoltre, decidono chi può depositare item in qualsiasi sotto-collections, modificare i metadati degli item (dopo l'invio) e aggiungere (mappare) item esistenti da altre collections (previa autorizzazione).", + + // "comcol-role.edit.collection-admin.description": "Collection administrators decide who can submit items to the collection, edit item metadata (after submission), and add (map) existing items from other collections to this collection (subject to authorization for that collection).", + "comcol-role.edit.collection-admin.description": "Gli amministratori della collection decidono chi può depositare item nella collection, modificare i metadati dell'item (dopo l'invio) e aggiungere (mappare) item da altre collections a questa collection (soggetto all'autorizzazione per tale collection).", + + + // "comcol-role.edit.submitters.name": "Submitters", + "comcol-role.edit.submitters.name": "Submitters", + + // "comcol-role.edit.submitters.description": "The E-People and Groups that have permission to submit new items to this collection.", + "comcol-role.edit.submitters.description": "E-People e Gruppi che dispongono dell'autorizzazione per depositare nuovi item in questa collection.", + + + // "comcol-role.edit.item_read.name": "Default item read access", + "comcol-role.edit.item_read.name": "Accesso di sola lettura per gli item", + + // "comcol-role.edit.item_read.description": "E-People and Groups that can read new items submitted to this collection. Changes to this role are not retroactive. Existing items in the system will still be viewable by those who had read access at the time of their addition.", + "comcol-role.edit.item_read.description": "E-People e gruppi in grado di leggere i nuovi item depositati in questa collection. Le modifiche a questo ruolo non sono retroattive. Gli item esistenti nel sistema saranno ancora visualizzabili da coloro che avevano accesso in sola lettura al momento della loro archiviazione.", + + // "comcol-role.edit.item_read.anonymous-group": "Default read for incoming items is currently set to Anonymous.", + "comcol-role.edit.item_read.anonymous-group": "L'accesso di sola lettura per gli item depositati è attualmente impostata su Anonimo.", + + + // "comcol-role.edit.bitstream_read.name": "Default bitstream read access", + "comcol-role.edit.bitstream_read.name": "Accesso di sola lettura per il bitstream", + + // "comcol-role.edit.bitstream_read.description": "Community administrators can create sub-communities or collections, and manage or assign management for those sub-communities or collections. In addition, they decide who can submit items to any sub-collections, edit item metadata (after submission), and add (map) existing items from other collections (subject to authorization).", + "comcol-role.edit.bitstream_read.description": "Gli amministratori della community possono creare sotto-community o collections e gestire o assegnare la loro gestione. Inoltre, decidono chi può depositare item in qualsiasi sotto-collections, modificare i metadati degli item (dopo l'invio) e aggiungere (mappare) item esistenti da altre collections (previa autorizzazione).", + + // "comcol-role.edit.bitstream_read.anonymous-group": "Default read for incoming bitstreams is currently set to Anonymous.", + "comcol-role.edit.bitstream_read.anonymous-group": "L'accesso di sola lettura per i bitstreams depositati è attualmente impostata su Anonimo.", + + + // "comcol-role.edit.editor.name": "Editors", + "comcol-role.edit.editor.name": "Editor", + + // "comcol-role.edit.editor.description": "Editors are able to edit the metadata of incoming submissions, and then accept or reject them.", + "comcol-role.edit.editor.description": "Gli editor possono modificare i metadati delle submissions depositate e quindi accettarli o rifiutarli.", + + + // "comcol-role.edit.finaleditor.name": "Final editors", + "comcol-role.edit.finaleditor.name": "Editor finali", + + // "comcol-role.edit.finaleditor.description": "Final editors are able to edit the metadata of incoming submissions, but will not be able to reject them.", + "comcol-role.edit.finaleditor.description": "Gli editor finali sono in grado di modificare i metadati delle submissions depositate, ma non saranno in grado di rifiutarli.", + + + // "comcol-role.edit.reviewer.name": "Reviewers", + "comcol-role.edit.reviewer.name": "Revisori", + + // "comcol-role.edit.reviewer.description": "Reviewers are able to accept or reject incoming submissions. However, they are not able to edit the submission's metadata.", + "comcol-role.edit.reviewer.description": "I revisori sono in grado di accettare o rifiutare le submissions depositate. Tuttavia, non sono in grado di modificare i metadati della submission.", + + + + // "community.form.abstract": "Short Description", + "community.form.abstract": "Breve descrizione", + + // "community.form.description": "Introductory text (HTML)", + "community.form.description": "Testo introduttivo (HTML)", + + // "community.form.errors.title.required": "Please enter a community name", + "community.form.errors.title.required": "Inserisci il nome di una community", + + // "community.form.rights": "Copyright text (HTML)", + "community.form.rights": "Testo protetto da copyright (HTML)", + + // "community.form.tableofcontents": "News (HTML)", + "community.form.tableofcontents": "News (HTML)", + + // "community.form.title": "Name", + "community.form.title": "Nome", + + // "community.page.edit": "Edit this community", + "community.page.edit": "Modifica questa community", + + // "community.page.handle": "Permanent URI for this community", + "community.page.handle": "URI permanente di questa Community", + + // "community.page.license": "License", + "community.page.license": "Licenza", + + // "community.page.news": "News", + "community.page.news": "News", + + // "community.all-lists.head": "Subcommunities and Collections", + "community.all-lists.head": "Sub-community e collections", + + // "community.sub-collection-list.head": "Collections of this Community", + "community.sub-collection-list.head": "Collections di questa community", + + // "community.sub-community-list.head": "Communities of this Community", + "community.sub-community-list.head": "Communities di questa Community", + + + + // "cookies.consent.accept-all": "Accept all", + "cookies.consent.accept-all": "Accetta tutto", + + // "cookies.consent.accept-selected": "Accept selected", + "cookies.consent.accept-selected": "Accetta la selezione", + + // "cookies.consent.app.opt-out.description": "This app is loaded by default (but you can opt out)", + "cookies.consent.app.opt-out.description": "Questa app è caricata con impostazione predefinita (ma puoi disattivare)", + + // "cookies.consent.app.opt-out.title": "(opt-out)", + "cookies.consent.app.opt-out.title": "(opt-out)", + + // "cookies.consent.app.purpose": "purpose", + "cookies.consent.app.purpose": "scopo", + + // "cookies.consent.app.required.description": "This application is always required", + "cookies.consent.app.required.description": "Questa applicazione è sempre richiesta", + + // "cookies.consent.app.required.title": "(always required)", + "cookies.consent.app.required.title": "(sempre obbligatorio)", + + // "cookies.consent.app.disable-all.description": "Use this switch to enable or disable all services.", + // TODO New key - Add a translation + "cookies.consent.app.disable-all.description": "Use this switch to enable or disable all services.", + + // "cookies.consent.app.disable-all.title": "Enable or disable all services", + // TODO New key - Add a translation + "cookies.consent.app.disable-all.title": "Enable or disable all services", + + // "cookies.consent.update": "There were changes since your last visit, please update your consent.", + "cookies.consent.update": "Ci sono stati dei cambiamenti dal tuo ultimo accesso, aggiorna il tuo consenso.", + + // "cookies.consent.close": "Close", + "cookies.consent.close": "Chiudere", + + // "cookies.consent.decline": "Decline", + "cookies.consent.decline": "Declinare", + + // "cookies.consent.ok": "That's ok", + // TODO New key - Add a translation + "cookies.consent.ok": "That's ok", + + // "cookies.consent.save": "Save", + // TODO New key - Add a translation + "cookies.consent.save": "Save", + + // "cookies.consent.content-notice.title": "Cookie Consent", + // TODO New key - Add a translation + "cookies.consent.content-notice.title": "Cookie Consent", + + // "cookies.consent.content-notice.description": "We collect and process your personal information for the following purposes: Authentication, Preferences, Acknowledgement and Statistics.
    To learn more, please read our {privacyPolicy}.", + "cookies.consent.content-notice.description": "Raccogliamo e processiamo le tue informazioni personali per i seguenti scopi: Autenticazione, Preferenze, Accettazione e Statistiche.
    Per saperne di più, leggi la nostra {privacyPolicy}.", + + // "cookies.consent.content-notice.description.no-privacy": "We collect and process your personal information for the following purposes: Authentication, Preferences, Acknowledgement and Statistics.", + // TODO New key - Add a translation + "cookies.consent.content-notice.description.no-privacy": "We collect and process your personal information for the following purposes: Authentication, Preferences, Acknowledgement and Statistics.", + + // "cookies.consent.content-notice.learnMore": "Customize", + "cookies.consent.content-notice.learnMore": "Personalizza", + + // "cookies.consent.content-modal.description": "Here you can see and customize the information that we collect about you.", + "cookies.consent.content-modal.description": "Qui puoi vedere e personalizzare le informazioni che raccogliamo su di te.", + + // "cookies.consent.content-modal.privacy-policy.name": "privacy policy", + "cookies.consent.content-modal.privacy-policy.name": "Informativa sulla privacy", + + // "cookies.consent.content-modal.privacy-policy.text": "To learn more, please read our {privacyPolicy}.", + "cookies.consent.content-modal.privacy-policy.text": "Per saperne di più, leggi la nostra {privacyPolicy}.", + + // "cookies.consent.content-modal.title": "Information that we collect", + "cookies.consent.content-modal.title": "Informazioni che raccogliamo", + + // "cookies.consent.content-modal.services": "services", + // TODO New key - Add a translation + "cookies.consent.content-modal.services": "services", + + // "cookies.consent.content-modal.service": "service", + // TODO New key - Add a translation + "cookies.consent.content-modal.service": "service", + + // "cookies.consent.app.title.authentication": "Authentication", + "cookies.consent.app.title.authentication": "Autenticazione", + + // "cookies.consent.app.description.authentication": "Required for signing you in", + "cookies.consent.app.description.authentication": "Necessario per l'accesso", + + + // "cookies.consent.app.title.preferences": "Preferences", + "cookies.consent.app.title.preferences": "Preferenze", + + // "cookies.consent.app.description.preferences": "Required for saving your preferences", + "cookies.consent.app.description.preferences": "Necessario per salvare le tue preferenze", + + + + // "cookies.consent.app.title.acknowledgement": "Acknowledgement", + "cookies.consent.app.title.acknowledgement": "Riconoscimento", + + // "cookies.consent.app.description.acknowledgement": "Required for saving your acknowledgements and consents", + "cookies.consent.app.description.acknowledgement": "Necessario per salvare i riconoscimenti e i consensi", + + + + // "cookies.consent.app.title.google-analytics": "Google Analytics", + "cookies.consent.app.title.google-analytics": "Google Analitica", + + // "cookies.consent.app.description.google-analytics": "Allows us to track statistical data", + "cookies.consent.app.description.google-analytics": "Ci permette di tracciare i dati statistici", + + + + // "cookies.consent.app.title.google-recaptcha": "Google reCaptcha", + // TODO New key - Add a translation + "cookies.consent.app.title.google-recaptcha": "Google reCaptcha", + + // "cookies.consent.app.description.google-recaptcha": "We use google reCAPTCHA service during registration and password recovery", + // TODO New key - Add a translation + "cookies.consent.app.description.google-recaptcha": "We use google reCAPTCHA service during registration and password recovery", + + + // "cookies.consent.purpose.functional": "Functional", + "cookies.consent.purpose.functional": "Funzionale", + + // "cookies.consent.purpose.statistical": "Statistical", + "cookies.consent.purpose.statistical": "Statistico", + + // "cookies.consent.purpose.registration-password-recovery": "Registration and Password recovery", + // TODO New key - Add a translation + "cookies.consent.purpose.registration-password-recovery": "Registration and Password recovery", + + // "cookies.consent.purpose.sharing": "Sharing", + "cookies.consent.purpose.sharing": "Condivisione", + + // "curation-task.task.citationpage.label": "Generate Citation Page", + // TODO New key - Add a translation + "curation-task.task.citationpage.label": "Generate Citation Page", + + // "curation-task.task.checklinks.label": "Check Links in Metadata", + "curation-task.task.checklinks.label": "Controllare i collegamenti nei metadati", + + // "curation-task.task.noop.label": "NOOP", + "curation-task.task.noop.label": "NOOP", + + // "curation-task.task.profileformats.label": "Profile Bitstream Formats", + "curation-task.task.profileformats.label": "Formati Bitstream del profilo", + + // "curation-task.task.requiredmetadata.label": "Check for Required Metadata", + "curation-task.task.requiredmetadata.label": "Verifica la disponibilità di metadati richiesti", + + // "curation-task.task.translate.label": "Microsoft Translator", + "curation-task.task.translate.label": "Microsoft Translator", + + // "curation-task.task.vscan.label": "Virus Scan", + "curation-task.task.vscan.label": "Scansione antivirus", + + + + // "curation.form.task-select.label": "Task:", + "curation.form.task-select.label": "Task:", + + // "curation.form.submit": "Start", + "curation.form.submit": "Inizio", + + // "curation.form.submit.success.head": "The curation task has been started successfully", + "curation.form.submit.success.head": "La curation task è stata avviata correttamente", + + // "curation.form.submit.success.content": "You will be redirected to the corresponding process page.", + "curation.form.submit.success.content": "Verrai reindirizzato alla pagina del processo corrispondente.", + + // "curation.form.submit.error.head": "Running the curation task failed", + "curation.form.submit.error.head": "Esecuzione della curation task non riuscita", + + // "curation.form.submit.error.content": "An error occured when trying to start the curation task.", + "curation.form.submit.error.content": "Si è verificato un errore durante il tentativo di avviare la curation task", + + // "curation.form.submit.error.invalid-handle": "Couldn't determine the handle for this object", + "curation.form.submit.error.invalid-handle": "Non è stato possibile determinare l'handle per questo oggetto", + + // "curation.form.handle.label": "Handle:", + "curation.form.handle.label": "Handle:", + + // "curation.form.handle.hint": "Hint: Enter [your-handle-prefix]/0 to run a task across entire site (not all tasks may support this capability)", + "curation.form.handle.hint": "Suggerimento: Inserisci [your-handle-prefix]/0 per eseguire il task in tutto il sito (non tutti i task supportano questa funzionalità)", + + + + // "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": "Gentile {{ recipientName }},\nIn risposta alla tua richiesta, mi dispiace informarti che non è possibile inviarti una copia del file(s) richiesto, riguardante il documento: \"{{ itemUrl }}\" ({{ itemName }}), di cui sono uno degli autori. \n\nCordiali saluti,\n{{ authorName }} <{{ authorEmail }}>", + + // "deny-request-copy.email.subject": "Request copy of document", + "deny-request-copy.email.subject": "Richiedi copia del documento", + + // "deny-request-copy.error": "An error occurred", + "deny-request-copy.error": "Si è verificato un errore", + + // "deny-request-copy.header": "Deny document copy request", + "deny-request-copy.header": "Nega richiesta di copia del documento", + + // "deny-request-copy.intro": "This message will be sent to the applicant of the request", + "deny-request-copy.intro": "Questo messaggio verrà inviato al richiedente della richiesta", + + // "deny-request-copy.success": "Successfully denied item request", + "deny-request-copy.success": "Richiesta di item rifiutata con successo", + + + + // "dso.name.untitled": "Untitled", + "dso.name.untitled": "Untitled", + + + + // "dso-selector.create.collection.head": "New collection", + "dso-selector.create.collection.head": "Nuova collection", + + // "dso-selector.create.collection.sub-level": "Create a new collection in", + "dso-selector.create.collection.sub-level": "Creare una nuova collection in", + + // "dso-selector.create.community.head": "New community", + "dso-selector.create.community.head": "Nuova Community", + + // "dso-selector.create.community.sub-level": "Create a new community in", + "dso-selector.create.community.sub-level": "Creare una nuova community in", + + // "dso-selector.create.community.top-level": "Create a new top-level community", + "dso-selector.create.community.top-level": "Creare una nuova community di primo livello", + + // "dso-selector.create.item.head": "New item", + "dso-selector.create.item.head": "Nuovo articolo", + + // "dso-selector.create.item.sub-level": "Create a new item in", + "dso-selector.create.item.sub-level": "Creare un nuovo item in", + + // "dso-selector.create.submission.head": "New submission", + "dso-selector.create.submission.head": "Nuova submission", + + // "dso-selector.edit.collection.head": "Edit collection", + "dso-selector.edit.collection.head": "Modifica collection", + + // "dso-selector.edit.community.head": "Edit community", + "dso-selector.edit.community.head": "Modifica Community", + + // "dso-selector.edit.item.head": "Edit item", + "dso-selector.edit.item.head": "Modifica item", + + // "dso-selector.error.title": "An error occurred searching for a {{ type }}", + "dso-selector.error.title": "Si è verificato un errore durante la ricerca di un {{ type }}", + + // "dso-selector.export-metadata.dspaceobject.head": "Export metadata from", + "dso-selector.export-metadata.dspaceobject.head": "Esportare metadati da", + + // "dso-selector.export-batch.dspaceobject.head": "Export Batch (ZIP) from", + // TODO New key - Add a translation + "dso-selector.export-batch.dspaceobject.head": "Export Batch (ZIP) from", + + // "dso-selector.import-batch.dspaceobject.head": "Import batch from", + // TODO New key - Add a translation + "dso-selector.import-batch.dspaceobject.head": "Import batch from", + + // "dso-selector.no-results": "No {{ type }} found", + "dso-selector.no-results": "Nessun {{ type }} trovato", + + // "dso-selector.placeholder": "Search for a {{ type }}", + "dso-selector.placeholder": "Cerca un {{ type }}", + + // "dso-selector.select.collection.head": "Select a collection", + "dso-selector.select.collection.head": "Seleziona una collection", + + // "dso-selector.set-scope.community.head": "Select a search scope", + "dso-selector.set-scope.community.head": "Selezionare un ambito di ricerca", + + // "dso-selector.set-scope.community.button": "Search all of DSpace", + "dso-selector.set-scope.community.button": "Cerca in tutto DSpace", + + // "dso-selector.set-scope.community.input-header": "Search for a community or collection", + "dso-selector.set-scope.community.input-header": "Cercare una community o una collection", + + // "dso-selector.claim.item.head": "Profile tips", + "dso-selector.claim.item.head": "Suggerimenti per il profilo", + + // "dso-selector.claim.item.body": "These are existing profiles that may be related to you. If you recognize yourself in one of these profiles, select it and on the detail page, among the options, choose to claim it. Otherwise you can create a new profile from scratch using the button below.", + "dso-selector.claim.item.body": "Questi sono profili esistenti che potrebbero essere correlati a te. Se ti riconosci in uno di questi profili, selezionalo e, nella pagina dei dettagli, tra le opzioni, scegli di collegarlo. In caso contrario, puoi creare un nuovo profilo cliccando il pulsante qui sotto.", + + // "dso-selector.claim.item.not-mine-label": "None of these are mine", + "dso-selector.claim.item.not-mine-label": "Nessuno di questi è il mio profilo", + + // "dso-selector.claim.item.create-from-scratch": "Create a new one", + "dso-selector.claim.item.create-from-scratch": "Crea uno nuovo profilo", + + // "confirmation-modal.export-metadata.header": "Export metadata for {{ dsoName }}", + "confirmation-modal.export-metadata.header": "Esportare i metadati per {{ dsoName }}", + + // "confirmation-modal.export-metadata.info": "Are you sure you want to export metadata for {{ dsoName }}", + "confirmation-modal.export-metadata.info": "Sei sicuro di voler esportare i metadati per {{ dsoName }}", + + // "confirmation-modal.export-metadata.cancel": "Cancel", + "confirmation-modal.export-metadata.cancel": "Annulla", + + // "confirmation-modal.export-metadata.confirm": "Export", + "confirmation-modal.export-metadata.confirm": "Export", + + // "confirmation-modal.export-batch.header": "Export batch (ZIP) for {{ dsoName }}", + // TODO New key - Add a translation + "confirmation-modal.export-batch.header": "Export batch (ZIP) for {{ dsoName }}", + + // "confirmation-modal.export-batch.info": "Are you sure you want to export batch (ZIP) for {{ dsoName }}", + // TODO New key - Add a translation + "confirmation-modal.export-batch.info": "Are you sure you want to export batch (ZIP) for {{ dsoName }}", + + // "confirmation-modal.export-batch.cancel": "Cancel", + // TODO New key - Add a translation + "confirmation-modal.export-batch.cancel": "Cancel", + + // "confirmation-modal.export-batch.confirm": "Export", + // TODO New key - Add a translation + "confirmation-modal.export-batch.confirm": "Export", + + // "confirmation-modal.delete-eperson.header": "Delete EPerson \"{{ dsoName }}\"", + "confirmation-modal.delete-eperson.header": "Elimina EPerson \"{{ dsoName }}\"", + + // "confirmation-modal.delete-eperson.info": "Are you sure you want to delete EPerson \"{{ dsoName }}\"", + "confirmation-modal.delete-eperson.info": "Sei sicuro di voler eliminare l'EPerson \"{{ dsoName }}\"", + + // "confirmation-modal.delete-eperson.cancel": "Cancel", + "confirmation-modal.delete-eperson.cancel": "Annulla", + + // "confirmation-modal.delete-eperson.confirm": "Delete", + "confirmation-modal.delete-eperson.confirm": "Elimina", + + // "confirmation-modal.delete-profile.header": "Delete Profile", + "confirmation-modal.delete-profile.header": "Elimina il profilo", + + // "confirmation-modal.delete-profile.info": "Are you sure you want to delete your profile", + "confirmation-modal.delete-profile.info": "Sei sicuro di voler eliminare il tuo profilo", + + // "confirmation-modal.delete-profile.cancel": "Cancel", + "confirmation-modal.delete-profile.cancel": "Annulla", + + // "confirmation-modal.delete-profile.confirm": "Delete", + "confirmation-modal.delete-profile.confirm": "Elimina", + + + // "error.bitstream": "Error fetching bitstream", + "error.bitstream": "Errore durante il recupero del bitstream", + + // "error.browse-by": "Error fetching items", + "error.browse-by": "Errore durante il recupero degli item", + + // "error.collection": "Error fetching collection", + "error.collection": "Errore durante il recupero della collection", + + // "error.collections": "Error fetching collections", + "error.collections": "Errore durante il recupero delle collections", + + // "error.community": "Error fetching community", + "error.community": "Errore durante il recupero della community", + + // "error.identifier": "No item found for the identifier", + "error.identifier": "Nessun item trovato per l'identificatore", + + // "error.default": "Error", + "error.default": "Errore", + + // "error.item": "Error fetching item", + "error.item": "Errore durante il recupero dell'item", + + // "error.items": "Error fetching items", + "error.items": "Errore durante il recupero degli item", + + // "error.objects": "Error fetching objects", + "error.objects": "Errore durante il recupero degli oggetti", + + // "error.recent-submissions": "Error fetching recent submissions", + "error.recent-submissions": "Errore durante il recupero delle submissions recenti", + + // "error.search-results": "Error fetching search results", + "error.search-results": "Errore durante il recupero dei risultati della ricerca", + + // "error.invalid-search-query": "Search query is not valid. Please check Solr query syntax best practices for further information about this error.", + "error.invalid-search-query": "La query di ricerca non è valida. Controllare Solr query syntax per ulteriori informazioni riguardo questo errore.", + + // "error.sub-collections": "Error fetching sub-collections", + "error.sub-collections": "Errore durante il recupero delle sottoreti", + + // "error.sub-communities": "Error fetching sub-communities", + "error.sub-communities": "Errore durante il recupero delle sottocomitarie", + + // "error.submission.sections.init-form-error": "An error occurred during section initialize, please check your input-form configuration. Details are below :

    ", + "error.submission.sections.init-form-error": "Si è verificato un errore durante l'inizializzazione della sezione, controllare la configurazione dell'input-form. Dettagli:

    ", + + // "error.top-level-communities": "Error fetching top-level communities", + "error.top-level-communities": "Errore durante il recupero delle community di primo livello", + + // "error.validation.license.notgranted": "You must grant this license to complete your submission. If you are unable to grant this license at this time you may save your work and return later or remove the submission.", + "error.validation.license.notgranted": "È necessario concedere questa licenza per completare la submission. Se non sei in grado di concedere questa licenza in questo momento, puoi salvare il tuo lavoro e tornare più tardi o rimuovere la submission.", + + // "error.validation.pattern": "This input is restricted by the current pattern: {{ pattern }}.", + // TODO New key - Add a translation + "error.validation.pattern": "This input is restricted by the current pattern: {{ pattern }}.", + + // "error.validation.filerequired": "The file upload is mandatory", + "error.validation.filerequired": "Il caricamento del file è obbligatorio", + + // "error.validation.required": "This field is required", + "error.validation.required": "Questo campo è obbligatorio", + + // "error.validation.NotValidEmail": "This E-mail is not a valid email", + "error.validation.NotValidEmail": "Questa e-mail non è un'e-mail valida", + + // "error.validation.emailTaken": "This E-mail is already taken", + "error.validation.emailTaken": "Questa e-mail è già in uso", + + // "error.validation.groupExists": "This group already exists", + "error.validation.groupExists": "Gruppo già esistente", + + + // "feed.description": "Syndication feed", + // TODO New key - Add a translation + "feed.description": "Syndication feed", + + + // "file-section.error.header": "Error obtaining files for this item", + "file-section.error.header": "Errore durante il recupero dei file per questo item", + + + + // "footer.copyright": "copyright © 2002-{{ year }}", + "footer.copyright": "copyright © 2002-{{ year }}", + + // "footer.link.dspace": "DSpace software", + "footer.link.dspace": "Software DSpace", + + // "footer.link.lyrasis": "LYRASIS", + "footer.link.lyrasis": "LYRASIS", + + // "footer.link.cookies": "Cookie settings", + "footer.link.cookies": "Impostazioni dei cookie", + + // "footer.link.privacy-policy": "Privacy policy", + "footer.link.privacy-policy": "Informativa sulla privacy", + + // "footer.link.end-user-agreement":"End User Agreement", + "footer.link.end-user-agreement": "Accordo con l'utente finale", + + // "footer.link.feedback":"Send Feedback", + "footer.link.feedback": "Invia Feedback", + + + + // "forgot-email.form.header": "Forgot Password", + "forgot-email.form.header": "Password dimenticata", + + // "forgot-email.form.info": "Enter the email address associated with the account.", + // TODO Source message changed - Revise the translation + "forgot-email.form.info": "Accedi a registra un account per iscriverti alle collections, per ricevere aggiornamenti via email e per poter inserire nuovi item in DSpace.", + + // "forgot-email.form.email": "Email Address *", + "forgot-email.form.email": "Indirizzo email *", + + // "forgot-email.form.email.error.required": "Please fill in an email address", + "forgot-email.form.email.error.required": "Si prega di inserire un indirizzo email", + + // "forgot-email.form.email.error.pattern": "Please fill in a valid email address", + "forgot-email.form.email.error.pattern": "Si prega di inserire un indirizzo email valido", + + // "forgot-email.form.email.hint": "An email will be sent to this address with a further instructions.", + // TODO Source message changed - Revise the translation + "forgot-email.form.email.hint": "Questo indirizzo verrà verificato e utilizzato come login name.", + + // "forgot-email.form.submit": "Reset password", + // TODO Source message changed - Revise the translation + "forgot-email.form.submit": "Salva", + + // "forgot-email.form.success.head": "Password reset email sent", + // TODO Source message changed - Revise the translation + "forgot-email.form.success.head": "Email di verifica inviata", + + // "forgot-email.form.success.content": "An email has been sent to {{ email }} containing a special URL and further instructions.", + "forgot-email.form.success.content": "È stata inviata un'email a {{ email }} contenente un URL speciale e ulteriori indicazioni.", + + // "forgot-email.form.error.head": "Error when trying to reset password", + // TODO Source message changed - Revise the translation + "forgot-email.form.error.head": "Errore durante il tentativo di registrare l'email", + + // "forgot-email.form.error.content": "An error occured when attempting to reset the password for the account associated with the following email address: {{ email }}", + // TODO New key - Add a translation + "forgot-email.form.error.content": "An error occured when attempting to reset the password for the account associated with the following email address: {{ email }}", + + + + // "forgot-password.title": "Forgot Password", + "forgot-password.title": "Password dimenticata", + + // "forgot-password.form.head": "Forgot Password", + "forgot-password.form.head": "Password dimenticata", + + // "forgot-password.form.info": "Enter a new password in the box below, and confirm it by typing it again into the second box.", + // TODO Source message changed - Revise the translation + "forgot-password.form.info": "Inserisci una nuova password nella casella qui sotto e confermala digitandola di nuovo nella seconda casella. Dovrebbe avere una lunghezza di almeno sei caratteri.", + + // "forgot-password.form.card.security": "Security", + "forgot-password.form.card.security": "Sicurezza", + + // "forgot-password.form.identification.header": "Identify", + "forgot-password.form.identification.header": "Identifica", + + // "forgot-password.form.identification.email": "Email address: ", + "forgot-password.form.identification.email": "Indirizzo email: ", + + // "forgot-password.form.label.password": "Password", + "forgot-password.form.label.password": "Password", + + // "forgot-password.form.label.passwordrepeat": "Retype to confirm", + "forgot-password.form.label.passwordrepeat": "Digita nuovamente per confermare", + + // "forgot-password.form.error.empty-password": "Please enter a password in the box below.", + "forgot-password.form.error.empty-password": "Inserisci una password nella casella qui sotto.", + + // "forgot-password.form.error.matching-passwords": "The passwords do not match.", + "forgot-password.form.error.matching-passwords": "Le password non corrispondono.", + + // "forgot-password.form.notification.error.title": "Error when trying to submit new password", + "forgot-password.form.notification.error.title": "Errore durante il tentativo di inviare una nuova password", + + // "forgot-password.form.notification.success.content": "The password reset was successful. You have been logged in as the created user.", + "forgot-password.form.notification.success.content": "La password è stata reimpostata con successo. Hai effettuato l'accesso come l'utente che è stato creato.", + + // "forgot-password.form.notification.success.title": "Password reset completed", + "forgot-password.form.notification.success.title": "La password è stata reimpostata", + + // "forgot-password.form.submit": "Submit password", + "forgot-password.form.submit": "Invia password", + + + // "form.add": "Add more", + "form.add": "Aggiungi altro", + + // "form.add-help": "Click here to add the current entry and to add another one", + "form.add-help": "Clicca qui per aggiungere la voce corrente e per aggiungerne un'altra", + + // "form.cancel": "Cancel", + "form.cancel": "Annulla", + + // "form.clear": "Clear", + "form.clear": "Pulisci", + + // "form.clear-help": "Click here to remove the selected value", + "form.clear-help": "Clicca qui per rimuovere il valore selezionato", + + // "form.discard": "Discard", + "form.discard": "Annulla", + + // "form.drag": "Drag", + "form.drag": "Trascina", + + // "form.edit": "Edit", + "form.edit": "Edita", + + // "form.edit-help": "Click here to edit the selected value", + "form.edit-help": "Clicca qui per modificare il valore selezionato", + + // "form.first-name": "First name", + "form.first-name": "Nome", + + // "form.group-collapse": "Collapse", + // TODO New key - Add a translation + "form.group-collapse": "Collapse", + + // "form.group-collapse-help": "Click here to collapse", + // TODO New key - Add a translation + "form.group-collapse-help": "Click here to collapse", + + // "form.group-expand": "Expand", + // TODO New key - Add a translation + "form.group-expand": "Expand", + + // "form.group-expand-help": "Click here to expand and add more elements", + // TODO New key - Add a translation + "form.group-expand-help": "Click here to expand and add more elements", + + // "form.last-name": "Last name", + "form.last-name": "Cognome", + + // "form.loading": "Loading...", + "form.loading": "Caricamento...", + + // "form.lookup": "Lookup", + "form.lookup": "Ricerca", + + // "form.lookup-help": "Click here to look up an existing relation", + "form.lookup-help": "Clicca qui per cercare una relazione già esistente", + + // "form.no-results": "No results found", + "form.no-results": "Nessun risultato trovato", + + // "form.no-value": "No value entered", + "form.no-value": "Non è stato inserito nessun valore", + + // "form.other-information": {}, + // TODO New key - Add a translation + "form.other-information": {}, + + // "form.remove": "Remove", + "form.remove": "Rimuovi", + + // "form.save": "Save", + "form.save": "Salva", + + // "form.save-help": "Save changes", + "form.save-help": "Salva le modifiche", + + // "form.search": "Search", + "form.search": "Ricerca", + + // "form.search-help": "Click here to look for an existing correspondence", + "form.search-help": "Clicca qui per cercare una corrispondenza già esistente", + + // "form.submit": "Save", + "form.submit": "Salva", + + // "form.repeatable.sort.tip": "Drop the item in the new position", + "form.repeatable.sort.tip": "Rilascia l'item nella nuova posizione", + + + + // "grant-deny-request-copy.deny": "Don't send copy", + "grant-deny-request-copy.deny": "Non inviare una copia", + + // "grant-deny-request-copy.email.back": "Back", + "grant-deny-request-copy.email.back": "Indietro", + + // "grant-deny-request-copy.email.message": "Message", + "grant-deny-request-copy.email.message": "Messaggio", + + // "grant-deny-request-copy.email.message.empty": "Please enter a message", + "grant-deny-request-copy.email.message.empty": "Inserisci un messaggio", + + // "grant-deny-request-copy.email.permissions.info": "You may use this occasion to reconsider the access restrictions on the document, to avoid having to respond to these requests. If you’d like to ask the repository administrators to remove these restrictions, please check the box below.", + "grant-deny-request-copy.email.permissions.info": "In questa fase è possibile riconsiderare le restrizioni di accesso al documento, in modo da evitare di dover rispondere a tali richieste. Se desideri chiedere agli amministratori del repository di rimuovere queste restrizioni, seleziona la casella qui sotto.", + + // "grant-deny-request-copy.email.permissions.label": "Change to open access", + "grant-deny-request-copy.email.permissions.label": "Modifica in open access", + + // "grant-deny-request-copy.email.send": "Send", + "grant-deny-request-copy.email.send": "Invia", + + // "grant-deny-request-copy.email.subject": "Subject", + "grant-deny-request-copy.email.subject": "Subject", + + // "grant-deny-request-copy.email.subject.empty": "Please enter a subject", + "grant-deny-request-copy.email.subject.empty": "Inserisci un subject", + + // "grant-deny-request-copy.grant": "Send copy", + "grant-deny-request-copy.grant": "Invia una copia", + + // "grant-deny-request-copy.header": "Document copy request", + "grant-deny-request-copy.header": "Richiedi una copia del documento", + + // "grant-deny-request-copy.home-page": "Take me to the home page", + "grant-deny-request-copy.home-page": "Torna alla home page", + + // "grant-deny-request-copy.intro1": "If you are one of the authors of the document {{ name }}, then please use one of the options below to respond to the user's request.", + "grant-deny-request-copy.intro1": "Se sei uno degli autori del documento {{ name }} seleziona una delle seguenti opzioni per rispondere alla richiesta dell'utente.", + + // "grant-deny-request-copy.intro2": "After choosing an option, you will be presented with a suggested email reply which you may edit.", + "grant-deny-request-copy.intro2": "Dopo aver scelto un'opzione, ti verrà suggerita una risposta e-mail che potrai modificare.", + + // "grant-deny-request-copy.processed": "This request has already been processed. You can use the button below to get back to the home page.", + "grant-deny-request-copy.processed": "Questa richiesta è già stata elaborata. Puoi cliccare il pulsante qui sotto per tornare alla home page.", + + + + // "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": "Gentile {{ recipientName }},\nin tisposta alla tua richiesta, ho il piacere di inviarti come allegato una copia del file riferito al documento: \"{{ itemUrl }}\" ({{ itemName }}), di cui sono l'autore.\n\nUn cordiale saluto,\n{{ authorName }} <{{ authorEmail }}>", + + // "grant-request-copy.email.subject": "Request copy of document", + "grant-request-copy.email.subject": "Richiedi una copia del documento", + + // "grant-request-copy.error": "An error occurred", + "grant-request-copy.error": "Si è verificato un errore", + + // "grant-request-copy.header": "Grant document copy request", + "grant-request-copy.header": "Richiedi una copia del documento di sovvenzione", + + // "grant-request-copy.intro": "This message will be sent to the applicant of the request. The requested document(s) will be attached.", + "grant-request-copy.intro": "Questo messaggio verrà inviato a chi ha effettuato la richiesta. VErranno allegati i documenti richiesti.", + + // "grant-request-copy.success": "Successfully granted item request", + "grant-request-copy.success": "Richiesta dell'item concessa con successo", + + + // "health.breadcrumbs": "Health", + // TODO New key - Add a translation + "health.breadcrumbs": "Health", + + // "health-page.heading" : "Health", + // TODO New key - Add a translation + "health-page.heading" : "Health", + + // "health-page.info-tab" : "Info", + // TODO New key - Add a translation + "health-page.info-tab" : "Info", + + // "health-page.status-tab" : "Status", + // TODO New key - Add a translation + "health-page.status-tab" : "Status", + + // "health-page.error.msg": "The health check service is temporarily unavailable", + "health-page.error.msg": "Il servizio di health check è temporaneamente non disponibile.", + + // "health-page.property.status": "Status code", + // TODO New key - Add a translation + "health-page.property.status": "Status code", + + // "health-page.section.db.title": "Database", + "health-page.section.db.title": "Database", + + // "health-page.section.geoIp.title": "GeoIp", + // TODO New key - Add a translation + "health-page.section.geoIp.title": "GeoIp", + + // "health-page.section.solrAuthorityCore.title": "Sor: authority core", + // TODO New key - Add a translation + "health-page.section.solrAuthorityCore.title": "Sor: authority core", + + // "health-page.section.solrOaiCore.title": "Sor: oai core", + // TODO New key - Add a translation + "health-page.section.solrOaiCore.title": "Sor: oai core", + + // "health-page.section.solrSearchCore.title": "Sor: search core", + // TODO New key - Add a translation + "health-page.section.solrSearchCore.title": "Sor: search core", + + // "health-page.section.solrStatisticsCore.title": "Sor: statistics core", + // TODO New key - Add a translation + "health-page.section.solrStatisticsCore.title": "Sor: statistics core", + + // "health-page.section-info.app.title": "Application Backend", + "health-page.section-info.app.title": "Backend dell'applicativo", + + // "health-page.section-info.java.title": "Java", + "health-page.section-info.java.title": "Java", + + // "health-page.status": "Status", + // TODO New key - Add a translation + "health-page.status": "Status", + + // "health-page.status.ok.info": "Operational", + // TODO New key - Add a translation + "health-page.status.ok.info": "Operational", + + // "health-page.status.error.info": "Problems detected", + "health-page.status.error.info": "Sono stati rilevati dei problemi", + + // "health-page.status.warning.info": "Possible issues detected", + "health-page.status.warning.info": "Sono stati rilevati dei potenziali problemi", + + // "health-page.title": "Health", + // TODO New key - Add a translation + "health-page.title": "Health", + + // "health-page.section.no-issues": "No issues detected", + "health-page.section.no-issues": "Nessun problema rilevato", + + + // "home.description": "", + "home.description": "", + + // "home.breadcrumbs": "Home", + "home.breadcrumbs": "Home", + + // "home.search-form.placeholder": "Search the repository ...", + "home.search-form.placeholder": "Cerca nel repository ...", + + // "home.title": "Home", + "home.title": "Home", + + // "home.top-level-communities.head": "Communities in DSpace", + // TODO Source message changed - Revise the translation + "home.top-level-communities.head": "DSpace Cris Communities", + + // "home.top-level-communities.help": "Select a community to browse its collections.", + // TODO Source message changed - Revise the translation + "home.top-level-communities.help": "Cerca una collection", + + + + // "info.end-user-agreement.accept": "I have read and I agree to the End User Agreement", + "info.end-user-agreement.accept": "Ho letto e accetto l'Accordo con l'utente finale", + + // "info.end-user-agreement.accept.error": "An error occurred accepting the End User Agreement", + "info.end-user-agreement.accept.error": "Si è verificato un errore durante l'accettazione dell'Accordo con l'utente finale", + + // "info.end-user-agreement.accept.success": "Successfully updated the End User Agreement", + "info.end-user-agreement.accept.success": "L'Accordo con l'utente finale è stato aggiornato con successo", + + // "info.end-user-agreement.breadcrumbs": "End User Agreement", + "info.end-user-agreement.breadcrumbs": "Accordo con l'utente finale", + + // "info.end-user-agreement.buttons.cancel": "Cancel", + "info.end-user-agreement.buttons.cancel": "Annulla", + + // "info.end-user-agreement.buttons.save": "Save", + "info.end-user-agreement.buttons.save": "Salva", + + // "info.end-user-agreement.head": "End User Agreement", + "info.end-user-agreement.head": "Accordo con l'utente finale", + + // "info.end-user-agreement.title": "End User Agreement", + "info.end-user-agreement.title": "Accordo con l'utente finale", + + // "info.privacy.breadcrumbs": "Privacy Statement", + "info.privacy.breadcrumbs": "Informativa sulla privacy", + + // "info.privacy.head": "Privacy Statement", + "info.privacy.head": "Informativa sulla privacy", + + // "info.privacy.title": "Privacy Statement", + "info.privacy.title": "Informativa sulla privacy", + + // "info.feedback.breadcrumbs": "Feedback", + "info.feedback.breadcrumbs": "Feedback", + + // "info.feedback.head": "Feedback", + "info.feedback.head": "Feedback", + + // "info.feedback.title": "Feedback", + "info.feedback.title": "Feedback", + + // "info.feedback.info": "Thanks for sharing your feedback about the DSpace system. Your comments are appreciated!", + "info.feedback.info": "Grazie per aver condiviso il tuo feedback sul DSpace. I vostri commenti sono importanti!", + + // "info.feedback.email_help": "This address will be used to follow up on your feedback.", + "info.feedback.email_help": "Questo indirizzo verrà utilizzato per dare una risposta al tuo feedback.", + + // "info.feedback.send": "Send Feedback", + "info.feedback.send": "Invia feedback", + + // "info.feedback.comments": "Comments", + "info.feedback.comments": "Commenti", + + // "info.feedback.email-label": "Your Email", + "info.feedback.email-label": "La tua email", + + // "info.feedback.create.success" : "Feedback Sent Successfully!", + "info.feedback.create.success" : "Feedback inviato con successo!", + + // "info.feedback.error.email.required" : "A valid email address is required", + "info.feedback.error.email.required" : "Inserire un un indirizzo email valido", + + // "info.feedback.error.message.required" : "A comment is required", + "info.feedback.error.message.required" : "Inserire un commento", + + // "info.feedback.page-label" : "Page", + "info.feedback.page-label" : "Pagina", + + // "info.feedback.page_help" : "Tha page related to your feedback", + "info.feedback.page_help" : "In questa pagina trovi i tuoi feedback", + + + + // "item.alerts.private": "This item is non-discoverable", + "item.alerts.private": "Questo item è privato", + + // "item.alerts.withdrawn": "This item has been withdrawn", + "item.alerts.withdrawn": "Questo item è stato rimosso", + + + + // "item.edit.authorizations.heading": "With this editor you can view and alter the policies of an item, plus alter policies of individual item components: bundles and bitstreams. Briefly, an item is a container of bundles, and bundles are containers of bitstreams. Containers usually have ADD/REMOVE/READ/WRITE policies, while bitstreams only have READ/WRITE policies.", + "item.edit.authorizations.heading": "Con questo editor puoi vedere e modificare le policies di un item, e anche modificare le policies dei singoli componenti dell'item: bundles e bitstreams. Un item è il contenitore di bundles, e i bundles sono contenitori di bitstreams. I contenitori riportano solitamente le policies di ADD/REMOVE/READ/WRITE, mentre i bitstreams hanno solamente policies di READ/WRITE.", + + // "item.edit.authorizations.title": "Edit item's Policies", + "item.edit.authorizations.title": "Modificare le policies dell'item", + + + + // "item.badge.private": "Non-discoverable", + // TODO Source message changed - Revise the translation + "item.badge.private": "Privato", + + // "item.badge.withdrawn": "Withdrawn", + "item.badge.withdrawn": "Rimosso", + + + + // "item.bitstreams.upload.bundle": "Bundle", + "item.bitstreams.upload.bundle": "Bundle", + + // "item.bitstreams.upload.bundle.placeholder": "Select a bundle or input new bundle name", + // TODO Source message changed - Revise the translation + "item.bitstreams.upload.bundle.placeholder": "Seleziona un bundle o inserisci il nome di un nuovo bundle", + + // "item.bitstreams.upload.bundle.new": "Create bundle", + "item.bitstreams.upload.bundle.new": "Crea un bundle", + + // "item.bitstreams.upload.bundles.empty": "This item doesn\'t contain any bundles to upload a bitstream to.", + "item.bitstreams.upload.bundles.empty": "Questo item non contiene alcun bundle in cui caricare un bitstream.", + + // "item.bitstreams.upload.cancel": "Cancel", + "item.bitstreams.upload.cancel": "Annulla", + + // "item.bitstreams.upload.drop-message": "Drop a file to upload", + "item.bitstreams.upload.drop-message": "Rilascia un file da caricare", + + // "item.bitstreams.upload.item": "Item: ", + "item.bitstreams.upload.item": "Item:", + + // "item.bitstreams.upload.notifications.bundle.created.content": "Successfully created new bundle.", + "item.bitstreams.upload.notifications.bundle.created.content": "Il nuovo bundle è stato creato con successo.", + + // "item.bitstreams.upload.notifications.bundle.created.title": "Created bundle", + "item.bitstreams.upload.notifications.bundle.created.title": "Bundle creato", + + // "item.bitstreams.upload.notifications.upload.failed": "Upload failed. Please verify the content before retrying.", + "item.bitstreams.upload.notifications.upload.failed": "Caricamento non riuscito. Verifica il contenuto prima di riprovare.", + + // "item.bitstreams.upload.title": "Upload bitstream", + "item.bitstreams.upload.title": "Carica bitstream", + + + + // "item.edit.bitstreams.bundle.edit.buttons.upload": "Upload", + "item.edit.bitstreams.bundle.edit.buttons.upload": "Carica", + + // "item.edit.bitstreams.bundle.displaying": "Currently displaying {{ amount }} bitstreams of {{ total }}.", + "item.edit.bitstreams.bundle.displaying": "Attualmente sono visualizzati {{ amount }} bitstream su {{ total }}.", + + // "item.edit.bitstreams.bundle.load.all": "Load all ({{ total }})", + "item.edit.bitstreams.bundle.load.all": "Carica tutto ({{ total }})", + + // "item.edit.bitstreams.bundle.load.more": "Load more", + "item.edit.bitstreams.bundle.load.more": "Carica più risorse", + + // "item.edit.bitstreams.bundle.name": "BUNDLE: {{ name }}", + "item.edit.bitstreams.bundle.name": "BUNDLE: {{ name }}", + + // "item.edit.bitstreams.discard-button": "Discard", + "item.edit.bitstreams.discard-button": "Annulla", + + // "item.edit.bitstreams.edit.buttons.download": "Download", + "item.edit.bitstreams.edit.buttons.download": "Download", + + // "item.edit.bitstreams.edit.buttons.drag": "Drag", + "item.edit.bitstreams.edit.buttons.drag": "Trascina", + + // "item.edit.bitstreams.edit.buttons.edit": "Edit", + "item.edit.bitstreams.edit.buttons.edit": "Edita", + + // "item.edit.bitstreams.edit.buttons.remove": "Remove", + "item.edit.bitstreams.edit.buttons.remove": "Rimuovi", + + // "item.edit.bitstreams.edit.buttons.undo": "Undo changes", + "item.edit.bitstreams.edit.buttons.undo": "Annullare le modifiche", + + // "item.edit.bitstreams.empty": "This item doesn't contain any bitstreams. Click the upload button to create one.", + "item.edit.bitstreams.empty": "Questo item non contiene bitstreams. Fai clic sul pulsante di caricamento per crearne uno.", + + // "item.edit.bitstreams.headers.actions": "Actions", + "item.edit.bitstreams.headers.actions": "Azioni", + + // "item.edit.bitstreams.headers.bundle": "Bundle", + "item.edit.bitstreams.headers.bundle": "Bundle", + + // "item.edit.bitstreams.headers.description": "Description", + "item.edit.bitstreams.headers.description": "Descrizione", + + // "item.edit.bitstreams.headers.format": "Format", + "item.edit.bitstreams.headers.format": "Formato", + + // "item.edit.bitstreams.headers.name": "Name", + "item.edit.bitstreams.headers.name": "Nome", + + // "item.edit.bitstreams.notifications.discarded.content": "Your changes were discarded. To reinstate your changes click the 'Undo' button", + "item.edit.bitstreams.notifications.discarded.content": "Le modifiche sono state annullate. Per ripristinarle, fai clic sul pulsante \"Annulla\"", + + // "item.edit.bitstreams.notifications.discarded.title": "Changes discarded", + "item.edit.bitstreams.notifications.discarded.title": "Modifiche annullate", + + // "item.edit.bitstreams.notifications.move.failed.title": "Error moving bitstreams", + "item.edit.bitstreams.notifications.move.failed.title": "Errore durante lo spostamento dei bitstreams", + + // "item.edit.bitstreams.notifications.move.saved.content": "Your move changes to this item's bitstreams and bundles have been saved.", + "item.edit.bitstreams.notifications.move.saved.content": "Le modifiche di spostamento dei bitstream e dei bundle di questo item sono state salvate.", + + // "item.edit.bitstreams.notifications.move.saved.title": "Move changes saved", + "item.edit.bitstreams.notifications.move.saved.title": "Spostamento delle modifiche salvato", + + // "item.edit.bitstreams.notifications.outdated.content": "The item you're currently working on has been changed by another user. Your current changes are discarded to prevent conflicts", + "item.edit.bitstreams.notifications.outdated.content": "L'item su cui stai attualmente lavorando è stato modificato da un altro utente. Le modifiche correnti verranno eliminate per evitare conflitti", + + // "item.edit.bitstreams.notifications.outdated.title": "Changes outdated", + "item.edit.bitstreams.notifications.outdated.title": "Modifiche obsolete", + + // "item.edit.bitstreams.notifications.remove.failed.title": "Error deleting bitstream", + "item.edit.bitstreams.notifications.remove.failed.title": "Errore durante l'eliminazione del bitstream", + + // "item.edit.bitstreams.notifications.remove.saved.content": "Your removal changes to this item's bitstreams have been saved.", + "item.edit.bitstreams.notifications.remove.saved.content": "Le modifiche apportate alla rimozione dei bitstreams di questo item sono state salvate.", + + // "item.edit.bitstreams.notifications.remove.saved.title": "Removal changes saved", + "item.edit.bitstreams.notifications.remove.saved.title": "Annullamento delle modifiche salvato", + + // "item.edit.bitstreams.reinstate-button": "Undo", + "item.edit.bitstreams.reinstate-button": "Annulla", + + // "item.edit.bitstreams.save-button": "Save", + "item.edit.bitstreams.save-button": "Salva", + + // "item.edit.bitstreams.upload-button": "Upload", + "item.edit.bitstreams.upload-button": "Carica", + + + + // "item.edit.delete.cancel": "Cancel", + "item.edit.delete.cancel": "Annulla", + + // "item.edit.delete.confirm": "Delete", + "item.edit.delete.confirm": "Elimina", + + // "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": "Sei sicuro che questo item debba essere eliminato definitivamente? Attenzione: attualmente, non verrà lasciato alcun placeholder.", + + // "item.edit.delete.error": "An error occurred while deleting the item", + "item.edit.delete.error": "Si è verificato un errore durante la cancellazione dell'item", + + // "item.edit.delete.header": "Delete item: {{ id }}", + "item.edit.delete.header": "Elimina item: {{ id }}", + + // "item.edit.delete.success": "The item has been deleted", + "item.edit.delete.success": "L'item è stato eliminato", + + // "item.edit.head": "Edit Item", + "item.edit.head": "Modifica item", + + // "item.edit.breadcrumbs": "Edit Item", + "item.edit.breadcrumbs": "Modifica item", + + // "item.edit.tabs.disabled.tooltip": "You're not authorized to access this tab", + "item.edit.tabs.disabled.tooltip": "Non sei autorizzato ad accedere a questa tab", + + + // "item.edit.tabs.mapper.head": "Collection Mapper", + "item.edit.tabs.mapper.head": "collection Mapper", + + // "item.edit.tabs.item-mapper.title": "Item Edit - Collection Mapper", + "item.edit.tabs.item-mapper.title": "Modifica item - Mapper Collection", + + // "item.edit.item-mapper.buttons.add": "Map item to selected collections", + "item.edit.item-mapper.buttons.add": "Mappare l'item nelle collections selezionate", + + // "item.edit.item-mapper.buttons.remove": "Remove item's mapping for selected collections", + "item.edit.item-mapper.buttons.remove": "Rimuovere il mapping degli item per le collections selezionate", + + // "item.edit.item-mapper.cancel": "Cancel", + "item.edit.item-mapper.cancel": "Annulla", + + // "item.edit.item-mapper.description": "This is the item mapper tool that allows administrators to map this item to other collections. You can search for collections and map them, or browse the list of collections the item is currently mapped to.", + "item.edit.item-mapper.description": "Si tratta dello strumento di mapping degli item che consente agli amministratori di mappare questo item in altre collections. È possibile cercare le collections e mapparle, o sfogliare l'elenco delle collections in cui è attualmente mappato l'item.", + + // "item.edit.item-mapper.head": "Item Mapper - Map Item to Collections", + "item.edit.item-mapper.head": "Item Mapper - Mappa l'item nelle collections", + + // "item.edit.item-mapper.item": "Item: \"{{name}}\"", + "item.edit.item-mapper.item": "Item: \"{{name}}\"", + + // "item.edit.item-mapper.no-search": "Please enter a query to search", + "item.edit.item-mapper.no-search": "Inserisci una query per avviare la ricerca", + + // "item.edit.item-mapper.notifications.add.error.content": "Errors occurred for mapping of item to {{amount}} collections.", + "item.edit.item-mapper.notifications.add.error.content": "Si sono verificati degli errori nella mappatura dell'item in {{amount}} collections.", + + // "item.edit.item-mapper.notifications.add.error.head": "Mapping errors", + "item.edit.item-mapper.notifications.add.error.head": "Errori di mappatura", + + // "item.edit.item-mapper.notifications.add.success.content": "Successfully mapped item to {{amount}} collections.", + "item.edit.item-mapper.notifications.add.success.content": "L'item è stato mappato correttamente in {{amount}} collections.", + + // "item.edit.item-mapper.notifications.add.success.head": "Mapping completed", + "item.edit.item-mapper.notifications.add.success.head": "Mappatura completata", + + // "item.edit.item-mapper.notifications.remove.error.content": "Errors occurred for the removal of the mapping to {{amount}} collections.", + "item.edit.item-mapper.notifications.remove.error.content": "Si sono verificati degli errori nella rimozione del mapping da {{amount}} collections.", + + // "item.edit.item-mapper.notifications.remove.error.head": "Removal of mapping errors", + "item.edit.item-mapper.notifications.remove.error.head": "Gli errori di mappatura sono stati rimossi", + + // "item.edit.item-mapper.notifications.remove.success.content": "Successfully removed mapping of item to {{amount}} collections.", + "item.edit.item-mapper.notifications.remove.success.content": "L'item mappato è stato rimosso correttamente da {{amount}} collections.", + + // "item.edit.item-mapper.notifications.remove.success.head": "Removal of mapping completed", + "item.edit.item-mapper.notifications.remove.success.head": "Rimozione della mappatura completata", + + // "item.edit.item-mapper.search-form.placeholder": "Search collections...", + "item.edit.item-mapper.search-form.placeholder": "Cerca collections...", + + // "item.edit.item-mapper.tabs.browse": "Browse mapped collections", + "item.edit.item-mapper.tabs.browse": "Sfoglia le collections mappate", + + // "item.edit.item-mapper.tabs.map": "Map new collections", + "item.edit.item-mapper.tabs.map": "Mappa le nuove collections", + + + + // "item.edit.metadata.add-button": "Add", + "item.edit.metadata.add-button": "Aggiungi", + + // "item.edit.metadata.discard-button": "Discard", + "item.edit.metadata.discard-button": "Annulla", + + // "item.edit.metadata.edit.buttons.edit": "Edit", + "item.edit.metadata.edit.buttons.edit": "Edita", + + // "item.edit.metadata.edit.buttons.remove": "Remove", + "item.edit.metadata.edit.buttons.remove": "Rimuovi", + + // "item.edit.metadata.edit.buttons.undo": "Undo changes", + "item.edit.metadata.edit.buttons.undo": "Annullare le modifiche", + + // "item.edit.metadata.edit.buttons.unedit": "Stop editing", + "item.edit.metadata.edit.buttons.unedit": "Interrompi la modifica", + + // "item.edit.metadata.empty": "The item currently doesn't contain any metadata. Click Add to start adding a metadata value.", + "item.edit.metadata.empty": "Attualmente l'item non contiene metadati. Fai clic su Aggiungi per iniziare ad aggiungere il valore di un metadata.", + + // "item.edit.metadata.headers.edit": "Edit", + "item.edit.metadata.headers.edit": "Edita", + + // "item.edit.metadata.headers.field": "Field", + "item.edit.metadata.headers.field": "Campo", + + // "item.edit.metadata.headers.language": "Lang", + "item.edit.metadata.headers.language": "Lang", + + // "item.edit.metadata.headers.value": "Value", + "item.edit.metadata.headers.value": "Valore", + + // "item.edit.metadata.metadatafield.invalid": "Please choose a valid metadata field", + "item.edit.metadata.metadatafield.invalid": "Scegli un campo di metadati valido", + + // "item.edit.metadata.notifications.discarded.content": "Your changes were discarded. To reinstate your changes click the 'Undo' button", + "item.edit.metadata.notifications.discarded.content": "Le modifiche sono state annullate. Per ripristinarle, fai clic sul pulsante \"Annulla\"", + + // "item.edit.metadata.notifications.discarded.title": "Changes discarded", + // TODO Source message changed - Revise the translation + "item.edit.metadata.notifications.discarded.title": "Modifiche eliminate", + + // "item.edit.metadata.notifications.error.title": "An error occurred", + "item.edit.metadata.notifications.error.title": "Si è verificato un errore", + + // "item.edit.metadata.notifications.invalid.content": "Your changes were not saved. Please make sure all fields are valid before you save.", + "item.edit.metadata.notifications.invalid.content": "Le modifiche non sono state salvate. Assicurati che tutti i campi siano corretti prima di salvare.", + + // "item.edit.metadata.notifications.invalid.title": "Metadata invalid", + "item.edit.metadata.notifications.invalid.title": "Metadati non validi", + + // "item.edit.metadata.notifications.outdated.content": "The item you're currently working on has been changed by another user. Your current changes are discarded to prevent conflicts", + "item.edit.metadata.notifications.outdated.content": "L'item su cui stai attualmente lavorando è stato modificato da un altro utente. Le modifiche correnti verranno eliminate per evitare conflitti", + + // "item.edit.metadata.notifications.outdated.title": "Changes outdated", + // TODO Source message changed - Revise the translation + "item.edit.metadata.notifications.outdated.title": "Modifiche obsolete", + + // "item.edit.metadata.notifications.saved.content": "Your changes to this item's metadata were saved.", + "item.edit.metadata.notifications.saved.content": "Le modifiche apportate ai metadati di questo item sono state salvate.", + + // "item.edit.metadata.notifications.saved.title": "Metadata saved", + "item.edit.metadata.notifications.saved.title": "Metadati salvati", + + // "item.edit.metadata.reinstate-button": "Undo", + "item.edit.metadata.reinstate-button": "Annulla", + + // "item.edit.metadata.save-button": "Save", + "item.edit.metadata.save-button": "Salva", + + + + // "item.edit.modify.overview.field": "Field", + "item.edit.modify.overview.field": "Campo", + + // "item.edit.modify.overview.language": "Language", + "item.edit.modify.overview.language": "Lingua", + + // "item.edit.modify.overview.value": "Value", + "item.edit.modify.overview.value": "Valore", + + + + // "item.edit.move.cancel": "Back", + "item.edit.move.cancel": "Indietro", + + // "item.edit.move.save-button": "Save", + "item.edit.move.save-button": "Salva", + + // "item.edit.move.discard-button": "Discard", + "item.edit.move.discard-button": "Annulla", + + // "item.edit.move.description": "Select the collection you wish to move this item to. To narrow down the list of displayed collections, you can enter a search query in the box.", + "item.edit.move.description": "Seleziona la collection in cui desideri spostare questo item. Per restringere l'elenco delle collections visualizzate è possibile effettuare una ricerca.", + + // "item.edit.move.error": "An error occurred when attempting to move the item", + "item.edit.move.error": "Si è verificato un errore durante il tentativo di spostare l'item", + + // "item.edit.move.head": "Move item: {{id}}", + "item.edit.move.head": "Sposta l'item: {{id}}", + + // "item.edit.move.inheritpolicies.checkbox": "Inherit policies", + "item.edit.move.inheritpolicies.checkbox": "Ereditare i criteri", + + // "item.edit.move.inheritpolicies.description": "Inherit the default policies of the destination collection", + "item.edit.move.inheritpolicies.description": "Ereditare i criteri predefiniti dell'insieme di destinazione", + + // "item.edit.move.move": "Move", + "item.edit.move.move": "Sposta", + + // "item.edit.move.processing": "Moving...", + "item.edit.move.processing": "Sposta...", + + // "item.edit.move.search.placeholder": "Enter a search query to look for collections", + "item.edit.move.search.placeholder": "Effettuare una ricerca per collections", + + // "item.edit.move.success": "The item has been moved successfully", + "item.edit.move.success": "L'item è stato spostato correttamente", + + // "item.edit.move.title": "Move item", + "item.edit.move.title": "Sposta item", + + + + // "item.edit.private.cancel": "Cancel", + "item.edit.private.cancel": "Annulla", + + // "item.edit.private.confirm": "Make it non-discoverable", + // TODO Source message changed - Revise the translation + "item.edit.private.confirm": "Rendilo privato", + + // "item.edit.private.description": "Are you sure this item should be made non-discoverable in the archive?", + // TODO Source message changed - Revise the translation + "item.edit.private.description": "Sei sicuro che questo oggetto debba essere reso privato nell'archivio?", + + // "item.edit.private.error": "An error occurred while making the item non-discoverable", + // TODO Source message changed - Revise the translation + "item.edit.private.error": "Si è verificato un errore durante la creazione di un item privato", + + // "item.edit.private.header": "Make item non-discoverable: {{ id }}", + "item.edit.private.header": "Rendi privato l'item: {{ id }}", + + // "item.edit.private.success": "The item is now non-discoverable", + "item.edit.private.success": "L'item è ora privato", + + + + // "item.edit.public.cancel": "Cancel", + "item.edit.public.cancel": "Annulla", + + // "item.edit.public.confirm": "Make it discoverable", + // TODO Source message changed - Revise the translation + "item.edit.public.confirm": "Rendilo pubblico", + + // "item.edit.public.description": "Are you sure this item should be made discoverable in the archive?", + // TODO Source message changed - Revise the translation + "item.edit.public.description": "Sei sicuro che questo articolo debba essere reso pubblico nell'archivio?", + + // "item.edit.public.error": "An error occurred while making the item discoverable", + // TODO Source message changed - Revise the translation + "item.edit.public.error": "Si è verificato un errore durante la creazione di un item pubblico", + + // "item.edit.public.header": "Make item discoverable: {{ id }}", + "item.edit.public.header": "Rendi pubblico l'item: {{ id }}", + + // "item.edit.public.success": "The item is now discoverable", + // TODO Source message changed - Revise the translation + "item.edit.public.success": "L'item è ora pubblico", + + + + // "item.edit.reinstate.cancel": "Cancel", + "item.edit.reinstate.cancel": "Annulla", + + // "item.edit.reinstate.confirm": "Reinstate", + "item.edit.reinstate.confirm": "Ripristina", + + // "item.edit.reinstate.description": "Are you sure this item should be reinstated to the archive?", + "item.edit.reinstate.description": "Sei sicuro che questo item debba essere ripristinato nell'archivio?", + + // "item.edit.reinstate.error": "An error occurred while reinstating the item", + "item.edit.reinstate.error": "Si è verificato un errore durante il ripristino dell'item", + + // "item.edit.reinstate.header": "Reinstate item: {{ id }}", + "item.edit.reinstate.header": "Ripristina l'item: {{ id }}", + + // "item.edit.reinstate.success": "The item was reinstated successfully", + "item.edit.reinstate.success": "L'item è stato ripristinato correttamente", + + + + // "item.edit.relationships.discard-button": "Discard", + "item.edit.relationships.discard-button": "Annulla", + + // "item.edit.relationships.edit.buttons.add": "Add", + "item.edit.relationships.edit.buttons.add": "Aggiungi", + + // "item.edit.relationships.edit.buttons.remove": "Remove", + "item.edit.relationships.edit.buttons.remove": "Rimuovi", + + // "item.edit.relationships.edit.buttons.undo": "Undo changes", + "item.edit.relationships.edit.buttons.undo": "Annullare le modifiche", + + // "item.edit.relationships.no-relationships": "No relationships", + "item.edit.relationships.no-relationships": "Nessuna relazione", + + // "item.edit.relationships.notifications.discarded.content": "Your changes were discarded. To reinstate your changes click the 'Undo' button", + "item.edit.relationships.notifications.discarded.content": "Le modifiche sono state annullate. Per ripristinarle, fai clic sul pulsante \"Annulla\"", + + // "item.edit.relationships.notifications.discarded.title": "Changes discarded", + "item.edit.relationships.notifications.discarded.title": "Modifiche annullate", + + // "item.edit.relationships.notifications.failed.title": "Error editing relationships", + "item.edit.relationships.notifications.failed.title": "Errore nella modifica delle relazioni", + + // "item.edit.relationships.notifications.outdated.content": "The item you're currently working on has been changed by another user. Your current changes are discarded to prevent conflicts", + "item.edit.relationships.notifications.outdated.content": "L'item su cui stai attualmente lavorando è stato modificato da un altro utente. Le modifiche correnti verranno eliminate per evitare conflitti", + + // "item.edit.relationships.notifications.outdated.title": "Changes outdated", + "item.edit.relationships.notifications.outdated.title": "Modifiche obsolete", + + // "item.edit.relationships.notifications.saved.content": "Your changes to this item's relationships were saved.", + "item.edit.relationships.notifications.saved.content": "Le modifiche apportate alle relazioni di questo item sono state salvate.", + + // "item.edit.relationships.notifications.saved.title": "Relationships saved", + "item.edit.relationships.notifications.saved.title": "Relazioni salvate", + + // "item.edit.relationships.reinstate-button": "Undo", + "item.edit.relationships.reinstate-button": "Annulla", + + // "item.edit.relationships.save-button": "Save", + "item.edit.relationships.save-button": "Salva", + + // "item.edit.relationships.no-entity-type": "Add 'dspace.entity.type' metadata to enable relationships for this item", + "item.edit.relationships.no-entity-type": "Aggiungi i metadati 'dspace.entity.type' per abilitare le relazioni per questo item", + + + // "item.edit.return": "Back", + "item.edit.return": "Indietro", + + + // "item.edit.tabs.bitstreams.head": "Bitstreams", + "item.edit.tabs.bitstreams.head": "Bitstreams", + + // "item.edit.tabs.bitstreams.title": "Item Edit - Bitstreams", + "item.edit.tabs.bitstreams.title": "Modifica item - Bitstreams", + + // "item.edit.tabs.curate.head": "Curate", + "item.edit.tabs.curate.head": "Curate", + + // "item.edit.tabs.curate.title": "Item Edit - Curate", + "item.edit.tabs.curate.title": "Modifica item - Curate", + + // "item.edit.tabs.metadata.head": "Metadata", + "item.edit.tabs.metadata.head": "Metadati", + + // "item.edit.tabs.metadata.title": "Item Edit - Metadata", + "item.edit.tabs.metadata.title": "Modifica item - Metadati", + + // "item.edit.tabs.relationships.head": "Relationships", + "item.edit.tabs.relationships.head": "Relazioni", + + // "item.edit.tabs.relationships.title": "Item Edit - Relationships", + "item.edit.tabs.relationships.title": "Modifica item - Relazioni", + + // "item.edit.tabs.status.buttons.authorizations.button": "Authorizations...", + "item.edit.tabs.status.buttons.authorizations.button": "Autorizzazioni...", + + // "item.edit.tabs.status.buttons.authorizations.label": "Edit item's authorization policies", + "item.edit.tabs.status.buttons.authorizations.label": "Modificare i criteri di autorizzazione degli item", + + // "item.edit.tabs.status.buttons.delete.button": "Permanently delete", + "item.edit.tabs.status.buttons.delete.button": "Elimina definitivamente", + + // "item.edit.tabs.status.buttons.delete.label": "Completely expunge item", + "item.edit.tabs.status.buttons.delete.label": "Rimuovere completamente l'item", + + // "item.edit.tabs.status.buttons.mappedCollections.button": "Mapped collections", + "item.edit.tabs.status.buttons.mappedCollections.button": "collections mappate", + + // "item.edit.tabs.status.buttons.mappedCollections.label": "Manage mapped collections", + "item.edit.tabs.status.buttons.mappedCollections.label": "Gestire le collections mappate", + + // "item.edit.tabs.status.buttons.move.button": "Move...", + "item.edit.tabs.status.buttons.move.button": "Sposta...", + + // "item.edit.tabs.status.buttons.move.label": "Move item to another collection", + "item.edit.tabs.status.buttons.move.label": "Spostare l'item in un'altra collection", + + // "item.edit.tabs.status.buttons.private.button": "Make it non-discoverable...", + // TODO Source message changed - Revise the translation + "item.edit.tabs.status.buttons.private.button": "...", + + // "item.edit.tabs.status.buttons.private.label": "Make item non-discoverable", + // TODO Source message changed - Revise the translation + "item.edit.tabs.status.buttons.private.label": "Rendere l'item privato", + + // "item.edit.tabs.status.buttons.public.button": "Make it discoverable...", + // TODO Source message changed - Revise the translation + "item.edit.tabs.status.buttons.public.button": "...", + + // "item.edit.tabs.status.buttons.public.label": "Make item discoverable", + // TODO Source message changed - Revise the translation + "item.edit.tabs.status.buttons.public.label": "Rendere l'item pubblico", + + // "item.edit.tabs.status.buttons.reinstate.button": "Reinstate...", + "item.edit.tabs.status.buttons.reinstate.button": "Ripristino...", + + // "item.edit.tabs.status.buttons.reinstate.label": "Reinstate item into the repository", + "item.edit.tabs.status.buttons.reinstate.label": "Ripristinare l'item nel repository", + + // "item.edit.tabs.status.buttons.unauthorized": "You're not authorized to perform this action", + "item.edit.tabs.status.buttons.unauthorized": "Non sei autorizzato a eseguire questa azione", + + // "item.edit.tabs.status.buttons.withdraw.button": "Withdraw...", + "item.edit.tabs.status.buttons.withdraw.button": "Rimozione...", + + // "item.edit.tabs.status.buttons.withdraw.label": "Withdraw item from the repository", + "item.edit.tabs.status.buttons.withdraw.label": "Rimuovere l'item dal repository", + + // "item.edit.tabs.status.description": "Welcome to the item management page. From here you can withdraw, reinstate, move or delete the item. You may also update or add new metadata / bitstreams on the other tabs.", + "item.edit.tabs.status.description": "Benvenuti nella pagina di gestione degli item. Da qui è possibile rimuovere, ripristinare, spostare o eliminare l'item. È inoltre possibile aggiornare o aggiungere nuovi metadati / bitstream nelle altre schede.", + + // "item.edit.tabs.status.head": "Status", + "item.edit.tabs.status.head": "Stato", + + // "item.edit.tabs.status.labels.handle": "Handle", + "item.edit.tabs.status.labels.handle": "Gestisci", + + // "item.edit.tabs.status.labels.id": "Item Internal ID", + "item.edit.tabs.status.labels.id": "ID interno dell'item", + + // "item.edit.tabs.status.labels.itemPage": "Item Page", + "item.edit.tabs.status.labels.itemPage": "Pagina dell'item", + + // "item.edit.tabs.status.labels.lastModified": "Last Modified", + "item.edit.tabs.status.labels.lastModified": "Ultima modifica", + + // "item.edit.tabs.status.title": "Item Edit - Status", + "item.edit.tabs.status.title": "Modifica item - Stato", + + // "item.edit.tabs.versionhistory.head": "Version History", + "item.edit.tabs.versionhistory.head": "Cronologia delle versioni", + + // "item.edit.tabs.versionhistory.title": "Item Edit - Version History", + "item.edit.tabs.versionhistory.title": "Modifica item - Cronologia delle versioni", + + // "item.edit.tabs.versionhistory.under-construction": "Editing or adding new versions is not yet possible in this user interface.", + "item.edit.tabs.versionhistory.under-construction": "La modifica o l'aggiunta di nuove versioni non è ancora possibile in questa interfaccia utente.", + + // "item.edit.tabs.view.head": "View Item", + "item.edit.tabs.view.head": "Visualizza item", + + // "item.edit.tabs.view.title": "Item Edit - View", + "item.edit.tabs.view.title": "Modifica item - Visualizza", + + + + // "item.edit.withdraw.cancel": "Cancel", + "item.edit.withdraw.cancel": "Annulla", + + // "item.edit.withdraw.confirm": "Withdraw", + "item.edit.withdraw.confirm": "Rimuovi", + + // "item.edit.withdraw.description": "Are you sure this item should be withdrawn from the archive?", + "item.edit.withdraw.description": "Sei sicuro che questo articolo debba essere rimosso dall'archivio?", + + // "item.edit.withdraw.error": "An error occurred while withdrawing the item", + "item.edit.withdraw.error": "Si è verificato un errore durante la rimozione dell'item", + + // "item.edit.withdraw.header": "Withdraw item: {{ id }}", + "item.edit.withdraw.header": "Item rimosso: {{ id }}", + + // "item.edit.withdraw.success": "The item was withdrawn successfully", + "item.edit.withdraw.success": "L'item è stato rimosso con successo", + + // "item.orcid.return": "Back", + "item.orcid.return": "Indietro", + + + // "item.listelement.badge": "Item", + "item.listelement.badge": "Item", + + // "item.page.description": "Description", + "item.page.description": "Descrizione", + + // "item.page.journal-issn": "Journal ISSN", + "item.page.journal-issn": "ISSN", + + // "item.page.journal-title": "Journal Title", + "item.page.journal-title": "Titolo del periodico", + + // "item.page.publisher": "Publisher", + "item.page.publisher": "Editore", + + // "item.page.titleprefix": "Item: ", + "item.page.titleprefix": "Item: ", + + // "item.page.volume-title": "Volume Title", + "item.page.volume-title": "Titolo del volume", + + // "item.search.results.head": "Item Search Results", + "item.search.results.head": "Risultati della ricerca degli item", + + // "item.search.title": "Item Search", + "item.search.title": "Ricerca articoli", + + // "item.truncatable-part.show-more": "Show more", + "item.truncatable-part.show-more": "Mostra di più", + + // "item.truncatable-part.show-less": "Collapse", + "item.truncatable-part.show-less": "Riduci", + + + + // "item.page.abstract": "Abstract", + "item.page.abstract": "Abstract", + + // "item.page.author": "Authors", + "item.page.author": "Autori", + + // "item.page.citation": "Citation", + "item.page.citation": "Citazione", + + // "item.page.collections": "Collections", + "item.page.collections": "collections", + + // "item.page.collections.loading": "Loading...", + "item.page.collections.loading": "Caricamento...", + + // "item.page.collections.load-more": "Load more", + "item.page.collections.load-more": "Carica più risorse", + + // "item.page.date": "Date", + "item.page.date": "Data", + + // "item.page.edit": "Edit this item", + "item.page.edit": "Modifica questo item", + + // "item.page.files": "Files", + "item.page.files": "File", + + // "item.page.filesection.description": "Description:", + "item.page.filesection.description": "Descrizione:", + + // "item.page.filesection.download": "Download", + "item.page.filesection.download": "Download", + + // "item.page.filesection.format": "Format:", + "item.page.filesection.format": "Formato:", + + // "item.page.filesection.name": "Name:", + "item.page.filesection.name": "Nome:", + + // "item.page.filesection.size": "Size:", + "item.page.filesection.size": "Dimensione:", + + // "item.page.journal.search.title": "Articles in this journal", + "item.page.journal.search.title": "Articoli in questo periodico", + + // "item.page.link.full": "Full item page", + "item.page.link.full": "Mostra tutti i metadati", + + // "item.page.link.simple": "Simple item page", + "item.page.link.simple": "Visualizzazione ridotta", + + // "item.page.orcid.title": "ORCID", + "item.page.orcid.title": "ORCID", + + // "item.page.orcid.tooltip": "Open ORCID setting page", + "item.page.orcid.tooltip": "Apri la pagina delle impostazioni ORCID", + + // "item.page.person.search.title": "Articles by this author", + "item.page.person.search.title": "Articoli di questo autore", + + // "item.page.related-items.view-more": "Show {{ amount }} more", + "item.page.related-items.view-more": "Mostra altri {{ amount }} ", + + // "item.page.related-items.view-less": "Hide last {{ amount }}", + "item.page.related-items.view-less": "Nascondi l'ultimo {{ amount }}", + + // "item.page.relationships.isAuthorOfPublication": "Publications", + "item.page.relationships.isAuthorOfPublication": "Pubblicazioni", + + // "item.page.relationships.isJournalOfPublication": "Publications", + "item.page.relationships.isJournalOfPublication": "Pubblicazioni", + + // "item.page.relationships.isOrgUnitOfPerson": "Authors", + "item.page.relationships.isOrgUnitOfPerson": "Autori", + + // "item.page.relationships.isOrgUnitOfProject": "Research Projects", + "item.page.relationships.isOrgUnitOfProject": "Progetti di ricerca", + + // "item.page.subject": "Keywords", + "item.page.subject": "Keywords", + + // "item.page.uri": "URI", + "item.page.uri": "URI", + + // "item.page.bitstreams.view-more": "Show more", + "item.page.bitstreams.view-more": "Mostra di più", + + // "item.page.bitstreams.collapse": "Collapse", + "item.page.bitstreams.collapse": "Riduci", + + // "item.page.filesection.original.bundle" : "Original bundle", + // TODO New key - Add a translation + "item.page.filesection.original.bundle" : "Original bundle", + + // "item.page.filesection.license.bundle" : "License bundle", + // TODO New key - Add a translation + "item.page.filesection.license.bundle" : "License bundle", + + // "item.page.return": "Back", + "item.page.return": "Indietro", + + // "item.page.version.create": "Create new version", + "item.page.version.create": "Crea una nuova versione", + + // "item.page.version.hasDraft": "A new version cannot be created because there is an inprogress submission in the version history", + "item.page.version.hasDraft": "Impossibile creare una nuova versione perché è presente un'submission in corso nella cronologia delle versioni", + + // "item.page.claim.button": "Claim", + "item.page.claim.button": "Collega", + + // "item.page.claim.tooltip": "Claim this item as profile", + "item.page.claim.tooltip": "Collega questo item come profilo", + + // "item.preview.dc.identifier.uri": "Identifier:", + "item.preview.dc.identifier.uri": "Identificativo:", + + // "item.preview.dc.contributor.author": "Authors:", + "item.preview.dc.contributor.author": "Autori:", + + // "item.preview.dc.date.issued": "Published date:", + "item.preview.dc.date.issued": "Data di pubblicazione:", + + // "item.preview.dc.description.abstract": "Abstract:", + "item.preview.dc.description.abstract": "Abstract:", + + // "item.preview.dc.identifier.other": "Other identifier:", + "item.preview.dc.identifier.other": "Altri identificativi:", + + // "item.preview.dc.language.iso": "Language:", + "item.preview.dc.language.iso": "Lingua:", + + // "item.preview.dc.subject": "Subjects:", + // TODO New key - Add a translation + "item.preview.dc.subject": "Subjects:", + + // "item.preview.dc.title": "Title:", + "item.preview.dc.title": "Titolo:", + + // "item.preview.dc.type": "Type:", + "item.preview.dc.type": "Tipologia:", + + // "item.preview.oaire.citation.issue" : "Issue", + "item.preview.oaire.citation.issue" : "Fascicolo", + + // "item.preview.oaire.citation.volume" : "Volume", + "item.preview.oaire.citation.volume" : "Volume", + + // "item.preview.dc.relation.issn" : "ISSN", + "item.preview.dc.relation.issn" : "ISSN", + + // "item.preview.dc.identifier.isbn" : "ISBN", + "item.preview.dc.identifier.isbn" : "ISBN", + + // "item.preview.dc.identifier": "Identifier:", + "item.preview.dc.identifier": "Identificativo:", + + // "item.preview.dc.relation.ispartof" : "Journal or Serie", + "item.preview.dc.relation.ispartof" : "Periodico or Serie", + + // "item.preview.dc.identifier.doi" : "DOI", + "item.preview.dc.identifier.doi" : "DOI", + + // "item.preview.person.familyName": "Surname:", + "item.preview.person.familyName": "Cognome:", + + // "item.preview.person.givenName": "Name:", + "item.preview.person.givenName": "Nome:", + + // "item.preview.person.identifier.orcid": "ORCID:", + "item.preview.person.identifier.orcid": "ORCID:", + + // "item.preview.project.funder.name": "Funder:", + "item.preview.project.funder.name": " Finanziatore:", + + // "item.preview.project.funder.identifier": "Funder Identifier:", + "item.preview.project.funder.identifier": "Indentificativo del finanziatore:", + + // "item.preview.oaire.awardNumber": "Funding ID:", + "item.preview.oaire.awardNumber": "ID del finanziamento:", + + // "item.preview.dc.title.alternative": "Acronym:", + // TODO New key - Add a translation + "item.preview.dc.title.alternative": "Acronym:", + + // "item.preview.dc.coverage.spatial": "Jurisdiction:", + "item.preview.dc.coverage.spatial": "Giurisdizione:", + + // "item.preview.oaire.fundingStream": "Funding Stream:", + "item.preview.oaire.fundingStream": "Flusso di finanziamento:", + + + + // "item.select.confirm": "Confirm selected", + "item.select.confirm": "Conferma la selezione", + + // "item.select.empty": "No items to show", + "item.select.empty": "Nessun item da mostrare", + + // "item.select.table.author": "Author", + "item.select.table.author": "Autore", + + // "item.select.table.collection": "Collection", + "item.select.table.collection": "collection", + + // "item.select.table.title": "Title", + "item.select.table.title": "Titolo", + + + // "item.version.history.empty": "There are no other versions for this item yet.", + "item.version.history.empty": "Non ci sono ancora altre versioni per questo item.", + + // "item.version.history.head": "Version History", + "item.version.history.head": "Cronologia delle versioni", + + // "item.version.history.return": "Back", + "item.version.history.return": "Indietro", + + // "item.version.history.selected": "Selected version", + "item.version.history.selected": "Versione selezionata", + + // "item.version.history.selected.alert": "You are currently viewing version {{version}} of the item.", + "item.version.history.selected.alert": "Stai attualmente visualizzando la versione {{version}} dell'item.", + + // "item.version.history.table.version": "Version", + "item.version.history.table.version": "Versione", + + // "item.version.history.table.item": "Item", + "item.version.history.table.item": "Item", + + // "item.version.history.table.editor": "Editor", + "item.version.history.table.editor": "Editor", + + // "item.version.history.table.date": "Date", + "item.version.history.table.date": "Data", + + // "item.version.history.table.summary": "Summary", + "item.version.history.table.summary": "Riepilogo", + + // "item.version.history.table.workspaceItem": "Workspace item", + "item.version.history.table.workspaceItem": "Workspace item", + + // "item.version.history.table.workflowItem": "Workflow item", + "item.version.history.table.workflowItem": "Workflow item", + + // "item.version.history.table.actions": "Action", + "item.version.history.table.actions": "Azione", + + // "item.version.history.table.action.editWorkspaceItem": "Edit workspace item", + "item.version.history.table.action.editWorkspaceItem": "Modificare il workspace item", + + // "item.version.history.table.action.editSummary": "Edit summary", + "item.version.history.table.action.editSummary": "Modifica riepilogo", + + // "item.version.history.table.action.saveSummary": "Save summary edits", + "item.version.history.table.action.saveSummary": "Salva le modifiche del riepilogo", + + // "item.version.history.table.action.discardSummary": "Discard summary edits", + "item.version.history.table.action.discardSummary": "Elimina le modifiche del riepilogo", + + // "item.version.history.table.action.newVersion": "Create new version from this one", + "item.version.history.table.action.newVersion": "Crea una nuova versione da qui", + + // "item.version.history.table.action.deleteVersion": "Delete version", + "item.version.history.table.action.deleteVersion": "Elimina versione", + + // "item.version.history.table.action.hasDraft": "A new version cannot be created because there is an inprogress submission in the version history", + "item.version.history.table.action.hasDraft": "Non è possibile creare una nuova versione perchè c'è già una submission in progress nella cronologia delle versioni", + + + // "item.version.notice": "This is not the latest version of this item. The latest version can be found here.", + "item.version.notice": "Questa non è la versione più recente di questo item. Puoi trovare l'ultima versione qui.", + + + // "item.version.create.modal.header": "New version", + "item.version.create.modal.header": "Nuova versione", + + // "item.version.create.modal.text": "Create a new version for this item", + "item.version.create.modal.text": "Crea una nuova versione per questo item", + + // "item.version.create.modal.text.startingFrom": "starting from version {{version}}", + "item.version.create.modal.text.startingFrom": "a partire dalla versione {{version}}", + + // "item.version.create.modal.button.confirm": "Create", + "item.version.create.modal.button.confirm": "Crea", + + // "item.version.create.modal.button.confirm.tooltip": "Create new version", + "item.version.create.modal.button.confirm.tooltip": "Crea una nuova versione", + + // "item.version.create.modal.button.cancel": "Cancel", + "item.version.create.modal.button.cancel": "Annulla", + + // "item.version.create.modal.button.cancel.tooltip": "Do not create new version", + "item.version.create.modal.button.cancel.tooltip": "Non creare una nuova versione", + + // "item.version.create.modal.form.summary.label": "Summary", + "item.version.create.modal.form.summary.label": "Riepilogo", + + // "item.version.create.modal.form.summary.placeholder": "Insert the summary for the new version", + "item.version.create.modal.form.summary.placeholder": "Inserire un riepilogo per la nuova versione", + + // "item.version.create.modal.submitted.header": "Creating new version...", + "item.version.create.modal.submitted.header": "Creazione della nuova versione...", + + // "item.version.create.modal.submitted.text": "The new version is being created. This may take some time if the item has a lot of relationships.", + "item.version.create.modal.submitted.text": "La nuova versione è in fase di creazione. Questa operazione potrebbe richiedere un po' di temo se l'item ha molte relazioni.", + + // "item.version.create.notification.success" : "New version has been created with version number {{version}}", + "item.version.create.notification.success" : "È stata creata una nuova versione con il numero {{version}}", + + // "item.version.create.notification.failure" : "New version has not been created", + "item.version.create.notification.failure" : "Non è stata creata una nuova versione", + + // "item.version.create.notification.inProgress" : "A new version cannot be created because there is an inprogress submission in the version history", + "item.version.create.notification.inProgress" : "Non è possibile creare una nuova versione perchè c'è già una submission in progress nella cronologia delle versioni", + + + // "item.version.delete.modal.header": "Delete version", + "item.version.delete.modal.header": "Elimina versione", + + // "item.version.delete.modal.text": "Do you want to delete version {{version}}?", + "item.version.delete.modal.text": "Vuoi eliminare la versione {{version}}?", + + // "item.version.delete.modal.button.confirm": "Delete", + "item.version.delete.modal.button.confirm": "Elimina", + + // "item.version.delete.modal.button.confirm.tooltip": "Delete this version", + "item.version.delete.modal.button.confirm.tooltip": "Elimina questa versione", + + // "item.version.delete.modal.button.cancel": "Cancel", + "item.version.delete.modal.button.cancel": "Annulla", + + // "item.version.delete.modal.button.cancel.tooltip": "Do not delete this version", + "item.version.delete.modal.button.cancel.tooltip": "Non eliminare questa versione", + + // "item.version.delete.notification.success" : "Version number {{version}} has been deleted", + "item.version.delete.notification.success" : "La versione numero {{version}} è stata eliminata", + + // "item.version.delete.notification.failure" : "Version number {{version}} has not been deleted", + "item.version.delete.notification.failure" : "La versione numero {{version}} non è stata eliminata", + + + // "item.version.edit.notification.success" : "The summary of version number {{version}} has been changed", + "item.version.edit.notification.success" : "Il riepilogo della versione numero {{version}} è stato modificato", + + // "item.version.edit.notification.failure" : "The summary of version number {{version}} has not been changed", + "item.version.edit.notification.failure" : "Il riepilogo della versione numero {{version}} non è stato modificato", + + + + // "journal.listelement.badge": "Journal", + "journal.listelement.badge": "Periodico", + + // "journal.page.description": "Description", + "journal.page.description": "Descrizione", + + // "journal.page.edit": "Edit this item", + "journal.page.edit": "Modifica questo item", + + // "journal.page.editor": "Editor-in-Chief", + "journal.page.editor": "Redattore Capo", + + // "journal.page.issn": "ISSN", + "journal.page.issn": "ISSN", + + // "journal.page.publisher": "Publisher", + "journal.page.publisher": "Editore", + + // "journal.page.titleprefix": "Journal: ", + "journal.page.titleprefix": "Periodico: ", + + // "journal.search.results.head": "Journal Search Results", + "journal.search.results.head": "Risultati della ricerca Periodici", + + // "journal-relationships.search.results.head": "Journal Search Results", + "journal-relationships.search.results.head": "Risultati della ricerca Periodici", + + // "journal.search.title": "Journal Search", + "journal.search.title": "Ricerca Periodici", + + + + // "journalissue.listelement.badge": "Journal Issue", + "journalissue.listelement.badge": "Fascicolo del periodico", + + // "journalissue.page.description": "Description", + "journalissue.page.description": "Descrizione", + + // "journalissue.page.edit": "Edit this item", + "journalissue.page.edit": "Modifica questo item", + + // "journalissue.page.issuedate": "Issue Date", + "journalissue.page.issuedate": "Data di pubblicazione", + + // "journalissue.page.journal-issn": "Journal ISSN", + "journalissue.page.journal-issn": "ISSN", + + // "journalissue.page.journal-title": "Journal Title", + "journalissue.page.journal-title": "Titolo del periodico", + + // "journalissue.page.keyword": "Keywords", + "journalissue.page.keyword": "Keywords", + + // "journalissue.page.number": "Number", + "journalissue.page.number": "Numero", + + // "journalissue.page.titleprefix": "Journal Issue: ", + "journalissue.page.titleprefix": "Fascicolo del periodico: ", + + + + // "journalvolume.listelement.badge": "Journal Volume", + "journalvolume.listelement.badge": "Volume del periodico", + + // "journalvolume.page.description": "Description", + "journalvolume.page.description": "Descrizione", + + // "journalvolume.page.edit": "Edit this item", + "journalvolume.page.edit": "Modifica questo item", + + // "journalvolume.page.issuedate": "Issue Date", + "journalvolume.page.issuedate": "Data di pubblicazione", + + // "journalvolume.page.titleprefix": "Journal Volume: ", + "journalvolume.page.titleprefix": "Volume del periodico: ", + + // "journalvolume.page.volume": "Volume", + "journalvolume.page.volume": "Volume", + + + // "iiifsearchable.listelement.badge": "Document Media", + "iiifsearchable.listelement.badge": "Allegati", + + // "iiifsearchable.page.titleprefix": "Document: ", + "iiifsearchable.page.titleprefix": "Documento: ", + + // "iiifsearchable.page.doi": "Permanent Link: ", + "iiifsearchable.page.doi": "Link Permanente: ", + + // "iiifsearchable.page.issue": "Issue: ", + "iiifsearchable.page.issue": "Item:", + + // "iiifsearchable.page.description": "Description: ", + "iiifsearchable.page.description": "Descrizione: ", + + // "iiifviewer.fullscreen.notice": "Use full screen for better viewing.", + "iiifviewer.fullscreen.notice": "Usa lo schermo intero per una migliore visualizzazione.", + + // "iiif.listelement.badge": "Image Media", + "iiif.listelement.badge": "Immagini multimediali", + + // "iiif.page.titleprefix": "Image: ", + "iiif.page.titleprefix": "Immagine: ", + + // "iiif.page.doi": "Permanent Link: ", + "iiif.page.doi": "Link Permanente: ", + + // "iiif.page.issue": "Issue: ", + "iiif.page.issue": "Item: ", + + // "iiif.page.description": "Description: ", + "iiif.page.description": "Descrizione: ", + + + // "loading.bitstream": "Loading bitstream...", + "loading.bitstream": "Caricamento bitstream...", + + // "loading.bitstreams": "Loading bitstreams...", + "loading.bitstreams": "Caricamento bitstream...", + + // "loading.browse-by": "Loading items...", + "loading.browse-by": "Caricamento articoli...", + + // "loading.browse-by-page": "Loading page...", + "loading.browse-by-page": "Caricamento pagina...", + + // "loading.collection": "Loading collection...", + "loading.collection": "Caricamento collezione...", + + // "loading.collections": "Loading collections...", + "loading.collections": "Caricamento collezioni...", + + // "loading.content-source": "Loading content source...", + "loading.content-source": "Caricamento contenuto originale...", + + // "loading.community": "Loading community...", + "loading.community": "Caricamento community...", + + // "loading.default": "Loading...", + "loading.default": "Caricamento...", + + // "loading.item": "Loading item...", + "loading.item": "Caricamento articolo...", + + // "loading.items": "Loading items...", + "loading.items": "Caricamento articoli...", + + // "loading.mydspace-results": "Loading items...", + "loading.mydspace-results": "Caricamento articoli...", + + // "loading.objects": "Loading...", + "loading.objects": "Caricamento...", + + // "loading.recent-submissions": "Loading recent submissions...", + "loading.recent-submissions": "Caricamento immissioni recenti...", + + // "loading.search-results": "Loading search results...", + "loading.search-results": "Caricamento risultati della ricerca...", + + // "loading.sub-collections": "Loading sub-collections...", + "loading.sub-collections": "Caricamento sotto-collezioni...", + + // "loading.sub-communities": "Loading sub-communities...", + "loading.sub-communities": "Caricamento sotto-comunità...", + + // "loading.top-level-communities": "Loading top-level communities...", + "loading.top-level-communities": "Caricamento di community di primo livello...", + + + + // "login.form.email": "Email address", + "login.form.email": "Indirizzo email", + + // "login.form.forgot-password": "Have you forgotten your password?", + "login.form.forgot-password": "Hai dimenticato la password?", + + // "login.form.header": "Please log in to DSpace", + "login.form.header": "Accedi a DSpace", + + // "login.form.new-user": "New user? Click here to register.", + "login.form.new-user": "Nuovo utente? Clicca qui per registrarti.", + + // "login.form.or-divider": "or", + "login.form.or-divider": "oppure", + + // "login.form.oidc": "Log in with OIDC", + "login.form.oidc": "Accedi con OIDC", + + // "login.form.orcid": "Log in with ORCID", + "login.form.orcid": "Accedi con ORCID", + + // "login.form.password": "Password", + "login.form.password": "Password", + + // "login.form.shibboleth": "Log in with Shibboleth", + "login.form.shibboleth": "Accedi con Shibboleth", + + // "login.form.submit": "Log in", + "login.form.submit": "Accedi", + + // "login.title": "Login", + "login.title": "Accesso", + + // "login.breadcrumbs": "Login", + "login.breadcrumbs": "Accesso", + + + + // "logout.form.header": "Log out from DSpace", + "logout.form.header": "Disconnettersi da DSpace", + + // "logout.form.submit": "Log out", + "logout.form.submit": "Esci", + + // "logout.title": "Logout", + "logout.title": "Logout", + + + + // "menu.header.admin": "Management", + "menu.header.admin": "Gestione", + + // "menu.header.image.logo": "Repository logo", + "menu.header.image.logo": "Logo del repository", + + // "menu.header.admin.description": "Management menu", + "menu.header.admin.description": "Menu di gestione", + + + + // "menu.section.access_control": "Access Control", + "menu.section.access_control": "Controllo di accesso", + + // "menu.section.access_control_authorizations": "Authorizations", + "menu.section.access_control_authorizations": "Autorizzazioni", + + // "menu.section.access_control_groups": "Groups", + "menu.section.access_control_groups": "Gruppi", + + // "menu.section.access_control_people": "People", + "menu.section.access_control_people": "Persone", + + + + // "menu.section.admin_search": "Admin Search", + "menu.section.admin_search": "Ricerca admin", + + + + // "menu.section.browse_community": "This Community", + "menu.section.browse_community": "Questa Community", + + // "menu.section.browse_community_by_author": "By Author", + "menu.section.browse_community_by_author": "Per Autore", + + // "menu.section.browse_community_by_issue_date": "By Issue Date", + "menu.section.browse_community_by_issue_date": "Per data di pubblicazione", + + // "menu.section.browse_community_by_title": "By Title", + "menu.section.browse_community_by_title": "Per titolo", + + // "menu.section.browse_global": "All of DSpace", + // TODO New key - Add a translation + "menu.section.browse_global": "All of DSpace", + + // "menu.section.browse_global_by_author": "By Author", + // TODO New key - Add a translation + "menu.section.browse_global_by_author": "By Author", + + // "menu.section.browse_global_by_dateissued": "By Issue Date", + // TODO New key - Add a translation + "menu.section.browse_global_by_dateissued": "By Issue Date", + + // "menu.section.browse_global_by_subject": "By Subject", + // TODO New key - Add a translation + "menu.section.browse_global_by_subject": "By Subject", + + // "menu.section.browse_global_by_title": "By Title", + // TODO New key - Add a translation + "menu.section.browse_global_by_title": "By Title", + + // "menu.section.browse_global_communities_and_collections": "Communities & Collections", + // TODO New key - Add a translation + "menu.section.browse_global_communities_and_collections": "Communities & Collections", + + + + // "menu.section.control_panel": "Control Panel", + "menu.section.control_panel": "Pannello di controllo", + + // "menu.section.curation_task": "Curation Task", + "menu.section.curation_task": "Curation Task", + + + + // "menu.section.edit": "Edit", + "menu.section.edit": "Modificare", + + // "menu.section.edit_collection": "Collection", + "menu.section.edit_collection": "Collezione", + + // "menu.section.edit_community": "Community", + "menu.section.edit_community": "Community", + + // "menu.section.edit_item": "Item", + "menu.section.edit_item": "Articolo", + + + + // "menu.section.export": "Export", + "menu.section.export": "Esporta", + + // "menu.section.export_collection": "Collection", + "menu.section.export_collection": "Collezione", + + // "menu.section.export_community": "Community", + "menu.section.export_community": "Community", + + // "menu.section.export_item": "Item", + "menu.section.export_item": "Articolo", + + // "menu.section.export_metadata": "Metadata", + "menu.section.export_metadata": "Metadati", + + // "menu.section.export_batch": "Batch Export (ZIP)", + // TODO New key - Add a translation + "menu.section.export_batch": "Batch Export (ZIP)", + + + // "menu.section.icon.access_control": "Access Control menu section", + "menu.section.icon.access_control": "Sezione del menu Controllo di accesso", + + // "menu.section.icon.admin_search": "Admin search menu section", + "menu.section.icon.admin_search": "Sezione del menu di ricerca dell'amministratore", + + // "menu.section.icon.control_panel": "Control Panel menu section", + "menu.section.icon.control_panel": "Sezione del menu del Pannello di controllo", + + // "menu.section.icon.curation_tasks": "Curation Task menu section", + "menu.section.icon.curation_tasks": "Sezione del menu Curation task", + + // "menu.section.icon.edit": "Edit menu section", + "menu.section.icon.edit": "Modifica sezione menu", + + // "menu.section.icon.export": "Export menu section", + "menu.section.icon.export": "Sezione del menu Esporta", + + // "menu.section.icon.find": "Find menu section", + "menu.section.icon.find": "Trova sezione menu", + + // "menu.section.icon.health": "Health check menu section", + // TODO New key - Add a translation + "menu.section.icon.health": "Health check menu section", + + // "menu.section.icon.import": "Import menu section", + "menu.section.icon.import": "Sezione del menu Importa", + + // "menu.section.icon.new": "New menu section", + "menu.section.icon.new": "Nuova sezione menu", + + // "menu.section.icon.pin": "Pin sidebar", + "menu.section.icon.pin": "Fissa la barra laterale", + + // "menu.section.icon.processes": "Processes Health", + // TODO Source message changed - Revise the translation + "menu.section.icon.processes": "Sezione del menu Processi", + + // "menu.section.icon.registries": "Registries menu section", + "menu.section.icon.registries": "Sezione del menu Registri", + + // "menu.section.icon.statistics_task": "Statistics Task menu section", + "menu.section.icon.statistics_task": "Sezione del menu Task statistiche", + + // "menu.section.icon.workflow": "Administer workflow menu section", + "menu.section.icon.workflow": "Amministrare la sezione del menu del flusso di lavoro", + + // "menu.section.icon.unpin": "Unpin sidebar", + "menu.section.icon.unpin": "Rimuovi la barra laterale", + + + + // "menu.section.import": "Import", + "menu.section.import": "Importazione", + + // "menu.section.import_batch": "Batch Import (ZIP)", + "menu.section.import_batch": "Importazione batch (ZIP)", + + // "menu.section.import_metadata": "Metadata", + "menu.section.import_metadata": "Metadata", + + + + // "menu.section.new": "New", + "menu.section.new": "Nuovo", + + // "menu.section.new_collection": "Collection", + "menu.section.new_collection": "Collezione", + + // "menu.section.new_community": "Community", + "menu.section.new_community": "Community", + + // "menu.section.new_item": "Item", + "menu.section.new_item": "Item", + + // "menu.section.new_item_version": "Item Version", + "menu.section.new_item_version": "Versione dell'item", + + // "menu.section.new_process": "Process", + "menu.section.new_process": "Processo", + + + + // "menu.section.pin": "Pin sidebar", + "menu.section.pin": "Pin barra laterale", + + // "menu.section.unpin": "Unpin sidebar", + "menu.section.unpin": "Rimuovere la barra laterale", + + + + // "menu.section.processes": "Processes", + "menu.section.processes": "Processi", + + // "menu.section.health": "Health", + "menu.section.health": "Salute", + + + + // "menu.section.registries": "Registries", + "menu.section.registries": "Registri", + + // "menu.section.registries_format": "Format", + "menu.section.registries_format": "Formato", + + // "menu.section.registries_metadata": "Metadata", + "menu.section.registries_metadata": "Metadati", + + + + // "menu.section.statistics": "Statistics", + "menu.section.statistics": "Statistica", + + // "menu.section.statistics_task": "Statistics Task", + "menu.section.statistics_task": "Statistiche", + + + + // "menu.section.toggle.access_control": "Toggle Access Control section", + "menu.section.toggle.access_control": "Attiva/disattiva la sezione Controllo accessi", + + // "menu.section.toggle.control_panel": "Toggle Control Panel section", + "menu.section.toggle.control_panel": "Attiva/disattiva la sezione Pannello di controllo", + + // "menu.section.toggle.curation_task": "Toggle Curation Task section", + "menu.section.toggle.curation_task": "Attiva/disattiva la sezione Curation task", + + // "menu.section.toggle.edit": "Toggle Edit section", + "menu.section.toggle.edit": "Attiva/disattiva sezione Modifica", + + // "menu.section.toggle.export": "Toggle Export section", + "menu.section.toggle.export": "Attiva/disattiva la sezione Esporta", + + // "menu.section.toggle.find": "Toggle Find section", + "menu.section.toggle.find": "Attiva/disattiva la sezione Trova", + + // "menu.section.toggle.import": "Toggle Import section", + "menu.section.toggle.import": "Attiva/disattiva la sezione Importa", + + // "menu.section.toggle.new": "Toggle New section", + "menu.section.toggle.new": "Attiva/disattiva Nuova sezione", + + // "menu.section.toggle.registries": "Toggle Registries section", + "menu.section.toggle.registries": "Attiva/disattiva la sezione Registri", + + // "menu.section.toggle.statistics_task": "Toggle Statistics Task section", + "menu.section.toggle.statistics_task": "Attiva/disattiva la sezione Task statistiche", + + + // "menu.section.workflow": "Administer Workflow", + "menu.section.workflow": "Amministrare il flusso di lavoro", + + + // "metadata-export-search.tooltip": "Export search results as CSV", + "metadata-export-search.tooltip": "Esporta i risultati in CSV", + // "metadata-export-search.submit.success": "The export was started successfully", + "metadata-export-search.submit.success": "L'export è iniziato con successo", + // "metadata-export-search.submit.error": "Starting the export has failed", + "metadata-export-search.submit.error": "L'export è fallito", + + + // "mydspace.breadcrumbs": "MyDSpace", + "mydspace.breadcrumbs": "MyDSpace", + + // "mydspace.description": "", + "mydspace.description": "Mio spazio personale", + + // "mydspace.messages.controller-help": "Select this option to send a message to item's submitter.", + "mydspace.messages.controller-help": "Selezionare questa opzione per inviare un messaggio al mittente dell'item.", + + // "mydspace.messages.description-placeholder": "Insert your message here...", + "mydspace.messages.description-placeholder": "Inserisci qui il tuo messaggio...", + + // "mydspace.messages.hide-msg": "Hide message", + "mydspace.messages.hide-msg": "Nascondi messaggio", + + // "mydspace.messages.mark-as-read": "Mark as read", + "mydspace.messages.mark-as-read": "Contrassegna come letto", + + // "mydspace.messages.mark-as-unread": "Mark as unread", + "mydspace.messages.mark-as-unread": "Contrassegna come non letto", + + // "mydspace.messages.no-content": "No content.", + "mydspace.messages.no-content": "Nessun contenuto.", + + // "mydspace.messages.no-messages": "No messages yet.", + "mydspace.messages.no-messages": "Nessun messaggio ancora.", + + // "mydspace.messages.send-btn": "Send", + "mydspace.messages.send-btn": "Invia", + + // "mydspace.messages.show-msg": "Show message", + "mydspace.messages.show-msg": "Mostra messaggio", + + // "mydspace.messages.subject-placeholder": "Subject...", + "mydspace.messages.subject-placeholder": "Oggetto...", + + // "mydspace.messages.submitter-help": "Select this option to send a message to controller.", + "mydspace.messages.submitter-help": "Selezionare questa opzione per inviare un messaggio al controller.", + + // "mydspace.messages.title": "Messages", + "mydspace.messages.title": "Messaggi", + + // "mydspace.messages.to": "To", + "mydspace.messages.to": "A", + + // "mydspace.new-submission": "New submission", + "mydspace.new-submission": "Nuova immissione", + + // "mydspace.new-submission-external": "Import metadata from external source", + "mydspace.new-submission-external": "Importare metadati da un'origine esterna", + + // "mydspace.new-submission-external-short": "Import metadata", + "mydspace.new-submission-external-short": "Importare metadati", + + // "mydspace.results.head": "Your submissions", + "mydspace.results.head": "I tuoi contributi", + + // "mydspace.results.no-abstract": "No Abstract", + "mydspace.results.no-abstract": "Nessun abstract", + + // "mydspace.results.no-authors": "No Authors", + "mydspace.results.no-authors": "Nessun autore", + + // "mydspace.results.no-collections": "No Collections", + "mydspace.results.no-collections": "Nessuna collezione", + + // "mydspace.results.no-date": "No Date", + "mydspace.results.no-date": "Nessuna data", + + // "mydspace.results.no-files": "No Files", + "mydspace.results.no-files": "Nessun file", + + // "mydspace.results.no-results": "There were no items to show", + "mydspace.results.no-results": "Non c'erano oggetti da mostrare", + + // "mydspace.results.no-title": "No title", + "mydspace.results.no-title": "Nessun titolo", + + // "mydspace.results.no-uri": "No Uri", + "mydspace.results.no-uri": "Nessun URI", + + // "mydspace.search-form.placeholder": "Search in mydspace...", + "mydspace.search-form.placeholder": "Cerca in mydspace...", + + // "mydspace.show.workflow": "Workflow tasks", + "mydspace.show.workflow": "Workflow Tasks", + + // "mydspace.show.workspace": "Your Submissions", + "mydspace.show.workspace": "I tuoi contributi", + + // "mydspace.status.archived": "Archived", + "mydspace.status.archived": "Archiviati", + + // "mydspace.status.validation": "Validation", + "mydspace.status.validation": "Convalida", + + // "mydspace.status.waiting-for-controller": "Waiting for controller", + "mydspace.status.waiting-for-controller": "In attesa del controllo", + + // "mydspace.status.workflow": "Workflow", + "mydspace.status.workflow": "Workflow", + + // "mydspace.status.workspace": "Workspace", + "mydspace.status.workspace": "Workspace", + + // "mydspace.title": "MyDSpace", + "mydspace.title": "MyDSpace", + + // "mydspace.upload.upload-failed": "Error creating new workspace. Please verify the content uploaded before retry.", + "mydspace.upload.upload-failed": "Errore durante la creazione di una nuova area di lavoro. Verifica il contenuto caricato prima di riprovare.", + + // "mydspace.upload.upload-failed-manyentries": "Unprocessable file. Detected too many entries but allowed only one for file.", + "mydspace.upload.upload-failed-manyentries": "File non elaborabile. Rilevate troppe voci ma ne è consentita solo una per il file.", + + // "mydspace.upload.upload-failed-moreonefile": "Unprocessable request. Only one file is allowed.", + "mydspace.upload.upload-failed-moreonefile": "Richiesta non elaborabile. È consentito un solo file.", + + // "mydspace.upload.upload-multiple-successful": "{{qty}} new workspace items created.", + "mydspace.upload.upload-multiple-successful": "{{qty}} nuovi item dell'area di lavoro creati.", + + // "mydspace.view-btn": "View", + "mydspace.view-btn": "Vista", + + + + // "nav.browse.header": "All of DSpace", + "nav.browse.header": "Tutto DSpace", + + // "nav.community-browse.header": "By Community", + "nav.community-browse.header": "Per Community", + + // "nav.language": "Language switch", + "nav.language": "Cambio di lingua", + + // "nav.login": "Log In", + "nav.login": "Accedi", + + // "nav.user-profile-menu-and-logout": "User profile menu and Log Out", + // TODO New key - Add a translation + "nav.user-profile-menu-and-logout": "User profile menu and Log Out", + + // "nav.logout": "Log Out", + // TODO Source message changed - Revise the translation + "nav.logout": "Menu profilo utente e Disconnetti", + + // "nav.main.description": "Main navigation bar", + "nav.main.description": "Barra di navigazione principale", + + // "nav.mydspace": "MyDSpace", + "nav.mydspace": "MyDSpace", + + // "nav.profile": "Profile", + "nav.profile": "Profilo", + + // "nav.search": "Search", + "nav.search": "Ricerca", + + // "nav.statistics.header": "Statistics", + "nav.statistics.header": "Statistica", + + // "nav.stop-impersonating": "Stop impersonating EPerson", + "nav.stop-impersonating": "Smetti di impersonare EPerson", + + // "nav.toggle" : "Toggle navigation", + // TODO New key - Add a translation + "nav.toggle" : "Toggle navigation", + + // "nav.user.description" : "User profile bar", + // TODO New key - Add a translation + "nav.user.description" : "User profile bar", + + // "none.listelement.badge": "Item", + "none.listelement.badge": "Articolo", + + + // "orgunit.listelement.badge": "Organizational Unit", + "orgunit.listelement.badge": "Unità organizzativa", + + // "orgunit.listelement.no-title": "Untitled", + // TODO New key - Add a translation + "orgunit.listelement.no-title": "Untitled", + + // "orgunit.page.city": "City", + "orgunit.page.city": "Città", + + // "orgunit.page.country": "Country", + "orgunit.page.country": "Paese", + + // "orgunit.page.dateestablished": "Date established", + "orgunit.page.dateestablished": "Data stabilita", + + // "orgunit.page.description": "Description", + "orgunit.page.description": "Descrizione", + + // "orgunit.page.edit": "Edit this item", + "orgunit.page.edit": "Modifica questo item", + + // "orgunit.page.id": "ID", + "orgunit.page.id": "ID", + + // "orgunit.page.titleprefix": "Organizational Unit: ", + // TODO New key - Add a translation + "orgunit.page.titleprefix": "Organizational Unit: ", + + + + // "pagination.options.description": "Pagination options", + "pagination.options.description": "Opzioni di impaginazione", + + // "pagination.results-per-page": "Results Per Page", + "pagination.results-per-page": "Risultati per pagina", + + // "pagination.showing.detail": "{{ range }} of {{ total }}", + "pagination.showing.detail": "{{ range }} di {{ total }}", + + // "pagination.showing.label": "Now showing ", + "pagination.showing.label": "Ora in mostra ", + + // "pagination.sort-direction": "Sort Options", + "pagination.sort-direction": "Opzioni di ordinamento", + + + + // "person.listelement.badge": "Person", + "person.listelement.badge": "Persona", + + // "person.listelement.no-title": "No name found", + "person.listelement.no-title": "Nessun nome trovato", + + // "person.page.birthdate": "Birth Date", + "person.page.birthdate": "Data di nascita", + + // "person.page.edit": "Edit this item", + "person.page.edit": "Modifica questo item", + + // "person.page.email": "Email Address", + "person.page.email": "Indirizzo email", + + // "person.page.firstname": "First Name", + "person.page.firstname": "Nome di battesimo", + + // "person.page.jobtitle": "Job Title", + "person.page.jobtitle": "Titolo di lavoro", + + // "person.page.lastname": "Last Name", + "person.page.lastname": "Cognome", + + // "person.page.name": "Name", + // TODO New key - Add a translation + "person.page.name": "Name", + + // "person.page.link.full": "Show all metadata", + "person.page.link.full": "Mostra tutti i metadati", + + // "person.page.orcid": "ORCID", + "person.page.orcid": "ORCID", + + // "person.page.staffid": "Staff ID", + "person.page.staffid": "ID personale", + + // "person.page.titleprefix": "Person: ", + "person.page.titleprefix": "Persona: ", + + // "person.search.results.head": "Person Search Results", + "person.search.results.head": "Risultati della ricerca per Ricercatore", + + // "person-relationships.search.results.head": "Person Search Results", + // TODO New key - Add a translation + "person-relationships.search.results.head": "Person Search Results", + + // "person.search.title": "Person Search", + "person.search.title": "Cerca i Ricercatori", + + + + // "process.new.select-parameters": "Parameters", + "process.new.select-parameters": "Parametri", + + // "process.new.cancel": "Cancel", + "process.new.cancel": "Annulla", + + // "process.new.submit": "Save", + "process.new.submit": "Salvare", + + // "process.new.select-script": "Script", + "process.new.select-script": "Script", + + // "process.new.select-script.placeholder": "Choose a script...", + "process.new.select-script.placeholder": "Scegli uno script...", + + // "process.new.select-script.required": "Script is required", + "process.new.select-script.required": "Lo script è obbligatorio", + + // "process.new.parameter.file.upload-button": "Select file...", + "process.new.parameter.file.upload-button": "Seleziona file...", + + // "process.new.parameter.file.required": "Please select a file", + "process.new.parameter.file.required": "Seleziona un file", + + // "process.new.parameter.string.required": "Parameter value is required", + "process.new.parameter.string.required": "Il valore del parametro è obbligatorio", + + // "process.new.parameter.type.value": "value", + "process.new.parameter.type.value": "valore", + + // "process.new.parameter.type.file": "file", + "process.new.parameter.type.file": "file", + + // "process.new.parameter.required.missing": "The following parameters are required but still missing:", + // TODO New key - Add a translation + "process.new.parameter.required.missing": "The following parameters are required but still missing:", + + // "process.new.notification.success.title": "Success", + "process.new.notification.success.title": "Successo", + + // "process.new.notification.success.content": "The process was successfully created", + "process.new.notification.success.content": "Il processo è stato creato con successo", + + // "process.new.notification.error.title": "Error", + "process.new.notification.error.title": "Errore", + + // "process.new.notification.error.content": "An error occurred while creating this process", + "process.new.notification.error.content": "Si è verificato un errore durante la creazione di questo processo", + + // "process.new.header": "Create a new process", + "process.new.header": "Creare un nuovo processo", + + // "process.new.title": "Create a new process", + "process.new.title": "Creare un nuovo processo", + + // "process.new.breadcrumbs": "Create a new process", + "process.new.breadcrumbs": "Creare un nuovo processo", + + + + // "process.detail.arguments" : "Arguments", + // TODO New key - Add a translation + "process.detail.arguments" : "Arguments", + + // "process.detail.arguments.empty" : "This process doesn't contain any arguments", + // TODO New key - Add a translation + "process.detail.arguments.empty" : "This process doesn't contain any arguments", + + // "process.detail.back" : "Back", + // TODO New key - Add a translation + "process.detail.back" : "Back", + + // "process.detail.output" : "Process Output", + // TODO New key - Add a translation + "process.detail.output" : "Process Output", + + // "process.detail.logs.button": "Retrieve process output", + "process.detail.logs.button": "Recupera l'output del processo", + + // "process.detail.logs.loading": "Retrieving", + "process.detail.logs.loading": "Recupero", + + // "process.detail.logs.none": "This process has no output", + "process.detail.logs.none": "Questo processo non ha output", + + // "process.detail.output-files" : "Output Files", + // TODO New key - Add a translation + "process.detail.output-files" : "Output Files", + + // "process.detail.output-files.empty" : "This process doesn't contain any output files", + // TODO New key - Add a translation + "process.detail.output-files.empty" : "This process doesn't contain any output files", + + // "process.detail.script" : "Script", + // TODO New key - Add a translation + "process.detail.script" : "Script", + + // "process.detail.title" : "Process: {{ id }} - {{ name }}", + // TODO New key - Add a translation + "process.detail.title" : "Process: {{ id }} - {{ name }}", + + // "process.detail.start-time" : "Start time", + // TODO New key - Add a translation + "process.detail.start-time" : "Start time", + + // "process.detail.end-time" : "Finish time", + // TODO New key - Add a translation + "process.detail.end-time" : "Finish time", + + // "process.detail.status" : "Status", + // TODO New key - Add a translation + "process.detail.status" : "Status", + + // "process.detail.create" : "Create similar process", + // TODO New key - Add a translation + "process.detail.create" : "Create similar process", + + // "process.detail.actions": "Actions", + // TODO New key - Add a translation + "process.detail.actions": "Actions", + + // "process.detail.delete.button": "Delete process", + // TODO New key - Add a translation + "process.detail.delete.button": "Delete process", + + // "process.detail.delete.header": "Delete process", + // TODO New key - Add a translation + "process.detail.delete.header": "Delete process", + + // "process.detail.delete.body": "Are you sure you want to delete the current process?", + // TODO New key - Add a translation + "process.detail.delete.body": "Are you sure you want to delete the current process?", + + // "process.detail.delete.cancel": "Cancel", + // TODO New key - Add a translation + "process.detail.delete.cancel": "Cancel", + + // "process.detail.delete.confirm": "Delete process", + // TODO New key - Add a translation + "process.detail.delete.confirm": "Delete process", + + // "process.detail.delete.success": "The process was successfully deleted.", + // TODO New key - Add a translation + "process.detail.delete.success": "The process was successfully deleted.", + + // "process.detail.delete.error": "Something went wrong when deleting the process", + // TODO New key - Add a translation + "process.detail.delete.error": "Something went wrong when deleting the process", + + + + // "process.overview.table.finish" : "Finish time (UTC)", + // TODO New key - Add a translation + "process.overview.table.finish" : "Finish time (UTC)", + + // "process.overview.table.id" : "Process ID", + // TODO New key - Add a translation + "process.overview.table.id" : "Process ID", + + // "process.overview.table.name" : "Name", + // TODO New key - Add a translation + "process.overview.table.name" : "Name", + + // "process.overview.table.start" : "Start time (UTC)", + // TODO New key - Add a translation + "process.overview.table.start" : "Start time (UTC)", + + // "process.overview.table.status" : "Status", + // TODO New key - Add a translation + "process.overview.table.status" : "Status", + + // "process.overview.table.user" : "User", + // TODO New key - Add a translation + "process.overview.table.user" : "User", + + // "process.overview.title": "Processes Overview", + "process.overview.title": "Panoramica dei processi", + + // "process.overview.breadcrumbs": "Processes Overview", + "process.overview.breadcrumbs": "Panoramica dei processi", + + // "process.overview.new": "New", + "process.overview.new": "Nuovo", + + // "process.overview.table.actions": "Actions", + // TODO New key - Add a translation + "process.overview.table.actions": "Actions", + + // "process.overview.delete": "Delete {{count}} processes", + // TODO New key - Add a translation + "process.overview.delete": "Delete {{count}} processes", + + // "process.overview.delete.clear": "Clear delete selection", + // TODO New key - Add a translation + "process.overview.delete.clear": "Clear delete selection", + + // "process.overview.delete.processing": "{{count}} process(es) are being deleted. Please wait for the deletion to fully complete. Note that this can take a while.", + // TODO New key - Add a translation + "process.overview.delete.processing": "{{count}} process(es) are being deleted. Please wait for the deletion to fully complete. Note that this can take a while.", + + // "process.overview.delete.body": "Are you sure you want to delete {{count}} process(es)?", + // TODO New key - Add a translation + "process.overview.delete.body": "Are you sure you want to delete {{count}} process(es)?", + + // "process.overview.delete.header": "Delete processes", + // TODO New key - Add a translation + "process.overview.delete.header": "Delete processes", + + // "process.bulk.delete.error.head": "Error on deleteing process", + // TODO New key - Add a translation + "process.bulk.delete.error.head": "Error on deleteing process", + + // "process.bulk.delete.error.body": "The process with ID {{processId}} could not be deleted. The remaining processes will continue being deleted. ", + // TODO New key - Add a translation + "process.bulk.delete.error.body": "The process with ID {{processId}} could not be deleted. The remaining processes will continue being deleted. ", + + // "process.bulk.delete.success": "{{count}} process(es) have been succesfully deleted", + // TODO New key - Add a translation + "process.bulk.delete.success": "{{count}} process(es) have been succesfully deleted", + + + + // "profile.breadcrumbs": "Update Profile", + "profile.breadcrumbs": "Aggiorna profilo", + + // "profile.card.identify": "Identify", + "profile.card.identify": "Identificare", + + // "profile.card.security": "Security", + "profile.card.security": "Sicurezza", + + // "profile.form.submit": "Save", + // TODO Source message changed - Revise the translation + "profile.form.submit": "Aggiorna profilo", + + // "profile.groups.head": "Authorization groups you belong to", + "profile.groups.head": "Gruppi di autorizzazione a cui appartieni", + + // "profile.special.groups.head": "Authorization special groups you belong to", + // TODO New key - Add a translation + "profile.special.groups.head": "Authorization special groups you belong to", + + // "profile.head": "Update Profile", + "profile.head": "Aggiorna profilo", + + // "profile.metadata.form.error.firstname.required": "First Name is required", + "profile.metadata.form.error.firstname.required": "Il nome è obbligatorio", + + // "profile.metadata.form.error.lastname.required": "Last Name is required", + "profile.metadata.form.error.lastname.required": "Il cognome è obbligatorio", + + // "profile.metadata.form.label.email": "Email Address", + "profile.metadata.form.label.email": "Indirizzo e-mail", + + // "profile.metadata.form.label.firstname": "First Name", + "profile.metadata.form.label.firstname": "Nome", + + // "profile.metadata.form.label.language": "Language", + "profile.metadata.form.label.language": "Lingua", + + // "profile.metadata.form.label.lastname": "Last Name", + "profile.metadata.form.label.lastname": "Cognome", + + // "profile.metadata.form.label.phone": "Contact Telephone", + "profile.metadata.form.label.phone": "Telefono di contatto", + + // "profile.metadata.form.notifications.success.content": "Your changes to the profile were saved.", + "profile.metadata.form.notifications.success.content": "Le modifiche apportate al profilo sono state salvate.", + + // "profile.metadata.form.notifications.success.title": "Profile saved", + "profile.metadata.form.notifications.success.title": "Profilo salvato", + + // "profile.notifications.warning.no-changes.content": "No changes were made to the Profile.", + "profile.notifications.warning.no-changes.content": "Non sono state apportate modifiche al Profilo.", + + // "profile.notifications.warning.no-changes.title": "No changes", + "profile.notifications.warning.no-changes.title": "Nessuna modifica", + + // "profile.security.form.error.matching-passwords": "The passwords do not match.", + "profile.security.form.error.matching-passwords": "Le password non corrispondono.", + + // "profile.security.form.info": "Optionally, you can enter a new password in the box below, and confirm it by typing it again into the second box.", + // TODO Source message changed - Revise the translation + "profile.security.form.info": "Facoltativamente, è possibile inserire una nuova password nella casella qui sotto e confermarla digitandola nuovamente nella seconda casella. Dovrebbe essere lungo almeno sei caratteri.", + + // "profile.security.form.label.password": "Password", + "profile.security.form.label.password": "Password", + + // "profile.security.form.label.passwordrepeat": "Retype to confirm", + "profile.security.form.label.passwordrepeat": "Ridigitare per confermare", + + // "profile.security.form.label.current-password": "Current password", + // TODO New key - Add a translation + "profile.security.form.label.current-password": "Current password", + + // "profile.security.form.notifications.success.content": "Your changes to the password were saved.", + "profile.security.form.notifications.success.content": "Le modifiche apportate alla password sono state salvate.", + + // "profile.security.form.notifications.success.title": "Password saved", + "profile.security.form.notifications.success.title": "Password salvata", + + // "profile.security.form.notifications.error.title": "Error changing passwords", + "profile.security.form.notifications.error.title": "Errore durante la modifica delle password", + + // "profile.security.form.notifications.error.change-failed": "An error occurred while trying to change the password. Please check if the current password is correct.", + // TODO New key - Add a translation + "profile.security.form.notifications.error.change-failed": "An error occurred while trying to change the password. Please check if the current password is correct.", + + // "profile.security.form.notifications.error.not-same": "The provided passwords are not the same.", + "profile.security.form.notifications.error.not-same": "Le password fornite non sono le stesse.", + + // "profile.security.form.notifications.error.general": "Please fill required fields of security form.", + // TODO New key - Add a translation + "profile.security.form.notifications.error.general": "Please fill required fields of security form.", + + // "profile.title": "Update Profile", + "profile.title": "Aggiorna profilo", + + // "profile.card.researcher": "Researcher Profile", + "profile.card.researcher": "Profilo del ricercatore", + + // "project.listelement.badge": "Research Project", + "project.listelement.badge": "Risultati della ricerca: Progetti", + + // "project.page.contributor": "Contributors", + "project.page.contributor": "Progetto di ricerca", + + // "project.page.description": "Description", + "project.page.description": "Collaboratori", + + // "project.page.edit": "Edit this item", + "project.page.edit": "Descrizione", + + // "project.page.expectedcompletion": "Expected Completion", + "project.page.expectedcompletion": "Modifica questo item", + + // "project.page.funder": "Funders", + "project.page.funder": "Completamento previsto", + + // "project.page.id": "ID", + "project.page.id": "Finanziatori", + + // "project.page.keyword": "Keywords", + "project.page.keyword": "ID", + + // "project.page.status": "Status", + "project.page.status": "Parole chiave", + + // "project.page.titleprefix": "Research Project: ", + // TODO New key - Add a translation + "project.page.titleprefix": "Research Project: ", + + // "project.search.results.head": "Project Search Results", + "project.search.results.head": "Progetto di ricerca: ", + + // "project-relationships.search.results.head": "Project Search Results", + // TODO New key - Add a translation + "project-relationships.search.results.head": "Project Search Results", + + + + // "publication.listelement.badge": "Publication", + "publication.listelement.badge": "Pubblicazione", + + // "publication.page.description": "Description", + "publication.page.description": "Descrizione", + + // "publication.page.edit": "Edit this item", + "publication.page.edit": "Modifica questo item", + + // "publication.page.journal-issn": "Journal ISSN", + "publication.page.journal-issn": "ISSN Periodico", + + // "publication.page.journal-title": "Journal Title", + "publication.page.journal-title": "Titolo del Periodico", + + // "publication.page.publisher": "Publisher", + "publication.page.publisher": "Editore", + + // "publication.page.titleprefix": "Publication: ", + // TODO New key - Add a translation + "publication.page.titleprefix": "Publication: ", + + // "publication.page.volume-title": "Volume Title", + "publication.page.volume-title": "Titolo volume", + + // "publication.search.results.head": "Publication Search Results", + "publication.search.results.head": "Risultati della ricerca di pubblicazioni", + + // "publication-relationships.search.results.head": "Publication Search Results", + // TODO New key - Add a translation + "publication-relationships.search.results.head": "Publication Search Results", + + // "publication.search.title": "Publication Search", + "publication.search.title": "Ricerca pubblicazione", + + + // "media-viewer.next": "Next", + "media-viewer.next": "Avanti", + + // "media-viewer.previous": "Previous", + "media-viewer.previous": "Precedente", + + // "media-viewer.playlist": "Playlist", + "media-viewer.playlist": "Playlist", + + + // "register-email.title": "New user registration", + "register-email.title": "Registrazione nuovo utente", + + // "register-page.create-profile.header": "Create Profile", + "register-page.create-profile.header": "Crea profilo", + + // "register-page.create-profile.identification.header": "Identify", + "register-page.create-profile.identification.header": "Identificare", + + // "register-page.create-profile.identification.email": "Email Address", + "register-page.create-profile.identification.email": "Indirizzo e-mail", + + // "register-page.create-profile.identification.first-name": "First Name *", + "register-page.create-profile.identification.first-name": "Nome *", + + // "register-page.create-profile.identification.first-name.error": "Please fill in a First Name", + "register-page.create-profile.identification.first-name.error": "Inserire un nome", + + // "register-page.create-profile.identification.last-name": "Last Name *", + "register-page.create-profile.identification.last-name": "Cognome *", + + // "register-page.create-profile.identification.last-name.error": "Please fill in a Last Name", + "register-page.create-profile.identification.last-name.error": "Inserire un cognome", + + // "register-page.create-profile.identification.contact": "Contact Telephone", + "register-page.create-profile.identification.contact": "Telefono di contatto", + + // "register-page.create-profile.identification.language": "Language", + "register-page.create-profile.identification.language": "Lingua", + + // "register-page.create-profile.security.header": "Security", + "register-page.create-profile.security.header": "Sicurezza", + + // "register-page.create-profile.security.info": "Please enter a password in the box below, and confirm it by typing it again into the second box.", + // TODO Source message changed - Revise the translation + "register-page.create-profile.security.info": "Inserisci una password nella casella qui sotto e confermala digitandola nuovamente nella seconda casella. Dovrebbe essere lungo almeno sei caratteri.", + + // "register-page.create-profile.security.label.password": "Password *", + "register-page.create-profile.security.label.password": "Password *", + + // "register-page.create-profile.security.label.passwordrepeat": "Retype to confirm *", + "register-page.create-profile.security.label.passwordrepeat": "Ridigitare per confermare *", + + // "register-page.create-profile.security.error.empty-password": "Please enter a password in the box below.", + "register-page.create-profile.security.error.empty-password": "Inserisci una password nella casella qui sotto.", + + // "register-page.create-profile.security.error.matching-passwords": "The passwords do not match.", + "register-page.create-profile.security.error.matching-passwords": "Le password non corrispondono.", + + // "register-page.create-profile.submit": "Complete Registration", + "register-page.create-profile.submit": "Registrazione completa", + + // "register-page.create-profile.submit.error.content": "Something went wrong while registering a new user.", + "register-page.create-profile.submit.error.content": "Qualcosa è andato storto durante la registrazione di un nuovo utente.", + + // "register-page.create-profile.submit.error.head": "Registration failed", + "register-page.create-profile.submit.error.head": "Registrazione non riuscita", + + // "register-page.create-profile.submit.success.content": "The registration was successful. You have been logged in as the created user.", + "register-page.create-profile.submit.success.content": "La registrazione è andata a buon fine. Hai effettuato l'accesso come utente creato.", + + // "register-page.create-profile.submit.success.head": "Registration completed", + "register-page.create-profile.submit.success.head": "Registrazione completata", + + + // "register-page.registration.header": "New user registration", + "register-page.registration.header": "Registrazione nuovo utente", + + // "register-page.registration.info": "Register an account to subscribe to collections for email updates, and submit new items to DSpace.", + "register-page.registration.info": "Registra un account per iscriverti alle collezioni per gli aggiornamenti via e-mail e invia nuovi item a DSpace.", + + // "register-page.registration.email": "Email Address *", + "register-page.registration.email": "Indirizzo e-mail *", + + // "register-page.registration.email.error.required": "Please fill in an email address", + "register-page.registration.email.error.required": "Inserire un indirizzo e-mail", + + // "register-page.registration.email.error.pattern": "Please fill in a valid email address", + "register-page.registration.email.error.pattern": "Si prega di inserire un indirizzo e-mail valido", + + // "register-page.registration.email.hint": "This address will be verified and used as your login name.", + "register-page.registration.email.hint": "Questo indirizzo verrà verificato e utilizzato come nome di accesso.", + + // "register-page.registration.submit": "Register", + "register-page.registration.submit": "Registrati", + + // "register-page.registration.success.head": "Verification email sent", + "register-page.registration.success.head": "Email di verifica inviata", + + // "register-page.registration.success.content": "An email has been sent to {{ email }} containing a special URL and further instructions.", + "register-page.registration.success.content": "È stata inviata un'e-mail a {{ email }} contenente un URL speciale e ulteriori istruzioni.", + + // "register-page.registration.error.head": "Error when trying to register email", + "register-page.registration.error.head": "Errore durante il tentativo di registrazione dell'e-mail", + + // "register-page.registration.error.content": "An error occured when registering the following email address: {{ email }}", + // TODO New key - Add a translation + "register-page.registration.error.content": "An error occured when registering the following email address: {{ email }}", + + // "register-page.registration.error.recaptcha": "Error when trying to authenticate with recaptcha", + // TODO New key - Add a translation + "register-page.registration.error.recaptcha": "Error when trying to authenticate with recaptcha", + + // "register-page.registration.google-recaptcha.must-accept-cookies": "In order to register you must accept the Registration and Password recovery (Google reCaptcha) cookies.", + // TODO New key - Add a translation + "register-page.registration.google-recaptcha.must-accept-cookies": "In order to register you must accept the Registration and Password recovery (Google reCaptcha) cookies.", + + // "register-page.registration.google-recaptcha.open-cookie-settings": "Open cookie settings", + // TODO New key - Add a translation + "register-page.registration.google-recaptcha.open-cookie-settings": "Open cookie settings", + + // "register-page.registration.google-recaptcha.notification.title": "Google reCaptcha", + // TODO New key - Add a translation + "register-page.registration.google-recaptcha.notification.title": "Google reCaptcha", + + // "register-page.registration.google-recaptcha.notification.message.error": "An error occurred during reCaptcha verification", + // TODO New key - Add a translation + "register-page.registration.google-recaptcha.notification.message.error": "An error occurred during reCaptcha verification", + + // "register-page.registration.google-recaptcha.notification.message.expired": "Verification expired. Please verify again.", + // TODO New key - Add a translation + "register-page.registration.google-recaptcha.notification.message.expired": "Verification expired. Please verify again.", + + // "relationships.add.error.relationship-type.content": "No suitable match could be found for relationship type {{ type }} between the two items", + "relationships.add.error.relationship-type.content": "Non è stata trovata alcuna corrispondenza adatta per il tipo di relazione {{ type }} tra i due item", + + // "relationships.add.error.server.content": "The server returned an error", + "relationships.add.error.server.content": "Il server ha restituito un errore", + + // "relationships.add.error.title": "Unable to add relationship", + "relationships.add.error.title": "Impossibile aggiungere relazione", + + // "relationships.isAuthorOf": "Authors", + "relationships.isAuthorOf": "Autori", + + // "relationships.isAuthorOf.Person": "Authors (persons)", + "relationships.isAuthorOf.Person": "Autori (persone)", + + // "relationships.isAuthorOf.OrgUnit": "Authors (organizational units)", + "relationships.isAuthorOf.OrgUnit": "Autori (struttura)", + + // "relationships.isIssueOf": "Journal Issues", + "relationships.isIssueOf": "Fascicolo Periodico", + + // "relationships.isJournalIssueOf": "Journal Issue", + "relationships.isJournalIssueOf": "Fascicolo Periodico", + + // "relationships.isJournalOf": "Journals", + "relationships.isJournalOf": "Periodico", + + // "relationships.isOrgUnitOf": "Organizational Units", + "relationships.isOrgUnitOf": "Strutture", + + // "relationships.isPersonOf": "Authors", + "relationships.isPersonOf": "Autori", + + // "relationships.isProjectOf": "Research Projects", + "relationships.isProjectOf": "Progetti di ricerca", + + // "relationships.isPublicationOf": "Publications", + "relationships.isPublicationOf": "Pubblicazioni", + + // "relationships.isPublicationOfJournalIssue": "Articles", + "relationships.isPublicationOfJournalIssue": "Articoli", + + // "relationships.isSingleJournalOf": "Journal", + "relationships.isSingleJournalOf": "Periodico", + + // "relationships.isSingleVolumeOf": "Journal Volume", + "relationships.isSingleVolumeOf": "Volume del Periodico", + + // "relationships.isVolumeOf": "Journal Volumes", + "relationships.isVolumeOf": "Volumi di Periodico", + + // "relationships.isContributorOf": "Contributors", + "relationships.isContributorOf": "Collaboratori", + + // "relationships.isContributorOf.OrgUnit": "Contributor (Organizational Unit)", + "relationships.isContributorOf.OrgUnit": "Collaboratore (Struttura)", + + // "relationships.isContributorOf.Person": "Contributor", + "relationships.isContributorOf.Person": "Collaboratore", + + // "relationships.isFundingAgencyOf.OrgUnit": "Funder", + "relationships.isFundingAgencyOf.OrgUnit": "Finanziatore", + + + // "repository.image.logo": "Repository logo", + "repository.image.logo": "Logo del repository", + + // "repository.title.prefix": "DSpace Angular :: ", + // TODO New key - Add a translation + "repository.title.prefix": "DSpace Angular :: ", + + // "repository.title.prefixDSpace": "DSpace Angular ::", + "repository.title.prefixDSpace": "DSpace Angular ::", + + + // "resource-policies.add.button": "Add", + "resource-policies.add.button": "Aggiungi", + + // "resource-policies.add.for.": "Add a new policy", + "resource-policies.add.for.": "Aggiungi un nuovo criterio", + + // "resource-policies.add.for.bitstream": "Add a new Bitstream policy", + "resource-policies.add.for.bitstream": "Aggiungi un nuovo criterio Bitstream", + + // "resource-policies.add.for.bundle": "Add a new Bundle policy", + "resource-policies.add.for.bundle": "Aggiungi un nuovo criterio Bundle", + + // "resource-policies.add.for.item": "Add a new Item policy", + "resource-policies.add.for.item": "Aggiungi un nuovo criterio item", + + // "resource-policies.add.for.community": "Add a new Community policy", + "resource-policies.add.for.community": "Aggiungere un nuovo criterio comunitario", + + // "resource-policies.add.for.collection": "Add a new Collection policy", + "resource-policies.add.for.collection": "Aggiungere un nuovo criterio di collezione", + + // "resource-policies.create.page.heading": "Create new resource policy for ", + "resource-policies.create.page.heading": "Creare nuovi criteri di risorsa per ", + + // "resource-policies.create.page.failure.content": "An error occurred while creating the resource policy.", + "resource-policies.create.page.failure.content": "Si è verificato un errore durante la creazione del criterio della risorsa.", + + // "resource-policies.create.page.success.content": "Operation successful", + "resource-policies.create.page.success.content": "Operazione riuscita", + + // "resource-policies.create.page.title": "Create new resource policy", + "resource-policies.create.page.title": "Creare nuovi criteri risorse", + + // "resource-policies.delete.btn": "Delete selected", + "resource-policies.delete.btn": "Elimina selezionato", + + // "resource-policies.delete.btn.title": "Delete selected resource policies", + "resource-policies.delete.btn.title": "Elimina criteri risorse selezionati", + + // "resource-policies.delete.failure.content": "An error occurred while deleting selected resource policies.", + "resource-policies.delete.failure.content": "Si è verificato un errore durante l'eliminazione dei criteri delle risorse selezionati.", + + // "resource-policies.delete.success.content": "Operation successful", + "resource-policies.delete.success.content": "Operazione riuscita", + + // "resource-policies.edit.page.heading": "Edit resource policy ", + "resource-policies.edit.page.heading": "Modifica criterio risorse", + + // "resource-policies.edit.page.failure.content": "An error occurred while editing the resource policy.", + "resource-policies.edit.page.failure.content": "Si è verificato un errore durante la modifica del criterio delle risorse.", + + // "resource-policies.edit.page.target-failure.content": "An error occurred while editing the target (ePerson or group) of the resource policy.", + // TODO New key - Add a translation + "resource-policies.edit.page.target-failure.content": "An error occurred while editing the target (ePerson or group) of the resource policy.", + + // "resource-policies.edit.page.other-failure.content": "An error occurred while editing the resource policy. The target (ePerson or group) has been successfully updated.", + // TODO New key - Add a translation + "resource-policies.edit.page.other-failure.content": "An error occurred while editing the resource policy. The target (ePerson or group) has been successfully updated.", + + // "resource-policies.edit.page.success.content": "Operation successful", + "resource-policies.edit.page.success.content": "Operazione riuscita", + + // "resource-policies.edit.page.title": "Edit resource policy", + "resource-policies.edit.page.title": "Modifica criterio risorse", + + // "resource-policies.form.action-type.label": "Select the action type", + "resource-policies.form.action-type.label": "Selezionare il tipo di azione", + + // "resource-policies.form.action-type.required": "You must select the resource policy action.", + "resource-policies.form.action-type.required": "È necessario selezionare l'azione del criterio delle risorse.", + + // "resource-policies.form.eperson-group-list.label": "The eperson or group that will be granted the permission", + "resource-policies.form.eperson-group-list.label": "L'eperson o il gruppo a cui verrà concessa l'autorizzazione", + + // "resource-policies.form.eperson-group-list.select.btn": "Select", + "resource-policies.form.eperson-group-list.select.btn": "Seleziona", + + // "resource-policies.form.eperson-group-list.tab.eperson": "Search for a ePerson", + "resource-policies.form.eperson-group-list.tab.eperson": "Cerca un ePerson", + + // "resource-policies.form.eperson-group-list.tab.group": "Search for a group", + "resource-policies.form.eperson-group-list.tab.group": "Cerca un gruppo", + + // "resource-policies.form.eperson-group-list.table.headers.action": "Action", + "resource-policies.form.eperson-group-list.table.headers.action": "Azione", + + // "resource-policies.form.eperson-group-list.table.headers.id": "ID", + "resource-policies.form.eperson-group-list.table.headers.id": "ID", + + // "resource-policies.form.eperson-group-list.table.headers.name": "Name", + "resource-policies.form.eperson-group-list.table.headers.name": "Nome", + + // "resource-policies.form.eperson-group-list.modal.header": "Cannot change type", + // TODO New key - Add a translation + "resource-policies.form.eperson-group-list.modal.header": "Cannot change type", + + // "resource-policies.form.eperson-group-list.modal.text1.toGroup": "It is not possible to replace an ePerson with a group.", + // TODO New key - Add a translation + "resource-policies.form.eperson-group-list.modal.text1.toGroup": "It is not possible to replace an ePerson with a group.", + + // "resource-policies.form.eperson-group-list.modal.text1.toEPerson": "It is not possible to replace a group with an ePerson.", + // TODO New key - Add a translation + "resource-policies.form.eperson-group-list.modal.text1.toEPerson": "It is not possible to replace a group with an ePerson.", + + // "resource-policies.form.eperson-group-list.modal.text2": "Delete the current resource policy and create a new one with the desired type.", + // TODO New key - Add a translation + "resource-policies.form.eperson-group-list.modal.text2": "Delete the current resource policy and create a new one with the desired type.", + + // "resource-policies.form.eperson-group-list.modal.close": "Ok", + "resource-policies.form.eperson-group-list.modal.close": "Ok", + + // "resource-policies.form.date.end.label": "End Date", + "resource-policies.form.date.end.label": "Data di fine", + + // "resource-policies.form.date.start.label": "Start Date", + "resource-policies.form.date.start.label": "Data di inizio", + + // "resource-policies.form.description.label": "Description", + "resource-policies.form.description.label": "Descrizione", + + // "resource-policies.form.name.label": "Name", + "resource-policies.form.name.label": "Nome", + + // "resource-policies.form.policy-type.label": "Select the policy type", + "resource-policies.form.policy-type.label": "Selezionare il tipo di criterio", + + // "resource-policies.form.policy-type.required": "You must select the resource policy type.", + "resource-policies.form.policy-type.required": "È necessario selezionare il tipo di criterio risorsa.", + + // "resource-policies.table.headers.action": "Action", + "resource-policies.table.headers.action": "Azione", + + // "resource-policies.table.headers.date.end": "End Date", + "resource-policies.table.headers.date.end": "Data di fine", + + // "resource-policies.table.headers.date.start": "Start Date", + "resource-policies.table.headers.date.start": "Data di inizio", + + // "resource-policies.table.headers.edit": "Edit", + "resource-policies.table.headers.edit": "Modifica", + + // "resource-policies.table.headers.edit.group": "Edit group", + "resource-policies.table.headers.edit.group": "Modifica gruppo", + + // "resource-policies.table.headers.edit.policy": "Edit policy", + "resource-policies.table.headers.edit.policy": "Modifica criterio", + + // "resource-policies.table.headers.eperson": "EPerson", + "resource-policies.table.headers.eperson": "EPerson", + + // "resource-policies.table.headers.group": "Group", + "resource-policies.table.headers.group": "Gruppo", + + // "resource-policies.table.headers.id": "ID", + "resource-policies.table.headers.id": "ID", + + // "resource-policies.table.headers.name": "Name", + "resource-policies.table.headers.name": "Nome", + + // "resource-policies.table.headers.policyType": "type", + "resource-policies.table.headers.policyType": "tipo", + + // "resource-policies.table.headers.title.for.bitstream": "Policies for Bitstream", + "resource-policies.table.headers.title.for.bitstream": "Criteri per Bitstream", + + // "resource-policies.table.headers.title.for.bundle": "Policies for Bundle", + "resource-policies.table.headers.title.for.bundle": "Criteri per Bundle", + + // "resource-policies.table.headers.title.for.item": "Policies for Item", + "resource-policies.table.headers.title.for.item": "Criteri per l'item", + + // "resource-policies.table.headers.title.for.community": "Policies for Community", + "resource-policies.table.headers.title.for.community": "Politiche per la community", + + // "resource-policies.table.headers.title.for.collection": "Policies for Collection", + "resource-policies.table.headers.title.for.collection": "Criteri per la collezione", + + + + // "search.description": "", + "search.description": "", + + // "search.switch-configuration.title": "Show", + "search.switch-configuration.title": "Mostra", + + // "search.title": "Search", + "search.title": "Cerca", + + // "search.breadcrumbs": "Search", + "search.breadcrumbs": "Cerca", + + // "search.search-form.placeholder": "Search the repository ...", + "search.search-form.placeholder": "Cerca nel repository ...", + + + // "search.filters.applied.f.author": "Author", + "search.filters.applied.f.author": "Autore", + + // "search.filters.applied.f.dateIssued.max": "End date", + "search.filters.applied.f.dateIssued.max": "Data di fine", + + // "search.filters.applied.f.dateIssued.min": "Start date", + "search.filters.applied.f.dateIssued.min": "Data di inizio", + + // "search.filters.applied.f.dateSubmitted": "Date submitted", + "search.filters.applied.f.dateSubmitted": "Data di invio", + + // "search.filters.applied.f.discoverable": "Non-discoverable", + // TODO Source message changed - Revise the translation + "search.filters.applied.f.discoverable": "Privato", + + // "search.filters.applied.f.entityType": "Item Type", + "search.filters.applied.f.entityType": "Tipo di item", + + // "search.filters.applied.f.has_content_in_original_bundle": "Has files", + "search.filters.applied.f.has_content_in_original_bundle": "Ha file", + + // "search.filters.applied.f.itemtype": "Type", + "search.filters.applied.f.itemtype": "Tipo", + + // "search.filters.applied.f.namedresourcetype": "Status", + "search.filters.applied.f.namedresourcetype": "Stato", + + // "search.filters.applied.f.subject": "Subject", + "search.filters.applied.f.subject": "Oggetto", + + // "search.filters.applied.f.submitter": "Submitter", + "search.filters.applied.f.submitter": "Mittente", + + // "search.filters.applied.f.jobTitle": "Job Title", + "search.filters.applied.f.jobTitle": "Titolo di lavoro", + + // "search.filters.applied.f.birthDate.max": "End birth date", + "search.filters.applied.f.birthDate.max": "Data di fine nascita", + + // "search.filters.applied.f.birthDate.min": "Start birth date", + "search.filters.applied.f.birthDate.min": "Data di nascita iniziale", + + // "search.filters.applied.f.withdrawn": "Withdrawn", + "search.filters.applied.f.withdrawn": "Ritirato", + + + + // "search.filters.filter.author.head": "Author", + "search.filters.filter.author.head": "Autore", + + // "search.filters.filter.author.placeholder": "Author name", + "search.filters.filter.author.placeholder": "Nome autore", + + // "search.filters.filter.author.label": "Search author name", + "search.filters.filter.author.label": "Cerca nome autore", + + // "search.filters.filter.birthDate.head": "Birth Date", + "search.filters.filter.birthDate.head": "Data di nascita", + + // "search.filters.filter.birthDate.placeholder": "Birth Date", + "search.filters.filter.birthDate.placeholder": "Data di nascita", + + // "search.filters.filter.birthDate.label": "Search birth date", + "search.filters.filter.birthDate.label": "Cerca data di nascita", + + // "search.filters.filter.collapse": "Collapse filter", + "search.filters.filter.collapse": "Comprimi filtro", + + // "search.filters.filter.creativeDatePublished.head": "Date Published", + "search.filters.filter.creativeDatePublished.head": "Data di pubblicazione", + + // "search.filters.filter.creativeDatePublished.placeholder": "Date Published", + "search.filters.filter.creativeDatePublished.placeholder": "Data di pubblicazione", + + // "search.filters.filter.creativeDatePublished.label": "Search date published", + "search.filters.filter.creativeDatePublished.label": "Data di ricerca pubblicata", + + // "search.filters.filter.creativeWorkEditor.head": "Editor", + "search.filters.filter.creativeWorkEditor.head": "Editor", + + // "search.filters.filter.creativeWorkEditor.placeholder": "Editor", + "search.filters.filter.creativeWorkEditor.placeholder": "Editor", + + // "search.filters.filter.creativeWorkEditor.label": "Search editor", + "search.filters.filter.creativeWorkEditor.label": "Editor di ricerca", + + // "search.filters.filter.creativeWorkKeywords.head": "Subject", + "search.filters.filter.creativeWorkKeywords.head": "Oggetto", + + // "search.filters.filter.creativeWorkKeywords.placeholder": "Subject", + "search.filters.filter.creativeWorkKeywords.placeholder": "Oggetto", + + // "search.filters.filter.creativeWorkKeywords.label": "Search subject", + "search.filters.filter.creativeWorkKeywords.label": "Oggetto della ricerca", + + // "search.filters.filter.creativeWorkPublisher.head": "Publisher", + "search.filters.filter.creativeWorkPublisher.head": "Editore", + + // "search.filters.filter.creativeWorkPublisher.placeholder": "Publisher", + "search.filters.filter.creativeWorkPublisher.placeholder": "Editore", + + // "search.filters.filter.creativeWorkPublisher.label": "Search publisher", + "search.filters.filter.creativeWorkPublisher.label": "Cerca editore", + + // "search.filters.filter.dateIssued.head": "Date", + "search.filters.filter.dateIssued.head": "Data", + + // "search.filters.filter.dateIssued.max.placeholder": "Maximum Date", + "search.filters.filter.dateIssued.max.placeholder": "Data massima", + + // "search.filters.filter.dateIssued.max.label": "End", + "search.filters.filter.dateIssued.max.label": "Fine", + + // "search.filters.filter.dateIssued.min.placeholder": "Minimum Date", + "search.filters.filter.dateIssued.min.placeholder": "Data minima", + + // "search.filters.filter.dateIssued.min.label": "Start", + "search.filters.filter.dateIssued.min.label": "Inizio", + + // "search.filters.filter.dateSubmitted.head": "Date submitted", + "search.filters.filter.dateSubmitted.head": "Data inviata", + + // "search.filters.filter.dateSubmitted.placeholder": "Date submitted", + "search.filters.filter.dateSubmitted.placeholder": "Data di invio", + + // "search.filters.filter.dateSubmitted.label": "Search date submitted", + "search.filters.filter.dateSubmitted.label": "Data di ricerca inviata", + + // "search.filters.filter.discoverable.head": "Non-discoverable", + // TODO Source message changed - Revise the translation + "search.filters.filter.discoverable.head": "Privato", + + // "search.filters.filter.withdrawn.head": "Withdrawn", + "search.filters.filter.withdrawn.head": "Ritirato", + + // "search.filters.filter.entityType.head": "Item Type", + "search.filters.filter.entityType.head": "Tipo di item", + + // "search.filters.filter.entityType.placeholder": "Item Type", + "search.filters.filter.entityType.placeholder": "Tipo di item", + + // "search.filters.filter.entityType.label": "Search item type", + "search.filters.filter.entityType.label": "Tipo di item di ricerca", + + // "search.filters.filter.expand": "Expand filter", + "search.filters.filter.expand": "Espandi filtro", + + // "search.filters.filter.has_content_in_original_bundle.head": "Has files", + "search.filters.filter.has_content_in_original_bundle.head": "Ha file", + + // "search.filters.filter.itemtype.head": "Type", + "search.filters.filter.itemtype.head": "Tipo", + + // "search.filters.filter.itemtype.placeholder": "Type", + "search.filters.filter.itemtype.placeholder": "Tipo", + + // "search.filters.filter.itemtype.label": "Search type", + "search.filters.filter.itemtype.label": "Tipo di ricerca", + + // "search.filters.filter.jobTitle.head": "Job Title", + "search.filters.filter.jobTitle.head": "Titolo di lavoro", + + // "search.filters.filter.jobTitle.placeholder": "Job Title", + "search.filters.filter.jobTitle.placeholder": "Titolo di lavoro", + + // "search.filters.filter.jobTitle.label": "Search job title", + "search.filters.filter.jobTitle.label": "Cerca titolo di lavoro", + + // "search.filters.filter.knowsLanguage.head": "Known language", + "search.filters.filter.knowsLanguage.head": "Lingua nota", + + // "search.filters.filter.knowsLanguage.placeholder": "Known language", + "search.filters.filter.knowsLanguage.placeholder": "Lingua nota", + + // "search.filters.filter.knowsLanguage.label": "Search known language", + "search.filters.filter.knowsLanguage.label": "Cerca nella lingua nota", + + // "search.filters.filter.namedresourcetype.head": "Status", + "search.filters.filter.namedresourcetype.head": "Status", + + // "search.filters.filter.namedresourcetype.placeholder": "Status", + "search.filters.filter.namedresourcetype.placeholder": "Status", + + // "search.filters.filter.namedresourcetype.label": "Search status", + "search.filters.filter.namedresourcetype.label": "Status Ricerca", + + // "search.filters.filter.objectpeople.head": "People", + "search.filters.filter.objectpeople.head": "Ricercatori", + + // "search.filters.filter.objectpeople.placeholder": "People", + "search.filters.filter.objectpeople.placeholder": "Ricercatori", + + // "search.filters.filter.objectpeople.label": "Search people", + "search.filters.filter.objectpeople.label": "Cerca Ricercatori", + + // "search.filters.filter.organizationAddressCountry.head": "Country", + "search.filters.filter.organizationAddressCountry.head": "Paese", + + // "search.filters.filter.organizationAddressCountry.placeholder": "Country", + "search.filters.filter.organizationAddressCountry.placeholder": "Paese", + + // "search.filters.filter.organizationAddressCountry.label": "Search country", + "search.filters.filter.organizationAddressCountry.label": "Cerca paese", + + // "search.filters.filter.organizationAddressLocality.head": "City", + "search.filters.filter.organizationAddressLocality.head": "Città", + + // "search.filters.filter.organizationAddressLocality.placeholder": "City", + "search.filters.filter.organizationAddressLocality.placeholder": "Città", + + // "search.filters.filter.organizationAddressLocality.label": "Search city", + "search.filters.filter.organizationAddressLocality.label": "Cerca città", + + // "search.filters.filter.organizationFoundingDate.head": "Date Founded", + "search.filters.filter.organizationFoundingDate.head": "Data di fondazione", + + // "search.filters.filter.organizationFoundingDate.placeholder": "Date Founded", + "search.filters.filter.organizationFoundingDate.placeholder": "Data di fondazione", + + // "search.filters.filter.organizationFoundingDate.label": "Search date founded", + "search.filters.filter.organizationFoundingDate.label": "Data di ricerca fondata", + + // "search.filters.filter.scope.head": "Scope", + "search.filters.filter.scope.head": "Ambito", + + // "search.filters.filter.scope.placeholder": "Scope filter", + "search.filters.filter.scope.placeholder": "Filtro ambito", + + // "search.filters.filter.scope.label": "Search scope filter", + "search.filters.filter.scope.label": "Filtro ambito di ricerca", + + // "search.filters.filter.show-less": "Collapse", + "search.filters.filter.show-less": "Comprimi", + + // "search.filters.filter.show-more": "Show more", + "search.filters.filter.show-more": "Mostra altro", + + // "search.filters.filter.subject.head": "Subject", + "search.filters.filter.subject.head": "Oggetto", + + // "search.filters.filter.subject.placeholder": "Subject", + "search.filters.filter.subject.placeholder": "Oggetto", + + // "search.filters.filter.subject.label": "Search subject", + "search.filters.filter.subject.label": "Oggetto della ricerca", + + // "search.filters.filter.submitter.head": "Submitter", + "search.filters.filter.submitter.head": "Mittente", + + // "search.filters.filter.submitter.placeholder": "Submitter", + "search.filters.filter.submitter.placeholder": "Mittente", + + // "search.filters.filter.submitter.label": "Search submitter", + "search.filters.filter.submitter.label": "Mittente della ricerca", + + + + // "search.filters.entityType.JournalIssue": "Journal Issue", + "search.filters.entityType.JournalIssue": "Fascicolo Periodico", + + // "search.filters.entityType.JournalVolume": "Journal Volume", + "search.filters.entityType.JournalVolume": "Volume del Periodico", + + // "search.filters.entityType.OrgUnit": "Organizational Unit", + "search.filters.entityType.OrgUnit": "Struttura", + + // "search.filters.has_content_in_original_bundle.true": "Yes", + "search.filters.has_content_in_original_bundle.true": "Si", + + // "search.filters.has_content_in_original_bundle.false": "No", + "search.filters.has_content_in_original_bundle.false": "No", + + // "search.filters.discoverable.true": "No", + "search.filters.discoverable.true": "No", + + // "search.filters.discoverable.false": "Yes", + "search.filters.discoverable.false": "Si", + + // "search.filters.withdrawn.true": "Yes", + "search.filters.withdrawn.true": "Si", + + // "search.filters.withdrawn.false": "No", + "search.filters.withdrawn.false": "No", + + + // "search.filters.head": "Filters", + "search.filters.head": "Filtri", + + // "search.filters.reset": "Reset filters", + "search.filters.reset": "Ripristina filtri", + + // "search.filters.search.submit": "Submit", + "search.filters.search.submit": "Invia", + + + + // "search.form.search": "Search", + "search.form.search": "Cerca", + + // "search.form.search_dspace": "All repository", + "search.form.search_dspace": "Tutto il portale", + + // "search.form.scope.all": "All of DSpace", + "search.form.scope.all": "Tutto DSpace", + + + + // "search.results.head": "Search Results", + "search.results.head": "Risultati della ricerca", + + // "search.results.no-results": "Your search returned no results. Having trouble finding what you're looking for? Try putting", + "search.results.no-results": "La ricerca non ha prodotto alcun risultato. Hai problemi a trovare quello che cerchi? Prova a inserire", + + // "search.results.no-results-link": "quotes around it", + "search.results.no-results-link": "le virgolette", + + // "search.results.empty": "Your search returned no results.", + "search.results.empty": "La tua ricerca non ha prodotto risultati.", + + // "search.results.view-result": "View", + // TODO New key - Add a translation + "search.results.view-result": "View", + + // "search.results.response.500": "An error occurred during query execution, please try again later", + // TODO New key - Add a translation + "search.results.response.500": "An error occurred during query execution, please try again later", + + // "default.search.results.head": "Search Results", + "default.search.results.head": "Risultati della ricerca", + + // "default-relationships.search.results.head": "Search Results", + // TODO New key - Add a translation + "default-relationships.search.results.head": "Search Results", + + + // "search.sidebar.close": "Back to results", + "search.sidebar.close": "Ritorna ai risultati", + + // "search.sidebar.filters.title": "Filters", + "search.sidebar.filters.title": "Filtri", + + // "search.sidebar.open": "Search Tools", + "search.sidebar.open": "Strumenti per la ricerca", + + // "search.sidebar.results": "results", + "search.sidebar.results": "risultati", + + // "search.sidebar.settings.rpp": "Results per page", + "search.sidebar.settings.rpp": "Risultati per pagina", + + // "search.sidebar.settings.sort-by": "Sort By", + "search.sidebar.settings.sort-by": "Ordina per", + + // "search.sidebar.settings.title": "Settings", + "search.sidebar.settings.title": "Impostazioni", + + + + // "search.view-switch.show-detail": "Show detail", + "search.view-switch.show-detail": "Mostra dettagli", + + // "search.view-switch.show-grid": "Show as grid", + "search.view-switch.show-grid": "Visualizzazioni a griglia", + + // "search.view-switch.show-list": "Show as list", + "search.view-switch.show-list": "Visualizzazione a lista", + + + + // "sorting.ASC": "Ascending", + "sorting.ASC": "Ascendente", + + // "sorting.DESC": "Descending", + "sorting.DESC": "Discendente", + + // "sorting.dc.title.ASC": "Title Ascending", + "sorting.dc.title.ASC": "Titolo ascendente", + + // "sorting.dc.title.DESC": "Title Descending", + "sorting.dc.title.DESC": "Titolo decrescente", + + // "sorting.score.ASC": "Least Relevant", + "sorting.score.ASC": "Minor rilevanza", + + // "sorting.score.DESC": "Most Relevant", + "sorting.score.DESC": "Maggior rilevanza", + + // "sorting.dc.date.issued.ASC": "Date Issued Ascending", + "sorting.dc.date.issued.ASC": "Data di pubblicazione Ascendente", + + // "sorting.dc.date.issued.DESC": "Date Issued Descending", + "sorting.dc.date.issued.DESC": "Data di pubblicazione Discendente", + + // "sorting.dc.date.accessioned.ASC": "Accessioned Date Ascending", + "sorting.dc.date.accessioned.ASC": "Data di accesso Ascendente", + + // "sorting.dc.date.accessioned.DESC": "Accessioned Date Descending", + "sorting.dc.date.accessioned.DESC": "Data di accesso Discendente", + + // "sorting.lastModified.ASC": "Last modified Ascending", + "sorting.lastModified.ASC": "Ultima modifica Ascendente", + + // "sorting.lastModified.DESC": "Last modified Descending", + "sorting.lastModified.DESC": "Ultima modifica Discendente", + + + // "statistics.title": "Statistics", + "statistics.title": "Statistiche", + + // "statistics.header": "Statistics for {{ scope }}", + "statistics.header": "Statistiche per {{ scope }}", + + // "statistics.breadcrumbs": "Statistics", + "statistics.breadcrumbs": "Statistiche", + + // "statistics.page.no-data": "No data available", + "statistics.page.no-data": "Nessun dato disponibile", + + // "statistics.table.no-data": "No data available", + "statistics.table.no-data": "Nessun dato disponibile", + + // "statistics.table.title.TotalVisits": "Total visits", + // TODO New key - Add a translation + "statistics.table.title.TotalVisits": "Total visits", + + // "statistics.table.title.TotalVisitsPerMonth": "Total visits per month", + // TODO New key - Add a translation + "statistics.table.title.TotalVisitsPerMonth": "Total visits per month", + + // "statistics.table.title.TotalDownloads": "File Visits", + // TODO New key - Add a translation + "statistics.table.title.TotalDownloads": "File Visits", + + // "statistics.table.title.TopCountries": "Top country views", + // TODO New key - Add a translation + "statistics.table.title.TopCountries": "Top country views", + + // "statistics.table.title.TopCities": "Top city views", + // TODO New key - Add a translation + "statistics.table.title.TopCities": "Top city views", + + // "statistics.table.header.views": "Views", + // TODO New key - Add a translation + "statistics.table.header.views": "Views", + + + + // "submission.edit.breadcrumbs": "Edit Submission", + "submission.edit.breadcrumbs": "Modifica immissione", + + // "submission.edit.title": "Edit Submission", + "submission.edit.title": "Modifica immissione", + + // "submission.general.cancel": "Cancel", + "submission.general.cancel": "Annulla", + + // "submission.general.cannot_submit": "You have not the privilege to make a new submission.", + "submission.general.cannot_submit": "Non hai i privilegi per fare una nuova immissione.", + + // "submission.general.deposit": "Deposit", + "submission.general.deposit": "Deposito", + + // "submission.general.discard.confirm.cancel": "Cancel", + "submission.general.discard.confirm.cancel": "Annulla", + + // "submission.general.discard.confirm.info": "This operation can't be undone. Are you sure?", + "submission.general.discard.confirm.info": "Questa operazione non può essere annullata. Sei sicuro?", + + // "submission.general.discard.confirm.submit": "Yes, I'm sure", + "submission.general.discard.confirm.submit": "Sì, sono sicuro", + + // "submission.general.discard.confirm.title": "Discard submission", + "submission.general.discard.confirm.title": "Elimina l'invio", + + // "submission.general.discard.submit": "Discard", + "submission.general.discard.submit": "Scarta", + + // "submission.general.info.saved": "Saved", + "submission.general.info.saved": "Salvato", + + // "submission.general.info.pending-changes": "Unsaved changes", + "submission.general.info.pending-changes": "Modifiche non salvate", + + // "submission.general.save": "Save", + "submission.general.save": "Salva", + + // "submission.general.save-later": "Save for later", + "submission.general.save-later": "Salva per dopo", + + + // "submission.import-external.page.title": "Import metadata from an external source", + "submission.import-external.page.title": "Importare metadati da un'origine esterna", + + // "submission.import-external.title": "Import metadata from an external source", + "submission.import-external.title": "Importare metadati da un'origine esterna", + + // "submission.import-external.title.Journal": "Import a journal from an external source", + "submission.import-external.title.Journal": "Importare un journal da un'origine esterna", + + // "submission.import-external.title.JournalIssue": "Import a journal issue from an external source", + "submission.import-external.title.JournalIssue": "Importare un fascicolo di periodico da una fonte esterna", + + // "submission.import-external.title.JournalVolume": "Import a journal volume from an external source", + "submission.import-external.title.JournalVolume": "Importare un volume di periodico da un'origine esterna", + + // "submission.import-external.title.OrgUnit": "Import a publisher from an external source", + "submission.import-external.title.OrgUnit": "Importare un editore da una fonte esterna", + + // "submission.import-external.title.Person": "Import a person from an external source", + "submission.import-external.title.Person": "Importare una persona da una fonte esterna", + + // "submission.import-external.title.Project": "Import a project from an external source", + "submission.import-external.title.Project": "Importare un progetto da una fonte esterna", + + // "submission.import-external.title.Publication": "Import a publication from an external source", + "submission.import-external.title.Publication": "Importare una pubblicazione da una fonte esterna", + + // "submission.import-external.title.none": "Import metadata from an external source", + "submission.import-external.title.none": "Importare metadati da un'origine esterna", + + // "submission.import-external.page.hint": "Enter a query above to find items from the web to import in to DSpace.", + "submission.import-external.page.hint": "Immettere una query sopra per trovare item dal Web da importare in DSpace.", + + // "submission.import-external.back-to-my-dspace": "Back to MyDSpace", + "submission.import-external.back-to-my-dspace": "Torna a MyDSpace", + + // "submission.import-external.search.placeholder": "Search the external source", + "submission.import-external.search.placeholder": "Cerca nell'origine esterna", + + // "submission.import-external.search.button": "Search", + "submission.import-external.search.button": "Cerca", + + // "submission.import-external.search.button.hint": "Write some words to search", + "submission.import-external.search.button.hint": "Scrivi alcune parole per cercare", + + // "submission.import-external.search.source.hint": "Pick an external source", + "submission.import-external.search.source.hint": "Scegli un'origine esterna", + + // "submission.import-external.source.arxiv": "arXiv", + "submission.import-external.source.arxiv": "arXiv", + + // "submission.import-external.source.ads": "NASA/ADS", + "submission.import-external.source.ads": "NASA/ADS", + + // "submission.import-external.source.cinii": "CiNii", + "submission.import-external.source.cinii": "CiNii", + + // "submission.import-external.source.crossref": "CrossRef", + "submission.import-external.source.crossref": "CrossRef", + + // "submission.import-external.source.scielo": "SciELO", + "submission.import-external.source.scielo": "SciELO", + + // "submission.import-external.source.scopus": "Scopus", + "submission.import-external.source.scopus": "Scopus", + + // "submission.import-external.source.vufind": "VuFind", + "submission.import-external.source.vufind": "VuFind", + + // "submission.import-external.source.wos": "Web Of Science", + "submission.import-external.source.wos": "Web Of Science", + + // "submission.import-external.source.orcidWorks": "ORCID", + "submission.import-external.source.orcidWorks": "ORCID", + + // "submission.import-external.source.epo": "European Patent Office (EPO)", + "submission.import-external.source.epo": "Ufficio europeo dei brevetti (UEB)", + + // "submission.import-external.source.loading": "Loading ...", + "submission.import-external.source.loading": "Caricamento ...", + + // "submission.import-external.source.sherpaJournal": "SHERPA Journals", + "submission.import-external.source.sherpaJournal": "SHERPA Journals", + + // "submission.import-external.source.sherpaJournalIssn": "SHERPA Journals by ISSN", + "submission.import-external.source.sherpaJournalIssn": "SHERPA Journals by ISSN", + + // "submission.import-external.source.sherpaPublisher": "SHERPA Publishers", + "submission.import-external.source.sherpaPublisher": "SHERPA Publishers", + + // "submission.import-external.source.openAIREFunding": "Funding OpenAIRE API", + "submission.import-external.source.openAIREFunding": "Finanziamento dell'API OpenAIRE", + + // "submission.import-external.source.orcid": "ORCID", + "submission.import-external.source.orcid": "ORCID", + + // "submission.import-external.source.pubmed": "Pubmed", + "submission.import-external.source.pubmed": "Pubmed", + + // "submission.import-external.source.pubmedeu": "Pubmed Europe", + "submission.import-external.source.pubmedeu": "Pubmed Europe", + + // "submission.import-external.source.lcname": "Library of Congress Names", + "submission.import-external.source.lcname": "Nomi della Biblioteca del Congresso", + + // "submission.import-external.preview.title": "Item Preview", + // TODO New key - Add a translation + "submission.import-external.preview.title": "Item Preview", + + // "submission.import-external.preview.title.Publication": "Publication Preview", + "submission.import-external.preview.title.Publication": "Anteprima pubblicazione", + + // "submission.import-external.preview.title.none": "Item Preview", + // TODO New key - Add a translation + "submission.import-external.preview.title.none": "Item Preview", + + // "submission.import-external.preview.title.Journal": "Journal Preview", + "submission.import-external.preview.title.Journal": "Anteprima journal", + + // "submission.import-external.preview.title.OrgUnit": "Organizational Unit Preview", + // TODO Source message changed - Revise the translation + "submission.import-external.preview.title.OrgUnit": "Anteprima editore", + + // "submission.import-external.preview.title.Person": "Person Preview", + "submission.import-external.preview.title.Person": "Anteprima persona", + + // "submission.import-external.preview.title.Project": "Project Preview", + "submission.import-external.preview.title.Project": "Anteprima progetto", + + // "submission.import-external.preview.subtitle": "The metadata below was imported from an external source. It will be pre-filled when you start the submission.", + "submission.import-external.preview.subtitle": "I metadati riportati di seguito sono stati importati da un'origine esterna. Sarà precompilato quando inizierà l'immissione.", + + // "submission.import-external.preview.button.import": "Start submission", + "submission.import-external.preview.button.import": "Avvia immissione", + + // "submission.import-external.preview.error.import.title": "Submission error", + "submission.import-external.preview.error.import.title": "Errore di immissione", + + // "submission.import-external.preview.error.import.body": "An error occurs during the external source entry import process.", + "submission.import-external.preview.error.import.body": "Si verifica un errore durante il processo di importazione della voce di origine esterna.", + + // "submission.sections.describe.relationship-lookup.close": "Close", + "submission.sections.describe.relationship-lookup.close": "Chiudi", + + // "submission.sections.describe.relationship-lookup.external-source.added": "Successfully added local entry to the selection", + "submission.sections.describe.relationship-lookup.external-source.added": "Aggiunta con successo della voce locale alla selezione", + + // "submission.sections.describe.relationship-lookup.external-source.import-button-title.isAuthorOfPublication": "Import remote author", + "submission.sections.describe.relationship-lookup.external-source.import-button-title.isAuthorOfPublication": "Importa autore remoto", + + // "submission.sections.describe.relationship-lookup.external-source.import-button-title.Journal": "Import remote journal", + "submission.sections.describe.relationship-lookup.external-source.import-button-title.Journal": "Importa Periodico remoto", + + // "submission.sections.describe.relationship-lookup.external-source.import-button-title.Journal Issue": "Import remote journal issue", + "submission.sections.describe.relationship-lookup.external-source.import-button-title.Journal Issue": "Importare fascicolo periodico remoto", + + // "submission.sections.describe.relationship-lookup.external-source.import-button-title.Journal Volume": "Import remote journal volume", + "submission.sections.describe.relationship-lookup.external-source.import-button-title.Journal Volume": "Importa volume periodico remoto", + + // "submission.sections.describe.relationship-lookup.external-source.import-button-title.isProjectOfPublication": "Project", + "submission.sections.describe.relationship-lookup.external-source.import-button-title.isProjectOfPublication": "Progetto", + + // "submission.sections.describe.relationship-lookup.external-source.import-button-title.none": "Import remote item", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.external-source.import-button-title.none": "Import remote item", + + // "submission.sections.describe.relationship-lookup.external-source.import-button-title.Event": "Import remote event", + "submission.sections.describe.relationship-lookup.external-source.import-button-title.Event": "Importa evento remoto", + + // "submission.sections.describe.relationship-lookup.external-source.import-button-title.Product": "Import remote product", + "submission.sections.describe.relationship-lookup.external-source.import-button-title.Product": "Importa prodotto remoto", + + // "submission.sections.describe.relationship-lookup.external-source.import-button-title.Equipment": "Import remote equipment", + "submission.sections.describe.relationship-lookup.external-source.import-button-title.Equipment": "Importare apparecchiature remote", + + // "submission.sections.describe.relationship-lookup.external-source.import-button-title.OrgUnit": "Import remote organizational unit", + // TODO Source message changed - Revise the translation + "submission.sections.describe.relationship-lookup.external-source.import-button-title.OrgUnit": "Importa editore remoto", + + // "submission.sections.describe.relationship-lookup.external-source.import-button-title.Funding": "Import remote fund", + "submission.sections.describe.relationship-lookup.external-source.import-button-title.Funding": "Importa fondo remoto", + + // "submission.sections.describe.relationship-lookup.external-source.import-button-title.Person": "Import remote person", + "submission.sections.describe.relationship-lookup.external-source.import-button-title.Person": "Importa persona remota", + + // "submission.sections.describe.relationship-lookup.external-source.import-button-title.Patent": "Import remote patent", + "submission.sections.describe.relationship-lookup.external-source.import-button-title.Patent": "Importa brevetto remoto", + + // "submission.sections.describe.relationship-lookup.external-source.import-button-title.Project": "Import remote project", + "submission.sections.describe.relationship-lookup.external-source.import-button-title.Project": "Importa progetto remoto", + + // "submission.sections.describe.relationship-lookup.external-source.import-button-title.Publication": "Import remote publication", + "submission.sections.describe.relationship-lookup.external-source.import-button-title.Publication": "Importa pubblicazione remota", + + // "submission.sections.describe.relationship-lookup.external-source.import-modal.isProjectOfPublication.added.new-entity": "New Entity Added!", + "submission.sections.describe.relationship-lookup.external-source.import-modal.isProjectOfPublication.added.new-entity": "Nuova entità aggiunta!", + + // "submission.sections.describe.relationship-lookup.external-source.import-modal.isProjectOfPublication.title": "Project", + "submission.sections.describe.relationship-lookup.external-source.import-modal.isProjectOfPublication.title": "Progetto", + + // "submission.sections.describe.relationship-lookup.external-source.import-modal.head.openAIREFunding": "Funding OpenAIRE API", + "submission.sections.describe.relationship-lookup.external-source.import-modal.head.openAIREFunding": "Finanziamento dell'API OpenAIRE", + + // "submission.sections.describe.relationship-lookup.external-source.import-modal.isAuthorOfPublication.title": "Import Remote Author", + "submission.sections.describe.relationship-lookup.external-source.import-modal.isAuthorOfPublication.title": "Importa autore remoto", + + // "submission.sections.describe.relationship-lookup.external-source.import-modal.isAuthorOfPublication.added.local-entity": "Successfully added local author to the selection", + "submission.sections.describe.relationship-lookup.external-source.import-modal.isAuthorOfPublication.added.local-entity": "Aggiunto con successo autore locale alla selezione", + + // "submission.sections.describe.relationship-lookup.external-source.import-modal.isAuthorOfPublication.added.new-entity": "Successfully imported and added external author to the selection", + "submission.sections.describe.relationship-lookup.external-source.import-modal.isAuthorOfPublication.added.new-entity": "Importato e aggiunto con successo autore esterno alla selezione", + + // "submission.sections.describe.relationship-lookup.external-source.import-modal.authority": "Authority", + "submission.sections.describe.relationship-lookup.external-source.import-modal.authority": "Autorità", + + // "submission.sections.describe.relationship-lookup.external-source.import-modal.authority.new": "Import as a new local authority entry", + "submission.sections.describe.relationship-lookup.external-source.import-modal.authority.new": "Importa come nuova voce dell'autorità locale", + + // "submission.sections.describe.relationship-lookup.external-source.import-modal.cancel": "Cancel", + "submission.sections.describe.relationship-lookup.external-source.import-modal.cancel": "Annulla", + + // "submission.sections.describe.relationship-lookup.external-source.import-modal.collection": "Select a collection to import new entries to", + "submission.sections.describe.relationship-lookup.external-source.import-modal.collection": "Selezionare una collezione in cui importare nuove voci", + + // "submission.sections.describe.relationship-lookup.external-source.import-modal.entities": "Entities", + "submission.sections.describe.relationship-lookup.external-source.import-modal.entities": "Entità", + + // "submission.sections.describe.relationship-lookup.external-source.import-modal.entities.new": "Import as a new local entity", + "submission.sections.describe.relationship-lookup.external-source.import-modal.entities.new": "Importa come nuova entità locale", + + // "submission.sections.describe.relationship-lookup.external-source.import-modal.head.lcname": "Importing from LC Name", + "submission.sections.describe.relationship-lookup.external-source.import-modal.head.lcname": "Importazione da LC Name", + + // "submission.sections.describe.relationship-lookup.external-source.import-modal.head.orcid": "Importing from ORCID", + "submission.sections.describe.relationship-lookup.external-source.import-modal.head.orcid": "Importazione da ORCID", + + // "submission.sections.describe.relationship-lookup.external-source.import-modal.head.sherpaJournal": "Importing from Sherpa Journal", + "submission.sections.describe.relationship-lookup.external-source.import-modal.head.sherpaJournal": "Importazione da Sherpa Journal", + + // "submission.sections.describe.relationship-lookup.external-source.import-modal.head.sherpaPublisher": "Importing from Sherpa Publisher", + "submission.sections.describe.relationship-lookup.external-source.import-modal.head.sherpaPublisher": "Importazione da Sherpa Publisher", + + // "submission.sections.describe.relationship-lookup.external-source.import-modal.head.pubmed": "Importing from PubMed", + "submission.sections.describe.relationship-lookup.external-source.import-modal.head.pubmed": "Importazione da PubMed", + + // "submission.sections.describe.relationship-lookup.external-source.import-modal.head.arxiv": "Importing from arXiv", + "submission.sections.describe.relationship-lookup.external-source.import-modal.head.arxiv": "Importazione da arXiv", + + // "submission.sections.describe.relationship-lookup.external-source.import-modal.import": "Import", + "submission.sections.describe.relationship-lookup.external-source.import-modal.import": "Importa", + + // "submission.sections.describe.relationship-lookup.external-source.import-modal.Journal.title": "Import Remote Journal", + "submission.sections.describe.relationship-lookup.external-source.import-modal.Journal.title": "Importa Periodico remoto", + + // "submission.sections.describe.relationship-lookup.external-source.import-modal.Journal.added.local-entity": "Successfully added local journal to the selection", + "submission.sections.describe.relationship-lookup.external-source.import-modal.Journal.added.local-entity": "Aggiunta con successo del journal locale alla selezione", + + // "submission.sections.describe.relationship-lookup.external-source.import-modal.Journal.added.new-entity": "Successfully imported and added external journal to the selection", + "submission.sections.describe.relationship-lookup.external-source.import-modal.Journal.added.new-entity": "Importato e aggiunto con successo journal esterno alla selezione", + + // "submission.sections.describe.relationship-lookup.external-source.import-modal.Journal Issue.title": "Import Remote Journal Issue", + "submission.sections.describe.relationship-lookup.external-source.import-modal.Journal Issue.title": "Importa Fascicolo Periodico remoto", + + // "submission.sections.describe.relationship-lookup.external-source.import-modal.Journal Issue.added.local-entity": "Successfully added local journal issue to the selection", + "submission.sections.describe.relationship-lookup.external-source.import-modal.Journal Issue.added.local-entity": "Aggiunto con successo il numero del periodico locale alla selezione", + + // "submission.sections.describe.relationship-lookup.external-source.import-modal.Journal Issue.added.new-entity": "Successfully imported and added external journal issue to the selection", + "submission.sections.describe.relationship-lookup.external-source.import-modal.Journal Issue.added.new-entity": "Importato e aggiunto con successo il numero del journal esterno alla selezione", + + // "submission.sections.describe.relationship-lookup.external-source.import-modal.Journal Volume.title": "Import Remote Journal Volume", + "submission.sections.describe.relationship-lookup.external-source.import-modal.Journal Volume.title": "Importa volume di giornale remoto", + + // "submission.sections.describe.relationship-lookup.external-source.import-modal.Journal Volume.added.local-entity": "Successfully added local journal volume to the selection", + "submission.sections.describe.relationship-lookup.external-source.import-modal.Journal Volume.added.local-entity": "Aggiunto con successo volume del journal locale alla selezione", + + // "submission.sections.describe.relationship-lookup.external-source.import-modal.Journal Volume.added.new-entity": "Successfully imported and added external journal volume to the selection", + "submission.sections.describe.relationship-lookup.external-source.import-modal.Journal Volume.added.new-entity": "Importato e aggiunto con successo volume di journal esterno alla selezione", + + // "submission.sections.describe.relationship-lookup.external-source.import-modal.select": "Select a local match:", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.external-source.import-modal.select": "Select a local match:", + + // "submission.sections.describe.relationship-lookup.search-tab.deselect-all": "Deselect all", + "submission.sections.describe.relationship-lookup.search-tab.deselect-all": "Deseleziona tutto", + + // "submission.sections.describe.relationship-lookup.search-tab.deselect-page": "Deselect page", + "submission.sections.describe.relationship-lookup.search-tab.deselect-page": "Deseleziona pagina", + + // "submission.sections.describe.relationship-lookup.search-tab.loading": "Loading...", + "submission.sections.describe.relationship-lookup.search-tab.loading": "Caricamento...", + + // "submission.sections.describe.relationship-lookup.search-tab.placeholder": "Search query", + "submission.sections.describe.relationship-lookup.search-tab.placeholder": "Query di ricerca", + + // "submission.sections.describe.relationship-lookup.search-tab.search": "Go", + "submission.sections.describe.relationship-lookup.search-tab.search": "Vai", + + // "submission.sections.describe.relationship-lookup.search-tab.search-form.placeholder": "Search...", + "submission.sections.describe.relationship-lookup.search-tab.search-form.placeholder": "Cerca...", + + // "submission.sections.describe.relationship-lookup.search-tab.select-all": "Select all", + "submission.sections.describe.relationship-lookup.search-tab.select-all": "Seleziona tutto", + + // "submission.sections.describe.relationship-lookup.search-tab.select-page": "Select page", + "submission.sections.describe.relationship-lookup.search-tab.select-page": "Seleziona pagina", + + // "submission.sections.describe.relationship-lookup.selected": "Selected {{ size }} items", + "submission.sections.describe.relationship-lookup.selected": "Selected {{ size }} items", + + // "submission.sections.describe.relationship-lookup.search-tab.tab-title.isAuthorOfPublication": "Local Authors ({{ count }})", + "submission.sections.describe.relationship-lookup.search-tab.tab-title.isAuthorOfPublication": "Autori locali ({{ count }})", + + // "submission.sections.describe.relationship-lookup.search-tab.tab-title.isJournalOfPublication": "Local Journals ({{ count }})", + "submission.sections.describe.relationship-lookup.search-tab.tab-title.isJournalOfPublication": "Local Journals ({{ count }})", + // "submission.sections.describe.relationship-lookup.search-tab.tab-title.Project": "Local Projects ({{ count }})", + "submission.sections.describe.relationship-lookup.search-tab.tab-title.Project": "Progetti locali ({{ count }})", + + // "submission.sections.describe.relationship-lookup.search-tab.tab-title.Publication": "Local Publications ({{ count }})", + "submission.sections.describe.relationship-lookup.search-tab.tab-title.Publication": "Local Publications ({{ count }})", + + // "submission.sections.describe.relationship-lookup.search-tab.tab-title.Person": "Local Authors ({{ count }})", + "submission.sections.describe.relationship-lookup.search-tab.tab-title.Person": "Autori locali ({{ count }})", + + // "submission.sections.describe.relationship-lookup.search-tab.tab-title.OrgUnit": "Local Organizational Units ({{ count }})", + "submission.sections.describe.relationship-lookup.search-tab.tab-title.OrgUnit": "Unità organizzative locali ({{ count }})", + + // "submission.sections.describe.relationship-lookup.search-tab.tab-title.DataPackage": "Local Data Packages ({{ count }})", + "submission.sections.describe.relationship-lookup.search-tab.tab-title.DataPackage": "Pacchetti di dati locali ({{ count }})", + + // "submission.sections.describe.relationship-lookup.search-tab.tab-title.DataFile": "Local Data Files ({{ count }})", + "submission.sections.describe.relationship-lookup.search-tab.tab-title.DataFile": "File di dati locali ({{ count }})", + + // "submission.sections.describe.relationship-lookup.search-tab.tab-title.Journal": "Local Journals ({{ count }})", + "submission.sections.describe.relationship-lookup.search-tab.tab-title.Journal": "Local Journals ({{ count }})", + + // "submission.sections.describe.relationship-lookup.search-tab.tab-title.isJournalIssueOfPublication": "Local Journal Issues ({{ count }})", + "submission.sections.describe.relationship-lookup.search-tab.tab-title.isJournalIssueOfPublication": "Local Journal Issues ({{ count }})", + // "submission.sections.describe.relationship-lookup.search-tab.tab-title.JournalIssue": "Local Journal Issues ({{ count }})", + "submission.sections.describe.relationship-lookup.search-tab.tab-title.JournalIssue": "Local Journal Issues ({{ count }})", + + // "submission.sections.describe.relationship-lookup.search-tab.tab-title.isJournalVolumeOfPublication": "Local Journal Volumes ({{ count }})", + "submission.sections.describe.relationship-lookup.search-tab.tab-title.isJournalVolumeOfPublication": "Local Journal Volumes ({{ count }})", + // "submission.sections.describe.relationship-lookup.search-tab.tab-title.JournalVolume": "Local Journal Volumes ({{ count }})", + "submission.sections.describe.relationship-lookup.search-tab.tab-title.JournalVolume": "Local Journal Volumes ({{ count }})", + + // "submission.sections.describe.relationship-lookup.search-tab.tab-title.sherpaJournal": "Sherpa Journals ({{ count }})", + "submission.sections.describe.relationship-lookup.search-tab.tab-title.sherpaJournal": "Sherpa Journals ({{ count }})", + + // "submission.sections.describe.relationship-lookup.search-tab.tab-title.sherpaPublisher": "Sherpa Publishers ({{ count }})", + "submission.sections.describe.relationship-lookup.search-tab.tab-title.sherpaPublisher": "Sherpa Publishers ({{ count }})", + + // "submission.sections.describe.relationship-lookup.search-tab.tab-title.orcid": "ORCID ({{ count }})", + "submission.sections.describe.relationship-lookup.search-tab.tab-title.orcid": "ORCID ({{ count }})", + + // "submission.sections.describe.relationship-lookup.search-tab.tab-title.lcname": "LC Names ({{ count }})", + "submission.sections.describe.relationship-lookup.search-tab.tab-title.lcname": "Nomi LC ({{ count }})", + + // "submission.sections.describe.relationship-lookup.search-tab.tab-title.pubmed": "PubMed ({{ count }})", + "submission.sections.describe.relationship-lookup.search-tab.tab-title.pubmed": "PubMed ({{ count }})", + + // "submission.sections.describe.relationship-lookup.search-tab.tab-title.arxiv": "arXiv ({{ count }})", + "submission.sections.describe.relationship-lookup.search-tab.tab-title.arxiv": "arXiv ({{ count }})", + + // "submission.sections.describe.relationship-lookup.search-tab.tab-title.isFundingAgencyOfPublication": "Search for Funding Agencies", + "submission.sections.describe.relationship-lookup.search-tab.tab-title.isFundingAgencyOfPublication": "Ricerca di agenzie di finanziamento", + + // "submission.sections.describe.relationship-lookup.search-tab.tab-title.isFundingOfPublication": "Search for Funding", + "submission.sections.describe.relationship-lookup.search-tab.tab-title.isFundingOfPublication": "Cerca finanziamenti", + + // "submission.sections.describe.relationship-lookup.search-tab.tab-title.isChildOrgUnitOf": "Search for Organizational Units", + "submission.sections.describe.relationship-lookup.search-tab.tab-title.isChildOrgUnitOf": "Ricerca di unità organizzative", + + // "submission.sections.describe.relationship-lookup.search-tab.tab-title.openAIREFunding": "Funding OpenAIRE API", + "submission.sections.describe.relationship-lookup.search-tab.tab-title.openAIREFunding": "Finanziamento dell'API OpenAIRE", + + // "submission.sections.describe.relationship-lookup.search-tab.tab-title.isProjectOfPublication": "Projects", + "submission.sections.describe.relationship-lookup.search-tab.tab-title.isProjectOfPublication": "Progetti", + + // "submission.sections.describe.relationship-lookup.search-tab.tab-title.isFundingAgencyOfProject": "Funder of the Project", + "submission.sections.describe.relationship-lookup.search-tab.tab-title.isFundingAgencyOfProject": "Finanziatore del progetto", + + // "submission.sections.describe.relationship-lookup.selection-tab.title.openAIREFunding": "Funding OpenAIRE API", + "submission.sections.describe.relationship-lookup.selection-tab.title.openAIREFunding": "Finanziamento dell'API OpenAIRE", + + // "submission.sections.describe.relationship-lookup.selection-tab.title.isProjectOfPublication": "Project", + "submission.sections.describe.relationship-lookup.selection-tab.title.isProjectOfPublication": "Progetti", + + // "submission.sections.describe.relationship-lookup.title.isProjectOfPublication": "Projects", + "submission.sections.describe.relationship-lookup.title.isProjectOfPublication": "Progetti", + + // "submission.sections.describe.relationship-lookup.title.isFundingAgencyOfProject": "Funder of the Project", + "submission.sections.describe.relationship-lookup.title.isFundingAgencyOfProject": "Finanziatore del Progetto", + + + + + // "submission.sections.describe.relationship-lookup.selection-tab.search-form.placeholder": "Search...", + "submission.sections.describe.relationship-lookup.selection-tab.search-form.placeholder": "Cerca...", + + // "submission.sections.describe.relationship-lookup.selection-tab.tab-title": "Current Selection ({{ count }})", + "submission.sections.describe.relationship-lookup.selection-tab.tab-title": "Selezione corrente ({{ count }})", + + // "submission.sections.describe.relationship-lookup.title.isJournalIssueOfPublication": "Journal Issues", + "submission.sections.describe.relationship-lookup.title.isJournalIssueOfPublication": "Fascicolo Periodico", + // "submission.sections.describe.relationship-lookup.title.JournalIssue": "Journal Issues", + "submission.sections.describe.relationship-lookup.title.JournalIssue": "Fascicolo Periodico", + + // "submission.sections.describe.relationship-lookup.title.isJournalVolumeOfPublication": "Journal Volumes", + "submission.sections.describe.relationship-lookup.title.isJournalVolumeOfPublication": "Volume Periodico", + // "submission.sections.describe.relationship-lookup.title.JournalVolume": "Journal Volumes", + "submission.sections.describe.relationship-lookup.title.JournalVolume": "Volume Periodico", + + // "submission.sections.describe.relationship-lookup.title.isJournalOfPublication": "Journals", + "submission.sections.describe.relationship-lookup.title.isJournalOfPublication": "Periodico", + + // "submission.sections.describe.relationship-lookup.title.isAuthorOfPublication": "Authors", + "submission.sections.describe.relationship-lookup.title.isAuthorOfPublication": "Autori", + + // "submission.sections.describe.relationship-lookup.title.isFundingAgencyOfPublication": "Funding Agency", + "submission.sections.describe.relationship-lookup.title.isFundingAgencyOfPublication": "Agenzia di finanziamento", + // "submission.sections.describe.relationship-lookup.title.Project": "Projects", + "submission.sections.describe.relationship-lookup.title.Project": "Progetti", + + // "submission.sections.describe.relationship-lookup.title.Publication": "Publications", + "submission.sections.describe.relationship-lookup.title.Publication": "Pubblicazioni", + + // "submission.sections.describe.relationship-lookup.title.Person": "Authors", + "submission.sections.describe.relationship-lookup.title.Person": "Autori", + + // "submission.sections.describe.relationship-lookup.title.OrgUnit": "Organizational Units", + "submission.sections.describe.relationship-lookup.title.OrgUnit": "Unità organizzative", + + // "submission.sections.describe.relationship-lookup.title.DataPackage": "Data Packages", + "submission.sections.describe.relationship-lookup.title.DataPackage": "Pacchetti di dati", + + // "submission.sections.describe.relationship-lookup.title.DataFile": "Data Files", + "submission.sections.describe.relationship-lookup.title.DataFile": "File di dati", + + // "submission.sections.describe.relationship-lookup.title.Funding Agency": "Funding Agency", + "submission.sections.describe.relationship-lookup.title.Funding Agency": "Agenzia di finanziamento", + + // "submission.sections.describe.relationship-lookup.title.isFundingOfPublication": "Funding", + "submission.sections.describe.relationship-lookup.title.isFundingOfPublication": "Finanziatore", + + // "submission.sections.describe.relationship-lookup.title.isChildOrgUnitOf": "Parent Organizational Unit", + "submission.sections.describe.relationship-lookup.title.isChildOrgUnitOf": "Unità organizzativa padre", + + // "submission.sections.describe.relationship-lookup.search-tab.toggle-dropdown": "Toggle dropdown", + "submission.sections.describe.relationship-lookup.search-tab.toggle-dropdown": "Toggle dropdown", + + // "submission.sections.describe.relationship-lookup.selection-tab.settings": "Settings", + "submission.sections.describe.relationship-lookup.selection-tab.settings": "Impostazioni", + + // "submission.sections.describe.relationship-lookup.selection-tab.no-selection": "Your selection is currently empty.", + "submission.sections.describe.relationship-lookup.selection-tab.no-selection": "La selezione è attualmente vuota.", + + // "submission.sections.describe.relationship-lookup.selection-tab.title.isAuthorOfPublication": "Selected Authors", + "submission.sections.describe.relationship-lookup.selection-tab.title.isAuthorOfPublication": "Autori selezionati", + + // "submission.sections.describe.relationship-lookup.selection-tab.title.isJournalOfPublication": "Selected Journals", + "submission.sections.describe.relationship-lookup.selection-tab.title.isJournalOfPublication": "Riviste selezionate", + + // "submission.sections.describe.relationship-lookup.selection-tab.title.isJournalVolumeOfPublication": "Selected Journal Volume", + "submission.sections.describe.relationship-lookup.selection-tab.title.isJournalVolumeOfPublication": "Volume del Periodico selezionato", + // "submission.sections.describe.relationship-lookup.selection-tab.title.Project": "Selected Projects", + "submission.sections.describe.relationship-lookup.selection-tab.title.Project": "Progetti selezionati", + + // "submission.sections.describe.relationship-lookup.selection-tab.title.Publication": "Selected Publications", + "submission.sections.describe.relationship-lookup.selection-tab.title.Publication": "Pubblicazioni selezionate", + + // "submission.sections.describe.relationship-lookup.selection-tab.title.Person": "Selected Authors", + "submission.sections.describe.relationship-lookup.selection-tab.title.Person": "Autori selezionati", + + // "submission.sections.describe.relationship-lookup.selection-tab.title.OrgUnit": "Selected Organizational Units", + "submission.sections.describe.relationship-lookup.selection-tab.title.OrgUnit": "Unità organizzative selezionate", + + // "submission.sections.describe.relationship-lookup.selection-tab.title.DataPackage": "Selected Data Packages", + "submission.sections.describe.relationship-lookup.selection-tab.title.DataPackage": "Pacchetti di dati selezionati", + + // "submission.sections.describe.relationship-lookup.selection-tab.title.DataFile": "Selected Data Files", + "submission.sections.describe.relationship-lookup.selection-tab.title.DataFile": "File di dati selezionati", + + // "submission.sections.describe.relationship-lookup.selection-tab.title.Journal": "Selected Journals", + "submission.sections.describe.relationship-lookup.selection-tab.title.Journal": "Riviste selezionate", + + // "submission.sections.describe.relationship-lookup.selection-tab.title.isJournalIssueOfPublication": "Selected Issue", + "submission.sections.describe.relationship-lookup.selection-tab.title.isJournalIssueOfPublication": "Fascicolo selezionato", + // "submission.sections.describe.relationship-lookup.selection-tab.title.JournalVolume": "Selected Journal Volume", + "submission.sections.describe.relationship-lookup.selection-tab.title.JournalVolume": "Volume journal selezionato", + + // "submission.sections.describe.relationship-lookup.selection-tab.title.isFundingAgencyOfPublication": "Selected Funding Agency", + "submission.sections.describe.relationship-lookup.selection-tab.title.isFundingAgencyOfPublication": "Agenzia di finanziamento selezionata", + + // "submission.sections.describe.relationship-lookup.selection-tab.title.isFundingOfPublication": "Selected Funding", + "submission.sections.describe.relationship-lookup.selection-tab.title.isFundingOfPublication": "Finanziamento selezionato", + // "submission.sections.describe.relationship-lookup.selection-tab.title.JournalIssue": "Selected Issue", + "submission.sections.describe.relationship-lookup.selection-tab.title.JournalIssue": "Fascicolo selezionato", + + // "submission.sections.describe.relationship-lookup.selection-tab.title.isChildOrgUnitOf": "Selected Organizational Unit", + "submission.sections.describe.relationship-lookup.selection-tab.title.isChildOrgUnitOf": "Unità organizzativa selezionata", + + // "submission.sections.describe.relationship-lookup.selection-tab.title.sherpaJournal": "Search Results", + "submission.sections.describe.relationship-lookup.selection-tab.title.sherpaJournal": "Risultati della ricerca", + + // "submission.sections.describe.relationship-lookup.selection-tab.title.sherpaPublisher": "Search Results", + "submission.sections.describe.relationship-lookup.selection-tab.title.sherpaPublisher": "Risultati della ricerca", + + // "submission.sections.describe.relationship-lookup.selection-tab.title.orcid": "Search Results", + "submission.sections.describe.relationship-lookup.selection-tab.title.orcid": "Risultati della ricerca", + + // "submission.sections.describe.relationship-lookup.selection-tab.title.orcidv2": "Search Results", + "submission.sections.describe.relationship-lookup.selection-tab.title.orcidv2": "Risultati della ricerca", + + // "submission.sections.describe.relationship-lookup.selection-tab.title.lcname": "Search Results", + "submission.sections.describe.relationship-lookup.selection-tab.title.lcname": "Risultati della ricerca", + + // "submission.sections.describe.relationship-lookup.selection-tab.title.pubmed": "Search Results", + "submission.sections.describe.relationship-lookup.selection-tab.title.pubmed": "Risultati della ricerca", + + // "submission.sections.describe.relationship-lookup.selection-tab.title.arxiv": "Search Results", + "submission.sections.describe.relationship-lookup.selection-tab.title.arxiv": "Risultati della ricerca", + + // "submission.sections.describe.relationship-lookup.selection-tab.title.crossref": "Search Results", + "submission.sections.describe.relationship-lookup.selection-tab.title.crossref": "Risultati della ricerca", + + // "submission.sections.describe.relationship-lookup.selection-tab.title.epo": "Search Results", + "submission.sections.describe.relationship-lookup.selection-tab.title.epo": "Risultati della ricerca", + + // "submission.sections.describe.relationship-lookup.selection-tab.title.scopus": "Search Results", + "submission.sections.describe.relationship-lookup.selection-tab.title.scopus": "Risultati della ricerca", + + // "submission.sections.describe.relationship-lookup.selection-tab.title.scielo": "Search Results", + "submission.sections.describe.relationship-lookup.selection-tab.title.scielo": "Risultati della ricerca", + + // "submission.sections.describe.relationship-lookup.selection-tab.title.wos": "Search Results", + "submission.sections.describe.relationship-lookup.selection-tab.title.wos": "Risultati della ricerca", + + // "submission.sections.describe.relationship-lookup.selection-tab.title": "Search Results", + "submission.sections.describe.relationship-lookup.selection-tab.title": "Risultati della ricerca", + + // "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": "Desideri salvare \"{{ value }}\" come variante del nome per questa persona in modo che tu e altri possiate riutilizzarlo per immissioni future? Se non lo fai, puoi comunque usarlo per questa immissione.", + + // "submission.sections.describe.relationship-lookup.name-variant.notification.confirm": "Save a new name variant", + "submission.sections.describe.relationship-lookup.name-variant.notification.confirm": "Salva una nuova variante del nome", + + // "submission.sections.describe.relationship-lookup.name-variant.notification.decline": "Use only for this submission", + "submission.sections.describe.relationship-lookup.name-variant.notification.decline": "Utilizzare solo per questa immissione", + + // "submission.sections.ccLicense.type": "License Type", + "submission.sections.ccLicense.type": "Tipo di licenza", + + // "submission.sections.ccLicense.select": "Select a license type…", + "submission.sections.ccLicense.select": "Selezionare un tipo di licenza...", + + // "submission.sections.ccLicense.change": "Change your license type…", + "submission.sections.ccLicense.change": "Modificare il tipo di licenza...", + + // "submission.sections.ccLicense.none": "No licenses available", + "submission.sections.ccLicense.none": "Nessuna licenza disponibile", + + // "submission.sections.ccLicense.option.select": "Select an option…", + "submission.sections.ccLicense.option.select": "Seleziona un'opzione...", + + // "submission.sections.ccLicense.link": "You’ve selected the following license:", + // TODO New key - Add a translation + "submission.sections.ccLicense.link": "You’ve selected the following license:", + + // "submission.sections.ccLicense.confirmation": "I grant the license above", + "submission.sections.ccLicense.confirmation": "Concedo la licenza di cui sopra", + + // "submission.sections.general.add-more": "Add more", + "submission.sections.general.add-more": "Aggiungi altro", + + // "submission.sections.general.cannot_deposit": "Deposit cannot be completed due to errors in the form.
    Please fill out all required fields to complete the deposit.", + // TODO New key - Add a translation + "submission.sections.general.cannot_deposit": "Deposit cannot be completed due to errors in the form.
    Please fill out all required fields to complete the deposit.", + + // "submission.sections.general.collection": "Collection", + "submission.sections.general.collection": "collezione", + + // "submission.sections.general.deposit_error_notice": "There was an issue when submitting the item, please try again later.", + "submission.sections.general.deposit_error_notice": "Si è verificato un problema durante l'immissione dell'articolo, riprova più tardi.", + + // "submission.sections.general.deposit_success_notice": "Submission deposited successfully.", + "submission.sections.general.deposit_success_notice": "Immissione depositata con successo.", + + // "submission.sections.general.discard_error_notice": "There was an issue when discarding the item, please try again later.", + "submission.sections.general.discard_error_notice": "Si è verificato un problema durante l'eliminazione dell'item, riprova più tardi.", + + // "submission.sections.general.discard_success_notice": "Submission discarded successfully.", + "submission.sections.general.discard_success_notice": "Immissione scartata correttamente.", + + // "submission.sections.general.metadata-extracted": "New metadata have been extracted and added to the {{sectionId}} section.", + "submission.sections.general.metadata-extracted": "Nuovi metadati sono stati estratti e aggiunti alla sezione {{sectionId}}.", + + // "submission.sections.general.metadata-extracted-new-section": "New {{sectionId}} section has been added to submission.", + "submission.sections.general.metadata-extracted-new-section": "New {{sectionId}} sezione è stata aggiunta all'invio.", + + // "submission.sections.general.no-collection": "No collection found", + "submission.sections.general.no-collection": "Nessuna collezione trovata", + + // "submission.sections.general.no-sections": "No options available", + "submission.sections.general.no-sections": "Nessuna opzione disponibile", + + // "submission.sections.general.save_error_notice": "There was an issue when saving the item, please try again later.", + // TODO Source message changed - Revise the translation + "submission.sections.general.save_error_notice": "Si è verificato un errore imprevisto durante il salvataggio dell'item. Aggiorna la pagina e riprova. Dopo aver aggiornato le modifiche non salvate potrebbero andare perse.", + + // "submission.sections.general.save_success_notice": "Submission saved successfully.", + "submission.sections.general.save_success_notice": "Immissione salvata correttamente.", + + // "submission.sections.general.search-collection": "Search for a collection", + "submission.sections.general.search-collection": "Cerca una collezione", + + // "submission.sections.general.sections_not_valid": "There are incomplete sections.", + "submission.sections.general.sections_not_valid": "Ci sono sezioni incomplete.", + + + + // "submission.sections.submit.progressbar.accessCondition": "Item access conditions", + "submission.sections.submit.progressbar.accessCondition": "Condizioni di accesso all'item", + + // "submission.sections.submit.progressbar.CClicense": "Creative commons license", + "submission.sections.submit.progressbar.CClicense": "Licenza Creative commons", + + // "submission.sections.submit.progressbar.describe.recycle": "Recycle", + "submission.sections.submit.progressbar.describe.recycle": "Ricicla", + + // "submission.sections.submit.progressbar.describe.stepcustom": "Describe", + "submission.sections.submit.progressbar.describe.stepcustom": "Descrivi", + + // "submission.sections.submit.progressbar.describe.stepone": "Describe", + "submission.sections.submit.progressbar.describe.stepone": "Descrivi", + + // "submission.sections.submit.progressbar.describe.steptwo": "Describe", + "submission.sections.submit.progressbar.describe.steptwo": "Descrivi", + + // "submission.sections.submit.progressbar.detect-duplicate": "Potential duplicates", + "submission.sections.submit.progressbar.detect-duplicate": "Potenziali duplicati", + + // "submission.sections.submit.progressbar.license": "Deposit license", + "submission.sections.submit.progressbar.license": "Licenza di deposito", + + // "submission.sections.submit.progressbar.sherpapolicy": "Sherpa policies", + // TODO New key - Add a translation + "submission.sections.submit.progressbar.sherpapolicy": "Sherpa policies", + + // "submission.sections.submit.progressbar.upload": "Upload files", + "submission.sections.submit.progressbar.upload": "Carica file", + + // "submission.sections.submit.progressbar.sherpaPolicies": "Publisher open access policy information", + // TODO New key - Add a translation + "submission.sections.submit.progressbar.sherpaPolicies": "Publisher open access policy information", + + + // "submission.sections.sherpa-policy.title-empty": "No publisher policy information available. If your work has an associated ISSN, please enter it above to see any related publisher open access policies.", + // TODO New key - Add a translation + "submission.sections.sherpa-policy.title-empty": "No publisher policy information available. If your work has an associated ISSN, please enter it above to see any related publisher open access policies.", + + // "submission.sections.status.errors.title": "Errors", + "submission.sections.status.errors.title": "Errori", + + // "submission.sections.status.valid.title": "Valid", + "submission.sections.status.valid.title": "Valido", + + // "submission.sections.status.warnings.title": "Warnings", + "submission.sections.status.warnings.title": "Avvertenze", + + // "submission.sections.status.errors.aria": "has errors", + "submission.sections.status.errors.aria": "presenta errori", + + // "submission.sections.status.valid.aria": "is valid", + "submission.sections.status.valid.aria": "è valido", + + // "submission.sections.status.warnings.aria": "has warnings", + "submission.sections.status.warnings.aria": "ha avvisi", + + // "submission.sections.status.info.title": "Additional Information", + // TODO New key - Add a translation + "submission.sections.status.info.title": "Additional Information", + + // "submission.sections.status.info.aria": "Additional Information", + // TODO New key - Add a translation + "submission.sections.status.info.aria": "Additional Information", + + // "submission.sections.toggle.open": "Open section", + "submission.sections.toggle.open": "Apri sezione", + + // "submission.sections.toggle.close": "Close section", + "submission.sections.toggle.close": "Chiudi sezione", + + // "submission.sections.toggle.aria.open": "Expand {{sectionHeader}} section", + "submission.sections.toggle.aria.open": "Espandi la sezione {{sectionHeader}}", + + // "submission.sections.toggle.aria.close": "Collapse {{sectionHeader}} section", + "submission.sections.toggle.aria.close": "Comprimi la sezione {{sectionHeader}}", + + // "submission.sections.upload.delete.confirm.cancel": "Cancel", + "submission.sections.upload.delete.confirm.cancel": "Annulla", + + // "submission.sections.upload.delete.confirm.info": "This operation can't be undone. Are you sure?", + "submission.sections.upload.delete.confirm.info": "Questa operazione non può essere annullata. Sei sicuro?", + + // "submission.sections.upload.delete.confirm.submit": "Yes, I'm sure", + "submission.sections.upload.delete.confirm.submit": "Sì, ne sono sicuro", + + // "submission.sections.upload.delete.confirm.title": "Delete bitstream", + "submission.sections.upload.delete.confirm.title": "Elimina bitstream", + + // "submission.sections.upload.delete.submit": "Delete", + "submission.sections.upload.delete.submit": "Elimina", + + // "submission.sections.upload.download.title": "Download bitstream", + "submission.sections.upload.download.title": "Scarica bitstream", + + // "submission.sections.upload.drop-message": "Drop files to attach them to the item", + "submission.sections.upload.drop-message": "Rilascia i file per allegarli all'item", + + // "submission.sections.upload.edit.title": "Edit bitstream", + "submission.sections.upload.edit.title": "Modifica bitstream", + + // "submission.sections.upload.form.access-condition-label": "Access condition type", + "submission.sections.upload.form.access-condition-label": "Tipo di condizione di accesso", + + // "submission.sections.upload.form.access-condition-hint": "Select an access condition to apply on the bitstream once the item is deposited", + "submission.sections.upload.form.access-condition-hint": "Selezionare una condizione di accesso da applicare sul bitstream una volta depositato l'articolo", + + // "submission.sections.upload.form.date-required": "Date is required.", + "submission.sections.upload.form.date-required": "Data obbligatoria.", + + // "submission.sections.upload.form.date-required-from": "Grant access from date is required.", + "submission.sections.upload.form.date-required-from": "È richiesto concedere l'accesso dalla data.", + + // "submission.sections.upload.form.date-required-until": "Grant access until date is required.", + "submission.sections.upload.form.date-required-until": "Concedi l'accesso fino a quando la data è richiesta.", + + // "submission.sections.upload.form.from-label": "Grant access from", + "submission.sections.upload.form.from-label": "Concedere l'accesso da", + + // "submission.sections.upload.form.from-hint": "Select the date from which the related access condition is applied", + "submission.sections.upload.form.from-hint": "Selezionare la data a partire dalla quale viene applicata la relativa condizione di accesso", + + // "submission.sections.upload.form.from-placeholder": "From", + "submission.sections.upload.form.from-placeholder": "Da", + + // "submission.sections.upload.form.group-label": "Group", + "submission.sections.upload.form.group-label": "Gruppo", + + // "submission.sections.upload.form.group-required": "Group is required.", + "submission.sections.upload.form.group-required": "Il gruppo è obbligatorio.", + + // "submission.sections.upload.form.until-label": "Grant access until", + "submission.sections.upload.form.until-label": "Concedi l'accesso fino a", + + // "submission.sections.upload.form.until-hint": "Select the date until which the related access condition is applied", + "submission.sections.upload.form.until-hint": "Selezionare la data fino alla quale viene applicata la relativa condizione di accesso", + + // "submission.sections.upload.form.until-placeholder": "Until", + "submission.sections.upload.form.until-placeholder": "Fino a quando", + + // "submission.sections.upload.header.policy.default.nolist": "Uploaded files in the {{collectionName}} collection will be accessible according to the following group(s):", + // TODO New key - Add a translation + "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.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):", + // TODO New key - Add a translation + "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.info": "Here you will find all the files currently in the item. You can update the file metadata and access conditions or upload additional files just dragging & dropping them everywhere in the page", + "submission.sections.upload.info": "Qui troverai tutti i file attualmente presenti nell'articolo. È possibile aggiornare i metadati dei file e le condizioni di accesso o upload di file aggiuntivi semplicemente trascinandoli e rilasciandoli ovunque nella pagina", + + // "submission.sections.upload.no-entry": "No", + "submission.sections.upload.no-entry": "No", + + // "submission.sections.upload.no-file-uploaded": "No file uploaded yet.", + "submission.sections.upload.no-file-uploaded": "Nessun file ancora caricato.", + + // "submission.sections.upload.save-metadata": "Save metadata", + "submission.sections.upload.save-metadata": "Salva metadati", + + // "submission.sections.upload.undo": "Cancel", + "submission.sections.upload.undo": "Annulla", + + // "submission.sections.upload.upload-failed": "Upload failed", + "submission.sections.upload.upload-failed": "Caricamento non riuscito", + + // "submission.sections.upload.upload-successful": "Upload successful", + "submission.sections.upload.upload-successful": "Caricamento riuscito", + + // "submission.sections.accesses.form.discoverable-description": "When checked, this item will be discoverable in search/browse. When unchecked, the item will only be available via a direct link and will never appear in search/browse.", + "submission.sections.accesses.form.discoverable-description": "Una volta selezionato, questo item sarà individuabile nella ricerca/navigazione. Se deselezionato, l'item sarà disponibile solo tramite un collegamento diretto e non apparirà mai nella ricerca / navigazione.", + + // "submission.sections.accesses.form.discoverable-label": "Discoverable", + "submission.sections.accesses.form.discoverable-label": "Individuabile", + + // "submission.sections.accesses.form.access-condition-label": "Access condition type", + "submission.sections.accesses.form.access-condition-label": "Tipo di condizione di accesso", + + // "submission.sections.accesses.form.access-condition-hint": "Select an access condition to apply on the item once it is deposited", + "submission.sections.accesses.form.access-condition-hint": "Selezionare una condizione di accesso da applicare all'articolo una volta depositato", + + // "submission.sections.accesses.form.date-required": "Date is required.", + "submission.sections.accesses.form.date-required": "Data obbligatoria.", + + // "submission.sections.accesses.form.date-required-from": "Grant access from date is required.", + "submission.sections.accesses.form.date-required-from": "Concedere l'accesso dalla data è obbligatorio.", + + // "submission.sections.accesses.form.date-required-until": "Grant access until date is required.", + "submission.sections.accesses.form.date-required-until": "Concedi l'accesso fino a quando la data è richiesta.", + + // "submission.sections.accesses.form.from-label": "Grant access from", + "submission.sections.accesses.form.from-label": "Concedere l'accesso da", + + // "submission.sections.accesses.form.from-hint": "Select the date from which the related access condition is applied", + "submission.sections.accesses.form.from-hint": "Selezionare la data a partire dalla quale viene applicata la relativa condizione di accesso", + + // "submission.sections.accesses.form.from-placeholder": "From", + "submission.sections.accesses.form.from-placeholder": "Da", + + // "submission.sections.accesses.form.group-label": "Group", + "submission.sections.accesses.form.group-label": "Gruppo", + + // "submission.sections.accesses.form.group-required": "Group is required.", + "submission.sections.accesses.form.group-required": "Il gruppo è obbligatorio.", + + // "submission.sections.accesses.form.until-label": "Grant access until", + "submission.sections.accesses.form.until-label": "Concedi l'accesso fino a", + + // "submission.sections.accesses.form.until-hint": "Select the date until which the related access condition is applied", + "submission.sections.accesses.form.until-hint": "Selezionare la data fino alla quale viene applicata la relativa condizione di accesso", + + // "submission.sections.accesses.form.until-placeholder": "Until", + "submission.sections.accesses.form.until-placeholder": "Fino a quando", + + // "submission.sections.license.granted-label": "I confirm the license above", + // TODO New key - Add a translation + "submission.sections.license.granted-label": "I confirm the license above", + + // "submission.sections.license.required": "You must accept the license", + // TODO New key - Add a translation + "submission.sections.license.required": "You must accept the license", + + // "submission.sections.license.notgranted": "You must accept the license", + // TODO New key - Add a translation + "submission.sections.license.notgranted": "You must accept the license", + + + // "submission.sections.sherpa.publication.information": "Publication information", + // TODO New key - Add a translation + "submission.sections.sherpa.publication.information": "Publication information", + + // "submission.sections.sherpa.publication.information.title": "Title", + // TODO New key - Add a translation + "submission.sections.sherpa.publication.information.title": "Title", + + // "submission.sections.sherpa.publication.information.issns": "ISSNs", + // TODO New key - Add a translation + "submission.sections.sherpa.publication.information.issns": "ISSNs", + + // "submission.sections.sherpa.publication.information.url": "URL", + // TODO New key - Add a translation + "submission.sections.sherpa.publication.information.url": "URL", + + // "submission.sections.sherpa.publication.information.publishers": "Publisher", + // TODO New key - Add a translation + "submission.sections.sherpa.publication.information.publishers": "Publisher", + + // "submission.sections.sherpa.publication.information.romeoPub": "Romeo Pub", + // TODO New key - Add a translation + "submission.sections.sherpa.publication.information.romeoPub": "Romeo Pub", + + // "submission.sections.sherpa.publication.information.zetoPub": "Zeto Pub", + // TODO New key - Add a translation + "submission.sections.sherpa.publication.information.zetoPub": "Zeto Pub", + + // "submission.sections.sherpa.publisher.policy": "Publisher Policy", + // TODO New key - Add a translation + "submission.sections.sherpa.publisher.policy": "Publisher Policy", + + // "submission.sections.sherpa.publisher.policy.description": "The below information was found via Sherpa Romeo. Based on the policies of your publisher, it provides advice regarding whether an embargo may be necessary and/or which files you are allowed to upload. If you have questions, please contact your site administrator via the feedback form in the footer.", + // TODO New key - Add a translation + "submission.sections.sherpa.publisher.policy.description": "The below information was found via Sherpa Romeo. Based on the policies of your publisher, it provides advice regarding whether an embargo may be necessary and/or which files you are allowed to upload. If you have questions, please contact your site administrator via the feedback form in the footer.", + + // "submission.sections.sherpa.publisher.policy.openaccess": "Open Access pathways permitted by this journal's policy are listed below by article version. Click on a pathway for a more detailed view", + // TODO New key - Add a translation + "submission.sections.sherpa.publisher.policy.openaccess": "Open Access pathways permitted by this journal's policy are listed below by article version. Click on a pathway for a more detailed view", + + // "submission.sections.sherpa.publisher.policy.more.information": "For more information, please see the following links:", + // TODO New key - Add a translation + "submission.sections.sherpa.publisher.policy.more.information": "For more information, please see the following links:", + + // "submission.sections.sherpa.publisher.policy.version": "Version", + // TODO New key - Add a translation + "submission.sections.sherpa.publisher.policy.version": "Version", + + // "submission.sections.sherpa.publisher.policy.embargo": "Embargo", + // TODO New key - Add a translation + "submission.sections.sherpa.publisher.policy.embargo": "Embargo", + + // "submission.sections.sherpa.publisher.policy.noembargo": "No Embargo", + // TODO New key - Add a translation + "submission.sections.sherpa.publisher.policy.noembargo": "No Embargo", + + // "submission.sections.sherpa.publisher.policy.nolocation": "None", + // TODO New key - Add a translation + "submission.sections.sherpa.publisher.policy.nolocation": "None", + + // "submission.sections.sherpa.publisher.policy.license": "License", + // TODO New key - Add a translation + "submission.sections.sherpa.publisher.policy.license": "License", + + // "submission.sections.sherpa.publisher.policy.prerequisites": "Prerequisites", + // TODO New key - Add a translation + "submission.sections.sherpa.publisher.policy.prerequisites": "Prerequisites", + + // "submission.sections.sherpa.publisher.policy.location": "Location", + // TODO New key - Add a translation + "submission.sections.sherpa.publisher.policy.location": "Location", + + // "submission.sections.sherpa.publisher.policy.conditions": "Conditions", + // TODO New key - Add a translation + "submission.sections.sherpa.publisher.policy.conditions": "Conditions", + + // "submission.sections.sherpa.publisher.policy.refresh": "Refresh", + // TODO New key - Add a translation + "submission.sections.sherpa.publisher.policy.refresh": "Refresh", + + // "submission.sections.sherpa.record.information": "Record Information", + // TODO New key - Add a translation + "submission.sections.sherpa.record.information": "Record Information", + + // "submission.sections.sherpa.record.information.id": "ID", + // TODO New key - Add a translation + "submission.sections.sherpa.record.information.id": "ID", + + // "submission.sections.sherpa.record.information.date.created": "Date Created", + // TODO New key - Add a translation + "submission.sections.sherpa.record.information.date.created": "Date Created", + + // "submission.sections.sherpa.record.information.date.modified": "Last Modified", + // TODO New key - Add a translation + "submission.sections.sherpa.record.information.date.modified": "Last Modified", + + // "submission.sections.sherpa.record.information.uri": "URI", + // TODO New key - Add a translation + "submission.sections.sherpa.record.information.uri": "URI", + + // "submission.sections.sherpa.error.message": "There was an error retrieving sherpa informations", + // TODO New key - Add a translation + "submission.sections.sherpa.error.message": "There was an error retrieving sherpa informations", + + + + // "submission.submit.breadcrumbs": "New submission", + "submission.submit.breadcrumbs": "Nuova immissione", + + // "submission.submit.title": "New submission", + "submission.submit.title": "Nuova immissione", + + + + // "submission.workflow.generic.delete": "Delete", + "submission.workflow.generic.delete": "Elimina", + + // "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": "Se si desidera eliminare questo item, selezionare \"Elimina\". Ti verrà quindi chiesto di confermarlo.", + + // "submission.workflow.generic.edit": "Edit", + "submission.workflow.generic.edit": "Modifica", + + // "submission.workflow.generic.edit-help": "Select this option to change the item's metadata.", + "submission.workflow.generic.edit-help": "Selezionare questa opzione per modificare i metadati dell'item.", + + // "submission.workflow.generic.view": "View", + "submission.workflow.generic.view": "Visualizza", + + // "submission.workflow.generic.view-help": "Select this option to view the item's metadata.", + "submission.workflow.generic.view-help": "Selezionare questa opzione per visualizzare i metadati dell'item.", + + + + // "submission.workflow.tasks.claimed.approve": "Approve", + "submission.workflow.tasks.claimed.approve": "Approva", + + // "submission.workflow.tasks.claimed.approve_help": "If you have reviewed the item and it is suitable for inclusion in the collection, select \"Approve\".", + "submission.workflow.tasks.claimed.approve_help": "Se hai esaminato l'item ed è adatto per l'inclusione nella collezione, seleziona \"Approva\".", + + // "submission.workflow.tasks.claimed.edit": "Edit", + "submission.workflow.tasks.claimed.edit": "Modifica", + + // "submission.workflow.tasks.claimed.edit_help": "Select this option to change the item's metadata.", + "submission.workflow.tasks.claimed.edit_help": "Selezionare questa opzione per modificare i metadati dell'item.", + + // "submission.workflow.tasks.claimed.reject.reason.info": "Please enter your reason for rejecting the submission into the box below, indicating whether the submitter may fix a problem and resubmit.", + "submission.workflow.tasks.claimed.reject.reason.info": "Se hai esaminato l'item e hai scoperto che non è adatto per essere inserito nella collezione, seleziona \"Rifiuta\". Ti verrà quindi chiesto di inserire un messaggio che indichi perché l'item non è adatto e se chi ha inviato l'item deve cambiare qualcosa e inviarlo di nuovo.", + + // "submission.workflow.tasks.claimed.reject.reason.placeholder": "Describe the reason of reject", + "submission.workflow.tasks.claimed.reject.reason.placeholder": "Descrivi il motivo del rifiuto", + + // "submission.workflow.tasks.claimed.reject.reason.submit": "Reject item", + "submission.workflow.tasks.claimed.reject.reason.submit": "Rifiuta l'item", + + // "submission.workflow.tasks.claimed.reject.reason.title": "Reason", + "submission.workflow.tasks.claimed.reject.reason.title": "Motivo", + + // "submission.workflow.tasks.claimed.reject.submit": "Reject", + "submission.workflow.tasks.claimed.reject.submit": "Rifiuta", + + // "submission.workflow.tasks.claimed.reject_help": "If you have reviewed the item and found it is not suitable for inclusion in the collection, select \"Reject\". You will then be asked to enter a message indicating why the item is unsuitable, and whether the submitter should change something and resubmit.", + "submission.workflow.tasks.claimed.reject_help": "Se l'item esaminato non è adatto per essere inserito nella collezione, seleziona \"Rifiuta\". Ti verrà quindi chiesto di inserire un messaggio che indichi perché l'item non è adatto e se chi ha inviato l'item deve cambiare qualcosa e inviarlo di nuovo.", + + // "submission.workflow.tasks.claimed.return": "Return to pool", + "submission.workflow.tasks.claimed.return": "Restituisci al pool", + + // "submission.workflow.tasks.claimed.return_help": "Return the task to the pool so that another user may perform the task.", + "submission.workflow.tasks.claimed.return_help": "Restituire il task al pool in modo che un altro utente possa prenderlo in carico.", + + + + // "submission.workflow.tasks.generic.error": "Error occurred during operation...", + "submission.workflow.tasks.generic.error": "Si è verificato un errore durante l'operazione...", + + // "submission.workflow.tasks.generic.processing": "Processing...", + "submission.workflow.tasks.generic.processing": "Elaborazione...", + + // "submission.workflow.tasks.generic.submitter": "Submitter", + "submission.workflow.tasks.generic.submitter": "Operatore", + + // "submission.workflow.tasks.generic.success": "Operation successful", + "submission.workflow.tasks.generic.success": "Operazione riuscita", + + + + // "submission.workflow.tasks.pool.claim": "Claim", + "submission.workflow.tasks.pool.claim": "Associa", + + // "submission.workflow.tasks.pool.claim_help": "Assign this task to yourself.", + "submission.workflow.tasks.pool.claim_help": "Assegnati il task.", + + // "submission.workflow.tasks.pool.hide-detail": "Hide detail", + "submission.workflow.tasks.pool.hide-detail": "Nascondi dettaglio", + + // "submission.workflow.tasks.pool.show-detail": "Show detail", + "submission.workflow.tasks.pool.show-detail": "Mostra dettagli", + + + // "submission.workspace.generic.view": "View", + "submission.workspace.generic.view": "Elenco", + + // "submission.workspace.generic.view-help": "Select this option to view the item's metadata.", + "submission.workspace.generic.view-help": "Seleziona questa opzione per vedere i metadata dell'item.", + + + // "thumbnail.default.alt": "Thumbnail Image", + "thumbnail.default.alt": "Immagine di anteprima", + + // "thumbnail.default.placeholder": "No Thumbnail Available", + "thumbnail.default.placeholder": "Nessuna immagine disponibile", + + // "thumbnail.project.alt": "Project Logo", + "thumbnail.project.alt": "Logo del progetto", + + // "thumbnail.project.placeholder": "Project Placeholder Image", + "thumbnail.project.placeholder": "Immagine segnaposto progetto", + + // "thumbnail.orgunit.alt": "OrgUnit Logo", + "thumbnail.orgunit.alt": "Logo Struttura", + + // "thumbnail.orgunit.placeholder": "OrgUnit Placeholder Image", + "thumbnail.orgunit.placeholder": "Immagine segnaposto Struttura", + + // "thumbnail.person.alt": "Profile Picture", + "thumbnail.person.alt": "Immagine del profilo", + + // "thumbnail.person.placeholder": "No Profile Picture Available", + "thumbnail.person.placeholder": "Nessuna immagine del profilo disponibile", + + + + // "title": "DSpace", + // TODO Source message changed - Revise the translation + "title": "DSpace-CRIS", + + + + // "vocabulary-treeview.header": "Hierarchical tree view", + "vocabulary-treeview.header": "Visualizzazione gerarchica ad albero", + + // "vocabulary-treeview.load-more": "Load more", + "vocabulary-treeview.load-more": "Carica di più", + + // "vocabulary-treeview.search.form.reset": "Reset", + "vocabulary-treeview.search.form.reset": "Cancella", + + // "vocabulary-treeview.search.form.search": "Search", + "vocabulary-treeview.search.form.search": "Cerca", + + // "vocabulary-treeview.search.no-result": "There were no items to show", + "vocabulary-treeview.search.no-result": "Non ci sono item da mostrare", + + // "vocabulary-treeview.tree.description.nsi": "The Norwegian Science Index", + "vocabulary-treeview.tree.description.nsi": "Il Norwegian Science Index", + + // "vocabulary-treeview.tree.description.srsc": "Research Subject Categories", + "vocabulary-treeview.tree.description.srsc": "Categorie di argomenti di ricerca", + + + + // "uploader.browse": "browse", + "uploader.browse": "sfoglia", + + // "uploader.drag-message": "Drag & Drop your files here", + "uploader.drag-message": "Trascina e rilascia i tuoi file qui", + + // "uploader.delete.btn-title": "Delete", + "uploader.delete.btn-title": "Elimina", + + // "uploader.or": ", or ", + "uploader.or": ", oppure ", + + // "uploader.processing": "Processing uploaded file(s)... (it's now safe to close this page)", + // TODO Source message changed - Revise the translation + "uploader.processing": "Elaborazione", + + // "uploader.queue-length": "Queue length", + "uploader.queue-length": "Lunghezza coda", + + // "virtual-metadata.delete-item.info": "Select the types for which you want to save the virtual metadata as real metadata", + "virtual-metadata.delete-item.info": "Selezionare i tipi per i quali vuoi salvare i metadati virtuali come metadati reali", + + // "virtual-metadata.delete-item.modal-head": "The virtual metadata of this relation", + "virtual-metadata.delete-item.modal-head": "I metadati virtuali di questa relazione", + + // "virtual-metadata.delete-relationship.modal-head": "Select the items for which you want to save the virtual metadata as real metadata", + "virtual-metadata.delete-relationship.modal-head": "Selezionare gli item per i quali si desidera salvare i metadati virtuali come metadati reali", + + + + // "workspace.search.results.head": "Your submissions", + "workspace.search.results.head": "I tuoi invii", + + // "workflowAdmin.search.results.head": "Administer Workflow", + "workflowAdmin.search.results.head": "Gestire il workflow", + + // "workflow.search.results.head": "Workflow tasks", + "workflow.search.results.head": "Task del workflow", + + + + // "workflow-item.edit.breadcrumbs": "Edit workflowitem", + "workflow-item.edit.breadcrumbs": "Modifica l'item del workflow", + + // "workflow-item.edit.title": "Edit workflowitem", + "workflow-item.edit.title": "Modifica l'item del workflow", + + // "workflow-item.delete.notification.success.title": "Deleted", + "workflow-item.delete.notification.success.title": "Eliminato", + + // "workflow-item.delete.notification.success.content": "This workflow item was successfully deleted", + "workflow-item.delete.notification.success.content": "Questo item del workflow è stato eliminato correttamente", + + // "workflow-item.delete.notification.error.title": "Something went wrong", + "workflow-item.delete.notification.error.title": "Qualcosa è andato storto", + + // "workflow-item.delete.notification.error.content": "The workflow item could not be deleted", + "workflow-item.delete.notification.error.content": "Impossibile eliminare l'item del workflow", + + // "workflow-item.delete.title": "Delete workflow item", + "workflow-item.delete.title": "Elimina item del workflow", + + // "workflow-item.delete.header": "Delete workflow item", + "workflow-item.delete.header": "Elimina item del workflow", + + // "workflow-item.delete.button.cancel": "Cancel", + "workflow-item.delete.button.cancel": "Annulla", + + // "workflow-item.delete.button.confirm": "Delete", + "workflow-item.delete.button.confirm": "Elimina", + + + // "workflow-item.send-back.notification.success.title": "Sent back to submitter", + "workflow-item.send-back.notification.success.title": "Inviato all'operatore", + + // "workflow-item.send-back.notification.success.content": "This workflow item was successfully sent back to the submitter", + "workflow-item.send-back.notification.success.content": "Questo item del workflow è stato rinviato correttamente all'operatore", + + // "workflow-item.send-back.notification.error.title": "Something went wrong", + "workflow-item.send-back.notification.error.title": "Qualcosa è andato storto", + + // "workflow-item.send-back.notification.error.content": "The workflow item could not be sent back to the submitter", + "workflow-item.send-back.notification.error.content": "Impossibile inviare l'item del workflow all'operatore", + + // "workflow-item.send-back.title": "Send workflow item back to submitter", + "workflow-item.send-back.title": "Invia l'item del workflow all'operatore", + + // "workflow-item.send-back.header": "Send workflow item back to submitter", + "workflow-item.send-back.header": "Invia l'item del workflow all'operatore", + + // "workflow-item.send-back.button.cancel": "Cancel", + "workflow-item.send-back.button.cancel": "Annulla", + + // "workflow-item.send-back.button.confirm": "Send back", + "workflow-item.send-back.button.confirm": "Invia indietro", + + // "workflow-item.view.breadcrumbs": "Workflow View", + "workflow-item.view.breadcrumbs": "Vista workflow", + + // "workspace-item.view.breadcrumbs": "Workspace View", + "workspace-item.view.breadcrumbs": "Vista Workspace", + + // "workspace-item.view.title": "Workspace View", + "workspace-item.view.title": "Vista Workspace", + + // "idle-modal.header": "Session will expire soon", + "idle-modal.header": "La sessione scadrà presto", + + // "idle-modal.info": "For security reasons, user sessions expire after {{ timeToExpire }} minutes of inactivity. Your session will expire soon. Would you like to extend it or log out?", + "idle-modal.info": "Per motivi di sicurezza, le sessioni utente scadono dopo {{ timeToExpire }} minuti di inattività. La sessione scadrà presto. Vuoi estenderla o disconnetterti?", + + // "idle-modal.log-out": "Log out", + "idle-modal.log-out": "Logout", + + // "idle-modal.extend-session": "Extend session", + "idle-modal.extend-session": "Estendi sessione", + + // "researcher.profile.action.processing" : "Processing...", + "researcher.profile.action.processing" : "Elaborazione...", + + // "researcher.profile.associated": "Researcher profile associated", + "researcher.profile.associated": "Profilo ricercatore associato", + + // "researcher.profile.change-visibility.fail": "An unexpected error occurs while changing the profile visibility", + "researcher.profile.change-visibility.fail": "Si è verificato un errore inaspettato durante il cambio della visibilità del profilo", + + // "researcher.profile.create.new": "Create new", + "researcher.profile.create.new": "Crea nuovo", + + // "researcher.profile.create.success": "Researcher profile created successfully", + "researcher.profile.create.success": "Profilo del ricercatore creato con successo", + + // "researcher.profile.create.fail": "An error occurs during the researcher profile creation", + "researcher.profile.create.fail": "Si è verificato un errore durante la creazione del profilo del ricercatore", + + // "researcher.profile.delete": "Delete", + "researcher.profile.delete": "Elimina", + + // "researcher.profile.expose": "Expose", + "researcher.profile.expose": "Mostra", + + // "researcher.profile.hide": "Hide", + "researcher.profile.hide": "Nascondi", + + // "researcher.profile.not.associated": "Researcher profile not yet associated", + "researcher.profile.not.associated": "Profilo del ricercatore non ancora associato", + + // "researcher.profile.view": "View", + "researcher.profile.view": "Visualizza", + + // "researcher.profile.private.visibility" : "PRIVATE", + "researcher.profile.private.visibility" : "PRIVATO", + + // "researcher.profile.public.visibility" : "PUBLIC", + "researcher.profile.public.visibility" : "PUBBLICO", + + // "researcher.profile.status": "Status:", + "researcher.profile.status": "Stato:", + + // "researcherprofile.claim.not-authorized": "You are not authorized to claim this item. For more details contact the administrator(s).", + "researcherprofile.claim.not-authorized": "Non sei autorizzato a richiedere questo item. Per maggiori dettagli contattare l'amministratore/i", + + // "researcherprofile.error.claim.body" : "An error occurred while claiming the profile, please try again later", + "researcherprofile.error.claim.body" : "Si è verificato un errore durante l'associazione del profilo, prova più tardi", + + // "researcherprofile.error.claim.title" : "Error", + "researcherprofile.error.claim.title" : "Errore", + + // "researcherprofile.success.claim.body" : "Profile claimed with success", + "researcherprofile.success.claim.body" : "Profilo associato con successo", + + // "researcherprofile.success.claim.title" : "Success", + "researcherprofile.success.claim.title" : "Successo", + + // "person.page.orcid.create": "Create an ORCID ID", + "person.page.orcid.create": "Creare un ID ORCID", + + // "person.page.orcid.granted-authorizations": "Granted authorizations", + "person.page.orcid.granted-authorizations": "Autorizzazioni concesse", + + // "person.page.orcid.grant-authorizations" : "Grant authorizations", + "person.page.orcid.grant-authorizations" : "Concedere autorizzazioni", + + // "person.page.orcid.link": "Connect to ORCID ID", + "person.page.orcid.link": "Connettersi all'ORCID ID", + + // "person.page.orcid.link.processing": "Linking profile to ORCID...", + "person.page.orcid.link.processing": "Collega il profilo a ORCID...", + + // "person.page.orcid.link.error.message": "Something went wrong while connecting the profile with ORCID. If the problem persists, contact the administrator.", + "person.page.orcid.link.error.message": "Si è verifcato un errore nel connettere il profilo a ORCID. Se il problema persiste, contattare l'amministratore", + + // "person.page.orcid.orcid-not-linked-message": "The ORCID iD of this profile ({{ orcid }}) has not yet been connected to an account on the ORCID registry or the connection is expired.", + "person.page.orcid.orcid-not-linked-message": "L'ORCID ID di questo profilo ({{ orcid }}) non è ancora stato collegato a un account del registro ORCID o la connessione è scaduta.", + + // "person.page.orcid.unlink": "Disconnect from ORCID", + "person.page.orcid.unlink": "Disconnessione da ORCID", + + // "person.page.orcid.unlink.processing": "Processing...", + "person.page.orcid.unlink.processing": "Elaborazione...", + + // "person.page.orcid.missing-authorizations": "Missing authorizations", + "person.page.orcid.missing-authorizations": "Autorizzazioni mancanti", + + // "person.page.orcid.missing-authorizations-message": "The following authorizations are missing:", + "person.page.orcid.missing-authorizations-message": "Non si dispone delle seguenti autorizzazioni:", + + // "person.page.orcid.no-missing-authorizations-message": "Great! This box is empty, so you have granted all access rights to use all functions offers by your institution.", + "person.page.orcid.no-missing-authorizations-message": "Benissimo! Questa casella è vuota, quindi hai concesso tutti i diritti di accesso per utilizzare tutte le funzioni offerte dalla tua istituzione.", + + // "person.page.orcid.no-orcid-message": "No ORCID iD associated yet. By clicking on the button below it is possible to link this profile with an ORCID account.", + "person.page.orcid.no-orcid-message": "Nessun ORCID ID ancora associato. Cliccando sul pulsante qui sotto è possibile collegare questo profilo con un account ORCID.", + + // "person.page.orcid.profile-preferences": "Profile preferences", + "person.page.orcid.profile-preferences": "Preferenze del profilo", + + // "person.page.orcid.funding-preferences": "Funding preferences", + "person.page.orcid.funding-preferences": "Preferenze di finanziamento", + + // "person.page.orcid.publications-preferences": "Publication preferences", + "person.page.orcid.publications-preferences": "Preferenze di pubblicazione", + + // "person.page.orcid.remove-orcid-message": "If you need to remove your ORCID, please contact the repository administrator", + "person.page.orcid.remove-orcid-message": "Se vuoi rimuovere l'ORCID, contatta l'amministratore del repository", + + // "person.page.orcid.save.preference.changes": "Update settings", + "person.page.orcid.save.preference.changes": "Impostazioni di aggiornamento", + + // "person.page.orcid.sync-profile.affiliation" : "Affiliation", + "person.page.orcid.sync-profile.affiliation" : "Affiliazione", + + // "person.page.orcid.sync-profile.biographical" : "Biographical data", + "person.page.orcid.sync-profile.biographical" : "Riferimenti biografici", + + // "person.page.orcid.sync-profile.education" : "Education", + "person.page.orcid.sync-profile.education" : "Educazione", + + // "person.page.orcid.sync-profile.identifiers" : "Identifiers", + "person.page.orcid.sync-profile.identifiers" : "Identificativi", + + // "person.page.orcid.sync-fundings.all" : "All fundings", + "person.page.orcid.sync-fundings.all" : "Tutti i finanziamenti", + + // "person.page.orcid.sync-fundings.mine" : "My fundings", + "person.page.orcid.sync-fundings.mine" : "I miei finanziamenti", + + // "person.page.orcid.sync-fundings.my_selected" : "Selected fundings", + "person.page.orcid.sync-fundings.my_selected" : "Finanziamenti selezionati", + + // "person.page.orcid.sync-fundings.disabled" : "Disabled", + "person.page.orcid.sync-fundings.disabled" : "Disabilitato", + + // "person.page.orcid.sync-publications.all" : "All publications", + "person.page.orcid.sync-publications.all" : "Tutte le pubblicazioni", + + // "person.page.orcid.sync-publications.mine" : "My publications", + "person.page.orcid.sync-publications.mine" : "Le mie pubblicazioni", + + // "person.page.orcid.sync-publications.my_selected" : "Selected publications", + "person.page.orcid.sync-publications.my_selected" : "Pubblicazioni selezionate", + + // "person.page.orcid.sync-publications.disabled" : "Disabled", + "person.page.orcid.sync-publications.disabled" : "Disabilitato", + + // "person.page.orcid.sync-queue.discard" : "Discard the change and do not synchronize with the ORCID registry", + "person.page.orcid.sync-queue.discard" : "Scarta la modifica e non sincronizzarla con il registro ORCID.", + + // "person.page.orcid.sync-queue.discard.error": "The discarding of the ORCID queue record failed", + "person.page.orcid.sync-queue.discard.error": "L'eliminazione del record della coda ORCID non è riuscita", + + // "person.page.orcid.sync-queue.discard.success": "The ORCID queue record have been discarded successfully", + "person.page.orcid.sync-queue.discard.success": "Il record della coda ORCID è stato eliminato correttamente", + + // "person.page.orcid.sync-queue.empty-message": "The ORCID queue registry is empty", + "person.page.orcid.sync-queue.empty-message": "Il Registro di sistema della coda ORCID è vuoto", + + // "person.page.orcid.sync-queue.table.header.type" : "Type", + "person.page.orcid.sync-queue.table.header.type" : "Tipo", + + // "person.page.orcid.sync-queue.table.header.description" : "Description", + "person.page.orcid.sync-queue.table.header.description" : "Descrizione", + + // "person.page.orcid.sync-queue.table.header.action" : "Action", + "person.page.orcid.sync-queue.table.header.action" : "Azione", + + // "person.page.orcid.sync-queue.description.affiliation": "Affiliations", + "person.page.orcid.sync-queue.description.affiliation": "Affiliazioni", + + // "person.page.orcid.sync-queue.description.country": "Country", + "person.page.orcid.sync-queue.description.country": "Paese", + + // "person.page.orcid.sync-queue.description.education": "Educations", + "person.page.orcid.sync-queue.description.education": "Istruzione", + + // "person.page.orcid.sync-queue.description.external_ids": "External ids", + "person.page.orcid.sync-queue.description.external_ids": "ID esterni", + + // "person.page.orcid.sync-queue.description.other_names": "Other names", + "person.page.orcid.sync-queue.description.other_names": "Altri nomi", + + // "person.page.orcid.sync-queue.description.qualification": "Qualifications", + "person.page.orcid.sync-queue.description.qualification": "Qualifiche", + + // "person.page.orcid.sync-queue.description.researcher_urls": "Researcher urls", + "person.page.orcid.sync-queue.description.researcher_urls": "URL ricercatore", + + // "person.page.orcid.sync-queue.description.keywords": "Keywords", + "person.page.orcid.sync-queue.description.keywords": "Parole chiave", + + // "person.page.orcid.sync-queue.tooltip.insert": "Add a new entry in the ORCID registry", + "person.page.orcid.sync-queue.tooltip.insert": "Aggiungere una nuova voce nel Registro ORCID", + + // "person.page.orcid.sync-queue.tooltip.update": "Update this entry on the ORCID registry", + "person.page.orcid.sync-queue.tooltip.update": "Aggiorna questa voce nel Registro ORCID", + + // "person.page.orcid.sync-queue.tooltip.delete": "Remove this entry from the ORCID registry", + "person.page.orcid.sync-queue.tooltip.delete": "Rimuovere questa voce dal Registro ORCID", + + // "person.page.orcid.sync-queue.tooltip.publication": "Publication", + "person.page.orcid.sync-queue.tooltip.publication": "Pubblicazione", + + // "person.page.orcid.sync-queue.tooltip.project": "Project", + "person.page.orcid.sync-queue.tooltip.project": "Progetto", + + // "person.page.orcid.sync-queue.tooltip.affiliation": "Affiliation", + "person.page.orcid.sync-queue.tooltip.affiliation": "Affiliazione", + + // "person.page.orcid.sync-queue.tooltip.education": "Education", + "person.page.orcid.sync-queue.tooltip.education": "Istruzione", + + // "person.page.orcid.sync-queue.tooltip.qualification": "Qualification", + "person.page.orcid.sync-queue.tooltip.qualification": "Qualificazione", + + // "person.page.orcid.sync-queue.tooltip.other_names": "Other name", + "person.page.orcid.sync-queue.tooltip.other_names": "Altro nome", + + // "person.page.orcid.sync-queue.tooltip.country": "Country", + "person.page.orcid.sync-queue.tooltip.country": "Paese", + + // "person.page.orcid.sync-queue.tooltip.keywords": "Keyword", + "person.page.orcid.sync-queue.tooltip.keywords": "Parola chiave", + + // "person.page.orcid.sync-queue.tooltip.external_ids": "External identifier", + "person.page.orcid.sync-queue.tooltip.external_ids": "Identificatore esterno", + + // "person.page.orcid.sync-queue.tooltip.researcher_urls": "Researcher url", + "person.page.orcid.sync-queue.tooltip.researcher_urls": "URL ricercatore", + + // "person.page.orcid.sync-queue.send" : "Synchronize with ORCID registry", + "person.page.orcid.sync-queue.send" : "Sincronizza con il registro ORCID", + + // "person.page.orcid.sync-queue.send.unauthorized-error.title": "The submission to ORCID failed for missing authorizations.", + "person.page.orcid.sync-queue.send.unauthorized-error.title": "L'immissione a ORCID non è riuscita a causa di autorizzazioni mancanti.", + + // "person.page.orcid.sync-queue.send.unauthorized-error.content": "Click here to grant again the required permissions. If the problem persists, contact the administrator", + "person.page.orcid.sync-queue.send.unauthorized-error.content": "Clicca qui per ottenere di nuovo i permessi necessari. Se il problema persiste contatta l'amministratore", + + // "person.page.orcid.sync-queue.send.bad-request-error": "The submission to ORCID failed because the resource sent to ORCID registry is not valid", + "person.page.orcid.sync-queue.send.bad-request-error": "L'immissione a ORCID non è riuscito perché la risorsa inviata al Registro ORCID non è valida", + + // "person.page.orcid.sync-queue.send.error": "The submission to ORCID failed", + "person.page.orcid.sync-queue.send.error": "L'immissione a ORCID non è riuscita", + + // "person.page.orcid.sync-queue.send.conflict-error": "The submission to ORCID failed because the resource is already present on the ORCID registry", + "person.page.orcid.sync-queue.send.conflict-error": "L'immissione a ORCID non è riuscita perché la risorsa è già presente nel Registro ORCID", + + // "person.page.orcid.sync-queue.send.not-found-warning": "The resource does not exists anymore on the ORCID registry.", + "person.page.orcid.sync-queue.send.not-found-warning": "La risorsa non esiste più nel registro ORCID.", + + // "person.page.orcid.sync-queue.send.success": "The submission to ORCID was completed successfully", + "person.page.orcid.sync-queue.send.success": "L'immissione a ORCID è stata completata con successo", + + // "person.page.orcid.sync-queue.send.validation-error": "The data that you want to synchronize with ORCID is not valid", + "person.page.orcid.sync-queue.send.validation-error": "I dati che si desidera sincronizzare con ORCID non sono validi", + + // "person.page.orcid.sync-queue.send.validation-error.amount-currency.required": "The amount's currency is required", + "person.page.orcid.sync-queue.send.validation-error.amount-currency.required": "La valuta dell'importo è obbligatoria", + + // "person.page.orcid.sync-queue.send.validation-error.external-id.required": "The resource to be sent requires at least one identifier", + "person.page.orcid.sync-queue.send.validation-error.external-id.required": "La risorsa da inviare richiede almeno un identificatore", + + // "person.page.orcid.sync-queue.send.validation-error.title.required": "The title is required", + "person.page.orcid.sync-queue.send.validation-error.title.required": "Il titolo è obbligatorio", + + // "person.page.orcid.sync-queue.send.validation-error.type.required": "The dc.type is required", + // TODO Source message changed - Revise the translation + "person.page.orcid.sync-queue.send.validation-error.type.required": "Il tipo è obbligatorio", + + // "person.page.orcid.sync-queue.send.validation-error.start-date.required": "The start date is required", + "person.page.orcid.sync-queue.send.validation-error.start-date.required": "La data di inizio è obbligatoria", + + // "person.page.orcid.sync-queue.send.validation-error.funder.required": "The funder is required", + "person.page.orcid.sync-queue.send.validation-error.funder.required": "Il finanziatore è obbligatorio", + + // "person.page.orcid.sync-queue.send.validation-error.country.invalid": "Invalid 2 digits ISO 3166 country", + "person.page.orcid.sync-queue.send.validation-error.country.invalid": "Codice del paese non valido (formato a due cifre ISO 3166)", + + // "person.page.orcid.sync-queue.send.validation-error.organization.required": "The organization is required", + "person.page.orcid.sync-queue.send.validation-error.organization.required": "L'organizzazione è obbligatoria", + + // "person.page.orcid.sync-queue.send.validation-error.organization.name-required": "The organization's name is required", + "person.page.orcid.sync-queue.send.validation-error.organization.name-required": "Il nome dell'organizzazione è obbligatorio", + + // "person.page.orcid.sync-queue.send.validation-error.publication.date-invalid" : "The publication date must be one year after 1900", + "person.page.orcid.sync-queue.send.validation-error.publication.date-invalid" : "La data di pubblicazione deve partire dal 1900", + + // "person.page.orcid.sync-queue.send.validation-error.organization.address-required": "The organization to be sent requires an address", + "person.page.orcid.sync-queue.send.validation-error.organization.address-required": "L'organizzazione da inviare richiede un indirizzo", + + // "person.page.orcid.sync-queue.send.validation-error.organization.city-required": "The address of the organization to be sent requires a city", + "person.page.orcid.sync-queue.send.validation-error.organization.city-required": "L'indirizzo dell'organizzazione da inviare richiede una città", + + // "person.page.orcid.sync-queue.send.validation-error.organization.country-required": "The address of the organization to be sent requires a valid 2 digits ISO 3166 country", + // TODO Source message changed - Revise the translation + "person.page.orcid.sync-queue.send.validation-error.organization.country-required": "L'indirizzo dell'organizzazione da inviare richiede un paese (inserire 2 cifre secondo l'ISO 3166)", + + // "person.page.orcid.sync-queue.send.validation-error.disambiguated-organization.required": "An identifier to disambiguate organizations is required. Supported ids are GRID, Ringgold, Legal Entity identifiers (LEIs) and Crossref Funder Registry identifiers", + "person.page.orcid.sync-queue.send.validation-error.disambiguated-organization.required": "È necessario un identificatore per disambiguare le organizzazioni. Gli ID supportati sono gli identificativi della persona giuridica (LEI), GRID, Ringgold e gli identificatori del Registro finanziatore Crossref", + + // "person.page.orcid.sync-queue.send.validation-error.disambiguated-organization.value-required": "The organization's identifiers requires a value", + "person.page.orcid.sync-queue.send.validation-error.disambiguated-organization.value-required": "Gli identificatori dell'organizzazione richiedono un valore", + + // "person.page.orcid.sync-queue.send.validation-error.disambiguation-source.required": "The organization's identifiers requires a source", + "person.page.orcid.sync-queue.send.validation-error.disambiguation-source.required": "Gli identificatori dell'organizzazione richiedono un'origine", + + // "person.page.orcid.sync-queue.send.validation-error.disambiguation-source.invalid": "The source of one of the organization identifiers is invalid. Supported sources are RINGGOLD, GRID, LEI and FUNDREF", + "person.page.orcid.sync-queue.send.validation-error.disambiguation-source.invalid": "L'origine di uno degli identificatori dell'organizzazione non è valida. Le fonti supportate sono RINGGOLD, GRID, LEI e FUNDREF", + + // "person.page.orcid.synchronization-mode": "Synchronization mode", + "person.page.orcid.synchronization-mode": "Sincronizzazione", + + // "person.page.orcid.synchronization-mode.batch": "Batch", + "person.page.orcid.synchronization-mode.batch": "Batch", + + // "person.page.orcid.synchronization-mode.label": "Synchronization mode", + "person.page.orcid.synchronization-mode.label": "Sincronizzazione", + + // "person.page.orcid.synchronization-mode-message": "Please select how you would like synchronization to ORCID to occur. The options include \"Manual\" (you must send your data to ORCID manually), or \"Batch\" (the system will send your data to ORCID via a scheduled script).", + // TODO Source message changed - Revise the translation + "person.page.orcid.synchronization-mode-message": "Abilitare la modalità di sincronizzazione \"manuale\" per disabilitare la sincronizzazione batch in modo da dover inviare manualmente i dati al Registro ORCID", + + // "person.page.orcid.synchronization-mode-funding-message": "Select whether to send your linked Project entities to your ORCID record's list of funding information.", + "person.page.orcid.synchronization-mode-funding-message": "Scegli se sincronizzare i tuoi Progetti con la lista delle informazioni dei progetti sul profilo ORCID.", + + // "person.page.orcid.synchronization-mode-publication-message": "Select whether to send your linked Publication entities to your ORCID record's list of works.", + "person.page.orcid.synchronization-mode-publication-message": "Scegli se sincronizzare le tue Pubblicazioni con la lista dei tuoi lavori sul profilo ORCID.", + + // "person.page.orcid.synchronization-mode-profile-message": "Select whether to send your biographical data or personal identifiers to your ORCID record.", + "person.page.orcid.synchronization-mode-profile-message": "Scegli se sincronizzare le tue informazioni bibliografiche o identificativi personali con il tuo profilo ORCID.", + + // "person.page.orcid.synchronization-settings-update.success": "The synchronization settings have been updated successfully", + "person.page.orcid.synchronization-settings-update.success": "Le impostazioni di sincronizzazione sono state aggiornate correttamente", + + // "person.page.orcid.synchronization-settings-update.error": "The update of the synchronization settings failed", + "person.page.orcid.synchronization-settings-update.error": "L'aggiornamento delle impostazioni di sincronizzazione non è riuscito", + + // "person.page.orcid.synchronization-mode.manual": "Manual", + "person.page.orcid.synchronization-mode.manual": "Manuale", + + // "person.page.orcid.scope.authenticate": "Get your ORCID iD", + "person.page.orcid.scope.authenticate": "Ottieni il tuo ORCID ID", + + // "person.page.orcid.scope.read-limited": "Read your information with visibility set to Trusted Parties", + "person.page.orcid.scope.read-limited": "Leggi le tue informazioni con visibilità impostata su Parti attendibili", + + // "person.page.orcid.scope.activities-update": "Add/update your research activities", + "person.page.orcid.scope.activities-update": "Aggiungi/aggiorna le tue attività di ricerca", + + // "person.page.orcid.scope.person-update": "Add/update other information about you", + "person.page.orcid.scope.person-update": "Aggiungi/aggiorna le tue informazioni", + + // "person.page.orcid.unlink.success": "The disconnection between the profile and the ORCID registry was successful", + "person.page.orcid.unlink.success": "La disconnessione tra il profilo e il registro ORCID è riuscita", + + // "person.page.orcid.unlink.error": "An error occurred while disconnecting between the profile and the ORCID registry. Try again", + "person.page.orcid.unlink.error": "Si è verificato un errore durante la disconnessione tra il profilo e il Registro di sistema ORCID. Riprova", + + // "person.orcid.sync.setting": "ORCID Synchronization settings", + "person.orcid.sync.setting": "Impostazioni di sincronizzazione ORCID", + + // "person.orcid.registry.queue": "ORCID Registry Queue", + "person.orcid.registry.queue": "Coda registro ORCID", + + // "person.orcid.registry.auth": "ORCID Authorizations", + "person.orcid.registry.auth": "Autorizzazioni ORCID", + // "home.recent-submissions.head": "Recent Submissions", + // TODO New key - Add a translation + "home.recent-submissions.head": "Recent Submissions", + + + +} \ No newline at end of file From f3d4754d5bbdf0731231e2d98d8cd1a021723a51 Mon Sep 17 00:00:00 2001 From: Nona Luypaert Date: Fri, 12 May 2023 10:06:03 +0200 Subject: [PATCH 209/409] 101623: Add BrowseDefinitionModels to CoreModule, Fix FlatBrowseDefinition --- src/app/core/core.module.ts | 2 ++ src/app/core/shared/flat-browse-definition.model.ts | 3 --- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src/app/core/core.module.ts b/src/app/core/core.module.ts index 81b70e42c2..c00cfd6002 100644 --- a/src/app/core/core.module.ts +++ b/src/app/core/core.module.ts @@ -170,6 +170,7 @@ import { OrcidHistory } from './orcid/model/orcid-history.model'; import { OrcidAuthService } from './orcid/orcid-auth.service'; import { VocabularyDataService } from './submission/vocabularies/vocabulary.data.service'; import { VocabularyEntryDetailsDataService } from './submission/vocabularies/vocabulary-entry-details.data.service'; +import { HierarchicalBrowseDefinition } from './shared/hierarchical-browse-definition.model'; /** * When not in production, endpoint responses can be mocked for testing purposes @@ -325,6 +326,7 @@ export const models = AuthStatus, BrowseEntry, FlatBrowseDefinition, + HierarchicalBrowseDefinition, ClaimedTask, TaskObject, PoolTask, diff --git a/src/app/core/shared/flat-browse-definition.model.ts b/src/app/core/shared/flat-browse-definition.model.ts index 2002d6bbab..fa664c7747 100644 --- a/src/app/core/shared/flat-browse-definition.model.ts +++ b/src/app/core/shared/flat-browse-definition.model.ts @@ -22,9 +22,6 @@ export class FlatBrowseDefinition extends CacheableObject implements BrowseDefin @autoserialize id: string; - @autoserialize - metadataBrowse: boolean; - @autoserialize sortOptions: SortOption[]; From b4d2f063c6c039ca1d899b15af67cc37c9fd55fa Mon Sep 17 00:00:00 2001 From: lotte Date: Fri, 12 May 2023 10:44:55 +0200 Subject: [PATCH 210/409] 97184: styleurl fix for themed badges component --- .../shared/object-collection/shared/badges/badges.component.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/themes/custom/app/shared/object-collection/shared/badges/badges.component.ts b/src/themes/custom/app/shared/object-collection/shared/badges/badges.component.ts index 8cdbf32d36..ecd1a9a43b 100644 --- a/src/themes/custom/app/shared/object-collection/shared/badges/badges.component.ts +++ b/src/themes/custom/app/shared/object-collection/shared/badges/badges.component.ts @@ -4,6 +4,7 @@ import { BadgesComponent as BaseComponent } from 'src/app/shared/object-collecti @Component({ selector: 'ds-badges', // styleUrls: ['./badges.component.scss'], + styleUrls: ['../../../../../../../app/shared/object-collection/shared/badges/badges.component.scss'], // templateUrl: './badges.component.html', templateUrl: '../../../../../../../app/shared/object-collection/shared/badges/badges.component.html', }) From 84b63a443faebf9c6f66cefd12802e041957bb3c Mon Sep 17 00:00:00 2001 From: Davide Negretti Date: Fri, 12 May 2023 11:55:18 +0200 Subject: [PATCH 211/409] [DURACOM-99] Updated Italian translations (2023-05-12) --- src/assets/i18n/it.json5 | 1242 ++++++++++++++++++++++++++++++++++---- 1 file changed, 1114 insertions(+), 128 deletions(-) diff --git a/src/assets/i18n/it.json5 b/src/assets/i18n/it.json5 index ab8bf0feef..8b90e3fa2a 100644 --- a/src/assets/i18n/it.json5 +++ b/src/assets/i18n/it.json5 @@ -194,9 +194,9 @@ // "admin.registries.bitstream-formats.table.name": "Name", "admin.registries.bitstream-formats.table.name": "Nome", - // "admin.registries.bitstream-formats.table.id" : "ID", + // "admin.registries.bitstream-formats.table.id": "ID", // TODO New key - Add a translation - "admin.registries.bitstream-formats.table.id" : "ID", + "admin.registries.bitstream-formats.table.id": "ID", // "admin.registries.bitstream-formats.table.return": "Back", "admin.registries.bitstream-formats.table.return": "Indietro", @@ -276,9 +276,9 @@ // "admin.registries.schema.fields.table.field": "Field", "admin.registries.schema.fields.table.field": "Campo", - // "admin.registries.schema.fields.table.id" : "ID", + // "admin.registries.schema.fields.table.id": "ID", // TODO New key - Add a translation - "admin.registries.schema.fields.table.id" : "ID", + "admin.registries.schema.fields.table.id": "ID", // "admin.registries.schema.fields.table.scopenote": "Scope Note", "admin.registries.schema.fields.table.scopenote": "Nota di ambito", @@ -750,7 +750,17 @@ // "admin.access-control.groups.form.return": "Back", "admin.access-control.groups.form.return": "Indietro", + // "admin.access-control.groups.form.tooltip.editGroupPage": "On this page, you can modify the properties and members of a group. In the top section, you can edit the group name and description, unless this is an admin group for a collection or community, in which case the group name and description are auto-generated and cannot be edited. In the following sections, you can edit group membership. See [the wiki](https://wiki.lyrasis.org/display/DSDOC7x/Create+or+manage+a+user+group) for more details.", + // TODO New key - Add a translation + "admin.access-control.groups.form.tooltip.editGroupPage": "On this page, you can modify the properties and members of a group. In the top section, you can edit the group name and description, unless this is an admin group for a collection or community, in which case the group name and description are auto-generated and cannot be edited. In the following sections, you can edit group membership. See [the wiki](https://wiki.lyrasis.org/display/DSDOC7x/Create+or+manage+a+user+group) for more details.", + // "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.", + // TODO New key - Add a translation + "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.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.", + // TODO New key - Add a translation + "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.search.breadcrumbs": "Administrative Search", "admin.search.breadcrumbs": "Ricerca amministrativa", @@ -800,12 +810,24 @@ // "admin.workflow.item.workflow": "Workflow", "admin.workflow.item.workflow": "Flusso di lavoro", + // "admin.workflow.item.workspace": "Workspace", + // TODO New key - Add a translation + "admin.workflow.item.workspace": "Workspace", + // "admin.workflow.item.delete": "Delete", "admin.workflow.item.delete": "Cancellare", // "admin.workflow.item.send-back": "Send back", "admin.workflow.item.send-back": "Rinviare", + // "admin.workflow.item.policies": "Policies", + // TODO New key - Add a translation + "admin.workflow.item.policies": "Policies", + + // "admin.workflow.item.supervision": "Supervision", + // TODO New key - Add a translation + "admin.workflow.item.supervision": "Supervision", + // "admin.metadata-import.breadcrumbs": "Import Metadata", @@ -873,6 +895,132 @@ // "admin.metadata-import.page.validateOnly.hint": "When selected, the uploaded CSV will be validated. You will receive a report of detected changes, but no changes will be saved.", "admin.metadata-import.page.validateOnly.hint": "Una volta selezionato, il CSV caricato sarà validato. Riceverai un report delle modifiche rilevate, ma nessuna modifica verrà salvata.", + // "advanced-workflow-action.rating.form.rating.label": "Rating", + // TODO New key - Add a translation + "advanced-workflow-action.rating.form.rating.label": "Rating", + + // "advanced-workflow-action.rating.form.rating.error": "You must rate the item", + // TODO New key - Add a translation + "advanced-workflow-action.rating.form.rating.error": "You must rate the item", + + // "advanced-workflow-action.rating.form.review.label": "Review", + // TODO New key - Add a translation + "advanced-workflow-action.rating.form.review.label": "Review", + + // "advanced-workflow-action.rating.form.review.error": "You must enter a review to submit this rating", + // TODO New key - Add a translation + "advanced-workflow-action.rating.form.review.error": "You must enter a review to submit this rating", + + // "advanced-workflow-action.rating.description": "Please select a rating below", + // TODO New key - Add a translation + "advanced-workflow-action.rating.description": "Please select a rating below", + + // "advanced-workflow-action.rating.description-requiredDescription": "Please select a rating below and also add a review", + // TODO New key - Add a translation + "advanced-workflow-action.rating.description-requiredDescription": "Please select a rating below and also add a review", + + + // "advanced-workflow-action.select-reviewer.description-single": "Please select a single reviewer below before submitting", + // TODO New key - Add a translation + "advanced-workflow-action.select-reviewer.description-single": "Please select a single reviewer below before submitting", + + // "advanced-workflow-action.select-reviewer.description-multiple": "Please select one or more reviewers below before submitting", + // TODO New key - Add a translation + "advanced-workflow-action.select-reviewer.description-multiple": "Please select one or more reviewers below before submitting", + + + // "advanced-workflow-action-select-reviewer.groups.form.reviewers-list.head": "EPeople", + // TODO New key - Add a translation + "advanced-workflow-action-select-reviewer.groups.form.reviewers-list.head": "EPeople", + + // "advanced-workflow-action-select-reviewer.groups.form.reviewers-list.search.head": "Add EPeople", + // TODO New key - Add a translation + "advanced-workflow-action-select-reviewer.groups.form.reviewers-list.search.head": "Add EPeople", + + // "advanced-workflow-action-select-reviewer.groups.form.reviewers-list.button.see-all": "Browse All", + // TODO New key - Add a translation + "advanced-workflow-action-select-reviewer.groups.form.reviewers-list.button.see-all": "Browse All", + + // "advanced-workflow-action-select-reviewer.groups.form.reviewers-list.headMembers": "Current Members", + // TODO New key - Add a translation + "advanced-workflow-action-select-reviewer.groups.form.reviewers-list.headMembers": "Current Members", + + // "advanced-workflow-action-select-reviewer.groups.form.reviewers-list.search.scope.metadata": "Metadata", + // TODO New key - Add a translation + "advanced-workflow-action-select-reviewer.groups.form.reviewers-list.search.scope.metadata": "Metadata", + + // "advanced-workflow-action-select-reviewer.groups.form.reviewers-list.search.scope.email": "E-mail (exact)", + // TODO New key - Add a translation + "advanced-workflow-action-select-reviewer.groups.form.reviewers-list.search.scope.email": "E-mail (exact)", + + // "advanced-workflow-action-select-reviewer.groups.form.reviewers-list.search.button": "Search", + // TODO New key - Add a translation + "advanced-workflow-action-select-reviewer.groups.form.reviewers-list.search.button": "Search", + + // "advanced-workflow-action-select-reviewer.groups.form.reviewers-list.table.id": "ID", + // TODO New key - Add a translation + "advanced-workflow-action-select-reviewer.groups.form.reviewers-list.table.id": "ID", + + // "advanced-workflow-action-select-reviewer.groups.form.reviewers-list.table.name": "Name", + // TODO New key - Add a translation + "advanced-workflow-action-select-reviewer.groups.form.reviewers-list.table.name": "Name", + + // "advanced-workflow-action-select-reviewer.groups.form.reviewers-list.table.identity": "Identity", + // TODO New key - Add a translation + "advanced-workflow-action-select-reviewer.groups.form.reviewers-list.table.identity": "Identity", + + // "advanced-workflow-action-select-reviewer.groups.form.reviewers-list.table.email": "Email", + // TODO New key - Add a translation + "advanced-workflow-action-select-reviewer.groups.form.reviewers-list.table.email": "Email", + + // "advanced-workflow-action-select-reviewer.groups.form.reviewers-list.table.netid": "NetID", + // TODO New key - Add a translation + "advanced-workflow-action-select-reviewer.groups.form.reviewers-list.table.netid": "NetID", + + // "advanced-workflow-action-select-reviewer.groups.form.reviewers-list.table.edit": "Remove / Add", + // TODO New key - Add a translation + "advanced-workflow-action-select-reviewer.groups.form.reviewers-list.table.edit": "Remove / Add", + + // "advanced-workflow-action-select-reviewer.groups.form.reviewers-list.table.edit.buttons.remove": "Remove member with name \"{{name}}\"", + // TODO New key - Add a translation + "advanced-workflow-action-select-reviewer.groups.form.reviewers-list.table.edit.buttons.remove": "Remove member with name \"{{name}}\"", + + // "advanced-workflow-action-select-reviewer.groups.form.reviewers-list.notification.success.addMember": "Successfully added member: \"{{name}}\"", + // TODO New key - Add a translation + "advanced-workflow-action-select-reviewer.groups.form.reviewers-list.notification.success.addMember": "Successfully added member: \"{{name}}\"", + + // "advanced-workflow-action-select-reviewer.groups.form.reviewers-list.notification.failure.addMember": "Failed to add member: \"{{name}}\"", + // TODO New key - Add a translation + "advanced-workflow-action-select-reviewer.groups.form.reviewers-list.notification.failure.addMember": "Failed to add member: \"{{name}}\"", + + // "advanced-workflow-action-select-reviewer.groups.form.reviewers-list.notification.success.deleteMember": "Successfully deleted member: \"{{name}}\"", + // TODO New key - Add a translation + "advanced-workflow-action-select-reviewer.groups.form.reviewers-list.notification.success.deleteMember": "Successfully deleted member: \"{{name}}\"", + + // "advanced-workflow-action-select-reviewer.groups.form.reviewers-list.notification.failure.deleteMember": "Failed to delete member: \"{{name}}\"", + // TODO New key - Add a translation + "advanced-workflow-action-select-reviewer.groups.form.reviewers-list.notification.failure.deleteMember": "Failed to delete member: \"{{name}}\"", + + // "advanced-workflow-action-select-reviewer.groups.form.reviewers-list.table.edit.buttons.add": "Add member with name \"{{name}}\"", + // TODO New key - Add a translation + "advanced-workflow-action-select-reviewer.groups.form.reviewers-list.table.edit.buttons.add": "Add member with name \"{{name}}\"", + + // "advanced-workflow-action-select-reviewer.groups.form.reviewers-list.notification.failure.noActiveGroup": "No current active group, submit a name first.", + // TODO New key - Add a translation + "advanced-workflow-action-select-reviewer.groups.form.reviewers-list.notification.failure.noActiveGroup": "No current active group, submit a name first.", + + // "advanced-workflow-action-select-reviewer.groups.form.reviewers-list.no-members-yet": "No members in group yet, search and add.", + // TODO New key - Add a translation + "advanced-workflow-action-select-reviewer.groups.form.reviewers-list.no-members-yet": "No members in group yet, search and add.", + + // "advanced-workflow-action-select-reviewer.groups.form.reviewers-list.no-items": "No EPeople found in that search", + // TODO New key - Add a translation + "advanced-workflow-action-select-reviewer.groups.form.reviewers-list.no-items": "No EPeople found in that search", + + // "advanced-workflow-action.select-reviewer.no-reviewer-selected.error": "No reviewer selected.", + // TODO New key - Add a translation + "advanced-workflow-action.select-reviewer.no-reviewer-selected.error": "No reviewer selected.", + // "admin.batch-import.page.validateOnly.hint": "When selected, the uploaded ZIP will be validated. You will receive a report of detected changes, but no changes will be saved.", // TODO New key - Add a translation "admin.batch-import.page.validateOnly.hint": "When selected, the uploaded ZIP will be validated. You will receive a report of detected changes, but no changes will be saved.", @@ -1174,10 +1322,27 @@ "browse.title.page": "Mostra il contenuto di {{ collection }} per {{ field }} {{ value }}", + // "search.browse.item-back": "Back to Results", + // TODO New key - Add a translation + "search.browse.item-back": "Back to Results", + + // "chips.remove": "Remove chip", "chips.remove": "Rimuovere il chip", + // "claimed-approved-search-result-list-element.title": "Approved", + // TODO New key - Add a translation + "claimed-approved-search-result-list-element.title": "Approved", + + // "claimed-declined-search-result-list-element.title": "Rejected, sent back to submitter", + // TODO New key - Add a translation + "claimed-declined-search-result-list-element.title": "Rejected, sent back to submitter", + + // "claimed-declined-task-search-result-list-element.title": "Declined, sent back to Review Manager's workflow", + // TODO New key - Add a translation + "claimed-declined-task-search-result-list-element.title": "Declined, sent back to Review Manager's workflow", + // "collection.create.head": "Create a Collection", "collection.create.head": "Creare una collection", @@ -1788,6 +1953,15 @@ "comcol-role.edit.reviewer.description": "I revisori sono in grado di accettare o rifiutare le submissions depositate. Tuttavia, non sono in grado di modificare i metadati della submission.", + // "comcol-role.edit.scorereviewers.name": "Score Reviewers", + // TODO New key - Add a translation + "comcol-role.edit.scorereviewers.name": "Score Reviewers", + + // "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.", + + // "community.form.abstract": "Short Description", "community.form.abstract": "Breve descrizione", @@ -1963,11 +2137,12 @@ // "cookies.consent.purpose.sharing": "Sharing", "cookies.consent.purpose.sharing": "Condivisione", - // "curation-task.task.citationpage.label": "Generate Citation Page", + // "curation-task.task.citationpage.label": "Generate Citation Page", // TODO New key - Add a translation - "curation-task.task.citationpage.label": "Generate Citation Page", + "curation-task.task.citationpage.label": "Generate Citation Page", - // "curation-task.task.checklinks.label": "Check Links in Metadata", + // "curation-task.task.checklinks.label": "Check Links in Metadata", + // TODO Source message changed - Revise the translation "curation-task.task.checklinks.label": "Controllare i collegamenti nei metadati", // "curation-task.task.noop.label": "NOOP", @@ -1985,6 +2160,10 @@ // "curation-task.task.vscan.label": "Virus Scan", "curation-task.task.vscan.label": "Scansione antivirus", + // "curation-task.task.register-doi.label": "Register DOI", + // TODO New key - Add a translation + "curation-task.task.register-doi.label": "Register DOI", + // "curation.form.task-select.label": "Task:", @@ -2050,6 +2229,10 @@ // "dso-selector.create.community.head": "New community", "dso-selector.create.community.head": "Nuova Community", + // "dso-selector.create.community.or-divider": "or", + // TODO New key - Add a translation + "dso-selector.create.community.or-divider": "or", + // "dso-selector.create.community.sub-level": "Create a new community in", "dso-selector.create.community.sub-level": "Creare una nuova community in", @@ -2103,6 +2286,10 @@ // "dso-selector.set-scope.community.button": "Search all of DSpace", "dso-selector.set-scope.community.button": "Cerca in tutto DSpace", + // "dso-selector.set-scope.community.or-divider": "or", + // TODO New key - Add a translation + "dso-selector.set-scope.community.or-divider": "or", + // "dso-selector.set-scope.community.input-header": "Search for a community or collection", "dso-selector.set-scope.community.input-header": "Cercare una community o una collection", @@ -2118,6 +2305,62 @@ // "dso-selector.claim.item.create-from-scratch": "Create a new one", "dso-selector.claim.item.create-from-scratch": "Crea uno nuovo profilo", + // "dso-selector.results-could-not-be-retrieved": "Something went wrong, please refresh again ↻", + // TODO New key - Add a translation + "dso-selector.results-could-not-be-retrieved": "Something went wrong, please refresh again ↻", + + // "supervision-group-selector.header": "Supervision Group Selector", + // TODO New key - Add a translation + "supervision-group-selector.header": "Supervision Group Selector", + + // "supervision-group-selector.select.type-of-order.label": "Select a type of Order", + // TODO New key - Add a translation + "supervision-group-selector.select.type-of-order.label": "Select a type of Order", + + // "supervision-group-selector.select.type-of-order.option.none": "NONE", + // TODO New key - Add a translation + "supervision-group-selector.select.type-of-order.option.none": "NONE", + + // "supervision-group-selector.select.type-of-order.option.editor": "EDITOR", + // TODO New key - Add a translation + "supervision-group-selector.select.type-of-order.option.editor": "EDITOR", + + // "supervision-group-selector.select.type-of-order.option.observer": "OBSERVER", + // TODO New key - Add a translation + "supervision-group-selector.select.type-of-order.option.observer": "OBSERVER", + + // "supervision-group-selector.select.group.label": "Select a Group", + // TODO New key - Add a translation + "supervision-group-selector.select.group.label": "Select a Group", + + // "supervision-group-selector.button.cancel": "Cancel", + // TODO New key - Add a translation + "supervision-group-selector.button.cancel": "Cancel", + + // "supervision-group-selector.button.save": "Save", + // TODO New key - Add a translation + "supervision-group-selector.button.save": "Save", + + // "supervision-group-selector.select.type-of-order.error": "Please select a type of order", + // TODO New key - Add a translation + "supervision-group-selector.select.type-of-order.error": "Please select a type of order", + + // "supervision-group-selector.select.group.error": "Please select a group", + // TODO New key - Add a translation + "supervision-group-selector.select.group.error": "Please select a group", + + // "supervision-group-selector.notification.create.success.title": "Successfully created supervision order for group {{ name }}", + // TODO New key - Add a translation + "supervision-group-selector.notification.create.success.title": "Successfully created supervision order for group {{ name }}", + + // "supervision-group-selector.notification.create.failure.title": "Error", + // TODO New key - Add a translation + "supervision-group-selector.notification.create.failure.title": "Error", + + // "supervision-group-selector.notification.create.already-existing": "A supervision order already exists on this item for selected group", + // TODO New key - Add a translation + "supervision-group-selector.notification.create.already-existing": "A supervision order already exists on this item for selected group", + // "confirmation-modal.export-metadata.header": "Export metadata for {{ dsoName }}", "confirmation-modal.export-metadata.header": "Esportare i metadati per {{ dsoName }}", @@ -2170,6 +2413,18 @@ // "confirmation-modal.delete-profile.confirm": "Delete", "confirmation-modal.delete-profile.confirm": "Elimina", + // "confirmation-modal.delete-subscription.header": "Delete Subscription", + // TODO Source message changed - Revise the translation + "confirmation-modal.delete-subscription.header": "Elimina iscrizione per \"{{ dsoName }}\"", + + // "confirmation-modal.delete-subscription.info": "Are you sure you want to delete subscription for \"{{ dsoName }}\"", + "confirmation-modal.delete-subscription.info": "Sei sicuro di voler eliminare l'iscrizione per \"{{ dsoName }}\"", + + // "confirmation-modal.delete-subscription.cancel": "Cancel", + "confirmation-modal.delete-subscription.cancel": "Annulla", + + // "confirmation-modal.delete-subscription.confirm": "Delete", + "confirmation-modal.delete-subscription.confirm": "Elimina", // "error.bitstream": "Error fetching bitstream", "error.bitstream": "Errore durante il recupero del bitstream", @@ -2270,10 +2525,12 @@ // "footer.link.privacy-policy": "Privacy policy", "footer.link.privacy-policy": "Informativa sulla privacy", - // "footer.link.end-user-agreement":"End User Agreement", + // "footer.link.end-user-agreement": "End User Agreement", + // TODO Source message changed - Revise the translation "footer.link.end-user-agreement": "Accordo con l'utente finale", - // "footer.link.feedback":"Send Feedback", + // "footer.link.feedback": "Send Feedback", + // TODO Source message changed - Revise the translation "footer.link.feedback": "Invia Feedback", @@ -2291,8 +2548,9 @@ // "forgot-email.form.email.error.required": "Please fill in an email address", "forgot-email.form.email.error.required": "Si prega di inserire un indirizzo email", - // "forgot-email.form.email.error.pattern": "Please fill in a valid email address", - "forgot-email.form.email.error.pattern": "Si prega di inserire un indirizzo email valido", + // "forgot-email.form.email.error.not-email-form": "Please fill in a valid email address", + // TODO New key - Add a translation + "forgot-email.form.email.error.not-email-form": "Please fill in a valid email address", // "forgot-email.form.email.hint": "An email will be sent to this address with a further instructions.", // TODO Source message changed - Revise the translation @@ -2449,6 +2707,10 @@ // "form.submit": "Save", "form.submit": "Salva", + // "form.create": "Create", + // TODO New key - Add a translation + "form.create": "Create", + // "form.repeatable.sort.tip": "Drop the item in the new position", "form.repeatable.sort.tip": "Rilascia l'item nella nuova posizione", @@ -2524,17 +2786,17 @@ // TODO New key - Add a translation "health.breadcrumbs": "Health", - // "health-page.heading" : "Health", + // "health-page.heading": "Health", // TODO New key - Add a translation - "health-page.heading" : "Health", + "health-page.heading": "Health", - // "health-page.info-tab" : "Info", + // "health-page.info-tab": "Info", // TODO New key - Add a translation - "health-page.info-tab" : "Info", + "health-page.info-tab": "Info", - // "health-page.status-tab" : "Status", + // "health-page.status-tab": "Status", // TODO New key - Add a translation - "health-page.status-tab" : "Status", + "health-page.status-tab": "Status", // "health-page.error.msg": "The health check service is temporarily unavailable", "health-page.error.msg": "Il servizio di health check è temporaneamente non disponibile.", @@ -2550,21 +2812,21 @@ // TODO New key - Add a translation "health-page.section.geoIp.title": "GeoIp", - // "health-page.section.solrAuthorityCore.title": "Sor: authority core", + // "health-page.section.solrAuthorityCore.title": "Solr: authority core", // TODO New key - Add a translation - "health-page.section.solrAuthorityCore.title": "Sor: authority core", + "health-page.section.solrAuthorityCore.title": "Solr: authority core", - // "health-page.section.solrOaiCore.title": "Sor: oai core", + // "health-page.section.solrOaiCore.title": "Solr: oai core", // TODO New key - Add a translation - "health-page.section.solrOaiCore.title": "Sor: oai core", + "health-page.section.solrOaiCore.title": "Solr: oai core", - // "health-page.section.solrSearchCore.title": "Sor: search core", + // "health-page.section.solrSearchCore.title": "Solr: search core", // TODO New key - Add a translation - "health-page.section.solrSearchCore.title": "Sor: search core", + "health-page.section.solrSearchCore.title": "Solr: search core", - // "health-page.section.solrStatisticsCore.title": "Sor: statistics core", + // "health-page.section.solrStatisticsCore.title": "Solr: statistics core", // TODO New key - Add a translation - "health-page.section.solrStatisticsCore.title": "Sor: statistics core", + "health-page.section.solrStatisticsCore.title": "Solr: statistics core", // "health-page.section-info.app.title": "Application Backend", "health-page.section-info.app.title": "Backend dell'applicativo", @@ -2607,8 +2869,7 @@ "home.title": "Home", // "home.top-level-communities.head": "Communities in DSpace", - // TODO Source message changed - Revise the translation - "home.top-level-communities.head": "DSpace Cris Communities", + "home.top-level-communities.head": "Community in DSpace", // "home.top-level-communities.help": "Select a community to browse its collections.", // TODO Source message changed - Revise the translation @@ -2673,19 +2934,24 @@ // "info.feedback.email-label": "Your Email", "info.feedback.email-label": "La tua email", - // "info.feedback.create.success" : "Feedback Sent Successfully!", + // "info.feedback.create.success": "Feedback Sent Successfully!", + // TODO Source message changed - Revise the translation "info.feedback.create.success" : "Feedback inviato con successo!", - // "info.feedback.error.email.required" : "A valid email address is required", + // "info.feedback.error.email.required": "A valid email address is required", + // TODO Source message changed - Revise the translation "info.feedback.error.email.required" : "Inserire un un indirizzo email valido", - // "info.feedback.error.message.required" : "A comment is required", + // "info.feedback.error.message.required": "A comment is required", + // TODO Source message changed - Revise the translation "info.feedback.error.message.required" : "Inserire un commento", - // "info.feedback.page-label" : "Page", + // "info.feedback.page-label": "Page", + // TODO Source message changed - Revise the translation "info.feedback.page-label" : "Pagina", - // "info.feedback.page_help" : "Tha page related to your feedback", + // "info.feedback.page_help": "Tha page related to your feedback", + // TODO Source message changed - Revise the translation "info.feedback.page_help" : "In questa pagina trovi i tuoi feedback", @@ -2725,7 +2991,8 @@ // "item.bitstreams.upload.bundle.new": "Create bundle", "item.bitstreams.upload.bundle.new": "Crea 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.", + // TODO Source message changed - Revise the translation "item.bitstreams.upload.bundles.empty": "Questo item non contiene alcun bundle in cui caricare un bitstream.", // "item.bitstreams.upload.cancel": "Cancel", @@ -2877,6 +3144,90 @@ // "item.edit.tabs.item-mapper.title": "Item Edit - Collection Mapper", "item.edit.tabs.item-mapper.title": "Modifica item - Mapper Collection", + // "item.edit.identifiers.doi.status.UNKNOWN": "Unknown", + // TODO New key - Add a translation + "item.edit.identifiers.doi.status.UNKNOWN": "Unknown", + + // "item.edit.identifiers.doi.status.TO_BE_REGISTERED": "Queued for registration", + // TODO New key - Add a translation + "item.edit.identifiers.doi.status.TO_BE_REGISTERED": "Queued for registration", + + // "item.edit.identifiers.doi.status.TO_BE_RESERVED": "Queued for reservation", + // TODO New key - Add a translation + "item.edit.identifiers.doi.status.TO_BE_RESERVED": "Queued for reservation", + + // "item.edit.identifiers.doi.status.IS_REGISTERED": "Registered", + // TODO New key - Add a translation + "item.edit.identifiers.doi.status.IS_REGISTERED": "Registered", + + // "item.edit.identifiers.doi.status.IS_RESERVED": "Reserved", + // TODO New key - Add a translation + "item.edit.identifiers.doi.status.IS_RESERVED": "Reserved", + + // "item.edit.identifiers.doi.status.UPDATE_RESERVED": "Reserved (update queued)", + // TODO New key - Add a translation + "item.edit.identifiers.doi.status.UPDATE_RESERVED": "Reserved (update queued)", + + // "item.edit.identifiers.doi.status.UPDATE_REGISTERED": "Registered (update queued)", + // TODO New key - Add a translation + "item.edit.identifiers.doi.status.UPDATE_REGISTERED": "Registered (update queued)", + + // "item.edit.identifiers.doi.status.UPDATE_BEFORE_REGISTRATION": "Queued for update and registration", + // TODO New key - Add a translation + "item.edit.identifiers.doi.status.UPDATE_BEFORE_REGISTRATION": "Queued for update and registration", + + // "item.edit.identifiers.doi.status.TO_BE_DELETED": "Queued for deletion", + // TODO New key - Add a translation + "item.edit.identifiers.doi.status.TO_BE_DELETED": "Queued for deletion", + + // "item.edit.identifiers.doi.status.DELETED": "Deleted", + // TODO New key - Add a translation + "item.edit.identifiers.doi.status.DELETED": "Deleted", + + // "item.edit.identifiers.doi.status.PENDING": "Pending (not registered)", + // TODO New key - Add a translation + "item.edit.identifiers.doi.status.PENDING": "Pending (not registered)", + + // "item.edit.identifiers.doi.status.MINTED": "Minted (not registered)", + // TODO New key - Add a translation + "item.edit.identifiers.doi.status.MINTED": "Minted (not registered)", + + // "item.edit.tabs.status.buttons.register-doi.label": "Register a new or pending DOI", + // TODO New key - Add a translation + "item.edit.tabs.status.buttons.register-doi.label": "Register a new or pending DOI", + + // "item.edit.tabs.status.buttons.register-doi.button": "Register DOI...", + // TODO New key - Add a translation + "item.edit.tabs.status.buttons.register-doi.button": "Register DOI...", + + // "item.edit.register-doi.header": "Register a new or pending DOI", + // TODO New key - Add a translation + "item.edit.register-doi.header": "Register a new or pending DOI", + + // "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", + // TODO New key - Add a translation + "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.confirm": "Confirm", + // TODO New key - Add a translation + "item.edit.register-doi.confirm": "Confirm", + + // "item.edit.register-doi.cancel": "Cancel", + // TODO New key - Add a translation + "item.edit.register-doi.cancel": "Cancel", + + // "item.edit.register-doi.success": "DOI queued for registration successfully.", + // TODO New key - Add a translation + "item.edit.register-doi.success": "DOI queued for registration successfully.", + + // "item.edit.register-doi.error": "Error registering DOI", + // TODO New key - Add a translation + "item.edit.register-doi.error": "Error registering DOI", + + // "item.edit.register-doi.to-update": "The following DOI has already been minted and will be queued for registration online", + // TODO New key - Add a translation + "item.edit.register-doi.to-update": "The following DOI has already been minted and will be queued for registration online", + // "item.edit.item-mapper.buttons.add": "Map item to selected collections", "item.edit.item-mapper.buttons.add": "Mappare l'item nelle collections selezionate", @@ -2939,6 +3290,14 @@ // "item.edit.metadata.discard-button": "Discard", "item.edit.metadata.discard-button": "Annulla", + // "item.edit.metadata.edit.buttons.confirm": "Confirm", + // TODO New key - Add a translation + "item.edit.metadata.edit.buttons.confirm": "Confirm", + + // "item.edit.metadata.edit.buttons.drag": "Drag to reorder", + // TODO New key - Add a translation + "item.edit.metadata.edit.buttons.drag": "Drag to reorder", + // "item.edit.metadata.edit.buttons.edit": "Edit", "item.edit.metadata.edit.buttons.edit": "Edita", @@ -2951,6 +3310,10 @@ // "item.edit.metadata.edit.buttons.unedit": "Stop editing", "item.edit.metadata.edit.buttons.unedit": "Interrompi la modifica", + // "item.edit.metadata.edit.buttons.virtual": "This is a virtual metadata value, i.e. a value inherited from a related entity. It can’t be modified directly. Add or remove the corresponding relationship in the \"Relationships\" tab", + // TODO New key - Add a translation + "item.edit.metadata.edit.buttons.virtual": "This is a virtual metadata value, i.e. a value inherited from a related entity. It can’t be modified directly. Add or remove the corresponding relationship in the \"Relationships\" tab", + // "item.edit.metadata.empty": "The item currently doesn't contain any metadata. Click Add to start adding a metadata value.", "item.edit.metadata.empty": "Attualmente l'item non contiene metadati. Fai clic su Aggiungi per iniziare ad aggiungere il valore di un metadata.", @@ -2966,6 +3329,10 @@ // "item.edit.metadata.headers.value": "Value", "item.edit.metadata.headers.value": "Valore", + // "item.edit.metadata.metadatafield.error": "An error occurred validating the metadata field", + // TODO New key - Add a translation + "item.edit.metadata.metadatafield.error": "An error occurred validating the metadata field", + // "item.edit.metadata.metadatafield.invalid": "Please choose a valid metadata field", "item.edit.metadata.metadatafield.invalid": "Scegli un campo di metadati valido", @@ -3001,6 +3368,10 @@ // "item.edit.metadata.reinstate-button": "Undo", "item.edit.metadata.reinstate-button": "Annulla", + // "item.edit.metadata.reset-order-button": "Undo reorder", + // TODO New key - Add a translation + "item.edit.metadata.reset-order-button": "Undo reorder", + // "item.edit.metadata.save-button": "Save", "item.edit.metadata.save-button": "Salva", @@ -3186,6 +3557,9 @@ // "item.edit.tabs.curate.title": "Item Edit - Curate", "item.edit.tabs.curate.title": "Modifica item - Curate", + // "item.edit.curate.title": "Curate Item: {{item}}", + // TODO New key - Add a translation + "item.edit.curate.title": "Curate Item: {{item}}", // "item.edit.tabs.metadata.head": "Metadata", "item.edit.tabs.metadata.head": "Metadati", @@ -3217,7 +3591,8 @@ // "item.edit.tabs.status.buttons.mappedCollections.label": "Manage mapped collections", "item.edit.tabs.status.buttons.mappedCollections.label": "Gestire le collections mappate", - // "item.edit.tabs.status.buttons.move.button": "Move...", + // "item.edit.tabs.status.buttons.move.button": "Move this Item to a different Collection", + // TODO Source message changed - Revise the translation "item.edit.tabs.status.buttons.move.button": "Sposta...", // "item.edit.tabs.status.buttons.move.label": "Move item to another collection", @@ -3248,7 +3623,8 @@ // "item.edit.tabs.status.buttons.unauthorized": "You're not authorized to perform this action", "item.edit.tabs.status.buttons.unauthorized": "Non sei autorizzato a eseguire questa azione", - // "item.edit.tabs.status.buttons.withdraw.button": "Withdraw...", + // "item.edit.tabs.status.buttons.withdraw.button": "Withdraw this item", + // TODO Source message changed - Revise the translation "item.edit.tabs.status.buttons.withdraw.button": "Rimozione...", // "item.edit.tabs.status.buttons.withdraw.label": "Withdraw item from the repository", @@ -3347,6 +3723,38 @@ // "item.truncatable-part.show-less": "Collapse", "item.truncatable-part.show-less": "Riduci", + // "workflow-item.search.result.delete-supervision.modal.header": "Delete Supervision Order", + // TODO New key - Add a translation + "workflow-item.search.result.delete-supervision.modal.header": "Delete Supervision Order", + + // "workflow-item.search.result.delete-supervision.modal.info": "Are you sure you want to delete Supervision Order", + // TODO New key - Add a translation + "workflow-item.search.result.delete-supervision.modal.info": "Are you sure you want to delete Supervision Order", + + // "workflow-item.search.result.delete-supervision.modal.cancel": "Cancel", + // TODO New key - Add a translation + "workflow-item.search.result.delete-supervision.modal.cancel": "Cancel", + + // "workflow-item.search.result.delete-supervision.modal.confirm": "Delete", + // TODO New key - Add a translation + "workflow-item.search.result.delete-supervision.modal.confirm": "Delete", + + // "workflow-item.search.result.notification.deleted.success": "Successfully deleted supervision order \"{{name}}\"", + // TODO New key - Add a translation + "workflow-item.search.result.notification.deleted.success": "Successfully deleted supervision order \"{{name}}\"", + + // "workflow-item.search.result.notification.deleted.failure": "Failed to delete supervision order \"{{name}}\"", + // TODO New key - Add a translation + "workflow-item.search.result.notification.deleted.failure": "Failed to delete supervision order \"{{name}}\"", + + // "workflow-item.search.result.list.element.supervised-by": "Supervised by:", + // TODO New key - Add a translation + "workflow-item.search.result.list.element.supervised-by": "Supervised by:", + + // "workflow-item.search.result.list.element.supervised.remove-tooltip": "Remove supervision group", + // TODO New key - Add a translation + "workflow-item.search.result.list.element.supervised.remove-tooltip": "Remove supervision group", + // "item.page.abstract": "Abstract", @@ -3439,13 +3847,13 @@ // "item.page.bitstreams.collapse": "Collapse", "item.page.bitstreams.collapse": "Riduci", - // "item.page.filesection.original.bundle" : "Original bundle", + // "item.page.filesection.original.bundle": "Original bundle", // TODO New key - Add a translation - "item.page.filesection.original.bundle" : "Original bundle", + "item.page.filesection.original.bundle": "Original bundle", - // "item.page.filesection.license.bundle" : "License bundle", + // "item.page.filesection.license.bundle": "License bundle", // TODO New key - Add a translation - "item.page.filesection.license.bundle" : "License bundle", + "item.page.filesection.license.bundle": "License bundle", // "item.page.return": "Back", "item.page.return": "Indietro", @@ -3490,25 +3898,31 @@ // "item.preview.dc.type": "Type:", "item.preview.dc.type": "Tipologia:", - // "item.preview.oaire.citation.issue" : "Issue", + // "item.preview.oaire.citation.issue": "Issue", + // TODO Source message changed - Revise the translation "item.preview.oaire.citation.issue" : "Fascicolo", - // "item.preview.oaire.citation.volume" : "Volume", + // "item.preview.oaire.citation.volume": "Volume", + // TODO Source message changed - Revise the translation "item.preview.oaire.citation.volume" : "Volume", - // "item.preview.dc.relation.issn" : "ISSN", + // "item.preview.dc.relation.issn": "ISSN", + // TODO Source message changed - Revise the translation "item.preview.dc.relation.issn" : "ISSN", - // "item.preview.dc.identifier.isbn" : "ISBN", + // "item.preview.dc.identifier.isbn": "ISBN", + // TODO Source message changed - Revise the translation "item.preview.dc.identifier.isbn" : "ISBN", // "item.preview.dc.identifier": "Identifier:", "item.preview.dc.identifier": "Identificativo:", - // "item.preview.dc.relation.ispartof" : "Journal or Serie", + // "item.preview.dc.relation.ispartof": "Journal or Serie", + // TODO Source message changed - Revise the translation "item.preview.dc.relation.ispartof" : "Periodico or Serie", - // "item.preview.dc.identifier.doi" : "DOI", + // "item.preview.dc.identifier.doi": "DOI", + // TODO Source message changed - Revise the translation "item.preview.dc.identifier.doi" : "DOI", // "item.preview.person.familyName": "Surname:", @@ -3655,13 +4069,16 @@ // "item.version.create.modal.submitted.text": "The new version is being created. This may take some time if the item has a lot of relationships.", "item.version.create.modal.submitted.text": "La nuova versione è in fase di creazione. Questa operazione potrebbe richiedere un po' di temo se l'item ha molte relazioni.", - // "item.version.create.notification.success" : "New version has been created with version number {{version}}", + // "item.version.create.notification.success": "New version has been created with version number {{version}}", + // TODO Source message changed - Revise the translation "item.version.create.notification.success" : "È stata creata una nuova versione con il numero {{version}}", - // "item.version.create.notification.failure" : "New version has not been created", + // "item.version.create.notification.failure": "New version has not been created", + // TODO Source message changed - Revise the translation "item.version.create.notification.failure" : "Non è stata creata una nuova versione", - // "item.version.create.notification.inProgress" : "A new version cannot be created because there is an inprogress submission in the version history", + // "item.version.create.notification.inProgress": "A new version cannot be created because there is an inprogress submission in the version history", + // TODO Source message changed - Revise the translation "item.version.create.notification.inProgress" : "Non è possibile creare una nuova versione perchè c'è già una submission in progress nella cronologia delle versioni", @@ -3683,21 +4100,135 @@ // "item.version.delete.modal.button.cancel.tooltip": "Do not delete this version", "item.version.delete.modal.button.cancel.tooltip": "Non eliminare questa versione", - // "item.version.delete.notification.success" : "Version number {{version}} has been deleted", + // "item.version.delete.notification.success": "Version number {{version}} has been deleted", + // TODO Source message changed - Revise the translation "item.version.delete.notification.success" : "La versione numero {{version}} è stata eliminata", - // "item.version.delete.notification.failure" : "Version number {{version}} has not been deleted", + // "item.version.delete.notification.failure": "Version number {{version}} has not been deleted", + // TODO Source message changed - Revise the translation "item.version.delete.notification.failure" : "La versione numero {{version}} non è stata eliminata", - // "item.version.edit.notification.success" : "The summary of version number {{version}} has been changed", + // "item.version.edit.notification.success": "The summary of version number {{version}} has been changed", + // TODO Source message changed - Revise the translation "item.version.edit.notification.success" : "Il riepilogo della versione numero {{version}} è stato modificato", - // "item.version.edit.notification.failure" : "The summary of version number {{version}} has not been changed", + // "item.version.edit.notification.failure": "The summary of version number {{version}} has not been changed", + // TODO Source message changed - Revise the translation "item.version.edit.notification.failure" : "Il riepilogo della versione numero {{version}} non è stato modificato", + // "itemtemplate.edit.metadata.add-button": "Add", + // TODO New key - Add a translation + "itemtemplate.edit.metadata.add-button": "Add", + + // "itemtemplate.edit.metadata.discard-button": "Discard", + // TODO New key - Add a translation + "itemtemplate.edit.metadata.discard-button": "Discard", + + // "itemtemplate.edit.metadata.edit.buttons.confirm": "Confirm", + // TODO New key - Add a translation + "itemtemplate.edit.metadata.edit.buttons.confirm": "Confirm", + + // "itemtemplate.edit.metadata.edit.buttons.drag": "Drag to reorder", + // TODO New key - Add a translation + "itemtemplate.edit.metadata.edit.buttons.drag": "Drag to reorder", + + // "itemtemplate.edit.metadata.edit.buttons.edit": "Edit", + // TODO New key - Add a translation + "itemtemplate.edit.metadata.edit.buttons.edit": "Edit", + + // "itemtemplate.edit.metadata.edit.buttons.remove": "Remove", + // TODO New key - Add a translation + "itemtemplate.edit.metadata.edit.buttons.remove": "Remove", + + // "itemtemplate.edit.metadata.edit.buttons.undo": "Undo changes", + // TODO New key - Add a translation + "itemtemplate.edit.metadata.edit.buttons.undo": "Undo changes", + + // "itemtemplate.edit.metadata.edit.buttons.unedit": "Stop editing", + // TODO New key - Add a translation + "itemtemplate.edit.metadata.edit.buttons.unedit": "Stop editing", + + // "itemtemplate.edit.metadata.empty": "The item template currently doesn't contain any metadata. Click Add to start adding a metadata value.", + // TODO New key - Add a translation + "itemtemplate.edit.metadata.empty": "The item template currently doesn't contain any metadata. Click Add to start adding a metadata value.", + + // "itemtemplate.edit.metadata.headers.edit": "Edit", + // TODO New key - Add a translation + "itemtemplate.edit.metadata.headers.edit": "Edit", + + // "itemtemplate.edit.metadata.headers.field": "Field", + // TODO New key - Add a translation + "itemtemplate.edit.metadata.headers.field": "Field", + + // "itemtemplate.edit.metadata.headers.language": "Lang", + // TODO New key - Add a translation + "itemtemplate.edit.metadata.headers.language": "Lang", + + // "itemtemplate.edit.metadata.headers.value": "Value", + // TODO New key - Add a translation + "itemtemplate.edit.metadata.headers.value": "Value", + + // "itemtemplate.edit.metadata.metadatafield.error": "An error occurred validating the metadata field", + // TODO New key - Add a translation + "itemtemplate.edit.metadata.metadatafield.error": "An error occurred validating the metadata field", + + // "itemtemplate.edit.metadata.metadatafield.invalid": "Please choose a valid metadata field", + // TODO New key - Add a translation + "itemtemplate.edit.metadata.metadatafield.invalid": "Please choose a valid metadata field", + + // "itemtemplate.edit.metadata.notifications.discarded.content": "Your changes were discarded. To reinstate your changes click the 'Undo' button", + // TODO New key - Add a translation + "itemtemplate.edit.metadata.notifications.discarded.content": "Your changes were discarded. To reinstate your changes click the 'Undo' button", + + // "itemtemplate.edit.metadata.notifications.discarded.title": "Changes discarded", + // TODO New key - Add a translation + "itemtemplate.edit.metadata.notifications.discarded.title": "Changes discarded", + + // "itemtemplate.edit.metadata.notifications.error.title": "An error occurred", + // TODO New key - Add a translation + "itemtemplate.edit.metadata.notifications.error.title": "An error occurred", + + // "itemtemplate.edit.metadata.notifications.invalid.content": "Your changes were not saved. Please make sure all fields are valid before you save.", + // TODO New key - Add a translation + "itemtemplate.edit.metadata.notifications.invalid.content": "Your changes were not saved. Please make sure all fields are valid before you save.", + + // "itemtemplate.edit.metadata.notifications.invalid.title": "Metadata invalid", + // TODO New key - Add a translation + "itemtemplate.edit.metadata.notifications.invalid.title": "Metadata invalid", + + // "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", + // TODO New key - Add a translation + "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.title": "Changes outdated", + // TODO New key - Add a translation + "itemtemplate.edit.metadata.notifications.outdated.title": "Changes outdated", + + // "itemtemplate.edit.metadata.notifications.saved.content": "Your changes to this item template's metadata were saved.", + // TODO New key - Add a translation + "itemtemplate.edit.metadata.notifications.saved.content": "Your changes to this item template's metadata were saved.", + + // "itemtemplate.edit.metadata.notifications.saved.title": "Metadata saved", + // TODO New key - Add a translation + "itemtemplate.edit.metadata.notifications.saved.title": "Metadata saved", + + // "itemtemplate.edit.metadata.reinstate-button": "Undo", + // TODO New key - Add a translation + "itemtemplate.edit.metadata.reinstate-button": "Undo", + + // "itemtemplate.edit.metadata.reset-order-button": "Undo reorder", + // TODO New key - Add a translation + "itemtemplate.edit.metadata.reset-order-button": "Undo reorder", + + // "itemtemplate.edit.metadata.save-button": "Save", + // TODO New key - Add a translation + "itemtemplate.edit.metadata.save-button": "Save", + + + // "journal.listelement.badge": "Journal", "journal.listelement.badge": "Periodico", @@ -4278,6 +4809,10 @@ // "mydspace.show.workspace": "Your Submissions", "mydspace.show.workspace": "I tuoi contributi", + // "mydspace.show.supervisedWorkspace": "Supervised items", + // TODO New key - Add a translation + "mydspace.show.supervisedWorkspace": "Supervised items", + // "mydspace.status.archived": "Archived", "mydspace.status.archived": "Archiviati", @@ -4319,6 +4854,10 @@ // "nav.community-browse.header": "By Community", "nav.community-browse.header": "Per Community", + // "nav.context-help-toggle": "Toggle context help", + // TODO New key - Add a translation + "nav.context-help-toggle": "Toggle context help", + // "nav.language": "Language switch", "nav.language": "Cambio di lingua", @@ -4345,19 +4884,28 @@ // "nav.search": "Search", "nav.search": "Ricerca", + // "nav.search.button": "Submit search", + // TODO New key - Add a translation + "nav.search.button": "Submit search", + + // "nav.statistics.header": "Statistics", "nav.statistics.header": "Statistica", // "nav.stop-impersonating": "Stop impersonating EPerson", "nav.stop-impersonating": "Smetti di impersonare EPerson", - // "nav.toggle" : "Toggle navigation", + // "nav.subscriptions": "Subscriptions", // TODO New key - Add a translation - "nav.toggle" : "Toggle navigation", + "nav.subscriptions": "Subscriptions", - // "nav.user.description" : "User profile bar", + // "nav.toggle": "Toggle navigation", // TODO New key - Add a translation - "nav.user.description" : "User profile bar", + "nav.toggle": "Toggle navigation", + + // "nav.user.description": "User profile bar", + // TODO New key - Add a translation + "nav.user.description": "User profile bar", // "none.listelement.badge": "Item", "none.listelement.badge": "Articolo", @@ -4512,6 +5060,10 @@ // "process.new.notification.error.content": "An error occurred while creating this process", "process.new.notification.error.content": "Si è verificato un errore durante la creazione di questo processo", + // "process.new.notification.error.max-upload.content": "The file exceeds the maximum upload size", + // TODO New key - Add a translation + "process.new.notification.error.max-upload.content": "The file exceeds the maximum upload size", + // "process.new.header": "Create a new process", "process.new.header": "Creare un nuovo processo", @@ -4523,21 +5075,21 @@ - // "process.detail.arguments" : "Arguments", + // "process.detail.arguments": "Arguments", // TODO New key - Add a translation - "process.detail.arguments" : "Arguments", + "process.detail.arguments": "Arguments", - // "process.detail.arguments.empty" : "This process doesn't contain any arguments", + // "process.detail.arguments.empty": "This process doesn't contain any arguments", // TODO New key - Add a translation - "process.detail.arguments.empty" : "This process doesn't contain any arguments", + "process.detail.arguments.empty": "This process doesn't contain any arguments", - // "process.detail.back" : "Back", + // "process.detail.back": "Back", // TODO New key - Add a translation - "process.detail.back" : "Back", + "process.detail.back": "Back", - // "process.detail.output" : "Process Output", + // "process.detail.output": "Process Output", // TODO New key - Add a translation - "process.detail.output" : "Process Output", + "process.detail.output": "Process Output", // "process.detail.logs.button": "Retrieve process output", "process.detail.logs.button": "Recupera l'output del processo", @@ -4548,37 +5100,37 @@ // "process.detail.logs.none": "This process has no output", "process.detail.logs.none": "Questo processo non ha output", - // "process.detail.output-files" : "Output Files", + // "process.detail.output-files": "Output Files", // TODO New key - Add a translation - "process.detail.output-files" : "Output Files", + "process.detail.output-files": "Output Files", - // "process.detail.output-files.empty" : "This process doesn't contain any output files", + // "process.detail.output-files.empty": "This process doesn't contain any output files", // TODO New key - Add a translation - "process.detail.output-files.empty" : "This process doesn't contain any output files", + "process.detail.output-files.empty": "This process doesn't contain any output files", - // "process.detail.script" : "Script", + // "process.detail.script": "Script", // TODO New key - Add a translation - "process.detail.script" : "Script", + "process.detail.script": "Script", - // "process.detail.title" : "Process: {{ id }} - {{ name }}", + // "process.detail.title": "Process: {{ id }} - {{ name }}", // TODO New key - Add a translation - "process.detail.title" : "Process: {{ id }} - {{ name }}", + "process.detail.title": "Process: {{ id }} - {{ name }}", - // "process.detail.start-time" : "Start time", + // "process.detail.start-time": "Start time", // TODO New key - Add a translation - "process.detail.start-time" : "Start time", + "process.detail.start-time": "Start time", - // "process.detail.end-time" : "Finish time", + // "process.detail.end-time": "Finish time", // TODO New key - Add a translation - "process.detail.end-time" : "Finish time", + "process.detail.end-time": "Finish time", - // "process.detail.status" : "Status", + // "process.detail.status": "Status", // TODO New key - Add a translation - "process.detail.status" : "Status", + "process.detail.status": "Status", - // "process.detail.create" : "Create similar process", + // "process.detail.create": "Create similar process", // TODO New key - Add a translation - "process.detail.create" : "Create similar process", + "process.detail.create": "Create similar process", // "process.detail.actions": "Actions", // TODO New key - Add a translation @@ -4614,29 +5166,29 @@ - // "process.overview.table.finish" : "Finish time (UTC)", + // "process.overview.table.finish": "Finish time (UTC)", // TODO New key - Add a translation - "process.overview.table.finish" : "Finish time (UTC)", + "process.overview.table.finish": "Finish time (UTC)", - // "process.overview.table.id" : "Process ID", + // "process.overview.table.id": "Process ID", // TODO New key - Add a translation - "process.overview.table.id" : "Process ID", + "process.overview.table.id": "Process ID", - // "process.overview.table.name" : "Name", + // "process.overview.table.name": "Name", // TODO New key - Add a translation - "process.overview.table.name" : "Name", + "process.overview.table.name": "Name", - // "process.overview.table.start" : "Start time (UTC)", + // "process.overview.table.start": "Start time (UTC)", // TODO New key - Add a translation - "process.overview.table.start" : "Start time (UTC)", + "process.overview.table.start": "Start time (UTC)", - // "process.overview.table.status" : "Status", + // "process.overview.table.status": "Status", // TODO New key - Add a translation - "process.overview.table.status" : "Status", + "process.overview.table.status": "Status", - // "process.overview.table.user" : "User", + // "process.overview.table.user": "User", // TODO New key - Add a translation - "process.overview.table.user" : "User", + "process.overview.table.user": "User", // "process.overview.title": "Processes Overview", "process.overview.title": "Panoramica dei processi", @@ -4947,8 +5499,13 @@ // "register-page.registration.email.error.required": "Please fill in an email address", "register-page.registration.email.error.required": "Inserire un indirizzo e-mail", - // "register-page.registration.email.error.pattern": "Please fill in a valid email address", - "register-page.registration.email.error.pattern": "Si prega di inserire un indirizzo e-mail valido", + // "register-page.registration.email.error.not-email-form": "Please fill in a valid email address.", + // TODO New key - Add a translation + "register-page.registration.email.error.not-email-form": "Please fill in a valid email address.", + + // "register-page.registration.email.error.not-valid-domain": "Use email with allowed domains: {{ domains }}", + // TODO New key - Add a translation + "register-page.registration.email.error.not-valid-domain": "Use email with allowed domains: {{ domains }}", // "register-page.registration.email.hint": "This address will be verified and used as your login name.", "register-page.registration.email.hint": "Questo indirizzo verrà verificato e utilizzato come nome di accesso.", @@ -4976,6 +5533,10 @@ // "register-page.registration.google-recaptcha.must-accept-cookies": "In order to register you must accept the Registration and Password recovery (Google reCaptcha) cookies.", // TODO New key - Add a translation "register-page.registration.google-recaptcha.must-accept-cookies": "In order to register you must accept the Registration and Password recovery (Google reCaptcha) cookies.", + // "register-page.registration.error.maildomain": "This email address is not on the list of domains who can register. Allowed domains are {{ domains }}", + // TODO New key - Add a translation + "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.google-recaptcha.open-cookie-settings": "Open cookie settings", // TODO New key - Add a translation @@ -4992,6 +5553,9 @@ // "register-page.registration.google-recaptcha.notification.message.expired": "Verification expired. Please verify again.", // TODO New key - Add a translation "register-page.registration.google-recaptcha.notification.message.expired": "Verification expired. Please verify again.", + // "register-page.registration.info.maildomain": "Accounts can be registered for mail addresses of the domains", + // TODO New key - Add a translation + "register-page.registration.info.maildomain": "Accounts can be registered for mail addresses of the domains", // "relationships.add.error.relationship-type.content": "No suitable match could be found for relationship type {{ type }} between the two items", "relationships.add.error.relationship-type.content": "Non è stata trovata alcuna corrispondenza adatta per il tipo di relazione {{ type }} tra i due item", @@ -5306,6 +5870,10 @@ // "search.filters.applied.f.birthDate.min": "Start birth date", "search.filters.applied.f.birthDate.min": "Data di nascita iniziale", + // "search.filters.applied.f.supervisedBy": "Supervised by", + // TODO New key - Add a translation + "search.filters.applied.f.supervisedBy": "Supervised by", + // "search.filters.applied.f.withdrawn": "Withdrawn", "search.filters.applied.f.withdrawn": "Ritirato", @@ -5519,6 +6087,22 @@ // "search.filters.filter.submitter.label": "Search submitter", "search.filters.filter.submitter.label": "Mittente della ricerca", + // "search.filters.filter.show-tree": "Browse {{ name }} tree", + // TODO New key - Add a translation + "search.filters.filter.show-tree": "Browse {{ name }} tree", + + // "search.filters.filter.supervisedBy.head": "Supervised By", + // TODO New key - Add a translation + "search.filters.filter.supervisedBy.head": "Supervised By", + + // "search.filters.filter.supervisedBy.placeholder": "Supervised By", + // TODO New key - Add a translation + "search.filters.filter.supervisedBy.placeholder": "Supervised By", + + // "search.filters.filter.supervisedBy.label": "Search Supervised By", + // TODO New key - Add a translation + "search.filters.filter.supervisedBy.label": "Search Supervised By", + // "search.filters.entityType.JournalIssue": "Journal Issue", @@ -5709,6 +6293,10 @@ // TODO New key - Add a translation "statistics.table.header.views": "Views", + // "statistics.table.no-name": "(object name could not be loaded)", + // TODO New key - Add a translation + "statistics.table.no-name": "(object name could not be loaded)", + // "submission.edit.breadcrumbs": "Edit Submission", @@ -5814,6 +6402,10 @@ // "submission.import-external.source.crossref": "CrossRef", "submission.import-external.source.crossref": "CrossRef", + // "submission.import-external.source.datacite": "DataCite", + // TODO New key - Add a translation + "submission.import-external.source.datacite": "DataCite", + // "submission.import-external.source.scielo": "SciELO", "submission.import-external.source.scielo": "SciELO", @@ -6135,6 +6727,10 @@ // "submission.sections.describe.relationship-lookup.search-tab.tab-title.isFundingAgencyOfProject": "Funder of the Project", "submission.sections.describe.relationship-lookup.search-tab.tab-title.isFundingAgencyOfProject": "Finanziatore del progetto", + // "submission.sections.describe.relationship-lookup.search-tab.tab-title.isPublicationOfAuthor": "Publication of the Author", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.search-tab.tab-title.isPublicationOfAuthor": "Publication of the Author", + // "submission.sections.describe.relationship-lookup.selection-tab.title.openAIREFunding": "Funding OpenAIRE API", "submission.sections.describe.relationship-lookup.selection-tab.title.openAIREFunding": "Finanziamento dell'API OpenAIRE", @@ -6201,6 +6797,10 @@ // "submission.sections.describe.relationship-lookup.title.isChildOrgUnitOf": "Parent Organizational Unit", "submission.sections.describe.relationship-lookup.title.isChildOrgUnitOf": "Unità organizzativa padre", + // "submission.sections.describe.relationship-lookup.title.isPublicationOfAuthor": "Publication", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.title.isPublicationOfAuthor": "Publication", + // "submission.sections.describe.relationship-lookup.search-tab.toggle-dropdown": "Toggle dropdown", "submission.sections.describe.relationship-lookup.search-tab.toggle-dropdown": "Toggle dropdown", @@ -6294,7 +6894,8 @@ // "submission.sections.describe.relationship-lookup.selection-tab.title": "Search Results", "submission.sections.describe.relationship-lookup.selection-tab.title": "Risultati della ricerca", - // "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 Source message changed - Revise the translation "submission.sections.describe.relationship-lookup.name-variant.notification.content": "Desideri salvare \"{{ value }}\" come variante del nome per questa persona in modo che tu e altri possiate riutilizzarlo per immissioni future? Se non lo fai, puoi comunque usarlo per questa immissione.", // "submission.sections.describe.relationship-lookup.name-variant.notification.confirm": "Save a new name variant", @@ -6372,7 +6973,29 @@ // "submission.sections.general.sections_not_valid": "There are incomplete sections.", "submission.sections.general.sections_not_valid": "Ci sono sezioni incomplete.", + // "submission.sections.identifiers.info": "The following identifiers will be created for your item:", + // TODO New key - Add a translation + "submission.sections.identifiers.info": "The following identifiers will be created for your item:", + // "submission.sections.identifiers.no_handle": "No handles have been minted for this item.", + // TODO New key - Add a translation + "submission.sections.identifiers.no_handle": "No handles have been minted for this item.", + + // "submission.sections.identifiers.no_doi": "No DOIs have been minted for this item.", + // TODO New key - Add a translation + "submission.sections.identifiers.no_doi": "No DOIs have been minted for this item.", + + // "submission.sections.identifiers.handle_label": "Handle: ", + // TODO New key - Add a translation + "submission.sections.identifiers.handle_label": "Handle: ", + + // "submission.sections.identifiers.doi_label": "DOI: ", + // TODO New key - Add a translation + "submission.sections.identifiers.doi_label": "DOI: ", + + // "submission.sections.identifiers.otherIdentifiers_label": "Other identifiers: ", + // TODO New key - Add a translation + "submission.sections.identifiers.otherIdentifiers_label": "Other identifiers: ", // "submission.sections.submit.progressbar.accessCondition": "Item access conditions", "submission.sections.submit.progressbar.accessCondition": "Condizioni di accesso all'item", @@ -6395,6 +7018,10 @@ // "submission.sections.submit.progressbar.detect-duplicate": "Potential duplicates", "submission.sections.submit.progressbar.detect-duplicate": "Potenziali duplicati", + // "submission.sections.submit.progressbar.identifiers": "Identifiers", + // TODO New key - Add a translation + "submission.sections.submit.progressbar.identifiers": "Identifiers", + // "submission.sections.submit.progressbar.license": "Deposit license", "submission.sections.submit.progressbar.license": "Licenza di deposito", @@ -6523,7 +7150,8 @@ // TODO New key - Add a translation "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.info": "Here you will find all the files currently in the item. You can update the file metadata and access conditions or upload additional files just dragging & dropping them everywhere in the page", + // "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 upload additional files by dragging & dropping them anywhere on the page.", + // TODO Source message changed - Revise the translation "submission.sections.upload.info": "Qui troverai tutti i file attualmente presenti nell'articolo. È possibile aggiornare i metadati dei file e le condizioni di accesso o upload di file aggiuntivi semplicemente trascinandoli e rilasciandoli ovunque nella pagina", // "submission.sections.upload.no-entry": "No", @@ -6597,9 +7225,9 @@ // TODO New key - Add a translation "submission.sections.license.required": "You must accept the license", - // "submission.sections.license.notgranted": "You must accept the license", + // "submission.sections.license.notgranted": "You must accept the license", // TODO New key - Add a translation - "submission.sections.license.notgranted": "You must accept the license", + "submission.sections.license.notgranted": "You must accept the license", // "submission.sections.sherpa.publication.information": "Publication information", @@ -6719,7 +7347,8 @@ // "submission.workflow.generic.delete": "Delete", "submission.workflow.generic.delete": "Elimina", - // "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": "Select this option to discard this item. You will then be asked to confirm it.", + // TODO Source message changed - Revise the translation "submission.workflow.generic.delete-help": "Se si desidera eliminare questo item, selezionare \"Elimina\". Ti verrà quindi chiesto di confermarlo.", // "submission.workflow.generic.edit": "Edit", @@ -6735,6 +7364,23 @@ "submission.workflow.generic.view-help": "Selezionare questa opzione per visualizzare i metadati dell'item.", + // "submission.workflow.generic.submit_select_reviewer": "Select Reviewer", + // TODO New key - Add a translation + "submission.workflow.generic.submit_select_reviewer": "Select Reviewer", + + // "submission.workflow.generic.submit_select_reviewer-help": "", + // TODO New key - Add a translation + "submission.workflow.generic.submit_select_reviewer-help": "", + + + // "submission.workflow.generic.submit_score": "Rate", + // TODO New key - Add a translation + "submission.workflow.generic.submit_score": "Rate", + + // "submission.workflow.generic.submit_score-help": "", + // TODO New key - Add a translation + "submission.workflow.generic.submit_score-help": "", + // "submission.workflow.tasks.claimed.approve": "Approve", "submission.workflow.tasks.claimed.approve": "Approva", @@ -6748,6 +7394,14 @@ // "submission.workflow.tasks.claimed.edit_help": "Select this option to change the item's metadata.", "submission.workflow.tasks.claimed.edit_help": "Selezionare questa opzione per modificare i metadati dell'item.", + // "submission.workflow.tasks.claimed.decline": "Decline", + // TODO New key - Add a translation + "submission.workflow.tasks.claimed.decline": "Decline", + + // "submission.workflow.tasks.claimed.decline_help": "", + // TODO New key - Add a translation + "submission.workflow.tasks.claimed.decline_help": "", + // "submission.workflow.tasks.claimed.reject.reason.info": "Please enter your reason for rejecting the submission into the box below, indicating whether the submitter may fix a problem and resubmit.", "submission.workflow.tasks.claimed.reject.reason.info": "Se hai esaminato l'item e hai scoperto che non è adatto per essere inserito nella collezione, seleziona \"Rifiuta\". Ti verrà quindi chiesto di inserire un messaggio che indichi perché l'item non è adatto e se chi ha inviato l'item deve cambiare qualcosa e inviarlo di nuovo.", @@ -6808,6 +7462,134 @@ "submission.workspace.generic.view-help": "Seleziona questa opzione per vedere i metadata dell'item.", + // "subscriptions.title": "Subscriptions", + "subscriptions.title": "Sottoscrizioni", + + // "subscriptions.item": "Subscriptions for items", + "subscriptions.item": "Sottoscrizioni per articoli", + + // "subscriptions.collection": "Subscriptions for collections", + "subscriptions.collection": "Sottoscrizioni per collezioni", + + // "subscriptions.community": "Subscriptions for communities", + "subscriptions.community": "Sottoscrizioni per community", + + // "subscriptions.subscription_type": "Subscription type", + "subscriptions.subscription_type": "Tipo di sottoscrizione", + + // "subscriptions.frequency": "Subscription frequency", + "subscriptions.frequency": "Frequenza di sottoscrizione", + + // "subscriptions.frequency.D": "Daily", + "subscriptions.frequency.D": "Giornaliero", + + // "subscriptions.frequency.M": "Monthly", + "subscriptions.frequency.M": "Mensile", + + // "subscriptions.frequency.W": "Weekly", + "subscriptions.frequency.W": "Settimanale", + + // "subscriptions.tooltip": "Subscribe", + // TODO New key - Add a translation + "subscriptions.tooltip": "Subscribe", + + // "subscriptions.modal.title": "Subscriptions", + // TODO New key - Add a translation + "subscriptions.modal.title": "Subscriptions", + + // "subscriptions.modal.type-frequency": "Type and frequency", + // TODO New key - Add a translation + "subscriptions.modal.type-frequency": "Type and frequency", + + // "subscriptions.modal.close": "Close", + // TODO New key - Add a translation + "subscriptions.modal.close": "Close", + + // "subscriptions.modal.delete-info": "To remove this subscription, please visit the \"Subscriptions\" page under your user profile", + // TODO New key - Add a translation + "subscriptions.modal.delete-info": "To remove this subscription, please visit the \"Subscriptions\" page under your user profile", + + // "subscriptions.modal.new-subscription-form.type.content": "Content", + // TODO New key - Add a translation + "subscriptions.modal.new-subscription-form.type.content": "Content", + + // "subscriptions.modal.new-subscription-form.frequency.D": "Daily", + // TODO New key - Add a translation + "subscriptions.modal.new-subscription-form.frequency.D": "Daily", + + // "subscriptions.modal.new-subscription-form.frequency.W": "Weekly", + // TODO New key - Add a translation + "subscriptions.modal.new-subscription-form.frequency.W": "Weekly", + + // "subscriptions.modal.new-subscription-form.frequency.M": "Monthly", + // TODO New key - Add a translation + "subscriptions.modal.new-subscription-form.frequency.M": "Monthly", + + // "subscriptions.modal.new-subscription-form.submit": "Submit", + // TODO New key - Add a translation + "subscriptions.modal.new-subscription-form.submit": "Submit", + + // "subscriptions.modal.new-subscription-form.processing": "Processing...", + // TODO New key - Add a translation + "subscriptions.modal.new-subscription-form.processing": "Processing...", + + // "subscriptions.modal.create.success": "Subscribed to {{ type }} successfully.", + // TODO New key - Add a translation + "subscriptions.modal.create.success": "Subscribed to {{ type }} successfully.", + + // "subscriptions.modal.delete.success": "Subscription deleted successfully", + // TODO New key - Add a translation + "subscriptions.modal.delete.success": "Subscription deleted successfully", + + // "subscriptions.modal.update.success": "Subscription to {{ type }} updated successfully", + // TODO New key - Add a translation + "subscriptions.modal.update.success": "Subscription to {{ type }} updated successfully", + + // "subscriptions.modal.create.error": "An error occurs during the subscription creation", + // TODO New key - Add a translation + "subscriptions.modal.create.error": "An error occurs during the subscription creation", + + // "subscriptions.modal.delete.error": "An error occurs during the subscription delete", + // TODO New key - Add a translation + "subscriptions.modal.delete.error": "An error occurs during the subscription delete", + + // "subscriptions.modal.update.error": "An error occurs during the subscription update", + // TODO New key - Add a translation + "subscriptions.modal.update.error": "An error occurs during the subscription update", + + // "subscriptions.table.dso": "Subject", + "subscriptions.table.dso": "Oggetto", + + // "subscriptions.table.subscription_type": "Subscription Type", + "subscriptions.table.subscription_type": "Tipo di sottoscrizione", + + // "subscriptions.table.subscription_frequency": "Subscription Frequency", + "subscriptions.table.subscription_frequency": "Frequenza di sottoscrizione", + + // "subscriptions.table.action": "Action", + "subscriptions.table.action": "Azione", + + // "subscriptions.table.edit": "Edit", + // TODO New key - Add a translation + "subscriptions.table.edit": "Edit", + + // "subscriptions.table.delete": "Delete", + // TODO New key - Add a translation + "subscriptions.table.delete": "Delete", + + // "subscriptions.table.not-available": "Not available", + // TODO New key - Add a translation + "subscriptions.table.not-available": "Not available", + + // "subscriptions.table.not-available-message": "The subscribed item has been deleted, or you don't currently have the permission to view it", + // TODO New key - Add a translation + "subscriptions.table.not-available-message": "The subscribed item has been deleted, or you don't currently have the permission to view it", + + // "subscriptions.table.empty.message": "You do not have any subscriptions at this time. To subscribe to email updates for a Community or Collection, use the subscription button on the object's page.", + // TODO Source message changed - Revise the translation + "subscriptions.table.empty.message": "Non hai ancora sottoscritto alcuna notifica. Per sottoscrivere la notifica relativa a un oggetto, usa il menu contestuale nella pagina di dettaglio dell'oggetto", + + // "thumbnail.default.alt": "Thumbnail Image", "thumbnail.default.alt": "Immagine di anteprima", @@ -6835,8 +7617,7 @@ // "title": "DSpace", - // TODO Source message changed - Revise the translation - "title": "DSpace-CRIS", + "title": "DSpace", @@ -6861,7 +7642,9 @@ // "vocabulary-treeview.tree.description.srsc": "Research Subject Categories", "vocabulary-treeview.tree.description.srsc": "Categorie di argomenti di ricerca", - + // "vocabulary-treeview.info": "Select a subject to add as search filter", + // TODO New key - Add a translation + "vocabulary-treeview.info": "Select a subject to add as search filter", // "uploader.browse": "browse", "uploader.browse": "sfoglia", @@ -6893,6 +7676,10 @@ + // "supervisedWorkspace.search.results.head": "Supervised Items", + // TODO New key - Add a translation + "supervisedWorkspace.search.results.head": "Supervised Items", + // "workspace.search.results.head": "Your submissions", "workspace.search.results.head": "I tuoi invii", @@ -6902,6 +7689,10 @@ // "workflow.search.results.head": "Workflow tasks", "workflow.search.results.head": "Task del workflow", + // "supervision.search.results.head": "Workflow and Workspace tasks", + // TODO New key - Add a translation + "supervision.search.results.head": "Workflow and Workspace tasks", + // "workflow-item.edit.breadcrumbs": "Edit workflowitem", @@ -6968,6 +7759,77 @@ // "workspace-item.view.title": "Workspace View", "workspace-item.view.title": "Vista Workspace", + + // "workflow-item.advanced.title": "Advanced workflow", + // TODO New key - Add a translation + "workflow-item.advanced.title": "Advanced workflow", + + + // "workflow-item.selectrevieweraction.notification.success.title": "Selected reviewer", + // TODO New key - Add a translation + "workflow-item.selectrevieweraction.notification.success.title": "Selected reviewer", + + // "workflow-item.selectrevieweraction.notification.success.content": "The reviewer for this workflow item has been successfully selected", + // TODO New key - Add a translation + "workflow-item.selectrevieweraction.notification.success.content": "The reviewer for this workflow item has been successfully selected", + + // "workflow-item.selectrevieweraction.notification.error.title": "Something went wrong", + // TODO New key - Add a translation + "workflow-item.selectrevieweraction.notification.error.title": "Something went wrong", + + // "workflow-item.selectrevieweraction.notification.error.content": "Couldn't select the reviewer for this workflow item", + // TODO New key - Add a translation + "workflow-item.selectrevieweraction.notification.error.content": "Couldn't select the reviewer for this workflow item", + + // "workflow-item.selectrevieweraction.title": "Select Reviewer", + // TODO New key - Add a translation + "workflow-item.selectrevieweraction.title": "Select Reviewer", + + // "workflow-item.selectrevieweraction.header": "Select Reviewer", + // TODO New key - Add a translation + "workflow-item.selectrevieweraction.header": "Select Reviewer", + + // "workflow-item.selectrevieweraction.button.cancel": "Cancel", + // TODO New key - Add a translation + "workflow-item.selectrevieweraction.button.cancel": "Cancel", + + // "workflow-item.selectrevieweraction.button.confirm": "Confirm", + // TODO New key - Add a translation + "workflow-item.selectrevieweraction.button.confirm": "Confirm", + + + // "workflow-item.scorereviewaction.notification.success.title": "Rating review", + // TODO New key - Add a translation + "workflow-item.scorereviewaction.notification.success.title": "Rating review", + + // "workflow-item.scorereviewaction.notification.success.content": "The rating for this item workflow item has been successfully submitted", + // TODO New key - Add a translation + "workflow-item.scorereviewaction.notification.success.content": "The rating for this item workflow item has been successfully submitted", + + // "workflow-item.scorereviewaction.notification.error.title": "Something went wrong", + // TODO New key - Add a translation + "workflow-item.scorereviewaction.notification.error.title": "Something went wrong", + + // "workflow-item.scorereviewaction.notification.error.content": "Couldn't rate this item", + // TODO New key - Add a translation + "workflow-item.scorereviewaction.notification.error.content": "Couldn't rate this item", + + // "workflow-item.scorereviewaction.title": "Rate this item", + // TODO New key - Add a translation + "workflow-item.scorereviewaction.title": "Rate this item", + + // "workflow-item.scorereviewaction.header": "Rate this item", + // TODO New key - Add a translation + "workflow-item.scorereviewaction.header": "Rate this item", + + // "workflow-item.scorereviewaction.button.cancel": "Cancel", + // TODO New key - Add a translation + "workflow-item.scorereviewaction.button.cancel": "Cancel", + + // "workflow-item.scorereviewaction.button.confirm": "Confirm", + // TODO New key - Add a translation + "workflow-item.scorereviewaction.button.confirm": "Confirm", + // "idle-modal.header": "Session will expire soon", "idle-modal.header": "La sessione scadrà presto", @@ -6980,7 +7842,8 @@ // "idle-modal.extend-session": "Extend session", "idle-modal.extend-session": "Estendi sessione", - // "researcher.profile.action.processing" : "Processing...", + // "researcher.profile.action.processing": "Processing...", + // TODO Source message changed - Revise the translation "researcher.profile.action.processing" : "Elaborazione...", // "researcher.profile.associated": "Researcher profile associated", @@ -7013,10 +7876,12 @@ // "researcher.profile.view": "View", "researcher.profile.view": "Visualizza", - // "researcher.profile.private.visibility" : "PRIVATE", + // "researcher.profile.private.visibility": "PRIVATE", + // TODO Source message changed - Revise the translation "researcher.profile.private.visibility" : "PRIVATO", - // "researcher.profile.public.visibility" : "PUBLIC", + // "researcher.profile.public.visibility": "PUBLIC", + // TODO Source message changed - Revise the translation "researcher.profile.public.visibility" : "PUBBLICO", // "researcher.profile.status": "Status:", @@ -7025,16 +7890,20 @@ // "researcherprofile.claim.not-authorized": "You are not authorized to claim this item. For more details contact the administrator(s).", "researcherprofile.claim.not-authorized": "Non sei autorizzato a richiedere questo item. Per maggiori dettagli contattare l'amministratore/i", - // "researcherprofile.error.claim.body" : "An error occurred while claiming the profile, please try again later", + // "researcherprofile.error.claim.body": "An error occurred while claiming the profile, please try again later", + // TODO Source message changed - Revise the translation "researcherprofile.error.claim.body" : "Si è verificato un errore durante l'associazione del profilo, prova più tardi", - // "researcherprofile.error.claim.title" : "Error", + // "researcherprofile.error.claim.title": "Error", + // TODO Source message changed - Revise the translation "researcherprofile.error.claim.title" : "Errore", - // "researcherprofile.success.claim.body" : "Profile claimed with success", + // "researcherprofile.success.claim.body": "Profile claimed with success", + // TODO Source message changed - Revise the translation "researcherprofile.success.claim.body" : "Profilo associato con successo", - // "researcherprofile.success.claim.title" : "Success", + // "researcherprofile.success.claim.title": "Success", + // TODO Source message changed - Revise the translation "researcherprofile.success.claim.title" : "Successo", // "person.page.orcid.create": "Create an ORCID ID", @@ -7043,7 +7912,8 @@ // "person.page.orcid.granted-authorizations": "Granted authorizations", "person.page.orcid.granted-authorizations": "Autorizzazioni concesse", - // "person.page.orcid.grant-authorizations" : "Grant authorizations", + // "person.page.orcid.grant-authorizations": "Grant authorizations", + // TODO Source message changed - Revise the translation "person.page.orcid.grant-authorizations" : "Concedere autorizzazioni", // "person.page.orcid.link": "Connect to ORCID ID", @@ -7091,43 +7961,56 @@ // "person.page.orcid.save.preference.changes": "Update settings", "person.page.orcid.save.preference.changes": "Impostazioni di aggiornamento", - // "person.page.orcid.sync-profile.affiliation" : "Affiliation", + // "person.page.orcid.sync-profile.affiliation": "Affiliation", + // TODO Source message changed - Revise the translation "person.page.orcid.sync-profile.affiliation" : "Affiliazione", - // "person.page.orcid.sync-profile.biographical" : "Biographical data", + // "person.page.orcid.sync-profile.biographical": "Biographical data", + // TODO Source message changed - Revise the translation "person.page.orcid.sync-profile.biographical" : "Riferimenti biografici", - // "person.page.orcid.sync-profile.education" : "Education", + // "person.page.orcid.sync-profile.education": "Education", + // TODO Source message changed - Revise the translation "person.page.orcid.sync-profile.education" : "Educazione", - // "person.page.orcid.sync-profile.identifiers" : "Identifiers", + // "person.page.orcid.sync-profile.identifiers": "Identifiers", + // TODO Source message changed - Revise the translation "person.page.orcid.sync-profile.identifiers" : "Identificativi", - // "person.page.orcid.sync-fundings.all" : "All fundings", + // "person.page.orcid.sync-fundings.all": "All fundings", + // TODO Source message changed - Revise the translation "person.page.orcid.sync-fundings.all" : "Tutti i finanziamenti", - // "person.page.orcid.sync-fundings.mine" : "My fundings", + // "person.page.orcid.sync-fundings.mine": "My fundings", + // TODO Source message changed - Revise the translation "person.page.orcid.sync-fundings.mine" : "I miei finanziamenti", - // "person.page.orcid.sync-fundings.my_selected" : "Selected fundings", + // "person.page.orcid.sync-fundings.my_selected": "Selected fundings", + // TODO Source message changed - Revise the translation "person.page.orcid.sync-fundings.my_selected" : "Finanziamenti selezionati", - // "person.page.orcid.sync-fundings.disabled" : "Disabled", + // "person.page.orcid.sync-fundings.disabled": "Disabled", + // TODO Source message changed - Revise the translation "person.page.orcid.sync-fundings.disabled" : "Disabilitato", - // "person.page.orcid.sync-publications.all" : "All publications", + // "person.page.orcid.sync-publications.all": "All publications", + // TODO Source message changed - Revise the translation "person.page.orcid.sync-publications.all" : "Tutte le pubblicazioni", - // "person.page.orcid.sync-publications.mine" : "My publications", + // "person.page.orcid.sync-publications.mine": "My publications", + // TODO Source message changed - Revise the translation "person.page.orcid.sync-publications.mine" : "Le mie pubblicazioni", - // "person.page.orcid.sync-publications.my_selected" : "Selected publications", + // "person.page.orcid.sync-publications.my_selected": "Selected publications", + // TODO Source message changed - Revise the translation "person.page.orcid.sync-publications.my_selected" : "Pubblicazioni selezionate", - // "person.page.orcid.sync-publications.disabled" : "Disabled", + // "person.page.orcid.sync-publications.disabled": "Disabled", + // TODO Source message changed - Revise the translation "person.page.orcid.sync-publications.disabled" : "Disabilitato", - // "person.page.orcid.sync-queue.discard" : "Discard the change and do not synchronize with the ORCID registry", + // "person.page.orcid.sync-queue.discard": "Discard the change and do not synchronize with the ORCID registry", + // TODO Source message changed - Revise the translation "person.page.orcid.sync-queue.discard" : "Scarta la modifica e non sincronizzarla con il registro ORCID.", // "person.page.orcid.sync-queue.discard.error": "The discarding of the ORCID queue record failed", @@ -7139,13 +8022,16 @@ // "person.page.orcid.sync-queue.empty-message": "The ORCID queue registry is empty", "person.page.orcid.sync-queue.empty-message": "Il Registro di sistema della coda ORCID è vuoto", - // "person.page.orcid.sync-queue.table.header.type" : "Type", + // "person.page.orcid.sync-queue.table.header.type": "Type", + // TODO Source message changed - Revise the translation "person.page.orcid.sync-queue.table.header.type" : "Tipo", - // "person.page.orcid.sync-queue.table.header.description" : "Description", + // "person.page.orcid.sync-queue.table.header.description": "Description", + // TODO Source message changed - Revise the translation "person.page.orcid.sync-queue.table.header.description" : "Descrizione", - // "person.page.orcid.sync-queue.table.header.action" : "Action", + // "person.page.orcid.sync-queue.table.header.action": "Action", + // TODO Source message changed - Revise the translation "person.page.orcid.sync-queue.table.header.action" : "Azione", // "person.page.orcid.sync-queue.description.affiliation": "Affiliations", @@ -7211,7 +8097,8 @@ // "person.page.orcid.sync-queue.tooltip.researcher_urls": "Researcher url", "person.page.orcid.sync-queue.tooltip.researcher_urls": "URL ricercatore", - // "person.page.orcid.sync-queue.send" : "Synchronize with ORCID registry", + // "person.page.orcid.sync-queue.send": "Synchronize with ORCID registry", + // TODO Source message changed - Revise the translation "person.page.orcid.sync-queue.send" : "Sincronizza con il registro ORCID", // "person.page.orcid.sync-queue.send.unauthorized-error.title": "The submission to ORCID failed for missing authorizations.", @@ -7266,7 +8153,8 @@ // "person.page.orcid.sync-queue.send.validation-error.organization.name-required": "The organization's name is required", "person.page.orcid.sync-queue.send.validation-error.organization.name-required": "Il nome dell'organizzazione è obbligatorio", - // "person.page.orcid.sync-queue.send.validation-error.publication.date-invalid" : "The publication date must be one year after 1900", + // "person.page.orcid.sync-queue.send.validation-error.publication.date-invalid": "The publication date must be one year after 1900", + // TODO Source message changed - Revise the translation "person.page.orcid.sync-queue.send.validation-error.publication.date-invalid" : "La data di pubblicazione deve partire dal 1900", // "person.page.orcid.sync-queue.send.validation-error.organization.address-required": "The organization to be sent requires an address", @@ -7352,6 +8240,104 @@ // TODO New key - Add a translation "home.recent-submissions.head": "Recent Submissions", + // "listable-notification-object.default-message": "This object couldn't be retrieved", + // TODO New key - Add a translation + "listable-notification-object.default-message": "This object couldn't be retrieved", + + + // "system-wide-alert-banner.retrieval.error": "Something went wrong retrieving the system-wide alert banner", + // TODO New key - Add a translation + "system-wide-alert-banner.retrieval.error": "Something went wrong retrieving the system-wide alert banner", + + // "system-wide-alert-banner.countdown.prefix": "In", + // TODO New key - Add a translation + "system-wide-alert-banner.countdown.prefix": "In", + + // "system-wide-alert-banner.countdown.days": "{{days}} day(s),", + // TODO New key - Add a translation + "system-wide-alert-banner.countdown.days": "{{days}} day(s),", + + // "system-wide-alert-banner.countdown.hours": "{{hours}} hour(s) and", + // TODO New key - Add a translation + "system-wide-alert-banner.countdown.hours": "{{hours}} hour(s) and", + + // "system-wide-alert-banner.countdown.minutes": "{{minutes}} minute(s):", + // TODO New key - Add a translation + "system-wide-alert-banner.countdown.minutes": "{{minutes}} minute(s):", + + + + // "menu.section.system-wide-alert": "System-wide Alert", + // TODO New key - Add a translation + "menu.section.system-wide-alert": "System-wide Alert", + + // "system-wide-alert.form.header": "System-wide Alert", + // TODO New key - Add a translation + "system-wide-alert.form.header": "System-wide Alert", + + // "system-wide-alert-form.retrieval.error": "Something went wrong retrieving the system-wide alert", + // TODO New key - Add a translation + "system-wide-alert-form.retrieval.error": "Something went wrong retrieving the system-wide alert", + + // "system-wide-alert.form.cancel": "Cancel", + // TODO New key - Add a translation + "system-wide-alert.form.cancel": "Cancel", + + // "system-wide-alert.form.save": "Save", + // TODO New key - Add a translation + "system-wide-alert.form.save": "Save", + + // "system-wide-alert.form.label.active": "ACTIVE", + // TODO New key - Add a translation + "system-wide-alert.form.label.active": "ACTIVE", + + // "system-wide-alert.form.label.inactive": "INACTIVE", + // TODO New key - Add a translation + "system-wide-alert.form.label.inactive": "INACTIVE", + + // "system-wide-alert.form.error.message": "The system wide alert must have a message", + // TODO New key - Add a translation + "system-wide-alert.form.error.message": "The system wide alert must have a message", + + // "system-wide-alert.form.label.message": "Alert message", + // TODO New key - Add a translation + "system-wide-alert.form.label.message": "Alert message", + + // "system-wide-alert.form.label.countdownTo.enable": "Enable a countdown timer", + // TODO New key - Add a translation + "system-wide-alert.form.label.countdownTo.enable": "Enable a countdown timer", + + // "system-wide-alert.form.label.countdownTo.hint": "Hint: Set a countdown timer. When enabled, a date can be set in the future and the system-wide alert banner will perform a countdown to the set date. When this timer ends, it will disappear from the alert. The server will NOT be automatically stopped.", + // TODO New key - Add a translation + "system-wide-alert.form.label.countdownTo.hint": "Hint: Set a countdown timer. When enabled, a date can be set in the future and the system-wide alert banner will perform a countdown to the set date. When this timer ends, it will disappear from the alert. The server will NOT be automatically stopped.", + + // "system-wide-alert.form.label.preview": "System-wide alert preview", + // TODO New key - Add a translation + "system-wide-alert.form.label.preview": "System-wide alert preview", + + // "system-wide-alert.form.update.success": "The system-wide alert was successfully updated", + // TODO New key - Add a translation + "system-wide-alert.form.update.success": "The system-wide alert was successfully updated", + + // "system-wide-alert.form.update.error": "Something went wrong when updating the system-wide alert", + // TODO New key - Add a translation + "system-wide-alert.form.update.error": "Something went wrong when updating the system-wide alert", + + // "system-wide-alert.form.create.success": "The system-wide alert was successfully created", + // TODO New key - Add a translation + "system-wide-alert.form.create.success": "The system-wide alert was successfully created", + + // "system-wide-alert.form.create.error": "Something went wrong when creating the system-wide alert", + // TODO New key - Add a translation + "system-wide-alert.form.create.error": "Something went wrong when creating the system-wide alert", + + // "admin.system-wide-alert.breadcrumbs": "System-wide Alerts", + // TODO New key - Add a translation + "admin.system-wide-alert.breadcrumbs": "System-wide Alerts", + + // "admin.system-wide-alert.title": "System-wide Alerts", + // TODO New key - Add a translation + "admin.system-wide-alert.title": "System-wide Alerts", } \ No newline at end of file From 6f4b0ad6b1b03af129f1f3c80c3e8b3c2a419d04 Mon Sep 17 00:00:00 2001 From: Alban Imami Date: Fri, 12 May 2023 12:10:57 +0200 Subject: [PATCH 212/409] [CST-5729] fixed the id on the bitstream api request --- .../bitstream-download-page.component.ts | 10 +++++++++- src/app/core/data/signposting-data.service.ts | 9 +++++---- src/app/core/data/signposting-data.ts | 5 ----- src/app/core/data/signposting-links.model.ts | 7 +++++++ src/app/core/services/server-hard-redirect.service.ts | 11 ----------- 5 files changed, 21 insertions(+), 21 deletions(-) delete mode 100644 src/app/core/data/signposting-data.ts create mode 100644 src/app/core/data/signposting-links.model.ts diff --git a/src/app/bitstream-page/bitstream-download-page/bitstream-download-page.component.ts b/src/app/bitstream-page/bitstream-download-page/bitstream-download-page.component.ts index 51ec762ec3..38e4d01dd5 100644 --- a/src/app/bitstream-page/bitstream-download-page/bitstream-download-page.component.ts +++ b/src/app/bitstream-page/bitstream-download-page/bitstream-download-page.component.ts @@ -14,6 +14,8 @@ import { getForbiddenRoute } from '../../app-routing-paths'; import { RemoteData } from '../../core/data/remote-data'; import { redirectOn4xx } from '../../core/shared/authorized.operators'; import { Location } from '@angular/common'; +import { SignpostingDataService } from 'src/app/core/data/signposting-data.service'; +import { ServerResponseService } from 'src/app/core/services/server-response.service'; @Component({ selector: 'ds-bitstream-download-page', @@ -36,8 +38,14 @@ export class BitstreamDownloadPageComponent implements OnInit { private fileService: FileService, private hardRedirectService: HardRedirectService, private location: Location, + private signpostginDataService: SignpostingDataService, + private responseService: ServerResponseService ) { - + this.route.params.subscribe(params => { + this.signpostginDataService.getLinksets(params.id).pipe(take(1)).subscribe(linksets => { + this.responseService.setLinksetsHeader(linksets); + }); + }); } back(): void { diff --git a/src/app/core/data/signposting-data.service.ts b/src/app/core/data/signposting-data.service.ts index 0ef2b49f0f..5e965d1ab5 100644 --- a/src/app/core/data/signposting-data.service.ts +++ b/src/app/core/data/signposting-data.service.ts @@ -7,6 +7,7 @@ import { Observable, of as observableOf } from 'rxjs'; import { HALEndpointService } from '../shared/hal-endpoint.service'; import { RawRestResponse } from '../dspace-rest/raw-rest-response.model'; import { HttpHeaders } from '@angular/common/http'; +import { SignpostingLinks } from './signposting-links.model'; @Injectable({ providedIn: 'root' @@ -15,15 +16,15 @@ export class SignpostingDataService { constructor(private restService: DspaceRestService, protected halService: HALEndpointService) { } - getLinks(uuid: string): Observable { + getLinks(uuid: string): Observable { const baseUrl = this.halService.getRootHref().replace('/api', ''); return this.restService.get(`${baseUrl}/signposting/links/${uuid}`).pipe( - catchError((err ) => { + catchError((err) => { console.error(err); return observableOf(false); }), - map((res: RawRestResponse) => res) + map((res: SignpostingLinks) => res) ); } @@ -40,7 +41,7 @@ export class SignpostingDataService { } as any; return this.restService.getWithHeaders(`${baseUrl}/signposting/linksets/${uuid}`, requestOptions).pipe( - catchError((err ) => { + catchError((err) => { console.error(err); return observableOf(false); }), diff --git a/src/app/core/data/signposting-data.ts b/src/app/core/data/signposting-data.ts deleted file mode 100644 index 5734d324ec..0000000000 --- a/src/app/core/data/signposting-data.ts +++ /dev/null @@ -1,5 +0,0 @@ -export interface SignpostingDataLink { - href: string, - rel: string, - type: string -} diff --git a/src/app/core/data/signposting-links.model.ts b/src/app/core/data/signposting-links.model.ts new file mode 100644 index 0000000000..19d8869ba1 --- /dev/null +++ b/src/app/core/data/signposting-links.model.ts @@ -0,0 +1,7 @@ +import { RawRestResponse } from '../dspace-rest/raw-rest-response.model'; + +export interface SignpostingLinks extends RawRestResponse { + href?: string, + rel?: string, + type?: string +} diff --git a/src/app/core/services/server-hard-redirect.service.ts b/src/app/core/services/server-hard-redirect.service.ts index a6c0e09aee..de8b45b0e5 100644 --- a/src/app/core/services/server-hard-redirect.service.ts +++ b/src/app/core/services/server-hard-redirect.service.ts @@ -2,9 +2,6 @@ import { Inject, Injectable } from '@angular/core'; import { Request, Response } from 'express'; import { REQUEST, RESPONSE } from '@nguniversal/express-engine/tokens'; import { HardRedirectService } from './hard-redirect.service'; -import { SignpostingDataService } from '../data/signposting-data.service'; -import { ActivatedRoute } from '@angular/router'; -import { take } from 'rxjs'; /** * Service for performing hard redirects within the server app module @@ -15,8 +12,6 @@ export class ServerHardRedirectService extends HardRedirectService { constructor( @Inject(REQUEST) protected req: Request, @Inject(RESPONSE) protected res: Response, - private signpostginDataService: SignpostingDataService, - protected route: ActivatedRoute ) { super(); } @@ -52,12 +47,6 @@ export class ServerHardRedirectService extends HardRedirectService { console.log(`Redirecting from ${this.req.url} to ${url} with ${status}`); - this.route.params.subscribe(params => { - this.signpostginDataService.getLinksets(params.id).pipe(take(1)).subscribe(linksets => { - this.res.setHeader('Link', linksets); - }); - }); - this.res.redirect(status, url); this.res.end(); // I haven't found a way to correctly stop Angular rendering. From 14fb3794196c7c3d28badedf340bb41f6520bdf4 Mon Sep 17 00:00:00 2001 From: samuel Date: Wed, 23 Nov 2022 15:40:00 +0100 Subject: [PATCH 213/409] 96598: Test feedback pt. 3: submission - repair auto-refresh --- src/app/submission/sections/form/section-form.component.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/app/submission/sections/form/section-form.component.ts b/src/app/submission/sections/form/section-form.component.ts index 9d9fe361de..000e8b0834 100644 --- a/src/app/submission/sections/form/section-form.component.ts +++ b/src/app/submission/sections/form/section-form.component.ts @@ -223,8 +223,8 @@ export class SubmissionSectionFormComponent extends SectionModelComponent { const sectionDataToCheck = {}; Object.keys(sectionData).forEach((key) => { - if (this.sectionMetadata && this.sectionMetadata.includes(key)) { - sectionDataToCheck[key] = sectionData[key]; + if (this.sectionData.data && hasValue(this.sectionData.data[key])) { + sectionDataToCheck[key] = this.sectionData.data[key]; } }); From dff343f62eb67f061a06a235487d8371074d322c Mon Sep 17 00:00:00 2001 From: samuel Date: Wed, 23 Nov 2022 16:16:12 +0100 Subject: [PATCH 214/409] 96598: Test feedback pt. 3: submission - repair auto-refresh - repair tests --- .../submission/sections/form/section-form.component.spec.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/app/submission/sections/form/section-form.component.spec.ts b/src/app/submission/sections/form/section-form.component.spec.ts index 592691e677..4a6bcf5b9a 100644 --- a/src/app/submission/sections/form/section-form.component.spec.ts +++ b/src/app/submission/sections/form/section-form.component.spec.ts @@ -295,7 +295,9 @@ describe('SubmissionSectionFormComponent test suite', () => { 'dc.title': [new FormFieldMetadataValueObject('test')] }; compAsAny.formData = {}; - compAsAny.sectionMetadata = ['dc.title']; + compAsAny.sectionData.data = { + 'dc.title': [new FormFieldMetadataValueObject('test')] + }; expect(comp.hasMetadataEnrichment(newSectionData)).toBeTruthy(); }); From 4abdea5f62e02dd2d30ae6d91930bbc3c1e983fe Mon Sep 17 00:00:00 2001 From: samuel Date: Thu, 9 Feb 2023 16:55:48 +0100 Subject: [PATCH 215/409] 99221: Fix minor issues with Relationships in submission - hide disabled buttons --- src/app/shared/form/form.component.html | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/app/shared/form/form.component.html b/src/app/shared/form/form.component.html index 16ced852b1..b48675b304 100644 --- a/src/app/shared/form/form.component.html +++ b/src/app/shared/form/form.component.html @@ -13,22 +13,20 @@ (ngbEvent)="onCustomEvent($event)"> -
    -
    +
    From 9a8dfc229f0940b2242c577dc5769e50f79aed62 Mon Sep 17 00:00:00 2001 From: Adam Doan Date: Fri, 12 May 2023 13:04:43 +0000 Subject: [PATCH 216/409] Add filter name to search filter button aria-label. --- .../search-filters/search-filter/search-filter.component.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/shared/search/search-filters/search-filter/search-filter.component.html b/src/app/shared/search/search-filters/search-filter/search-filter.component.html index 13457cc008..a6fb0021b7 100644 --- a/src/app/shared/search/search-filters/search-filter/search-filter.component.html +++ b/src/app/shared/search/search-filters/search-filter/search-filter.component.html @@ -3,7 +3,7 @@ -
    diff --git a/src/app/shared/access-control-form-container/bulk-access-control.service.ts b/src/app/shared/access-control-form-container/bulk-access-control.service.ts index 6401ed42eb..71e8115d6b 100644 --- a/src/app/shared/access-control-form-container/bulk-access-control.service.ts +++ b/src/app/shared/access-control-form-container/bulk-access-control.service.ts @@ -81,36 +81,43 @@ export class BulkAccessControlService { } export const convertToBulkAccessControlFileModel = (payload: { state: AccessControlFormState, bitstreamAccess: AccessCondition[], itemAccess: AccessCondition[] }): BulkAccessControlFileModel => { + let finalPayload: BulkAccessControlFileModel = {}; + const itemEnabled = payload.state.item.toggleStatus; const bitstreamEnabled = payload.state.bitstream.toggleStatus; - const constraints = { uuid: [] }; - - if (bitstreamEnabled && payload.state.bitstream.changesLimit === 'selected') { - // @ts-ignore - constraints.uuid = payload.state.bitstream.selectedBitstreams.map((x) => x.id); + if (itemEnabled) { + finalPayload.item = { + mode: payload.state.item.accessMode, + accessConditions: payload.itemAccess + } } - return { - item: { - mode: itemEnabled ? payload.state.item.accessMode : '', - accessConditions: itemEnabled ? payload.itemAccess : [] - }, - bitstream: { - constraints, - mode: bitstreamEnabled ? payload.state.bitstream.accessMode : '', - accessConditions: bitstreamEnabled ? payload.bitstreamAccess : [] + if (bitstreamEnabled) { + const constraints = { uuid: [] }; + + if (bitstreamEnabled && payload.state.bitstream.changesLimit === 'selected') { + // @ts-ignore + constraints.uuid = payload.state.bitstream.selectedBitstreams.map((x) => x.id); } - }; + + finalPayload.bitstream = { + constraints, + mode: payload.state.bitstream.accessMode, + accessConditions: payload.bitstreamAccess + } + } + + return finalPayload; }; export interface BulkAccessControlFileModel { - item: { + item?: { mode: string; accessConditions: AccessCondition[]; }, - bitstream: { + bitstream?: { constraints: { uuid: string[] }; mode: string; accessConditions: AccessCondition[]; From 2fc2897a3644f9f37d2dbd3c413a74442269b392 Mon Sep 17 00:00:00 2001 From: Enea Jahollari Date: Mon, 15 May 2023 13:10:10 +0200 Subject: [PATCH 227/409] [CST-9639] Show warning only when replace is selected --- .../access-control-array-form.component.html | 2 +- .../access-control-array-form.component.ts | 1 + .../access-control-form-container.component.html | 2 ++ .../access-control-form-container.component.ts | 4 ++-- 4 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/app/shared/access-control-form-container/access-control-array-form/access-control-array-form.component.html b/src/app/shared/access-control-form-container/access-control-array-form/access-control-array-form.component.html index 71f327423f..2e6d9c2fc1 100644 --- a/src/app/shared/access-control-form-container/access-control-array-form/access-control-array-form.component.html +++ b/src/app/shared/access-control-form-container/access-control-array-form/access-control-array-form.component.html @@ -1,5 +1,5 @@
    -
    +
    {{'access-control-no-access-conditions-warning-message' | translate}}
    diff --git a/src/app/shared/access-control-form-container/access-control-array-form/access-control-array-form.component.ts b/src/app/shared/access-control-form-container/access-control-array-form/access-control-array-form.component.ts index 14f7526cb7..519fc0ae3e 100644 --- a/src/app/shared/access-control-form-container/access-control-array-form/access-control-array-form.component.ts +++ b/src/app/shared/access-control-form-container/access-control-array-form/access-control-array-form.component.ts @@ -14,6 +14,7 @@ import { dateToISOFormat } from '../../date.util'; }) export class AccessControlArrayFormComponent implements OnInit, OnDestroy { @Input() dropdownOptions: AccessesConditionOption[] = []; + @Input() mode!: 'add' | 'replace'; private destroy$ = new Subject(); diff --git a/src/app/shared/access-control-form-container/access-control-form-container.component.html b/src/app/shared/access-control-form-container/access-control-form-container.component.html index 9551b5b736..ccb18b9100 100644 --- a/src/app/shared/access-control-form-container/access-control-form-container.component.html +++ b/src/app/shared/access-control-form-container/access-control-form-container.component.html @@ -49,6 +49,7 @@ @@ -130,6 +131,7 @@ diff --git a/src/app/shared/access-control-form-container/access-control-form-container.component.ts b/src/app/shared/access-control-form-container/access-control-form-container.component.ts index f27fb4b5f0..9394b083b1 100644 --- a/src/app/shared/access-control-form-container/access-control-form-container.component.ts +++ b/src/app/shared/access-control-form-container/access-control-form-container.component.ts @@ -173,11 +173,11 @@ const initialState: AccessControlFormState = { export interface AccessControlFormState { item: { toggleStatus: boolean, - accessMode: string, + accessMode: 'add' | 'replace', }, bitstream: { toggleStatus: boolean, - accessMode: string, + accessMode: 'add' | 'replace', changesLimit: string, selectedBitstreams: ListableObject[], } From b4340e0b911cb03af23f87b8e52a9baf6d9a3d5c Mon Sep 17 00:00:00 2001 From: Enea Jahollari Date: Mon, 15 May 2023 15:39:39 +0200 Subject: [PATCH 228/409] [CST-9639] Fix lint issues --- .../bulk-access-control.service.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/app/shared/access-control-form-container/bulk-access-control.service.ts b/src/app/shared/access-control-form-container/bulk-access-control.service.ts index 71e8115d6b..5302e3aa4a 100644 --- a/src/app/shared/access-control-form-container/bulk-access-control.service.ts +++ b/src/app/shared/access-control-form-container/bulk-access-control.service.ts @@ -55,7 +55,7 @@ export class BulkAccessControlService { { name: '-f', value: file.name } ]; uuids.forEach((uuid) => { - params.push({ name: '-u', value: uuid }) + params.push({ name: '-u', value: uuid }); }); return this.scriptService.invoke('bulk-access-control', params, [file]).pipe( @@ -90,7 +90,7 @@ export const convertToBulkAccessControlFileModel = (payload: { state: AccessCont finalPayload.item = { mode: payload.state.item.accessMode, accessConditions: payload.itemAccess - } + }; } if (bitstreamEnabled) { @@ -105,7 +105,7 @@ export const convertToBulkAccessControlFileModel = (payload: { state: AccessCont constraints, mode: payload.state.bitstream.accessMode, accessConditions: payload.bitstreamAccess - } + }; } return finalPayload; From 536cb62cc06f83374475e7e31d4b7e920f506304 Mon Sep 17 00:00:00 2001 From: damian Date: Mon, 15 May 2023 16:09:17 +0200 Subject: [PATCH 229/409] Displaying item counts at Communities and Collections list view. --- .../community-list/community-list.component.html | 1 + src/app/core/shared/collection.model.ts | 7 ++++++- src/app/core/shared/community.model.ts | 7 ++++++- .../collection-list-element.component.html | 2 ++ 4 files changed, 15 insertions(+), 2 deletions(-) diff --git a/src/app/community-list-page/community-list/community-list.component.html b/src/app/community-list-page/community-list/community-list.component.html index ea772bb891..efc1f086ae 100644 --- a/src/app/community-list-page/community-list/community-list.component.html +++ b/src/app/community-list-page/community-list/community-list.component.html @@ -37,6 +37,7 @@ {{node.name}} + [{{node.payload.archivedItems}}]
    diff --git a/src/app/core/shared/collection.model.ts b/src/app/core/shared/collection.model.ts index d1c49c8d4b..81efc33510 100644 --- a/src/app/core/shared/collection.model.ts +++ b/src/app/core/shared/collection.model.ts @@ -1,4 +1,4 @@ -import { deserialize, inheritSerialization } from 'cerialize'; +import {autoserialize, deserialize, inheritSerialization} from 'cerialize'; import { Observable } from 'rxjs'; import { link, typedObject } from '../cache/builders/build-decorators'; import { PaginatedList } from '../data/paginated-list.model'; @@ -16,12 +16,17 @@ import { COMMUNITY } from './community.resource-type'; import { Community } from './community.model'; import { ChildHALResource } from './child-hal-resource.model'; import { HandleObject } from './handle-object.model'; +import {excludeFromEquals} from '../utilities/equals.decorators'; @typedObject @inheritSerialization(DSpaceObject) export class Collection extends DSpaceObject implements ChildHALResource, HandleObject { static type = COLLECTION; + @excludeFromEquals + @autoserialize + archivedItems: number; + /** * The {@link HALLink}s for this Collection */ diff --git a/src/app/core/shared/community.model.ts b/src/app/core/shared/community.model.ts index f16aad9645..0bab8cfa22 100644 --- a/src/app/core/shared/community.model.ts +++ b/src/app/core/shared/community.model.ts @@ -1,4 +1,4 @@ -import { deserialize, inheritSerialization } from 'cerialize'; +import {autoserialize, deserialize, inheritSerialization} from 'cerialize'; import { Observable } from 'rxjs'; import { link, typedObject } from '../cache/builders/build-decorators'; import { PaginatedList } from '../data/paginated-list.model'; @@ -12,12 +12,17 @@ import { DSpaceObject } from './dspace-object.model'; import { HALLink } from './hal-link.model'; import { ChildHALResource } from './child-hal-resource.model'; import { HandleObject } from './handle-object.model'; +import {excludeFromEquals} from '../utilities/equals.decorators'; @typedObject @inheritSerialization(DSpaceObject) export class Community extends DSpaceObject implements ChildHALResource, HandleObject { static type = COMMUNITY; + @excludeFromEquals + @autoserialize + archivedItems: number; + /** * The {@link HALLink}s for this Community */ diff --git a/src/app/shared/object-list/collection-list-element/collection-list-element.component.html b/src/app/shared/object-list/collection-list-element/collection-list-element.component.html index c61adf5dad..b45a9a03bc 100644 --- a/src/app/shared/object-list/collection-list-element/collection-list-element.component.html +++ b/src/app/shared/object-list/collection-list-element/collection-list-element.component.html @@ -3,7 +3,9 @@ {{object.name}} + [{{object.archivedItems}}] +
    {{object.shortDescription}}
    From 78cf3e1bfc52b43b64023d8a0d75b1354dbc28cf Mon Sep 17 00:00:00 2001 From: Giuseppe Digilio Date: Mon, 15 May 2023 16:27:38 +0200 Subject: [PATCH 230/409] [CST-5729] Finalize signposting implementation --- .../bitstream-download-page.component.spec.ts | 19 +++++- .../bitstream-download-page.component.ts | 13 ++-- .../data/signposting-data.service.spec.ts | 43 ++++++++----- src/app/core/data/signposting-data.service.ts | 33 +++------- src/app/core/data/signposting-links.model.ts | 7 ++- .../core/metadata/metadata.service.spec.ts | 24 +++---- src/app/core/metadata/metadata.service.ts | 63 ++++--------------- .../core/services/server-response.service.ts | 5 +- .../full/full-item-page.component.spec.ts | 41 +++++++++++- .../full/full-item-page.component.ts | 26 ++++---- .../simple/item-page.component.spec.ts | 41 +++++++++++- .../item-page/simple/item-page.component.ts | 50 +++++++++++---- 12 files changed, 218 insertions(+), 147 deletions(-) diff --git a/src/app/bitstream-page/bitstream-download-page/bitstream-download-page.component.spec.ts b/src/app/bitstream-page/bitstream-download-page/bitstream-download-page.component.spec.ts index 71fd74a707..66024063cd 100644 --- a/src/app/bitstream-page/bitstream-download-page/bitstream-download-page.component.spec.ts +++ b/src/app/bitstream-page/bitstream-download-page/bitstream-download-page.component.spec.ts @@ -29,6 +29,18 @@ describe('BitstreamDownloadPageComponent', () => { let serverResponseService: jasmine.SpyObj; let signpostingDataService: jasmine.SpyObj; + const mocklink = { + href: 'http://test.org', + rel: 'test', + type: 'test' + }; + + const mocklink2 = { + href: 'http://test2.org', + rel: 'test', + type: 'test' + }; + function init() { authService = jasmine.createSpyObj('authService', { isAuthenticated: observableOf(true), @@ -67,11 +79,11 @@ describe('BitstreamDownloadPageComponent', () => { router = jasmine.createSpyObj('router', ['navigateByUrl']); serverResponseService = jasmine.createSpyObj('ServerResponseService', { - setLinksetsHeader: jasmine.createSpy('setLinksetsHeader'), + setHeader: jasmine.createSpy('setHeader'), }); signpostingDataService = jasmine.createSpyObj('SignpostingDataService', { - getLinksets: observableOf('test'), + getLinks: observableOf([mocklink, mocklink2]) }); } @@ -124,6 +136,9 @@ describe('BitstreamDownloadPageComponent', () => { it('should redirect to the content link', () => { expect(hardRedirectService.redirect).toHaveBeenCalledWith('bitstream-content-link'); }); + it('should add the signposting links', () => { + expect(serverResponseService.setHeader).toHaveBeenCalled(); + }); }); describe('when the user is authorized and logged in', () => { beforeEach(waitForAsync(() => { diff --git a/src/app/bitstream-page/bitstream-download-page/bitstream-download-page.component.ts b/src/app/bitstream-page/bitstream-download-page/bitstream-download-page.component.ts index 4814a9385a..14245c4cd1 100644 --- a/src/app/bitstream-page/bitstream-download-page/bitstream-download-page.component.ts +++ b/src/app/bitstream-page/bitstream-download-page/bitstream-download-page.component.ts @@ -16,6 +16,7 @@ import { redirectOn4xx } from '../../core/shared/authorized.operators'; import { Location } from '@angular/common'; import { SignpostingDataService } from 'src/app/core/data/signposting-data.service'; import { ServerResponseService } from 'src/app/core/services/server-response.service'; +import { SignpostingLink } from '../../core/data/signposting-links.model'; @Component({ selector: 'ds-bitstream-download-page', @@ -37,14 +38,18 @@ export class BitstreamDownloadPageComponent implements OnInit { private fileService: FileService, private hardRedirectService: HardRedirectService, private location: Location, - private signpostginDataService: SignpostingDataService, + private signpostingDataService: SignpostingDataService, private responseService: ServerResponseService ) { this.route.params.subscribe(params => { - this.signpostginDataService.getLinks(params.id).pipe(take(1)).subscribe(linksets => { - linksets.forEach(link => { - this.responseService.setLinksetsHeader(link.href); + this.signpostingDataService.getLinks(params.id).pipe(take(1)).subscribe((signpostingLinks: SignpostingLink[]) => { + let links = ''; + + signpostingLinks.forEach((link: SignpostingLink) => { + links = links + (isNotEmpty(links) ? ', ' : '') + `<${link.href}> ; rel="${link.rel}" ; type="${link.type}" `; }); + + this.responseService.setHeader('Link', links); }); }); } diff --git a/src/app/core/data/signposting-data.service.spec.ts b/src/app/core/data/signposting-data.service.spec.ts index 091f38de2a..c76899221e 100644 --- a/src/app/core/data/signposting-data.service.spec.ts +++ b/src/app/core/data/signposting-data.service.spec.ts @@ -3,13 +3,32 @@ import { SignpostingDataService } from './signposting-data.service'; import { DspaceRestService } from '../dspace-rest/dspace-rest.service'; import { HALEndpointService } from '../shared/hal-endpoint.service'; import { of } from 'rxjs'; -import { SignpostingLinks } from './signposting-links.model'; -import { map } from 'rxjs/operators'; +import { SignpostingLink } from './signposting-links.model'; describe('SignpostingDataService', () => { let service: SignpostingDataService; let restServiceSpy: jasmine.SpyObj; let halServiceSpy: jasmine.SpyObj; + const mocklink = { + href: 'http://test.org', + rel: 'test', + type: 'test' + }; + + const mocklink2 = { + href: 'http://test2.org', + rel: 'test', + type: 'test' + }; + + const mockResponse: any = { + statusCode: 200, + payload: [mocklink, mocklink2] + }; + + const mockErrResponse: any = { + statusCode: 500 + }; beforeEach(() => { const restSpy = jasmine.createSpyObj('DspaceRestService', ['get', 'getWithHeaders']); @@ -38,15 +57,11 @@ describe('SignpostingDataService', () => { halServiceSpy.getRootHref.and.returnValue(`${baseUrl}/api`); - const mockResponse: any = { - self: { - href: `${baseUrl}/signposting/links/${uuid}` - } - }; - restServiceSpy.get.and.returnValue(of(mockResponse)); - let result: SignpostingLinks; + let result: SignpostingLink[]; + + const expectedResult: SignpostingLink[] = [mocklink, mocklink2]; service.getLinks(uuid).subscribe((links) => { result = links; @@ -54,20 +69,18 @@ describe('SignpostingDataService', () => { tick(); - expect(result).toEqual(mockResponse); + expect(result).toEqual(expectedResult); expect(halServiceSpy.getRootHref).toHaveBeenCalled(); expect(restServiceSpy.get).toHaveBeenCalledWith(`${baseUrl}/signposting/links/${uuid}`); })); - it('should handle error and return false', fakeAsync(() => { + it('should handle error and return an empty array', fakeAsync(() => { const uuid = '123'; const baseUrl = 'http://localhost:8080'; halServiceSpy.getRootHref.and.returnValue(`${baseUrl}/api`); - restServiceSpy.get.and.returnValue(of(null).pipe(map(() => { - throw new Error('Error'); - }))); + restServiceSpy.get.and.returnValue(of(mockErrResponse)); let result: any; @@ -77,7 +90,7 @@ describe('SignpostingDataService', () => { tick(); - expect(result).toBeFalse(); + expect(result).toEqual([]); expect(halServiceSpy.getRootHref).toHaveBeenCalled(); expect(restServiceSpy.get).toHaveBeenCalledWith(`${baseUrl}/signposting/links/${uuid}`); })); diff --git a/src/app/core/data/signposting-data.service.ts b/src/app/core/data/signposting-data.service.ts index efdf80a381..e09d68974c 100644 --- a/src/app/core/data/signposting-data.service.ts +++ b/src/app/core/data/signposting-data.service.ts @@ -1,11 +1,12 @@ import { Injectable } from '@angular/core'; -import { DspaceRestService } from '../dspace-rest/dspace-rest.service'; + import { catchError, map } from 'rxjs/operators'; import { Observable, of as observableOf } from 'rxjs'; + +import { DspaceRestService } from '../dspace-rest/dspace-rest.service'; import { HALEndpointService } from '../shared/hal-endpoint.service'; import { RawRestResponse } from '../dspace-rest/raw-rest-response.model'; -import { HttpHeaders } from '@angular/common/http'; -import { SignpostingLinks } from './signposting-links.model'; +import { SignpostingLink } from './signposting-links.model'; @Injectable({ providedIn: 'root' @@ -15,36 +16,16 @@ export class SignpostingDataService { constructor(private restService: DspaceRestService, protected halService: HALEndpointService) { } - getLinks(uuid: string): Observable { + getLinks(uuid: string): Observable { const baseUrl = this.halService.getRootHref().replace('/api', ''); return this.restService.get(`${baseUrl}/signposting/links/${uuid}`).pipe( catchError((err) => { console.error(err); - return observableOf(false); + return observableOf([]); }), - map((res: RawRestResponse) => res.payload as SignpostingLinks[]) + map((res: RawRestResponse) => res.statusCode === 200 ? res.payload as SignpostingLink[] : []) ); } - getLinksets(uuid: string): Observable { - const baseUrl = this.halService.getRootHref().replace('/api', ''); - - const requestOptions = { - observe: 'response' as any, - headers: new HttpHeaders({ - 'accept': 'application/linkset', - 'Content-Type': 'application/linkset' - }), - responseType: 'text' - } as any; - - return this.restService.getWithHeaders(`${baseUrl}/signposting/linksets/${uuid}`, requestOptions).pipe( - catchError((err) => { - console.error(err); - return observableOf(false); - }), - map((res: RawRestResponse) => res.payload.body) - ); - } } diff --git a/src/app/core/data/signposting-links.model.ts b/src/app/core/data/signposting-links.model.ts index 19d8869ba1..11d2cafe00 100644 --- a/src/app/core/data/signposting-links.model.ts +++ b/src/app/core/data/signposting-links.model.ts @@ -1,6 +1,7 @@ -import { RawRestResponse } from '../dspace-rest/raw-rest-response.model'; - -export interface SignpostingLinks extends RawRestResponse { +/** + * Represents the link object received by the signposting endpoint + */ +export interface SignpostingLink { href?: string, rel?: string, type?: string diff --git a/src/app/core/metadata/metadata.service.spec.ts b/src/app/core/metadata/metadata.service.spec.ts index 3c5b4adc0c..553b437d71 100644 --- a/src/app/core/metadata/metadata.service.spec.ts +++ b/src/app/core/metadata/metadata.service.spec.ts @@ -8,7 +8,12 @@ import { Observable, of as observableOf, of } from 'rxjs'; import { RemoteData } from '../data/remote-data'; import { Item } from '../shared/item.model'; -import { ItemMock, MockBitstream1, MockBitstream2, MockBitstream3 } from '../../shared/mocks/item.mock'; +import { + ItemMock, + MockBitstream1, + MockBitstream3, + MockBitstream2 +} from '../../shared/mocks/item.mock'; import { createSuccessfulRemoteDataObject, createSuccessfulRemoteDataObject$ } from '../../shared/remote-data.utils'; import { PaginatedList } from '../data/paginated-list.model'; import { Bitstream } from '../shared/bitstream.model'; @@ -25,7 +30,6 @@ import { getMockStore } from '@ngrx/store/testing'; import { AddMetaTagAction, ClearMetaTagAction } from './meta-tag.actions'; import { AuthorizationDataService } from '../data/feature-authorization/authorization-data.service'; import { AppConfig } from '../../../config/app-config.interface'; -import { SignpostingDataService } from '../data/signposting-data.service'; describe('MetadataService', () => { let metadataService: MetadataService; @@ -42,7 +46,6 @@ describe('MetadataService', () => { let translateService: TranslateService; let hardRedirectService: HardRedirectService; let authorizationService: AuthorizationDataService; - let signpostingDataService: SignpostingDataService; let router: Router; let store; @@ -50,12 +53,7 @@ describe('MetadataService', () => { let appConfig: AppConfig; const initialState = { 'core': { metaTag: { tagsInUse: ['title', 'description'] }}}; - const mocklink = { - href: 'http://test.org', - rel: 'test', - type: 'test' - }; - const document: any = jasmine.createSpyObj('document', ['head', 'createElement']); + beforeEach(() => { rootService = jasmine.createSpyObj({ @@ -92,10 +90,6 @@ describe('MetadataService', () => { isAuthorized: observableOf(true) }); - signpostingDataService = jasmine.createSpyObj('SignpostingDataService', { - getLinks: observableOf([mocklink]) - }); - // @ts-ignore store = getMockStore({ initialState }); spyOn(store, 'dispatch'); @@ -121,9 +115,7 @@ describe('MetadataService', () => { store, hardRedirectService, appConfig, - document, - authorizationService, - signpostingDataService + authorizationService ); }); diff --git a/src/app/core/metadata/metadata.service.ts b/src/app/core/metadata/metadata.service.ts index c22f14b680..204c925e6b 100644 --- a/src/app/core/metadata/metadata.service.ts +++ b/src/app/core/metadata/metadata.service.ts @@ -1,4 +1,4 @@ -import { Inject, Injectable } from '@angular/core'; +import { Injectable, Inject } from '@angular/core'; import { Meta, MetaDefinition, Title } from '@angular/platform-browser'; import { ActivatedRoute, NavigationEnd, Router } from '@angular/router'; @@ -8,12 +8,12 @@ import { TranslateService } from '@ngx-translate/core'; import { BehaviorSubject, combineLatest, - concat as observableConcat, - EMPTY, Observable, - of as observableOf + of as observableOf, + concat as observableConcat, + EMPTY } from 'rxjs'; -import { filter, map, mergeMap, switchMap, take } from 'rxjs/operators'; +import { filter, map, switchMap, take, mergeMap } from 'rxjs/operators'; import { hasNoValue, hasValue, isNotEmpty } from '../../shared/empty.util'; import { DSONameService } from '../breadcrumbs/dso-name.service'; @@ -25,7 +25,10 @@ import { BitstreamFormat } from '../shared/bitstream-format.model'; import { Bitstream } from '../shared/bitstream.model'; import { DSpaceObject } from '../shared/dspace-object.model'; import { Item } from '../shared/item.model'; -import { getFirstCompletedRemoteData, getFirstSucceededRemoteDataPayload } from '../shared/operators'; +import { + getFirstCompletedRemoteData, + getFirstSucceededRemoteDataPayload +} from '../shared/operators'; import { RootDataService } from '../data/root-data.service'; import { getBitstreamDownloadRoute } from '../../app-routing-paths'; import { BundleDataService } from '../data/bundle-data.service'; @@ -42,8 +45,6 @@ import { CoreState } from '../core-state.model'; import { AuthorizationDataService } from '../data/feature-authorization/authorization-data.service'; import { getDownloadableBitstream } from '../shared/bitstream.operators'; import { APP_CONFIG, AppConfig } from '../../../config/app-config.interface'; -import { SignpostingDataService } from '../data/signposting-data.service'; -import { DOCUMENT } from '@angular/common'; /** * The base selector function to select the metaTag section in the store @@ -62,11 +63,6 @@ const tagsInUseSelector = (state: MetaTagState) => state.tagsInUse, ); -/** - * Link elements added on Item Page - */ -let linkTags = []; - @Injectable() export class MetadataService { @@ -88,7 +84,7 @@ export class MetadataService { ]; constructor( - protected router: Router, + private router: Router, private translate: TranslateService, private meta: Meta, private title: Title, @@ -100,9 +96,7 @@ export class MetadataService { private store: Store, private hardRedirectService: HardRedirectService, @Inject(APP_CONFIG) private appConfig: AppConfig, - @Inject(DOCUMENT) private _document: Document, - private authorizationService: AuthorizationDataService, - private signpostingDataService: SignpostingDataService + private authorizationService: AuthorizationDataService ) { } @@ -123,7 +117,6 @@ export class MetadataService { private processRouteChange(routeInfo: any): void { this.clearMetaTags(); - this.clearLinkTags(); if (hasValue(routeInfo.data.value.dso) && hasValue(routeInfo.data.value.dso.payload)) { this.currentObject.next(routeInfo.data.value.dso.payload); @@ -145,7 +138,7 @@ export class MetadataService { } } - public getCurrentRoute(route: ActivatedRoute): ActivatedRoute { + private getCurrentRoute(route: ActivatedRoute): ActivatedRoute { while (route.firstChild) { route = route.firstChild; } @@ -169,7 +162,6 @@ export class MetadataService { this.setCitationAbstractUrlTag(); this.setCitationPdfUrlTag(); this.setCitationPublisherTag(); - this.setSignpostingLinks(); if (this.isDissertation()) { this.setCitationDissertationNameTag(); @@ -192,37 +184,6 @@ export class MetadataService { } - /** - * Add to the - */ - private setSignpostingLinks() { - if (this.currentObject.value instanceof Item){ - const value = this.signpostingDataService.getLinks(this.currentObject.getValue().id); - value.subscribe(links => { - links.forEach(link => { - this.setLinkTag(link.href, link.rel, link.type); - }); - }); - } - } - - setLinkTag(href: string, rel: string, type: string){ - let link: HTMLLinkElement = this._document.createElement('link'); - if (link) { - link.href = href; - link.rel = rel; - link.type = type; - this._document.head?.appendChild(link); - linkTags.push(link); - } - } - - public clearLinkTags(){ - linkTags.forEach(link => { - link.parentNode?.removeChild(link); - }); - } - /** * Add to the */ diff --git a/src/app/core/services/server-response.service.ts b/src/app/core/services/server-response.service.ts index 6dd50506e9..ffb6a204c6 100644 --- a/src/app/core/services/server-response.service.ts +++ b/src/app/core/services/server-response.service.ts @@ -36,9 +36,10 @@ export class ServerResponseService { return this.setStatus(500, message); } - setLinksetsHeader(linksets: string){ + setHeader(header: string, content: string) { + console.log(this.response); if (this.response) { - this.response.setHeader('Link', linksets); + this.response.setHeader(header, content); } } } diff --git a/src/app/item-page/full/full-item-page.component.spec.ts b/src/app/item-page/full/full-item-page.component.spec.ts index 6c59ccbc67..ec4054d888 100644 --- a/src/app/item-page/full/full-item-page.component.spec.ts +++ b/src/app/item-page/full/full-item-page.component.spec.ts @@ -11,7 +11,7 @@ import { ActivatedRouteStub } from '../../shared/testing/active-router.stub'; import { VarDirective } from '../../shared/utils/var.directive'; import { RouterTestingModule } from '@angular/router/testing'; import { Item } from '../../core/shared/item.model'; -import { BehaviorSubject, of as observableOf, of } from 'rxjs'; +import { BehaviorSubject, of as observableOf } from 'rxjs'; import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; import { By } from '@angular/platform-browser'; import { createSuccessfulRemoteDataObject, createSuccessfulRemoteDataObject$ } from '../../shared/remote-data.utils'; @@ -22,6 +22,7 @@ import { createRelationshipsObservable } from '../simple/item-types/shared/item. import { RemoteData } from '../../core/data/remote-data'; import { ServerResponseService } from '../../core/services/server-response.service'; import { SignpostingDataService } from '../../core/data/signposting-data.service'; +import { LinkHeadService } from '../../core/services/link-head.service'; const mockItem: Item = Object.assign(new Item(), { bundles: createSuccessfulRemoteDataObject$(createPaginatedList([])), @@ -59,6 +60,19 @@ describe('FullItemPageComponent', () => { let authorizationDataService: AuthorizationDataService; let serverResponseService: jasmine.SpyObj; let signpostingDataService: jasmine.SpyObj; + let linkHeadService: jasmine.SpyObj; + + const mocklink = { + href: 'http://test.org', + rel: 'test', + type: 'test' + }; + + const mocklink2 = { + href: 'http://test2.org', + rel: 'test', + type: 'test' + }; beforeEach(waitForAsync(() => { authService = jasmine.createSpyObj('authService', { @@ -79,11 +93,16 @@ describe('FullItemPageComponent', () => { }); serverResponseService = jasmine.createSpyObj('ServerResponseService', { - setLinksetsHeader: jasmine.createSpy('setLinksetsHeader'), + setHeader: jasmine.createSpy('setHeader'), }); signpostingDataService = jasmine.createSpyObj('SignpostingDataService', { - getLinksets: of('test'), + getLinks: observableOf([mocklink, mocklink2]), + }); + + linkHeadService = jasmine.createSpyObj('LinkHeadService', { + addTag: jasmine.createSpy('setHeader'), + removeTag: jasmine.createSpy('removeTag'), }); TestBed.configureTestingModule({ @@ -102,6 +121,7 @@ describe('FullItemPageComponent', () => { { provide: AuthorizationDataService, useValue: authorizationDataService }, { provide: ServerResponseService, useValue: serverResponseService }, { provide: SignpostingDataService, useValue: signpostingDataService }, + { provide: LinkHeadService, useValue: linkHeadService }, ], schemas: [NO_ERRORS_SCHEMA] }).overrideComponent(FullItemPageComponent, { @@ -154,6 +174,11 @@ describe('FullItemPageComponent', () => { const objectLoader = fixture.debugElement.query(By.css('.full-item-info')); expect(objectLoader.nativeElement).not.toBeNull(); }); + + it('should add the signposting links', () => { + expect(serverResponseService.setHeader).toHaveBeenCalled(); + expect(linkHeadService.addTag).toHaveBeenCalledTimes(2); + }); }); describe('when the item is withdrawn and the user is not an admin', () => { beforeEach(() => { @@ -178,6 +203,11 @@ describe('FullItemPageComponent', () => { const objectLoader = fixture.debugElement.query(By.css('.full-item-info')); expect(objectLoader).not.toBeNull(); }); + + it('should add the signposting links', () => { + expect(serverResponseService.setHeader).toHaveBeenCalled(); + expect(linkHeadService.addTag).toHaveBeenCalledTimes(2); + }); }); describe('when the item is not withdrawn and the user is not an admin', () => { @@ -190,5 +220,10 @@ describe('FullItemPageComponent', () => { const objectLoader = fixture.debugElement.query(By.css('.full-item-info')); expect(objectLoader).not.toBeNull(); }); + + it('should add the signposting links', () => { + expect(serverResponseService.setHeader).toHaveBeenCalled(); + expect(linkHeadService.addTag).toHaveBeenCalledTimes(2); + }); }); }); diff --git a/src/app/item-page/full/full-item-page.component.ts b/src/app/item-page/full/full-item-page.component.ts index 2570bf70fe..f0100eed72 100644 --- a/src/app/item-page/full/full-item-page.component.ts +++ b/src/app/item-page/full/full-item-page.component.ts @@ -16,8 +16,9 @@ import { hasValue } from '../../shared/empty.util'; import { AuthService } from '../../core/auth/auth.service'; import { Location } from '@angular/common'; import { AuthorizationDataService } from '../../core/data/feature-authorization/authorization-data.service'; -import { ServerResponseService } from 'src/app/core/services/server-response.service'; -import { SignpostingDataService } from 'src/app/core/data/signposting-data.service'; +import { ServerResponseService } from '../../core/services/server-response.service'; +import { SignpostingDataService } from '../../core/data/signposting-data.service'; +import { LinkHeadService } from '../../core/services/link-head.service'; /** * This component renders a full item page. @@ -44,15 +45,18 @@ export class FullItemPageComponent extends ItemPageComponent implements OnInit, subs = []; - constructor(protected route: ActivatedRoute, - router: Router, - items: ItemDataService, - authService: AuthService, - authorizationService: AuthorizationDataService, - private _location: Location, - responseService: ServerResponseService, - signpostingDataService: SignpostingDataService) { - super(route, router, items, authService, authorizationService, responseService, signpostingDataService); + constructor( + protected route: ActivatedRoute, + protected router: Router, + protected items: ItemDataService, + protected authService: AuthService, + protected authorizationService: AuthorizationDataService, + protected _location: Location, + protected responseService: ServerResponseService, + protected signpostingDataService: SignpostingDataService, + protected linkHeadService: LinkHeadService + ) { + super(route, router, items, authService, authorizationService, responseService, signpostingDataService, linkHeadService); } /*** AoT inheritance fix, will hopefully be resolved in the near future **/ diff --git a/src/app/item-page/simple/item-page.component.spec.ts b/src/app/item-page/simple/item-page.component.spec.ts index 042cac2724..005142e3f1 100644 --- a/src/app/item-page/simple/item-page.component.spec.ts +++ b/src/app/item-page/simple/item-page.component.spec.ts @@ -22,9 +22,9 @@ import { import { AuthService } from '../../core/auth/auth.service'; import { createPaginatedList } from '../../shared/testing/utils.test'; import { AuthorizationDataService } from '../../core/data/feature-authorization/authorization-data.service'; -import { of } from 'rxjs/internal/observable/of'; import { ServerResponseService } from '../../core/services/server-response.service'; import { SignpostingDataService } from '../../core/data/signposting-data.service'; +import { LinkHeadService } from '../../core/services/link-head.service'; const mockItem: Item = Object.assign(new Item(), { bundles: createSuccessfulRemoteDataObject$(createPaginatedList([])), @@ -39,6 +39,18 @@ const mockWithdrawnItem: Item = Object.assign(new Item(), { isWithdrawn: true }); +const mocklink = { + href: 'http://test.org', + rel: 'test', + type: 'test' +}; + +const mocklink2 = { + href: 'http://test2.org', + rel: 'test', + type: 'test' +}; + describe('ItemPageComponent', () => { let comp: ItemPageComponent; let fixture: ComponentFixture; @@ -46,6 +58,7 @@ describe('ItemPageComponent', () => { let authorizationDataService: AuthorizationDataService; let serverResponseService: jasmine.SpyObj; let signpostingDataService: jasmine.SpyObj; + let linkHeadService: jasmine.SpyObj; const mockMetadataService = { /* eslint-disable no-empty,@typescript-eslint/no-empty-function */ @@ -66,11 +79,16 @@ describe('ItemPageComponent', () => { isAuthorized: observableOf(false), }); serverResponseService = jasmine.createSpyObj('ServerResponseService', { - setLinksetsHeader: jasmine.createSpy('setLinksetsHeader'), + setHeader: jasmine.createSpy('setHeader'), }); signpostingDataService = jasmine.createSpyObj('SignpostingDataService', { - getLinksets: of('test'), + getLinks: observableOf([mocklink, mocklink2]), + }); + + linkHeadService = jasmine.createSpyObj('LinkHeadService', { + addTag: jasmine.createSpy('setHeader'), + removeTag: jasmine.createSpy('removeTag'), }); TestBed.configureTestingModule({ @@ -90,6 +108,7 @@ describe('ItemPageComponent', () => { { provide: AuthorizationDataService, useValue: authorizationDataService }, { provide: ServerResponseService, useValue: serverResponseService }, { provide: SignpostingDataService, useValue: signpostingDataService }, + { provide: LinkHeadService, useValue: linkHeadService }, ], schemas: [NO_ERRORS_SCHEMA] @@ -140,6 +159,12 @@ describe('ItemPageComponent', () => { const objectLoader = fixture.debugElement.query(By.css('ds-listable-object-component-loader')); expect(objectLoader.nativeElement).toBeDefined(); }); + + it('should add the signposting links', () => { + expect(serverResponseService.setHeader).toHaveBeenCalled(); + expect(linkHeadService.addTag).toHaveBeenCalledTimes(2); + }); + }); describe('when the item is withdrawn and the user is not an admin', () => { beforeEach(() => { @@ -164,6 +189,11 @@ describe('ItemPageComponent', () => { const objectLoader = fixture.debugElement.query(By.css('ds-listable-object-component-loader')); expect(objectLoader.nativeElement).toBeDefined(); }); + + it('should add the signposting links', () => { + expect(serverResponseService.setHeader).toHaveBeenCalled(); + expect(linkHeadService.addTag).toHaveBeenCalledTimes(2); + }); }); describe('when the item is not withdrawn and the user is not an admin', () => { @@ -176,6 +206,11 @@ describe('ItemPageComponent', () => { const objectLoader = fixture.debugElement.query(By.css('ds-listable-object-component-loader')); expect(objectLoader.nativeElement).toBeDefined(); }); + + it('should add the signposting links', () => { + expect(serverResponseService.setHeader).toHaveBeenCalled(); + expect(linkHeadService.addTag).toHaveBeenCalledTimes(2); + }); }); }); diff --git a/src/app/item-page/simple/item-page.component.ts b/src/app/item-page/simple/item-page.component.ts index 6483769483..10d8b32886 100644 --- a/src/app/item-page/simple/item-page.component.ts +++ b/src/app/item-page/simple/item-page.component.ts @@ -1,8 +1,8 @@ -import { ChangeDetectionStrategy, Component, OnInit } from '@angular/core'; +import { ChangeDetectionStrategy, Component, OnDestroy, OnInit } from '@angular/core'; import { ActivatedRoute, Router } from '@angular/router'; import { Observable } from 'rxjs'; -import { map } from 'rxjs/operators'; +import { map, take } from 'rxjs/operators'; import { ItemDataService } from '../../core/data/item-data.service'; import { RemoteData } from '../../core/data/remote-data'; @@ -17,6 +17,9 @@ import { AuthorizationDataService } from '../../core/data/feature-authorization/ import { FeatureID } from '../../core/data/feature-authorization/feature-id'; import { ServerResponseService } from '../../core/services/server-response.service'; import { SignpostingDataService } from '../../core/data/signposting-data.service'; +import { SignpostingLink } from '../../core/data/signposting-links.model'; +import { isNotEmpty } from '../../shared/empty.util'; +import { LinkHeadService } from '../../core/services/link-head.service'; /** * This component renders a simple item page. @@ -30,7 +33,7 @@ import { SignpostingDataService } from '../../core/data/signposting-data.service changeDetection: ChangeDetectionStrategy.OnPush, animations: [fadeInOut] }) -export class ItemPageComponent implements OnInit { +export class ItemPageComponent implements OnInit, OnDestroy { /** * The item's id @@ -59,18 +62,36 @@ export class ItemPageComponent implements OnInit { itemUrl: string; + /** + * Contains a list of SignpostingLink related to the item + */ + signpostingLinks: SignpostingLink[]; + constructor( protected route: ActivatedRoute, - private router: Router, - private items: ItemDataService, - private authService: AuthService, - private authorizationService: AuthorizationDataService, - private responseService: ServerResponseService, - private signpostingDataService: SignpostingDataService + protected router: Router, + protected items: ItemDataService, + protected authService: AuthService, + protected authorizationService: AuthorizationDataService, + protected responseService: ServerResponseService, + protected signpostingDataService: SignpostingDataService, + protected linkHeadService: LinkHeadService ) { this.route.params.subscribe(params => { - this.signpostingDataService.getLinksets(params.id).subscribe(linksets => { - this.responseService.setLinksetsHeader(linksets); + this.signpostingDataService.getLinks(params.id).pipe(take(1)).subscribe((signpostingLinks: SignpostingLink[]) => { + let links = ''; + this.signpostingLinks = signpostingLinks; + + signpostingLinks.forEach((link: SignpostingLink) => { + links = links + (isNotEmpty(links) ? ', ' : '') + `<${link.href}> ; rel="${link.rel}" ; type="${link.type}" `; + this.linkHeadService.addTag({ + href: link.href, + type: link.type, + rel: link.rel + }) + }); + + this.responseService.setHeader('Link', links); }); }); } @@ -91,4 +112,11 @@ export class ItemPageComponent implements OnInit { this.isAdmin$ = this.authorizationService.isAuthorized(FeatureID.AdministratorOf); } + + + ngOnDestroy(): void { + this.signpostingLinks.forEach((link: SignpostingLink) => { + this.linkHeadService.removeTag(`href='${link.href}'`); + }) + } } From a1b27a5fb361db209721bbc59e955782175699ec Mon Sep 17 00:00:00 2001 From: Giuseppe Digilio Date: Mon, 15 May 2023 16:34:02 +0200 Subject: [PATCH 231/409] [CST-5729] Revert unused changes --- src/app/core/dspace-rest/dspace-rest.service.ts | 15 +-------------- src/app/core/services/server-response.service.ts | 1 - 2 files changed, 1 insertion(+), 15 deletions(-) diff --git a/src/app/core/dspace-rest/dspace-rest.service.ts b/src/app/core/dspace-rest/dspace-rest.service.ts index 737714869d..ea4e8c2831 100644 --- a/src/app/core/dspace-rest/dspace-rest.service.ts +++ b/src/app/core/dspace-rest/dspace-rest.service.ts @@ -1,4 +1,4 @@ -import { Observable, throwError as observableThrowError, throwError } from 'rxjs'; +import { Observable, throwError as observableThrowError } from 'rxjs'; import { catchError, map } from 'rxjs/operators'; import { Injectable } from '@angular/core'; import { HttpClient, HttpHeaders, HttpParams, HttpResponse } from '@angular/common/http'; @@ -58,19 +58,6 @@ export class DspaceRestService { })); } - getWithHeaders(absoluteURL: string, reqOptions: any): Observable { - const requestOptions = reqOptions; - - return this.http.get(absoluteURL, requestOptions).pipe( - map((res) => ({ - payload: res - })), - catchError((err) => { - console.log('Error: ', err); - return throwError(() => new Error(err.error)); - })); - } - /** * Performs a request to the REST API. * diff --git a/src/app/core/services/server-response.service.ts b/src/app/core/services/server-response.service.ts index ffb6a204c6..2268e9eb03 100644 --- a/src/app/core/services/server-response.service.ts +++ b/src/app/core/services/server-response.service.ts @@ -37,7 +37,6 @@ export class ServerResponseService { } setHeader(header: string, content: string) { - console.log(this.response); if (this.response) { this.response.setHeader(header, content); } From 10c6b03c40af72e70a897d1fd460e8c39ea5ebdb Mon Sep 17 00:00:00 2001 From: Giuseppe Digilio Date: Mon, 15 May 2023 16:58:20 +0200 Subject: [PATCH 232/409] [CST-5729] Fix lint --- src/app/item-page/simple/item-page.component.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/app/item-page/simple/item-page.component.ts b/src/app/item-page/simple/item-page.component.ts index 10d8b32886..c1c09e0eb4 100644 --- a/src/app/item-page/simple/item-page.component.ts +++ b/src/app/item-page/simple/item-page.component.ts @@ -88,7 +88,7 @@ export class ItemPageComponent implements OnInit, OnDestroy { href: link.href, type: link.type, rel: link.rel - }) + }); }); this.responseService.setHeader('Link', links); @@ -117,6 +117,6 @@ export class ItemPageComponent implements OnInit, OnDestroy { ngOnDestroy(): void { this.signpostingLinks.forEach((link: SignpostingLink) => { this.linkHeadService.removeTag(`href='${link.href}'`); - }) + }); } } From 43d78c695c7e6f763a8235361cdade0048a77e5e Mon Sep 17 00:00:00 2001 From: Giuseppe Digilio Date: Mon, 15 May 2023 17:11:45 +0200 Subject: [PATCH 233/409] [CST-5729] Assign a default value --- src/app/item-page/simple/item-page.component.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/item-page/simple/item-page.component.ts b/src/app/item-page/simple/item-page.component.ts index c1c09e0eb4..f5ee9e1e78 100644 --- a/src/app/item-page/simple/item-page.component.ts +++ b/src/app/item-page/simple/item-page.component.ts @@ -65,7 +65,7 @@ export class ItemPageComponent implements OnInit, OnDestroy { /** * Contains a list of SignpostingLink related to the item */ - signpostingLinks: SignpostingLink[]; + signpostingLinks: SignpostingLink[] = []; constructor( protected route: ActivatedRoute, From da7cb11bcb5ba54290d8a04f3a30a20075a89f40 Mon Sep 17 00:00:00 2001 From: damian Date: Mon, 15 May 2023 20:34:46 +0200 Subject: [PATCH 234/409] Archived items moved outside initial span element(fix for tests) --- .../collection-list-element.component.html | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/app/shared/object-list/collection-list-element/collection-list-element.component.html b/src/app/shared/object-list/collection-list-element/collection-list-element.component.html index b45a9a03bc..b1900908a5 100644 --- a/src/app/shared/object-list/collection-list-element/collection-list-element.component.html +++ b/src/app/shared/object-list/collection-list-element/collection-list-element.component.html @@ -3,9 +3,10 @@ {{object.name}} - [{{object.archivedItems}}] +[{{object.archivedItems}}] +
    {{object.shortDescription}}
    From bd1881fc9a8778a3d4c047fcf06e9f8163a78fad Mon Sep 17 00:00:00 2001 From: Adam Doan Date: Tue, 16 May 2023 18:54:17 +0000 Subject: [PATCH 235/409] Add accessible button names for ORCID queue action buttons --- .../orcid-page/orcid-queue/orcid-queue.component.html | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/app/item-page/orcid-page/orcid-queue/orcid-queue.component.html b/src/app/item-page/orcid-page/orcid-queue/orcid-queue.component.html index 9358bcf835..6ba318f7fd 100644 --- a/src/app/item-page/orcid-page/orcid-queue/orcid-queue.component.html +++ b/src/app/item-page/orcid-page/orcid-queue/orcid-queue.component.html @@ -34,11 +34,13 @@
    From 388c08b9a13cf636eb0487e595a9e1017bad1d0f Mon Sep 17 00:00:00 2001 From: damian Date: Mon, 15 May 2023 20:34:46 +0200 Subject: [PATCH 236/409] Archived items moved outside initial span element(fix for tests). Tests added. --- .../community-list.component.html | 2 +- .../collection-list-element.component.html | 4 +- .../collection-list-element.component.spec.ts | 52 ++++++++++++++++++- 3 files changed, 52 insertions(+), 6 deletions(-) diff --git a/src/app/community-list-page/community-list/community-list.component.html b/src/app/community-list-page/community-list/community-list.component.html index efc1f086ae..5f940b4405 100644 --- a/src/app/community-list-page/community-list/community-list.component.html +++ b/src/app/community-list-page/community-list/community-list.component.html @@ -37,7 +37,7 @@ {{node.name}} - [{{node.payload.archivedItems}}] + [{{node.payload.archivedItems}}]
    diff --git a/src/app/shared/object-list/collection-list-element/collection-list-element.component.html b/src/app/shared/object-list/collection-list-element/collection-list-element.component.html index b1900908a5..1fdb97f17b 100644 --- a/src/app/shared/object-list/collection-list-element/collection-list-element.component.html +++ b/src/app/shared/object-list/collection-list-element/collection-list-element.component.html @@ -4,9 +4,7 @@ {{object.name}} - -[{{object.archivedItems}}] - +[{{object.archivedItems}}]
    {{object.shortDescription}}
    diff --git a/src/app/shared/object-list/collection-list-element/collection-list-element.component.spec.ts b/src/app/shared/object-list/collection-list-element/collection-list-element.component.spec.ts index c41d5a7314..c1d9665bc3 100644 --- a/src/app/shared/object-list/collection-list-element/collection-list-element.component.spec.ts +++ b/src/app/shared/object-list/collection-list-element/collection-list-element.component.spec.ts @@ -7,6 +7,29 @@ import { Collection } from '../../../core/shared/collection.model'; let collectionListElementComponent: CollectionListElementComponent; let fixture: ComponentFixture; +const mockCollectionWithArchivedItems: Collection = Object.assign(new Collection(), { + metadata: { + 'dc.title': [ + { + language: 'en_US', + value: 'Test title' + } + ] + }, archivedItems: 1 +}); + +const mockCollectionWithoutArchivedItems: Collection = Object.assign(new Collection(), { + metadata: { + 'dc.title': [ + { + language: 'en_US', + value: 'Test title' + } + ] + }, archivedItems: 0 +}); + + const mockCollectionWithAbstract: Collection = Object.assign(new Collection(), { metadata: { 'dc.description.abstract': [ @@ -15,7 +38,7 @@ const mockCollectionWithAbstract: Collection = Object.assign(new Collection(), { value: 'Short description' } ] - } + }, archivedItems: 1 }); const mockCollectionWithoutAbstract: Collection = Object.assign(new Collection(), { @@ -26,7 +49,7 @@ const mockCollectionWithoutAbstract: Collection = Object.assign(new Collection() value: 'Test title' } ] - } + }, archivedItems: 1 }); describe('CollectionListElementComponent', () => { @@ -71,4 +94,29 @@ describe('CollectionListElementComponent', () => { expect(collectionAbstractField).toBeNull(); }); }); + + + describe('When the collection has archived items', () => { + beforeEach(() => { + collectionListElementComponent.object = mockCollectionWithArchivedItems; + fixture.detectChanges(); + }); + + it('should show the archived items paragraph', () => { + const field = fixture.debugElement.query(By.css('span.archived-items-lead')); + expect(field).not.toBeNull(); + }); + }); + + describe('When the collection has no archived items', () => { + beforeEach(() => { + collectionListElementComponent.object = mockCollectionWithoutArchivedItems; + fixture.detectChanges(); + }); + + it('should not show the archived items paragraph', () => { + const field = fixture.debugElement.query(By.css('span.archived-items-lead')); + expect(field).toBeNull(); + }); + }); }); From 3d7e61f57f5ab5693b6a310b593ab335072f32d8 Mon Sep 17 00:00:00 2001 From: Art Lowel Date: Wed, 17 May 2023 18:31:46 +0200 Subject: [PATCH 237/409] add a custom FindDataImpl for browsedefinitions --- src/app/browse-by/browse-by-guard.spec.ts | 4 +- src/app/browse-by/browse-by-guard.ts | 4 +- .../browse-by-switcher.component.spec.ts | 14 ++-- .../browse-by-switcher.component.ts | 4 +- .../browse/browse-definition-data.service.ts | 81 ++++++++++--------- src/app/core/browse/browse.service.spec.ts | 6 +- src/app/core/browse/browse.service.ts | 16 ++-- src/app/core/core.module.ts | 4 +- .../data/browse-response-parsing.service.ts | 33 +++++--- .../core/shared/browse-definition.model.ts | 16 ++++ src/app/core/shared/browse-definition.ts | 10 --- .../shared/flat-browse-definition.model.ts | 11 +-- .../hierarchical-browse-definition.model.ts | 11 +-- src/app/core/shared/operators.ts | 12 +-- src/app/menu.resolver.ts | 8 +- src/app/navbar/navbar.component.spec.ts | 10 +-- .../comcol-page-browse-by.component.ts | 8 +- 17 files changed, 134 insertions(+), 118 deletions(-) create mode 100644 src/app/core/shared/browse-definition.model.ts delete mode 100644 src/app/core/shared/browse-definition.ts diff --git a/src/app/browse-by/browse-by-guard.spec.ts b/src/app/browse-by/browse-by-guard.spec.ts index 8a9f9b8c50..933c95a3cb 100644 --- a/src/app/browse-by/browse-by-guard.spec.ts +++ b/src/app/browse-by/browse-by-guard.spec.ts @@ -2,7 +2,7 @@ import { first } from 'rxjs/operators'; import { BrowseByGuard } from './browse-by-guard'; import { of as observableOf } from 'rxjs'; import { createSuccessfulRemoteDataObject$ } from '../shared/remote-data.utils'; -import { FlatBrowseDefinition } from '../core/shared/flat-browse-definition.model'; +import { BrowseDefinition } from '../core/shared/browse-definition.model'; import { BrowseByDataType } from './browse-by-switcher/browse-by-decorator'; describe('BrowseByGuard', () => { @@ -18,7 +18,7 @@ describe('BrowseByGuard', () => { const id = 'author'; const scope = '1234-65487-12354-1235'; const value = 'Filter'; - const browseDefinition = Object.assign(new FlatBrowseDefinition(), { type: BrowseByDataType.Metadata, metadataKeys: ['dc.contributor'] }); + const browseDefinition = Object.assign(new BrowseDefinition(), { type: BrowseByDataType.Metadata, metadataKeys: ['dc.contributor'] }); beforeEach(() => { dsoService = { diff --git a/src/app/browse-by/browse-by-guard.ts b/src/app/browse-by/browse-by-guard.ts index f42359b56b..e4582cb77a 100644 --- a/src/app/browse-by/browse-by-guard.ts +++ b/src/app/browse-by/browse-by-guard.ts @@ -7,7 +7,7 @@ import { getFirstSucceededRemoteData, getFirstSucceededRemoteDataPayload } from import { TranslateService } from '@ngx-translate/core'; import { Observable, of as observableOf } from 'rxjs'; import { BrowseDefinitionDataService } from '../core/browse/browse-definition-data.service'; -import { FlatBrowseDefinition } from '../core/shared/flat-browse-definition.model'; +import { BrowseDefinition } from '../core/shared/browse-definition.model'; @Injectable() /** @@ -23,7 +23,7 @@ export class BrowseByGuard implements CanActivate { canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) { const title = route.data.title; const id = route.params.id || route.queryParams.id || route.data.id; - let browseDefinition$: Observable; + let browseDefinition$: Observable; if (hasNoValue(route.data.browseDefinition) && hasValue(id)) { browseDefinition$ = this.browseDefinitionService.findById(id).pipe(getFirstSucceededRemoteDataPayload()); } else { diff --git a/src/app/browse-by/browse-by-switcher/browse-by-switcher.component.spec.ts b/src/app/browse-by/browse-by-switcher/browse-by-switcher.component.spec.ts index 91c6c29252..c2e1c9cb68 100644 --- a/src/app/browse-by/browse-by-switcher/browse-by-switcher.component.spec.ts +++ b/src/app/browse-by/browse-by-switcher/browse-by-switcher.component.spec.ts @@ -3,7 +3,7 @@ import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; import { NO_ERRORS_SCHEMA } from '@angular/core'; import { ActivatedRoute } from '@angular/router'; import { BROWSE_BY_COMPONENT_FACTORY, BrowseByDataType } from './browse-by-decorator'; -import { FlatBrowseDefinition } from '../../core/shared/flat-browse-definition.model'; +import { BrowseDefinition } from '../../core/shared/browse-definition.model'; import { BehaviorSubject } from 'rxjs'; import { ThemeService } from '../../shared/theme-support/theme.service'; @@ -13,33 +13,33 @@ describe('BrowseBySwitcherComponent', () => { const types = [ Object.assign( - new FlatBrowseDefinition(), { + new BrowseDefinition(), { id: 'title', dataType: BrowseByDataType.Title, } ), Object.assign( - new FlatBrowseDefinition(), { + new BrowseDefinition(), { id: 'dateissued', dataType: BrowseByDataType.Date, metadataKeys: ['dc.date.issued'] } ), Object.assign( - new FlatBrowseDefinition(), { + new BrowseDefinition(), { id: 'author', dataType: BrowseByDataType.Metadata, } ), Object.assign( - new FlatBrowseDefinition(), { + new BrowseDefinition(), { id: 'subject', dataType: BrowseByDataType.Metadata, } ), ]; - const data = new BehaviorSubject(createDataWithBrowseDefinition(new FlatBrowseDefinition())); + const data = new BehaviorSubject(createDataWithBrowseDefinition(new BrowseDefinition())); const activatedRouteStub = { data @@ -70,7 +70,7 @@ describe('BrowseBySwitcherComponent', () => { comp = fixture.componentInstance; })); - types.forEach((type: FlatBrowseDefinition) => { + types.forEach((type: BrowseDefinition) => { describe(`when switching to a browse-by page for "${type.id}"`, () => { beforeEach(() => { data.next(createDataWithBrowseDefinition(type)); diff --git a/src/app/browse-by/browse-by-switcher/browse-by-switcher.component.ts b/src/app/browse-by/browse-by-switcher/browse-by-switcher.component.ts index e4746129dc..35e4edf900 100644 --- a/src/app/browse-by/browse-by-switcher/browse-by-switcher.component.ts +++ b/src/app/browse-by/browse-by-switcher/browse-by-switcher.component.ts @@ -4,7 +4,7 @@ import { Observable } from 'rxjs'; import { map } from 'rxjs/operators'; import { BROWSE_BY_COMPONENT_FACTORY } from './browse-by-decorator'; import { GenericConstructor } from '../../core/shared/generic-constructor'; -import { FlatBrowseDefinition } from '../../core/shared/flat-browse-definition.model'; +import { BrowseDefinition } from '../../core/shared/browse-definition.model'; import { ThemeService } from '../../shared/theme-support/theme.service'; @Component({ @@ -31,7 +31,7 @@ export class BrowseBySwitcherComponent implements OnInit { */ ngOnInit(): void { this.browseByComponent = this.route.data.pipe( - map((data: { browseDefinition: FlatBrowseDefinition }) => this.getComponentByBrowseByType(data.browseDefinition.getRenderType(), this.themeService.getThemeName())) + map((data: { browseDefinition: BrowseDefinition }) => this.getComponentByBrowseByType(data.browseDefinition.getRenderType(), this.themeService.getThemeName())) ); } diff --git a/src/app/core/browse/browse-definition-data.service.ts b/src/app/core/browse/browse-definition-data.service.ts index 465c5b44b4..5380bb7ec4 100644 --- a/src/app/core/browse/browse-definition-data.service.ts +++ b/src/app/core/browse/browse-definition-data.service.ts @@ -1,6 +1,5 @@ import { Injectable } from '@angular/core'; import { BROWSE_DEFINITION } from '../shared/browse-definition.resource-type'; -import { FlatBrowseDefinition } from '../shared/flat-browse-definition.model'; import { RequestService } from '../data/request.service'; import { RemoteDataBuildService } from '../cache/builders/remote-data-build.service'; import { ObjectCacheService } from '../cache/object-cache.service'; @@ -16,46 +15,10 @@ import { dataService } from '../data/base/data-service.decorator'; import { isNotEmpty, isNotEmptyOperator, hasValue } from '../../shared/empty.util'; import { take } from 'rxjs/operators'; import { BrowseDefinitionRestRequest } from '../data/request.models'; +import { BrowseDefinition } from '../shared/browse-definition.model'; -/** - * Data service responsible for retrieving browse definitions from the REST server - */ -@Injectable({ - providedIn: 'root', -}) -@dataService(BROWSE_DEFINITION) -export class BrowseDefinitionDataService extends IdentifiableDataService implements FindAllData { - private findAllData: FindAllDataImpl; - - constructor( - protected requestService: RequestService, - protected rdbService: RemoteDataBuildService, - protected objectCache: ObjectCacheService, - protected halService: HALEndpointService, - ) { - super('browses', requestService, rdbService, objectCache, halService); - - this.findAllData = new FindAllDataImpl(this.linkPath, requestService, rdbService, objectCache, halService, this.responseMsToLive); - } - - /** - * Returns {@link RemoteData} of all object with a list of {@link FollowLinkConfig}, to indicate which embedded - * info should be added to the objects - * - * @param options Find list options object - * @param useCachedVersionIfAvailable If this is true, the request will only be sent if there's - * no valid cached version. Defaults to true - * @param reRequestOnStale Whether or not the request should automatically be re- - * requested after the response becomes stale - * @param linksToFollow List of {@link FollowLinkConfig} that indicate which - * {@link HALLink}s should be automatically resolved - * @return {Observable>>} - * Return an observable that emits object list - */ - findAll(options: FindListOptions = {}, useCachedVersionIfAvailable = true, reRequestOnStale = true, ...linksToFollow: FollowLinkConfig[]): Observable>> { - return this.findAllData.findAll(options, useCachedVersionIfAvailable, reRequestOnStale, ...linksToFollow); - } +class BrowseDefinitionDataImpl extends FindAllDataImpl { /** * Create a GET request for the given href, and send it. * Use a GET request specific for BrowseDefinitions. @@ -86,3 +49,43 @@ export class BrowseDefinitionDataService extends IdentifiableDataService implements FindAllData { + private findAllData: BrowseDefinitionDataImpl; + + constructor( + protected requestService: RequestService, + protected rdbService: RemoteDataBuildService, + protected objectCache: ObjectCacheService, + protected halService: HALEndpointService, + ) { + super('browses', requestService, rdbService, objectCache, halService); + + this.findAllData = new BrowseDefinitionDataImpl(this.linkPath, requestService, rdbService, objectCache, halService, this.responseMsToLive); + } + + /** + * Returns {@link RemoteData} of all object with a list of {@link FollowLinkConfig}, to indicate which embedded + * info should be added to the objects + * + * @param options Find list options object + * @param useCachedVersionIfAvailable If this is true, the request will only be sent if there's + * no valid cached version. Defaults to true + * @param reRequestOnStale Whether or not the request should automatically be re- + * requested after the response becomes stale + * @param linksToFollow List of {@link FollowLinkConfig} that indicate which + * {@link HALLink}s should be automatically resolved + * @return {Observable>>} + * Return an observable that emits object list + */ + findAll(options: FindListOptions = {}, useCachedVersionIfAvailable = true, reRequestOnStale = true, ...linksToFollow: FollowLinkConfig[]): Observable>> { + return this.findAllData.findAll(options, useCachedVersionIfAvailable, reRequestOnStale, ...linksToFollow); + } +} + diff --git a/src/app/core/browse/browse.service.spec.ts b/src/app/core/browse/browse.service.spec.ts index 9e0615385b..46ac8c44f4 100644 --- a/src/app/core/browse/browse.service.spec.ts +++ b/src/app/core/browse/browse.service.spec.ts @@ -6,7 +6,7 @@ import { getMockRequestService } from '../../shared/mocks/request.service.mock'; import { HALEndpointServiceStub } from '../../shared/testing/hal-endpoint-service.stub'; import { RemoteDataBuildService } from '../cache/builders/remote-data-build.service'; import { RequestService } from '../data/request.service'; -import { FlatBrowseDefinition } from '../shared/flat-browse-definition.model'; +import { BrowseDefinition } from '../shared/browse-definition.model'; import { BrowseEntrySearchOptions } from './browse-entry-search-options.model'; import { BrowseService } from './browse.service'; import { createSuccessfulRemoteDataObject, createSuccessfulRemoteDataObject$ } from '../../shared/remote-data.utils'; @@ -23,7 +23,7 @@ describe('BrowseService', () => { const browsesEndpointURL = 'https://rest.api/browses'; const halService: any = new HALEndpointServiceStub(browsesEndpointURL); const browseDefinitions = [ - Object.assign(new FlatBrowseDefinition(), { + Object.assign(new BrowseDefinition(), { id: 'date', metadataBrowse: false, sortOptions: [ @@ -50,7 +50,7 @@ describe('BrowseService', () => { items: { href: 'https://rest.api/discover/browses/dateissued/items' } } }), - Object.assign(new FlatBrowseDefinition(), { + Object.assign(new BrowseDefinition(), { id: 'author', metadataBrowse: true, sortOptions: [ diff --git a/src/app/core/browse/browse.service.ts b/src/app/core/browse/browse.service.ts index 9e5589e3d8..a9a030bf57 100644 --- a/src/app/core/browse/browse.service.ts +++ b/src/app/core/browse/browse.service.ts @@ -6,6 +6,7 @@ import { RemoteDataBuildService } from '../cache/builders/remote-data-build.serv import { PaginatedList } from '../data/paginated-list.model'; import { RemoteData } from '../data/remote-data'; import { RequestService } from '../data/request.service'; +import { BrowseDefinition } from '../shared/browse-definition.model'; import { FlatBrowseDefinition } from '../shared/flat-browse-definition.model'; import { BrowseEntry } from '../shared/browse-entry.model'; import { HALEndpointService } from '../shared/hal-endpoint.service'; @@ -60,7 +61,7 @@ export class BrowseService { /** * Get all BrowseDefinitions */ - getBrowseDefinitions(): Observable>> { + getBrowseDefinitions(): Observable>> { // TODO properly support pagination return this.browseDefinitionDataService.findAll({ elementsPerPage: 9999 }).pipe( getFirstSucceededRemoteData(), @@ -233,13 +234,18 @@ export class BrowseService { return this.getBrowseDefinitions().pipe( getRemoteDataPayload(), getPaginatedListPayload(), - map((browseDefinitions: FlatBrowseDefinition[]) => browseDefinitions - .find((def: FlatBrowseDefinition) => { - const matchingKeys = def.metadataKeys.find((key: string) => searchKeyArray.indexOf(key) >= 0); + map((browseDefinitions: BrowseDefinition[]) => browseDefinitions + .find((def: BrowseDefinition) => { + let matchingKeys = ''; + + if (Array.isArray((def as FlatBrowseDefinition).metadataKeys)) { + matchingKeys = (def as FlatBrowseDefinition).metadataKeys.find((key: string) => searchKeyArray.indexOf(key) >= 0); + } + return isNotEmpty(matchingKeys); }) ), - map((def: FlatBrowseDefinition) => { + map((def: BrowseDefinition) => { if (isEmpty(def) || isEmpty(def._links) || isEmpty(def._links[linkPath])) { throw new Error(`A browse endpoint for ${linkPath} on ${metadataKey} isn't configured`); } else { diff --git a/src/app/core/core.module.ts b/src/app/core/core.module.ts index c00cfd6002..5365de0c4b 100644 --- a/src/app/core/core.module.ts +++ b/src/app/core/core.module.ts @@ -73,7 +73,7 @@ import { ServerResponseService } from './services/server-response.service'; import { NativeWindowFactory, NativeWindowService } from './services/window.service'; import { BitstreamFormat } from './shared/bitstream-format.model'; import { Bitstream } from './shared/bitstream.model'; -import { FlatBrowseDefinition } from './shared/flat-browse-definition.model'; +import { BrowseDefinition } from './shared/browse-definition.model'; import { BrowseEntry } from './shared/browse-entry.model'; import { Bundle } from './shared/bundle.model'; import { Collection } from './shared/collection.model'; @@ -325,7 +325,7 @@ export const models = SubmissionUploadsModel, AuthStatus, BrowseEntry, - FlatBrowseDefinition, + BrowseDefinition, HierarchicalBrowseDefinition, ClaimedTask, TaskObject, diff --git a/src/app/core/data/browse-response-parsing.service.ts b/src/app/core/data/browse-response-parsing.service.ts index 9aa508ccf0..cc1a4a64a1 100644 --- a/src/app/core/data/browse-response-parsing.service.ts +++ b/src/app/core/data/browse-response-parsing.service.ts @@ -1,35 +1,42 @@ import { Injectable } from '@angular/core'; import { ObjectCacheService } from '../cache/object-cache.service'; import { hasValue } from '../../shared/empty.util'; -import { HIERARCHICAL_BROWSE_DEFINITION } from '../shared/hierarchical-browse-definition.resource-type'; +import { + HIERARCHICAL_BROWSE_DEFINITION +} from '../shared/hierarchical-browse-definition.resource-type'; import { FLAT_BROWSE_DEFINITION } from '../shared/flat-browse-definition.resource-type'; import { HierarchicalBrowseDefinition } from '../shared/hierarchical-browse-definition.model'; import { FlatBrowseDefinition } from '../shared/flat-browse-definition.model'; import { DSOResponseParsingService } from './dso-response-parsing.service'; +import { Serializer } from '../serializer'; +import { BrowseDefinition } from '../shared/browse-definition.model'; +import { BROWSE_DEFINITION } from '../shared/browse-definition.resource-type'; /** * A ResponseParsingService used to parse RawRestResponse coming from the REST API to a BrowseDefinition object */ @Injectable({ - providedIn: 'root', - }) + providedIn: 'root', +}) export class BrowseResponseParsingService extends DSOResponseParsingService { - protected objectCache: ObjectCacheService; - protected toCache: boolean; + constructor( + protected objectCache: ObjectCacheService, + ) { + super(objectCache); + } protected deserialize(obj): any { const browseType: string = obj.browseType; - if (hasValue(browseType)) { + if (obj.type === BROWSE_DEFINITION.value && hasValue(browseType)) { + let serializer: Serializer; if (browseType === HIERARCHICAL_BROWSE_DEFINITION.value) { - const serializer = new this.serializerConstructor(HierarchicalBrowseDefinition); - return serializer.deserialize(obj); - } else if (browseType === FLAT_BROWSE_DEFINITION.value) { - const serializer = new this.serializerConstructor(FlatBrowseDefinition); - return serializer.deserialize(obj); + serializer = new this.serializerConstructor(HierarchicalBrowseDefinition); + } else { + serializer = new this.serializerConstructor(FlatBrowseDefinition); } + return serializer.deserialize(obj); } else { - console.warn('cannot deserialize type ' + browseType); - return null; + return super.deserialize(obj); } } } diff --git a/src/app/core/shared/browse-definition.model.ts b/src/app/core/shared/browse-definition.model.ts new file mode 100644 index 0000000000..a5bed53c9f --- /dev/null +++ b/src/app/core/shared/browse-definition.model.ts @@ -0,0 +1,16 @@ +import { autoserialize } from 'cerialize'; +import { CacheableObject } from '../cache/cacheable-object.model'; + +/** + * Base class for BrowseDefinition models + */ +export abstract class BrowseDefinition extends CacheableObject { + + @autoserialize + id: string; + + /** + * Get the render type of the BrowseDefinition model + */ + abstract getRenderType(): string; +} diff --git a/src/app/core/shared/browse-definition.ts b/src/app/core/shared/browse-definition.ts deleted file mode 100644 index 788ef65739..0000000000 --- a/src/app/core/shared/browse-definition.ts +++ /dev/null @@ -1,10 +0,0 @@ -/** - * Base class for BrowseDefinition models - */ -export abstract class BrowseDefinition { - - /** - * Get the render type of the BrowseDefinition model - */ - abstract getRenderType(): string; -} diff --git a/src/app/core/shared/flat-browse-definition.model.ts b/src/app/core/shared/flat-browse-definition.model.ts index fa664c7747..9660a3bac9 100644 --- a/src/app/core/shared/flat-browse-definition.model.ts +++ b/src/app/core/shared/flat-browse-definition.model.ts @@ -1,16 +1,16 @@ -import { autoserialize, autoserializeAs, deserialize } from 'cerialize'; +import { autoserialize, autoserializeAs, deserialize, inheritSerialization } from 'cerialize'; import { typedObject } from '../cache/builders/build-decorators'; import { excludeFromEquals } from '../utilities/equals.decorators'; import { FLAT_BROWSE_DEFINITION } from './flat-browse-definition.resource-type'; import { HALLink } from './hal-link.model'; import { ResourceType } from './resource-type'; import { SortOption } from './sort-option.model'; -import { CacheableObject } from '../cache/cacheable-object.model'; import { BrowseByDataType } from '../../browse-by/browse-by-switcher/browse-by-decorator'; -import { BrowseDefinition } from './browse-definition'; +import { BrowseDefinition } from './browse-definition.model'; @typedObject -export class FlatBrowseDefinition extends CacheableObject implements BrowseDefinition { +@inheritSerialization(BrowseDefinition) +export class FlatBrowseDefinition extends BrowseDefinition { static type = FLAT_BROWSE_DEFINITION; /** @@ -19,9 +19,6 @@ export class FlatBrowseDefinition extends CacheableObject implements BrowseDefin @excludeFromEquals type: ResourceType = FLAT_BROWSE_DEFINITION; - @autoserialize - id: string; - @autoserialize sortOptions: SortOption[]; diff --git a/src/app/core/shared/hierarchical-browse-definition.model.ts b/src/app/core/shared/hierarchical-browse-definition.model.ts index a57550e1b3..427f5e1947 100644 --- a/src/app/core/shared/hierarchical-browse-definition.model.ts +++ b/src/app/core/shared/hierarchical-browse-definition.model.ts @@ -1,14 +1,14 @@ -import { autoserialize, autoserializeAs, deserialize } from 'cerialize'; +import { autoserialize, autoserializeAs, deserialize, inheritSerialization } from 'cerialize'; import { typedObject } from '../cache/builders/build-decorators'; import { excludeFromEquals } from '../utilities/equals.decorators'; import { HIERARCHICAL_BROWSE_DEFINITION } from './hierarchical-browse-definition.resource-type'; import { HALLink } from './hal-link.model'; import { ResourceType } from './resource-type'; -import { CacheableObject } from '../cache/cacheable-object.model'; -import { BrowseDefinition } from './browse-definition'; +import { BrowseDefinition } from './browse-definition.model'; @typedObject -export class HierarchicalBrowseDefinition extends CacheableObject implements BrowseDefinition { +@inheritSerialization(BrowseDefinition) +export class HierarchicalBrowseDefinition extends BrowseDefinition { static type = HIERARCHICAL_BROWSE_DEFINITION; /** @@ -17,9 +17,6 @@ export class HierarchicalBrowseDefinition extends CacheableObject implements Bro @excludeFromEquals type: ResourceType = HIERARCHICAL_BROWSE_DEFINITION; - @autoserialize - id: string; - @autoserialize facetType: string; diff --git a/src/app/core/shared/operators.ts b/src/app/core/shared/operators.ts index dd0ade112a..32610c82fd 100644 --- a/src/app/core/shared/operators.ts +++ b/src/app/core/shared/operators.ts @@ -6,7 +6,7 @@ import { PaginatedList } from '../data/paginated-list.model'; import { RemoteData } from '../data/remote-data'; import { MetadataField } from '../metadata/metadata-field.model'; import { MetadataSchema } from '../metadata/metadata-schema.model'; -import { FlatBrowseDefinition } from './flat-browse-definition.model'; +import { BrowseDefinition } from './browse-definition.model'; import { DSpaceObject } from './dspace-object.model'; import { InjectionToken } from '@angular/core'; import { MonoTypeOperatorFunction, SchedulerLike } from 'rxjs/internal/types'; @@ -171,17 +171,17 @@ export const toDSpaceObjectListRD = () => /** * Get the browse links from a definition by ID given an array of all definitions * @param {string} definitionID - * @returns {(source: Observable>) => Observable} + * @returns {(source: Observable>) => Observable} */ export const getBrowseDefinitionLinks = (definitionID: string) => - (source: Observable>>): Observable => + (source: Observable>>): Observable => source.pipe( getRemoteDataPayload(), getPaginatedListPayload(), - map((browseDefinitions: FlatBrowseDefinition[]) => browseDefinitions - .find((def: FlatBrowseDefinition) => def.id === definitionID) + map((browseDefinitions: BrowseDefinition[]) => browseDefinitions + .find((def: BrowseDefinition) => def.id === definitionID) ), - map((def: FlatBrowseDefinition) => { + map((def: BrowseDefinition) => { if (isNotEmpty(def)) { return def._links; } else { diff --git a/src/app/menu.resolver.ts b/src/app/menu.resolver.ts index d423d3bc33..f771ef8b27 100644 --- a/src/app/menu.resolver.ts +++ b/src/app/menu.resolver.ts @@ -7,7 +7,7 @@ import { MenuItemType } from './shared/menu/menu-item-type.model'; import { LinkMenuItemModel } from './shared/menu/menu-item/models/link.model'; import { getFirstCompletedRemoteData } from './core/shared/operators'; import { PaginatedList } from './core/data/paginated-list.model'; -import { FlatBrowseDefinition } from './core/shared/flat-browse-definition.model'; +import { BrowseDefinition } from './core/shared/browse-definition.model'; import { RemoteData } from './core/data/remote-data'; import { TextMenuItemModel } from './shared/menu/menu-item/models/text.model'; import { BrowseService } from './core/browse/browse.service'; @@ -108,10 +108,10 @@ export class MenuResolver implements Resolve { ]; // Read the different Browse-By types from config and add them to the browse menu this.browseService.getBrowseDefinitions() - .pipe(getFirstCompletedRemoteData>()) - .subscribe((browseDefListRD: RemoteData>) => { + .pipe(getFirstCompletedRemoteData>()) + .subscribe((browseDefListRD: RemoteData>) => { if (browseDefListRD.hasSucceeded) { - browseDefListRD.payload.page.forEach((browseDef: FlatBrowseDefinition) => { + browseDefListRD.payload.page.forEach((browseDef: BrowseDefinition) => { menuList.push({ id: `browse_global_by_${browseDef.id}`, parentID: 'browse_global', diff --git a/src/app/navbar/navbar.component.spec.ts b/src/app/navbar/navbar.component.spec.ts index 084047fc46..ada9be9d0b 100644 --- a/src/app/navbar/navbar.component.spec.ts +++ b/src/app/navbar/navbar.component.spec.ts @@ -16,7 +16,7 @@ import { RouterTestingModule } from '@angular/router/testing'; import { BrowseService } from '../core/browse/browse.service'; import { createSuccessfulRemoteDataObject, createSuccessfulRemoteDataObject$ } from '../shared/remote-data.utils'; import { buildPaginatedList } from '../core/data/paginated-list.model'; -import { FlatBrowseDefinition } from '../core/shared/flat-browse-definition.model'; +import { BrowseDefinition } from '../core/shared/browse-definition.model'; import { BrowseByDataType } from '../browse-by/browse-by-switcher/browse-by-decorator'; import { Item } from '../core/shared/item.model'; import { AuthorizationDataService } from '../core/data/feature-authorization/authorization-data.service'; @@ -66,26 +66,26 @@ describe('NavbarComponent', () => { beforeEach(waitForAsync(() => { browseDefinitions = [ Object.assign( - new FlatBrowseDefinition(), { + new BrowseDefinition(), { id: 'title', dataType: BrowseByDataType.Title, } ), Object.assign( - new FlatBrowseDefinition(), { + new BrowseDefinition(), { id: 'dateissued', dataType: BrowseByDataType.Date, metadataKeys: ['dc.date.issued'] } ), Object.assign( - new FlatBrowseDefinition(), { + new BrowseDefinition(), { id: 'author', dataType: BrowseByDataType.Metadata, } ), Object.assign( - new FlatBrowseDefinition(), { + new BrowseDefinition(), { id: 'subject', dataType: BrowseByDataType.Metadata, } diff --git a/src/app/shared/comcol/comcol-page-browse-by/comcol-page-browse-by.component.ts b/src/app/shared/comcol/comcol-page-browse-by/comcol-page-browse-by.component.ts index 668bd138c8..0527d283f0 100644 --- a/src/app/shared/comcol/comcol-page-browse-by/comcol-page-browse-by.component.ts +++ b/src/app/shared/comcol/comcol-page-browse-by/comcol-page-browse-by.component.ts @@ -6,7 +6,7 @@ import { getCommunityPageRoute } from '../../../community-page/community-page-ro import { getCollectionPageRoute } from '../../../collection-page/collection-page-routing-paths'; import { getFirstCompletedRemoteData } from '../../../core/shared/operators'; import { PaginatedList } from '../../../core/data/paginated-list.model'; -import { FlatBrowseDefinition } from '../../../core/shared/flat-browse-definition.model'; +import { BrowseDefinition } from '../../../core/shared/browse-definition.model'; import { RemoteData } from '../../../core/data/remote-data'; import { BrowseService } from '../../../core/browse/browse.service'; @@ -46,11 +46,11 @@ export class ComcolPageBrowseByComponent implements OnInit { ngOnInit(): void { this.browseService.getBrowseDefinitions() - .pipe(getFirstCompletedRemoteData>()) - .subscribe((browseDefListRD: RemoteData>) => { + .pipe(getFirstCompletedRemoteData>()) + .subscribe((browseDefListRD: RemoteData>) => { if (browseDefListRD.hasSucceeded) { this.allOptions = browseDefListRD.payload.page - .map((config: FlatBrowseDefinition) => ({ + .map((config: BrowseDefinition) => ({ id: config.id, label: `browse.comcol.by.${config.id}`, routerLink: `/browse/${config.id}`, From 69a3a1ec08a00903ab547216dc931df0427758d2 Mon Sep 17 00:00:00 2001 From: Alisa Ismailati Date: Thu, 18 May 2023 11:30:51 +0200 Subject: [PATCH 238/409] [DURACOM-133] Remove isAdmin checks --- .../workspaceitem/workspaceitem-actions.component.html | 4 ++-- .../workspaceitem/workspaceitem-actions.component.ts | 4 ---- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/src/app/shared/mydspace-actions/workspaceitem/workspaceitem-actions.component.html b/src/app/shared/mydspace-actions/workspaceitem/workspaceitem-actions.component.html index 6c3dd79d7c..6e958c7a8b 100644 --- a/src/app/shared/mydspace-actions/workspaceitem/workspaceitem-actions.component.html +++ b/src/app/shared/mydspace-actions/workspaceitem/workspaceitem-actions.component.html @@ -8,7 +8,7 @@ @@ -16,7 +16,7 @@
    diff --git a/src/assets/i18n/en.json5 b/src/assets/i18n/en.json5 index 375fc3856a..9f0684fbf3 100644 --- a/src/assets/i18n/en.json5 +++ b/src/assets/i18n/en.json5 @@ -849,6 +849,8 @@ "browse.startsWith.type_text": "Filter results by typing the first few letters", + "browse.startsWith.input": "Filter", + "browse.title": "Browsing {{ collection }} by {{ field }}{{ startsWith }} {{ value }}", "browse.title.page": "Browsing {{ collection }} by {{ field }} {{ value }}", From ba8b27e611a6c14d35317609f6049ffe2cf9c07c Mon Sep 17 00:00:00 2001 From: Giuseppe Digilio Date: Thu, 18 May 2023 19:03:37 +0200 Subject: [PATCH 244/409] Fix test --- .../workspaceitems-delete-page.component.spec.ts | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/app/workspaceitems-edit-page/workspaceitems-delete-page/workspaceitems-delete-page.component.spec.ts b/src/app/workspaceitems-edit-page/workspaceitems-delete-page/workspaceitems-delete-page.component.spec.ts index c11659df24..e2135636a5 100644 --- a/src/app/workspaceitems-edit-page/workspaceitems-delete-page/workspaceitems-delete-page.component.spec.ts +++ b/src/app/workspaceitems-edit-page/workspaceitems-delete-page/workspaceitems-delete-page.component.spec.ts @@ -6,7 +6,7 @@ import { ComponentFixture, TestBed } from '@angular/core/testing'; import { WorkspaceItemsDeletePageComponent } from './workspaceitems-delete-page.component'; import { ActivatedRoute, Router } from '@angular/router'; -import { NgbModal } from '@ng-bootstrap/ng-bootstrap'; +import { NgbModalModule } from '@ng-bootstrap/ng-bootstrap'; import { TranslateModule, TranslateService } from '@ngx-translate/core'; import { NotificationsServiceStub } from '../../shared/testing/notifications-service.stub'; import { EventEmitter, NO_ERRORS_SCHEMA } from '@angular/core'; @@ -46,7 +46,10 @@ describe('WorkspaceitemsDeletePageComponent', () => { beforeEach(async () => { await TestBed.configureTestingModule({ - imports: [TranslateModule.forRoot()], + imports: [ + NgbModalModule, + TranslateModule.forRoot() + ], declarations: [WorkspaceItemsDeletePageComponent], providers: [ { @@ -65,7 +68,6 @@ describe('WorkspaceitemsDeletePageComponent', () => { useValue: workspaceitemDataServiceSpy, }, { provide: Location, useValue: new LocationStub() }, - { provide: NgbModal, useValue: modalService }, { provide: NotificationsService, useValue: new NotificationsServiceStub(), From ba2444768e6148b1293a58e1e6e55ee886a138ef Mon Sep 17 00:00:00 2001 From: Tim Donohue Date: Thu, 18 May 2023 13:14:37 -0500 Subject: [PATCH 245/409] Minor fix to spec after Angular 15 update --- .../community-list/community-list.component.spec.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/app/community-list-page/community-list/community-list.component.spec.ts b/src/app/community-list-page/community-list/community-list.component.spec.ts index 2120df62fa..ce6b27dbeb 100644 --- a/src/app/community-list-page/community-list/community-list.component.spec.ts +++ b/src/app/community-list-page/community-list/community-list.component.spec.ts @@ -194,8 +194,9 @@ describe('CommunityListComponent', () => { }, }), CdkTreeModule, - RouterTestingModule], - declarations: [CommunityListComponent, RouterLinkWithHref], + RouterTestingModule, + RouterLinkWithHref], + declarations: [CommunityListComponent], providers: [CommunityListComponent, { provide: CommunityListService, useValue: communityListServiceStub },], schemas: [CUSTOM_ELEMENTS_SCHEMA], From 12a561d0a03f4121f76bc6a55f7ba08bf56ad01b Mon Sep 17 00:00:00 2001 From: Tim Donohue Date: Thu, 18 May 2023 13:28:08 -0500 Subject: [PATCH 246/409] Comment out problematic test in "workspaceitems-delete-page" component --- .../workspaceitems-delete-page.component.spec.ts | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/app/workspaceitems-edit-page/workspaceitems-delete-page/workspaceitems-delete-page.component.spec.ts b/src/app/workspaceitems-edit-page/workspaceitems-delete-page/workspaceitems-delete-page.component.spec.ts index c11659df24..1bdf10d7a1 100644 --- a/src/app/workspaceitems-edit-page/workspaceitems-delete-page/workspaceitems-delete-page.component.spec.ts +++ b/src/app/workspaceitems-edit-page/workspaceitems-delete-page/workspaceitems-delete-page.component.spec.ts @@ -14,7 +14,6 @@ import { Location } from '@angular/common'; import { of as observableOf } from 'rxjs'; import { routeServiceStub } from '../../shared/testing/route-service.stub'; import { LocationStub } from '../../shared/testing/location.stub'; -import { By } from '@angular/platform-browser'; import { ActivatedRouteStub } from '../../shared/testing/active-router.stub'; import { createSuccessfulRemoteDataObject } from '../../shared/remote-data.utils'; import { WorkspaceItem } from '../../core/submission/models/workspaceitem.model'; @@ -93,12 +92,12 @@ describe('WorkspaceitemsDeletePageComponent', () => { }); }); - it('should delete the target workspace item', () => { + /*it('should delete the target workspace item', () => { spyOn((component as any).modalService, 'open').and.returnValue({}); component.confirmDelete(By.css('#delete-modal')); fixture.detectChanges(); expect((component as any).modalService.open).toHaveBeenCalled(); - }); + });*/ it('should call workspaceItemService.delete', () => { component.sendDeleteRequest(); From 008dee60c1903b7db0329baa60b59a9deb890617 Mon Sep 17 00:00:00 2001 From: Giuseppe Digilio Date: Thu, 18 May 2023 23:21:45 +0200 Subject: [PATCH 247/409] Fix test --- .../workspaceitems-delete-page.component.spec.ts | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/src/app/workspaceitems-edit-page/workspaceitems-delete-page/workspaceitems-delete-page.component.spec.ts b/src/app/workspaceitems-edit-page/workspaceitems-delete-page/workspaceitems-delete-page.component.spec.ts index c0094e36aa..ac2878e8bd 100644 --- a/src/app/workspaceitems-edit-page/workspaceitems-delete-page/workspaceitems-delete-page.component.spec.ts +++ b/src/app/workspaceitems-edit-page/workspaceitems-delete-page/workspaceitems-delete-page.component.spec.ts @@ -14,6 +14,7 @@ import { Location } from '@angular/common'; import { of as observableOf } from 'rxjs'; import { routeServiceStub } from '../../shared/testing/route-service.stub'; import { LocationStub } from '../../shared/testing/location.stub'; +import { By } from '@angular/platform-browser'; import { ActivatedRouteStub } from '../../shared/testing/active-router.stub'; import { createSuccessfulRemoteDataObject } from '../../shared/remote-data.utils'; import { WorkspaceItem } from '../../core/submission/models/workspaceitem.model'; @@ -39,10 +40,6 @@ describe('WorkspaceitemsDeletePageComponent', () => { onDefaultLangChange: new EventEmitter() }; - const modalService = { - open: () => {/** empty */}, - }; - beforeEach(async () => { await TestBed.configureTestingModule({ imports: [ @@ -94,12 +91,12 @@ describe('WorkspaceitemsDeletePageComponent', () => { }); }); - /*it('should delete the target workspace item', () => { - spyOn((component as any).modalService, 'open').and.returnValue({}); + it('should delete the target workspace item', () => { + spyOn((component as any).modalService, 'open').and.returnValue({result: Promise.resolve('ok')}); component.confirmDelete(By.css('#delete-modal')); fixture.detectChanges(); expect((component as any).modalService.open).toHaveBeenCalled(); - });*/ + }); it('should call workspaceItemService.delete', () => { component.sendDeleteRequest(); From a4a0482d8852cd1bddc60661c27f3f7925e4a3d5 Mon Sep 17 00:00:00 2001 From: Alexandre Vryghem Date: Wed, 17 May 2023 18:10:32 +0200 Subject: [PATCH 248/409] 101577: Fixed ListableObjectComponentLoaderComponent not updating its @listableObjectComponent components ngOnChanges --- ...-object-component-loader.component.spec.ts | 2 +- ...table-object-component-loader.component.ts | 35 ++++++++++++++----- 2 files changed, 27 insertions(+), 10 deletions(-) diff --git a/src/app/shared/object-collection/shared/listable-object/listable-object-component-loader.component.spec.ts b/src/app/shared/object-collection/shared/listable-object/listable-object-component-loader.component.spec.ts index edf0b3ea7c..a932eb17a4 100644 --- a/src/app/shared/object-collection/shared/listable-object/listable-object-component-loader.component.spec.ts +++ b/src/app/shared/object-collection/shared/listable-object/listable-object-component-loader.component.spec.ts @@ -148,7 +148,7 @@ describe('ListableObjectComponentLoaderComponent', () => { (listableComponent as any).reloadedObject.emit(reloadedObject); tick(); - expect((comp as any).instantiateComponent).toHaveBeenCalledWith(reloadedObject); + expect((comp as any).instantiateComponent).toHaveBeenCalledWith(reloadedObject, undefined); })); it('should re-emit it as a contentChange', fakeAsync(() => { diff --git a/src/app/shared/object-collection/shared/listable-object/listable-object-component-loader.component.ts b/src/app/shared/object-collection/shared/listable-object/listable-object-component-loader.component.ts index 8adbcbeec3..6d6048afa3 100644 --- a/src/app/shared/object-collection/shared/listable-object/listable-object-component-loader.component.ts +++ b/src/app/shared/object-collection/shared/listable-object/listable-object-component-loader.component.ts @@ -19,8 +19,8 @@ import { getListableObjectComponent } from './listable-object.decorator'; import { GenericConstructor } from '../../../../core/shared/generic-constructor'; import { ListableObjectDirective } from './listable-object.directive'; import { CollectionElementLinkType } from '../../collection-element-link.type'; -import { hasValue, isNotEmpty } from '../../../empty.util'; -import { Subscription } from 'rxjs'; +import { hasValue, isNotEmpty, hasNoValue } from '../../../empty.util'; +import { Subscription, combineLatest, of as observableOf, Observable } from 'rxjs'; import { DSpaceObject } from '../../../../core/shared/dspace-object.model'; import { take } from 'rxjs/operators'; import { ThemeService } from '../../../theme-support/theme.service'; @@ -147,8 +147,18 @@ export class ListableObjectComponentLoaderComponent implements OnInit, OnChanges * Whenever the inputs change, update the inputs of the dynamic component */ ngOnChanges(changes: SimpleChanges): void { - if (this.inAndOutputNames.some((name: any) => hasValue(changes[name]))) { - this.connectInputsAndOutputs(); + if (hasNoValue(this.compRef)) { + // sometimes the component has not been initialized yet, so it first needs to be initialized + // before being called again + this.instantiateComponent(this.object, changes); + } else { + // if an input or output has changed + if (this.inAndOutputNames.some((name: any) => hasValue(changes[name]))) { + this.connectInputsAndOutputs(); + if (this.compRef?.instance && 'ngOnChanges' in this.compRef.instance) { + (this.compRef.instance as any).ngOnChanges(changes); + } + } } } @@ -158,7 +168,7 @@ export class ListableObjectComponentLoaderComponent implements OnInit, OnChanges .forEach((subscription) => subscription.unsubscribe()); } - private instantiateComponent(object) { + private instantiateComponent(object: ListableObject, changes?: SimpleChanges): void { this.initBadges(); @@ -177,14 +187,21 @@ export class ListableObjectComponentLoaderComponent implements OnInit, OnChanges [this.badges.nativeElement], ]); - this.connectInputsAndOutputs(); + if (hasValue(changes)) { + this.ngOnChanges(changes); + } else { + this.connectInputsAndOutputs(); + } if ((this.compRef.instance as any).reloadedObject) { - (this.compRef.instance as any).reloadedObject.pipe(take(1)).subscribe((reloadedObject: DSpaceObject) => { + combineLatest([ + observableOf(changes), + (this.compRef.instance as any).reloadedObject.pipe(take(1)) as Observable, + ]).subscribe(([simpleChanges, reloadedObject]: [SimpleChanges, DSpaceObject]) => { if (reloadedObject) { this.compRef.destroy(); this.object = reloadedObject; - this.instantiateComponent(reloadedObject); + this.instantiateComponent(reloadedObject, simpleChanges); this.contentChange.emit(reloadedObject); } }); @@ -220,7 +237,7 @@ export class ListableObjectComponentLoaderComponent implements OnInit, OnChanges */ protected connectInputsAndOutputs(): void { if (isNotEmpty(this.inAndOutputNames) && hasValue(this.compRef) && hasValue(this.compRef.instance)) { - this.inAndOutputNames.forEach((name: any) => { + this.inAndOutputNames.filter((name: any) => this[name] !== undefined).forEach((name: any) => { this.compRef.instance[name] = this[name]; }); } From 2ca91fd331d29f99ee64358ce93b0d684149715d Mon Sep 17 00:00:00 2001 From: Alexandre Vryghem Date: Wed, 17 May 2023 18:49:06 +0200 Subject: [PATCH 249/409] 101577: Fixed MetadataRepresentationLoaderComponent not updating its @metadataRepresentationComponent components ngOnChanges --- ...-item-metadata-list-element.component.html | 8 +-- ...em-metadata-list-element.component.spec.ts | 2 +- ...-item-metadata-list-element.component.html | 10 +-- ...em-metadata-list-element.component.spec.ts | 2 +- ...etadata-representation-loader.component.ts | 71 +++++++++++++++---- .../item-metadata-list-element.component.html | 2 +- ...em-metadata-list-element.component.spec.ts | 2 +- ...a-representation-list-element.component.ts | 6 +- ...a-representation-list-element.component.ts | 10 ++- ...-text-metadata-list-element.component.html | 2 +- ...xt-metadata-list-element.component.spec.ts | 2 +- 11 files changed, 85 insertions(+), 32 deletions(-) diff --git a/src/app/entity-groups/research-entities/metadata-representations/org-unit/org-unit-item-metadata-list-element.component.html b/src/app/entity-groups/research-entities/metadata-representations/org-unit/org-unit-item-metadata-list-element.component.html index 1771f3d2bc..ec4dbd4323 100644 --- a/src/app/entity-groups/research-entities/metadata-representations/org-unit/org-unit-item-metadata-list-element.component.html +++ b/src/app/entity-groups/research-entities/metadata-representations/org-unit/org-unit-item-metadata-list-element.component.html @@ -1,12 +1,12 @@ - + - + + [innerHTML]="mdRepresentation.getValue()" + [ngbTooltip]="mdRepresentation.allMetadata(['dc.description']).length > 0 ? descTemplate : null"> diff --git a/src/app/entity-groups/research-entities/metadata-representations/org-unit/org-unit-item-metadata-list-element.component.spec.ts b/src/app/entity-groups/research-entities/metadata-representations/org-unit/org-unit-item-metadata-list-element.component.spec.ts index eff6fd0b31..429f2986b9 100644 --- a/src/app/entity-groups/research-entities/metadata-representations/org-unit/org-unit-item-metadata-list-element.component.spec.ts +++ b/src/app/entity-groups/research-entities/metadata-representations/org-unit/org-unit-item-metadata-list-element.component.spec.ts @@ -34,7 +34,7 @@ describe('OrgUnitItemMetadataListElementComponent', () => { beforeEach(() => { fixture = TestBed.createComponent(OrgUnitItemMetadataListElementComponent); comp = fixture.componentInstance; - comp.metadataRepresentation = mockItemMetadataRepresentation; + comp.mdRepresentation = mockItemMetadataRepresentation; fixture.detectChanges(); }); diff --git a/src/app/entity-groups/research-entities/metadata-representations/person/person-item-metadata-list-element.component.html b/src/app/entity-groups/research-entities/metadata-representations/person/person-item-metadata-list-element.component.html index 97632117f4..6f56056781 100644 --- a/src/app/entity-groups/research-entities/metadata-representations/person/person-item-metadata-list-element.component.html +++ b/src/app/entity-groups/research-entities/metadata-representations/person/person-item-metadata-list-element.component.html @@ -1,15 +1,15 @@ - - + - + + [innerHTML]="mdRepresentation.getValue()" + [ngbTooltip]="mdRepresentation.allMetadata(['person.jobTitle']).length > 0 ? descTemplate : null"> diff --git a/src/app/entity-groups/research-entities/metadata-representations/person/person-item-metadata-list-element.component.spec.ts b/src/app/entity-groups/research-entities/metadata-representations/person/person-item-metadata-list-element.component.spec.ts index ab801826d6..865c262035 100644 --- a/src/app/entity-groups/research-entities/metadata-representations/person/person-item-metadata-list-element.component.spec.ts +++ b/src/app/entity-groups/research-entities/metadata-representations/person/person-item-metadata-list-element.component.spec.ts @@ -36,7 +36,7 @@ describe('PersonItemMetadataListElementComponent', () => { beforeEach(() => { fixture = TestBed.createComponent(PersonItemMetadataListElementComponent); comp = fixture.componentInstance; - comp.metadataRepresentation = mockItemMetadataRepresentation; + comp.mdRepresentation = mockItemMetadataRepresentation; fixture.detectChanges(); }); diff --git a/src/app/shared/metadata-representation/metadata-representation-loader.component.ts b/src/app/shared/metadata-representation/metadata-representation-loader.component.ts index 7077949809..42ee093278 100644 --- a/src/app/shared/metadata-representation/metadata-representation-loader.component.ts +++ b/src/app/shared/metadata-representation/metadata-representation-loader.component.ts @@ -1,4 +1,4 @@ -import { Component, ComponentFactoryResolver, Inject, Input, OnInit, ViewChild } from '@angular/core'; +import { Component, ComponentFactoryResolver, Inject, Input, OnInit, ViewChild, OnChanges, SimpleChanges, ComponentRef, ViewContainerRef, ComponentFactory } from '@angular/core'; import { MetadataRepresentation, MetadataRepresentationType @@ -8,19 +8,17 @@ import { Context } from '../../core/shared/context.model'; import { GenericConstructor } from '../../core/shared/generic-constructor'; import { MetadataRepresentationListElementComponent } from '../object-list/metadata-representation-list-element/metadata-representation-list-element.component'; import { MetadataRepresentationDirective } from './metadata-representation.directive'; -import { hasValue } from '../empty.util'; +import { hasValue, isNotEmpty, hasNoValue } from '../empty.util'; import { ThemeService } from '../theme-support/theme.service'; @Component({ selector: 'ds-metadata-representation-loader', - // styleUrls: ['./metadata-representation-loader.component.scss'], templateUrl: './metadata-representation-loader.component.html' }) /** * Component for determining what component to use depending on the item's entity type (dspace.entity.type), its metadata representation and, optionally, its context */ -export class MetadataRepresentationLoaderComponent implements OnInit { - private componentRefInstance: MetadataRepresentationListElementComponent; +export class MetadataRepresentationLoaderComponent implements OnInit, OnChanges { /** * The item or metadata to determine the component for @@ -31,8 +29,8 @@ export class MetadataRepresentationLoaderComponent implements OnInit { } @Input() set mdRepresentation(nextValue: MetadataRepresentation) { this._mdRepresentation = nextValue; - if (hasValue(this.componentRefInstance)) { - this.componentRefInstance.metadataRepresentation = nextValue; + if (hasValue(this.compRef?.instance)) { + this.compRef.instance.mdRepresentation = nextValue; } } @@ -46,6 +44,16 @@ export class MetadataRepresentationLoaderComponent implements OnInit { */ @ViewChild(MetadataRepresentationDirective, {static: true}) mdRepDirective: MetadataRepresentationDirective; + /** + * The reference to the dynamic component + */ + protected compRef: ComponentRef; + + protected inAndOutputNames: (keyof this)[] = [ + 'context', + 'mdRepresentation', + ]; + constructor( private componentFactoryResolver: ComponentFactoryResolver, private themeService: ThemeService, @@ -57,14 +65,41 @@ export class MetadataRepresentationLoaderComponent implements OnInit { * Set up the dynamic child component */ ngOnInit(): void { - const componentFactory = this.componentFactoryResolver.resolveComponentFactory(this.getComponent()); + this.instantiateComponent(); + } - const viewContainerRef = this.mdRepDirective.viewContainerRef; + /** + * Whenever the inputs change, update the inputs of the dynamic component + */ + ngOnChanges(changes: SimpleChanges): void { + if (hasNoValue(this.compRef)) { + // sometimes the component has not been initialized yet, so it first needs to be initialized + // before being called again + this.instantiateComponent(changes); + } else { + // if an input or output has changed + if (this.inAndOutputNames.some((name: any) => hasValue(changes[name]))) { + this.connectInputsAndOutputs(); + if (this.compRef?.instance && 'ngOnChanges' in this.compRef.instance) { + (this.compRef.instance as any).ngOnChanges(changes); + } + } + } + } + + private instantiateComponent(changes?: SimpleChanges): void { + const componentFactory: ComponentFactory = this.componentFactoryResolver.resolveComponentFactory(this.getComponent()); + + const viewContainerRef: ViewContainerRef = this.mdRepDirective.viewContainerRef; viewContainerRef.clear(); - const componentRef = viewContainerRef.createComponent(componentFactory); - this.componentRefInstance = componentRef.instance as MetadataRepresentationListElementComponent; - this.componentRefInstance.metadataRepresentation = this.mdRepresentation; + this.compRef = viewContainerRef.createComponent(componentFactory); + + if (hasValue(changes)) { + this.ngOnChanges(changes); + } else { + this.connectInputsAndOutputs(); + } } /** @@ -74,4 +109,16 @@ export class MetadataRepresentationLoaderComponent implements OnInit { private getComponent(): GenericConstructor { return this.getMetadataRepresentationComponent(this.mdRepresentation.itemType, this.mdRepresentation.representationType, this.context, this.themeService.getThemeName()); } + + /** + * Connect the in and outputs of this component to the dynamic component, + * to ensure they're in sync + */ + protected connectInputsAndOutputs(): void { + if (isNotEmpty(this.inAndOutputNames) && hasValue(this.compRef) && hasValue(this.compRef.instance)) { + this.inAndOutputNames.filter((name: any) => this[name] !== undefined).forEach((name: any) => { + this.compRef.instance[name] = this[name]; + }); + } + } } diff --git a/src/app/shared/object-list/metadata-representation-list-element/item/item-metadata-list-element.component.html b/src/app/shared/object-list/metadata-representation-list-element/item/item-metadata-list-element.component.html index 91219c7189..904ea95c20 100644 --- a/src/app/shared/object-list/metadata-representation-list-element/item/item-metadata-list-element.component.html +++ b/src/app/shared/object-list/metadata-representation-list-element/item/item-metadata-list-element.component.html @@ -1 +1 @@ - + diff --git a/src/app/shared/object-list/metadata-representation-list-element/item/item-metadata-list-element.component.spec.ts b/src/app/shared/object-list/metadata-representation-list-element/item/item-metadata-list-element.component.spec.ts index 6e48ba3a6f..99052b6b14 100644 --- a/src/app/shared/object-list/metadata-representation-list-element/item/item-metadata-list-element.component.spec.ts +++ b/src/app/shared/object-list/metadata-representation-list-element/item/item-metadata-list-element.component.spec.ts @@ -23,7 +23,7 @@ describe('ItemMetadataListElementComponent', () => { beforeEach(waitForAsync(() => { fixture = TestBed.createComponent(ItemMetadataListElementComponent); comp = fixture.componentInstance; - comp.metadataRepresentation = mockItemMetadataRepresentation; + comp.mdRepresentation = mockItemMetadataRepresentation; fixture.detectChanges(); })); diff --git a/src/app/shared/object-list/metadata-representation-list-element/item/item-metadata-representation-list-element.component.ts b/src/app/shared/object-list/metadata-representation-list-element/item/item-metadata-representation-list-element.component.ts index 967b09986d..c4a6903129 100644 --- a/src/app/shared/object-list/metadata-representation-list-element/item/item-metadata-representation-list-element.component.ts +++ b/src/app/shared/object-list/metadata-representation-list-element/item/item-metadata-representation-list-element.component.ts @@ -1,5 +1,5 @@ import { MetadataRepresentationListElementComponent } from '../metadata-representation-list-element.component'; -import { Component, OnInit } from '@angular/core'; +import { Component, OnInit, Input } from '@angular/core'; import { ItemMetadataRepresentation } from '../../../../core/shared/metadata-representation/item/item-metadata-representation.model'; import { getItemPageRoute } from '../../../../item-page/item-page-routing-paths'; @@ -11,7 +11,7 @@ import { getItemPageRoute } from '../../../../item-page/item-page-routing-paths' * An abstract class for displaying a single ItemMetadataRepresentation */ export class ItemMetadataRepresentationListElementComponent extends MetadataRepresentationListElementComponent implements OnInit { - metadataRepresentation: ItemMetadataRepresentation; + @Input() mdRepresentation: ItemMetadataRepresentation; /** * Route to the item's page @@ -19,6 +19,6 @@ export class ItemMetadataRepresentationListElementComponent extends MetadataRepr itemPageRoute: string; ngOnInit(): void { - this.itemPageRoute = getItemPageRoute(this.metadataRepresentation); + this.itemPageRoute = getItemPageRoute(this.mdRepresentation); } } diff --git a/src/app/shared/object-list/metadata-representation-list-element/metadata-representation-list-element.component.ts b/src/app/shared/object-list/metadata-representation-list-element/metadata-representation-list-element.component.ts index 2e14485fbb..b13dd60601 100644 --- a/src/app/shared/object-list/metadata-representation-list-element/metadata-representation-list-element.component.ts +++ b/src/app/shared/object-list/metadata-representation-list-element/metadata-representation-list-element.component.ts @@ -1,5 +1,6 @@ -import { Component } from '@angular/core'; +import { Component, Input } from '@angular/core'; import { MetadataRepresentation } from '../../../core/shared/metadata-representation/metadata-representation.model'; +import { Context } from '../../../core/shared/context.model'; @Component({ selector: 'ds-metadata-representation-list-element', @@ -9,8 +10,13 @@ import { MetadataRepresentation } from '../../../core/shared/metadata-representa * An abstract class for displaying a single MetadataRepresentation */ export class MetadataRepresentationListElementComponent { + /** + * The optional context + */ + @Input() context: Context; + /** * The metadata representation of this component */ - metadataRepresentation: MetadataRepresentation; + @Input() mdRepresentation: MetadataRepresentation; } diff --git a/src/app/shared/object-list/metadata-representation-list-element/plain-text/plain-text-metadata-list-element.component.html b/src/app/shared/object-list/metadata-representation-list-element/plain-text/plain-text-metadata-list-element.component.html index 31b670b1a3..cd199836b6 100644 --- a/src/app/shared/object-list/metadata-representation-list-element/plain-text/plain-text-metadata-list-element.component.html +++ b/src/app/shared/object-list/metadata-representation-list-element/plain-text/plain-text-metadata-list-element.component.html @@ -1,3 +1,3 @@
    - {{metadataRepresentation.getValue()}} + {{mdRepresentation.getValue()}}
    diff --git a/src/app/shared/object-list/metadata-representation-list-element/plain-text/plain-text-metadata-list-element.component.spec.ts b/src/app/shared/object-list/metadata-representation-list-element/plain-text/plain-text-metadata-list-element.component.spec.ts index af09d3c204..39ee54c32b 100644 --- a/src/app/shared/object-list/metadata-representation-list-element/plain-text/plain-text-metadata-list-element.component.spec.ts +++ b/src/app/shared/object-list/metadata-representation-list-element/plain-text/plain-text-metadata-list-element.component.spec.ts @@ -25,7 +25,7 @@ describe('PlainTextMetadataListElementComponent', () => { beforeEach(waitForAsync(() => { fixture = TestBed.createComponent(PlainTextMetadataListElementComponent); comp = fixture.componentInstance; - comp.metadataRepresentation = mockMetadataRepresentation; + comp.mdRepresentation = mockMetadataRepresentation; fixture.detectChanges(); })); From 82a8da60282d0f195ab3d5ac5a3f3b372a85d319 Mon Sep 17 00:00:00 2001 From: Alexandre Vryghem Date: Wed, 17 May 2023 17:57:00 +0100 Subject: [PATCH 250/409] 101577: Fixed ClaimedTaskActionsLoaderComponent not updating its @rendersWorkflowTaskOption components ngOnChanges --- .../claimed-task-actions-loader.component.ts | 73 ++++++++++++++----- 1 file changed, 54 insertions(+), 19 deletions(-) diff --git a/src/app/shared/mydspace-actions/claimed-task/switcher/claimed-task-actions-loader.component.ts b/src/app/shared/mydspace-actions/claimed-task/switcher/claimed-task-actions-loader.component.ts index 68c597a41c..288fa2e00a 100644 --- a/src/app/shared/mydspace-actions/claimed-task/switcher/claimed-task-actions-loader.component.ts +++ b/src/app/shared/mydspace-actions/claimed-task/switcher/claimed-task-actions-loader.component.ts @@ -3,18 +3,19 @@ import { ComponentFactoryResolver, EventEmitter, Input, - OnDestroy, OnInit, Output, - ViewChild + ViewChild, + OnChanges, + SimpleChanges, + ComponentRef, } from '@angular/core'; import { getComponentByWorkflowTaskOption } from './claimed-task-actions-decorator'; import { ClaimedTask } from '../../../../core/tasks/models/claimed-task-object.model'; import { ClaimedTaskActionsDirective } from './claimed-task-actions.directive'; -import { ClaimedTaskActionsAbstractComponent } from '../abstract/claimed-task-actions-abstract.component'; -import { hasValue } from '../../../empty.util'; -import { Subscription } from 'rxjs'; +import { hasValue, isNotEmpty, hasNoValue } from '../../../empty.util'; import { MyDSpaceActionsResult } from '../../mydspace-actions'; +import { ClaimedTaskActionsAbstractComponent } from '../abstract/claimed-task-actions-abstract.component'; @Component({ selector: 'ds-claimed-task-actions-loader', @@ -24,7 +25,7 @@ import { MyDSpaceActionsResult } from '../../mydspace-actions'; * Component for loading a ClaimedTaskAction component depending on the "option" input * Passes on the ClaimedTask to the component and subscribes to the processCompleted output */ -export class ClaimedTaskActionsLoaderComponent implements OnInit, OnDestroy { +export class ClaimedTaskActionsLoaderComponent implements OnInit, OnChanges { /** * The ClaimedTask object */ @@ -47,10 +48,18 @@ export class ClaimedTaskActionsLoaderComponent implements OnInit, OnDestroy { @ViewChild(ClaimedTaskActionsDirective, {static: true}) claimedTaskActionsDirective: ClaimedTaskActionsDirective; /** - * Array to track all subscriptions and unsubscribe them onDestroy - * @type {Array} + * The reference to the dynamic component */ - protected subs: Subscription[] = []; + protected compRef: ComponentRef; + + /** + * The list of input and output names for the dynamic component + */ + protected inAndOutputNames: (keyof ClaimedTaskActionsAbstractComponent & keyof this)[] = [ + 'object', + 'option', + 'processCompleted', + ]; constructor(private componentFactoryResolver: ComponentFactoryResolver) { } @@ -59,7 +68,29 @@ export class ClaimedTaskActionsLoaderComponent implements OnInit, OnDestroy { * Fetch, create and initialize the relevant component */ ngOnInit(): void { + this.instantiateComponent(); + } + /** + * Whenever the inputs change, update the inputs of the dynamic component + */ + ngOnChanges(changes: SimpleChanges): void { + if (hasNoValue(this.compRef)) { + // sometimes the component has not been initialized yet, so it first needs to be initialized + // before being called again + this.instantiateComponent(changes); + } else { + // if an input or output has changed + if (this.inAndOutputNames.some((name: any) => hasValue(changes[name]))) { + this.connectInputsAndOutputs(); + if (this.compRef?.instance && 'ngOnChanges' in this.compRef.instance) { + (this.compRef.instance as any).ngOnChanges(changes); + } + } + } + } + + private instantiateComponent(changes?: SimpleChanges): void { const comp = this.getComponentByWorkflowTaskOption(this.option); if (hasValue(comp)) { const componentFactory = this.componentFactoryResolver.resolveComponentFactory(comp); @@ -67,11 +98,12 @@ export class ClaimedTaskActionsLoaderComponent implements OnInit, OnDestroy { const viewContainerRef = this.claimedTaskActionsDirective.viewContainerRef; viewContainerRef.clear(); - const componentRef = viewContainerRef.createComponent(componentFactory); - const componentInstance = (componentRef.instance as ClaimedTaskActionsAbstractComponent); - componentInstance.object = this.object; - if (hasValue(componentInstance.processCompleted)) { - this.subs.push(componentInstance.processCompleted.subscribe((result) => this.processCompleted.emit(result))); + this.compRef = viewContainerRef.createComponent(componentFactory); + + if (hasValue(changes)) { + this.ngOnChanges(changes); + } else { + this.connectInputsAndOutputs(); } } } @@ -81,11 +113,14 @@ export class ClaimedTaskActionsLoaderComponent implements OnInit, OnDestroy { } /** - * Unsubscribe from open subscriptions + * Connect the in and outputs of this component to the dynamic component, + * to ensure they're in sync */ - ngOnDestroy(): void { - this.subs - .filter((subscription) => hasValue(subscription)) - .forEach((subscription) => subscription.unsubscribe()); + protected connectInputsAndOutputs(): void { + if (isNotEmpty(this.inAndOutputNames) && hasValue(this.compRef) && hasValue(this.compRef.instance)) { + this.inAndOutputNames.filter((name: any) => this[name] !== undefined).forEach((name: any) => { + this.compRef.instance[name] = this[name]; + }); + } } } From 98a50763663863a57688f72a11eaac47eb1b3bf8 Mon Sep 17 00:00:00 2001 From: Alexandre Vryghem Date: Fri, 19 May 2023 10:33:25 +0200 Subject: [PATCH 251/409] 101577: Fixed some SearchResultListElementComponents not rendering because of potential undefined dso --- .../claimed-task-search-result-detail-element.component.ts | 6 ++++-- .../pool-search-result-detail-element.component.ts | 6 ++++-- .../claimed-search-result-list-element.component.ts | 6 ++++-- .../pool-search-result-list-element.component.ts | 6 ++++-- 4 files changed, 16 insertions(+), 8 deletions(-) diff --git a/src/app/shared/object-detail/my-dspace-result-detail-element/claimed-task-search-result/claimed-task-search-result-detail-element.component.ts b/src/app/shared/object-detail/my-dspace-result-detail-element/claimed-task-search-result/claimed-task-search-result-detail-element.component.ts index 2ee661ef38..c5d511b867 100644 --- a/src/app/shared/object-detail/my-dspace-result-detail-element/claimed-task-search-result/claimed-task-search-result-detail-element.component.ts +++ b/src/app/shared/object-detail/my-dspace-result-detail-element/claimed-task-search-result/claimed-task-search-result-detail-element.component.ts @@ -17,7 +17,7 @@ import { followLink } from '../../../utils/follow-link-config.model'; import { LinkService } from '../../../../core/cache/builders/link.service'; import { Item } from '../../../../core/shared/item.model'; import { getFirstCompletedRemoteData } from '../../../../core/shared/operators'; -import { isNotEmpty } from '../../../empty.util'; +import { isNotEmpty, hasValue } from '../../../empty.util'; import { ObjectCacheService } from '../../../../core/cache/object-cache.service'; /** @@ -88,7 +88,9 @@ export class ClaimedTaskSearchResultDetailElementComponent extends SearchResultD ngOnDestroy() { // This ensures the object is removed from cache, when action is performed on task - this.objectCache.remove(this.dso._links.workflowitem.href); + if (hasValue(this.dso)) { + this.objectCache.remove(this.dso._links.workflowitem.href); + } } } diff --git a/src/app/shared/object-detail/my-dspace-result-detail-element/pool-search-result/pool-search-result-detail-element.component.ts b/src/app/shared/object-detail/my-dspace-result-detail-element/pool-search-result/pool-search-result-detail-element.component.ts index 6dec14f9cb..a5eca3c148 100644 --- a/src/app/shared/object-detail/my-dspace-result-detail-element/pool-search-result/pool-search-result-detail-element.component.ts +++ b/src/app/shared/object-detail/my-dspace-result-detail-element/pool-search-result/pool-search-result-detail-element.component.ts @@ -17,7 +17,7 @@ import { followLink } from '../../../utils/follow-link-config.model'; import { LinkService } from '../../../../core/cache/builders/link.service'; import { Item } from '../../../../core/shared/item.model'; import { getFirstCompletedRemoteData } from '../../../../core/shared/operators'; -import { isNotEmpty } from '../../../empty.util'; +import { isNotEmpty, hasValue } from '../../../empty.util'; import { ObjectCacheService } from '../../../../core/cache/object-cache.service'; /** @@ -89,7 +89,9 @@ export class PoolSearchResultDetailElementComponent extends SearchResultDetailEl ngOnDestroy() { // This ensures the object is removed from cache, when action is performed on task - this.objectCache.remove(this.dso._links.workflowitem.href); + if (hasValue(this.dso)) { + this.objectCache.remove(this.dso._links.workflowitem.href); + } } } diff --git a/src/app/shared/object-list/my-dspace-result-list-element/claimed-search-result/claimed-search-result-list-element.component.ts b/src/app/shared/object-list/my-dspace-result-list-element/claimed-search-result/claimed-search-result-list-element.component.ts index 237a5f516e..3da443551f 100644 --- a/src/app/shared/object-list/my-dspace-result-list-element/claimed-search-result/claimed-search-result-list-element.component.ts +++ b/src/app/shared/object-list/my-dspace-result-list-element/claimed-search-result/claimed-search-result-list-element.component.ts @@ -22,7 +22,7 @@ import { ObjectCacheService } from '../../../../core/cache/object-cache.service' import { getFirstCompletedRemoteData } from '../../../../core/shared/operators'; import { Item } from '../../../../core/shared/item.model'; import { mergeMap, tap } from 'rxjs/operators'; -import { isNotEmpty } from '../../../empty.util'; +import { isNotEmpty, hasValue } from '../../../empty.util'; @Component({ selector: 'ds-claimed-search-result-list-element', @@ -101,7 +101,9 @@ export class ClaimedSearchResultListElementComponent extends SearchResultListEle ngOnDestroy() { // This ensures the object is removed from cache, when action is performed on task - this.objectCache.remove(this.dso._links.workflowitem.href); + if (hasValue(this.dso)) { + this.objectCache.remove(this.dso._links.workflowitem.href); + } } } diff --git a/src/app/shared/object-list/my-dspace-result-list-element/pool-search-result/pool-search-result-list-element.component.ts b/src/app/shared/object-list/my-dspace-result-list-element/pool-search-result/pool-search-result-list-element.component.ts index cb924af40f..674b62733f 100644 --- a/src/app/shared/object-list/my-dspace-result-list-element/pool-search-result/pool-search-result-list-element.component.ts +++ b/src/app/shared/object-list/my-dspace-result-list-element/pool-search-result/pool-search-result-list-element.component.ts @@ -23,7 +23,7 @@ import { APP_CONFIG, AppConfig } from '../../../../../config/app-config.interfac import { ObjectCacheService } from '../../../../core/cache/object-cache.service'; import { getFirstCompletedRemoteData } from '../../../../core/shared/operators'; import { Item } from '../../../../core/shared/item.model'; -import { isNotEmpty } from '../../../empty.util'; +import { isNotEmpty, hasValue } from '../../../empty.util'; /** * This component renders pool task object for the search result in the list view. @@ -111,6 +111,8 @@ export class PoolSearchResultListElementComponent extends SearchResultListElemen ngOnDestroy() { // This ensures the object is removed from cache, when action is performed on task - this.objectCache.remove(this.dso._links.workflowitem.href); + if (hasValue(this.dso)) { + this.objectCache.remove(this.dso._links.workflowitem.href); + } } } From 92f58f0e8a79c60d0fb0bd98a7223986776c8092 Mon Sep 17 00:00:00 2001 From: Alexandre Vryghem Date: Fri, 19 May 2023 14:01:35 +0200 Subject: [PATCH 252/409] 101577: Fixed default thumbnail not working when thumbnail isn't defined --- src/app/thumbnail/thumbnail.component.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/app/thumbnail/thumbnail.component.ts b/src/app/thumbnail/thumbnail.component.ts index 90c48d19bc..7dfa2c1b5e 100644 --- a/src/app/thumbnail/thumbnail.component.ts +++ b/src/app/thumbnail/thumbnail.component.ts @@ -53,6 +53,7 @@ export class ThumbnailComponent implements OnChanges { */ ngOnChanges(changes: SimpleChanges): void { if (this.thumbnail === undefined || this.thumbnail === null) { + this.src = this.defaultImage; return; } if (this.thumbnail instanceof Bitstream) { From 11a86c3756ec92d51ab7041cd32c516be583c7a5 Mon Sep 17 00:00:00 2001 From: Alexandre Vryghem Date: Fri, 19 May 2023 14:59:23 +0200 Subject: [PATCH 253/409] Fixed switch collection in submission form not working anymore --- .../form/collection/submission-form-collection.component.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/submission/form/collection/submission-form-collection.component.ts b/src/app/submission/form/collection/submission-form-collection.component.ts index 6cdd95a5de..6a9d799ae2 100644 --- a/src/app/submission/form/collection/submission-form-collection.component.ts +++ b/src/app/submission/form/collection/submission-form-collection.component.ts @@ -168,7 +168,7 @@ export class SubmissionFormCollectionComponent implements OnChanges, OnInit { }) ).subscribe((submissionObject: SubmissionObject) => { this.selectedCollectionId = event.collection.id; - this.selectedCollectionName$ = observableOf(this.dsoNameService.getName(event.collection)); + this.selectedCollectionName$ = observableOf(event.collection.name); this.collectionChange.emit(submissionObject); this.submissionService.changeSubmissionCollection(this.submissionId, event.collection.id); this.processingChange$.next(false); From bf31c76c885669d1215491dc2acbd5e3a052f663 Mon Sep 17 00:00:00 2001 From: Nona Luypaert Date: Fri, 19 May 2023 16:36:13 +0200 Subject: [PATCH 254/409] 101623: Add ValueListBrowseDefinition model + super NonHierarchicalBrowse class --- .../browse/browse-definition-data.service.ts | 6 ++-- src/app/core/core.module.ts | 6 ++++ .../data/browse-response-parsing.service.ts | 10 ++++-- .../shared/flat-browse-definition.model.ts | 30 +++-------------- .../non-hierarchical-browse-definition.ts | 32 +++++++++++++++++++ .../value-list-browse-definition.model.ts | 26 +++++++++++++++ ...ue-list-browse-definition.resource-type.ts | 9 ++++++ 7 files changed, 88 insertions(+), 31 deletions(-) create mode 100644 src/app/core/shared/non-hierarchical-browse-definition.ts create mode 100644 src/app/core/shared/value-list-browse-definition.model.ts create mode 100644 src/app/core/shared/value-list-browse-definition.resource-type.ts diff --git a/src/app/core/browse/browse-definition-data.service.ts b/src/app/core/browse/browse-definition-data.service.ts index 5380bb7ec4..a4c7bf1353 100644 --- a/src/app/core/browse/browse-definition-data.service.ts +++ b/src/app/core/browse/browse-definition-data.service.ts @@ -18,7 +18,7 @@ import { BrowseDefinitionRestRequest } from '../data/request.models'; import { BrowseDefinition } from '../shared/browse-definition.model'; -class BrowseDefinitionDataImpl extends FindAllDataImpl { +class BrowseDefinitionFindAllDataImpl extends FindAllDataImpl { /** * Create a GET request for the given href, and send it. * Use a GET request specific for BrowseDefinitions. @@ -57,7 +57,7 @@ class BrowseDefinitionDataImpl extends FindAllDataImpl { }) @dataService(BROWSE_DEFINITION) export class BrowseDefinitionDataService extends IdentifiableDataService implements FindAllData { - private findAllData: BrowseDefinitionDataImpl; + private findAllData: BrowseDefinitionFindAllDataImpl; constructor( protected requestService: RequestService, @@ -67,7 +67,7 @@ export class BrowseDefinitionDataService extends IdentifiableDataService; if (browseType === HIERARCHICAL_BROWSE_DEFINITION.value) { serializer = new this.serializerConstructor(HierarchicalBrowseDefinition); - } else { + } else if (browseType === FLAT_BROWSE_DEFINITION.value) { serializer = new this.serializerConstructor(FlatBrowseDefinition); + } else if (browseType === VALUE_LIST_BROWSE_DEFINITION.value) { + serializer = new this.serializerConstructor(ValueListBrowseDefinition); + } else { + throw new Error('An error occurred while retrieving the browse definitions.'); } return serializer.deserialize(obj); } else { - return super.deserialize(obj); + throw new Error('An error occurred while retrieving the browse definitions.'); } } } diff --git a/src/app/core/shared/flat-browse-definition.model.ts b/src/app/core/shared/flat-browse-definition.model.ts index 9660a3bac9..f94fa75b91 100644 --- a/src/app/core/shared/flat-browse-definition.model.ts +++ b/src/app/core/shared/flat-browse-definition.model.ts @@ -1,16 +1,13 @@ -import { autoserialize, autoserializeAs, deserialize, inheritSerialization } from 'cerialize'; +import { inheritSerialization } from 'cerialize'; import { typedObject } from '../cache/builders/build-decorators'; import { excludeFromEquals } from '../utilities/equals.decorators'; import { FLAT_BROWSE_DEFINITION } from './flat-browse-definition.resource-type'; -import { HALLink } from './hal-link.model'; import { ResourceType } from './resource-type'; -import { SortOption } from './sort-option.model'; -import { BrowseByDataType } from '../../browse-by/browse-by-switcher/browse-by-decorator'; -import { BrowseDefinition } from './browse-definition.model'; +import { NonHierarchicalBrowseDefinition } from './non-hierarchical-browse-definition'; @typedObject -@inheritSerialization(BrowseDefinition) -export class FlatBrowseDefinition extends BrowseDefinition { +@inheritSerialization(NonHierarchicalBrowseDefinition) +export class FlatBrowseDefinition extends NonHierarchicalBrowseDefinition { static type = FLAT_BROWSE_DEFINITION; /** @@ -19,29 +16,10 @@ export class FlatBrowseDefinition extends BrowseDefinition { @excludeFromEquals type: ResourceType = FLAT_BROWSE_DEFINITION; - @autoserialize - sortOptions: SortOption[]; - - @autoserializeAs('order') - defaultSortOrder: string; - - @autoserializeAs('metadata') - metadataKeys: string[]; - - @autoserialize - dataType: BrowseByDataType; - get self(): string { return this._links.self.href; } - @deserialize - _links: { - self: HALLink; - entries: HALLink; - items: HALLink; - }; - getRenderType(): string { return this.dataType; } diff --git a/src/app/core/shared/non-hierarchical-browse-definition.ts b/src/app/core/shared/non-hierarchical-browse-definition.ts new file mode 100644 index 0000000000..a4f6df43d9 --- /dev/null +++ b/src/app/core/shared/non-hierarchical-browse-definition.ts @@ -0,0 +1,32 @@ +import { autoserialize, autoserializeAs, deserialize, inheritSerialization } from 'cerialize'; +import { SortOption } from './sort-option.model'; +import { BrowseByDataType } from '../../browse-by/browse-by-switcher/browse-by-decorator'; +import { HALLink } from './hal-link.model'; +import { BrowseDefinition } from './browse-definition.model'; + +/** + * Super class for NonHierarchicalBrowseDefinition models, + * e.g. FlatBrowseDefinition and ValueListBrowseDefinition + */ +@inheritSerialization(BrowseDefinition) +export abstract class NonHierarchicalBrowseDefinition extends BrowseDefinition { + + @autoserialize + sortOptions: SortOption[]; + + @autoserializeAs('order') + defaultSortOrder: string; + + @autoserializeAs('metadata') + metadataKeys: string[]; + + @autoserialize + dataType: BrowseByDataType; + + @deserialize + _links: { + self: HALLink; + entries: HALLink; + items: HALLink; + }; +} diff --git a/src/app/core/shared/value-list-browse-definition.model.ts b/src/app/core/shared/value-list-browse-definition.model.ts new file mode 100644 index 0000000000..a42a702940 --- /dev/null +++ b/src/app/core/shared/value-list-browse-definition.model.ts @@ -0,0 +1,26 @@ +import { inheritSerialization } from 'cerialize'; +import { typedObject } from '../cache/builders/build-decorators'; +import { excludeFromEquals } from '../utilities/equals.decorators'; +import { VALUE_LIST_BROWSE_DEFINITION } from './value-list-browse-definition.resource-type'; +import { ResourceType } from './resource-type'; +import { NonHierarchicalBrowseDefinition } from './non-hierarchical-browse-definition'; + +@typedObject +@inheritSerialization(NonHierarchicalBrowseDefinition) +export class ValueListBrowseDefinition extends NonHierarchicalBrowseDefinition { + static type = VALUE_LIST_BROWSE_DEFINITION; + + /** + * The object type + */ + @excludeFromEquals + type: ResourceType = VALUE_LIST_BROWSE_DEFINITION; + + get self(): string { + return this._links.self.href; + } + + getRenderType(): string { + return this.dataType; + } +} diff --git a/src/app/core/shared/value-list-browse-definition.resource-type.ts b/src/app/core/shared/value-list-browse-definition.resource-type.ts new file mode 100644 index 0000000000..8904dc472f --- /dev/null +++ b/src/app/core/shared/value-list-browse-definition.resource-type.ts @@ -0,0 +1,9 @@ +import { ResourceType } from './resource-type'; + +/** + * The resource type for ValueListBrowseDefinition + * + * Needs to be in a separate file to prevent circular + * dependencies in webpack. + */ +export const VALUE_LIST_BROWSE_DEFINITION = new ResourceType('valueList'); From 99ea73f9f61a739ff968d0482599be50429ece3a Mon Sep 17 00:00:00 2001 From: Alexandre Vryghem Date: Fri, 19 May 2023 17:46:56 +0200 Subject: [PATCH 255/409] Fix jasmine Matchers functions not properly indexing --- tsconfig.json | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/tsconfig.json b/tsconfig.json index 11b5a03eaf..1eed699114 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -46,5 +46,8 @@ "fullTemplateTypeCheck": true, "strictInjectionParameters": true, "strictInputAccessModifiers": true - } + }, + "exclude": [ + "cypress.config.ts" + ] } From 6c8f816fb20590655018ee6aba08b2c7b7085872 Mon Sep 17 00:00:00 2001 From: Alisa Ismailati Date: Thu, 27 Apr 2023 15:58:37 +0200 Subject: [PATCH 256/409] [DURACOM-133] Do not show edit/delete button for observer --- .../workspaceitem-actions.component.html | 6 +- .../workspaceitem-actions.component.spec.ts | 96 ++++++++++++++++++- .../workspaceitem-actions.component.ts | 53 ++++++++-- 3 files changed, 143 insertions(+), 12 deletions(-) diff --git a/src/app/shared/mydspace-actions/workspaceitem/workspaceitem-actions.component.html b/src/app/shared/mydspace-actions/workspaceitem/workspaceitem-actions.component.html index f789f4df47..6c3dd79d7c 100644 --- a/src/app/shared/mydspace-actions/workspaceitem/workspaceitem-actions.component.html +++ b/src/app/shared/mydspace-actions/workspaceitem/workspaceitem-actions.component.html @@ -7,7 +7,8 @@ {{"submission.workspace.generic.view" | translate}} - @@ -15,6 +16,7 @@
    -
    \ No newline at end of file + diff --git a/src/app/shared/mydspace-actions/workspaceitem/workspaceitem-actions.component.spec.ts b/src/app/shared/mydspace-actions/workspaceitem/workspaceitem-actions.component.spec.ts index 14d3c07650..f786782c05 100644 --- a/src/app/shared/mydspace-actions/workspaceitem/workspaceitem-actions.component.spec.ts +++ b/src/app/shared/mydspace-actions/workspaceitem/workspaceitem-actions.component.spec.ts @@ -1,3 +1,4 @@ +import { EPerson } from './../../../core/eperson/models/eperson.model'; import { ChangeDetectionStrategy, Injector, NO_ERRORS_SCHEMA } from '@angular/core'; import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; import { Router } from '@angular/router'; @@ -24,12 +25,16 @@ import { RequestService } from '../../../core/data/request.service'; import { getMockRequestService } from '../../mocks/request.service.mock'; import { getMockSearchService } from '../../mocks/search-service.mock'; import { SearchService } from '../../../core/shared/search/search.service'; +import { AuthService } from '../../../core/auth/auth.service'; +import { AuthorizationDataService } from '../../../core/data/feature-authorization/authorization-data.service'; let component: WorkspaceitemActionsComponent; let fixture: ComponentFixture; let mockObject: WorkspaceItem; let notificationsServiceStub: NotificationsServiceStub; +let authorizationService; +let authService; const mockDataService = jasmine.createSpyObj('WorkspaceitemDataService', { delete: jasmine.createSpy('delete') @@ -71,10 +76,88 @@ const item = Object.assign(new Item(), { const rd = createSuccessfulRemoteDataObject(item); mockObject = Object.assign(new WorkspaceItem(), { item: observableOf(rd), id: '1234', uuid: '1234' }); -describe('WorkspaceitemActionsComponent', () => { - beforeEach(waitForAsync(() => { +const ePersonMock: EPerson = Object.assign(new EPerson(), { + handle: null, + netid: null, + lastActive: '2023-04-27T12:15:57.054+00:00', + canLogIn: true, + email: 'dspacedemo+submit@gmail.com', + requireCertificate: false, + selfRegistered: false, + _name: 'dspacedemo+submit@gmail.com', + id: '914955b1-cf2e-4884-8af7-a166aa24cf73', + uuid: '914955b1-cf2e-4884-8af7-a166aa24cf73', + type: 'eperson', + metadata: { + 'dspace.agreements.cookies': [ + { + uuid: '0a53a0f2-e168-4ed9-b4af-cba9a2d267ca', + language: null, + value: + '{"authentication":true,"preferences":true,"acknowledgement":true,"google-analytics":true}', + place: 0, + authority: null, + confidence: -1, + }, + ], + 'dspace.agreements.end-user': [ + { + uuid: '0879e571-6e4a-4efe-af9b-704c755166be', + language: null, + value: 'true', + place: 0, + authority: null, + confidence: -1, + }, + ], + 'eperson.firstname': [ + { + uuid: '18052a3e-f19b-49ca-b9f9-ee4cf9c71b86', + language: null, + value: 'Demo', + place: 0, + authority: null, + confidence: -1, + }, + ], + 'eperson.language': [ + { + uuid: '98c2abdb-6a6f-4b41-b455-896bcf333ca3', + language: null, + value: 'en', + place: 0, + authority: null, + confidence: -1, + }, + ], + 'eperson.lastname': [ + { + uuid: 'df722e70-9497-468d-a92a-4038e7ef2586', + language: null, + value: 'Submitter', + place: 0, + authority: null, + confidence: -1, + }, + ], + }, + _links: { + groups: { + href: 'http://localhost:8080/server/api/eperson/epersons/914955b1-cf2e-4884-8af7-a166aa24cf73/groups', + }, + self: { + href: 'http://localhost:8080/server/api/eperson/epersons/914955b1-cf2e-4884-8af7-a166aa24cf73', + }, + }, +}); - TestBed.configureTestingModule({ +authService = jasmine.createSpyObj('authService', { + getAuthenticatedUserFromStore: jasmine.createSpy('getAuthenticatedUserFromStore') +}); + +describe('WorkspaceitemActionsComponent', () => { + beforeEach(waitForAsync(async () => { + await TestBed.configureTestingModule({ imports: [ NgbModule, TranslateModule.forRoot({ @@ -92,6 +175,8 @@ describe('WorkspaceitemActionsComponent', () => { { provide: WorkspaceitemDataService, useValue: mockDataService }, { provide: SearchService, useValue: searchService }, { provide: RequestService, useValue: requestServce }, + { provide: AuthService, useValue: authService }, + { provide: AuthorizationDataService, useValue: authorizationService}, NgbModal ], schemas: [NO_ERRORS_SCHEMA] @@ -105,6 +190,10 @@ describe('WorkspaceitemActionsComponent', () => { component = fixture.componentInstance; component.object = mockObject; notificationsServiceStub = TestBed.inject(NotificationsService as any); + authorizationService = jasmine.createSpyObj('authorizationService', { + isAuthorized: observableOf(true) + }); + (authService.getAuthenticatedUserFromStore as jasmine.Spy).and.returnValue(observableOf(ePersonMock)); fixture.detectChanges(); }); @@ -150,7 +239,6 @@ describe('WorkspaceitemActionsComponent', () => { confirmBtn.click(); fixture.detectChanges(); - fixture.whenStable().then(() => { done(); }); diff --git a/src/app/shared/mydspace-actions/workspaceitem/workspaceitem-actions.component.ts b/src/app/shared/mydspace-actions/workspaceitem/workspaceitem-actions.component.ts index a6d30728ac..d758ef1bb5 100644 --- a/src/app/shared/mydspace-actions/workspaceitem/workspaceitem-actions.component.ts +++ b/src/app/shared/mydspace-actions/workspaceitem/workspaceitem-actions.component.ts @@ -1,7 +1,12 @@ -import { Component, Injector, Input } from '@angular/core'; +import { EPerson } from './../../../core/eperson/models/eperson.model'; +import { AuthorizationDataService } from 'src/app/core/data/feature-authorization/authorization-data.service'; +import { AuthService } from './../../../core/auth/auth.service'; +import { Item } from 'src/app/core/shared/item.model'; +import { FeatureID } from './../../../core/data/feature-authorization/feature-id'; +import { Component, Injector, Input, OnInit } from '@angular/core'; import { Router } from '@angular/router'; -import { BehaviorSubject } from 'rxjs'; +import { BehaviorSubject, Observable, switchMap } from 'rxjs'; import { NgbModal } from '@ng-bootstrap/ng-bootstrap'; import { TranslateService } from '@ngx-translate/core'; @@ -11,7 +16,7 @@ import { WorkspaceitemDataService } from '../../../core/submission/workspaceitem import { NotificationsService } from '../../notifications/notifications.service'; import { RequestService } from '../../../core/data/request.service'; import { SearchService } from '../../../core/shared/search/search.service'; -import { getFirstCompletedRemoteData } from '../../../core/shared/operators'; +import { getFirstCompletedRemoteData, getRemoteDataPayload } from '../../../core/shared/operators'; import { RemoteData } from '../../../core/data/remote-data'; import { NoContent } from '../../../core/shared/NoContent.model'; import { getWorkspaceItemViewRoute } from '../../../workspaceitems-edit-page/workspaceitems-edit-page-routing-paths'; @@ -24,7 +29,7 @@ import { getWorkspaceItemViewRoute } from '../../../workspaceitems-edit-page/wor styleUrls: ['./workspaceitem-actions.component.scss'], templateUrl: './workspaceitem-actions.component.html', }) -export class WorkspaceitemActionsComponent extends MyDSpaceActionsComponent { +export class WorkspaceitemActionsComponent extends MyDSpaceActionsComponent implements OnInit { /** * The workspaceitem object @@ -37,6 +42,20 @@ export class WorkspaceitemActionsComponent extends MyDSpaceActionsComponent(false); + /** + * A boolean representing if the user is an admin + * @type {Observable} + */ + isAdmin$: Observable; + + /** + * A boolean representing if the user can edit the item + * and therefore can delete it as well + * (since the user can discard the item also from the edit page) + * @type {Observable} + */ + canEditItem$: Observable; + /** * Initialize instance variables * @@ -54,8 +73,12 @@ export class WorkspaceitemActionsComponent extends MyDSpaceActionsComponent this.authorizationService.isAuthorized(FeatureID.AdministratorOf, user.uuid))); + + this.canEditItem$ = activeEPerson$.pipe( + switchMap((eperson) => { + return this.object?.item.pipe( + getFirstCompletedRemoteData(), + getRemoteDataPayload(), + switchMap((item: Item) => { + return this.authorizationService.isAuthorized(FeatureID.CanEditItem, item?._links?.self.href, eperson.uuid); + }) + ) as Observable; + })); + } + /** * Init the target object * @@ -92,5 +134,4 @@ export class WorkspaceitemActionsComponent extends MyDSpaceActionsComponent Date: Wed, 3 May 2023 10:26:48 +0200 Subject: [PATCH 257/409] [DURACOM-133] Fixed failing test --- .../workspaceitem/workspaceitem-actions.component.spec.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/app/shared/mydspace-actions/workspaceitem/workspaceitem-actions.component.spec.ts b/src/app/shared/mydspace-actions/workspaceitem/workspaceitem-actions.component.spec.ts index f786782c05..b0a08a70bb 100644 --- a/src/app/shared/mydspace-actions/workspaceitem/workspaceitem-actions.component.spec.ts +++ b/src/app/shared/mydspace-actions/workspaceitem/workspaceitem-actions.component.spec.ts @@ -157,6 +157,9 @@ authService = jasmine.createSpyObj('authService', { describe('WorkspaceitemActionsComponent', () => { beforeEach(waitForAsync(async () => { + authorizationService = jasmine.createSpyObj('authorizationService', { + isAuthorized: observableOf(true) + }); await TestBed.configureTestingModule({ imports: [ NgbModule, @@ -190,9 +193,6 @@ describe('WorkspaceitemActionsComponent', () => { component = fixture.componentInstance; component.object = mockObject; notificationsServiceStub = TestBed.inject(NotificationsService as any); - authorizationService = jasmine.createSpyObj('authorizationService', { - isAuthorized: observableOf(true) - }); (authService.getAuthenticatedUserFromStore as jasmine.Spy).and.returnValue(observableOf(ePersonMock)); fixture.detectChanges(); }); From 709764c8aff45d7f9b157f9f2a94d6512b482f26 Mon Sep 17 00:00:00 2001 From: Giuseppe Digilio Date: Tue, 2 May 2023 15:52:24 +0200 Subject: [PATCH 258/409] [DURACOM-133] Fix import paths --- .../workspaceitem/workspaceitem-actions.component.spec.ts | 2 +- .../workspaceitem/workspaceitem-actions.component.ts | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/app/shared/mydspace-actions/workspaceitem/workspaceitem-actions.component.spec.ts b/src/app/shared/mydspace-actions/workspaceitem/workspaceitem-actions.component.spec.ts index b0a08a70bb..c76cce3982 100644 --- a/src/app/shared/mydspace-actions/workspaceitem/workspaceitem-actions.component.spec.ts +++ b/src/app/shared/mydspace-actions/workspaceitem/workspaceitem-actions.component.spec.ts @@ -1,4 +1,4 @@ -import { EPerson } from './../../../core/eperson/models/eperson.model'; +import { EPerson } from '../../../core/eperson/models/eperson.model'; import { ChangeDetectionStrategy, Injector, NO_ERRORS_SCHEMA } from '@angular/core'; import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; import { Router } from '@angular/router'; diff --git a/src/app/shared/mydspace-actions/workspaceitem/workspaceitem-actions.component.ts b/src/app/shared/mydspace-actions/workspaceitem/workspaceitem-actions.component.ts index d758ef1bb5..3ce3751fec 100644 --- a/src/app/shared/mydspace-actions/workspaceitem/workspaceitem-actions.component.ts +++ b/src/app/shared/mydspace-actions/workspaceitem/workspaceitem-actions.component.ts @@ -1,8 +1,8 @@ -import { EPerson } from './../../../core/eperson/models/eperson.model'; +import { EPerson } from '../../../core/eperson/models/eperson.model'; import { AuthorizationDataService } from 'src/app/core/data/feature-authorization/authorization-data.service'; -import { AuthService } from './../../../core/auth/auth.service'; -import { Item } from 'src/app/core/shared/item.model'; -import { FeatureID } from './../../../core/data/feature-authorization/feature-id'; +import { AuthService } from '../../../core/auth/auth.service'; +import { Item } from '../../../core/shared/item.model'; +import { FeatureID } from '../../../core/data/feature-authorization/feature-id'; import { Component, Injector, Input, OnInit } from '@angular/core'; import { Router } from '@angular/router'; From 3e202a67f16586d6faca787a39063a57bab14da3 Mon Sep 17 00:00:00 2001 From: Alisa Ismailati Date: Thu, 18 May 2023 11:30:51 +0200 Subject: [PATCH 259/409] [DURACOM-133] Remove isAdmin checks --- .../workspaceitem/workspaceitem-actions.component.html | 4 ++-- .../workspaceitem/workspaceitem-actions.component.ts | 4 ---- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/src/app/shared/mydspace-actions/workspaceitem/workspaceitem-actions.component.html b/src/app/shared/mydspace-actions/workspaceitem/workspaceitem-actions.component.html index 6c3dd79d7c..6e958c7a8b 100644 --- a/src/app/shared/mydspace-actions/workspaceitem/workspaceitem-actions.component.html +++ b/src/app/shared/mydspace-actions/workspaceitem/workspaceitem-actions.component.html @@ -8,7 +8,7 @@ @@ -16,7 +16,7 @@
    + +
    { @@ -156,6 +157,32 @@ describe('SubmissionFormComponent Component', () => { done(); }); + it('should return the visibility object of the collection section', () => { + comp.submissionDefinition = submissionDefinition; + fixture.detectChanges(); + const result = compAsAny.getCollectionVisibility(); + expect(result).toEqual({ + main: VisibilityType.HIDDEN, + other: VisibilityType.HIDDEN, + }); + }); + + it('should return true if collection section visibility is hidden', () => { + comp.submissionDefinition = submissionDefinition; + fixture.detectChanges(); + expect(comp.isSectionHidden).toBe(true); + }); + + it('should return false for isSectionReadonly when collection section visibility is not READONLY', () => { + const visibility = { + main: VisibilityType.READONLY, + other: VisibilityType.READONLY, + }; + comp.submissionDefinition = Object.assign({}, submissionDefinition, { visibility: visibility }); + fixture.detectChanges(); + expect(comp.isSectionReadonly).toBe(false); + }); + it('should update properly on collection change', (done) => { comp.collectionId = collectionId; comp.submissionId = submissionId; diff --git a/src/app/submission/form/submission-form.component.ts b/src/app/submission/form/submission-form.component.ts index 0e17e128bc..216aefcfc3 100644 --- a/src/app/submission/form/submission-form.component.ts +++ b/src/app/submission/form/submission-form.component.ts @@ -9,7 +9,7 @@ import { HALEndpointService } from '../../core/shared/hal-endpoint.service'; import { SubmissionObject } from '../../core/submission/models/submission-object.model'; import { WorkspaceitemSectionsObject } from '../../core/submission/models/workspaceitem-sections.model'; -import { hasValue, isNotEmpty } from '../../shared/empty.util'; +import { hasValue, isNotEmpty, isNotUndefined } from '../../shared/empty.util'; import { UploaderOptions } from '../../shared/upload/uploader/uploader-options.model'; import { SubmissionObjectEntry } from '../objects/submission-objects.reducer'; import { SectionDataObject } from '../sections/models/section-data.model'; @@ -18,6 +18,10 @@ import { Item } from '../../core/shared/item.model'; import { SectionsType } from '../sections/sections-type'; import { SectionsService } from '../sections/sections.service'; import { SubmissionError } from '../objects/submission-error.model'; +import { SubmissionSectionVisibility } from './../../core/config/models/config-submission-section.model'; +import { SubmissionSectionModel } from './../../core/config/models/config-submission-section.model'; +import { VisibilityType } from '../sections/visibility-type'; +import isEqual from 'lodash/isEqual'; /** * This component represents the submission form. @@ -188,6 +192,42 @@ export class SubmissionFormComponent implements OnChanges, OnDestroy { } } + /** + * Returns the visibility object of the collection section + */ + private getCollectionVisibility(): SubmissionSectionVisibility { + const submissionSectionModel: SubmissionSectionModel = + this.submissionDefinition.sections.page.find( + (section) => isEqual(section.sectionType, SectionsType.Collection) + ); + + return isNotUndefined(submissionSectionModel.visibility) ? submissionSectionModel.visibility : null; + } + + /** + * Getter to see if the collection section visibility is hidden + */ + get isSectionHidden(): boolean { + const visibility = this.getCollectionVisibility(); + return ( + hasValue(visibility) && + isEqual(visibility.main, VisibilityType.HIDDEN) && + isEqual(visibility.other, VisibilityType.HIDDEN) + ); + } + + /** + * Getter to see if the collection section visibility is readonly + */ + get isSectionReadonly(): boolean { + const visibility = this.getCollectionVisibility(); + return ( + hasValue(visibility) && + isEqual(visibility.main, VisibilityType.READONLY) && + isEqual(visibility.other, VisibilityType.READONLY) + ); + } + /** * Unsubscribe from all subscriptions, destroy instance variables * and reset submission state @@ -239,6 +279,8 @@ export class SubmissionFormComponent implements OnChanges, OnDestroy { protected getSectionsList(): Observable { return this.submissionService.getSubmissionSections(this.submissionId).pipe( filter((sections: SectionDataObject[]) => isNotEmpty(sections)), - map((sections: SectionDataObject[]) => sections)); + map((sections: SectionDataObject[]) => + sections.filter((section: SectionDataObject) => !isEqual(section.sectionType,SectionsType.Collection))), + ); } } diff --git a/src/app/submission/sections/sections-type.ts b/src/app/submission/sections/sections-type.ts index 6fb7380822..6bca8a7252 100644 --- a/src/app/submission/sections/sections-type.ts +++ b/src/app/submission/sections/sections-type.ts @@ -8,4 +8,5 @@ export enum SectionsType { AccessesCondition = 'accessCondition', SherpaPolicies = 'sherpaPolicy', Identifiers = 'identifiers', + Collection = 'collection', } diff --git a/src/app/submission/sections/visibility-type.ts b/src/app/submission/sections/visibility-type.ts new file mode 100644 index 0000000000..b2e167285c --- /dev/null +++ b/src/app/submission/sections/visibility-type.ts @@ -0,0 +1,4 @@ +export enum VisibilityType { + HIDDEN = 'HIDDEN', + READONLY = 'READONLY', +} From 8e25a02fdea46782ae6079003aceb689136d1aad Mon Sep 17 00:00:00 2001 From: Alisa Ismailati Date: Fri, 12 May 2023 15:38:58 +0200 Subject: [PATCH 261/409] [DURACOM-145] Fixed e2e failing tests --- cypress/e2e/my-dspace.cy.ts | 13 +++++++++++-- cypress/e2e/submission.cy.ts | 13 +++++++++++-- 2 files changed, 22 insertions(+), 4 deletions(-) diff --git a/cypress/e2e/my-dspace.cy.ts b/cypress/e2e/my-dspace.cy.ts index 79786c298a..277146fbc5 100644 --- a/cypress/e2e/my-dspace.cy.ts +++ b/cypress/e2e/my-dspace.cy.ts @@ -88,8 +88,17 @@ describe('My DSpace page', () => { // The Submission edit form tag should be visible cy.get('ds-submission-edit').should('be.visible'); - // A Collection menu button should exist & its value should be the selected collection - cy.get('#collectionControlsMenuButton span').should('have.text', TEST_SUBMIT_COLLECTION_NAME); + // A Collection menu button should exist(based on collection visibility) & its value should be the selected collection + cy.get('#collectionControlsMenuButton span') + .should(($span) => { + if ($span.length > 0) { + // If the element exists in the DOM (it's visible or read-only) + expect($span).to.have.text(TEST_SUBMIT_COLLECTION_NAME); + } else { + // If the element doesn't exist in the DOM, the length will be 0 + expect($span).to.have.length(0); + } + }); // Now that we've created a submission, we'll test that we can go back and Edit it. // Get our Submission URL, to parse out the ID of this new submission diff --git a/cypress/e2e/submission.cy.ts b/cypress/e2e/submission.cy.ts index ed10b2d13a..0a956c2614 100644 --- a/cypress/e2e/submission.cy.ts +++ b/cypress/e2e/submission.cy.ts @@ -16,8 +16,17 @@ describe('New Submission page', () => { // The Submission edit form tag should be visible cy.get('ds-submission-edit').should('be.visible'); - // A Collection menu button should exist & it's value should be the selected collection - cy.get('#collectionControlsMenuButton span').should('have.text', TEST_SUBMIT_COLLECTION_NAME); + // A Collection menu button should exist(if it's visible or read-only) & it's value should be the selected collection + cy.get('#collectionControlsMenuButton span') + .should(($span) => { + if ($span.length > 0) { + // If the element exists in the DOM (it's visible or read-only) + expect($span).to.have.text(TEST_SUBMIT_COLLECTION_NAME); + } else { + // If the element doesn't exist in the DOM, the length will be 0 + expect($span).to.have.length(0); + } + }); // 4 sections should be visible by default cy.get('div#section_traditionalpageone').should('be.visible'); From aee6060fef4864b42a0b882350a8d8e70e93f51d Mon Sep 17 00:00:00 2001 From: Alisa Ismailati Date: Mon, 15 May 2023 11:12:50 +0200 Subject: [PATCH 262/409] Revert "[DURACOM-145] Fixed e2e failing tests" This reverts commit b9c7391b1452e9a79d9c5615595b08cd7ac8b14c. --- cypress/e2e/my-dspace.cy.ts | 13 ++----------- cypress/e2e/submission.cy.ts | 13 ++----------- 2 files changed, 4 insertions(+), 22 deletions(-) diff --git a/cypress/e2e/my-dspace.cy.ts b/cypress/e2e/my-dspace.cy.ts index 277146fbc5..79786c298a 100644 --- a/cypress/e2e/my-dspace.cy.ts +++ b/cypress/e2e/my-dspace.cy.ts @@ -88,17 +88,8 @@ describe('My DSpace page', () => { // The Submission edit form tag should be visible cy.get('ds-submission-edit').should('be.visible'); - // A Collection menu button should exist(based on collection visibility) & its value should be the selected collection - cy.get('#collectionControlsMenuButton span') - .should(($span) => { - if ($span.length > 0) { - // If the element exists in the DOM (it's visible or read-only) - expect($span).to.have.text(TEST_SUBMIT_COLLECTION_NAME); - } else { - // If the element doesn't exist in the DOM, the length will be 0 - expect($span).to.have.length(0); - } - }); + // A Collection menu button should exist & its value should be the selected collection + cy.get('#collectionControlsMenuButton span').should('have.text', TEST_SUBMIT_COLLECTION_NAME); // Now that we've created a submission, we'll test that we can go back and Edit it. // Get our Submission URL, to parse out the ID of this new submission diff --git a/cypress/e2e/submission.cy.ts b/cypress/e2e/submission.cy.ts index 0a956c2614..ed10b2d13a 100644 --- a/cypress/e2e/submission.cy.ts +++ b/cypress/e2e/submission.cy.ts @@ -16,17 +16,8 @@ describe('New Submission page', () => { // The Submission edit form tag should be visible cy.get('ds-submission-edit').should('be.visible'); - // A Collection menu button should exist(if it's visible or read-only) & it's value should be the selected collection - cy.get('#collectionControlsMenuButton span') - .should(($span) => { - if ($span.length > 0) { - // If the element exists in the DOM (it's visible or read-only) - expect($span).to.have.text(TEST_SUBMIT_COLLECTION_NAME); - } else { - // If the element doesn't exist in the DOM, the length will be 0 - expect($span).to.have.length(0); - } - }); + // A Collection menu button should exist & it's value should be the selected collection + cy.get('#collectionControlsMenuButton span').should('have.text', TEST_SUBMIT_COLLECTION_NAME); // 4 sections should be visible by default cy.get('div#section_traditionalpageone').should('be.visible'); From d54754f78a5c352fb1fa7eb6b5b41f499cfc0a82 Mon Sep 17 00:00:00 2001 From: "Mark H. Wood" Date: Fri, 19 May 2023 13:36:04 -0400 Subject: [PATCH 263/409] Conform to expected ngOnChanges signature; tidy up. --- .../file/section-upload-file.component.ts | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/src/app/submission/sections/upload/file/section-upload-file.component.ts b/src/app/submission/sections/upload/file/section-upload-file.component.ts index fb6f499833..26fb9445cb 100644 --- a/src/app/submission/sections/upload/file/section-upload-file.component.ts +++ b/src/app/submission/sections/upload/file/section-upload-file.component.ts @@ -1,4 +1,13 @@ -import { ChangeDetectorRef, Component, Input, OnChanges, OnDestroy, OnInit, ViewChild } from '@angular/core'; +import { + ChangeDetectorRef, + Component, + Input, + OnChanges, + OnDestroy, + OnInit, + SimpleChanges, + ViewChild +} from '@angular/core'; import { BehaviorSubject, Subscription } from 'rxjs'; import { filter } from 'rxjs/operators'; @@ -168,13 +177,13 @@ export class SubmissionSectionUploadFileComponent implements OnChanges, OnInit, /** * Retrieve bitstream's metadata */ - ngOnChanges() { + ngOnChanges(changes: SimpleChanges): void { if (this.availableAccessConditionOptions) { // Retrieve file state this.subscriptions.push( this.uploadService - .getFileData(this.submissionId, this.sectionId, this.fileId).pipe( - filter((bitstream) => isNotUndefined(bitstream))) + .getFileData(this.submissionId, this.sectionId, this.fileId) + .pipe(filter((bitstream) => isNotUndefined(bitstream))) .subscribe((bitstream) => { this.fileData = bitstream; } From 055ed9ba6eb9db49ec3a6e7335936087f9cc2a4d Mon Sep 17 00:00:00 2001 From: "Mark H. Wood" Date: Fri, 19 May 2023 14:00:21 -0400 Subject: [PATCH 264/409] Fix spec broken by signature change. --- .../sections/upload/file/section-upload-file.component.spec.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/submission/sections/upload/file/section-upload-file.component.spec.ts b/src/app/submission/sections/upload/file/section-upload-file.component.spec.ts index 4fea8d3f25..4f62ceef6c 100644 --- a/src/app/submission/sections/upload/file/section-upload-file.component.spec.ts +++ b/src/app/submission/sections/upload/file/section-upload-file.component.spec.ts @@ -175,7 +175,7 @@ describe('SubmissionSectionUploadFileComponent test suite', () => { it('should init file data properly', () => { uploadService.getFileData.and.returnValue(observableOf(fileData)); - comp.ngOnChanges(); + comp.ngOnChanges({}); expect(comp.fileData).toEqual(fileData); }); From 5f72865e424a5a47654ac23afa06678367c71618 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 19 May 2023 19:46:45 +0000 Subject: [PATCH 265/409] Bump engine.io from 6.4.1 to 6.4.2 Bumps [engine.io](https://github.com/socketio/engine.io) from 6.4.1 to 6.4.2. - [Release notes](https://github.com/socketio/engine.io/releases) - [Changelog](https://github.com/socketio/engine.io/blob/main/CHANGELOG.md) - [Commits](https://github.com/socketio/engine.io/compare/6.4.1...6.4.2) --- updated-dependencies: - dependency-name: engine.io dependency-type: indirect ... Signed-off-by: dependabot[bot] --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 563ec741c2..d1d0f56ab5 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4944,9 +4944,9 @@ engine.io-parser@~5.0.3: integrity sha512-tjuoZDMAdEhVnSFleYPCtdL2GXwVTGtNjoeJd9IhIG3C1xs9uwxqRNEu5WpnDZCaozwVlK/nuQhpodhXSIMaxw== engine.io@~6.4.1: - version "6.4.1" - resolved "https://registry.npmjs.org/engine.io/-/engine.io-6.4.1.tgz" - integrity sha512-JFYQurD/nbsA5BSPmbaOSLa3tSVj8L6o4srSwXXY3NqE+gGUNmmPTbhn8tjzcCtSqhFgIeqef81ngny8JM25hw== + version "6.4.2" + resolved "https://registry.yarnpkg.com/engine.io/-/engine.io-6.4.2.tgz#ffeaf68f69b1364b0286badddf15ff633476473f" + integrity sha512-FKn/3oMiJjrOEOeUub2WCox6JhxBXq/Zn3fZOMCBxKnNYtsdKjxhl7yR3fZhM9PV+rdE75SU5SYMc+2PGzo+Tg== dependencies: "@types/cookie" "^0.4.1" "@types/cors" "^2.8.12" From edeea00c75d7a26fcf300aafcb8d813e40cf76af Mon Sep 17 00:00:00 2001 From: Tim Donohue Date: Fri, 19 May 2023 16:02:30 -0500 Subject: [PATCH 266/409] Fix several "potentially unsafe external link" warnings --- .../context-help-wrapper/context-help-wrapper.component.html | 2 +- .../publication-information.component.html | 4 ++-- .../publisher-policy/publisher-policy.component.html | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/app/shared/context-help-wrapper/context-help-wrapper.component.html b/src/app/shared/context-help-wrapper/context-help-wrapper.component.html index b031d0f42d..083b8163ff 100644 --- a/src/app/shared/context-help-wrapper/context-help-wrapper.component.html +++ b/src/app/shared/context-help-wrapper/context-help-wrapper.component.html @@ -2,7 +2,7 @@
    - {{elem.text}} + {{elem.text}} {{ elem }} diff --git a/src/app/submission/sections/sherpa-policies/publication-information/publication-information.component.html b/src/app/submission/sections/sherpa-policies/publication-information/publication-information.component.html index 3c35da8f08..534b95397e 100644 --- a/src/app/submission/sections/sherpa-policies/publication-information/publication-information.component.html +++ b/src/app/submission/sections/sherpa-policies/publication-information/publication-information.component.html @@ -23,7 +23,7 @@

    - + {{journal.url}}

    @@ -35,7 +35,7 @@

    - + {{publisher.name}}

    diff --git a/src/app/submission/sections/sherpa-policies/publisher-policy/publisher-policy.component.html b/src/app/submission/sections/sherpa-policies/publisher-policy/publisher-policy.component.html index 87370cf7e3..96e42202b3 100644 --- a/src/app/submission/sections/sherpa-policies/publisher-policy/publisher-policy.component.html +++ b/src/app/submission/sections/sherpa-policies/publisher-policy/publisher-policy.component.html @@ -8,7 +8,7 @@

    From 47098ca4ca2aa0072cddfe2ed11b8e49e113f664 Mon Sep 17 00:00:00 2001 From: "Gantner, Florian Klaus" Date: Mon, 22 May 2023 08:29:23 +0200 Subject: [PATCH 267/409] add missing form.other-information keys --- src/assets/i18n/en.json5 | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/assets/i18n/en.json5 b/src/assets/i18n/en.json5 index f3e4d938ff..38986025f0 100644 --- a/src/assets/i18n/en.json5 +++ b/src/assets/i18n/en.json5 @@ -1737,6 +1737,18 @@ "form.no-value": "No value entered", + "form.other-information.email": "Email", + + "form.other-information.first-name": "First Name", + + "form.other-information.insolr": "In Solr Index", + + "form.other-information.institution": "Institution", + + "form.other-information.last-name": "Last Name", + + "form.other-information.orcid": "ORCID", + "form.remove": "Remove", "form.save": "Save", From d0ccb59424407ee1053811348ebb8c2067c37e7b Mon Sep 17 00:00:00 2001 From: Alisa Ismailati Date: Mon, 22 May 2023 09:11:15 +0200 Subject: [PATCH 268/409] [DURACOM-133] Removed unused variable --- .../workspaceitem/workspaceitem-actions.component.ts | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/app/shared/mydspace-actions/workspaceitem/workspaceitem-actions.component.ts b/src/app/shared/mydspace-actions/workspaceitem/workspaceitem-actions.component.ts index b790f3ba7d..05afacf0da 100644 --- a/src/app/shared/mydspace-actions/workspaceitem/workspaceitem-actions.component.ts +++ b/src/app/shared/mydspace-actions/workspaceitem/workspaceitem-actions.component.ts @@ -41,12 +41,6 @@ export class WorkspaceitemActionsComponent extends MyDSpaceActionsComponent(false); - /** - * A boolean representing if the user is an admin - * @type {Observable} - */ - isAdmin$: Observable; - /** * A boolean representing if the user can edit the item * and therefore can delete it as well From 2445a6bd8ae0ee238cc461b55721ac637b7b47f3 Mon Sep 17 00:00:00 2001 From: fapsi Date: Mon, 22 May 2023 23:05:13 +0200 Subject: [PATCH 269/409] German translation for "browse.startsWith" Added missing German translation for "browse.startsWith". --- src/assets/i18n/de.json5 | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/assets/i18n/de.json5 b/src/assets/i18n/de.json5 index 661c102577..40c5b48242 100644 --- a/src/assets/i18n/de.json5 +++ b/src/assets/i18n/de.json5 @@ -949,6 +949,9 @@ // "browse.previous.button": "Previous", "browse.previous.button": "Zurück", + + // "browse.startsWith": ", starting with {{ startsWith }}", + "browse.startsWith": ", beginnend mit {{ startsWith }}", // "browse.startsWith.choose_start": "(Choose start)", "browse.startsWith.choose_start": "(Startpunkt wählen)", From 6af872bf9fc894a2640c88c3c1e5bffd01f2cbbb Mon Sep 17 00:00:00 2001 From: fapsi Date: Mon, 22 May 2023 23:46:33 +0200 Subject: [PATCH 270/409] Removed unnecessary trailing spaces Fixing linting. --- src/assets/i18n/de.json5 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/assets/i18n/de.json5 b/src/assets/i18n/de.json5 index 40c5b48242..d9c4734f76 100644 --- a/src/assets/i18n/de.json5 +++ b/src/assets/i18n/de.json5 @@ -949,7 +949,7 @@ // "browse.previous.button": "Previous", "browse.previous.button": "Zurück", - + // "browse.startsWith": ", starting with {{ startsWith }}", "browse.startsWith": ", beginnend mit {{ startsWith }}", From f01c58e84dd4a7a907cc90ce45a28ee50e3eef41 Mon Sep 17 00:00:00 2001 From: Nona Luypaert Date: Tue, 23 May 2023 14:13:05 +0200 Subject: [PATCH 271/409] 101623: Fix BrowseResponseParsingService + Add tests for it --- .../browse-response-parsing.service.spec.ts | 64 +++++++++++++++++++ .../data/browse-response-parsing.service.ts | 4 +- .../core/data/dso-response-parsing.service.ts | 4 ++ 3 files changed, 70 insertions(+), 2 deletions(-) create mode 100644 src/app/core/data/browse-response-parsing.service.spec.ts diff --git a/src/app/core/data/browse-response-parsing.service.spec.ts b/src/app/core/data/browse-response-parsing.service.spec.ts new file mode 100644 index 0000000000..9fa7239ef7 --- /dev/null +++ b/src/app/core/data/browse-response-parsing.service.spec.ts @@ -0,0 +1,64 @@ +import { getMockObjectCacheService } from '../../shared/mocks/object-cache.service.mock'; +import { BrowseResponseParsingService } from './browse-response-parsing.service'; +import { ObjectCacheService } from '../cache/object-cache.service'; +import { HIERARCHICAL_BROWSE_DEFINITION } from '../shared/hierarchical-browse-definition.resource-type'; +import { FLAT_BROWSE_DEFINITION } from '../shared/flat-browse-definition.resource-type'; +import { VALUE_LIST_BROWSE_DEFINITION } from '../shared/value-list-browse-definition.resource-type'; + +class TestService extends BrowseResponseParsingService { + constructor(protected objectCache: ObjectCacheService) { + super(objectCache); + } + + // Overwrite method to make it public for testing + public deserialize(obj): any { + return super.deserialize(obj); + } +} + +describe('BrowseResponseParsingService', () => { + let service: TestService; + + + beforeEach(() => { + service = new TestService(getMockObjectCacheService()); + }); + + describe('', () => { + const mockFlatBrowse = { + id: 'title', + browseType: 'flatBrowse', + type: 'browse', + }; + + const mockValueList = { + id: 'author', + browseType: 'valueList', + type: 'browse', + }; + + const mockHierarchicalBrowse = { + id: 'srsc', + browseType: 'hierarchicalBrowse', + type: 'browse', + }; + + it('should deserialize flatBrowses correctly', () => { + let deserialized = service.deserialize(mockFlatBrowse); + expect(deserialized.type).toBe(FLAT_BROWSE_DEFINITION); + expect(deserialized.id).toBe(mockFlatBrowse.id); + }); + + it('should deserialize valueList browses correctly', () => { + let deserialized = service.deserialize(mockValueList); + expect(deserialized.type).toBe(VALUE_LIST_BROWSE_DEFINITION); + expect(deserialized.id).toBe(mockValueList.id); + }); + + it('should deserialize hierarchicalBrowses correctly', () => { + let deserialized = service.deserialize(mockHierarchicalBrowse); + expect(deserialized.type).toBe(HIERARCHICAL_BROWSE_DEFINITION); + expect(deserialized.id).toBe(mockHierarchicalBrowse.id); + }); + }); +}); diff --git a/src/app/core/data/browse-response-parsing.service.ts b/src/app/core/data/browse-response-parsing.service.ts index 57b76c72a4..3681198406 100644 --- a/src/app/core/data/browse-response-parsing.service.ts +++ b/src/app/core/data/browse-response-parsing.service.ts @@ -7,7 +7,7 @@ import { import { FLAT_BROWSE_DEFINITION } from '../shared/flat-browse-definition.resource-type'; import { HierarchicalBrowseDefinition } from '../shared/hierarchical-browse-definition.model'; import { FlatBrowseDefinition } from '../shared/flat-browse-definition.model'; -import { DSOResponseParsingService } from './dso-response-parsing.service'; +import { DspaceRestResponseParsingService } from './dspace-rest-response-parsing.service'; import { Serializer } from '../serializer'; import { BrowseDefinition } from '../shared/browse-definition.model'; import { BROWSE_DEFINITION } from '../shared/browse-definition.resource-type'; @@ -20,7 +20,7 @@ import { VALUE_LIST_BROWSE_DEFINITION } from '../shared/value-list-browse-defini @Injectable({ providedIn: 'root', }) -export class BrowseResponseParsingService extends DSOResponseParsingService { +export class BrowseResponseParsingService extends DspaceRestResponseParsingService { constructor( protected objectCache: ObjectCacheService, ) { diff --git a/src/app/core/data/dso-response-parsing.service.ts b/src/app/core/data/dso-response-parsing.service.ts index fd5a22fae9..74117e79d3 100644 --- a/src/app/core/data/dso-response-parsing.service.ts +++ b/src/app/core/data/dso-response-parsing.service.ts @@ -10,6 +10,10 @@ import { hasNoValue, hasValue } from '../../shared/empty.util'; import { DSpaceObject } from '../shared/dspace-object.model'; import { RestRequest } from './rest-request.model'; +/** + * @deprecated use DspaceRestResponseParsingService for new code, this is only left to support a + * few legacy use cases, and should get removed eventually + */ @Injectable() export class DSOResponseParsingService extends BaseResponseParsingService implements ResponseParsingService { protected toCache = true; From 7f450320b6dcbc94eff3980d3a0cc63044791eca Mon Sep 17 00:00:00 2001 From: Enea Jahollari Date: Tue, 23 May 2023 16:05:38 +0200 Subject: [PATCH 272/409] Fix circular dependency --- .../access-control-array-form.component.ts | 2 +- ...ess-control-form-container-intial-state.ts | 27 ++++++++++++++++ ...access-control-form-container.component.ts | 32 ++----------------- .../bulk-access-control.service.ts | 2 +- 4 files changed, 32 insertions(+), 31 deletions(-) create mode 100644 src/app/shared/access-control-form-container/access-control-form-container-intial-state.ts diff --git a/src/app/shared/access-control-form-container/access-control-array-form/access-control-array-form.component.ts b/src/app/shared/access-control-form-container/access-control-array-form/access-control-array-form.component.ts index 519fc0ae3e..ec9c5c9a41 100644 --- a/src/app/shared/access-control-form-container/access-control-array-form/access-control-array-form.component.ts +++ b/src/app/shared/access-control-form-container/access-control-array-form/access-control-array-form.component.ts @@ -70,7 +70,7 @@ export class AccessControlArrayFormComponent implements OnInit, OnDestroy { * @return The form value */ getValue() { - return this.form.value.accessControl + return (this.form.value.accessControl as any[]) .filter(x => x.itemName !== null && x.itemName !== '') .map(x => ({ name: x.itemName, diff --git a/src/app/shared/access-control-form-container/access-control-form-container-intial-state.ts b/src/app/shared/access-control-form-container/access-control-form-container-intial-state.ts new file mode 100644 index 0000000000..6e19e04d84 --- /dev/null +++ b/src/app/shared/access-control-form-container/access-control-form-container-intial-state.ts @@ -0,0 +1,27 @@ +import {ListableObject} from '../object-collection/shared/listable-object.model'; + +export const accessControlInitialFormState: AccessControlFormState = { + item: { + toggleStatus: false, + accessMode: 'replace', + }, + bitstream: { + toggleStatus: false, + accessMode: 'replace', + changesLimit: 'all', // 'all' | 'selected' + selectedBitstreams: [] as ListableObject[], + }, +}; + +export interface AccessControlFormState { + item: { + toggleStatus: boolean, + accessMode: 'add' | 'replace', + }, + bitstream: { + toggleStatus: boolean, + accessMode: 'add' | 'replace', + changesLimit: string, + selectedBitstreams: ListableObject[], + } +} diff --git a/src/app/shared/access-control-form-container/access-control-form-container.component.ts b/src/app/shared/access-control-form-container/access-control-form-container.component.ts index 9394b083b1..7ebcc73ed8 100644 --- a/src/app/shared/access-control-form-container/access-control-form-container.component.ts +++ b/src/app/shared/access-control-form-container/access-control-form-container.component.ts @@ -7,7 +7,6 @@ import { BulkAccessControlService } from './bulk-access-control.service'; import { SelectableListService } from '../object-list/selectable-list/selectable-list.service'; import { NgbModal } from '@ng-bootstrap/ng-bootstrap'; import { map, take } from 'rxjs/operators'; -import { ListableObject } from '../object-collection/shared/listable-object.model'; import { DSpaceObject } from '../../core/shared/dspace-object.model'; import { ITEM_ACCESS_CONTROL_SELECT_BITSTREAMS_LIST_ID, @@ -17,6 +16,7 @@ import { BulkAccessConfigDataService } from '../../core/config/bulk-access-confi import { getFirstCompletedRemoteData } from '../../core/shared/operators'; import { BulkAccessConditionOptions } from '../../core/config/models/bulk-access-condition-options.model'; import { AlertType } from '../alert/aletr-type'; +import { accessControlInitialFormState } from './access-control-form-container-intial-state'; @Component({ selector: 'ds-access-control-form-container', @@ -61,7 +61,7 @@ export class AccessControlFormContainerComponent impleme private cdr: ChangeDetectorRef ) {} - state = initialState; + state = accessControlInitialFormState; dropdownData$: Observable = this.bulkAccessConfigService.findByName('default').pipe( getFirstCompletedRemoteData(), @@ -92,7 +92,7 @@ export class AccessControlFormContainerComponent impleme reset() { this.bitstreamAccessCmp.reset(); this.itemAccessCmp.reset(); - this.state = initialState; + this.state = accessControlInitialFormState; } /** @@ -156,29 +156,3 @@ export class AccessControlFormContainerComponent impleme } - -const initialState: AccessControlFormState = { - item: { - toggleStatus: false, - accessMode: 'replace', - }, - bitstream: { - toggleStatus: false, - accessMode: 'replace', - changesLimit: 'all', // 'all' | 'selected' - selectedBitstreams: [] as ListableObject[], - }, -}; - -export interface AccessControlFormState { - item: { - toggleStatus: boolean, - accessMode: 'add' | 'replace', - }, - bitstream: { - toggleStatus: boolean, - accessMode: 'add' | 'replace', - changesLimit: string, - selectedBitstreams: ListableObject[], - } -} diff --git a/src/app/shared/access-control-form-container/bulk-access-control.service.ts b/src/app/shared/access-control-form-container/bulk-access-control.service.ts index 5302e3aa4a..51eba4275d 100644 --- a/src/app/shared/access-control-form-container/bulk-access-control.service.ts +++ b/src/app/shared/access-control-form-container/bulk-access-control.service.ts @@ -7,7 +7,7 @@ import { TranslateService } from '@ngx-translate/core'; import { ScriptDataService } from '../../core/data/processes/script-data.service'; import { ProcessParameter } from '../../process-page/processes/process-parameter.model'; -import { AccessControlFormState } from './access-control-form-container.component'; +import { AccessControlFormState } from './access-control-form-container-intial-state'; import { getFirstCompletedRemoteData } from '../../core/shared/operators'; import { RemoteData } from '../../core/data/remote-data'; import { Process } from '../../process-page/processes/process.model'; From d1c91b8bc2bc21b7478a6c46ea700a9a86fdf7eb Mon Sep 17 00:00:00 2001 From: Nona Luypaert Date: Tue, 23 May 2023 17:02:10 +0200 Subject: [PATCH 273/409] 101623: Override createAndSendGetRequest in BrowseDefinitionDataService --- src/app/browse-by/browse-by.module.ts | 5 +- .../browse/browse-definition-data.service.ts | 65 +++++++++++-------- 2 files changed, 39 insertions(+), 31 deletions(-) diff --git a/src/app/browse-by/browse-by.module.ts b/src/app/browse-by/browse-by.module.ts index 25a297eb14..826868f288 100644 --- a/src/app/browse-by/browse-by.module.ts +++ b/src/app/browse-by/browse-by.module.ts @@ -19,11 +19,12 @@ const ENTRY_COMPONENTS = [ BrowseByTitlePageComponent, BrowseByMetadataPageComponent, BrowseByDatePageComponent, + BrowseByTaxonomyPageComponent, ThemedBrowseByMetadataPageComponent, ThemedBrowseByDatePageComponent, ThemedBrowseByTitlePageComponent, - + ThemedBrowseByTaxonomyPageComponent, ]; @NgModule({ @@ -36,8 +37,6 @@ const ENTRY_COMPONENTS = [ declarations: [ BrowseBySwitcherComponent, ThemedBrowseBySwitcherComponent, - BrowseByTaxonomyPageComponent, - ThemedBrowseByTaxonomyPageComponent, ...ENTRY_COMPONENTS ], exports: [ diff --git a/src/app/core/browse/browse-definition-data.service.ts b/src/app/core/browse/browse-definition-data.service.ts index a4c7bf1353..f5e67cd297 100644 --- a/src/app/core/browse/browse-definition-data.service.ts +++ b/src/app/core/browse/browse-definition-data.service.ts @@ -1,3 +1,4 @@ +// eslint-disable-next-line max-classes-per-file import { Injectable } from '@angular/core'; import { BROWSE_DEFINITION } from '../shared/browse-definition.resource-type'; import { RequestService } from '../data/request.service'; @@ -17,35 +18,39 @@ import { take } from 'rxjs/operators'; import { BrowseDefinitionRestRequest } from '../data/request.models'; import { BrowseDefinition } from '../shared/browse-definition.model'; - -class BrowseDefinitionFindAllDataImpl extends FindAllDataImpl { - /** - * Create a GET request for the given href, and send it. - * Use a GET request specific for BrowseDefinitions. - * - * @param href$ The url of browse we want to retrieve. Can be a string or - * an Observable - * @param useCachedVersionIfAvailable If this is true, the request will only be sent if there's - * no valid cached version. Defaults to true - */ - createAndSendGetRequest(href$: string | Observable, useCachedVersionIfAvailable: boolean = true) { - if (isNotEmpty(href$)) { - if (typeof href$ === 'string') { - href$ = observableOf(href$); - } - - href$.pipe( - isNotEmptyOperator(), - take(1) - ).subscribe((href: string) => { - const requestId = this.requestService.generateRequestId(); - const request = new BrowseDefinitionRestRequest(requestId, href); - if (hasValue(this.responseMsToLive)) { - request.responseMsToLive = this.responseMsToLive; - } - this.requestService.send(request, useCachedVersionIfAvailable); - }); +/** + * Create a GET request for the given href, and send it. + * Use a GET request specific for BrowseDefinitions. + */ +export const createAndSendBrowseDefinitionGetRequest = (requestService: RequestService, + responseMsToLive: number, + href$: string | Observable, + useCachedVersionIfAvailable: boolean = true): void => { + if (isNotEmpty(href$)) { + if (typeof href$ === 'string') { + href$ = observableOf(href$); } + + href$.pipe( + isNotEmptyOperator(), + take(1) + ).subscribe((href: string) => { + const requestId = requestService.generateRequestId(); + const request = new BrowseDefinitionRestRequest(requestId, href); + if (hasValue(responseMsToLive)) { + request.responseMsToLive = responseMsToLive; + } + requestService.send(request, useCachedVersionIfAvailable); + }); + } +}; + +/** + * Custom extension of {@link FindAllDataImpl} to be able to send BrowseDefinitionRestRequests + */ +class BrowseDefinitionFindAllDataImpl extends FindAllDataImpl { + createAndSendGetRequest(href$: string | Observable, useCachedVersionIfAvailable: boolean = true) { + createAndSendBrowseDefinitionGetRequest(this.requestService, this.responseMsToLive, href$, useCachedVersionIfAvailable); } } @@ -87,5 +92,9 @@ export class BrowseDefinitionDataService extends IdentifiableDataService[]): Observable>> { return this.findAllData.findAll(options, useCachedVersionIfAvailable, reRequestOnStale, ...linksToFollow); } + + createAndSendGetRequest(href$: string | Observable, useCachedVersionIfAvailable: boolean = true) { + createAndSendBrowseDefinitionGetRequest(this.requestService, this.responseMsToLive, href$, useCachedVersionIfAvailable); + } } From aee76913aac0aaf812c019ca641f7e311b0bafbf Mon Sep 17 00:00:00 2001 From: Nona Luypaert Date: Tue, 23 May 2023 17:05:00 +0200 Subject: [PATCH 274/409] 101623: Replace hardcoded vocabulary with BrowseDefinition in BrowseByTaxonomyPage --- .../browse-by-taxonomy-page.component.html | 2 +- .../browse-by-taxonomy-page.component.ts | 76 ++++++++++++++++++- 2 files changed, 73 insertions(+), 5 deletions(-) diff --git a/src/app/browse-by/browse-by-taxonomy-page/browse-by-taxonomy-page.component.html b/src/app/browse-by/browse-by-taxonomy-page/browse-by-taxonomy-page.component.html index 149e1e6b33..87c7937b1b 100644 --- a/src/app/browse-by/browse-by-taxonomy-page/browse-by-taxonomy-page.component.html +++ b/src/app/browse-by/browse-by-taxonomy-page/browse-by-taxonomy-page.component.html @@ -6,5 +6,5 @@ (deselect)="onDeselect($event)">
    - {{ 'browse.taxonomy.button' | translate }} + {{ 'browse.taxonomy.button' | translate }}
    diff --git a/src/app/browse-by/browse-by-taxonomy-page/browse-by-taxonomy-page.component.ts b/src/app/browse-by/browse-by-taxonomy-page/browse-by-taxonomy-page.component.ts index b132f299d6..d568a97fd7 100644 --- a/src/app/browse-by/browse-by-taxonomy-page/browse-by-taxonomy-page.component.ts +++ b/src/app/browse-by/browse-by-taxonomy-page/browse-by-taxonomy-page.component.ts @@ -1,6 +1,14 @@ -import { Component, OnInit } from '@angular/core'; +import { Component, OnInit, Inject, OnDestroy } from '@angular/core'; import { VocabularyOptions } from '../../core/submission/vocabularies/models/vocabulary-options.model'; import { VocabularyEntryDetail } from '../../core/submission/vocabularies/models/vocabulary-entry-detail.model'; +import { ActivatedRoute } from '@angular/router'; +import { Observable, Subscription } from 'rxjs'; +import { BrowseDefinition } from '../../core/shared/browse-definition.model'; +import { GenericConstructor } from '../../core/shared/generic-constructor'; +import { BROWSE_BY_COMPONENT_FACTORY } from '../browse-by-switcher/browse-by-decorator'; +import { map } from 'rxjs/operators'; +import { ThemeService } from 'src/app/shared/theme-support/theme.service'; +import { HierarchicalBrowseDefinition } from '../../core/shared/hierarchical-browse-definition.model'; @Component({ selector: 'ds-browse-by-taxonomy-page', @@ -10,7 +18,7 @@ import { VocabularyEntryDetail } from '../../core/submission/vocabularies/models /** * Component for browsing items by metadata in a hierarchical controlled vocabulary */ -export class BrowseByTaxonomyPageComponent implements OnInit { +export class BrowseByTaxonomyPageComponent implements OnInit, OnDestroy { /** * The {@link VocabularyOptions} object @@ -27,8 +35,48 @@ export class BrowseByTaxonomyPageComponent implements OnInit { */ filterValues: string[]; - ngOnInit() { - this.vocabularyOptions = { name: 'srsc', closed: true }; + /** + * The facet the use when filtering + */ + facetType: string; + + /** + * The used vocabulary + */ + vocabularyName: string; + + /** + * The parameters used in the URL + */ + queryParams: any; + + /** + * Resolved browse-by component + */ + browseByComponent: Observable; + + /** + * Subscriptions to track + */ + browseByComponentSubs: Subscription[] = []; + + public constructor( protected route: ActivatedRoute, + protected themeService: ThemeService, + @Inject(BROWSE_BY_COMPONENT_FACTORY) private getComponentByBrowseByType: (browseByType, theme) => GenericConstructor) { + } + + ngOnInit(): void { + this.browseByComponent = this.route.data.pipe( + map((data: { browseDefinition: BrowseDefinition }) => { + this.getComponentByBrowseByType(data.browseDefinition.getRenderType(), this.themeService.getThemeName()); + return data.browseDefinition; + }) + ); + this.browseByComponentSubs.push(this.browseByComponent.subscribe((browseDefinition: HierarchicalBrowseDefinition) => { + this.facetType = browseDefinition.facetType; + this.vocabularyName = browseDefinition.vocabulary; + this.vocabularyOptions = { name: this.vocabularyName, closed: true }; + })); } /** @@ -41,10 +89,30 @@ export class BrowseByTaxonomyPageComponent implements OnInit { this.selectedItems.push(detail); this.filterValues = this.selectedItems .map((item: VocabularyEntryDetail) => `${item.value},equals`); + this.updateQueryParams(); } + /** + * Removes detail from selectedItems and filterValues. + * + * @param detail VocabularyEntryDetail to be removed + */ onDeselect(detail: VocabularyEntryDetail): void { this.selectedItems = this.selectedItems.filter((entry: VocabularyEntryDetail) => { return entry !== detail; }); this.filterValues = this.filterValues.filter((value: string) => { return value !== `${detail.value},equals`; }); + this.updateQueryParams(); + } + + /** + * Updates queryParams based on the current facetType and filterValues. + */ + private updateQueryParams(): void { + this.queryParams = { + ['f.' + this.facetType]: this.filterValues + }; + } + + ngOnDestroy(): void { + this.browseByComponentSubs.forEach((sub: Subscription) => sub.unsubscribe()); } } From d9b0eebc18154aaddc827bfc38a80f09ca7d95ef Mon Sep 17 00:00:00 2001 From: Nona Luypaert Date: Tue, 23 May 2023 17:08:00 +0200 Subject: [PATCH 275/409] 101623: Remove hardcoded 'browse by srsc' menu option in MenuResolver --- src/app/menu.resolver.ts | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/src/app/menu.resolver.ts b/src/app/menu.resolver.ts index f771ef8b27..8630150c58 100644 --- a/src/app/menu.resolver.ts +++ b/src/app/menu.resolver.ts @@ -137,20 +137,6 @@ export class MenuResolver implements Resolve { } as TextMenuItemModel, } ); - menuList.push( - { - id: 'browse_global_by_srsc', - parentID: 'browse_global', - active: false, - visible: true, - index: 99, - model: { - type: MenuItemType.LINK, - text: `menu.section.browse_global_by_srsc`, - link: `/browse/srsc` - } as LinkMenuItemModel - } - ); } menuList.forEach((menuSection) => this.menuService.addSection(MenuID.PUBLIC, Object.assign(menuSection, { shouldPersistOnRouteChange: true From 2f0f69710e32412084fd94ee5a034d940146c340 Mon Sep 17 00:00:00 2001 From: Nona Luypaert Date: Tue, 23 May 2023 17:40:07 +0200 Subject: [PATCH 276/409] 101623: Fix browse-related tests by replacing abstract class --- src/app/browse-by/browse-by-guard.spec.ts | 4 +-- .../browse-by-switcher.component.spec.ts | 16 +++++++----- .../browse-by-taxonomy-page.component.spec.ts | 19 ++++++++++++++ src/app/core/browse/browse.service.spec.ts | 26 ++++++++++++++++--- src/app/navbar/navbar.component.spec.ts | 17 ++++++++---- 5 files changed, 64 insertions(+), 18 deletions(-) diff --git a/src/app/browse-by/browse-by-guard.spec.ts b/src/app/browse-by/browse-by-guard.spec.ts index 933c95a3cb..7fca9b15c0 100644 --- a/src/app/browse-by/browse-by-guard.spec.ts +++ b/src/app/browse-by/browse-by-guard.spec.ts @@ -2,8 +2,8 @@ import { first } from 'rxjs/operators'; import { BrowseByGuard } from './browse-by-guard'; import { of as observableOf } from 'rxjs'; import { createSuccessfulRemoteDataObject$ } from '../shared/remote-data.utils'; -import { BrowseDefinition } from '../core/shared/browse-definition.model'; import { BrowseByDataType } from './browse-by-switcher/browse-by-decorator'; +import { ValueListBrowseDefinition } from '../core/shared/value-list-browse-definition.model'; describe('BrowseByGuard', () => { describe('canActivate', () => { @@ -18,7 +18,7 @@ describe('BrowseByGuard', () => { const id = 'author'; const scope = '1234-65487-12354-1235'; const value = 'Filter'; - const browseDefinition = Object.assign(new BrowseDefinition(), { type: BrowseByDataType.Metadata, metadataKeys: ['dc.contributor'] }); + const browseDefinition = Object.assign(new ValueListBrowseDefinition(), { type: BrowseByDataType.Metadata, metadataKeys: ['dc.contributor'] }); beforeEach(() => { dsoService = { diff --git a/src/app/browse-by/browse-by-switcher/browse-by-switcher.component.spec.ts b/src/app/browse-by/browse-by-switcher/browse-by-switcher.component.spec.ts index c2e1c9cb68..c13405dd4d 100644 --- a/src/app/browse-by/browse-by-switcher/browse-by-switcher.component.spec.ts +++ b/src/app/browse-by/browse-by-switcher/browse-by-switcher.component.spec.ts @@ -3,9 +3,11 @@ import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; import { NO_ERRORS_SCHEMA } from '@angular/core'; import { ActivatedRoute } from '@angular/router'; import { BROWSE_BY_COMPONENT_FACTORY, BrowseByDataType } from './browse-by-decorator'; -import { BrowseDefinition } from '../../core/shared/browse-definition.model'; import { BehaviorSubject } from 'rxjs'; import { ThemeService } from '../../shared/theme-support/theme.service'; +import { FlatBrowseDefinition } from '../../core/shared/flat-browse-definition.model'; +import { ValueListBrowseDefinition } from '../../core/shared/value-list-browse-definition.model'; +import { NonHierarchicalBrowseDefinition } from '../../core/shared/non-hierarchical-browse-definition'; describe('BrowseBySwitcherComponent', () => { let comp: BrowseBySwitcherComponent; @@ -13,33 +15,33 @@ describe('BrowseBySwitcherComponent', () => { const types = [ Object.assign( - new BrowseDefinition(), { + new FlatBrowseDefinition(), { id: 'title', dataType: BrowseByDataType.Title, } ), Object.assign( - new BrowseDefinition(), { + new FlatBrowseDefinition(), { id: 'dateissued', dataType: BrowseByDataType.Date, metadataKeys: ['dc.date.issued'] } ), Object.assign( - new BrowseDefinition(), { + new ValueListBrowseDefinition(), { id: 'author', dataType: BrowseByDataType.Metadata, } ), Object.assign( - new BrowseDefinition(), { + new ValueListBrowseDefinition(), { id: 'subject', dataType: BrowseByDataType.Metadata, } ), ]; - const data = new BehaviorSubject(createDataWithBrowseDefinition(new BrowseDefinition())); + const data = new BehaviorSubject(createDataWithBrowseDefinition(new FlatBrowseDefinition())); const activatedRouteStub = { data @@ -70,7 +72,7 @@ describe('BrowseBySwitcherComponent', () => { comp = fixture.componentInstance; })); - types.forEach((type: BrowseDefinition) => { + types.forEach((type: NonHierarchicalBrowseDefinition) => { describe(`when switching to a browse-by page for "${type.id}"`, () => { beforeEach(() => { data.next(createDataWithBrowseDefinition(type)); diff --git a/src/app/browse-by/browse-by-taxonomy-page/browse-by-taxonomy-page.component.spec.ts b/src/app/browse-by/browse-by-taxonomy-page/browse-by-taxonomy-page.component.spec.ts index bc9380d7ad..484992afbf 100644 --- a/src/app/browse-by/browse-by-taxonomy-page/browse-by-taxonomy-page.component.spec.ts +++ b/src/app/browse-by/browse-by-taxonomy-page/browse-by-taxonomy-page.component.spec.ts @@ -4,17 +4,36 @@ import { BrowseByTaxonomyPageComponent } from './browse-by-taxonomy-page.compone import { VocabularyEntryDetail } from '../../core/submission/vocabularies/models/vocabulary-entry-detail.model'; import { TranslateModule } from '@ngx-translate/core'; import { NO_ERRORS_SCHEMA } from '@angular/core'; +import { ActivatedRoute } from '@angular/router'; +import { BehaviorSubject } from 'rxjs'; +import { createDataWithBrowseDefinition } from '../browse-by-switcher/browse-by-switcher.component.spec'; +import { HierarchicalBrowseDefinition } from '../../core/shared/hierarchical-browse-definition.model'; +import { ThemeService } from '../../shared/theme-support/theme.service'; describe('BrowseByTaxonomyPageComponent', () => { let component: BrowseByTaxonomyPageComponent; let fixture: ComponentFixture; + let themeService: ThemeService; let detail1: VocabularyEntryDetail; let detail2: VocabularyEntryDetail; + const data = new BehaviorSubject(createDataWithBrowseDefinition(new HierarchicalBrowseDefinition())); + const activatedRouteStub = { + data + }; + beforeEach(async () => { + themeService = jasmine.createSpyObj('themeService', { + getThemeName: 'dspace', + }); + await TestBed.configureTestingModule({ imports: [ TranslateModule.forRoot() ], declarations: [ BrowseByTaxonomyPageComponent ], + providers: [ + { provide: ActivatedRoute, useValue: activatedRouteStub }, + { provide: ThemeService, useValue: themeService }, + ], schemas: [NO_ERRORS_SCHEMA] }) .compileComponents(); diff --git a/src/app/core/browse/browse.service.spec.ts b/src/app/core/browse/browse.service.spec.ts index 46ac8c44f4..0e39e53e43 100644 --- a/src/app/core/browse/browse.service.spec.ts +++ b/src/app/core/browse/browse.service.spec.ts @@ -6,13 +6,15 @@ import { getMockRequestService } from '../../shared/mocks/request.service.mock'; import { HALEndpointServiceStub } from '../../shared/testing/hal-endpoint-service.stub'; import { RemoteDataBuildService } from '../cache/builders/remote-data-build.service'; import { RequestService } from '../data/request.service'; -import { BrowseDefinition } from '../shared/browse-definition.model'; import { BrowseEntrySearchOptions } from './browse-entry-search-options.model'; import { BrowseService } from './browse.service'; import { createSuccessfulRemoteDataObject, createSuccessfulRemoteDataObject$ } from '../../shared/remote-data.utils'; import { createPaginatedList, getFirstUsedArgumentOfSpyMethod } from '../../shared/testing/utils.test'; import { getMockHrefOnlyDataService } from '../../shared/mocks/href-only-data.service.mock'; import { RequestEntry } from '../data/request-entry.model'; +import { FlatBrowseDefinition } from '../shared/flat-browse-definition.model'; +import { ValueListBrowseDefinition } from '../shared/value-list-browse-definition.model'; +import { HierarchicalBrowseDefinition } from '../shared/hierarchical-browse-definition.model'; describe('BrowseService', () => { let scheduler: TestScheduler; @@ -23,7 +25,7 @@ describe('BrowseService', () => { const browsesEndpointURL = 'https://rest.api/browses'; const halService: any = new HALEndpointServiceStub(browsesEndpointURL); const browseDefinitions = [ - Object.assign(new BrowseDefinition(), { + Object.assign(new FlatBrowseDefinition(), { id: 'date', metadataBrowse: false, sortOptions: [ @@ -50,7 +52,7 @@ describe('BrowseService', () => { items: { href: 'https://rest.api/discover/browses/dateissued/items' } } }), - Object.assign(new BrowseDefinition(), { + Object.assign(new ValueListBrowseDefinition(), { id: 'author', metadataBrowse: true, sortOptions: [ @@ -78,7 +80,23 @@ describe('BrowseService', () => { entries: { href: 'https://rest.api/discover/browses/author/entries' }, items: { href: 'https://rest.api/discover/browses/author/items' } } - }) + }), + Object.assign(new HierarchicalBrowseDefinition(), { + id: 'srsc', + browseType: 'hierarchicalBrowse', + facetType: 'subject', + vocabulary: 'srsc', + type: 'browse', + metadata: [ + 'dc.subject' + ], + _links: { + vocabulary: { 'href': 'https://rest.api/submission/vocabularies/srsc/' }, + items: { 'href': 'https://rest.api/discover/browses/srsc/items' }, + entries: { 'href': 'https://rest.api/discover/browses/srsc/entries' }, + self: { 'href': 'https://rest.api/discover/browses/srsc' } + } + }), ]; let browseDefinitionDataService; diff --git a/src/app/navbar/navbar.component.spec.ts b/src/app/navbar/navbar.component.spec.ts index ada9be9d0b..983eace055 100644 --- a/src/app/navbar/navbar.component.spec.ts +++ b/src/app/navbar/navbar.component.spec.ts @@ -16,7 +16,6 @@ import { RouterTestingModule } from '@angular/router/testing'; import { BrowseService } from '../core/browse/browse.service'; import { createSuccessfulRemoteDataObject, createSuccessfulRemoteDataObject$ } from '../shared/remote-data.utils'; import { buildPaginatedList } from '../core/data/paginated-list.model'; -import { BrowseDefinition } from '../core/shared/browse-definition.model'; import { BrowseByDataType } from '../browse-by/browse-by-switcher/browse-by-decorator'; import { Item } from '../core/shared/item.model'; import { AuthorizationDataService } from '../core/data/feature-authorization/authorization-data.service'; @@ -28,6 +27,9 @@ import { authReducer } from '../core/auth/auth.reducer'; import { provideMockStore } from '@ngrx/store/testing'; import { AuthTokenInfo } from '../core/auth/models/auth-token-info.model'; import { EPersonMock } from '../shared/testing/eperson.mock'; +import { FlatBrowseDefinition } from '../core/shared/flat-browse-definition.model'; +import { ValueListBrowseDefinition } from '../core/shared/value-list-browse-definition.model'; +import { HierarchicalBrowseDefinition } from '../core/shared/hierarchical-browse-definition.model'; let comp: NavbarComponent; let fixture: ComponentFixture; @@ -66,30 +68,35 @@ describe('NavbarComponent', () => { beforeEach(waitForAsync(() => { browseDefinitions = [ Object.assign( - new BrowseDefinition(), { + new FlatBrowseDefinition(), { id: 'title', dataType: BrowseByDataType.Title, } ), Object.assign( - new BrowseDefinition(), { + new FlatBrowseDefinition(), { id: 'dateissued', dataType: BrowseByDataType.Date, metadataKeys: ['dc.date.issued'] } ), Object.assign( - new BrowseDefinition(), { + new ValueListBrowseDefinition(), { id: 'author', dataType: BrowseByDataType.Metadata, } ), Object.assign( - new BrowseDefinition(), { + new ValueListBrowseDefinition(), { id: 'subject', dataType: BrowseByDataType.Metadata, } ), + Object.assign( + new HierarchicalBrowseDefinition(), { + id: 'srsc', + } + ), ]; initialState = { core: { From 78d5116cdb7d1d6afaef8d8b9e35b792b551e03d Mon Sep 17 00:00:00 2001 From: Nona Luypaert Date: Tue, 23 May 2023 17:54:33 +0200 Subject: [PATCH 277/409] 101623: Add missing docs + Fix lint issues --- src/app/browse-by/browse-by-routing.module.ts | 2 -- src/app/core/data/browse-response-parsing.service.ts | 2 +- src/app/core/data/request.models.ts | 3 +++ src/app/core/shared/flat-browse-definition.model.ts | 3 +++ src/app/core/shared/hierarchical-browse-definition.model.ts | 3 +++ src/app/core/shared/value-list-browse-definition.model.ts | 3 +++ .../form/vocabulary-treeview/vocabulary-treeview.component.ts | 2 +- 7 files changed, 14 insertions(+), 4 deletions(-) diff --git a/src/app/browse-by/browse-by-routing.module.ts b/src/app/browse-by/browse-by-routing.module.ts index 5d3697f391..5788d3cc70 100644 --- a/src/app/browse-by/browse-by-routing.module.ts +++ b/src/app/browse-by/browse-by-routing.module.ts @@ -4,8 +4,6 @@ import { BrowseByGuard } from './browse-by-guard'; import { BrowseByDSOBreadcrumbResolver } from './browse-by-dso-breadcrumb.resolver'; import { BrowseByI18nBreadcrumbResolver } from './browse-by-i18n-breadcrumb.resolver'; import { ThemedBrowseBySwitcherComponent } from './browse-by-switcher/themed-browse-by-switcher.component'; -import { ThemedBrowseByTaxonomyPageComponent } from './browse-by-taxonomy-page/themed-browse-by-taxonomy-page.component'; -import { I18nBreadcrumbResolver } from '../core/breadcrumbs/i18n-breadcrumb.resolver'; @NgModule({ imports: [ diff --git a/src/app/core/data/browse-response-parsing.service.ts b/src/app/core/data/browse-response-parsing.service.ts index 3681198406..a568cdb617 100644 --- a/src/app/core/data/browse-response-parsing.service.ts +++ b/src/app/core/data/browse-response-parsing.service.ts @@ -15,7 +15,7 @@ import { ValueListBrowseDefinition } from '../shared/value-list-browse-definitio import { VALUE_LIST_BROWSE_DEFINITION } from '../shared/value-list-browse-definition.resource-type'; /** - * A ResponseParsingService used to parse RawRestResponse coming from the REST API to a BrowseDefinition object + * A ResponseParsingService used to parse a REST API response to a BrowseDefinition object */ @Injectable({ providedIn: 'root', diff --git a/src/app/core/data/request.models.ts b/src/app/core/data/request.models.ts index 79505a3dee..9809bc0fde 100644 --- a/src/app/core/data/request.models.ts +++ b/src/app/core/data/request.models.ts @@ -119,6 +119,9 @@ export class PatchRequest extends DSpaceRestRequest { } } +/** + * Class representing a BrowseDefinition HTTP Rest request object + */ export class BrowseDefinitionRestRequest extends DSpaceRestRequest { getResponseParser(): GenericConstructor { return BrowseResponseParsingService; diff --git a/src/app/core/shared/flat-browse-definition.model.ts b/src/app/core/shared/flat-browse-definition.model.ts index f94fa75b91..308f0c7a5b 100644 --- a/src/app/core/shared/flat-browse-definition.model.ts +++ b/src/app/core/shared/flat-browse-definition.model.ts @@ -5,6 +5,9 @@ import { FLAT_BROWSE_DEFINITION } from './flat-browse-definition.resource-type'; import { ResourceType } from './resource-type'; import { NonHierarchicalBrowseDefinition } from './non-hierarchical-browse-definition'; +/** + * BrowseDefinition model for browses of type 'flatBrowse' + */ @typedObject @inheritSerialization(NonHierarchicalBrowseDefinition) export class FlatBrowseDefinition extends NonHierarchicalBrowseDefinition { diff --git a/src/app/core/shared/hierarchical-browse-definition.model.ts b/src/app/core/shared/hierarchical-browse-definition.model.ts index 427f5e1947..ca3ed7bff0 100644 --- a/src/app/core/shared/hierarchical-browse-definition.model.ts +++ b/src/app/core/shared/hierarchical-browse-definition.model.ts @@ -6,6 +6,9 @@ import { HALLink } from './hal-link.model'; import { ResourceType } from './resource-type'; import { BrowseDefinition } from './browse-definition.model'; +/** + * BrowseDefinition model for browses of type 'hierarchicalBrowse' + */ @typedObject @inheritSerialization(BrowseDefinition) export class HierarchicalBrowseDefinition extends BrowseDefinition { diff --git a/src/app/core/shared/value-list-browse-definition.model.ts b/src/app/core/shared/value-list-browse-definition.model.ts index a42a702940..33cce82cac 100644 --- a/src/app/core/shared/value-list-browse-definition.model.ts +++ b/src/app/core/shared/value-list-browse-definition.model.ts @@ -5,6 +5,9 @@ import { VALUE_LIST_BROWSE_DEFINITION } from './value-list-browse-definition.res import { ResourceType } from './resource-type'; import { NonHierarchicalBrowseDefinition } from './non-hierarchical-browse-definition'; +/** + * BrowseDefinition model for browses of type 'valueList' + */ @typedObject @inheritSerialization(NonHierarchicalBrowseDefinition) export class ValueListBrowseDefinition extends NonHierarchicalBrowseDefinition { diff --git a/src/app/shared/form/vocabulary-treeview/vocabulary-treeview.component.ts b/src/app/shared/form/vocabulary-treeview/vocabulary-treeview.component.ts index 2199de920e..891a825745 100644 --- a/src/app/shared/form/vocabulary-treeview/vocabulary-treeview.component.ts +++ b/src/app/shared/form/vocabulary-treeview/vocabulary-treeview.component.ts @@ -248,7 +248,7 @@ export class VocabularyTreeviewComponent implements OnDestroy, OnInit { } /** - * Method called on entry select + * Method called on entry select/deselect */ onSelect(item: VocabularyEntryDetail) { if (!this.selectedItems.includes(item.id)) { From 8a93bef98c5db3ba35e00318b1beec2c1ccbec88 Mon Sep 17 00:00:00 2001 From: "Mark H. Wood" Date: Tue, 23 May 2023 13:06:12 -0400 Subject: [PATCH 278/409] Supply a customizable themed version. --- .../file/section-upload-file.component.html | 52 +++++++++++ .../file/section-upload-file.component.scss | 0 .../file/section-upload-file.component.ts | 89 +++++++++++++++++++ src/themes/custom/lazy-theme.module.ts | 2 + 4 files changed, 143 insertions(+) create mode 100644 src/themes/custom/app/submission/sections/upload/file/section-upload-file.component.html create mode 100644 src/themes/custom/app/submission/sections/upload/file/section-upload-file.component.scss create mode 100644 src/themes/custom/app/submission/sections/upload/file/section-upload-file.component.ts diff --git a/src/themes/custom/app/submission/sections/upload/file/section-upload-file.component.html b/src/themes/custom/app/submission/sections/upload/file/section-upload-file.component.html new file mode 100644 index 0000000000..8999853d72 --- /dev/null +++ b/src/themes/custom/app/submission/sections/upload/file/section-upload-file.component.html @@ -0,0 +1,52 @@ + +
    +
    + + +
    +
    +
    +

    {{fileName}} ({{fileData?.sizeBytes | dsFileSize}})

    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + + + + + + diff --git a/src/themes/custom/app/submission/sections/upload/file/section-upload-file.component.scss b/src/themes/custom/app/submission/sections/upload/file/section-upload-file.component.scss new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/themes/custom/app/submission/sections/upload/file/section-upload-file.component.ts b/src/themes/custom/app/submission/sections/upload/file/section-upload-file.component.ts new file mode 100644 index 0000000000..00431cbbe2 --- /dev/null +++ b/src/themes/custom/app/submission/sections/upload/file/section-upload-file.component.ts @@ -0,0 +1,89 @@ +import { + Component, Input, ViewChild +} from '@angular/core'; + +import { + SubmissionFormsModel +} from 'src/app/core/config/models/config-submission-forms.model'; +import { + SubmissionSectionUploadFileEditComponent +} from 'src/app/submission/sections/upload/file/edit/section-upload-file-edit.component'; +import { + SubmissionSectionUploadFileComponent as BaseComponent +} from 'src/app/submission/sections/upload/file/section-upload-file.component'; + +/** + * This component represents a single bitstream contained in the submission + */ +@Component({ + selector: 'ds-submission-upload-section-file', + // styleUrls: ['./section-upload-file.component.scss'], + styleUrls: ['../../../../../../../app/submission/sections/upload/file/section-upload-file.component.scss'], + // templateUrl: './section-upload-file.component.html' + templateUrl: '../../../../../../../app/submission/sections/upload/file/section-upload-file.component.html' +}) +export class SubmissionSectionUploadFileComponent + extends BaseComponent { + + /** + * The list of available access condition + * @type {Array} + */ + @Input() availableAccessConditionOptions: any[]; + + /** + * The submission id + * @type {string} + */ + @Input() collectionId: string; + + /** + * Define if collection access conditions policy type : + * POLICY_DEFAULT_NO_LIST : is not possible to define additional access group/s for the single file + * POLICY_DEFAULT_WITH_LIST : is possible to define additional access group/s for the single file + * @type {number} + */ + @Input() collectionPolicyType: number; + + /** + * The configuration for the bitstream's metadata form + * @type {SubmissionFormsModel} + */ + @Input() configMetadataForm: SubmissionFormsModel; + + /** + * The bitstream id + * @type {string} + */ + @Input() fileId: string; + + /** + * The bitstream array key + * @type {string} + */ + @Input() fileIndex: string; + + /** + * The bitstream id + * @type {string} + */ + @Input() fileName: string; + + /** + * The section id + * @type {string} + */ + @Input() sectionId: string; + + /** + * The submission id + * @type {string} + */ + @Input() submissionId: string; + + /** + * The [[SubmissionSectionUploadFileEditComponent]] reference + * @type {SubmissionSectionUploadFileEditComponent} + */ + @ViewChild(SubmissionSectionUploadFileEditComponent) fileEditComp: SubmissionSectionUploadFileEditComponent; +} diff --git a/src/themes/custom/lazy-theme.module.ts b/src/themes/custom/lazy-theme.module.ts index adf3a888c1..6f442eafcc 100644 --- a/src/themes/custom/lazy-theme.module.ts +++ b/src/themes/custom/lazy-theme.module.ts @@ -141,6 +141,7 @@ import { import { NgxGalleryModule } from '@kolkov/ngx-gallery'; import { WorkspaceItemsDeletePageComponent } from './app/workspace-items-delete-page/workspace-items-delete/workspace-items-delete.component'; import { ThumbnailComponent } from './app/thumbnail/thumbnail.component'; +import { SubmissionSectionUploadFileComponent } from './app/submission/sections/upload/file/section-upload-file.component'; const DECLARATIONS = [ FileSectionComponent, @@ -217,6 +218,7 @@ const DECLARATIONS = [ MediaViewerVideoComponent, WorkspaceItemsDeletePageComponent, ThumbnailComponent, + SubmissionSectionUploadFileComponent, ]; @NgModule({ From e7b02778cfae025a9db5805e82e46b37c8cd9a32 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 24 May 2023 02:15:33 +0000 Subject: [PATCH 279/409] Bump socket.io-parser from 4.2.2 to 4.2.3 Bumps [socket.io-parser](https://github.com/socketio/socket.io-parser) from 4.2.2 to 4.2.3. - [Release notes](https://github.com/socketio/socket.io-parser/releases) - [Changelog](https://github.com/socketio/socket.io-parser/blob/main/CHANGELOG.md) - [Commits](https://github.com/socketio/socket.io-parser/compare/4.2.2...4.2.3) --- updated-dependencies: - dependency-name: socket.io-parser dependency-type: indirect ... Signed-off-by: dependabot[bot] --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index d1d0f56ab5..730966fcdb 100644 --- a/yarn.lock +++ b/yarn.lock @@ -10377,9 +10377,9 @@ socket.io-client@^4.4.1: socket.io-parser "~4.2.1" socket.io-parser@~4.2.1: - version "4.2.2" - resolved "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.2.tgz" - integrity sha512-DJtziuKypFkMMHCm2uIshOYC7QaylbtzQwiMYDuCKy3OPkjLzu4B2vAhTlqipRHHzrI0NJeBAizTK7X+6m1jVw== + version "4.2.3" + resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-4.2.3.tgz#926bcc6658e2ae0883dc9dee69acbdc76e4e3667" + integrity sha512-JMafRntWVO2DCJimKsRTh/wnqVvO4hrfwOqtO7f+uzwsQMuxO6VwImtYxaQ+ieoyshWOTJyV0fA21lccEXRPpQ== dependencies: "@socket.io/component-emitter" "~3.1.0" debug "~4.3.1" From 1d0df844c3388d710572cbc9a04aeb07648e2c69 Mon Sep 17 00:00:00 2001 From: Nona Luypaert Date: Wed, 24 May 2023 16:51:52 +0200 Subject: [PATCH 280/409] 101623: Fixes after merge --- .../metadata-values/metadata-values.component.ts | 3 ++- .../browse-link-metadata-list-element.component.ts | 3 ++- .../plain-text-metadata-list-element.component.ts | 3 ++- .../testing/browse-definition-data-service.stub.ts | 10 ++++++---- 4 files changed, 12 insertions(+), 7 deletions(-) diff --git a/src/app/item-page/field-components/metadata-values/metadata-values.component.ts b/src/app/item-page/field-components/metadata-values/metadata-values.component.ts index 49ce453fbe..cbbae9006d 100644 --- a/src/app/item-page/field-components/metadata-values/metadata-values.component.ts +++ b/src/app/item-page/field-components/metadata-values/metadata-values.component.ts @@ -3,6 +3,7 @@ import { MetadataValue } from '../../../core/shared/metadata.models'; import { APP_CONFIG, AppConfig } from '../../../../config/app-config.interface'; import { BrowseDefinition } from '../../../core/shared/browse-definition.model'; import { hasValue } from '../../../shared/empty.util'; +import { VALUE_LIST_BROWSE_DEFINITION } from '../../../core/shared/value-list-browse-definition.resource-type'; /** * This component renders the configured 'values' into the ds-metadata-field-wrapper component. @@ -84,7 +85,7 @@ export class MetadataValuesComponent implements OnChanges { */ getQueryParams(value) { let queryParams = {startsWith: value}; - if (this.browseDefinition.metadataBrowse) { + if (this.browseDefinition.getRenderType() === VALUE_LIST_BROWSE_DEFINITION.value) { return {value: value}; } return queryParams; diff --git a/src/app/shared/object-list/metadata-representation-list-element/browse-link/browse-link-metadata-list-element.component.ts b/src/app/shared/object-list/metadata-representation-list-element/browse-link/browse-link-metadata-list-element.component.ts index 0eb0ce05b0..072601d456 100644 --- a/src/app/shared/object-list/metadata-representation-list-element/browse-link/browse-link-metadata-list-element.component.ts +++ b/src/app/shared/object-list/metadata-representation-list-element/browse-link/browse-link-metadata-list-element.component.ts @@ -2,6 +2,7 @@ import { MetadataRepresentationType } from '../../../../core/shared/metadata-rep import { Component } from '@angular/core'; import { MetadataRepresentationListElementComponent } from '../metadata-representation-list-element.component'; import { metadataRepresentationComponent } from '../../../metadata-representation/metadata-representation.decorator'; +import { VALUE_LIST_BROWSE_DEFINITION } from '../../../../core/shared/value-list-browse-definition.resource-type'; //@metadataRepresentationComponent('Publication', MetadataRepresentationType.PlainText) // For now, authority controlled fields are rendered the same way as plain text fields //@metadataRepresentationComponent('Publication', MetadataRepresentationType.AuthorityControlled) @@ -21,7 +22,7 @@ export class BrowseLinkMetadataListElementComponent extends MetadataRepresentati */ getQueryParams() { let queryParams = {startsWith: this.metadataRepresentation.getValue()}; - if (this.metadataRepresentation.browseDefinition.metadataBrowse) { + if (this.metadataRepresentation.browseDefinition.getRenderType() === VALUE_LIST_BROWSE_DEFINITION.value) { return {value: this.metadataRepresentation.getValue()}; } return queryParams; diff --git a/src/app/shared/object-list/metadata-representation-list-element/plain-text/plain-text-metadata-list-element.component.ts b/src/app/shared/object-list/metadata-representation-list-element/plain-text/plain-text-metadata-list-element.component.ts index 2d21a7afe8..c4470ae974 100644 --- a/src/app/shared/object-list/metadata-representation-list-element/plain-text/plain-text-metadata-list-element.component.ts +++ b/src/app/shared/object-list/metadata-representation-list-element/plain-text/plain-text-metadata-list-element.component.ts @@ -2,6 +2,7 @@ import { MetadataRepresentationType } from '../../../../core/shared/metadata-rep import { Component } from '@angular/core'; import { MetadataRepresentationListElementComponent } from '../metadata-representation-list-element.component'; import { metadataRepresentationComponent } from '../../../metadata-representation/metadata-representation.decorator'; +import { VALUE_LIST_BROWSE_DEFINITION } from '../../../../core/shared/value-list-browse-definition.resource-type'; @metadataRepresentationComponent('Publication', MetadataRepresentationType.PlainText) // For now, authority controlled fields are rendered the same way as plain text fields @@ -21,7 +22,7 @@ export class PlainTextMetadataListElementComponent extends MetadataRepresentatio */ getQueryParams() { let queryParams = {startsWith: this.metadataRepresentation.getValue()}; - if (this.metadataRepresentation.browseDefinition.metadataBrowse) { + if (this.metadataRepresentation.browseDefinition.getRenderType() === VALUE_LIST_BROWSE_DEFINITION.value) { return {value: this.metadataRepresentation.getValue()}; } return queryParams; diff --git a/src/app/shared/testing/browse-definition-data-service.stub.ts b/src/app/shared/testing/browse-definition-data-service.stub.ts index ec1fc2f05e..8d46fcda00 100644 --- a/src/app/shared/testing/browse-definition-data-service.stub.ts +++ b/src/app/shared/testing/browse-definition-data-service.stub.ts @@ -5,12 +5,14 @@ import { BrowseDefinition } from '../../core/shared/browse-definition.model'; import { BrowseService } from '../../core/browse/browse.service'; import { createSuccessfulRemoteDataObject } from '../remote-data.utils'; import { PageInfo } from '../../core/shared/page-info.model'; +import { FlatBrowseDefinition } from '../../core/shared/flat-browse-definition.model'; +import { ValueListBrowseDefinition } from '../../core/shared/value-list-browse-definition.model'; // This data is in post-serialized form (metadata -> metadataKeys) export const mockData: BrowseDefinition[] = [ - Object.assign(new BrowseDefinition, { + Object.assign(new FlatBrowseDefinition(), { 'id' : 'dateissued', - 'metadataBrowse' : false, + 'browseType': 'flatBrowse', 'dataType' : 'date', 'sortOptions' : EMPTY, 'order' : 'ASC', @@ -18,9 +20,9 @@ export const mockData: BrowseDefinition[] = [ 'metadataKeys' : [ 'dc.date.issued' ], '_links' : EMPTY }), - Object.assign(new BrowseDefinition, { + Object.assign(new ValueListBrowseDefinition(), { 'id' : 'author', - 'metadataBrowse' : true, + 'browseType' : 'valueList', 'dataType' : 'text', 'sortOptions' : EMPTY, 'order' : 'ASC', From efaf1d47daf9ab4481f64f2b0c639fc306ca7bde Mon Sep 17 00:00:00 2001 From: Kim Shepherd Date: Thu, 25 May 2023 10:16:55 +1200 Subject: [PATCH 281/409] item-status comp should handle missing config gracefully if the "register identifier" config is missing, simply return enabled=false rather than break the rest of the page features from loading --- .../item-status/item-status.component.ts | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/src/app/item-page/edit-item-page/item-status/item-status.component.ts b/src/app/item-page/edit-item-page/item-status/item-status.component.ts index c2db518415..ce84786304 100644 --- a/src/app/item-page/edit-item-page/item-status/item-status.component.ts +++ b/src/app/item-page/edit-item-page/item-status/item-status.component.ts @@ -9,9 +9,9 @@ import { RemoteData } from '../../../core/data/remote-data'; import { getItemEditRoute, getItemPageRoute } from '../../item-page-routing-paths'; import { AuthorizationDataService } from '../../../core/data/feature-authorization/authorization-data.service'; import { FeatureID } from '../../../core/data/feature-authorization/feature-id'; -import { hasValue } from '../../../shared/empty.util'; +import { hasValue, isNotEmpty } from '../../../shared/empty.util'; import { - getAllSucceededRemoteDataPayload, getFirstSucceededRemoteData, getRemoteDataPayload, + getAllSucceededRemoteDataPayload, getFirstCompletedRemoteData, getFirstSucceededRemoteData, getRemoteDataPayload, } from '../../../core/shared/operators'; import { IdentifierDataService } from '../../../core/data/identifier-data.service'; import { Identifier } from '../../../shared/object-list/identifier-data/identifier.model'; @@ -105,12 +105,13 @@ export class ItemStatusComponent implements OnInit { // Observable for configuration determining whether the Register DOI feature is enabled let registerConfigEnabled$: Observable = this.configurationService.findByPropertyName('identifiers.item-status.register-doi').pipe( - getFirstSucceededRemoteData(), - getRemoteDataPayload(), - map((enabled: ConfigurationProperty) => { - if (enabled !== undefined && enabled.values) { - return true; + getFirstCompletedRemoteData(), + map((rd: RemoteData) => { + // If the config property is exposed via rest and has a value set, return it + if (rd.hasSucceeded && hasValue(rd.payload) && isNotEmpty(rd.payload.values)) { + return rd.payload.values[0] === 'true'; } + // Otherwise, return false return false; }) ); From 85f95112b3542281858cfc9db1d97aec50647c4d Mon Sep 17 00:00:00 2001 From: Nona Luypaert Date: Thu, 25 May 2023 12:10:28 +0200 Subject: [PATCH 282/409] 101127: Remove invalid links in BrowseDefinition models --- src/app/core/shared/flat-browse-definition.model.ts | 9 ++++++++- .../core/shared/hierarchical-browse-definition.model.ts | 2 -- .../core/shared/non-hierarchical-browse-definition.ts | 7 ------- .../core/shared/value-list-browse-definition.model.ts | 9 ++++++++- 4 files changed, 16 insertions(+), 11 deletions(-) diff --git a/src/app/core/shared/flat-browse-definition.model.ts b/src/app/core/shared/flat-browse-definition.model.ts index 308f0c7a5b..f275db199c 100644 --- a/src/app/core/shared/flat-browse-definition.model.ts +++ b/src/app/core/shared/flat-browse-definition.model.ts @@ -1,9 +1,10 @@ -import { inheritSerialization } from 'cerialize'; +import { inheritSerialization, deserialize } from 'cerialize'; import { typedObject } from '../cache/builders/build-decorators'; import { excludeFromEquals } from '../utilities/equals.decorators'; import { FLAT_BROWSE_DEFINITION } from './flat-browse-definition.resource-type'; import { ResourceType } from './resource-type'; import { NonHierarchicalBrowseDefinition } from './non-hierarchical-browse-definition'; +import { HALLink } from './hal-link.model'; /** * BrowseDefinition model for browses of type 'flatBrowse' @@ -26,4 +27,10 @@ export class FlatBrowseDefinition extends NonHierarchicalBrowseDefinition { getRenderType(): string { return this.dataType; } + + @deserialize + _links: { + self: HALLink; + items: HALLink; + }; } diff --git a/src/app/core/shared/hierarchical-browse-definition.model.ts b/src/app/core/shared/hierarchical-browse-definition.model.ts index ca3ed7bff0..d561fff643 100644 --- a/src/app/core/shared/hierarchical-browse-definition.model.ts +++ b/src/app/core/shared/hierarchical-browse-definition.model.ts @@ -36,8 +36,6 @@ export class HierarchicalBrowseDefinition extends BrowseDefinition { @deserialize _links: { self: HALLink; - entries: HALLink; - items: HALLink; vocabulary: HALLink; }; diff --git a/src/app/core/shared/non-hierarchical-browse-definition.ts b/src/app/core/shared/non-hierarchical-browse-definition.ts index a4f6df43d9..12f2a06333 100644 --- a/src/app/core/shared/non-hierarchical-browse-definition.ts +++ b/src/app/core/shared/non-hierarchical-browse-definition.ts @@ -22,11 +22,4 @@ export abstract class NonHierarchicalBrowseDefinition extends BrowseDefinition { @autoserialize dataType: BrowseByDataType; - - @deserialize - _links: { - self: HALLink; - entries: HALLink; - items: HALLink; - }; } diff --git a/src/app/core/shared/value-list-browse-definition.model.ts b/src/app/core/shared/value-list-browse-definition.model.ts index 33cce82cac..9bcd8f2e43 100644 --- a/src/app/core/shared/value-list-browse-definition.model.ts +++ b/src/app/core/shared/value-list-browse-definition.model.ts @@ -1,9 +1,10 @@ -import { inheritSerialization } from 'cerialize'; +import { inheritSerialization, deserialize } from 'cerialize'; import { typedObject } from '../cache/builders/build-decorators'; import { excludeFromEquals } from '../utilities/equals.decorators'; import { VALUE_LIST_BROWSE_DEFINITION } from './value-list-browse-definition.resource-type'; import { ResourceType } from './resource-type'; import { NonHierarchicalBrowseDefinition } from './non-hierarchical-browse-definition'; +import { HALLink } from './hal-link.model'; /** * BrowseDefinition model for browses of type 'valueList' @@ -26,4 +27,10 @@ export class ValueListBrowseDefinition extends NonHierarchicalBrowseDefinition { getRenderType(): string { return this.dataType; } + + @deserialize + _links: { + self: HALLink; + entries: HALLink; + }; } From 220b30bea7661b1e7af58611bd3ff3531cdb0421 Mon Sep 17 00:00:00 2001 From: Giuseppe Digilio Date: Thu, 25 May 2023 23:15:57 +0200 Subject: [PATCH 283/409] [CST-5729] Address review feedback --- .../bitstream-download-page.component.spec.ts | 4 +- .../bitstream-download-page.component.ts | 40 +++++++++------ src/app/core/data/signposting-data.service.ts | 8 +++ .../core/services/server-response.service.ts | 36 +++++++++++++ src/app/init.service.ts | 1 - .../full/full-item-page.component.spec.ts | 3 +- .../full/full-item-page.component.ts | 7 +-- .../simple/item-page.component.spec.ts | 32 +++++++++--- .../item-page/simple/item-page.component.ts | 50 ++++++++++++------- 9 files changed, 136 insertions(+), 45 deletions(-) diff --git a/src/app/bitstream-page/bitstream-download-page/bitstream-download-page.component.spec.ts b/src/app/bitstream-page/bitstream-download-page/bitstream-download-page.component.spec.ts index 66024063cd..59261e56d2 100644 --- a/src/app/bitstream-page/bitstream-download-page/bitstream-download-page.component.spec.ts +++ b/src/app/bitstream-page/bitstream-download-page/bitstream-download-page.component.spec.ts @@ -13,6 +13,7 @@ import { TranslateModule } from '@ngx-translate/core'; import { CommonModule } from '@angular/common'; import { SignpostingDataService } from '../../core/data/signposting-data.service'; import { ServerResponseService } from '../../core/services/server-response.service'; +import { PLATFORM_ID } from '@angular/core'; describe('BitstreamDownloadPageComponent', () => { let component: BitstreamDownloadPageComponent; @@ -99,7 +100,8 @@ describe('BitstreamDownloadPageComponent', () => { { provide: FileService, useValue: fileService }, { provide: HardRedirectService, useValue: hardRedirectService }, { provide: ServerResponseService, useValue: serverResponseService }, - { provide: SignpostingDataService, useValue: signpostingDataService } + { provide: SignpostingDataService, useValue: signpostingDataService }, + { provide: PLATFORM_ID, useValue: 'server' } ] }) .compileComponents(); diff --git a/src/app/bitstream-page/bitstream-download-page/bitstream-download-page.component.ts b/src/app/bitstream-page/bitstream-download-page/bitstream-download-page.component.ts index 14245c4cd1..0becfcf473 100644 --- a/src/app/bitstream-page/bitstream-download-page/bitstream-download-page.component.ts +++ b/src/app/bitstream-page/bitstream-download-page/bitstream-download-page.component.ts @@ -1,4 +1,4 @@ -import { Component, OnInit } from '@angular/core'; +import { Component, Inject, OnInit, PLATFORM_ID } from '@angular/core'; import { filter, map, switchMap, take } from 'rxjs/operators'; import { ActivatedRoute, Router } from '@angular/router'; import { hasValue, isNotEmpty } from '../../shared/empty.util'; @@ -13,7 +13,7 @@ import { HardRedirectService } from '../../core/services/hard-redirect.service'; import { getForbiddenRoute } from '../../app-routing-paths'; import { RemoteData } from '../../core/data/remote-data'; import { redirectOn4xx } from '../../core/shared/authorized.operators'; -import { Location } from '@angular/common'; +import { isPlatformServer, Location } from '@angular/common'; import { SignpostingDataService } from 'src/app/core/data/signposting-data.service'; import { ServerResponseService } from 'src/app/core/services/server-response.service'; import { SignpostingLink } from '../../core/data/signposting-links.model'; @@ -39,19 +39,10 @@ export class BitstreamDownloadPageComponent implements OnInit { private hardRedirectService: HardRedirectService, private location: Location, private signpostingDataService: SignpostingDataService, - private responseService: ServerResponseService + private responseService: ServerResponseService, + @Inject(PLATFORM_ID) protected platformId: string ) { - this.route.params.subscribe(params => { - this.signpostingDataService.getLinks(params.id).pipe(take(1)).subscribe((signpostingLinks: SignpostingLink[]) => { - let links = ''; - - signpostingLinks.forEach((link: SignpostingLink) => { - links = links + (isNotEmpty(links) ? ', ' : '') + `<${link.href}> ; rel="${link.rel}" ; type="${link.type}" `; - }); - - this.responseService.setHeader('Link', links); - }); - }); + this.initPageLinks(); } back(): void { @@ -101,4 +92,25 @@ export class BitstreamDownloadPageComponent implements OnInit { } }); } + + /** + * Create page links if any are retrieved by signposting endpoint + * + * @private + */ + private initPageLinks(): void { + if (isPlatformServer(this.platformId)) { + this.route.params.subscribe(params => { + this.signpostingDataService.getLinks(params.id).pipe(take(1)).subscribe((signpostingLinks: SignpostingLink[]) => { + let links = ''; + + signpostingLinks.forEach((link: SignpostingLink) => { + links = links + (isNotEmpty(links) ? ', ' : '') + `<${link.href}> ; rel="${link.rel}" ; type="${link.type}" `; + }); + + this.responseService.setHeader('Link', links); + }); + }); + } + } } diff --git a/src/app/core/data/signposting-data.service.ts b/src/app/core/data/signposting-data.service.ts index e09d68974c..fca22ec383 100644 --- a/src/app/core/data/signposting-data.service.ts +++ b/src/app/core/data/signposting-data.service.ts @@ -8,6 +8,9 @@ import { HALEndpointService } from '../shared/hal-endpoint.service'; import { RawRestResponse } from '../dspace-rest/raw-rest-response.model'; import { SignpostingLink } from './signposting-links.model'; +/** + * Service responsible for handling requests related to the Signposting endpoint + */ @Injectable({ providedIn: 'root' }) @@ -16,6 +19,11 @@ export class SignpostingDataService { constructor(private restService: DspaceRestService, protected halService: HALEndpointService) { } + /** + * Retrieve the list of signposting links related to the given resource's id + * + * @param uuid + */ getLinks(uuid: string): Observable { const baseUrl = this.halService.getRootHref().replace('/api', ''); diff --git a/src/app/core/services/server-response.service.ts b/src/app/core/services/server-response.service.ts index 2268e9eb03..0b193d536c 100644 --- a/src/app/core/services/server-response.service.ts +++ b/src/app/core/services/server-response.service.ts @@ -1,7 +1,11 @@ import { RESPONSE } from '@nguniversal/express-engine/tokens'; import { Inject, Injectable, Optional } from '@angular/core'; + import { Response } from 'express'; +/** + * Service responsible to provide method to manage the response object + */ @Injectable() export class ServerResponseService { private response: Response; @@ -10,6 +14,12 @@ export class ServerResponseService { this.response = response; } + /** + * Set a status code to response + * + * @param code + * @param message + */ setStatus(code: number, message?: string): this { if (this.response) { this.response.statusCode = code; @@ -20,22 +30,48 @@ export class ServerResponseService { return this; } + /** + * Set Unauthorized status + * + * @param message + */ setUnauthorized(message = 'Unauthorized'): this { return this.setStatus(401, message); } + /** + * Set Forbidden status + * + * @param message + */ setForbidden(message = 'Forbidden'): this { return this.setStatus(403, message); } + /** + * Set Not found status + * + * @param message + */ setNotFound(message = 'Not found'): this { return this.setStatus(404, message); } + /** + * Set Internal Server Error status + * + * @param message + */ setInternalServerError(message = 'Internal Server Error'): this { return this.setStatus(500, message); } + /** + * Set a response's header + * + * @param header + * @param content + */ setHeader(header: string, content: string) { if (this.response) { this.response.setHeader(header, content); diff --git a/src/app/init.service.ts b/src/app/init.service.ts index 2bbc589cc0..9fef2ca4ed 100644 --- a/src/app/init.service.ts +++ b/src/app/init.service.ts @@ -188,7 +188,6 @@ export abstract class InitService { this.breadcrumbsService.listenForRouteChanges(); this.themeService.listenForRouteChanges(); this.menuService.listenForRouteChanges(); - // this.metadataItem.checkCurrentRoute(); } /** diff --git a/src/app/item-page/full/full-item-page.component.spec.ts b/src/app/item-page/full/full-item-page.component.spec.ts index ec4054d888..9fc078c2cd 100644 --- a/src/app/item-page/full/full-item-page.component.spec.ts +++ b/src/app/item-page/full/full-item-page.component.spec.ts @@ -2,7 +2,7 @@ import { ComponentFixture, fakeAsync, TestBed, waitForAsync } from '@angular/cor import { ItemDataService } from '../../core/data/item-data.service'; import { TranslateLoader, TranslateModule } from '@ngx-translate/core'; import { TranslateLoaderMock } from '../../shared/mocks/translate-loader.mock'; -import { ChangeDetectionStrategy, NO_ERRORS_SCHEMA } from '@angular/core'; +import { ChangeDetectionStrategy, NO_ERRORS_SCHEMA, PLATFORM_ID } from '@angular/core'; import { TruncatePipe } from '../../shared/utils/truncate.pipe'; import { FullItemPageComponent } from './full-item-page.component'; import { MetadataService } from '../../core/metadata/metadata.service'; @@ -122,6 +122,7 @@ describe('FullItemPageComponent', () => { { provide: ServerResponseService, useValue: serverResponseService }, { provide: SignpostingDataService, useValue: signpostingDataService }, { provide: LinkHeadService, useValue: linkHeadService }, + { provide: PLATFORM_ID, useValue: 'server' } ], schemas: [NO_ERRORS_SCHEMA] }).overrideComponent(FullItemPageComponent, { diff --git a/src/app/item-page/full/full-item-page.component.ts b/src/app/item-page/full/full-item-page.component.ts index f0100eed72..31dd2c5fc2 100644 --- a/src/app/item-page/full/full-item-page.component.ts +++ b/src/app/item-page/full/full-item-page.component.ts @@ -1,5 +1,5 @@ import { filter, map } from 'rxjs/operators'; -import { ChangeDetectionStrategy, Component, OnDestroy, OnInit } from '@angular/core'; +import { ChangeDetectionStrategy, Component, Inject, OnDestroy, OnInit, PLATFORM_ID } from '@angular/core'; import { ActivatedRoute, Data, Router } from '@angular/router'; import { BehaviorSubject, Observable } from 'rxjs'; @@ -54,9 +54,10 @@ export class FullItemPageComponent extends ItemPageComponent implements OnInit, protected _location: Location, protected responseService: ServerResponseService, protected signpostingDataService: SignpostingDataService, - protected linkHeadService: LinkHeadService + protected linkHeadService: LinkHeadService, + @Inject(PLATFORM_ID) protected platformId: string, ) { - super(route, router, items, authService, authorizationService, responseService, signpostingDataService, linkHeadService); + super(route, router, items, authService, authorizationService, responseService, signpostingDataService, linkHeadService, platformId); } /*** AoT inheritance fix, will hopefully be resolved in the near future **/ diff --git a/src/app/item-page/simple/item-page.component.spec.ts b/src/app/item-page/simple/item-page.component.spec.ts index 005142e3f1..dfba4bd235 100644 --- a/src/app/item-page/simple/item-page.component.spec.ts +++ b/src/app/item-page/simple/item-page.component.spec.ts @@ -2,7 +2,7 @@ import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; import { TranslateLoader, TranslateModule } from '@ngx-translate/core'; import { TranslateLoaderMock } from '../../shared/mocks/translate-loader.mock'; import { ItemDataService } from '../../core/data/item-data.service'; -import { ChangeDetectionStrategy, NO_ERRORS_SCHEMA } from '@angular/core'; +import { ChangeDetectionStrategy, NO_ERRORS_SCHEMA, PLATFORM_ID } from '@angular/core'; import { ItemPageComponent } from './item-page.component'; import { ActivatedRoute, Router } from '@angular/router'; import { ActivatedRouteStub } from '../../shared/testing/active-router.stub'; @@ -24,7 +24,8 @@ import { createPaginatedList } from '../../shared/testing/utils.test'; import { AuthorizationDataService } from '../../core/data/feature-authorization/authorization-data.service'; import { ServerResponseService } from '../../core/services/server-response.service'; import { SignpostingDataService } from '../../core/data/signposting-data.service'; -import { LinkHeadService } from '../../core/services/link-head.service'; +import { LinkDefinition, LinkHeadService } from '../../core/services/link-head.service'; +import { SignpostingLink } from '../../core/data/signposting-links.model'; const mockItem: Item = Object.assign(new Item(), { bundles: createSuccessfulRemoteDataObject$(createPaginatedList([])), @@ -41,16 +42,18 @@ const mockWithdrawnItem: Item = Object.assign(new Item(), { const mocklink = { href: 'http://test.org', - rel: 'test', - type: 'test' + rel: 'rel1', + type: 'type1' }; const mocklink2 = { href: 'http://test2.org', - rel: 'test', - type: 'test' + rel: 'rel2', + type: 'type2' }; +const mockSignpostingLinks: SignpostingLink[] = [mocklink, mocklink2]; + describe('ItemPageComponent', () => { let comp: ItemPageComponent; let fixture: ComponentFixture; @@ -109,6 +112,7 @@ describe('ItemPageComponent', () => { { provide: ServerResponseService, useValue: serverResponseService }, { provide: SignpostingDataService, useValue: signpostingDataService }, { provide: LinkHeadService, useValue: linkHeadService }, + { provide: PLATFORM_ID, useValue: 'server' }, ], schemas: [NO_ERRORS_SCHEMA] @@ -165,6 +169,22 @@ describe('ItemPageComponent', () => { expect(linkHeadService.addTag).toHaveBeenCalledTimes(2); }); + + it('should add link tags correctly', () => { + + expect(comp.signpostingLinks).toEqual([mocklink, mocklink2]); + + // Check if linkHeadService.addTag() was called with the correct arguments + expect(linkHeadService.addTag).toHaveBeenCalledTimes(mockSignpostingLinks.length); + expect(linkHeadService.addTag).toHaveBeenCalledWith(mockSignpostingLinks[0] as LinkDefinition); + expect(linkHeadService.addTag).toHaveBeenCalledWith(mockSignpostingLinks[1] as LinkDefinition); + }); + + it('should set Link header on the server', () => { + + expect(serverResponseService.setHeader).toHaveBeenCalledWith('Link', ' ; rel="rel1" ; type="type1" , ; rel="rel2" ; type="type2" '); + }); + }); describe('when the item is withdrawn and the user is not an admin', () => { beforeEach(() => { diff --git a/src/app/item-page/simple/item-page.component.ts b/src/app/item-page/simple/item-page.component.ts index f5ee9e1e78..a11cb22883 100644 --- a/src/app/item-page/simple/item-page.component.ts +++ b/src/app/item-page/simple/item-page.component.ts @@ -1,5 +1,6 @@ -import { ChangeDetectionStrategy, Component, OnDestroy, OnInit } from '@angular/core'; +import { ChangeDetectionStrategy, Component, Inject, OnDestroy, OnInit, PLATFORM_ID } from '@angular/core'; import { ActivatedRoute, Router } from '@angular/router'; +import { isPlatformServer } from '@angular/common'; import { Observable } from 'rxjs'; import { map, take } from 'rxjs/operators'; @@ -75,25 +76,10 @@ export class ItemPageComponent implements OnInit, OnDestroy { protected authorizationService: AuthorizationDataService, protected responseService: ServerResponseService, protected signpostingDataService: SignpostingDataService, - protected linkHeadService: LinkHeadService + protected linkHeadService: LinkHeadService, + @Inject(PLATFORM_ID) protected platformId: string ) { - this.route.params.subscribe(params => { - this.signpostingDataService.getLinks(params.id).pipe(take(1)).subscribe((signpostingLinks: SignpostingLink[]) => { - let links = ''; - this.signpostingLinks = signpostingLinks; - - signpostingLinks.forEach((link: SignpostingLink) => { - links = links + (isNotEmpty(links) ? ', ' : '') + `<${link.href}> ; rel="${link.rel}" ; type="${link.type}" `; - this.linkHeadService.addTag({ - href: link.href, - type: link.type, - rel: link.rel - }); - }); - - this.responseService.setHeader('Link', links); - }); - }); + this.initPageLinks(); } /** @@ -113,6 +99,32 @@ export class ItemPageComponent implements OnInit, OnDestroy { } + /** + * Create page links if any are retrieved by signposting endpoint + * + * @private + */ + private initPageLinks(): void { + this.route.params.subscribe(params => { + this.signpostingDataService.getLinks(params.id).pipe(take(1)).subscribe((signpostingLinks: SignpostingLink[]) => { + let links = ''; + this.signpostingLinks = signpostingLinks; + + signpostingLinks.forEach((link: SignpostingLink) => { + links = links + (isNotEmpty(links) ? ', ' : '') + `<${link.href}> ; rel="${link.rel}" ; type="${link.type}" `; + this.linkHeadService.addTag({ + href: link.href, + type: link.type, + rel: link.rel + }); + }); + + if (isPlatformServer(this.platformId)) { + this.responseService.setHeader('Link', links); + } + }); + }); + } ngOnDestroy(): void { this.signpostingLinks.forEach((link: SignpostingLink) => { From 74a08202715008d5060cca4f0b4f531d7551616b Mon Sep 17 00:00:00 2001 From: "Mark H. Wood" Date: Fri, 26 May 2023 13:13:03 -0400 Subject: [PATCH 284/409] Correct test fixture to match unit-under-test requirements. --- src/app/shared/mocks/submission.mock.ts | 14 +++----------- 1 file changed, 3 insertions(+), 11 deletions(-) diff --git a/src/app/shared/mocks/submission.mock.ts b/src/app/shared/mocks/submission.mock.ts index b90cababcb..268ae33ab3 100644 --- a/src/app/shared/mocks/submission.mock.ts +++ b/src/app/shared/mocks/submission.mock.ts @@ -1668,11 +1668,7 @@ export const mockFileFormData = { ], endDate: [ { - value: { - year: 2019, - month: 1, - day: 16 - }, + value: new Date('2019-01-16'), language: null, authority: null, display: { @@ -1694,7 +1690,7 @@ export const mockFileFormData = { value: 'embargo', language: null, authority: null, - display: 'lease', + display: 'embargo', confidence: -1, place: 0, otherInformation: null @@ -1702,11 +1698,7 @@ export const mockFileFormData = { ], startDate: [ { - value: { - year: 2019, - month: 1, - day: 16 - }, + value: new Date('2019-01-16'), language: null, authority: null, display: { From bd477765c0fbf43936f0acbc69d7c52466463953 Mon Sep 17 00:00:00 2001 From: Enea Jahollari Date: Mon, 29 May 2023 10:44:03 +0200 Subject: [PATCH 285/409] Added labels and hide dates if disabled --- .../access-control-array-form.component.html | 10 ++++++++-- .../access-control-form-container-intial-state.ts | 4 ++-- .../access-control-form-container.component.ts | 8 +++++--- 3 files changed, 15 insertions(+), 7 deletions(-) diff --git a/src/app/shared/access-control-form-container/access-control-array-form/access-control-array-form.component.html b/src/app/shared/access-control-form-container/access-control-array-form/access-control-array-form.component.html index 2e6d9c2fc1..faa28a60e8 100644 --- a/src/app/shared/access-control-form-container/access-control-array-form/access-control-array-form.component.html +++ b/src/app/shared/access-control-form-container/access-control-array-form/access-control-array-form.component.html @@ -9,6 +9,7 @@ style="display: grid; grid-template-columns: 1fr 1fr 1fr 50px; grid-gap: 5px">
    +
    -
    +
    +
    -
    +
    +
    + -
    + {{'access-control-option-start-date-note' | translate}}
    -
    -
    - -
    +
    +
    + {{'access-control-option-end-date-note' | translate}}
    - +
    + + +
    diff --git a/src/assets/i18n/en.json5 b/src/assets/i18n/en.json5 index 0618596e60..2b8c64ed13 100644 --- a/src/assets/i18n/en.json5 +++ b/src/assets/i18n/en.json5 @@ -5358,23 +5358,53 @@ "admin.system-wide-alert.title": "System-wide Alerts", "item-access-control-title": "This form allows you to perform changes to the access condition of all the item's metadata and all its bitstreams.", + "collection-access-control-title": "This form allows you to perform changes to the access condition of all the items owned by collection under this community. Changes can be performed on the access condition for the metadata (item) or for the content (bitstream).", + "community-access-control-title": "This form allows you to perform changes to the access condition of all the items owned by collection under this community. Changes can be performed on the access condition for the metadata (item) or for the content (bitstream).", + "access-control-item-header-toggle": "Item's Metadata", + "access-control-bitstream-header-toggle": "Bitstreams", + "access-control-mode": "Mode", + "access-control-access-conditions": "Access conditions", + "access-control-no-access-conditions-warning-message": "You have not specified any access conditions, the new items access conditions will be inherited from the owning collection.", + "access-control-replace-all": "Replace access conditions", + "access-control-add-to-existing": "Add to existing ones", + "access-control-limit-to-specific": "Limit the changes to specific bitstreams", + "access-control-process-all-bitstreams": "process all the bitstreams in the item", + "access-control-bitstreams-selected": "bitstreams selected", + "access-control-reset": "Reset", + "access-control-execute": "Execute", + "access-control-add-more": "Add more", + "access-control-select-bitstreams-modal.title": "Select bitstreams", + "access-control-select-bitstreams-modal.no-items": "No items to show.", + "access-control-select-bitstreams-modal.close": "Close", + "access-control-option-label": "Access condition type", + + "access-control-option-note": "Select an access condition to apply on the bitstream once the item is deposited", + + "access-control-option-start-date": "Grant access from", + + "access-control-option-start-date-note": "Select the date from which the relate access condition is applied", + + "access-control-option-end-date": "Grant access until", + + "access-control-option-end-date-note": "Select the date until which the relate access condition is applied", + } From fb66b5abd6b55b536e5a7b953fa6754d82c6dbbd Mon Sep 17 00:00:00 2001 From: Alexandre Vryghem Date: Fri, 26 May 2023 18:15:58 +0200 Subject: [PATCH 289/409] 102039: Use patch to delete multiple bitstreams at once --- .../core/data/bitstream-data.service.spec.ts | 77 +++++++++++++++++-- src/app/core/data/bitstream-data.service.ts | 36 ++++++++- .../item-bitstreams.component.spec.ts | 17 ++-- .../item-bitstreams.component.ts | 16 ++-- .../testing/bitstream-data-service.stub.ts | 13 ++++ 5 files changed, 130 insertions(+), 29 deletions(-) create mode 100644 src/app/shared/testing/bitstream-data-service.stub.ts diff --git a/src/app/core/data/bitstream-data.service.spec.ts b/src/app/core/data/bitstream-data.service.spec.ts index c67eaa2d68..89178f8dd2 100644 --- a/src/app/core/data/bitstream-data.service.spec.ts +++ b/src/app/core/data/bitstream-data.service.spec.ts @@ -1,13 +1,14 @@ +import { TestBed } from '@angular/core/testing'; import { BitstreamDataService } from './bitstream-data.service'; import { ObjectCacheService } from '../cache/object-cache.service'; import { RequestService } from './request.service'; import { Bitstream } from '../shared/bitstream.model'; import { HALEndpointService } from '../shared/hal-endpoint.service'; import { BitstreamFormatDataService } from './bitstream-format-data.service'; -import { of as observableOf } from 'rxjs'; +import { Observable, of as observableOf } from 'rxjs'; import { BitstreamFormat } from '../shared/bitstream-format.model'; import { BitstreamFormatSupportLevel } from '../shared/bitstream-format-support-level'; -import { PutRequest } from './request.models'; +import { PatchRequest, PutRequest } from './request.models'; import { getMockRequestService } from '../../shared/mocks/request.service.mock'; import { HALEndpointServiceStub } from '../../shared/testing/hal-endpoint-service.stub'; import { RemoteDataBuildService } from '../cache/builders/remote-data-build.service'; @@ -15,6 +16,11 @@ import { getMockRemoteDataBuildService } from '../../shared/mocks/remote-data-bu import { testSearchDataImplementation } from './base/search-data.spec'; import { testPatchDataImplementation } from './base/patch-data.spec'; import { testDeleteDataImplementation } from './base/delete-data.spec'; +import { DSOChangeAnalyzer } from './dso-change-analyzer.service'; +import { NotificationsService } from '../../shared/notifications/notifications.service'; +import objectContaining = jasmine.objectContaining; +import { RemoteData } from './remote-data'; +import { FollowLinkConfig } from '../../shared/utils/follow-link-config.model'; describe('BitstreamDataService', () => { let service: BitstreamDataService; @@ -25,10 +31,18 @@ describe('BitstreamDataService', () => { let rdbService: RemoteDataBuildService; const bitstreamFormatHref = 'rest-api/bitstreamformats'; - const bitstream = Object.assign(new Bitstream(), { - uuid: 'fake-bitstream', + const bitstream1 = Object.assign(new Bitstream(), { + id: 'fake-bitstream1', + uuid: 'fake-bitstream1', _links: { - self: { href: 'fake-bitstream-self' } + self: { href: 'fake-bitstream1-self' } + } + }); + const bitstream2 = Object.assign(new Bitstream(), { + id: 'fake-bitstream2', + uuid: 'fake-bitstream2', + _links: { + self: { href: 'fake-bitstream2-self' } } }); const format = Object.assign(new BitstreamFormat(), { @@ -50,7 +64,18 @@ describe('BitstreamDataService', () => { }); rdbService = getMockRemoteDataBuildService(); - service = new BitstreamDataService(requestService, rdbService, objectCache, halService, null, bitstreamFormatService, null, null); + TestBed.configureTestingModule({ + providers: [ + { provide: ObjectCacheService, useValue: objectCache }, + { provide: RequestService, useValue: requestService }, + { provide: HALEndpointService, useValue: halService }, + { provide: BitstreamFormatDataService, useValue: bitstreamFormatService }, + { provide: RemoteDataBuildService, useValue: rdbService }, + { provide: DSOChangeAnalyzer, useValue: {} }, + { provide: NotificationsService, useValue: {} }, + ], + }); + service = TestBed.inject(BitstreamDataService); }); describe('composition', () => { @@ -62,11 +87,49 @@ describe('BitstreamDataService', () => { describe('when updating the bitstream\'s format', () => { beforeEach(() => { - service.updateFormat(bitstream, format); + service.updateFormat(bitstream1, format); }); it('should send a put request', () => { expect(requestService.send).toHaveBeenCalledWith(jasmine.any(PutRequest)); }); }); + + describe('removeMultiple', () => { + function mockBuildFromRequestUUIDAndAwait(requestUUID$: string | Observable, callback: (rd?: RemoteData) => Observable, ..._linksToFollow: FollowLinkConfig[]): Observable> { + callback(); + return; + } + + beforeEach(() => { + spyOn(service, 'invalidateByHref'); + spyOn(rdbService, 'buildFromRequestUUIDAndAwait').and.callFake((requestUUID$: string | Observable, callback: (rd?: RemoteData) => Observable, ...linksToFollow: FollowLinkConfig[]) => mockBuildFromRequestUUIDAndAwait(requestUUID$, callback, ...linksToFollow)); + }); + + it('should be able to 1 bitstream', () => { + service.removeMultiple([bitstream1]); + + expect(requestService.send).toHaveBeenCalledWith(objectContaining({ + href: `${url}/bitstreams`, + body: [ + { op: 'remove', path: '/bitstreams/fake-bitstream1' }, + ], + } as PatchRequest)); + expect(service.invalidateByHref).toHaveBeenCalledWith('fake-bitstream1-self'); + }); + + it('should be able to delete multiple bitstreams', () => { + service.removeMultiple([bitstream1, bitstream2]); + + expect(requestService.send).toHaveBeenCalledWith(objectContaining({ + href: `${url}/bitstreams`, + body: [ + { op: 'remove', path: '/bitstreams/fake-bitstream1' }, + { op: 'remove', path: '/bitstreams/fake-bitstream2' }, + ], + } as PatchRequest)); + expect(service.invalidateByHref).toHaveBeenCalledWith('fake-bitstream1-self'); + expect(service.invalidateByHref).toHaveBeenCalledWith('fake-bitstream2-self'); + }); + }); }); diff --git a/src/app/core/data/bitstream-data.service.ts b/src/app/core/data/bitstream-data.service.ts index 6bdcefe187..bb4ec28166 100644 --- a/src/app/core/data/bitstream-data.service.ts +++ b/src/app/core/data/bitstream-data.service.ts @@ -1,7 +1,7 @@ import { HttpHeaders } from '@angular/common/http'; import { Injectable } from '@angular/core'; import { combineLatest as observableCombineLatest, Observable } from 'rxjs'; -import { map, switchMap, take } from 'rxjs/operators'; +import { find, map, switchMap, take } from 'rxjs/operators'; import { hasValue } from '../../shared/empty.util'; import { FollowLinkConfig } from '../../shared/utils/follow-link-config.model'; import { RemoteDataBuildService } from '../cache/builders/remote-data-build.service'; @@ -14,7 +14,7 @@ import { Item } from '../shared/item.model'; import { BundleDataService } from './bundle-data.service'; import { buildPaginatedList, PaginatedList } from './paginated-list.model'; import { RemoteData } from './remote-data'; -import { PutRequest } from './request.models'; +import { PatchRequest, PutRequest } from './request.models'; import { RequestService } from './request.service'; import { BitstreamFormatDataService } from './bitstream-format-data.service'; import { BitstreamFormat } from '../shared/bitstream-format.model'; @@ -33,7 +33,7 @@ import { NotificationsService } from '../../shared/notifications/notifications.s import { NoContent } from '../shared/NoContent.model'; import { IdentifiableDataService } from './base/identifiable-data.service'; import { dataService } from './base/data-service.decorator'; -import { Operation } from 'fast-json-patch'; +import { Operation, RemoveOperation } from 'fast-json-patch'; /** * A service to retrieve {@link Bitstream}s from the REST API @@ -277,4 +277,34 @@ export class BitstreamDataService extends IdentifiableDataService imp deleteByHref(href: string, copyVirtualMetadata?: string[]): Observable> { return this.deleteData.deleteByHref(href, copyVirtualMetadata); } + + /** + * Delete multiple {@link Bitstream}s at once by sending a PATCH request to the backend + * + * @param bitstreams The bitstreams that should be removed + */ + removeMultiple(bitstreams: Bitstream[]): Observable> { + const operations: RemoveOperation[] = bitstreams.map((bitstream: Bitstream) => { + return { + op: 'remove', + path: `/bitstreams/${bitstream.id}`, + }; + }); + const requestId: string = this.requestService.generateRequestId(); + + const hrefObs: Observable = this.halService.getEndpoint(this.linkPath); + + hrefObs.pipe( + find((href: string) => hasValue(href)), + ).subscribe((href: string) => { + const request = new PatchRequest(requestId, href, operations); + if (hasValue(this.responseMsToLive)) { + request.responseMsToLive = this.responseMsToLive; + } + this.requestService.send(request); + }); + + return this.rdbService.buildFromRequestUUIDAndAwait(requestId, () => observableCombineLatest(bitstreams.map((bitstream: Bitstream) => this.invalidateByHref(bitstream._links.self.href)))); + } + } diff --git a/src/app/item-page/edit-item-page/item-bitstreams/item-bitstreams.component.spec.ts b/src/app/item-page/edit-item-page/item-bitstreams/item-bitstreams.component.spec.ts index 67d047d776..10e1812131 100644 --- a/src/app/item-page/edit-item-page/item-bitstreams/item-bitstreams.component.spec.ts +++ b/src/app/item-page/edit-item-page/item-bitstreams/item-bitstreams.component.spec.ts @@ -25,6 +25,7 @@ import { getMockRequestService } from '../../../shared/mocks/request.service.moc import { createSuccessfulRemoteDataObject, createSuccessfulRemoteDataObject$ } from '../../../shared/remote-data.utils'; import { createPaginatedList } from '../../../shared/testing/utils.test'; import { FieldChangeType } from '../../../core/data/object-updates/field-change-type.model'; +import { BitstreamDataServiceStub } from '../../../shared/testing/bitstream-data-service.stub'; let comp: ItemBitstreamsComponent; let fixture: ComponentFixture; @@ -71,7 +72,7 @@ let objectUpdatesService: ObjectUpdatesService; let router: any; let route: ActivatedRoute; let notificationsService: NotificationsService; -let bitstreamService: BitstreamDataService; +let bitstreamService: BitstreamDataServiceStub; let objectCache: ObjectCacheService; let requestService: RequestService; let searchConfig: SearchConfigurationService; @@ -112,9 +113,7 @@ describe('ItemBitstreamsComponent', () => { success: successNotification } ); - bitstreamService = jasmine.createSpyObj('bitstreamService', { - delete: jasmine.createSpy('delete') - }); + bitstreamService = new BitstreamDataServiceStub(); objectCache = jasmine.createSpyObj('objectCache', { remove: jasmine.createSpy('remove') }); @@ -179,15 +178,16 @@ describe('ItemBitstreamsComponent', () => { describe('when submit is called', () => { beforeEach(() => { + spyOn(bitstreamService, 'removeMultiple').and.callThrough(); comp.submit(); }); - it('should call delete on the bitstreamService for the marked field', () => { - expect(bitstreamService.delete).toHaveBeenCalledWith(bitstream2.id); + it('should call removeMultiple on the bitstreamService for the marked field', () => { + expect(bitstreamService.removeMultiple).toHaveBeenCalledWith([bitstream2]); }); - it('should not call delete on the bitstreamService for the unmarked field', () => { - expect(bitstreamService.delete).not.toHaveBeenCalledWith(bitstream1.id); + it('should not call removeMultiple on the bitstreamService for the unmarked field', () => { + expect(bitstreamService.removeMultiple).not.toHaveBeenCalledWith([bitstream1]); }); }); @@ -210,7 +210,6 @@ describe('ItemBitstreamsComponent', () => { comp.dropBitstream(bundle, { fromIndex: 0, toIndex: 50, - // eslint-disable-next-line no-empty, @typescript-eslint/no-empty-function finish: () => { done(); } diff --git a/src/app/item-page/edit-item-page/item-bitstreams/item-bitstreams.component.ts b/src/app/item-page/edit-item-page/item-bitstreams/item-bitstreams.component.ts index 0c7dfb1e34..ee53bd919c 100644 --- a/src/app/item-page/edit-item-page/item-bitstreams/item-bitstreams.component.ts +++ b/src/app/item-page/edit-item-page/item-bitstreams/item-bitstreams.component.ts @@ -1,7 +1,7 @@ import { ChangeDetectorRef, Component, NgZone, OnDestroy } from '@angular/core'; import { AbstractItemUpdateComponent } from '../abstract-item-update/abstract-item-update.component'; import { filter, map, switchMap, take } from 'rxjs/operators'; -import { Observable, of as observableOf, Subscription, zip as observableZip } from 'rxjs'; +import { Observable, Subscription, zip as observableZip } from 'rxjs'; import { ItemDataService } from '../../../core/data/item-data.service'; import { ObjectUpdatesService } from '../../../core/data/object-updates/object-updates.service'; import { ActivatedRoute, Router } from '@angular/router'; @@ -133,20 +133,16 @@ export class ItemBitstreamsComponent extends AbstractItemUpdateComponent impleme ); // Send out delete requests for all deleted bitstreams - const removedResponses$ = removedBitstreams$.pipe( + const removedResponses$: Observable> = removedBitstreams$.pipe( take(1), - switchMap((removedBistreams: Bitstream[]) => { - if (isNotEmpty(removedBistreams)) { - return observableZip(...removedBistreams.map((bitstream: Bitstream) => this.bitstreamService.delete(bitstream.id))); - } else { - return observableOf(undefined); - } + switchMap((removedBitstreams: Bitstream[]) => { + return this.bitstreamService.removeMultiple(removedBitstreams); }) ); // Perform the setup actions from above in order and display notifications - removedResponses$.pipe(take(1)).subscribe((responses: RemoteData[]) => { - this.displayNotifications('item.edit.bitstreams.notifications.remove', responses); + removedResponses$.subscribe((responses: RemoteData) => { + this.displayNotifications('item.edit.bitstreams.notifications.remove', [responses]); this.submitting = false; }); } diff --git a/src/app/shared/testing/bitstream-data-service.stub.ts b/src/app/shared/testing/bitstream-data-service.stub.ts new file mode 100644 index 0000000000..5b05109b98 --- /dev/null +++ b/src/app/shared/testing/bitstream-data-service.stub.ts @@ -0,0 +1,13 @@ +import { Bitstream } from '../../core/shared/bitstream.model'; +import { Observable, of as observableOf } from 'rxjs'; +import { RemoteData } from '../../core/data/remote-data'; +import { NoContent } from '../../core/shared/NoContent.model'; +import { RequestEntryState } from '../../core/data/request-entry-state.model'; + +export class BitstreamDataServiceStub { + + removeMultiple(_bitstreams: Bitstream[]): Observable> { + return observableOf(new RemoteData(0, 0, 0, RequestEntryState.Success)); + } + +} From d9ed91df05be56b32c693a793e675e0a19afd32d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Paulo=20Gra=C3=A7a?= Date: Tue, 30 May 2023 11:46:59 +0100 Subject: [PATCH 290/409] new project metadata representation component --- ...-item-metadata-list-element.component.html | 12 +++++ ...em-metadata-list-element.component.spec.ts | 46 +++++++++++++++++++ ...ct-item-metadata-list-element.component.ts | 15 ++++++ 3 files changed, 73 insertions(+) create mode 100644 src/app/entity-groups/research-entities/metadata-representations/project/project-item-metadata-list-element.component.html create mode 100644 src/app/entity-groups/research-entities/metadata-representations/project/project-item-metadata-list-element.component.spec.ts create mode 100644 src/app/entity-groups/research-entities/metadata-representations/project/project-item-metadata-list-element.component.ts diff --git a/src/app/entity-groups/research-entities/metadata-representations/project/project-item-metadata-list-element.component.html b/src/app/entity-groups/research-entities/metadata-representations/project/project-item-metadata-list-element.component.html new file mode 100644 index 0000000000..f8eca9da6a --- /dev/null +++ b/src/app/entity-groups/research-entities/metadata-representations/project/project-item-metadata-list-element.component.html @@ -0,0 +1,12 @@ + + + + + + + + + + diff --git a/src/app/entity-groups/research-entities/metadata-representations/project/project-item-metadata-list-element.component.spec.ts b/src/app/entity-groups/research-entities/metadata-representations/project/project-item-metadata-list-element.component.spec.ts new file mode 100644 index 0000000000..a20120b691 --- /dev/null +++ b/src/app/entity-groups/research-entities/metadata-representations/project/project-item-metadata-list-element.component.spec.ts @@ -0,0 +1,46 @@ +import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; +import { ChangeDetectionStrategy, NO_ERRORS_SCHEMA } from '@angular/core'; +import { By } from '@angular/platform-browser'; + +import { NgbModule } from '@ng-bootstrap/ng-bootstrap'; + +import { ItemMetadataRepresentation } from '../../../../core/shared/metadata-representation/item/item-metadata-representation.model'; +import { Item } from '../../../../core/shared/item.model'; +import { ProjectItemMetadataListElementComponent } from './project-item-metadata-list-element.component'; +import { MetadataValue } from '../../../../core/shared/metadata.models'; + +const projectTitle = 'Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua.'; +const mockItem = Object.assign(new Item(), { metadata: { 'dc.title': [{ value: projectTitle }] } }); +const virtMD = Object.assign(new MetadataValue(), { value: projectTitle }); + +const mockItemMetadataRepresentation = Object.assign(new ItemMetadataRepresentation(virtMD), mockItem); + +describe('ProjectItemMetadataListElementComponent', () => { + let comp: ProjectItemMetadataListElementComponent; + let fixture: ComponentFixture; + + beforeEach(waitForAsync(() => { + TestBed.configureTestingModule({ + imports:[ + NgbModule + ], + declarations: [ProjectItemMetadataListElementComponent], + schemas: [NO_ERRORS_SCHEMA] + }).overrideComponent(ProjectItemMetadataListElementComponent, { + set: { changeDetection: ChangeDetectionStrategy.Default } + }).compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(ProjectItemMetadataListElementComponent); + comp = fixture.componentInstance; + comp.metadataRepresentation = mockItemMetadataRepresentation; + fixture.detectChanges(); + }); + + it('should show the project\'s name as a link', () => { + const linkText = fixture.debugElement.query(By.css('a')).nativeElement.textContent; + expect(linkText).toBe(projectTitle); + }); + +}); diff --git a/src/app/entity-groups/research-entities/metadata-representations/project/project-item-metadata-list-element.component.ts b/src/app/entity-groups/research-entities/metadata-representations/project/project-item-metadata-list-element.component.ts new file mode 100644 index 0000000000..7f291b0996 --- /dev/null +++ b/src/app/entity-groups/research-entities/metadata-representations/project/project-item-metadata-list-element.component.ts @@ -0,0 +1,15 @@ +import { Component } from '@angular/core'; +import { metadataRepresentationComponent } from '../../../../shared/metadata-representation/metadata-representation.decorator'; +import { MetadataRepresentationType } from '../../../../core/shared/metadata-representation/metadata-representation.model'; +import { ItemMetadataRepresentationListElementComponent } from '../../../../shared/object-list/metadata-representation-list-element/item/item-metadata-representation-list-element.component'; + +@metadataRepresentationComponent('Project', MetadataRepresentationType.Item) +@Component({ + selector: 'ds-project-item-metadata-list-element', + templateUrl: './project-item-metadata-list-element.component.html' +}) +/** + * The component for displaying an item of the type Project as a metadata field + */ +export class ProjectItemMetadataListElementComponent extends ItemMetadataRepresentationListElementComponent { +} From 138fccf711ae20330f68c46e969a0709f9f07228 Mon Sep 17 00:00:00 2001 From: Nona Luypaert Date: Tue, 30 May 2023 14:05:44 +0200 Subject: [PATCH 291/409] 101623: Fix lint/tests after removing invalid links, Make arrows on Treeview smaller --- src/app/core/browse/browse.service.spec.ts | 6 +++--- src/app/core/shared/flat-browse-definition.model.ts | 8 ++++---- src/app/core/shared/non-hierarchical-browse-definition.ts | 3 +-- src/app/core/shared/value-list-browse-definition.model.ts | 8 ++++---- .../vocabulary-treeview.component.html | 4 ++-- 5 files changed, 14 insertions(+), 15 deletions(-) diff --git a/src/app/core/browse/browse.service.spec.ts b/src/app/core/browse/browse.service.spec.ts index 0e39e53e43..9f166e3d19 100644 --- a/src/app/core/browse/browse.service.spec.ts +++ b/src/app/core/browse/browse.service.spec.ts @@ -27,7 +27,7 @@ describe('BrowseService', () => { const browseDefinitions = [ Object.assign(new FlatBrowseDefinition(), { id: 'date', - metadataBrowse: false, + browseType: 'flatBrowse', sortOptions: [ { name: 'title', @@ -54,7 +54,7 @@ describe('BrowseService', () => { }), Object.assign(new ValueListBrowseDefinition(), { id: 'author', - metadataBrowse: true, + browseType: 'valueList', sortOptions: [ { name: 'title', @@ -158,7 +158,7 @@ describe('BrowseService', () => { describe('when getBrowseEntriesFor is called with a valid browse definition id', () => { it('should call hrefOnlyDataService.findListByHref with the expected href', () => { - const expected = browseDefinitions[1]._links.entries.href; + const expected = (browseDefinitions[1] as ValueListBrowseDefinition)._links.entries.href; scheduler.schedule(() => service.getBrowseEntriesFor(new BrowseEntrySearchOptions(browseDefinitions[1].id)).subscribe()); scheduler.flush(); diff --git a/src/app/core/shared/flat-browse-definition.model.ts b/src/app/core/shared/flat-browse-definition.model.ts index f275db199c..086fca891b 100644 --- a/src/app/core/shared/flat-browse-definition.model.ts +++ b/src/app/core/shared/flat-browse-definition.model.ts @@ -24,13 +24,13 @@ export class FlatBrowseDefinition extends NonHierarchicalBrowseDefinition { return this._links.self.href; } - getRenderType(): string { - return this.dataType; - } - @deserialize _links: { self: HALLink; items: HALLink; }; + + getRenderType(): string { + return this.dataType; + } } diff --git a/src/app/core/shared/non-hierarchical-browse-definition.ts b/src/app/core/shared/non-hierarchical-browse-definition.ts index 12f2a06333..d5481fcc8d 100644 --- a/src/app/core/shared/non-hierarchical-browse-definition.ts +++ b/src/app/core/shared/non-hierarchical-browse-definition.ts @@ -1,7 +1,6 @@ -import { autoserialize, autoserializeAs, deserialize, inheritSerialization } from 'cerialize'; +import { autoserialize, autoserializeAs, inheritSerialization } from 'cerialize'; import { SortOption } from './sort-option.model'; import { BrowseByDataType } from '../../browse-by/browse-by-switcher/browse-by-decorator'; -import { HALLink } from './hal-link.model'; import { BrowseDefinition } from './browse-definition.model'; /** diff --git a/src/app/core/shared/value-list-browse-definition.model.ts b/src/app/core/shared/value-list-browse-definition.model.ts index 9bcd8f2e43..3378263962 100644 --- a/src/app/core/shared/value-list-browse-definition.model.ts +++ b/src/app/core/shared/value-list-browse-definition.model.ts @@ -24,13 +24,13 @@ export class ValueListBrowseDefinition extends NonHierarchicalBrowseDefinition { return this._links.self.href; } - getRenderType(): string { - return this.dataType; - } - @deserialize _links: { self: HALLink; entries: HALLink; }; + + getRenderType(): string { + return this.dataType; + } } diff --git a/src/app/shared/form/vocabulary-treeview/vocabulary-treeview.component.html b/src/app/shared/form/vocabulary-treeview/vocabulary-treeview.component.html index 9f14795342..9cbc0146a1 100644 --- a/src/app/shared/form/vocabulary-treeview/vocabulary-treeview.component.html +++ b/src/app/shared/form/vocabulary-treeview/vocabulary-treeview.component.html @@ -23,7 +23,7 @@
    diff --git a/src/app/entity-groups/journal-entities/item-grid-elements/search-result-grid-elements/journal-volume/journal-volume-search-result-grid-element.component.html b/src/app/entity-groups/journal-entities/item-grid-elements/search-result-grid-elements/journal-volume/journal-volume-search-result-grid-element.component.html index b7e1330c86..7993fca011 100644 --- a/src/app/entity-groups/journal-entities/item-grid-elements/search-result-grid-elements/journal-volume/journal-volume-search-result-grid-element.component.html +++ b/src/app/entity-groups/journal-entities/item-grid-elements/search-result-grid-elements/journal-volume/journal-volume-search-result-grid-element.component.html @@ -5,7 +5,7 @@
    diff --git a/src/app/entity-groups/journal-entities/item-grid-elements/search-result-grid-elements/journal/journal-search-result-grid-element.component.html b/src/app/entity-groups/journal-entities/item-grid-elements/search-result-grid-elements/journal/journal-search-result-grid-element.component.html index e4c9ada3ca..51bd8e53d1 100644 --- a/src/app/entity-groups/journal-entities/item-grid-elements/search-result-grid-elements/journal/journal-search-result-grid-element.component.html +++ b/src/app/entity-groups/journal-entities/item-grid-elements/search-result-grid-elements/journal/journal-search-result-grid-element.component.html @@ -5,7 +5,7 @@
    diff --git a/src/app/entity-groups/journal-entities/item-list-elements/search-result-list-elements/journal-issue/journal-issue-search-result-list-element.component.html b/src/app/entity-groups/journal-entities/item-list-elements/search-result-list-elements/journal-issue/journal-issue-search-result-list-element.component.html index 9d02a5d837..ee0c98347d 100644 --- a/src/app/entity-groups/journal-entities/item-list-elements/search-result-list-elements/journal-issue/journal-issue-search-result-list-element.component.html +++ b/src/app/entity-groups/journal-entities/item-list-elements/search-result-list-elements/journal-issue/journal-issue-search-result-list-element.component.html @@ -1,7 +1,7 @@
    @@ -15,7 +15,7 @@
    @@ -15,7 +15,7 @@
    - @@ -13,7 +13,7 @@
    - diff --git a/src/app/entity-groups/research-entities/item-grid-elements/search-result-grid-elements/person/person-search-result-grid-element.component.html b/src/app/entity-groups/research-entities/item-grid-elements/search-result-grid-elements/person/person-search-result-grid-element.component.html index fe26fd7063..53fc335213 100644 --- a/src/app/entity-groups/research-entities/item-grid-elements/search-result-grid-elements/person/person-search-result-grid-element.component.html +++ b/src/app/entity-groups/research-entities/item-grid-elements/search-result-grid-elements/person/person-search-result-grid-element.component.html @@ -5,7 +5,7 @@
    diff --git a/src/app/entity-groups/research-entities/item-grid-elements/search-result-grid-elements/project/project-search-result-grid-element.component.html b/src/app/entity-groups/research-entities/item-grid-elements/search-result-grid-elements/project/project-search-result-grid-element.component.html index cf47f947cc..a77bf549f9 100644 --- a/src/app/entity-groups/research-entities/item-grid-elements/search-result-grid-elements/project/project-search-result-grid-element.component.html +++ b/src/app/entity-groups/research-entities/item-grid-elements/search-result-grid-elements/project/project-search-result-grid-element.component.html @@ -5,7 +5,7 @@
    diff --git a/src/app/entity-groups/research-entities/item-list-elements/search-result-list-elements/org-unit/org-unit-search-result-list-element.component.html b/src/app/entity-groups/research-entities/item-list-elements/search-result-list-elements/org-unit/org-unit-search-result-list-element.component.html index 9495577c01..f2416b5c90 100644 --- a/src/app/entity-groups/research-entities/item-list-elements/search-result-list-elements/org-unit/org-unit-search-result-list-element.component.html +++ b/src/app/entity-groups/research-entities/item-list-elements/search-result-list-elements/org-unit/org-unit-search-result-list-element.component.html @@ -1,7 +1,7 @@
    diff --git a/src/app/shared/object-grid/community-grid-element/community-grid-element.component.html b/src/app/shared/object-grid/community-grid-element/community-grid-element.component.html index c448c70991..f9afd76e4d 100644 --- a/src/app/shared/object-grid/community-grid-element/community-grid-element.component.html +++ b/src/app/shared/object-grid/community-grid-element/community-grid-element.component.html @@ -1,5 +1,5 @@
    - + @@ -11,7 +11,7 @@

    {{ dsoNameService.getName(object) }}

    {{object.shortDescription}}

    diff --git a/src/app/shared/object-grid/search-result-grid-element/collection-search-result/collection-search-result-grid-element.component.html b/src/app/shared/object-grid/search-result-grid-element/collection-search-result/collection-search-result-grid-element.component.html index 1e46f11144..3541a52060 100644 --- a/src/app/shared/object-grid/search-result-grid-element/collection-search-result/collection-search-result-grid-element.component.html +++ b/src/app/shared/object-grid/search-result-grid-element/collection-search-result/collection-search-result-grid-element.component.html @@ -1,5 +1,5 @@
    - + @@ -12,7 +12,7 @@

    {{ dsoNameService.getName(dso) }}

    {{dso.shortDescription}}

    diff --git a/src/app/shared/object-grid/search-result-grid-element/community-search-result/community-search-result-grid-element.component.html b/src/app/shared/object-grid/search-result-grid-element/community-search-result/community-search-result-grid-element.component.html index 96e10156c3..d042c8f150 100644 --- a/src/app/shared/object-grid/search-result-grid-element/community-search-result/community-search-result-grid-element.component.html +++ b/src/app/shared/object-grid/search-result-grid-element/community-search-result/community-search-result-grid-element.component.html @@ -1,5 +1,5 @@
    - + @@ -12,7 +12,7 @@

    {{ dsoNameService.getName(dso) }}

    {{dso.shortDescription}}

    diff --git a/src/app/shared/object-grid/search-result-grid-element/item-search-result/item/item-search-result-grid-element.component.html b/src/app/shared/object-grid/search-result-grid-element/item-search-result/item/item-search-result-grid-element.component.html index 3d6e251238..f93032c739 100644 --- a/src/app/shared/object-grid/search-result-grid-element/item-search-result/item/item-search-result-grid-element.component.html +++ b/src/app/shared/object-grid/search-result-grid-element/item-search-result/item/item-search-result-grid-element.component.html @@ -2,7 +2,7 @@
    - diff --git a/src/app/shared/object-list/browse-entry-list-element/browse-entry-list-element.component.html b/src/app/shared/object-list/browse-entry-list-element/browse-entry-list-element.component.html index dcbdd77bff..93d967ceb8 100644 --- a/src/app/shared/object-list/browse-entry-list-element/browse-entry-list-element.component.html +++ b/src/app/shared/object-list/browse-entry-list-element/browse-entry-list-element.component.html @@ -1,5 +1,5 @@
    - + {{object.value}} diff --git a/src/app/shared/object-list/collection-list-element/collection-list-element.component.html b/src/app/shared/object-list/collection-list-element/collection-list-element.component.html index 6c2cff5215..41caa74fe8 100644 --- a/src/app/shared/object-list/collection-list-element/collection-list-element.component.html +++ b/src/app/shared/object-list/collection-list-element/collection-list-element.component.html @@ -1,4 +1,4 @@ - + {{ dsoNameService.getName(object) }} diff --git a/src/app/shared/object-list/community-list-element/community-list-element.component.html b/src/app/shared/object-list/community-list-element/community-list-element.component.html index 462db7be91..4c4dec8213 100644 --- a/src/app/shared/object-list/community-list-element/community-list-element.component.html +++ b/src/app/shared/object-list/community-list-element/community-list-element.component.html @@ -1,4 +1,4 @@ - + {{ dsoNameService.getName(object) }} diff --git a/src/app/shared/object-list/search-result-list-element/collection-search-result/collection-search-result-list-element.component.html b/src/app/shared/object-list/search-result-list-element/collection-search-result/collection-search-result-list-element.component.html index 6856c63cce..5e54823266 100644 --- a/src/app/shared/object-list/search-result-list-element/collection-search-result/collection-search-result-list-element.component.html +++ b/src/app/shared/object-list/search-result-list-element/collection-search-result/collection-search-result-list-element.component.html @@ -2,7 +2,7 @@
    - +
    diff --git a/src/app/shared/object-list/search-result-list-element/community-search-result/community-search-result-list-element.component.html b/src/app/shared/object-list/search-result-list-element/community-search-result/community-search-result-list-element.component.html index 037b62e736..40592b0481 100644 --- a/src/app/shared/object-list/search-result-list-element/community-search-result/community-search-result-list-element.component.html +++ b/src/app/shared/object-list/search-result-list-element/community-search-result/community-search-result-list-element.component.html @@ -2,7 +2,7 @@
    - +
    diff --git a/src/app/shared/object-list/search-result-list-element/item-search-result/item-types/item/item-search-result-list-element.component.html b/src/app/shared/object-list/search-result-list-element/item-search-result/item-types/item/item-search-result-list-element.component.html index 88d6ab6e07..23c1e19f6c 100644 --- a/src/app/shared/object-list/search-result-list-element/item-search-result/item-types/item/item-search-result-list-element.component.html +++ b/src/app/shared/object-list/search-result-list-element/item-search-result/item-types/item/item-search-result-list-element.component.html @@ -1,6 +1,6 @@
    - {{ 'submission.sections.ccLicense.link' | translate }}
    - + {{ licenseLink }}
    From 3df0286ec8e6f4ff31927b56dbb90287f786ee9e Mon Sep 17 00:00:00 2001 From: Art Lowel Date: Thu, 4 May 2023 17:41:47 +0200 Subject: [PATCH 297/409] fix an issue where the current page would be used instead of a third party referrer --- .../services/browser.referrer.service.spec.ts | 35 +++++++++++++------ .../core/services/browser.referrer.service.ts | 18 ++++++---- 2 files changed, 37 insertions(+), 16 deletions(-) diff --git a/src/app/core/services/browser.referrer.service.spec.ts b/src/app/core/services/browser.referrer.service.spec.ts index bff01bf913..9dc8f466b6 100644 --- a/src/app/core/services/browser.referrer.service.spec.ts +++ b/src/app/core/services/browser.referrer.service.spec.ts @@ -10,7 +10,7 @@ describe(`BrowserReferrerService`, () => { beforeEach(() => { routeService = { - getPreviousUrl: () => observableOf('') + getHistory: () => observableOf([]) } as any; service = new BrowserReferrerService( { referrer: documentReferrer }, @@ -20,12 +20,9 @@ describe(`BrowserReferrerService`, () => { }); describe(`getReferrer`, () => { - let prevUrl: string; - - describe(`when getPreviousUrl is an empty string`, () => { + describe(`when the history is an empty`, () => { beforeEach(() => { - prevUrl = ''; - spyOn(routeService, 'getPreviousUrl').and.returnValue(observableOf(prevUrl)); + spyOn(routeService, 'getHistory').and.returnValue(observableOf([])); }); it(`should return document.referrer`, (done: DoneFn) => { @@ -36,13 +33,31 @@ describe(`BrowserReferrerService`, () => { }); }); - describe(`when getPreviousUrl is not empty`, () => { + describe(`when the history only contains the current route`, () => { beforeEach(() => { - prevUrl = '/some/local/route'; - spyOn(routeService, 'getPreviousUrl').and.returnValue(observableOf(prevUrl)); + spyOn(routeService, 'getHistory').and.returnValue(observableOf(['/current/route'])); }); - it(`should return the value emitted by getPreviousUrl combined with the origin from HardRedirectService`, (done: DoneFn) => { + it(`should return document.referrer`, (done: DoneFn) => { + service.getReferrer().subscribe((emittedReferrer: string) => { + expect(emittedReferrer).toBe(documentReferrer); + done(); + }); + }); + }); + + describe(`when the history contains multiple routes`, () => { + const prevUrl = '/the/route/we/need'; + beforeEach(() => { + spyOn(routeService, 'getHistory').and.returnValue(observableOf([ + '/first/route', + '/second/route', + prevUrl, + '/current/route' + ])); + }); + + it(`should return the last route before the current one combined with the origin from HardRedirectService`, (done: DoneFn) => { service.getReferrer().subscribe((emittedReferrer: string) => { expect(emittedReferrer).toBe(origin + prevUrl); done(); diff --git a/src/app/core/services/browser.referrer.service.ts b/src/app/core/services/browser.referrer.service.ts index 1bf1cf2d4a..5aae750599 100644 --- a/src/app/core/services/browser.referrer.service.ts +++ b/src/app/core/services/browser.referrer.service.ts @@ -1,7 +1,7 @@ import { ReferrerService } from './referrer.service'; import { Observable } from 'rxjs'; import { map } from 'rxjs/operators'; -import { isEmpty } from '../../shared/empty.util'; +import { isEmpty, hasNoValue } from '../../shared/empty.util'; import { URLCombiner } from '../url-combiner/url-combiner'; import { Inject, Injectable } from '@angular/core'; import { DOCUMENT } from '@angular/common'; @@ -33,13 +33,19 @@ export class BrowserReferrerService extends ReferrerService { * in the store yet, document.referrer will be used */ public getReferrer(): Observable { - return this.routeService.getPreviousUrl().pipe( - map((prevUrl: string) => { - // if we don't have anything in the history yet, return document.referrer - // (note that that may be empty too, e.g. if you've just opened a new browser tab) - if (isEmpty(prevUrl)) { + return this.routeService.getHistory().pipe( + map((history: string[]) => { + const currentURL = history[history.length - 1]; + // if the current URL isn't set yet, or the only URL in the history is the current one, + // return document.referrer (note that that may be empty too, e.g. if you've just opened a + // new browser tab) + if (hasNoValue(currentURL) || history.every((url: string) => url === currentURL)) { return this.document.referrer; } else { + // reverse the history + const reversedHistory = [...history].reverse(); + // and find the first URL that differs from the current one + const prevUrl = reversedHistory.find((url: string) => url !== currentURL); return new URLCombiner(this.hardRedirectService.getCurrentOrigin(), prevUrl).toString(); } }) From 5b37101bb9f99597c0b84a231ab0d91b2abd1656 Mon Sep 17 00:00:00 2001 From: Art Lowel Date: Tue, 30 May 2023 17:17:54 +0200 Subject: [PATCH 298/409] add the rel="noreferrer" attribute when target="_blank" --- .../journal-issue-search-result-grid-element.component.html | 4 ++-- .../journal-volume-search-result-grid-element.component.html | 4 ++-- .../journal/journal-search-result-grid-element.component.html | 4 ++-- .../journal-issue-search-result-list-element.component.html | 2 +- .../journal-volume-search-result-list-element.component.html | 2 +- .../journal/journal-search-result-list-element.component.html | 2 +- .../org-unit-search-result-grid-element.component.html | 4 ++-- .../person/person-search-result-grid-element.component.html | 4 ++-- .../project/project-search-result-grid-element.component.html | 4 ++-- .../org-unit-search-result-list-element.component.html | 2 +- .../person/person-search-result-list-element.component.html | 2 +- .../project/project-search-result-list-element.component.html | 2 +- .../collection-grid-element.component.html | 4 ++-- .../community-grid-element.component.html | 4 ++-- .../collection-search-result-grid-element.component.html | 4 ++-- .../community-search-result-grid-element.component.html | 4 ++-- .../item/item-search-result-grid-element.component.html | 4 ++-- .../browse-entry-list-element.component.html | 2 +- .../collection-list-element.component.html | 2 +- .../community-list-element.component.html | 2 +- .../collection-search-result-list-element.component.html | 2 +- .../community-search-result-list-element.component.html | 2 +- .../item/item-search-result-list-element.component.html | 2 +- 23 files changed, 34 insertions(+), 34 deletions(-) diff --git a/src/app/entity-groups/journal-entities/item-grid-elements/search-result-grid-elements/journal-issue/journal-issue-search-result-grid-element.component.html b/src/app/entity-groups/journal-entities/item-grid-elements/search-result-grid-elements/journal-issue/journal-issue-search-result-grid-element.component.html index a54c78fb78..82f9a695a2 100644 --- a/src/app/entity-groups/journal-entities/item-grid-elements/search-result-grid-elements/journal-issue/journal-issue-search-result-grid-element.component.html +++ b/src/app/entity-groups/journal-entities/item-grid-elements/search-result-grid-elements/journal-issue/journal-issue-search-result-grid-element.component.html @@ -5,7 +5,7 @@
    diff --git a/src/app/entity-groups/journal-entities/item-grid-elements/search-result-grid-elements/journal-volume/journal-volume-search-result-grid-element.component.html b/src/app/entity-groups/journal-entities/item-grid-elements/search-result-grid-elements/journal-volume/journal-volume-search-result-grid-element.component.html index 0ae775a9de..9a3cc4cfe8 100644 --- a/src/app/entity-groups/journal-entities/item-grid-elements/search-result-grid-elements/journal-volume/journal-volume-search-result-grid-element.component.html +++ b/src/app/entity-groups/journal-entities/item-grid-elements/search-result-grid-elements/journal-volume/journal-volume-search-result-grid-element.component.html @@ -5,7 +5,7 @@
    diff --git a/src/app/entity-groups/journal-entities/item-grid-elements/search-result-grid-elements/journal/journal-search-result-grid-element.component.html b/src/app/entity-groups/journal-entities/item-grid-elements/search-result-grid-elements/journal/journal-search-result-grid-element.component.html index e71049bdbc..35dbe0b501 100644 --- a/src/app/entity-groups/journal-entities/item-grid-elements/search-result-grid-elements/journal/journal-search-result-grid-element.component.html +++ b/src/app/entity-groups/journal-entities/item-grid-elements/search-result-grid-elements/journal/journal-search-result-grid-element.component.html @@ -5,7 +5,7 @@
    diff --git a/src/app/entity-groups/journal-entities/item-list-elements/search-result-list-elements/journal-issue/journal-issue-search-result-list-element.component.html b/src/app/entity-groups/journal-entities/item-list-elements/search-result-list-elements/journal-issue/journal-issue-search-result-list-element.component.html index a51f55f5a1..33f47edf5c 100644 --- a/src/app/entity-groups/journal-entities/item-list-elements/search-result-list-elements/journal-issue/journal-issue-search-result-list-element.component.html +++ b/src/app/entity-groups/journal-entities/item-list-elements/search-result-list-elements/journal-issue/journal-issue-search-result-list-element.component.html @@ -1,6 +1,6 @@ - - - diff --git a/src/app/entity-groups/research-entities/item-grid-elements/search-result-grid-elements/person/person-search-result-grid-element.component.html b/src/app/entity-groups/research-entities/item-grid-elements/search-result-grid-elements/person/person-search-result-grid-element.component.html index 7dafbf0dc2..809a00d07c 100644 --- a/src/app/entity-groups/research-entities/item-grid-elements/search-result-grid-elements/person/person-search-result-grid-element.component.html +++ b/src/app/entity-groups/research-entities/item-grid-elements/search-result-grid-elements/person/person-search-result-grid-element.component.html @@ -5,7 +5,7 @@
    diff --git a/src/app/entity-groups/research-entities/item-grid-elements/search-result-grid-elements/project/project-search-result-grid-element.component.html b/src/app/entity-groups/research-entities/item-grid-elements/search-result-grid-elements/project/project-search-result-grid-element.component.html index 54f7d73cdc..8323cb4f67 100644 --- a/src/app/entity-groups/research-entities/item-grid-elements/search-result-grid-elements/project/project-search-result-grid-element.component.html +++ b/src/app/entity-groups/research-entities/item-grid-elements/search-result-grid-elements/project/project-search-result-grid-element.component.html @@ -5,7 +5,7 @@
    diff --git a/src/app/entity-groups/research-entities/item-list-elements/search-result-list-elements/org-unit/org-unit-search-result-list-element.component.html b/src/app/entity-groups/research-entities/item-list-elements/search-result-list-elements/org-unit/org-unit-search-result-list-element.component.html index 52273d18aa..b4a7a259ab 100644 --- a/src/app/entity-groups/research-entities/item-list-elements/search-result-list-elements/org-unit/org-unit-search-result-list-element.component.html +++ b/src/app/entity-groups/research-entities/item-list-elements/search-result-list-elements/org-unit/org-unit-search-result-list-element.component.html @@ -1,6 +1,6 @@ - - - - + @@ -11,7 +11,7 @@

    {{object.name}}

    {{object.shortDescription}}

    - View + View
    diff --git a/src/app/shared/object-grid/community-grid-element/community-grid-element.component.html b/src/app/shared/object-grid/community-grid-element/community-grid-element.component.html index 9049d8ad18..3b401d8b22 100644 --- a/src/app/shared/object-grid/community-grid-element/community-grid-element.component.html +++ b/src/app/shared/object-grid/community-grid-element/community-grid-element.component.html @@ -1,5 +1,5 @@
    - + @@ -11,7 +11,7 @@

    {{object.name}}

    {{object.shortDescription}}

    - View + View
    diff --git a/src/app/shared/object-grid/search-result-grid-element/collection-search-result/collection-search-result-grid-element.component.html b/src/app/shared/object-grid/search-result-grid-element/collection-search-result/collection-search-result-grid-element.component.html index e452353a95..8d6e6337b8 100644 --- a/src/app/shared/object-grid/search-result-grid-element/collection-search-result/collection-search-result-grid-element.component.html +++ b/src/app/shared/object-grid/search-result-grid-element/collection-search-result/collection-search-result-grid-element.component.html @@ -1,5 +1,5 @@
    - + @@ -12,7 +12,7 @@

    {{dso.name}}

    {{dso.shortDescription}}

    - View + View
    diff --git a/src/app/shared/object-grid/search-result-grid-element/community-search-result/community-search-result-grid-element.component.html b/src/app/shared/object-grid/search-result-grid-element/community-search-result/community-search-result-grid-element.component.html index 4674d3d750..f987284204 100644 --- a/src/app/shared/object-grid/search-result-grid-element/community-search-result/community-search-result-grid-element.component.html +++ b/src/app/shared/object-grid/search-result-grid-element/community-search-result/community-search-result-grid-element.component.html @@ -1,5 +1,5 @@
    - + @@ -12,7 +12,7 @@

    {{dso.name}}

    {{dso.shortDescription}}

    - View + View
    diff --git a/src/app/shared/object-grid/search-result-grid-element/item-search-result/item/item-search-result-grid-element.component.html b/src/app/shared/object-grid/search-result-grid-element/item-search-result/item/item-search-result-grid-element.component.html index 8d4421a15c..bc691e0295 100644 --- a/src/app/shared/object-grid/search-result-grid-element/item-search-result/item/item-search-result-grid-element.component.html +++ b/src/app/shared/object-grid/search-result-grid-element/item-search-result/item/item-search-result-grid-element.component.html @@ -3,7 +3,7 @@
    - diff --git a/src/app/shared/object-list/browse-entry-list-element/browse-entry-list-element.component.html b/src/app/shared/object-list/browse-entry-list-element/browse-entry-list-element.component.html index 99d79f3670..79575fd4d9 100644 --- a/src/app/shared/object-list/browse-entry-list-element/browse-entry-list-element.component.html +++ b/src/app/shared/object-list/browse-entry-list-element/browse-entry-list-element.component.html @@ -1,5 +1,5 @@
    - + {{object.value}} diff --git a/src/app/shared/object-list/collection-list-element/collection-list-element.component.html b/src/app/shared/object-list/collection-list-element/collection-list-element.component.html index 3f2cff33c2..aeefcd6e65 100644 --- a/src/app/shared/object-list/collection-list-element/collection-list-element.component.html +++ b/src/app/shared/object-list/collection-list-element/collection-list-element.component.html @@ -1,4 +1,4 @@ - + {{object.name}} diff --git a/src/app/shared/object-list/community-list-element/community-list-element.component.html b/src/app/shared/object-list/community-list-element/community-list-element.component.html index fca6ff77c2..88aacb94db 100644 --- a/src/app/shared/object-list/community-list-element/community-list-element.component.html +++ b/src/app/shared/object-list/community-list-element/community-list-element.component.html @@ -1,4 +1,4 @@ - + {{object.name}} diff --git a/src/app/shared/object-list/search-result-list-element/collection-search-result/collection-search-result-list-element.component.html b/src/app/shared/object-list/search-result-list-element/collection-search-result/collection-search-result-list-element.component.html index e85667382c..7874d33d21 100644 --- a/src/app/shared/object-list/search-result-list-element/collection-search-result/collection-search-result-list-element.component.html +++ b/src/app/shared/object-list/search-result-list-element/collection-search-result/collection-search-result-list-element.component.html @@ -1,4 +1,4 @@ - +
    diff --git a/src/app/shared/object-list/search-result-list-element/community-search-result/community-search-result-list-element.component.html b/src/app/shared/object-list/search-result-list-element/community-search-result/community-search-result-list-element.component.html index bba6bf2c5e..a28a0b6920 100644 --- a/src/app/shared/object-list/search-result-list-element/community-search-result/community-search-result-list-element.component.html +++ b/src/app/shared/object-list/search-result-list-element/community-search-result/community-search-result-list-element.component.html @@ -1,4 +1,4 @@ - +
    diff --git a/src/app/shared/object-list/search-result-list-element/item-search-result/item-types/item/item-search-result-list-element.component.html b/src/app/shared/object-list/search-result-list-element/item-search-result/item-types/item/item-search-result-list-element.component.html index a12989ada3..284885e760 100644 --- a/src/app/shared/object-list/search-result-list-element/item-search-result/item-types/item/item-search-result-list-element.component.html +++ b/src/app/shared/object-list/search-result-list-element/item-search-result/item-types/item/item-search-result-list-element.component.html @@ -1,7 +1,7 @@ - Date: Tue, 30 May 2023 22:09:59 +0100 Subject: [PATCH 299/409] Contribution to the Portuguese (pt-PT) translation of DSpace v7.5 Extended revision of the Portuguese (pt-PT) translation of DSpace v7.5. This version adds new message keys, reordered the message keys accordingly to the authoritative master (en.json5) and adds missing or not found translation keys (mentioned in the last section of the file). --- src/assets/i18n/pt-PT.json5 | 4704 ++++++++++++++++++++++++++--------- 1 file changed, 3526 insertions(+), 1178 deletions(-) diff --git a/src/assets/i18n/pt-PT.json5 b/src/assets/i18n/pt-PT.json5 index c0327c4b54..17477285af 100644 --- a/src/assets/i18n/pt-PT.json5 +++ b/src/assets/i18n/pt-PT.json5 @@ -1,271 +1,97 @@ { -// NOTE 1 - Doesn't exist on en_EN +// Dspace v7.5 > i18n pt-PT > reviewed 30-05-2023 -// "repository.title.prefixDSpace": "DSpace ::", -"repository.title.prefixDSpace": "DSpace ::", - -// "collection.edit.item-mapper-search-form.placeholder": "Search Item to Map...", -"collection.edit.item-mapper-search-form.placeholder": "Pesquisar Item a Mapear...", - -// "idle.modal.header":"Your Session is About to Expire!", -"idle.modal.header":"A sua sessão está prestes a expirar!", - -// "idle.modal.info":"Your session is about to expire, would you like to logout or continue the session?", -"idle.modal.info":"A sua sessão está prestes a expirar, pretende sair ou continuar a sessão?", - -// "idle.modal.log-out":"Logout", -"idle.modal.log-out":"Sair", - -// "idle.modal.extend-session":"Continue Session", -"idle.modal.extend-session":"Continuar a Sessão", - - - - - -// NOTE 2 - Add to other languages - needed for OpenAIRE compliance - relations between entities - -// "submission.sections.describe.relationship-lookup.external-source.import-modal.isProjectOfPublication.added.new-entity": "New Entity Added!", -"submission.sections.describe.relationship-lookup.external-source.import-modal.isProjectOfPublication.added.new-entity": "Nova Entidade Adicionada!", - -// "item.preview.project.funder.name": "Funder", -"item.preview.project.funder.name": "Financiador", - -// "item.preview.project.funder.identifier": "Funder Identifier", -"item.preview.project.funder.identifier": "Identificador do Financiador", - -// "item.preview.oaire.awardNumber": "Funding ID", -"item.preview.oaire.awardNumber": "ID de Financiamento", - -// "item.preview.dc.title.alternative": "Acronym", -"item.preview.dc.title.alternative": "Acrónimo", - -// "item.preview.dc.coverage.spatial": "Jurisdiction", -"item.preview.dc.coverage.spatial": "Jurisdição", - -// "item.preview.oaire.fundingStream": "Funding Stream", -"item.preview.oaire.fundingStream": "Linha de Financiamento", - -// "submission.import-external.source.openAIREFunding": "Funding OpenAIRE API", -"submission.import-external.source.openAIREFunding": "Financiamento API OpenAIRE", - -// "submission.sections.describe.relationship-lookup.external-source.import-button-title.isProjectOfPublication": "Project", -"submission.sections.describe.relationship-lookup.external-source.import-button-title.isProjectOfPublication": "Projeto", - -// "submission.sections.describe.relationship-lookup.external-source.import-modal.isProjectOfPublication.title": "Project", -"submission.sections.describe.relationship-lookup.external-source.import-modal.isProjectOfPublication.title": "Projeto", - -// "submission.sections.describe.relationship-lookup.external-source.import-modal.head.openAIREFunding": "Funding OpenAIRE API", -"submission.sections.describe.relationship-lookup.external-source.import-modal.head.openAIREFunding": "Financiamento API OpenAIRE", - -// "submission.sections.describe.relationship-lookup.search-tab.tab-title.openAIREFunding": "Funding OpenAIRE API", -"submission.sections.describe.relationship-lookup.search-tab.tab-title.openAIREFunding": "Financiamento API OpenAIRE", - -// "submission.sections.describe.relationship-lookup.selection-tab.title.openAIREFunding": "Funding OpenAIRE API", -"submission.sections.describe.relationship-lookup.selection-tab.title.openAIREFunding": "Financiamento API OpenAIRE", - -// "submission.sections.describe.relationship-lookup.selection-tab.title.isProjectOfPublication": "Projeto", -"submission.sections.describe.relationship-lookup.selection-tab.title.isProjectOfPublication": "Projeto", - -// "submission.sections.describe.relationship-lookup.search-tab.tab-title.isProjectOfPublication": "Projects", -"submission.sections.describe.relationship-lookup.search-tab.tab-title.isProjectOfPublication": "Projetos", - -// "submission.sections.describe.relationship-lookup.title.isProjectOfPublication": "Projects", -"submission.sections.describe.relationship-lookup.title.isProjectOfPublication": "Projetos", - -// "relationships.isContributorOf.OrgUnit": "Contributor (Organizational Unit)", -"relationships.isContributorOf.OrgUnit": "Contribuidor (Unidade organizacional)", - -// "relationships.isContributorOf.Person": "Contributor", -"relationships.isContributorOf.Person": "Contribuidor", - -// "submission.sections.describe.relationship-lookup.title.isFundingAgencyOfProject": "Funder of the Project", -"submission.sections.describe.relationship-lookup.title.isFundingAgencyOfProject": "Financiador de Projeto", - -// "submission.sections.describe.relationship-lookup.search-tab.tab-title.isFundingAgencyOfProject": "Funder of the Project", -"submission.sections.describe.relationship-lookup.search-tab.tab-title.isFundingAgencyOfProject": "Financiador de Projeto", - -// "relationships.isFundingAgencyOf.OrgUnit": "Funder", -"relationships.isFundingAgencyOf.OrgUnit": "Financiador", - - - - - - - - -// Other strings - -//"submission.sections.describe.relationship-lookup.selection-tab.search-form.placeholder": "Search...", -"submission.sections.describe.relationship-lookup.selection-tab.search-form.placeholder": "Pesquisar...", - -// "submission.general.info.saved": "Saved", -"submission.general.info.saved": "Informação Guardada", - -// "bitstream.edit.authorizations.link": "Edit bitstream's Policies", -"bitstream.edit.authorizations.link": "Editar Polítcas de Ficheiros", - -// "bitstream.edit.return": "Back", -"bitstream.edit.return": "Voltar", - -// "submission.edit.breadcrumbs": "Edit Submission", -"submission.edit.breadcrumbs": "Editar Submissão", - -// "search.filters.filter.subject.label": "Search subject", -"search.filters.filter.subject.label": "Pesquisar Assunto", - -// "search.filters.filter.entityType.label": "Search item type", -"search.filters.filter.entityType.label": "Pesquisar Tipo", - -// "search.filters.filter.author.label": "Search author name", -"search.filters.filter.author.label": "Pesquisar Autor", - -// "sorting.dc.date.accessioned.ASC": "Accessioned Date Ascending", -"sorting.dc.date.accessioned.ASC": "Data de Disponibilização Ascendente", - -// "sorting.dc.date.accessioned.DESC": "Accessioned Date Descending", -"sorting.dc.date.accessioned.DESC": "Data de Disponibilização Descendente", - -// "search.search-form.placeholder": "Search the repository ...", -"search.search-form.placeholder": "Pesquisar ...", - -// "item.edit.item-mapper.search-form.placeholder": "Search collections...", -"item.edit.item-mapper.search-form.placeholder": "Pesquisar coleções...", - -// "item.edit.return": "Back", -"item.edit.return": "Voltar", - -// "repository.title.prefix": "DSpace Angular :: ", -"repository.title.prefix": "DSpace ::", - - -// "thumbnail.person.placeholder": "No Profile Picture Available", -"thumbnail.person.placeholder": "Sem Fotografia de Perfil", - -// "admin.access-control.groups.breadcrumbs": "Groups", -"admin.access-control.groups.breadcrumbs": "Grupos", - -// "admin.access-control.groups.search.placeholder": "Search groups...", -"admin.access-control.groups.search.placeholder": "Pesquisar Grupos...", - -// "admin.access-control.epeople.breadcrumbs": "EPeople", -"admin.access-control.epeople.breadcrumbs": "Utilizador", - -// "admin.access-control.epeople.search.placeholder": "Search people...", -"admin.access-control.epeople.search.placeholder": "Pesquisar Utilizadores...", - -// "admin.access-control.epeople.form.return": "Back", -"admin.access-control.epeople.form.return": "Voltar", - -// "submission.submit.breadcrumbs": "New submission", -"submission.submit.breadcrumbs": "Nova Submissão", - -// "search.filters.filter.namedresourcetype.label": "Search status", -"search.filters.filter.namedresourcetype.label": "Pesquisar Estado", - -// "sorting.dc.date.issued.ASC": "Date Issued Ascending", -"sorting.dc.date.issued.ASC": "Data de Publicação Ascendente", - -// "sorting.dc.date.issued.DESC": "Date Issued Descending", -"sorting.dc.date.issued.DESC": "Data de Publicação Descendente", - -// "sorting.score.ASC": "Least Relevant", -"sorting.score.ASC": "Menos Relevante", - -// "search.filters.filter.dateIssued.min.label": "Start", -"search.filters.filter.dateIssued.min.label": "Início", - -// "search.filters.filter.dateIssued.max.label": "End", -"search.filters.filter.dateIssued.max.label": "Fim", - -// "search.filters.search.submit": "Submit", -"search.filters.search.submit": "Enviar", - -// "default.search.results.head": "Search Results", -"default.search.results.head": "Resultados da Pesquisa", - -// "communityList.breadcrumbs": "Community List", -"communityList.breadcrumbs": "Lista de Comunidades", - -// "browse.previous.button": "Previous", -"browse.previous.button": "Anterior", - -// "browse.next.button": "Next", -"browse.next.button": "Próximo", - -// "pagination.options.description": "Pagination options", -"pagination.options.description": "Opções de Paginação", - -// "mydspace.breadcrumbs": "MyDSpace", -"mydspace.breadcrumbs": "Área Pessoal", - -// "thumbnail.default.placeholder": "No Thumbnail Available", -"thumbnail.default.placeholder": "Sem Miniatura", - -// "submission.sections.describe.relationship-lookup.search-tab.search-form.placeholder": "Search...", -"submission.sections.describe.relationship-lookup.search-tab.search-form.placeholder": "Pesquisar ...", - -// "home.search-form.placeholder": "Search the repository ...", -"home.search-form.placeholder": "Pesquisar ...", - -// "mydspace.search-form.placeholder": "Search in mydspace...", -"mydspace.search-form.placeholder": "Pesquisar na Área Pessoal ...", - - -// OLD strings // "401.help": "You're not authorized to access this page. You can use the button below to get back to the home page.", - "401.help": "Não está autorizado a aceder a esta página. Use o botão abaixo para regressar à página inicial.", + "401.help": "Não está autorizado a aceder a esta página. Pode utilizar o botão em baixo para voltar à página de início.", // "401.link.home-page": "Take me to the home page", - "401.link.home-page": "Regresso à página inicial", - + "401.link.home-page": "Voltar à página de início", + // "401.unauthorized": "unauthorized", - "401.unauthorized": "Não Autorizado", - + "401.unauthorized": "Não autorizado", + // "403.help": "You don't have permission to access this page. You can use the button below to get back to the home page.", - "403.help": "Não está autorizado a aceder a esta página. Use o botão abaixo para regressar à página inicial.", - + "403.help": "Não possui permissões para aceder a esta página. Pode utilizar o botão em baixo para voltar à página de início.", + // "403.link.home-page": "Take me to the home page", - "403.link.home-page": "Regresso à página inicial", - + "403.link.home-page": "Voltar à página de início", + // "403.forbidden": "forbidden", - "403.forbidden": "Não Autorizado", + "403.forbidden": "Proibido", + + // "500.page-internal-server-error": "Service Unavailable", + "500.page-internal-server-error": "Serviço indisponível", + // "500.help": "The server is temporarily unable to service your request due to maintenance downtime or capacity problems. Please try again later.", + "500.help": "O servidor encontra-se temporariamete indisponível para responder ao seu pedido, devido a processos de manutenção em curso ou capacidade de resposta. Por favor tente mais tarde.", + + // "500.link.home-page": "Take me to the home page", + "500.link.home-page": "Voltar à página de início", + // "404.help": "We can't find the page you're looking for. The page may have been moved or deleted. You can use the button below to get back to the home page. ", - "404.help": "Não pudemos encontrar a página pela qual procura. A página pode ter sido movida ou apagada. Você pode utilizar o botão abaixo para voltar a página inicial. ", - + "404.help": "Não encontramos a página que procura. A página pode ter sido movida ou eliminada. Pode utilizar o botão em baixo para voltar à página de início. ", + // "404.link.home-page": "Take me to the home page", - "404.link.home-page": "Leve-me a página inicial", + "404.link.home-page": "Voltar à página de início", // "404.page-not-found": "page not found", - "404.page-not-found": "Página não encontrada", + "404.page-not-found": "página não encontrada", + + // "error-page.description.401": "unauthorized", + "error-page.description.401": "Não autorizado", + // "error-page.description.403": "forbidden", + "error-page.description.403": "Proibido", + + // "error-page.description.500": "Service Unavailable", + "error-page.description.500": "Serviço indisponível", + + // "error-page.description.404": "page not found", + "error-page.description.404": "página não encontrada", + + // "error-page.orcid.generic-error": "An error occurred during login via ORCID. Make sure you have shared your ORCID account email address with DSpace. If the error persists, contact the administrator", + "error-page.orcid.generic-error": "Ocorreu um erro com a sua autenticação via ORCID. Certifique-se que partilhou o seu endereço de email associado à sua conta ORCID com o repositório. Se o erro persistir, por favor contacte o administrador do sistema.", + + // "access-status.embargo.listelement.badge": "Embargo", + "access-status.embargo.listelement.badge": "Embargado", + + // "access-status.metadata.only.listelement.badge": "Metadata only", + "access-status.metadata.only.listelement.badge": "Apenas Metadados", + + // "access-status.open.access.listelement.badge": "Open Access", + "access-status.open.access.listelement.badge": "Acesso Aberto", + + // "access-status.restricted.listelement.badge": "Restricted", + "access-status.restricted.listelement.badge": "Acesso Restrito", + + // "access-status.unknown.listelement.badge": "Unknown", + "access-status.unknown.listelement.badge": "Desconhecido", + // "admin.curation-tasks.breadcrumbs": "System curation tasks", - "admin.curation-tasks.breadcrumbs": "Tarefas de Curadoria", + "admin.curation-tasks.breadcrumbs": "Tarefas de curadoria", // "admin.curation-tasks.title": "System curation tasks", - "admin.curation-tasks.title": "Tarefas de Curadoria", - + "admin.curation-tasks.title": "Tarefas de curadoria", + // "admin.curation-tasks.header": "System curation tasks", - "admin.curation-tasks.header": "Tarefas de Curadoria", - + "admin.curation-tasks.header": "Tarefas de curadoria", + // "admin.registries.bitstream-formats.breadcrumbs": "Format registry", - "admin.registries.bitstream-formats.breadcrumbs": "Registo de Formatos de Ficheiro", + "admin.registries.bitstream-formats.breadcrumbs": "Registo de formatos", // "admin.registries.bitstream-formats.create.breadcrumbs": "Bitstream format", - "admin.registries.bitstream-formats.create.breadcrumbs": "Registo de Formatos de Ficheiro", + "admin.registries.bitstream-formats.create.breadcrumbs": "Registo de formatos de ficheiro", // "admin.registries.bitstream-formats.create.failure.content": "An error occurred while creating the new bitstream format.", - "admin.registries.bitstream-formats.create.failure.content": "Um erro ocorreu durante a criação do novo formato de ficheiro.", + "admin.registries.bitstream-formats.create.failure.content": "Ocorreu um erro durante a criação do novo formato de ficheiro.", // "admin.registries.bitstream-formats.create.failure.head": "Failure", "admin.registries.bitstream-formats.create.failure.head": "Falha", // "admin.registries.bitstream-formats.create.head": "Create Bitstream format", - "admin.registries.bitstream-formats.create.head": "Criar formato de Ficheiro", + "admin.registries.bitstream-formats.create.head": "Criar formato de ficheiro", // "admin.registries.bitstream-formats.create.new": "Add a new bitstream format", "admin.registries.bitstream-formats.create.new": "Adicionar um novo formato de ficheiro", @@ -289,10 +115,10 @@ "admin.registries.bitstream-formats.delete.success.head": "Sucesso", // "admin.registries.bitstream-formats.description": "This list of bitstream formats provides information about known formats and their support level.", - "admin.registries.bitstream-formats.description": "Esta lista de formatos de ficheiro apresenta informações sobre formatos de ficheiros conhecidos e os seus níveis de suporte.", + "admin.registries.bitstream-formats.description": "Esta lista de formatos de ficheiro apresenta informações sobre formatos conhecidos e os seus níveis de suporte.", // "admin.registries.bitstream-formats.edit.breadcrumbs": "Bitstream format", - "admin.registries.bitstream-formats.edit.breadcrumbs": "Formatos de Ficheiro", + "admin.registries.bitstream-formats.edit.breadcrumbs": "Formatos de ficheiro", // "admin.registries.bitstream-formats.edit.description.hint": "", "admin.registries.bitstream-formats.edit.description.hint": "", @@ -319,7 +145,7 @@ "admin.registries.bitstream-formats.edit.head": "Formato de bitstream: {{ format }}", // "admin.registries.bitstream-formats.edit.internal.hint": "Formats marked as internal are hidden from the user, and used for administrative purposes.", - "admin.registries.bitstream-formats.edit.internal.hint": "Formatos marcados como internos são ocultos para o Utilizador, usados por motivos administrativos.", + "admin.registries.bitstream-formats.edit.internal.hint": "Formatos marcados como internos são ocultos para o utilizador, usados por motivos administrativos.", // "admin.registries.bitstream-formats.edit.internal.label": "Internal", "admin.registries.bitstream-formats.edit.internal.label": "Interno", @@ -349,7 +175,7 @@ "admin.registries.bitstream-formats.edit.supportLevel.label": "Nível de suporte", // "admin.registries.bitstream-formats.head": "Bitstream Format Registry", - "admin.registries.bitstream-formats.head": "Registo de Formato de Ficheiro", + "admin.registries.bitstream-formats.head": "Registo de formatos de ficheiros", // "admin.registries.bitstream-formats.no-items": "No bitstream formats to show.", "admin.registries.bitstream-formats.no-items": "Nenhum formato de bitstream para exibir.", @@ -368,35 +194,36 @@ // "admin.registries.bitstream-formats.table.name": "Name", "admin.registries.bitstream-formats.table.name": "Nome", - // TODO New key - Add a translation + + // "admin.registries.bitstream-formats.table.id" : "ID", "admin.registries.bitstream-formats.table.id" : "ID", - // "admin.registries.bitstream-formats.table.return": "Return", + // "admin.registries.bitstream-formats.table.return": "Back", "admin.registries.bitstream-formats.table.return": "Voltar", // "admin.registries.bitstream-formats.table.supportLevel.KNOWN": "Known", "admin.registries.bitstream-formats.table.supportLevel.KNOWN": "Conhecido", - + // "admin.registries.bitstream-formats.table.supportLevel.SUPPORTED": "Supported", - "admin.registries.bitstream-formats.table.supportLevel.SUPPORTED": "Com suporte", + "admin.registries.bitstream-formats.table.supportLevel.SUPPORTED": "Suportado", // "admin.registries.bitstream-formats.table.supportLevel.UNKNOWN": "Unknown", "admin.registries.bitstream-formats.table.supportLevel.UNKNOWN": "Desconhecido", // "admin.registries.bitstream-formats.table.supportLevel.head": "Support Level", - "admin.registries.bitstream-formats.table.supportLevel.head": "Nível de Suporte", - - // "admin.registries.bitstream-formats.title": "DSpace Angular :: Bitstream Format Registry", - "admin.registries.bitstream-formats.title": "DSpace :: Registo de Formato de Ficheiro", + "admin.registries.bitstream-formats.table.supportLevel.head": "Nível de suporte", + // "admin.registries.bitstream-formats.title": "Bitstream Format Registry", + "admin.registries.bitstream-formats.title": "Registo de formatos de ficheiro", + // "admin.registries.metadata.breadcrumbs": "Metadata registry", - "admin.registries.metadata.breadcrumbs": "Registo de Metadados", + "admin.registries.metadata.breadcrumbs": "Registo de metadados", // "admin.registries.metadata.description": "The metadata registry maintains a list of all metadata fields available in the repository. These fields may be divided amongst multiple schemas. However, DSpace requires the qualified Dublin Core schema.", "admin.registries.metadata.description": "O registo de metadados mantém a lista de todos os campos de metadados disponíveis no repositório. Estes campos podem ser divididos em multiplos esquemas. No entanto, o DSpace requer esquemas de Dublin Core qualificados.", // "admin.registries.metadata.form.create": "Create metadata schema", - "admin.registries.metadata.form.create": "Criar Esquema de Metadados", + "admin.registries.metadata.form.create": "Criar esquema de metadados", // "admin.registries.metadata.form.edit": "Edit metadata schema", "admin.registries.metadata.form.edit": "Editar esquema de metadados", @@ -408,7 +235,7 @@ "admin.registries.metadata.form.namespace": "Namespace", // "admin.registries.metadata.head": "Metadata Registry", - "admin.registries.metadata.head": "Registo de Metadados", + "admin.registries.metadata.head": "Registo de metadados", // "admin.registries.metadata.schemas.no-items": "No metadata schemas to show.", "admin.registries.metadata.schemas.no-items": "Nenhum esquema de metadados para mostrar.", @@ -425,37 +252,38 @@ // "admin.registries.metadata.schemas.table.namespace": "Namespace", "admin.registries.metadata.schemas.table.namespace": "Namespace", - // "admin.registries.metadata.title": "DSpace Angular :: Metadata Registry", - "admin.registries.metadata.title": "DSpace :: Registo de Metadados", - + // "admin.registries.metadata.title": "Metadata Registry", + "admin.registries.metadata.title": "Registo de metadados", + // "admin.registries.schema.breadcrumbs": "Metadata schema", - "admin.registries.schema.breadcrumbs": "Esquema de Metadados", + "admin.registries.schema.breadcrumbs": "Esquema de metadados", // "admin.registries.schema.description": "This is the metadata schema for \"{{namespace}}\".", "admin.registries.schema.description": "Este é o esquema de metadados para \"{{namespace}}\".", // "admin.registries.schema.fields.head": "Schema metadata fields", - "admin.registries.schema.fields.head": "Campos do Esquema de Metadados", + "admin.registries.schema.fields.head": "Campos do esquema de metadados", // "admin.registries.schema.fields.no-items": "No metadata fields to show.", "admin.registries.schema.fields.no-items": "Nenhum campo de metadado para exibir.", - + // "admin.registries.schema.fields.table.delete": "Delete selected", "admin.registries.schema.fields.table.delete": "Apagar selecionado(s)", // "admin.registries.schema.fields.table.field": "Field", "admin.registries.schema.fields.table.field": "Campo", - // TODO New key - Add a translation + + // "admin.registries.schema.fields.table.id" : "ID", "admin.registries.schema.fields.table.id" : "ID", // "admin.registries.schema.fields.table.scopenote": "Scope Note", "admin.registries.schema.fields.table.scopenote": "Descrição", // "admin.registries.schema.form.create": "Create metadata field", - "admin.registries.schema.form.create": "Criar Elemento de Metadado", + "admin.registries.schema.form.create": "Criar elemento de metadados", // "admin.registries.schema.form.edit": "Edit metadata field", - "admin.registries.schema.form.edit": "Editar Campo de Metadados", + "admin.registries.schema.form.edit": "Editar campo de metadados", // "admin.registries.schema.form.element": "Element", "admin.registries.schema.form.element": "Elemento", @@ -464,10 +292,10 @@ "admin.registries.schema.form.qualifier": "Qualificador", // "admin.registries.schema.form.scopenote": "Scope Note", - "admin.registries.schema.form.scopenote": "Nota de Âmbito", + "admin.registries.schema.form.scopenote": "Nota de âmbito", // "admin.registries.schema.head": "Metadata Schema", - "admin.registries.schema.head": "Esquema de Metadados", + "admin.registries.schema.head": "Esquema de metadados", // "admin.registries.schema.notification.created": "Successfully created metadata schema \"{{prefix}}\"", "admin.registries.schema.notification.created": "Criou o esquema de metadados \"{{prefix}}\" com sucesso", @@ -494,42 +322,43 @@ "admin.registries.schema.notification.field.deleted.success": "Apagou {{amount}} campo(s) de metadados com sucesso", // "admin.registries.schema.notification.field.edited": "Successfully edited metadata field \"{{field}}\"", - "admin.registries.schema.notification.field.edited": "Editou o campo de metadodo \"{{field}}\" com sucesso", + "admin.registries.schema.notification.field.edited": "Editou o campo de metadado \"{{field}}\" com sucesso", // "admin.registries.schema.notification.success": "Success", "admin.registries.schema.notification.success": "Sucesso", - // "admin.registries.schema.return": "Return", + // "admin.registries.schema.return": "Back", "admin.registries.schema.return": "Voltar", - // "admin.registries.schema.title": "DSpace Angular :: Metadata Schema Registry", - "admin.registries.schema.title": "DSpace :: Registo de Esquema de Metadados", - - + // "admin.registries.schema.title": "Metadata Schema Registry", + "admin.registries.schema.title": "Registo de esquemas de metadados", // "admin.access-control.epeople.actions.delete": "Delete EPerson", - "admin.access-control.epeople.actions.delete": "Apagar Utilizador", + "admin.access-control.epeople.actions.delete": "Apagar utilizador", // "admin.access-control.epeople.actions.impersonate": "Impersonate EPerson", "admin.access-control.epeople.actions.impersonate": "Assumir o papel do Utilizador", // "admin.access-control.epeople.actions.reset": "Reset password", - "admin.access-control.epeople.actions.reset": "Redefinir password", + "admin.access-control.epeople.actions.reset": "Redefinir password", // "admin.access-control.epeople.actions.stop-impersonating": "Stop impersonating EPerson", - "admin.access-control.epeople.actions.stop-impersonating": "Deixar de assumir o papel do Utilizador", + "admin.access-control.epeople.actions.stop-impersonating": "Deixar de assumir o papel do utilizador", - // "admin.access-control.epeople.title": "DSpace Angular :: EPeople", - "admin.access-control.epeople.title": "DSpace :: Utilizador", + // "admin.access-control.epeople.breadcrumbs": "EPeople", + "admin.access-control.epeople.breadcrumbs": "Utilizadores", + + // "admin.access-control.epeople.title": "EPeople", + "admin.access-control.epeople.title": "Utilizadores", // "admin.access-control.epeople.head": "EPeople", - "admin.access-control.epeople.head": "Utilizador", + "admin.access-control.epeople.head": "Utilizadores", // "admin.access-control.epeople.search.head": "Search", "admin.access-control.epeople.search.head": "Pesquisar", // "admin.access-control.epeople.button.see-all": "Browse All", - "admin.access-control.epeople.button.see-all": "Pesquisar Todos", + "admin.access-control.epeople.button.see-all": "Pesquisar tudo", // "admin.access-control.epeople.search.scope.metadata": "Metadata", "admin.access-control.epeople.search.scope.metadata": "Metadados", @@ -540,12 +369,15 @@ // "admin.access-control.epeople.search.button": "Search", "admin.access-control.epeople.search.button": "Pesquisar", - // "admin.access-control.epeople.button.add": "Add EPerson", - "admin.access-control.epeople.button.add": "Adicionar Utilizador", + // "admin.access-control.epeople.search.placeholder": "Search people...", + "admin.access-control.epeople.search.placeholder": "Pesquisar utilizadores...", + + // "admin.access-control.epeople.button.add": "Add EPerson", + "admin.access-control.epeople.button.add": "Adicionar utilizador", // "admin.access-control.epeople.table.id": "ID", - "admin.access-control.epeople.table.id": "ID", - + "admin.access-control.epeople.table.id": "ID", + // "admin.access-control.epeople.table.name": "Name", "admin.access-control.epeople.table.name": "Nome", @@ -558,17 +390,20 @@ // "admin.access-control.epeople.table.edit.buttons.edit": "Edit \"{{name}}\"", "admin.access-control.epeople.table.edit.buttons.edit": "Editar \"{{name}}\"", + // "admin.access-control.epeople.table.edit.buttons.edit-disabled": "You are not authorized to edit this group", + "admin.access-control.epeople.table.edit.buttons.edit-disabled": "Não possui autorização para editar este grupo", + // "admin.access-control.epeople.table.edit.buttons.remove": "Delete \"{{name}}\"", "admin.access-control.epeople.table.edit.buttons.remove": "Apagar \"{{name}}\"", // "admin.access-control.epeople.no-items": "No EPeople to show.", - "admin.access-control.epeople.no-items": "Sem Utilizadores para mostrar.", + "admin.access-control.epeople.no-items": "Sem utilizadores para mostrar.", // "admin.access-control.epeople.form.create": "Create EPerson", - "admin.access-control.epeople.form.create": "Criar Utilizador", + "admin.access-control.epeople.form.create": "Criar utilizador", // "admin.access-control.epeople.form.edit": "Edit EPerson", - "admin.access-control.epeople.form.edit": "Editar Utilizador", + "admin.access-control.epeople.form.edit": "Editar utilizador", // "admin.access-control.epeople.form.firstName": "First name", "admin.access-control.epeople.form.firstName": "Nome", @@ -584,9 +419,12 @@ // "admin.access-control.epeople.form.canLogIn": "Can log in", "admin.access-control.epeople.form.canLogIn": "Pode iniciar sessão", - + // "admin.access-control.epeople.form.requireCertificate": "Requires certificate", "admin.access-control.epeople.form.requireCertificate": "Requer certificado", + + // "admin.access-control.epeople.form.return": "Back", + "admin.access-control.epeople.form.return": "Voltar", // "admin.access-control.epeople.form.notification.created.success": "Successfully created EPerson \"{{name}}\"", "admin.access-control.epeople.form.notification.created.success": "Utilizador criado com sucesso \"{{name}}\"", @@ -607,10 +445,10 @@ "admin.access-control.epeople.form.notification.edited.failure": "Falha ao editor Utilizador \"{{name}}\"", // "admin.access-control.epeople.form.notification.deleted.success": "Successfully deleted EPerson \"{{name}}\"", - "admin.access-control.epeople.form.notification.deleted.success": "Utilizador apagado com sucesso \"{{name}}\"", + "admin.access-control.epeople.form.notification.deleted.success": "Utilizador removido com sucesso \"{{name}}\"", // "admin.access-control.epeople.form.notification.deleted.failure": "Failed to delete EPerson \"{{name}}\"", - "admin.access-control.epeople.form.notification.deleted.failure": "Falha ao apagar Utilizador \"{{name}}\"", + "admin.access-control.epeople.form.notification.deleted.failure": "Falha ao remover o utilizador \"{{name}}\"", // "admin.access-control.epeople.form.groupsEPersonIsMemberOf": "Member of these groups:", "admin.access-control.epeople.form.groupsEPersonIsMemberOf": "Membro dos grupos:", @@ -620,30 +458,40 @@ // "admin.access-control.epeople.form.table.name": "Name", "admin.access-control.epeople.form.table.name": "Nome", + + // "admin.access-control.epeople.form.table.collectionOrCommunity": "Collection/Community", + "admin.access-control.epeople.form.table.collectionOrCommunity": "Coleção/Comunidade", // "admin.access-control.epeople.form.memberOfNoGroups": "This EPerson is not a member of any groups", - "admin.access-control.epeople.form.memberOfNoGroups": "Este Utilizador não é membro de nenhum grupo", + "admin.access-control.epeople.form.memberOfNoGroups": "Este utilizador não é membro de nenhum grupo", // "admin.access-control.epeople.form.goToGroups": "Add to groups", "admin.access-control.epeople.form.goToGroups": "Adicionar a grupos", // "admin.access-control.epeople.notification.deleted.failure": "Failed to delete EPerson: \"{{name}}\"", - "admin.access-control.epeople.notification.deleted.failure": "Falha ao apagar Utilizador: \"{{name}}\"", + "admin.access-control.epeople.notification.deleted.failure": "Falha ao apagar utilizador: \"{{name}}\"", // "admin.access-control.epeople.notification.deleted.success": "Successfully deleted EPerson: \"{{name}}\"", - "admin.access-control.epeople.notification.deleted.success": "Utilizador apagado com sucesso: \"{{name}}\"", + "admin.access-control.epeople.notification.deleted.success": "Utilizador removido com sucesso: \"{{name}}\"", + // "admin.access-control.groups.title": "Groups", + "admin.access-control.groups.title": "Grupos", + // "admin.access-control.groups.breadcrumbs": "Groups", + "admin.access-control.groups.breadcrumbs": "Grupos", - // "admin.access-control.groups.title": "DSpace Angular :: Groups", - "admin.access-control.groups.title": "DSpace :: Grupos", + // "admin.access-control.groups.singleGroup.breadcrumbs": "Edit Group", + "admin.access-control.groups.singleGroup.breadcrumbs": "Editar grupo", + + // "admin.access-control.groups.title.singleGroup": "Edit Group", + "admin.access-control.groups.title.singleGroup": "Editar grupo", - // "admin.access-control.groups.title.singleGroup": "DSpace Angular :: Edit Group", - "admin.access-control.groups.title.singleGroup": "DSpace :: Editar Grupo", - - // "admin.access-control.groups.title.addGroup": "DSpace Angular :: New Group", - "admin.access-control.groups.title.addGroup": "DSpace :: Novo Grupo", + // "admin.access-control.groups.title.addGroup": "New Group", + "admin.access-control.groups.title.addGroup": "Novo grupo", + // "admin.access-control.groups.addGroup.breadcrumbs": "New Group", + "admin.access-control.groups.addGroup.breadcrumbs": "Novo grupo", + // "admin.access-control.groups.head": "Groups", "admin.access-control.groups.head": "Grupos", @@ -659,11 +507,17 @@ // "admin.access-control.groups.search.button": "Search", "admin.access-control.groups.search.button": "Pesquisar", + // "admin.access-control.groups.search.placeholder": "Search groups...", + "admin.access-control.groups.search.placeholder": "Pesquisar grupos...", + // "admin.access-control.groups.table.id": "ID", "admin.access-control.groups.table.id": "ID", // "admin.access-control.groups.table.name": "Name", "admin.access-control.groups.table.name": "Nome", + + // "admin.access-control.groups.table.collectionOrCommunity": "Collection/Community", + "admin.access-control.groups.table.collectionOrCommunity": "Coleção/Comunidade", // "admin.access-control.groups.table.members": "Members", "admin.access-control.groups.table.members": "Membros", @@ -679,23 +533,21 @@ // "admin.access-control.groups.no-items": "No groups found with this in their name or this as UUID", "admin.access-control.groups.no-items": "Não foram encontrados grupos através do nome ou o UUID", - + // "admin.access-control.groups.notification.deleted.success": "Successfully deleted group \"{{name}}\"", - "admin.access-control.groups.notification.deleted.success": "Grupo apagado com sucesso \"{{name}}\"", + "admin.access-control.groups.notification.deleted.success": "Grupo removido com sucesso \"{{name}}\"", // "admin.access-control.groups.notification.deleted.failure.title": "Failed to delete group \"{{name}}\"", - "admin.access-control.groups.notification.deleted.failure.title": "Falha ao apagar grupo \"{{name}}\"", + "admin.access-control.groups.notification.deleted.failure.title": "Falha ao remover grupo \"{{name}}\"", // "admin.access-control.groups.notification.deleted.failure.content": "Cause: \"{{cause}}\"", "admin.access-control.groups.notification.deleted.failure.content": "Causa: \"{{cause}}\"", - - // "admin.access-control.groups.form.alert.permanent": "This group is permanent, so it can't be edited or deleted. You can still add and remove group members using this page.", - "admin.access-control.groups.form.alert.permanent": "Este grupo é permanente, não pode ser editado ou apagado. Pode adicionar ou remover membros do grupo nesta página.", + "admin.access-control.groups.form.alert.permanent": "Este grupo é permanente, não pode ser editado ou apagado. Pode adicionar ou remover membros deste grupo nesta página.", // "admin.access-control.groups.form.alert.workflowGroup": "This group can’t be modified or deleted because it corresponds to a role in the submission and workflow process in the \"{{name}}\" {{comcol}}. You can delete it from the \"assign roles\" tab on the edit {{comcol}} page. You can still add and remove group members using this page.", - "admin.access-control.groups.form.alert.workflowGroup": "Este grupo não pode ser editado ou apagado porque corresponde a um papel no workflow de submissão em \"{{name}}\" {{comcol}}. Pode apagá-lo na aba \"Atribuir Papéis\" na edição da página {{comcol}}. Pode adicionar ou remover membros nesta página.", + "admin.access-control.groups.form.alert.workflowGroup": "Este grupo não pode ser editado ou apagado porque corresponde a um papel no 'workflow' de depósito em \"{{name}}\" {{comcol}}. Pode apagá-lo na aba \"Atribuir Papéis\" na edição da página {{comcol}}. Pode adicionar ou remover membros nesta página.", // "admin.access-control.groups.form.head.create": "Create group", "admin.access-control.groups.form.head.create": "Criar grupo", @@ -706,6 +558,9 @@ // "admin.access-control.groups.form.groupName": "Group name", "admin.access-control.groups.form.groupName": "Nome do grupo", + // "admin.access-control.groups.form.groupCommunity": "Community or Collection", + "admin.access-control.groups.form.groupCommunity": "Comunidade ou Coleção", + // "admin.access-control.groups.form.groupDescription": "Description", "admin.access-control.groups.form.groupDescription": "Descrição", @@ -732,7 +587,7 @@ // "admin.access-control.groups.form.delete-group.modal.header": "Delete Group \"{{ dsoName }}\"", "admin.access-control.groups.form.delete-group.modal.header": "Apagar grupo \"{{ dsoName }}\"", - + // "admin.access-control.groups.form.delete-group.modal.info": "Are you sure you want to delete Group \"{{ dsoName }}\"", "admin.access-control.groups.form.delete-group.modal.info": "Pretende mesmo apagar o grupo \"{{ dsoName }}\"", @@ -755,10 +610,10 @@ "admin.access-control.groups.form.members-list.head": "Utilizador", // "admin.access-control.groups.form.members-list.search.head": "Add EPeople", - "admin.access-control.groups.form.members-list.search.head": "Adicionar Utilizador", + "admin.access-control.groups.form.members-list.search.head": "Adicionar utilizador", // "admin.access-control.groups.form.members-list.button.see-all": "Browse All", - "admin.access-control.groups.form.members-list.button.see-all": "Percorrer TODOS", + "admin.access-control.groups.form.members-list.button.see-all": "Percorrer todos", // "admin.access-control.groups.form.members-list.headMembers": "Current Members", "admin.access-control.groups.form.members-list.headMembers": "Membros atuais", @@ -767,7 +622,7 @@ "admin.access-control.groups.form.members-list.search.scope.metadata": "Metadados", // "admin.access-control.groups.form.members-list.search.scope.email": "E-mail (exact)", - "admin.access-control.groups.form.members-list.search.scope.email": "Email (exato)", + "admin.access-control.groups.form.members-list.search.scope.email": "E-mail (completo)", // "admin.access-control.groups.form.members-list.search.button": "Search", "admin.access-control.groups.form.members-list.search.button": "Pesquisar", @@ -777,6 +632,15 @@ // "admin.access-control.groups.form.members-list.table.name": "Name", "admin.access-control.groups.form.members-list.table.name": "Nome", + + // "admin.access-control.groups.form.members-list.table.identity": "Identity", + "admin.access-control.groups.form.members-list.table.identity": "Identidade", + + // "admin.access-control.groups.form.members-list.table.email": "Email", + "admin.access-control.groups.form.members-list.table.email": "E-mail", + + // "admin.access-control.groups.form.members-list.table.netid": "NetID", + "admin.access-control.groups.form.members-list.table.netid": "NetID", // "admin.access-control.groups.form.members-list.table.edit": "Remove / Add", "admin.access-control.groups.form.members-list.table.edit": "Remover / Adicionar", @@ -791,17 +655,17 @@ "admin.access-control.groups.form.members-list.notification.failure.addMember": "Falha ao adicionar membro: \"{{name}}\"", // "admin.access-control.groups.form.members-list.notification.success.deleteMember": "Successfully deleted member: \"{{name}}\"", - "admin.access-control.groups.form.members-list.notification.success.deleteMember": "Membro apagado com sucesso: \"{{name}}\"", + "admin.access-control.groups.form.members-list.notification.success.deleteMember": "Membro removido com sucesso: \"{{name}}\"", // "admin.access-control.groups.form.members-list.notification.failure.deleteMember": "Failed to delete member: \"{{name}}\"", - "admin.access-control.groups.form.members-list.notification.failure.deleteMember": "Falha ao apagar membro: \"{{name}}\"", + "admin.access-control.groups.form.members-list.notification.failure.deleteMember": "Falha ao remover o membro: \"{{name}}\"", // "admin.access-control.groups.form.members-list.table.edit.buttons.add": "Add member with name \"{{name}}\"", "admin.access-control.groups.form.members-list.table.edit.buttons.add": "Adicionar membro com o nome \"{{name}}\"", // "admin.access-control.groups.form.members-list.notification.failure.noActiveGroup": "No current active group, submit a name first.", "admin.access-control.groups.form.members-list.notification.failure.noActiveGroup": "Sem grupos ativos, indique um nome primeiro.", - + // "admin.access-control.groups.form.members-list.no-members-yet": "No members in group yet, search and add.", "admin.access-control.groups.form.members-list.no-members-yet": "Grupo sem membros, pesquise e adicione novos membros.", @@ -818,7 +682,7 @@ "admin.access-control.groups.form.subgroups-list.search.head": "Adicionar um subgrupo", // "admin.access-control.groups.form.subgroups-list.button.see-all": "Browse All", - "admin.access-control.groups.form.subgroups-list.button.see-all": "Percorrer Todos", + "admin.access-control.groups.form.subgroups-list.button.see-all": "Percorrer todos", // "admin.access-control.groups.form.subgroups-list.headSubgroups": "Current Subgroups", "admin.access-control.groups.form.subgroups-list.headSubgroups": "Subgrupos atuais", @@ -832,6 +696,9 @@ // "admin.access-control.groups.form.subgroups-list.table.name": "Name", "admin.access-control.groups.form.subgroups-list.table.name": "Nome", + // "admin.access-control.groups.form.subgroups-list.table.collectionOrCommunity": "Collection/Community", + "admin.access-control.groups.form.subgroups-list.table.collectionOrCommunity": "Coleção/Comunidade", + // "admin.access-control.groups.form.subgroups-list.table.edit": "Remove / Add", "admin.access-control.groups.form.subgroups-list.table.edit": "Remover / Adicionar", @@ -851,10 +718,10 @@ "admin.access-control.groups.form.subgroups-list.notification.failure.addSubgroup": "Falha ao adicionar subgrupo: \"{{name}}\"", // "admin.access-control.groups.form.subgroups-list.notification.success.deleteSubgroup": "Successfully deleted subgroup: \"{{name}}\"", - "admin.access-control.groups.form.subgroups-list.notification.success.deleteSubgroup": "Subgrupo apagado com sucesso: \"{{name}}\"", + "admin.access-control.groups.form.subgroups-list.notification.success.deleteSubgroup": "Subgrupo removido com sucesso: \"{{name}}\"", // "admin.access-control.groups.form.subgroups-list.notification.failure.deleteSubgroup": "Failed to delete subgroup: \"{{name}}\"", - "admin.access-control.groups.form.subgroups-list.notification.failure.deleteSubgroup": "Falha ao apagar subgrupo: \"{{name}}\"", + "admin.access-control.groups.form.subgroups-list.notification.failure.deleteSubgroup": "Falha ao remover o subgrupo: \"{{name}}\"", // "admin.access-control.groups.form.subgroups-list.notification.failure.noActiveGroup": "No current active group, submit a name first.", "admin.access-control.groups.form.subgroups-list.notification.failure.noActiveGroup": "Sem grupo ativo, indique um nome primeiro.", @@ -866,14 +733,21 @@ "admin.access-control.groups.form.subgroups-list.no-items": "Não foram encontrados grupos com este nome ou UUID", // "admin.access-control.groups.form.subgroups-list.no-subgroups-yet": "No subgroups in group yet.", - "admin.access-control.groups.form.subgroups-list.no-subgroups-yet": "Este grupo não tem ainda subgrupos.", + "admin.access-control.groups.form.subgroups-list.no-subgroups-yet": "Este grupo ainda não tem subgrupos.", - // "admin.access-control.groups.form.return": "Return to groups", - "admin.access-control.groups.form.return": "Retornar aos grupos", + // "admin.access-control.groups.form.return": "Back", + "admin.access-control.groups.form.return": "Voltar", + // "admin.access-control.groups.form.tooltip.editGroupPage": "On this page, you can modify the properties and members of a group. In the top section, you can edit the group name and description, unless this is an admin group for a collection or community, in which case the group name and description are auto-generated and cannot be edited. In the following sections, you can edit group membership. See [the wiki](https://wiki.lyrasis.org/display/DSDOC7x/Create+or+manage+a+user+group) for more details.", + "admin.access-control.groups.form.tooltip.editGroupPage": "Nesta página, pode modificar as propriedades e os membros de um grupo. Na secção superior, pode editar o nome e a descrição do grupo, a menos que se trate de um grupo administrativo para uma coleção ou comunidade, em que o nome e a descrição do grupo são auto-gerados e não podem ser editados. Nas seções seguintes, pode editar o nome e a descrição do grupo. Ver [wiki](https://wiki.lyrasis.org/display/DSDOC7x/Create+ou+gerir+a+utilizador+grupo) para mais detalhes.", + + // "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 adicionar ou remover um utilizador de/para este grupo, clique no botão 'Procurar tudo' ou use a barra de pesquisa em baixo para procurar utilizadores (use o menu suspenso, à esquerda da barra de pesquisa, para escolher se pretende pesquisar por metadados ou por e-mail). Depois clique no ícone 'mais' para cada utilizador que deseja adicionar na lista em baixo, ou no ícone 'lixo' para cada utilizador que deseja remover. A lista pode conter várias páginas: utilize os controlos no final da lista para navegar para as páginas seguintes. Quando estiver pronto, guarde as suas alterações clicando no botão 'Guardar' na seção superior.", - - // "admin.search.breadcrumbs": "Administrative Search", + // "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 adicionar ou remover um sub-grupo de/para grupo, clique no botão 'Procurar Tudo' ou use a barra de pesquisa em baixo para procurar utilizadores. Depois clique no ícone 'mais' para cada utilizador que deseja adicionar lista em baixo, ou no ícone 'lixo' para cada utilizador que deseja remover. A lista pode conter várias páginas: utilize os controlos de página no final da lista para navegar para as páginas seguintes. Quando estiver pronto, guarde as suas alterações clicando no botão 'Guardar' na seção superior.", + + // "admin.search.breadcrumbs": "Administrative Search", "admin.search.breadcrumbs": "Pesquisa administrativa", // "admin.search.collection.edit": "Edit", @@ -888,11 +762,11 @@ // "admin.search.item.edit": "Edit", "admin.search.item.edit": "Editar", - // "admin.search.item.make-private": "Make Private", - "admin.search.item.make-private": "Tornar Privado", + // "admin.search.item.make-private": "Make non-discoverable", + "admin.search.item.make-private": "Tornar privado", - // "admin.search.item.make-public": "Make Public", - "admin.search.item.make-public": "Tornar Público", + // "admin.search.item.make-public": "Make discoverable", + "admin.search.item.make-public": "Tornar público", // "admin.search.item.move": "Move", "admin.search.item.move": "Mover", @@ -904,69 +778,215 @@ "admin.search.item.withdraw": "Retirar", // "admin.search.title": "Administrative Search", - "admin.search.title": "Pesquisa Administrativa", - + "admin.search.title": "Pesquisa administrativa", + // "administrativeView.search.results.head": "Administrative Search", - "administrativeView.search.results.head": "Pesquisa Administrativa", - - - + "administrativeView.search.results.head": "Pesquisa administrativa", // "admin.workflow.breadcrumbs": "Administer Workflow", - "admin.workflow.breadcrumbs": "Gestão do Workflow", + "admin.workflow.breadcrumbs": "Gestão do workflow", // "admin.workflow.title": "Administer Workflow", - "admin.workflow.title": "Gestão do Workflow", + "admin.workflow.title": "Gestão do workflow", // "admin.workflow.item.workflow": "Workflow", "admin.workflow.item.workflow": "Workflow", + // "admin.workflow.item.workspace": "Workspace", + "admin.workflow.item.workspace": "Área de trabalho", + // "admin.workflow.item.delete": "Delete", - "admin.workflow.item.delete": "Apagar", + "admin.workflow.item.delete": "Apagar", // "admin.workflow.item.send-back": "Send back", "admin.workflow.item.send-back": "Devolver", + // "admin.workflow.item.policies": "Policies", + "admin.workflow.item.policies": "Políticas", - + // "admin.workflow.item.supervision": "Supervision", + "admin.workflow.item.supervision": "Supervisão", + // "admin.metadata-import.breadcrumbs": "Import Metadata", - "admin.metadata-import.breadcrumbs": "Importação de Metadados", + "admin.metadata-import.breadcrumbs": "Importação de metadados", + + // "admin.batch-import.breadcrumbs": "Import Batch", + "admin.batch-import.breadcrumbs": "Importação em lote (batch)", // "admin.metadata-import.title": "Import Metadata", - "admin.metadata-import.title": "Importação de Metadados", + "admin.metadata-import.title": "Importação de metadados", + + // "admin.batch-import.title": "Import Batch", + "admin.batch-import.title": "Importação em lote (batch)", // "admin.metadata-import.page.header": "Import Metadata", - "admin.metadata-import.page.header": "Importação de Metadados", + "admin.metadata-import.page.header": "Importação de metadados", + + // "admin.batch-import.page.header": "Import Batch", + "admin.batch-import.page.header": "Importação em lote (batch)", // "admin.metadata-import.page.help": "You can drop or browse CSV files that contain batch metadata operations on files here", "admin.metadata-import.page.help": "Pode arrastar ou procurar ficheiros CSV que contenham operações em lote de metadados", + + // "admin.batch-import.page.help": "Select the Collection to import into. Then, drop or browse to a Simple Archive Format (SAF) zip file that includes the Items to import", + "admin.batch-import.page.help": "Selecione a coleção para a qual pretende importar. Em seguida, largue ou selecione ficheiro .zip em formato Simple Archive Format (SAF) que inclua os itens a importar.", // "admin.metadata-import.page.dropMsg": "Drop a metadata CSV to import", - "admin.metadata-import.page.dropMsg": "Arraste um ficheiro CSV com metadados para importar", + "admin.metadata-import.page.dropMsg": "Arraste ficheiro .csv para importar metadados", + + // "admin.batch-import.page.dropMsg": "Drop a batch ZIP to import", + "admin.batch-import.page.dropMsg": "Arraste ficheiro .zip para importação em lote", // "admin.metadata-import.page.dropMsgReplace": "Drop to replace the metadata CSV to import", - "admin.metadata-import.page.dropMsgReplace": "Arraste um ficheiro CSV para substituir o atual", + "admin.metadata-import.page.dropMsgReplace": "Arraste ficheiro .csv para substituir metadados a importar", - // "admin.metadata-import.page.button.return": "Return", + // "admin.batch-import.page.dropMsgReplace": "Drop to replace the batch ZIP to import", + "admin.batch-import.page.dropMsgReplace": "Arraste ficheiro .zip para substituir importação em lote", + + // "admin.metadata-import.page.button.return": "Back", "admin.metadata-import.page.button.return": "Voltar", // "admin.metadata-import.page.button.proceed": "Proceed", "admin.metadata-import.page.button.proceed": "Continuar", + // "admin.metadata-import.page.button.select-collection": "Select Collection", + "admin.metadata-import.page.button.select-collection": "Selecione a coleção", + // "admin.metadata-import.page.error.addFile": "Select file first!", "admin.metadata-import.page.error.addFile": "Selecione um ficheiro!", + // "admin.batch-import.page.error.addFile": "Select Zip file first!", + "admin.batch-import.page.error.addFile": "Selecione primeiro o ficheiro .zip!", + + // "admin.metadata-import.page.validateOnly": "Validate Only", + "admin.metadata-import.page.validateOnly": "Validar", + + // "admin.metadata-import.page.validateOnly.hint": "When selected, the uploaded CSV will be validated. You will receive a report of detected changes, but no changes will be saved.", + "admin.metadata-import.page.validateOnly.hint": "Quando selecionado, o ficheiro .csv carregado será validado. Irá receber um relatório com as alterações detetadas, porém nenhuma será guardada.", + + // "advanced-workflow-action.rating.form.rating.label": "Rating", + "advanced-workflow-action.rating.form.rating.label": "Classificação", + + // "advanced-workflow-action.rating.form.rating.error": "You must rate the item", + "advanced-workflow-action.rating.form.rating.error": "Deve classificar o item", + + // "advanced-workflow-action.rating.form.review.label": "Review", + "advanced-workflow-action.rating.form.review.label": "Rever", + + // "advanced-workflow-action.rating.form.review.error": "You must enter a review to submit this rating", + "advanced-workflow-action.rating.form.review.error": "Deve introduzir uma revisão para submeter esta classificação", + + // "advanced-workflow-action.rating.description": "Please select a rating below", + "advanced-workflow-action.rating.description": "Por favor selecione uma classificação em baixo", + + // "advanced-workflow-action.rating.description-requiredDescription": "Please select a rating below and also add a review", + "advanced-workflow-action.rating.description-requiredDescription": "Por favor, selecione em baixo uma classificação e acrescente também uma revisão", + + // "advanced-workflow-action.select-reviewer.description-single": "Please select a single reviewer below before submitting", + "advanced-workflow-action.select-reviewer.description-single": "Por favor, selecione um revisor único antes de submeter", + + // "advanced-workflow-action.select-reviewer.description-multiple": "Please select one or more reviewers below before submitting", + "advanced-workflow-action.select-reviewer.description-multiple": "Por favor, selecione um ou mais revisores antes de submeter", + + // "advanced-workflow-action-select-reviewer.groups.form.reviewers-list.head": "EPeople", + "advanced-workflow-action-select-reviewer.groups.form.reviewers-list.head": "EPeople", + + // "advanced-workflow-action-select-reviewer.groups.form.reviewers-list.search.head": "Add EPeople", + "advanced-workflow-action-select-reviewer.groups.form.reviewers-list.search.head": "Adicionar utilizadores", + + // "advanced-workflow-action-select-reviewer.groups.form.reviewers-list.button.see-all": "Browse All", + "advanced-workflow-action-select-reviewer.groups.form.reviewers-list.button.see-all": "Procurar tudo", + + // "advanced-workflow-action-select-reviewer.groups.form.reviewers-list.headMembers": "Current Members", + "advanced-workflow-action-select-reviewer.groups.form.reviewers-list.headMembers": "Membros atuais", + + // "advanced-workflow-action-select-reviewer.groups.form.reviewers-list.search.scope.metadata": "Metadata", + "advanced-workflow-action-select-reviewer.groups.form.reviewers-list.search.scope.metadata": "Metadados", + + // "advanced-workflow-action-select-reviewer.groups.form.reviewers-list.search.scope.email": "E-mail (exact)", + "advanced-workflow-action-select-reviewer.groups.form.reviewers-list.search.scope.email": "E-mail (completo)", + + // "advanced-workflow-action-select-reviewer.groups.form.reviewers-list.search.button": "Search", + "advanced-workflow-action-select-reviewer.groups.form.reviewers-list.search.button": "Pesquisar", + + // "advanced-workflow-action-select-reviewer.groups.form.reviewers-list.table.id": "ID", + "advanced-workflow-action-select-reviewer.groups.form.reviewers-list.table.id": "ID", + + // "advanced-workflow-action-select-reviewer.groups.form.reviewers-list.table.name": "Name", + "advanced-workflow-action-select-reviewer.groups.form.reviewers-list.table.name": "Nome", + + // "advanced-workflow-action-select-reviewer.groups.form.reviewers-list.table.identity": "Identity", + "advanced-workflow-action-select-reviewer.groups.form.reviewers-list.table.identity": "Identidade", + // "advanced-workflow-action-select-reviewer.groups.form.reviewers-list.table.email": "Email", + "advanced-workflow-action-select-reviewer.groups.form.reviewers-list.table.email": "Email", + + // "advanced-workflow-action-select-reviewer.groups.form.reviewers-list.table.netid": "NetID", + "advanced-workflow-action-select-reviewer.groups.form.reviewers-list.table.netid": "NetID", + + // "advanced-workflow-action-select-reviewer.groups.form.reviewers-list.table.edit": "Remove / Add", + "advanced-workflow-action-select-reviewer.groups.form.reviewers-list.table.edit": "Remover / Adicionar", + + // "advanced-workflow-action-select-reviewer.groups.form.reviewers-list.table.edit.buttons.remove": "Remove member with name \"{{name}}\"", + "advanced-workflow-action-select-reviewer.groups.form.reviewers-list.table.edit.buttons.remove": "Remover membro com o nome \"{{name}}\"", - + // "advanced-workflow-action-select-reviewer.groups.form.reviewers-list.notification.success.addMember": "Successfully added member: \"{{name}}\"", + "advanced-workflow-action-select-reviewer.groups.form.reviewers-list.notification.success.addMember": "Membro adicionado com sucessso: \"{{name}}\"", + + // "advanced-workflow-action-select-reviewer.groups.form.reviewers-list.notification.failure.addMember": "Failed to add member: \"{{name}}\"", + "advanced-workflow-action-select-reviewer.groups.form.reviewers-list.notification.failure.addMember": "Falha ao adicionar o membro: \"{{name}}\"", + + // "advanced-workflow-action-select-reviewer.groups.form.reviewers-list.notification.success.deleteMember": "Successfully deleted member: \"{{name}}\"", + "advanced-workflow-action-select-reviewer.groups.form.reviewers-list.notification.success.deleteMember": "Membro removido com sucesso: \"{{name}}\"", + + // "advanced-workflow-action-select-reviewer.groups.form.reviewers-list.notification.failure.deleteMember": "Failed to delete member: \"{{name}}\"", + "advanced-workflow-action-select-reviewer.groups.form.reviewers-list.notification.failure.deleteMember": "Falha ao remover o membro: \"{{name}}\"", + + // "advanced-workflow-action-select-reviewer.groups.form.reviewers-list.table.edit.buttons.add": "Add member with name \"{{name}}\"", + "advanced-workflow-action-select-reviewer.groups.form.reviewers-list.table.edit.buttons.add": "Adicionar membro com nome \"{{name}}\"", + + // "advanced-workflow-action-select-reviewer.groups.form.reviewers-list.notification.failure.noActiveGroup": "No current active group, submit a name first.", + "advanced-workflow-action-select-reviewer.groups.form.reviewers-list.notification.failure.noActiveGroup": "Atualmente sem grupo ativo, submeter um nome primeiro.", + + // "advanced-workflow-action-select-reviewer.groups.form.reviewers-list.no-members-yet": "No members in group yet, search and add.", + "advanced-workflow-action-select-reviewer.groups.form.reviewers-list.no-members-yet": "Ainda não existem membros no grupo, pesquisar e acrescentar.", + + // "advanced-workflow-action-select-reviewer.groups.form.reviewers-list.no-items": "No EPeople found in that search", + "advanced-workflow-action-select-reviewer.groups.form.reviewers-list.no-items": "Não foi encontrado nenhuma utilizador na pesquisa", + + // "advanced-workflow-action.select-reviewer.no-reviewer-selected.error": "No reviewer selected.", + "advanced-workflow-action.select-reviewer.no-reviewer-selected.error": "Sem revisor selecionado.", + + // "admin.batch-import.page.validateOnly.hint": "When selected, the uploaded ZIP will be validated. You will receive a report of detected changes, but no changes will be saved.", + "admin.batch-import.page.validateOnly.hint": "Quando selecionado, o ficheiro .zip carregado será validado. Irá receber um relatório com as alterações detetadas, porém nenhuma será guardada.", + + // "admin.batch-import.page.remove": "remove", + "admin.batch-import.page.remove": "Remover", + // "auth.errors.invalid-user": "Invalid email address or password.", "auth.errors.invalid-user": "Endereço de email ou palavra-chave inválidos.", // "auth.messages.expired": "Your session has expired. Please log in again.", - "auth.messages.expired": "Sua sessão expirou. Por favor entre novamente.", - + "auth.messages.expired": "A sua sessão expirou. Por favor, autentique-se novamente.", + // "auth.messages.token-refresh-failed": "Refreshing your session token failed. Please log in again.", + "auth.messages.token-refresh-failed": "A atualização do token da sua sessão falhou. Por favor, autentique-se novamente.", + + // "bitstream.download.page": "Now downloading {{bitstream}}...", + "bitstream.download.page": "A descarregar {{bitstream}}...", + + // "bitstream.download.page.back": "Back", + "bitstream.download.page.back": "Voltar", + // "bitstream.edit.authorizations.link": "Edit bitstream's Policies", + "bitstream.edit.authorizations.link": "Editar políticas dos bitstreams", + + // "bitstream.edit.authorizations.title": "Edit bitstream's Policies", + "bitstream.edit.authorizations.title": "Editar políticas dos bitstreams", + + // "bitstream.edit.return": "Back", + "bitstream.edit.return": "Voltar", + // "bitstream.edit.bitstream": "Bitstream: ", "bitstream.edit.bitstream": "Ficheiros: ", @@ -998,39 +1018,121 @@ "bitstream.edit.form.primaryBitstream.label": "Ficheiro primário", // "bitstream.edit.form.selectedFormat.hint": "If the format is not in the above list, select \"format not in list\" above and describe it under \"Describe new format\".", - "bitstream.edit.form.selectedFormat.hint": "Se o formato não está na lista abaixo, escolha \"Formato não está na lista\" e desreva-o em \"Descreva o novo formato\".", + "bitstream.edit.form.selectedFormat.hint": "Se o formato não se encontrar listado, selecione por favor a opção \"Formato não está na lista\" e faculte detalhes em \"Descreva o novo formato\".", // "bitstream.edit.form.selectedFormat.label": "Selected Format", - "bitstream.edit.form.selectedFormat.label": "Formato Selecionado", + "bitstream.edit.form.selectedFormat.label": "Formato selecionado", // "bitstream.edit.form.selectedFormat.unknown": "Format not in list", - "bitstream.edit.form.selectedFormat.unknown": "Formato não está na lista", + "bitstream.edit.form.selectedFormat.unknown": "O formato não está na lista", // "bitstream.edit.notifications.error.format.title": "An error occurred saving the bitstream's format", - "bitstream.edit.notifications.error.format.title": "Ocorreu um erro ao guardar o formto do ficheiro", + "bitstream.edit.notifications.error.format.title": "Ocorreu um erro ao guardar o formato do ficheiro", + + // "bitstream.edit.form.iiifLabel.label": "IIIF Label", + "bitstream.edit.form.iiifLabel.label": "IIIF Label", + // "bitstream.edit.form.iiifLabel.hint": "Canvas label for this image. If not provided default label will be used.", + "bitstream.edit.form.iiifLabel.hint": "Etiqueta canvas para esta imagem. Se não for fornecida será utilizada uma etiqueta padrão.", + + // "bitstream.edit.form.iiifToc.label": "IIIF Table of Contents", + "bitstream.edit.form.iiifToc.label": "Tabela de conteúdos IIIF", + + // "bitstream.edit.form.iiifToc.hint": "Adding text here makes this the start of a new table of contents range.", + "bitstream.edit.form.iiifToc.hint": "Ao acrescentar texto aqui dá início a uma tabela de conteúdos.", + + // "bitstream.edit.form.iiifWidth.label": "IIIF Canvas Width", + "bitstream.edit.form.iiifWidth.label": "Largura do canvas IIIF", + + // "bitstream.edit.form.iiifWidth.hint": "The canvas width should usually match the image width.", + "bitstream.edit.form.iiifWidth.hint": "A largura do canvas normalmente deve corresponder à largura da imagem.", + + // "bitstream.edit.form.iiifHeight.label": "IIIF Canvas Height", + "bitstream.edit.form.iiifHeight.label": "Altura do canvas IIIF", + + // "bitstream.edit.form.iiifHeight.hint": "The canvas height should usually match the image height.", + "bitstream.edit.form.iiifHeight.hint": "A altura do canvas normalmente deve corresponder à altura da imagem.", + // "bitstream.edit.notifications.saved.content": "Your changes to this bitstream were saved.", "bitstream.edit.notifications.saved.content": "As alterações aos ficheiro foram guardadas.", // "bitstream.edit.notifications.saved.title": "Bitstream saved", "bitstream.edit.notifications.saved.title": "Ficheiro guardado", - + // "bitstream.edit.title": "Edit bitstream", "bitstream.edit.title": "Editar ficheiro", + // "bitstream-request-a-copy.alert.canDownload1": "You already have access to this file. If you want to download the file, click ", + "bitstream-request-a-copy.alert.canDownload1": "Já tem acesso a este ficheiro. Se quiser descarregar o ficheiro, clique ", + + // "bitstream-request-a-copy.alert.canDownload2": "here", + "bitstream-request-a-copy.alert.canDownload2": "aqui", + + // "bitstream-request-a-copy.header": "Request a copy of the file", + "bitstream-request-a-copy.header": "Solicitar cópia ao autor", + + // "bitstream-request-a-copy.intro": "Enter the following information to request a copy for the following item: ", + "bitstream-request-a-copy.intro": "Preencha a seguinte informação para solicitar uma cópia do ficheiro: ", + + // "bitstream-request-a-copy.intro.bitstream.one": "Requesting the following file: ", + "bitstream-request-a-copy.intro.bitstream.one": "Solicitar o seguinte ficheiro: ", + + // "bitstream-request-a-copy.intro.bitstream.all": "Requesting all files. ", + "bitstream-request-a-copy.intro.bitstream.all": "Solicitar todos os ficheiros. ", + + // "bitstream-request-a-copy.name.label": "Name *", + "bitstream-request-a-copy.name.label": "O seu nome *", + + // "bitstream-request-a-copy.name.error": "The name is required", + "bitstream-request-a-copy.name.error": "O preenchimento do nome é um elemento obrigatório!", + + // "bitstream-request-a-copy.email.label": "Your e-mail address *", + "bitstream-request-a-copy.email.label": "O seu endereço de correio eletrónico *", + + // "bitstream-request-a-copy.email.hint": "This email address is used for sending the file.", + "bitstream-request-a-copy.email.hint": "Este endereço de correio eletrónico será utilizado para eventualmente proceder ao envio do ficheiro.", + + // "bitstream-request-a-copy.email.error": "Please enter a valid email address.", + "bitstream-request-a-copy.email.error": "O preenchimento de um endereço de correio electrónico válido é um elemento obrigatório!", + + // "bitstream-request-a-copy.allfiles.label": "Files", + "bitstream-request-a-copy.allfiles.label": "Ficheiro(s) pretendido(s):", + // "bitstream-request-a-copy.files-all-false.label": "Only the requested file", + "bitstream-request-a-copy.files-all-false.label": "Apenas o ficheiro solicitado", + + // "bitstream-request-a-copy.files-all-true.label": "All files (of this item) in restricted access", + "bitstream-request-a-copy.files-all-true.label": "Todos os ficheiros (deste registo) em acesso restrito", + + // "bitstream-request-a-copy.message.label": "Message", + "bitstream-request-a-copy.message.label": "Mensagem a enviar ao autor:", + + // "bitstream-request-a-copy.return": "Back", + "bitstream-request-a-copy.return": "Voltar", + + // "bitstream-request-a-copy.submit": "Request copy", + "bitstream-request-a-copy.submit": "Solicitar cópia ao autor", + + // "bitstream-request-a-copy.submit.success": "The item request was submitted successfully.", + "bitstream-request-a-copy.submit.success": "O seu pedido de cópia foi enviado com sucesso!", + + // "bitstream-request-a-copy.submit.error": "Something went wrong with submitting the item request.", + "bitstream-request-a-copy.submit.error": "Ocorreu algum erro no envio do pedido de cópia!", + + // "browse.back.all-results": "All browse results", + "browse.back.all-results": "Todos os resultados", // "browse.comcol.by.author": "By Author", - "browse.comcol.by.author": "Por Autor", + "browse.comcol.by.author": "Por autor", // "browse.comcol.by.dateissued": "By Issue Date", - "browse.comcol.by.dateissued": "Por Data de Publicação", + "browse.comcol.by.dateissued": "Por data de publicação", // "browse.comcol.by.subject": "By Subject", - "browse.comcol.by.subject": "Por Assunto", + "browse.comcol.by.subject": "Por assunto", // "browse.comcol.by.title": "By Title", - "browse.comcol.by.title": "Por Título", + "browse.comcol.by.title": "Por título", // "browse.comcol.head": "Browse", "browse.comcol.head": "Navegar", @@ -1039,103 +1141,136 @@ "browse.empty": "Sem itens a exibir.", // "browse.metadata.author": "Author", - "browse.metadata.author": "Autor", + "browse.metadata.author": "autor", // "browse.metadata.dateissued": "Issue Date", - "browse.metadata.dateissued": "Data de Publicação", + "browse.metadata.dateissued": "data de Publicação", // "browse.metadata.subject": "Subject", - "browse.metadata.subject": "Assunto", + "browse.metadata.subject": "assunto", // "browse.metadata.title": "Title", - "browse.metadata.title": "Título", - + "browse.metadata.title": "título", + // "browse.metadata.author.breadcrumbs": "Browse by Author", - "browse.metadata.author.breadcrumbs": "Pesquisar por Autor", + "browse.metadata.author.breadcrumbs": "Percorrer por autor", // "browse.metadata.dateissued.breadcrumbs": "Browse by Date", - "browse.metadata.dateissued.breadcrumbs": "Pesquisar por Data", + "browse.metadata.dateissued.breadcrumbs": "Percorrer por data", // "browse.metadata.subject.breadcrumbs": "Browse by Subject", - "browse.metadata.subject.breadcrumbs": "Pesquisar por Assunto", + "browse.metadata.subject.breadcrumbs": "Percorrer por assunto", // "browse.metadata.title.breadcrumbs": "Browse by Title", - "browse.metadata.title.breadcrumbs": "Pesquisar por Título", + "browse.metadata.title.breadcrumbs": "Percorrer por título", + + // "pagination.next.button": "Next", + "pagination.next.button": "Próximo", + + // "pagination.previous.button": "Previous", + "pagination.previous.button": "Anterior", + + // "pagination.next.button.disabled.tooltip": "No more pages of results", + "pagination.next.button.disabled.tooltip": "Sem mais páginas de resultados", + + // "browse.startsWith": ", starting with {{ startsWith }}", + "browse.startsWith": ", começado por {{ startsWith }}", // "browse.startsWith.choose_start": "(Choose start)", "browse.startsWith.choose_start": "(Escolha o início)", // "browse.startsWith.choose_year": "(Choose year)", "browse.startsWith.choose_year": "(Escolha o ano)", - - // "browse.startsWith.jump": "Jump to a point in the index:", - "browse.startsWith.jump": "Pular para um ponto do índice:", + + // "browse.startsWith.choose_year.label": "Choose the issue year", + "browse.startsWith.choose_year.label": "Escolha o ano", + + // "browse.startsWith.jump": "Filter results by year or month", + "browse.startsWith.jump": "Filtrar resultados por ano ou mês", // "browse.startsWith.months.april": "April", - "browse.startsWith.months.april": "Abril", + "browse.startsWith.months.april": "abril", // "browse.startsWith.months.august": "August", - "browse.startsWith.months.august": "Agosto", + "browse.startsWith.months.august": "agosto", // "browse.startsWith.months.december": "December", - "browse.startsWith.months.december": "Dezembro", + "browse.startsWith.months.december": "dezembro", // "browse.startsWith.months.february": "February", - "browse.startsWith.months.february": "Fevereiro", + "browse.startsWith.months.february": "fevereiro", // "browse.startsWith.months.january": "January", - "browse.startsWith.months.january": "Janeiro", + "browse.startsWith.months.january": "janeiro", // "browse.startsWith.months.july": "July", - "browse.startsWith.months.july": "Julho", + "browse.startsWith.months.july": "julho", // "browse.startsWith.months.june": "June", - "browse.startsWith.months.june": "Junho", + "browse.startsWith.months.june": "junho", // "browse.startsWith.months.march": "March", - "browse.startsWith.months.march": "Março", + "browse.startsWith.months.march": "março", // "browse.startsWith.months.may": "May", - "browse.startsWith.months.may": "Maio", + "browse.startsWith.months.may": "maio", // "browse.startsWith.months.none": "(Choose month)", - "browse.startsWith.months.none": "(escolha o mês)", + "browse.startsWith.months.none": "(Escolha o mês)", + + // "browse.startsWith.months.none.label": "Choose the issue month", + "browse.startsWith.months.none.label": "Escolha o mês", // "browse.startsWith.months.november": "November", - "browse.startsWith.months.november": "Novembro", + "browse.startsWith.months.november": "novembro", // "browse.startsWith.months.october": "October", - "browse.startsWith.months.october": "Outubro", + "browse.startsWith.months.october": "outubro", // "browse.startsWith.months.september": "September", - "browse.startsWith.months.september": "Setembro", + "browse.startsWith.months.september": "setembro", - // "browse.startsWith.submit": "Go", + // "browse.startsWith.submit": "Browse", "browse.startsWith.submit": "Pesquisar", - // "browse.startsWith.type_date": "Or type in a date (year-month):", - "browse.startsWith.type_date": "Ou indique uma data (ano-mês):", + // "browse.startsWith.type_date": "Filter results by date", + "browse.startsWith.type_date": "Filtrar resultados por data", - // "browse.startsWith.type_text": "Or enter first few letters:", - "browse.startsWith.type_text": "Ou indique as primeiras letras:", + // "browse.startsWith.type_date.label": "Or type in a date (year-month) and click on the Browse button", + "browse.startsWith.type_date.label": "ou indique uma data (ano-mês):", - // "browse.title": "Browsing {{ collection }} by {{ field }} {{ value }}", - "browse.title": "Percorrer {{ collection }} por {{ field }} {{ value }}", + // "browse.startsWith.type_text": "Filter results by typing the first few letters", + "browse.startsWith.type_text": "Filtrar resultados inserindo as primeiras letras", + // "browse.title": "Browsing {{ collection }} by {{ field }}{{ startsWith }} {{ value }}", + "browse.title": "Percorrer {{ collection }} por {{ field }}{{ startsWith }} {{ value }}", + + // "browse.title.page": "Browsing {{ collection }} by {{ field }} {{ value }}", + "browse.title.page": "Percorrer {{ collection }} por {{ field }} {{ value }}", + + // "search.browse.item-back": "Back to Results", + "search.browse.item-back": "Voltar aos resultados", // "chips.remove": "Remove chip", "chips.remove": "Remover chip", - + // "claimed-approved-search-result-list-element.title": "Approved", + "claimed-approved-search-result-list-element.title": "Aprovado", + + // "claimed-declined-search-result-list-element.title": "Rejected, sent back to submitter", + "claimed-declined-search-result-list-element.title": "Rejeitado, reenviado para o depositante", + + // "claimed-declined-task-search-result-list-element.title": "Declined, sent back to Review Manager's workflow", + "claimed-declined-task-search-result-list-element.title": "Declinado, reenviado para a área de trabalho do gestor de revisão", // "collection.create.head": "Create a Collection", "collection.create.head": "Criar uma coleção", // "collection.create.notifications.success": "Successfully created the Collection", - "collection.create.notifications.success": "Coleção criado com sucesso", + "collection.create.notifications.success": "Coleção criada com sucesso", // "collection.create.sub-head": "Create a Collection for Community {{ parent }}", - "collection.create.sub-head": "Criar uma Coleção na Comunidade {{ parent }}", + "collection.create.sub-head": "Criar uma coleção na comunidade {{ parent }}", // "collection.curate.header": "Curate Collection: {{collection}}", "collection.curate.header": "Curadoria da coleção: {{collection}}", @@ -1146,60 +1281,59 @@ // "collection.delete.confirm": "Confirm", "collection.delete.confirm": "Confirmar", - // "collection.delete.head": "Delete Collection", - "collection.delete.head": "Apagar Coleção", + // "collection.delete.processing": "Deleting", + "collection.delete.processing": "A apagar", - // "collection.delete.notification.fail": "Collection could not be deleted", - "collection.delete.notification.fail": "Coleção não pôde ser apagada", + // "collection.delete.head": "Delete Collection", + "collection.delete.head": "Apagar coleção", + + // "collection.delete.notification.fail": "collection could not be deleted", + "collection.delete.notification.fail": "Coleção não pode ser apagada", // "collection.delete.notification.success": "Successfully deleted collection", "collection.delete.notification.success": "Apagou a coleção com sucesso", // "collection.delete.text": "Are you sure you want to delete collection \"{{ dso }}\"", - "collection.delete.text": "Você tem certeza que deseja apagar a coleção \"{{ dso }}?\"", - - - + "collection.delete.text": "Tem certeza que deseja apagar a coleção \"{{ dso }}?\"", + // "collection.edit.delete": "Delete this collection", "collection.edit.delete": "Apagar esta coleção", // "collection.edit.head": "Edit Collection", - "collection.edit.head": "Editar Coleção", + "collection.edit.head": "Editar coleção", // "collection.edit.breadcrumbs": "Edit Collection", - "collection.edit.breadcrumbs": "Editar Coleção", - - + "collection.edit.breadcrumbs": "Editar coleção", // "collection.edit.tabs.mapper.head": "Item Mapper", "collection.edit.tabs.mapper.head": "Mapeamentos", - // "collection.edit.tabs.item-mapper.title": "Collection Edit - Item Mapper", - "collection.edit.tabs.item-mapper.title": "Editar Coleção - Mapeamentos", + // "collection.edit.tabs.item-mapper.title": "collection Edit - Item Mapper", + "collection.edit.tabs.item-mapper.title": "Editar coleção - mapeamentos", // "collection.edit.item-mapper.cancel": "Cancel", "collection.edit.item-mapper.cancel": "Cancelar", - // "collection.edit.item-mapper.collection": "Collection: \"{{name}}\"", + // "collection.edit.item-mapper.collection": "collection: \"{{name}}\"", "collection.edit.item-mapper.collection": "Coleção: \"{{name}}\"", // "collection.edit.item-mapper.confirm": "Map selected items", "collection.edit.item-mapper.confirm": "Mapear itens selecionados", - + // "collection.edit.item-mapper.description": "This is the item mapper tool that allows collection administrators to map items from other collections into this collection. You can search for items from other collections and map them, or browse the list of currently mapped items.", - "collection.edit.item-mapper.description": "Esta é a ferramenta de mapeamento de itens que permite aos administradores de coleções mapear itens de outras coleções nesta. Pode pesquisá-los noutras coleções para mapeá-los, ou navegar na lista dos itens atualmente mapeados.", + "collection.edit.item-mapper.description": "Esta é a ferramenta de mapeamento de itens que permite aos administradores de coleções mapear itens de outras coleções para esta. Pode pesquisá-los noutras coleções para os mapear ou navegar na lista dos itens atualmente mapeados.", // "collection.edit.item-mapper.head": "Item Mapper - Map Items from Other Collections", - "collection.edit.item-mapper.head": "Mapeador de Itens - Mapear itens noutras Coleções", + "collection.edit.item-mapper.head": "Mapeador de Itens - Mapear itens noutras coleções", // "collection.edit.item-mapper.no-search": "Please enter a query to search", - "collection.edit.item-mapper.no-search": "Por favor introduza um termo para pesquisar", + "collection.edit.item-mapper.no-search": "Por favor introduza um termo para pesquisar!", // "collection.edit.item-mapper.notifications.map.error.content": "Errors occurred for mapping of {{amount}} items.", "collection.edit.item-mapper.notifications.map.error.content": "Ocorreu erros ao mapear {{amount}} itens.", // "collection.edit.item-mapper.notifications.map.error.head": "Mapping errors", - "collection.edit.item-mapper.notifications.map.error.head": "Erros de mapeamento", + "collection.edit.item-mapper.notifications.map.error.head": "Erros de mapeamento!", // "collection.edit.item-mapper.notifications.map.success.content": "Successfully mapped {{amount}} items.", "collection.edit.item-mapper.notifications.map.success.content": "Mapeou {{amount}} itens com sucesso.", @@ -1214,7 +1348,7 @@ "collection.edit.item-mapper.notifications.unmap.error.head": "Erros de remoção de mapeamento", // "collection.edit.item-mapper.notifications.unmap.success.content": "Successfully removed the mappings of {{amount}} items.", - "collection.edit.item-mapper.notifications.unmap.success.content": "Removeu os mapeamentps de {{amount}} item(ns) com sucesso.", + "collection.edit.item-mapper.notifications.unmap.success.content": "Removeu os mapeamentos de {{amount}} item(ns) com sucesso.", // "collection.edit.item-mapper.notifications.unmap.success.head": "Remove mapping completed", "collection.edit.item-mapper.notifications.unmap.success.head": "Remoção de mapeamentos completa", @@ -1222,16 +1356,23 @@ // "collection.edit.item-mapper.remove": "Remove selected item mappings", "collection.edit.item-mapper.remove": "Remover mapeamentos selecionados", + // "collection.edit.item-mapper.search-form.placeholder": "Search items...", + "collection.edit.item-mapper.search-form.placeholder": "Pesquisar items...", + // "collection.edit.item-mapper.tabs.browse": "Browse mapped items", "collection.edit.item-mapper.tabs.browse": "Navegar por itens mapeados", // "collection.edit.item-mapper.tabs.map": "Map new items", "collection.edit.item-mapper.tabs.map": "Mapear novos itens", + // "collection.edit.logo.delete.title": "Delete logo", + "collection.edit.logo.delete.title": "Apagar logótipo", - + // "collection.edit.logo.delete-undo.title": "Undo delete", + "collection.edit.logo.delete-undo.title": "Não apagar", + // "collection.edit.logo.label": "Collection logo", - "collection.edit.logo.label": "Logotipo da Coleção", + "collection.edit.logo.label": "Logótipo da coleção", // "collection.edit.logo.notifications.add.error": "Uploading Collection logo failed. Please verify the content before retrying.", "collection.edit.logo.notifications.add.error": "Falha ao carregar o logotipo da coleção. Verifique o ficheiro antes de tentar de novo.", @@ -1240,7 +1381,7 @@ "collection.edit.logo.notifications.add.success": "O logotipo da coleção foi carregado com sucesso.", // "collection.edit.logo.notifications.delete.success.title": "Logo deleted", - "collection.edit.logo.notifications.delete.success.title": "Logo removido", + "collection.edit.logo.notifications.delete.success.title": "Logótipo apagado", // "collection.edit.logo.notifications.delete.success.content": "Successfully deleted the collection's logo", "collection.edit.logo.notifications.delete.success.content": "O logotipo da coleção foi apagado com sucesso", @@ -1249,41 +1390,46 @@ "collection.edit.logo.notifications.delete.error.title": "Erro ao apagar o logotipo", // "collection.edit.logo.upload": "Drop a Collection Logo to upload", - "collection.edit.logo.upload": "Arraste um logotipo da coleção para carregar", - - + "collection.edit.logo.upload": "Arraste um logótipo da coleção para carregar", // "collection.edit.notifications.success": "Successfully edited the Collection", "collection.edit.notifications.success": "Coleção editada com sucesso", - // "collection.edit.return": "Return", + // "collection.edit.return": "Back", "collection.edit.return": "Voltar", - - // "collection.edit.tabs.curate.head": "Curate", "collection.edit.tabs.curate.head": "Curadoria", - // "collection.edit.tabs.curate.title": "Collection Edit - Curate", - "collection.edit.tabs.curate.title": "Editar Coleção - Curadoria", + // "collection.edit.tabs.curate.title": "Collection Edit - Curate", + "collection.edit.tabs.curate.title": "Editar coleção - Curadoria", // "collection.edit.tabs.authorizations.head": "Authorizations", "collection.edit.tabs.authorizations.head": "Autorizações", // "collection.edit.tabs.authorizations.title": "Collection Edit - Authorizations", - "collection.edit.tabs.authorizations.title": "Editar Coleção - Autorizações", + "collection.edit.tabs.authorizations.title": "Editar coleção - autorizações", + + // "collection.edit.item.authorizations.load-bundle-button": "Load more bundles", + "collection.edit.item.authorizations.load-bundle-button": "Carregar mais pacotes", + + // "collection.edit.item.authorizations.load-more-button": "Load more", + "collection.edit.item.authorizations.load-more-button": "Carregar mais", + + // "collection.edit.item.authorizations.show-bitstreams-button": "Show bitstream policies for bundle", + "collection.edit.item.authorizations.show-bitstreams-button": "Mostrar as políticas do bitstream para o pacote", // "collection.edit.tabs.metadata.head": "Edit Metadata", - "collection.edit.tabs.metadata.head": "Editar Metadados", + "collection.edit.tabs.metadata.head": "Editar metadados", // "collection.edit.tabs.metadata.title": "Collection Edit - Metadata", - "collection.edit.tabs.metadata.title": "Editar Coleção - Metadados", + "collection.edit.tabs.metadata.title": "Editar coleção - metadados", // "collection.edit.tabs.roles.head": "Assign Roles", - "collection.edit.tabs.roles.head": "Atribuir Papéis", + "collection.edit.tabs.roles.head": "Atribuir perfis", // "collection.edit.tabs.roles.title": "Collection Edit - Roles", - "collection.edit.tabs.roles.title": "Editar Coleção - Papéis", + "collection.edit.tabs.roles.title": "Editar coleção - perfis", // "collection.edit.tabs.source.external": "This collection harvests its content from an external source", "collection.edit.tabs.source.external": "Esta coleção agrega conteúdo de uma fonte externa", @@ -1298,7 +1444,7 @@ "collection.edit.tabs.source.form.head": "Configure uma fonte externa", // "collection.edit.tabs.source.form.metadataConfigId": "Metadata Format", - "collection.edit.tabs.source.form.metadataConfigId": "Formato de Metadados", + "collection.edit.tabs.source.form.metadataConfigId": "Formato de metadados", // "collection.edit.tabs.source.form.oaiSetId": "OAI specific set id", "collection.edit.tabs.source.form.oaiSetId": "ID do set OAI-PMH", @@ -1316,12 +1462,12 @@ "collection.edit.tabs.source.form.options.harvestType.METADATA_ONLY": "Agregar apenas metadados", // "collection.edit.tabs.source.head": "Content Source", - "collection.edit.tabs.source.head": "Conteúdo fonte", + "collection.edit.tabs.source.head": "Fonte externa", // "collection.edit.tabs.source.notifications.discarded.content": "Your changes were discarded. To reinstate your changes click the 'Undo' button", "collection.edit.tabs.source.notifications.discarded.content": "As alterações foram ignoradas. Para regravar as alterações clique no botão ´Voltar'", - // "collection.edit.tabs.source.notifications.discarded.title": "Changed discarded", + // "collection.edit.tabs.source.notifications.discarded.title": "Changes discarded", "collection.edit.tabs.source.notifications.discarded.title": "Alterações descartadas", // "collection.edit.tabs.source.notifications.invalid.content": "Your changes were not saved. Please make sure all fields are valid before you save.", @@ -1337,16 +1483,14 @@ "collection.edit.tabs.source.notifications.saved.title": "Conteúdo fonte guardado", // "collection.edit.tabs.source.title": "Collection Edit - Content Source", - "collection.edit.tabs.source.title": "Editar Coleção - Conteúdo fonte", - - + "collection.edit.tabs.source.title": "Editar coleção - conteúdo fonte", // "collection.edit.template.add-button": "Add", "collection.edit.template.add-button": "Adicionar", // "collection.edit.template.breadcrumbs": "Item template", - "collection.edit.template.breadcrumbs": "Template do Item", - + "collection.edit.template.breadcrumbs": "Template do item", + // "collection.edit.template.cancel": "Cancel", "collection.edit.template.cancel": "Cancelar", @@ -1356,22 +1500,26 @@ // "collection.edit.template.edit-button": "Edit", "collection.edit.template.edit-button": "Editar", + // "collection.edit.template.error": "An error occurred retrieving the template item", + "collection.edit.template.error": "Ocorreu um erro na recuperação do template do item", + // "collection.edit.template.head": "Edit Template Item for Collection \"{{ collection }}\"", - "collection.edit.template.head": "Editar Modelo do Item para a Coleção \"{{ collection }}\"", + "collection.edit.template.head": "Editar template do item para a coleção \"{{ collection }}\"", // "collection.edit.template.label": "Template item", - "collection.edit.template.label": "Modelo do item", + "collection.edit.template.label": "Template do item", + + // "collection.edit.template.loading": "Loading template item...", + "collection.edit.template.loading": "A carregar o template do item...", // "collection.edit.template.notifications.delete.error": "Failed to delete the item template", "collection.edit.template.notifications.delete.error": "Erro ao apagar o template do item", // "collection.edit.template.notifications.delete.success": "Successfully deleted the item template", - "collection.edit.template.notifications.delete.success": "Template do Item apagado com sucesso", + "collection.edit.template.notifications.delete.success": "Template do item apagado com sucesso", // "collection.edit.template.title": "Edit Template Item", - "collection.edit.template.title": "Editar Modelo do Item", - - + "collection.edit.template.title": "Editar template do item", // "collection.form.abstract": "Short Description", "collection.form.abstract": "Descrição curta", @@ -1397,15 +1545,14 @@ // "collection.form.title": "Name", "collection.form.title": "Nome", - - - // "collection.listelement.badge": "Collection", - "collection.listelement.badge": "Coleção", - - - + // "collection.form.entityType": "Entity Type", + "collection.form.entityType": "Tipo de entidade", + + // "collection.listelement.badge": "collection", + "collection.listelement.badge": "coleção", + // "collection.page.browse.recent.head": "Recent Submissions", - "collection.page.browse.recent.head": "Submissões Recentes", + "collection.page.browse.recent.head": "Entradas recentes", // "collection.page.browse.recent.empty": "No items to show", "collection.page.browse.recent.empty": "Nenhum item a exibir", @@ -1413,8 +1560,8 @@ // "collection.page.edit": "Edit this collection", "collection.page.edit": "Editar esta coleção", - // "collection.page.handle": "Permanent URI for this collection", - "collection.page.handle": "URI Permanente para esta coleção", + // "collection.page.handle": "Permanent URI for this collection:", + "collection.page.handle": "URI permanente para esta coleção:", // "collection.page.license": "License", "collection.page.license": "Licença", @@ -1422,8 +1569,6 @@ // "collection.page.news": "News", "collection.page.news": "Notícias", - - // "collection.select.confirm": "Confirm selected", "collection.select.confirm": "Confirmar seleção", @@ -1433,26 +1578,92 @@ // "collection.select.table.title": "Title", "collection.select.table.title": "Título", + // "collection.source.controls.head": "Harvest Controls", + "collection.source.controls.head": "Controlos de importação", + // "collection.source.controls.test.submit.error": "Something went wrong with initiating the testing of the settings", + "collection.source.controls.test.submit.error": "Algo correu mal ao inicar os testes das configurações", + + // "collection.source.controls.test.failed": "The script to test the settings has failed", + "collection.source.controls.test.failed": "O script para testar as configurações falhou!", + + // "collection.source.controls.test.completed": "The script to test the settings has successfully finished", + "collection.source.controls.test.completed": "O script para testar as configurações terminou com sucesso!", + + // "collection.source.controls.test.submit": "Test configuration", + "collection.source.controls.test.submit": "Configuração de teste", + + // "collection.source.controls.test.running": "Testing configuration...", + "collection.source.controls.test.running": "A testar as configurações...", + + // "collection.source.controls.import.submit.success": "The import has been successfully initiated", + "collection.source.controls.import.submit.success": "A importação iniciou com sucesso.", + + // "collection.source.controls.import.submit.error": "Something went wrong with initiating the import", + "collection.source.controls.import.submit.error": "Algo correu mal ao iniciar a importação", + + // "collection.source.controls.import.submit": "Import now", + "collection.source.controls.import.submit": "Importar agora", + + // "collection.source.controls.import.running": "Importing...", + "collection.source.controls.import.running": "Importar...", + + // "collection.source.controls.import.failed": "An error occurred during the import", + "collection.source.controls.import.failed": "Ocorreu um erro durante a importação", + + // "collection.source.controls.import.completed": "The import completed", + "collection.source.controls.import.completed": "A importação encontra-se completa", + + // "collection.source.controls.reset.submit.success": "The reset and reimport has been successfully initiated", + "collection.source.controls.reset.submit.success": "A reposição e re-importação iniciou-se com sucesso", + + // "collection.source.controls.reset.submit.error": "Something went wrong with initiating the reset and reimport", + "collection.source.controls.reset.submit.error": "Algo correu mal com a reposição e re-importação", + + // "collection.source.controls.reset.failed": "An error occurred during the reset and reimport", + "collection.source.controls.reset.failed": "Ocorreu um erro durante a reposição e a re-importação", + + // "collection.source.controls.reset.completed": "The reset and reimport completed", + "collection.source.controls.reset.completed": "A reposição e a re-importação encontram-se completas", + + // "collection.source.controls.reset.submit": "Reset and reimport", + "collection.source.controls.reset.submit": "Repor e re-importar", + + // "collection.source.controls.reset.running": "Resetting and reimporting...", + "collection.source.controls.reset.running": "Repor e re-importar...", + + // "collection.source.controls.harvest.status": "Harvest status:", + "collection.source.controls.harvest.status": "Estado da importação:", + + // "collection.source.controls.harvest.start": "Harvest start time:", + "collection.source.controls.harvest.start": "Hora de início da importação:", + + // "collection.source.controls.harvest.last": "Last time harvested:", + "collection.source.controls.harvest.start": "Hora de fim da importação:", + + // "collection.source.controls.harvest.message": "Harvest info:", + "collection.source.controls.harvest.message": "Informação sobre a importação:", + + // "collection.source.controls.harvest.no-information": "N/A", + "collection.source.controls.harvest.no-information": "N/A", // "collection.source.update.notifications.error.content": "The provided settings have been tested and didn't work.", "collection.source.update.notifications.error.content": "As configurações providenciadas foram testadas mas não funcionam.", // "collection.source.update.notifications.error.title": "Server Error", - "collection.source.update.notifications.error.title": "Erro no Servidor", + "collection.source.update.notifications.error.title": "Erro no servidor", - - - // "communityList.tabTitle": "DSpace - Community List", - "communityList.tabTitle": "DSpace - Lista de Comunidades", + // "communityList.breadcrumbs": "Community List", + "communityList.breadcrumbs": "Lista de comunidades", + + // "communityList.tabTitle": "Community List", + "communityList.tabTitle": "Lista de comunidades", // "communityList.title": "List of Communities", - "communityList.title": "Lista de Comunidades", + "communityList.title": "Lista de comunidades", // "communityList.showMore": "Show More", - "communityList.showMore": "Mostrar Mais", - - + "communityList.showMore": "Mostrar mais", // "community.create.head": "Create a Community", "community.create.head": "Criar uma comunidade", @@ -1464,7 +1675,7 @@ "community.create.sub-head": "Criar uma Sub-Comunidade para Comunidade {{ parent }}", // "community.curate.header": "Curate Community: {{community}}", - "community.curate.header": "Curar Comunidade: {{community}}", + "community.curate.header": "Curar comunidade: {{community}}", // "community.delete.cancel": "Cancel", "community.delete.cancel": "Cancelar", @@ -1472,11 +1683,14 @@ // "community.delete.confirm": "Confirm", "community.delete.confirm": "Confirmar", + // "community.delete.processing": "Deleting...", + "community.delete.processing": "A apagar...", + // "community.delete.head": "Delete Community", - "community.delete.head": "Apagar Comunidade", + "community.delete.head": "Apagar comunidade", // "community.delete.notification.fail": "Community could not be deleted", - "community.delete.notification.fail": "Não foi possível apagar a Comunidade", + "community.delete.notification.fail": "Não foi possível apagar a comunidade", // "community.delete.notification.success": "Successfully deleted community", "community.delete.notification.success": "Comunidade apagada com sucesso", @@ -1488,34 +1702,37 @@ "community.edit.delete": "Apagar esta comunidade", // "community.edit.head": "Edit Community", - "community.edit.head": "Editar Comunidade", + "community.edit.head": "Editar comunidade", // "community.edit.breadcrumbs": "Edit Community", "community.edit.breadcrumbs": "Editar Comunidade", - + // "community.edit.logo.delete.title": "Delete logo", + "community.edit.logo.delete.title": "Apagar logótipo", + + // "community.edit.logo.delete-undo.title": "Undo delete", + "community.edit.logo.delete-undo.title": "Não apagar logótipo", + // "community.edit.logo.label": "Community logo", - "community.edit.logo.label": "Logo da Comunidade", + "community.edit.logo.label": "Logótipo da comunidade", // "community.edit.logo.notifications.add.error": "Uploading Community logo failed. Please verify the content before retrying.", - "community.edit.logo.notifications.add.error": "Falha ao carregar o logotipo da comunidade. Verifique o conteúdo antes de tentar de novo.", + "community.edit.logo.notifications.add.error": "Falha ao carregar o logótipo da comunidade. Verifique o conteúdo antes de tentar de novo.", // "community.edit.logo.notifications.add.success": "Upload Community logo successful.", - "community.edit.logo.notifications.add.success": "Logotipo da comunindade carregado com sucesso.", + "community.edit.logo.notifications.add.success": "Logótipo da comunindade carregado com sucesso.", // "community.edit.logo.notifications.delete.success.title": "Logo deleted", - "community.edit.logo.notifications.delete.success.title": "Logotipo apagado", + "community.edit.logo.notifications.delete.success.title": "Logótipo apagado", // "community.edit.logo.notifications.delete.success.content": "Successfully deleted the community's logo", - "community.edit.logo.notifications.delete.success.content": "O logotipo da comuindade foi apagado com sucesso", + "community.edit.logo.notifications.delete.success.content": "O logótipo da comuindade foi apagado com sucesso", // "community.edit.logo.notifications.delete.error.title": "Error deleting logo", - "community.edit.logo.notifications.delete.error.title": "Erro ao apagar o logotipo", + "community.edit.logo.notifications.delete.error.title": "Erro ao apagar o logótipo", // "community.edit.logo.upload": "Drop a Community Logo to upload", - "community.edit.logo.upload": "Arraste um logotipo da comunidade para carregar", - - + "community.edit.logo.upload": "Arraste um logótipo da comunidade para carregar", // "community.edit.notifications.success": "Successfully edited the Community", "community.edit.notifications.success": "Comunidade editada com sucesso", @@ -1526,54 +1743,53 @@ // "community.edit.notifications.error": "An error occured while editing the Community", "community.edit.notifications.error": "Ocorreu um erro ao editar a comunidade", - // "community.edit.return": "Return", + // "community.edit.return": "Back", "community.edit.return": "Voltar", - - // "community.edit.tabs.curate.head": "Curate", "community.edit.tabs.curate.head": "Curadoria", // "community.edit.tabs.curate.title": "Community Edit - Curate", - "community.edit.tabs.curate.title": "Editar Comunidade - Curadoria", + "community.edit.tabs.curate.title": "Editar comunidade - curadoria", // "community.edit.tabs.metadata.head": "Edit Metadata", - "community.edit.tabs.metadata.head": "Editar Metadados", + "community.edit.tabs.metadata.head": "Editar metadados", // "community.edit.tabs.metadata.title": "Community Edit - Metadata", - "community.edit.tabs.metadata.title": "Editar Comunidade - Metadados", + "community.edit.tabs.metadata.title": "Editar comunidade - metadados", // "community.edit.tabs.roles.head": "Assign Roles", - "community.edit.tabs.roles.head": "Atribuir Papéis", + "community.edit.tabs.roles.head": "Atribuir perfis", // "community.edit.tabs.roles.title": "Community Edit - Roles", - "community.edit.tabs.roles.title": "Editar Comunidade - Papéis", + "community.edit.tabs.roles.title": "Editar comunidade - perfis", // "community.edit.tabs.authorizations.head": "Authorizations", "community.edit.tabs.authorizations.head": "Autorizações", - + // "community.edit.tabs.authorizations.title": "Community Edit - Authorizations", - "community.edit.tabs.authorizations.title": "Editar Comunidade - Autorizações", - - + "community.edit.tabs.authorizations.title": "Editar comunidade - autorizações", // "community.listelement.badge": "Community", "community.listelement.badge": "Comunidade", - - // "comcol-role.edit.no-group": "None", "comcol-role.edit.no-group": "Nenhum", // "comcol-role.edit.create": "Create", "comcol-role.edit.create": "Criar", + // "comcol-role.edit.create.error.title": "Failed to create a group for the '{{ role }}' role", + "comcol-role.edit.create.error.title": "Falha na criação de um grupo para o perfil '{{ role }}'", + // "comcol-role.edit.restrict": "Restrict", "comcol-role.edit.restrict": "Restrito", // "comcol-role.edit.delete": "Delete", "comcol-role.edit.delete": "Apagar", + // "comcol-role.edit.delete.error.title": "Failed to delete the '{{ role }}' role's group", + "comcol-role.edit.delete.error.title": "Falha na remoção do '{{ role }}' nos perfis do grupo", // "comcol-role.edit.community-admin.name": "Administrators", "comcol-role.edit.community-admin.name": "Administradores", @@ -1581,63 +1797,60 @@ // "comcol-role.edit.collection-admin.name": "Administrators", "comcol-role.edit.collection-admin.name": "Administradores", - // "comcol-role.edit.community-admin.description": "Community administrators can create sub-communities or collections, and manage or assign management for those sub-communities or collections. In addition, they decide who can submit items to any sub-collections, edit item metadata (after submission), and add (map) existing items from other collections (subject to authorization).", - "comcol-role.edit.community-admin.description": "Os administradores de Comunidade podem criar sub-comunidades e coleções, assim como gerir ou delegar a gestão dessas sub-comunidade ou coleções. Além disso, decidem quem pode submeter itens em qualquer coleção, editar metadados (após submissão), e mapear itens de outras coleções (sujeito a autorização).", + "comcol-role.edit.community-admin.description": "Os 'Administradores de comunidades' podem criar 'sub-comunidades' e/ou 'coleções', podem também gerir ou delegar a gestão dessas 'sub-comunidade' ou 'coleções'. Adicionalmente, decidem quem pode depositar itens em coleções, editar metadados (após o depósito) e mapear itens de outras coleções (sujeito a autorização).", // "comcol-role.edit.collection-admin.description": "Collection administrators decide who can submit items to the collection, edit item metadata (after submission), and add (map) existing items from other collections to this collection (subject to authorization for that collection).", - "comcol-role.edit.collection-admin.description": "Os administradores de coleção decidem quem pode submeter itens a uma coleção, editar metadados (após submissão), e mapear itens de outras coleções (sujeito a autorização para essa coleção).", - + "comcol-role.edit.collection-admin.description": "Os 'Administradores de coleção' decidem quem pode depositar itens a uma coleção, editar metadados (após o depósito), e mapear itens de outras coleções (sujeito a autorização para essa coleção).", // "comcol-role.edit.submitters.name": "Submitters", "comcol-role.edit.submitters.name": "Depositantes", // "comcol-role.edit.submitters.description": "The E-People and Groups that have permission to submit new items to this collection.", - "comcol-role.edit.submitters.description": "Os Utilizadores e Grupos que possuem permissões de depósito nesta coleção.", - + "comcol-role.edit.submitters.description": "Os 'Utilizadores' e 'Grupos' que possuem permissões de depósito nesta coleção.", // "comcol-role.edit.item_read.name": "Default item read access", - "comcol-role.edit.item_read.name": "acesso de Leitura Padrão ao item", + "comcol-role.edit.item_read.name": "Acesso de leitura ao item predefinido (DEFAULT_ITEM_READ)", // "comcol-role.edit.item_read.description": "E-People and Groups that can read new items submitted to this collection. Changes to this role are not retroactive. Existing items in the system will still be viewable by those who had read access at the time of their addition.", - "comcol-role.edit.item_read.description": "Utilizadores e Grupos que podem ver itens submetidos nesta coleção. As alterações a este papel não são retroativas. Os itens existentes no sistema ainda poderão ser vistos por aqueles que tiveram acesso de leitura no momento de sua adição.", + "comcol-role.edit.item_read.description": "'Utilizadores' e 'Grupos' que podem ver itens depositados nesta coleção. As alterações feitas a este papel não são retroativas. Os itens existentes no sistema ainda poderão ser vistos por aqueles que tiveram acesso de leitura no momento da sua adição.", // "comcol-role.edit.item_read.anonymous-group": "Default read for incoming items is currently set to Anonymous.", - "comcol-role.edit.item_read.anonymous-group": "A definição de Leitura padrão de novos itens está definida para Utilizadores Anónimos.", - + "comcol-role.edit.item_read.anonymous-group": "A leitura de novos itens (Item Read) está predefinida para utilizadores anónimos.", // "comcol-role.edit.bitstream_read.name": "Default bitstream read access", - "comcol-role.edit.bitstream_read.name": "Leitura padrão de ficheiros", + "comcol-role.edit.bitstream_read.name": "Leitura predefinida de ficheiros (DEFAULT_BITSTREAM_READ)", // "comcol-role.edit.bitstream_read.description": "Community administrators can create sub-communities or collections, and manage or assign management for those sub-communities or collections. In addition, they decide who can submit items to any sub-collections, edit item metadata (after submission), and add (map) existing items from other collections (subject to authorization).", - "comcol-role.edit.bitstream_read.description": "Os administradores de Comunidade podem criar sub-comunidades e coleções, assim como gerir ou delegar a gestão dessas sub-comunidade ou coleções. Além disso, decidem quem pode submeter itens em qualquer coleção, editar metadados (após submissão), e mapear itens de outras coleções (sujeito a autorização).", + "comcol-role.edit.bitstream_read.description": "Os 'Administradores de comunidades' podem criar sub-comunidades e coleções, bem como gerir ou delegar a gestão dessas sub-comunidade ou coleções. Adicionalmente, decidem quem pode depositar itens em qualquer coleção, editar metadados (após depósito) e mapear itens de outras coleções (sujeito a autorização).", // "comcol-role.edit.bitstream_read.anonymous-group": "Default read for incoming bitstreams is currently set to Anonymous.", - "comcol-role.edit.bitstream_read.anonymous-group": "A definição de Leitura padrão de novos ficheiros está definida para Utilizadores Anónimos.", - + "comcol-role.edit.bitstream_read.anonymous-group": "A leitura de novos ficheiros (Bitstream Read) está predefinida para utilizadores anónimos.", // "comcol-role.edit.editor.name": "Editors", "comcol-role.edit.editor.name": "Editores", // "comcol-role.edit.editor.description": "Editors are able to edit the metadata of incoming submissions, and then accept or reject them.", - "comcol-role.edit.editor.description": "Os Editores podem editar os metadados, e depois aceitar ou rejeitar as submissões.", - - + "comcol-role.edit.editor.description": "Os 'Editores' podem aceitar ou rejeitar os depósitos e podem editar os seus metadados.", + // "comcol-role.edit.finaleditor.name": "Final editors", - "comcol-role.edit.finaleditor.name": "Editores Finais", + "comcol-role.edit.finaleditor.name": "Validadores finais", // "comcol-role.edit.finaleditor.description": "Final editors are able to edit the metadata of incoming submissions, but will not be able to reject them.", - "comcol-role.edit.finaleditor.description": "Os Editores Finais podem editar os metadados de uma submissão, mas não os podem rejeitar.", - + "comcol-role.edit.finaleditor.description": "Os 'Validadores finais' podem editar os metadados de um depósito, mas não os podem rejeitar.", // "comcol-role.edit.reviewer.name": "Reviewers", "comcol-role.edit.reviewer.name": "Revisores", // "comcol-role.edit.reviewer.description": "Reviewers are able to accept or reject incoming submissions. However, they are not able to edit the submission's metadata.", - "comcol-role.edit.reviewer.description": "Os Revisores podem aceitar ou rejeitar as submissões enviadas. Contudo, não podem editar os metadados das submissões.", - - + "comcol-role.edit.reviewer.description": "Os 'Revisores' podem aceitar ou rejeitar os depósitos, mas não podem editar os seus metadados.", + // "comcol-role.edit.scorereviewers.name": "Score Reviewers", + "comcol-role.edit.scorereviewers.name": "Pontuar revisores", + + // "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": "Os 'Revisores' podem dar uma pontuação aos depósitos recebidos, isto irá determinar se o depósito será rejeitado ou não.", + // "community.form.abstract": "Short Description", "community.form.abstract": "Descrição curta", @@ -1648,7 +1861,7 @@ "community.form.errors.title.required": "Por favor indique um nome para a comunidade", // "community.form.rights": "Copyright text (HTML)", - "community.form.rights": "Texto de direito de cópia (HTML)", + "community.form.rights": "Texto de Copyright (HTML)", // "community.form.tableofcontents": "News (HTML)", "community.form.tableofcontents": "Notícias (HTML)", @@ -1660,7 +1873,7 @@ "community.page.edit": "Editar esta comunidade", // "community.page.handle": "Permanent URI for this community", - "community.page.handle": "URI Permanente desta comunidade", + "community.page.handle": "URI permanente desta comunidade:", // "community.page.license": "License", "community.page.license": "Licença", @@ -1669,15 +1882,13 @@ "community.page.news": "Notícias", // "community.all-lists.head": "Subcommunities and Collections", - "community.all-lists.head": "Sub-Comunidade e Coleções", + "community.all-lists.head": "Sub-comunidade e coleções", // "community.sub-collection-list.head": "Collections of this Community", - "community.sub-collection-list.head": "Coleções desta Comunidade", + "community.sub-collection-list.head": "Coleções desta comunidade", // "community.sub-community-list.head": "Communities of this Community", - "community.sub-community-list.head": "Comunidades desta Comunidade", - - + "community.sub-community-list.head": "Comunidades desta comunidade", // "cookies.consent.accept-all": "Accept all", "cookies.consent.accept-all": "Aceitar todos", @@ -1700,6 +1911,12 @@ // "cookies.consent.app.required.title": "(always required)", "cookies.consent.app.required.title": "(sempre necessária)", + // "cookies.consent.app.disable-all.description": "Use this switch to enable or disable all services.", + "cookies.consent.app.disable-all.description": "Utilize este interruptor para ativar ou desativar todos os serviços.", + + // "cookies.consent.app.disable-all.title": "Enable or disable all services", + "cookies.consent.app.disable-all.title": "Ativar ou desativar todos os serviços", + // "cookies.consent.update": "There were changes since your last visit, please update your consent.", "cookies.consent.update": "Existem alterações desde a sua última visita, atualize o seu consentimento.", @@ -1708,26 +1925,42 @@ // "cookies.consent.decline": "Decline", "cookies.consent.decline": "Rejeitar", + + // "cookies.consent.ok": "That's ok", + "cookies.consent.ok": "Concordo", + + // "cookies.consent.save": "Save", + "cookies.consent.save": "Guardar", + + // "cookies.consent.content-notice.title": "Cookie Consent", + "cookies.consent.content-notice.title": "Consentir cookies", // "cookies.consent.content-notice.description": "We collect and process your personal information for the following purposes: Authentication, Preferences, Acknowledgement and Statistics.
    To learn more, please read our {privacyPolicy}.", - "cookies.consent.content-notice.description": "Coletamos e processamos informação pessoal para os seguintes propósitos: Autenticação, Guardar Preferências, Termos de Uso e Estatísticas.
    To learn more, please read our {privacyPolicy}.", + "cookies.consent.content-notice.description": "Recolhemos e processamos informação pessoal para os seguintes propósitos: Autenticação, Guardar Preferências, Termos de Uso e Estatísticas.
    Para saber mais, por favor leia a nossa {privacyPolicy}.", + + // "cookies.consent.content-notice.description.no-privacy": "We collect and process your personal information for the following purposes: Authentication, Preferences, Acknowledgement and Statistics.", + "cookies.consent.content-notice.description.no-privacy": "Recolhemos e processamos as suas informações pessoais para os seguintes fins: Autenticação, Preferências, Reconhecimento e Estatísticas.", // "cookies.consent.content-notice.learnMore": "Customize", "cookies.consent.content-notice.learnMore": "Pesonalizar", // "cookies.consent.content-modal.description": "Here you can see and customize the information that we collect about you.", - "cookies.consent.content-modal.description": "Aqui pode ver e personalizar a informação pessoal que coletamos sobre si.", + "cookies.consent.content-modal.description": "Aqui pode ver e personalizar a informação pessoal que recolhemos sobre si.", // "cookies.consent.content-modal.privacy-policy.name": "privacy policy", "cookies.consent.content-modal.privacy-policy.name": "política de privacidade", // "cookies.consent.content-modal.privacy-policy.text": "To learn more, please read our {privacyPolicy}.", "cookies.consent.content-modal.privacy-policy.text": "Para saber mais, leia a {privacyPolicy}.", - + // "cookies.consent.content-modal.title": "Information that we collect", - "cookies.consent.content-modal.title": "Informação que coletamos", - + "cookies.consent.content-modal.title": "Informação que recolhemos", + // "cookies.consent.content-modal.services": "Services", + "cookies.consent.content-modal.services": "Serviços", + + // "cookies.consent.content-modal.service": "Service", + "cookies.consent.content-modal.service": "Serviço", // "cookies.consent.app.title.authentication": "Authentication", "cookies.consent.app.title.authentication": "Autenticação", @@ -1735,22 +1968,17 @@ // "cookies.consent.app.description.authentication": "Required for signing you in", "cookies.consent.app.description.authentication": "Obrigatório para iniciar sessão", - // "cookies.consent.app.title.preferences": "Preferences", "cookies.consent.app.title.preferences": "Preferências", // "cookies.consent.app.description.preferences": "Required for saving your preferences", "cookies.consent.app.description.preferences": "Obrigatório para guardar as suas preferências", - - // "cookies.consent.app.title.acknowledgement": "Acknowledgement", "cookies.consent.app.title.acknowledgement": "Termos de Uso", // "cookies.consent.app.description.acknowledgement": "Required for saving your acknowledgements and consents", - "cookies.consent.app.description.acknowledgement": "Requerido para guardar os Termos de uso e Consentimento", - - + "cookies.consent.app.description.acknowledgement": "Obrigatório para guardar os nossos 'Termos de Uso' e 'Consentimentos'", // "cookies.consent.app.title.google-analytics": "Google Analytics", "cookies.consent.app.title.google-analytics": "Google Analytics", @@ -1758,7 +1986,11 @@ // "cookies.consent.app.description.google-analytics": "Allows us to track statistical data", "cookies.consent.app.description.google-analytics": "Permite-nos rastrear dados estatísticos", - + // "cookies.consent.app.title.google-recaptcha": "Google reCaptcha", + "cookies.consent.app.title.google-recaptcha": "Google reCaptcha", + + // "cookies.consent.app.description.google-recaptcha": "We use google reCAPTCHA service during registration and password recovery", + "cookies.consent.app.description.google-recaptcha": "Utilizamos o serviço Google reCAPTCHA durante o registo e recuperação de palavra-passe", // "cookies.consent.purpose.functional": "Functional", "cookies.consent.purpose.functional": "Funcional", @@ -1766,15 +1998,23 @@ // "cookies.consent.purpose.statistical": "Statistical", "cookies.consent.purpose.statistical": "Estatísticos", + // "cookies.consent.purpose.registration-password-recovery": "Registration and Password recovery", + "cookies.consent.purpose.registration-password-recovery": "Registo e recuperação de senha", - // "curation-task.task.checklinks.label": "Check Links in Metadata", - "curation-task.task.checklinks.label": "Verifica ligações nos metadados", + // "cookies.consent.purpose.sharing": "Sharing", + "cookies.consent.purpose.sharing": "Partilha", + + // "curation-task.task.citationpage.label": "Generate Citation Page", + "curation-task.task.citationpage.label": "Gerar página de citações", + + // "curation-task.task.checklinks.label": "Check Links in Metadata", + "curation-task.task.checklinks.label": "Verifica ligações nos metadados", // "curation-task.task.noop.label": "NOOP", "curation-task.task.noop.label": "NOOP", // "curation-task.task.profileformats.label": "Profile Bitstream Formats", - "curation-task.task.profileformats.label": "Perfil dos Formatos de Ficheiro", + "curation-task.task.profileformats.label": "Perfil dos formatos de ficheiro", // "curation-task.task.requiredmetadata.label": "Check for Required Metadata", "curation-task.task.requiredmetadata.label": "Verifica metadados obrigatórios", @@ -1783,15 +2023,16 @@ "curation-task.task.translate.label": "Tradutor Microsoft", // "curation-task.task.vscan.label": "Virus Scan", - "curation-task.task.vscan.label": "Scan de Vírus", - - + "curation-task.task.vscan.label": "Scan de vírus", + + // "curation-task.task.register-doi.label": "Register DOI", + "curation-task.task.register-doi.label": "Registo DOI", // "curation.form.task-select.label": "Task:", "curation.form.task-select.label": "Tarefa:", // "curation.form.submit": "Start", - "curation.form.submit": "Início", + "curation.form.submit": "Iniciar", // "curation.form.submit.success.head": "The curation task has been started successfully", "curation.form.submit.success.head": "A tarefa de curadoria iniciou com sucesso", @@ -1805,13 +2046,35 @@ // "curation.form.submit.error.content": "An error occured when trying to start the curation task.", "curation.form.submit.error.content": "Ocorreu um erro ao tentar iniciar a tarefa de curadoria.", + // "curation.form.submit.error.invalid-handle": "Couldn't determine the handle for this object", + "curation.form.submit.error.invalid-handle": "Não foi possível determinar o handle para este objecto", + // "curation.form.handle.label": "Handle:", "curation.form.handle.label": "Handle:", // "curation.form.handle.hint": "Hint: Enter [your-handle-prefix]/0 to run a task across entire site (not all tasks may support this capability)", "curation.form.handle.hint": "Dica: Introduza [o-seu-prefixo-handle]/0 para executar a tarefa em todo o repositório (nem todas as tarefas são compatíveis com esta opção)", + // "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": "Caro {{ recipientName }},\ em resposta ao seu pedido, lamento informá-lo que não me é possível enviar-lhe uma cópia do(s) Ficheiro(s) que solicitou, relativamente ao documento: \"{{ itemUrl }}\" ({{ itemName }}), do qual sou autor.\n\n Com os melhores cumprimentos,\n {{ authorName }} <{{ authorEmail }}>", + + // "deny-request-copy.email.subject": "Request copy of document", + "deny-request-copy.email.subject": "Solicitar cópia ao autor", + + // "deny-request-copy.error": "An error occurred", + "deny-request-copy.error": "Ocorreu um erro!", + // "deny-request-copy.header": "Deny document copy request", + "deny-request-copy.header": "Declinar o pedido de cópia", + + // "deny-request-copy.intro": "This message will be sent to the applicant of the request", + "deny-request-copy.intro": "Esta será a mensagem enviada ao requerente do pediodo de cópia:", + + // "deny-request-copy.success": "Successfully denied item request", + "deny-request-copy.success": "Pedido de cópia recusado com sucesso!", + + // "dso.name.untitled": "Untitled", + "dso.name.untitled": "Sem título", // "dso-selector.create.collection.head": "New collection", "dso-selector.create.collection.head": "Nova coleção", @@ -1822,6 +2085,9 @@ // "dso-selector.create.community.head": "New community", "dso-selector.create.community.head": "Nova comunidade", + // "dso-selector.create.community.or-divider": "or", + "dso-selector.create.community.or-divider": "ou", + // "dso-selector.create.community.sub-level": "Create a new community in", "dso-selector.create.community.sub-level": "Criar uma nova coleção em", @@ -1835,7 +2101,7 @@ "dso-selector.create.item.sub-level": "Criar um novo item em", // "dso-selector.create.submission.head": "New submission", - "dso-selector.create.submission.head": "Nova submissão", + "dso-selector.create.submission.head": "Novo depósito", // "dso-selector.edit.collection.head": "Edit collection", "dso-selector.edit.collection.head": "Editar coleção", @@ -1846,8 +2112,17 @@ // "dso-selector.edit.item.head": "Edit item", "dso-selector.edit.item.head": "Editar item", + // "dso-selector.error.title": "An error occurred searching for a {{ type }}", + "dso-selector.error.title": "Ocorreu um erro ao procurar por um(a) {{ type }}", + // "dso-selector.export-metadata.dspaceobject.head": "Export metadata from", - "dso-selector.export-metadata.dspaceobject.head": "Exportar metadados de ", + "dso-selector.export-metadata.dspaceobject.head": "Exportar metadados de", + + // "dso-selector.export-batch.dspaceobject.head": "Export Batch (ZIP) from", + "dso-selector.export-batch.dspaceobject.head": "Exportar lote (ZIP) de", + + // "dso-selector.import-batch.dspaceobject.head": "Import batch from", + "dso-selector.import-batch.dspaceobject.head": "Importar lote de", // "dso-selector.no-results": "No {{ type }} found", "dso-selector.no-results": "Nenhum(a) {{ type }} encontrado(a)", @@ -1855,8 +2130,75 @@ // "dso-selector.placeholder": "Search for a {{ type }}", "dso-selector.placeholder": "Pesquisar por um(a) {{ type }}", + // "dso-selector.select.collection.head": "Select a collection", + "dso-selector.select.collection.head": "Selecione uma coleção", + + // "dso-selector.set-scope.community.head": "Select a search scope", + "dso-selector.set-scope.community.head": "Selecione uma pesquisa", + + // "dso-selector.set-scope.community.button": "Search all of DSpace", + "dso-selector.set-scope.community.button": "Pesquisar todo o repositório", + + // "dso-selector.set-scope.community.or-divider": "or", + "dso-selector.set-scope.community.or-divider": "ou", + + // "dso-selector.set-scope.community.input-header": "Search for a community or collection", + "dso-selector.set-scope.community.input-header": "Pesquisar por uma comunidade ou coleção", + // "dso-selector.claim.item.head": "Profile tips", + "dso-selector.claim.item.head": "Dicas de Perfil", + + // "dso-selector.claim.item.body": "These are existing profiles that may be related to you. If you recognize yourself in one of these profiles, select it and on the detail page, among the options, choose to claim it. Otherwise you can create a new profile from scratch using the button below.", + "dso-selector.claim.item.body": "Estes são os perfis existentes que poderão estar relacionados consigo. Se se identificar num destes perfis, selecione-o e na página de detalhes, entre as opções, pode reivindicá-lo. Caso contrário, pode criar um novo perfil de raiz, selecionando o botão em baixo.", + + // "dso-selector.claim.item.not-mine-label": "None of these are mine", + "dso-selector.claim.item.not-mine-label": "Nenhum destes é meu", + + // "dso-selector.claim.item.create-from-scratch": "Create a new one", + "dso-selector.claim.item.create-from-scratch": "Criar novo", + // "dso-selector.results-could-not-be-retrieved": "Something went wrong, please refresh again", + "dso-selector.results-could-not-be-retrieved": "Algo correu mal, por favor repita", + + // "supervision-group-selector.header": "supervision Group Selector", + "supervision-group-selector.header": "Seletor de grupos de supervisão", + + // "supervision-group-selector.select.type-of-order.label": "Select a type of Order", + "supervision-group-selector.select.type-of-order.label": "Selecione um tipo de ordem", + + // "supervision-group-selector.select.type-of-order.option.none": "NONE", + "supervision-group-selector.select.type-of-order.option.none": "NENHUM", + + // "supervision-group-selector.select.type-of-order.option.editor": "EDITOR", + "supervision-group-selector.select.type-of-order.option.editor": "EDITOR", + + // "supervision-group-selector.select.type-of-order.option.observer": "OBSERVER", + "supervision-group-selector.select.type-of-order.option.observer": "OBSERVADOR", + + // "supervision-group-selector.select.group.label": "Select a Group", + "supervision-group-selector.select.group.label": "Selecionar um grupo", + + // "supervision-group-selector.button.cancel": "Cancel", + "supervision-group-selector.button.cancel": "Cancelar", + + // "supervision-group-selector.button.save": "Save", + "supervision-group-selector.button.save": "Guardar", + + // "supervision-group-selector.select.type-of-order.error": "Please select a type of order", + "supervision-group-selector.select.type-of-order.error": "Por favor, selecione um tipo de ordem", + + // "supervision-group-selector.select.group.error": "Please select a group", + "supervision-group-selector.select.group.error": "Por favor selecione um grupo", + + // "supervision-group-selector.notification.create.success.title": "Successfully created supervision order for group {{ name }}", + "supervision-group-selector.notification.create.success.title": "Criada com sucesso ordem de supervisão para o grupo {{ name }}", + + // "supervision-group-selector.notification.create.failure.title": "error", + "supervision-group-selector.notification.create.failure.title": "erro", + + // "supervision-group-selector.notification.create.already-existing" : "A supervision order already exists on this item for selected group", + "supervision-group-selector.notification.create.already-existing" : "Já existe uma ordem de supervisão sobre este item para grupo selecionado", + // "confirmation-modal.export-metadata.header": "Export metadata for {{ dsoName }}", "confirmation-modal.export-metadata.header": "Exportar metadados para {{ dsoName }}", @@ -1869,6 +2211,18 @@ // "confirmation-modal.export-metadata.confirm": "Export", "confirmation-modal.export-metadata.confirm": "Exportar", + // "confirmation-modal.export-batch.header": "Export batch (ZIP) for {{ dsoName }}", + "confirmation-modal.export-batch.header": "Exportar lote (ZIP) para {{ dsoName }}", + + // "confirmation-modal.export-batch.info": "Are you sure you want to export batch (ZIP) for {{ dsoName }}", + "confirmation-modal.export-batch.info": "Tem a certeza que quer exportar lote (ZIP) para {{ dsoName }}", + + // "confirmation-modal.export-batch.cancel": "Cancel", + "confirmation-modal.export-batch.cancel": "Cancelar", + + // "confirmation-modal.export-batch.confirm": "Export", + "confirmation-modal.export-batch.confirm": "Exportar", + // "confirmation-modal.delete-eperson.header": "Delete EPerson \"{{ dsoName }}\"", "confirmation-modal.delete-eperson.header": "Apagar Utilizador \"{{ dsoName }}\"", @@ -1881,79 +2235,116 @@ // "confirmation-modal.delete-eperson.confirm": "Delete", "confirmation-modal.delete-eperson.confirm": "Apagar", + // "confirmation-modal.delete-profile.header": "Delete Profile", + "confirmation-modal.delete-profile.header": "Apagar perfil", + + // "confirmation-modal.delete-profile.info": "Are you sure you want to delete your profile", + "confirmation-modal.delete-profile.info": "Tem certeza que pretende apagar o seu perfil", + + // "confirmation-modal.delete-profile.cancel": "Cancel", + "confirmation-modal.delete-profile.cancel": "Cancelar", + + // "confirmation-modal.delete-profile.confirm": "Delete", + "confirmation-modal.delete-profile.confirm": "Apagar", + + // "confirmation-modal.delete-subscription.header": "Delete Subscription", + "confirmation-modal.delete-subscription.header": "Apagar subscrição", + // "confirmation-modal.delete-subscription.info": "Are you sure you want to delete subscription for \"{{ dsoName }}\"", + "confirmation-modal.delete-subscription.info": "Tem a certeza de que pretende apagar a subscrição de \"{{ dsoName }}\"", + + // "confirmation-modal.delete-subscription.cancel": "Cancel", + "confirmation-modal.delete-subscription.cancel": "Cancelar", + + // "confirmation-modal.delete-subscription.confirm": "Delete", + "confirmation-modal.delete-subscription.confirm": "Apagar", + // "error.bitstream": "Error fetching bitstream", - "error.bitstream": "Erro ao aceder ao ficheiro", + "error.bitstream": "Erro ao aceder ao ficheiro!", // "error.browse-by": "Error fetching items", - "error.browse-by": "Erro ao carregar itens", + "error.browse-by": "Erro ao carregar itens!", // "error.collection": "Error fetching collection", - "error.collection": "Erro ao carregar coleção", + "error.collection": "Erro ao carregar coleção!", // "error.collections": "Error fetching collections", - "error.collections": "Erro ao carregar coleções", + "error.collections": "Erro ao carregar coleções!", // "error.community": "Error fetching community", - "error.community": "Erro ao carregar comunidade", + "error.community": "Erro ao carregar comunidade!", // "error.identifier": "No item found for the identifier", - "error.identifier": "Nenhum item encontrado para o identificador", + "error.identifier": "Nenhum item encontrado para o identificador!", // "error.default": "Error", - "error.default": "Erro", + "error.default": "Erro!", // "error.item": "Error fetching item", - "error.item": "Erro ao carregar item", + "error.item": "Erro ao carregar item!", // "error.items": "Error fetching items", - "error.items": "Erro ao carregar itens", + "error.items": "Erro ao carregar itens!", // "error.objects": "Error fetching objects", - "error.objects": "Erro ao carregar objetos", + "error.objects": "Erro ao carregar objetos!", // "error.recent-submissions": "Error fetching recent submissions", - "error.recent-submissions": "Erro ao carregar as submissões recentes", + "error.recent-submissions": "Erro ao carregar depósitos recentes!", // "error.search-results": "Error fetching search results", - "error.search-results": "Erro ao carregar os resultados da pesquisa", + "error.search-results": "Erro ao carregar os resultados da pesquisa!", + + // "error.invalid-search-query": "Search query is not valid. Please check Solr query syntax best practices for further information about this error.", + "error.invalid-search-query": "A query da pesquisa não é válida! Por favor verifique Solr query syntax best practices for further information about this error.", // "error.sub-collections": "Error fetching sub-collections", - "error.sub-collections": "Erro ao carregar sub-coleções", + "error.sub-collections": "Erro ao carregar sub-coleções!", // "error.sub-communities": "Error fetching sub-communities", - "error.sub-communities": "Erro ao carregar sub-comunidade", + "error.sub-communities": "Erro ao carregar sub-comunidade!", // "error.submission.sections.init-form-error": "An error occurred during section initialize, please check your input-form configuration. Details are below :

    ", - "error.submission.sections.init-form-error": "Ocorreu um erro durante a Secção de inicialização, por favor verifique sua configuração de input-form. Detalhes estão abaixo :

    ", + "error.submission.sections.init-form-error": "Ocorreu um erro durante a seção de inicialização, por favor verifique sua configuração de 'input-form'. Detalhes estão abaixo :

    ", // "error.top-level-communities": "Error fetching top-level communities", - "error.top-level-communities": "Erro ao carregar as comunidade de nível superior", + "error.top-level-communities": "Erro ao carregar as comunidade de nível superior!", // "error.validation.license.notgranted": "You must grant this license to complete your submission. If you are unable to grant this license at this time you may save your work and return later or remove the submission.", - "error.validation.license.notgranted": "Você deve concordar com esta licença para completar sua submissão. Se vocẽ não estiver de acordo com esta licença neste momento você pode salvar seu trabalho para continuar depois ou remover a submissão.", + "error.validation.license.notgranted": "Deve concordar com esta licença para completar o depósito. Se não estiver de acordo com a licença ou pretende ponderar, pode guardar este trabalho e retomar posteriormente, ou remover definitivamente este depósito.", // "error.validation.pattern": "This input is restricted by the current pattern: {{ pattern }}.", "error.validation.pattern": "Este campo está restrito ao seguinte padrão: {{ pattern }}.", // "error.validation.filerequired": "The file upload is mandatory", - "error.validation.filerequired": "O carregamento de ficheiros é obrigatório", + "error.validation.filerequired": "O carregamento de ficheiros é obrigatório!", + // "error.validation.required": "This field is required", + "error.validation.required": "Este campo é de preenchimento obrigatório!", + + // "error.validation.NotValidEmail": "This E-mail is not a valid email", + "error.validation.NotValidEmail": "Este endereço de correio electrónico não é válido!", + + // "error.validation.emailTaken": "This E-mail is already taken", + "error.validation.emailTaken": "Este endereço de correio electrónico já se encontra atribuido!", + + // "error.validation.groupExists": "This group already exists", + "error.validation.groupExists": "Este grupo já existe!", + // "feed.description": "Syndication feed", + "feed.description": "Feed", // "file-section.error.header": "Error obtaining files for this item", - "file-section.error.header": "Erro ao obter ficheiros para este item", - - + "file-section.error.header": "Erro na obteção de ficheiros para este item!", // "footer.copyright": "copyright © 2002-{{ year }}", - "footer.copyright": "copyright © 2002-{{ year }}", + "footer.copyright": "Copyright © 2003-{{ year }}", // "footer.link.dspace": "DSpace software", "footer.link.dspace": "Software DSpace", // "footer.link.lyrasis": "LYRASIS", - "footer.link.lyrasis": "LYRASIS", + "footer.link.lyrasis": "LYRASIS", // "footer.link.cookies": "Cookie settings", "footer.link.cookies": "Configurações de Cookies", @@ -1962,94 +2353,88 @@ "footer.link.privacy-policy": "Política de Privacidade", // "footer.link.end-user-agreement":"End User Agreement", - "footer.link.end-user-agreement":"Termos de uso", - + "footer.link.end-user-agreement":"Termos de Uso", + // "footer.link.feedback":"Send Feedback", + "footer.link.feedback":"Contacte-nos", // "forgot-email.form.header": "Forgot Password", - "forgot-email.form.header": "Esqueci a palavra-chave", - - // "forgot-email.form.info": "Enter Register an account to subscribe to collections for email updates, and submit new items to DSpace.", - "forgot-email.form.info": "Registe-se para subscrever notificações de novos itens nas coleções por email assim como submeter itens no repositório.", + "forgot-email.form.header": "Esqueci a senha", + + // "forgot-email.form.info": "Enter the email address associated with the account.", + "forgot-email.form.info": "Caso tenha esquecido a sua senha de acesso poderá recuperá-la, para o efeito basta introduzir em baixo o seu endereço de correio electrónico associado.", // "forgot-email.form.email": "Email Address *", - "forgot-email.form.email": "Endereço Eletrónico *", + "forgot-email.form.email": "Endereço de correio eletrónico *", // "forgot-email.form.email.error.required": "Please fill in an email address", "forgot-email.form.email.error.required": "Indique um endereço de correio eletrónico", - // "forgot-email.form.email.error.pattern": "Please fill in a valid email address", - "forgot-email.form.email.error.pattern": "Indique um endereço de correio eletrónico válido", + // "forgot-email.form.email.error.not-email-form": "Please fill in a valid email address", + "forgot-email.form.email.error.not-email-form": "Indique um endereço de correio eletrónico válido", - // "forgot-email.form.email.hint": "This address will be verified and used as your login name.", - "forgot-email.form.email.hint": "Este endereço de correio eletrónico será validado e usado como o seu nome de Utilizador para autenticação.", + // "forgot-email.form.email.hint": "An email will be sent to this address with a further instructions.", + "forgot-email.form.email.hint": "Será enviada uma mensagem para este endereço de correio electrónico com mais instruções", - // "forgot-email.form.submit": "Submit", - "forgot-email.form.submit": "Guardar", - - // "forgot-email.form.success.head": "Verification email sent", - "forgot-email.form.success.head": "Email de Confirmação enviado", + // "forgot-email.form.submit": "Reset password", + "forgot-email.form.submit": "Repor senha de acesso", + // "forgot-email.form.success.head": "Password reset email sent", + "forgot-email.form.success.head": "Foi enviada mensagem para redefinição da senha de acesso", + // "forgot-email.form.success.content": "An email has been sent to {{ email }} containing a special URL and further instructions.", - "forgot-email.form.success.content": "Foi enviado uma mensagem para {{ email }} com instruções e um endereço de validação da sua conta de Utilizador.", - - // "forgot-email.form.error.head": "Error when trying to register email", - "forgot-email.form.error.head": "Erro ao tentar registar este email", - - // "forgot-email.form.error.content": "An error occured when registering the following email address: {{ email }}", - "forgot-email.form.error.content": "Ocorreu um erro ao tentar registar o seguinte endereço de correio eletrónico: {{ email }}", - - + "forgot-email.form.success.content": "Foi enviado uma mensagem para {{ email }} com instruções e um endereço para validação da sua conta de utilizador.", + // "forgot-email.form.error.head": "Error when trying to reset password", + "forgot-email.form.error.head": "Ocorreu um erro ao tentar redefinir a senha de acesso", + + // "forgot-email.form.error.content": "An error occured when attempting to reset the password for the account associated with the following email address: {{ email }}", + "forgot-email.form.error.content": "Ocorreu um erro ao tentar redefinir a senha de acesso da conta associada com o seguinte endereço de email: {{ email }}", + // "forgot-password.title": "Forgot Password", - "forgot-password.title": "Esqueci a palavra-chave", + "forgot-password.title": "Esqueci a senha de acesso", // "forgot-password.form.head": "Forgot Password", - "forgot-password.form.head": "Esqueci a palavra-chave", + "forgot-password.form.head": "Esqueci a Senha de acesso", - // "forgot-password.form.info": "Enter a new password in the box below, and confirm it by typing it again into the second box. It should be at least six characters long.", - "forgot-password.form.info": "Introduza uma nova palavra-chave na caixa abaixo, e depois confirme introduzindo de novo na segunda caixa. Deverá ter pelo menos 6 caracteres.", + // "forgot-password.form.info": "Enter a new password in the box below, and confirm it by typing it again into the second box.", + "forgot-password.form.info": "Introduza uma nova senha na caixa em baixo, e depois confirme introduzindo de novo na segunda caixa. Deverá ter pelo menos 6 caracteres.", // "forgot-password.form.card.security": "Security", - "forgot-password.form.card.security": "Segurança", + "forgot-password.form.card.security": "Senha de acesso", // "forgot-password.form.identification.header": "Identify", "forgot-password.form.identification.header": "Identificação", // "forgot-password.form.identification.email": "Email address: ", - "forgot-password.form.identification.email": "Endereço eletrónico: ", + "forgot-password.form.identification.email": "Endereço de correio eletrónico: ", // "forgot-password.form.label.password": "Password", "forgot-password.form.label.password": "Palavra-chave", // "forgot-password.form.label.passwordrepeat": "Retype to confirm", - "forgot-password.form.label.passwordrepeat": "Digite novamente para confirmar", + "forgot-password.form.label.passwordrepeat": "Insira a senha novamente para confirmar", // "forgot-password.form.error.empty-password": "Please enter a password in the box below.", - "forgot-password.form.error.empty-password": "Indique uma palavra-chave na caixa abaixo.", + "forgot-password.form.error.empty-password": "Indique uma senha na caixa abaixo.", // "forgot-password.form.error.matching-passwords": "The passwords do not match.", - "forgot-password.form.error.matching-passwords": "As palavras-chave não coincidem.", - - // "forgot-password.form.error.password-length": "The password should be at least 6 characters long.", - "forgot-password.form.error.password-length": "A palavra-chave deve ter pelo menos 6 caracteres.", + "forgot-password.form.error.matching-passwords": "As palavras de acesso não coincidem.", // "forgot-password.form.notification.error.title": "Error when trying to submit new password", - "forgot-password.form.notification.error.title": "Erro ao submeter nova palavra-chave", + "forgot-password.form.notification.error.title": "Erro ao submeter nova senha de acesso", // "forgot-password.form.notification.success.content": "The password reset was successful. You have been logged in as the created user.", - "forgot-password.form.notification.success.content": "A recuperação da palavra-chave foi efetuada com sucesso. Foi iniciada sessão com o Utilizador criado.", + "forgot-password.form.notification.success.content": "A recuperação da senha foi efetuada com sucesso. Foi iniciada sessão com o utilizador criado.", // "forgot-password.form.notification.success.title": "Password reset completed", - "forgot-password.form.notification.success.title": "recuperação da palavra-chave efetuada com sucesso", + "forgot-password.form.notification.success.title": "Recuperação da senha efetuada com sucesso", // "forgot-password.form.submit": "Submit password", - "forgot-password.form.submit": "Enviar palavra-chave", + "forgot-password.form.submit": "Enviar senha", - - - // "form.add": "Add", - "form.add": "Adicionar", + // "form.add": "Add more", + "form.add": "Adicionar mais", // "form.add-help": "Click here to add the current entry and to add another one", "form.add-help": "Clique aqui para submeter esta entrada e adicionar uma nova", @@ -2063,6 +2448,12 @@ // "form.clear-help": "Click here to remove the selected value", "form.clear-help": "Clique aqui para apagar o valor selecionado", + // "form.discard": "Discard", + "form.discard": "Cancelar", + + // "form.drag": "Drag", + "form.drag": "Arrastar", + // "form.edit": "Edit", "form.edit": "Editar", @@ -2088,13 +2479,13 @@ "form.last-name": "Último nome", // "form.loading": "Loading...", - "form.loading": "Carregando...", + "form.loading": "carregando...", // "form.lookup": "Lookup", "form.lookup": "Consulta", // "form.lookup-help": "Click here to look up an existing relation", - "form.lookup-help": "Clique para consultar as relações existentes", + "form.lookup-help": "Clique para consultar relações existentes", // "form.no-results": "No results found", "form.no-results": "Nenhum resultado encontrado", @@ -2109,45 +2500,172 @@ "form.remove": "Apagar", // "form.save": "Save", - "form.save": "Salvar", + "form.save": "Guardar", // "form.save-help": "Save changes", - "form.save-help": "Salvar alterações", + "form.save-help": "Guardar alterações", // "form.search": "Search", "form.search": "Pesquisar", // "form.search-help": "Click here to look for an existing correspondence", "form.search-help": "Clique aqui para procurar por uma correspondência", + + // "form.submit": "Save", + // "form.submit": "Guardar", + + // "form.repeatable.sort.tip": "Drop the item in the new position", + "form.repeatable.sort.tip": "Largue o item na nova posição", + + // "grant-deny-request-copy.deny": "Don't send copy", + "grant-deny-request-copy.deny": "Não enviar cópia", + + // "grant-deny-request-copy.email.back": "Back", + "grant-deny-request-copy.email.back": "Voltar", + + // "grant-deny-request-copy.email.message": "Message", + "grant-deny-request-copy.email.message": "Mensagem", + + // "grant-deny-request-copy.email.message.empty": "Please enter a message", + "grant-deny-request-copy.email.message.empty": "Por favor insira uma mensagem", + + // "grant-deny-request-copy.email.permissions.info": "You may use this occasion to reconsider the access restrictions on the document, to avoid having to respond to these requests. If you’d like to ask the repository administrators to remove these restrictions, please check the box below.", + "grant-deny-request-copy.email.permissions.info": "Pode aproveitar esta ocasião para reconsiderar o tipo acesso atualmente associado ao documento, para evitar ter que responder a este tipo de pedidos. Se quiser retirar a restrição de acesso/embargo do documento, por favor preencha a seguinte caixa.", + + // "grant-deny-request-copy.email.permissions.label": "Change to open access", + "grant-deny-request-copy.email.permissions.label": "Mudar para acesso aberto", + + // "grant-deny-request-copy.email.send": "Send", + "grant-deny-request-copy.email.send": "Enviar", + + // "grant-deny-request-copy.email.subject": "Subject", + "grant-deny-request-copy.email.subject": "Assunto:", + + // "grant-deny-request-copy.email.subject.empty": "Please enter a subject", + "grant-deny-request-copy.email.subject.empty": "Por favor, introduza o assunto", + + // "grant-deny-request-copy.grant": "Send copy", + "grant-deny-request-copy.grant": "Enviar cópia", + + // "grant-deny-request-copy.header": "Document copy request", + "grant-deny-request-copy.header": "Pedido de cópia", + + // "grant-deny-request-copy.home-page": "Take me to the home page", + "grant-deny-request-copy.home-page": "Voltar para página inicial", + + // "grant-deny-request-copy.intro1": "If you are one of the authors of the document {{ name }}, then please use one of the options below to respond to the user's request.", + "grant-deny-request-copy.intro1": "Se não é um dos autores do documento {{ name }}, por favor use uma seguintes opções para responder ao pedido do utilizador.", + + // "grant-deny-request-copy.intro2": "After choosing an option, you will be presented with a suggested email reply which you may edit.", + "grant-deny-request-copy.intro2": "Depois de escolher uma opção, ser-lhe-á apresentado um um texto de resposta padrão que poderá editar.", + + // "grant-deny-request-copy.processed": "This request has already been processed. You can use the button below to get back to the home page.", + "grant-deny-request-copy.processed": "Este pedido já foi processado. Pode utilizar o botão em baixo para voltar para a página principal.", + + // "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": "Caro {{ recipientName }},\nEm resposta ao seu pedido de cópia, tenho o prazer de lhe enviar em anexo uma cópia do(s) ficheiro(s) relativo(s) ao documento: \"{{ itemUrl }}\" ({{ itemName }}), do qual sou autor.\n\nCom os melhores cumprimentos,\n{{ authorName }} <{{ authorEmail }}>", + + // "grant-request-copy.email.subject": "Request copy of document", + "grant-request-copy.email.subject": "Pedido de cópia de documento", + + // "grant-request-copy.error": "An error occurred", + "grant-request-copy.error": "Ocorreu um erro", + + // "grant-request-copy.header": "Grant document copy request", + "grant-request-copy.header": "Conceder cópia de documento", + + // "grant-request-copy.intro": "This message will be sent to the applicant of the request. The requested document(s) will be attached.", + "grant-request-copy.intro": "Esta mensagem será enviada ao requerente do pedido de cópia. Os ficheiros solicitado(s) serão anexado(s) à mensagem.", + + // "grant-request-copy.success": "Successfully granted item request", + "grant-request-copy.success": "Pedido de cópia concedido com sucesso!", - // "form.submit": "Submit", - "form.submit": "Guardar", - + // "health.breadcrumbs": "Health", + "health.breadcrumbs": "Diagnóstico do sistema", + + // "health-page.heading": "Health", + "health-page.heading": "Diagnóstico do sistema", + + // "health-page.info-tab": "Info", + "health-page.info-tab": "Info", + + // "health-page.status-tab": "Status", + "health-page.status-tab": "Estado", + + // "health-page.error.msg": "The health check service is temporarily unavailable", + "health-page.error.msg": "O serviço de diagnóstico está temporariamente indisponível", + // "health-page.property.status": "Status code", + "health-page.property.status": "Código Estado", + + // "health-page.section.db.title": "Database", + "health-page.section.db.title": "Base Dados", + + // "health-page.section.geoIp.title": "GeoIp", + "health-page.section.geoIp.title": "GeoIp", + + // "health-page.section.solrAuthorityCore.title": "Solr: authority core", + "health-page.section.solrAuthorityCore.title": "Solr: authority core", + + // "health-page.section.solrOaiCore.title": "Solr: oai core", + "health-page.section.solrOaiCore.title": "Solr: OAI core", + + // "health-page.section.solrSearchCore.title": "Solr: search core", + "health-page.section.solrSearchCore.title": "Solr: Search core", + + // "health-page.section.solrStatisticsCore.title": "Solr: statistics core", + "health-page.section.solrStatisticsCore.title": "Solr: statistics core", + + // "health-page.section-info.app.title": "Application Backend", + "health-page.section-info.app.title": "Aplicação Backend", + + // "health-page.section-info.java.title": "Java", + "health-page.section-info.java.title": "Java", + + // "health-page.status": "Status", + "health-page.status": "Estado", + + // "health-page.status.ok.info": "Operational", + "health-page.status.ok.info": "Operacional", + + // "health-page.status.error.info": "Problems detected", + "health-page.status.error.info": "Problemas detetados", + + // "health-page.status.warning.info": "Possible issues detected", + "health-page.status.warning.info": "Possíveis problemas detetados", + + // "health-page.title": "Health", + "health-page.title": "Diagnóstico do sistema", + + // "health-page.section.no-issues": "No issues detected", + "health-page.section.no-issues": "Nenhum problema detetado", // "home.description": "", "home.description": "", // "home.breadcrumbs": "Home", - "home.breadcrumbs": "Principal", + "home.breadcrumbs": "Página inicial", - // "home.title": "DSpace Angular :: Home", - "home.title": "DSpace :: Início", + //"home.search-form.placeholder": "Search the repository...", + "home.search-form.placeholder": "pesquisar no repositório...", + + // "home.title": "Home", + "home.title": "Página inicial", - // "home.top-level-communities.head": "Communities in DSpace", + // "home.top-level-communities.head": "Communities in DSpace", "home.top-level-communities.head": "Comunidades", // "home.top-level-communities.help": "Select a community to browse its collections.", "home.top-level-communities.help": "Selecione uma comunidade para navegar nas suas coleções", // "info.end-user-agreement.accept": "I have read and I agree to the End User Agreement", - "info.end-user-agreement.accept": "Li e aceito os Termos de Uso", + "info.end-user-agreement.accept": "Li e aceito os 'Termos de Uso'", // "info.end-user-agreement.accept.error": "An error occurred accepting the End User Agreement", - "info.end-user-agreement.accept.error": "Ocorreu um erro ao aceitar os Termos de Uso", + "info.end-user-agreement.accept.error": "Ocorreu um erro ao aceitar os 'Termos de Uso'", // "info.end-user-agreement.accept.success": "Successfully updated the End User Agreement", - "info.end-user-agreement.accept.success": "Termos de Uso atualizados com sucesso", + "info.end-user-agreement.accept.success": "'Termos de Uso' atualizados com sucesso", // "info.end-user-agreement.breadcrumbs": "End User Agreement", "info.end-user-agreement.breadcrumbs": "Termos de Uso", @@ -2159,7 +2677,7 @@ "info.end-user-agreement.buttons.save": "Guardar", // "info.end-user-agreement.head": "End User Agreement", - "info.end-user-agreement.head": "Termos de Uso", + "info.end-user-agreement.head": "Termos de Uso", // "info.end-user-agreement.title": "End User Agreement", "info.end-user-agreement.title": "Termos de Uso", @@ -2173,36 +2691,67 @@ // "info.privacy.title": "Privacy Statement", "info.privacy.title": "Política de Privacidade", - - - // "item.alerts.private": "This item is private", + // "info.feedback.breadcrumbs": "Feedback", + "info.feedback.breadcrumbs": "Contacte-nos", + + // "info.feedback.head": "Feedback", + "info.feedback.head": "Contacte-nos", + + // "info.feedback.title": "Feedback", + "info.feedback.title": "Contacte-nos", + + // "info.feedback.info": "Thanks for sharing your feedback about the DSpace system. Your comments are appreciated!", + "info.feedback.info": "Agradecemos de antemão pelo seu contacto e interesse, as suas mensagens, comentários ou sugestões são sempre bem-vindas!", + + // "info.feedback.email_help": "This address will be used to follow up on your feedback.", + "info.feedback.email_help": "Este endereço de correio eletrónico será utilizado para dar seguimento à sua mensagem.", + + // "info.feedback.send": "Send Feedback", + "info.feedback.send": "Enviar mensagem", + + // "info.feedback.comments": "Comments", + "info.feedback.comments": "A sua mensagem", + + // "info.feedback.email-label": "Your Email", + "info.feedback.email-label": "O seu endereço de correio electrónico:", + + // "info.feedback.create.success" : "Feedback Sent Successfully!", + "info.feedback.create.success" : "Mensagem enviada com sucesso!", + + // "info.feedback.error.email.required" : "A valid email address is required", + "info.feedback.error.email.required" : "Deve inserir um endereço de correio electrónico válido", + + // "info.feedback.error.message.required" : "A comment is required", + "info.feedback.error.message.required" : "Deve inserir uma mensagem", + + // "info.feedback.page-label" : "Page", + "info.feedback.page-label" : "Página/URL de contexo:", + + // "info.feedback.page_help" : "The page related to your feedback", + "info.feedback.page_help" : "Esta é a página/URL que contextualiza o seu contacto.", + + // "item.alerts.private": "This item is non-discoverable", "item.alerts.private": "Este item é privado", // "item.alerts.withdrawn": "This item has been withdrawn", "item.alerts.withdrawn": "Este item foi retirado", - - // "item.edit.authorizations.heading": "With this editor you can view and alter the policies of an item, plus alter policies of individual item components: bundles and bitstreams. Briefly, an item is a container of bundles, and bundles are containers of bitstreams. Containers usually have ADD/REMOVE/READ/WRITE policies, while bitstreams only have READ/WRITE policies.", - "item.edit.authorizations.heading": "Com este editor pode ver e alterar as políticas de um item, assim como alterar políticas de componentes individuais do item: pacotes e ficheiros. Em resumo, um item contém pacotes, e os pacotes contêm de ficheiros. Os pacotes possuem usualmente políticas de ADICIONAR/REMOVER/LER/ESCREVER enquanto que os ficheiros apenas políticas de LER/ESCREVER.", + "item.edit.authorizations.heading": "Com este editor pode ver e alterar as políticas de um item, bem como alterar políticas de componentes individuais do item: 'pacotes' (bundles) e 'ficheiros' (bitstreams). Em resumo, um item contém 'pacotes' e os pacotes contêm 'ficheiros'. Os pacotes usualmente possuem políticas de ADICIONAR/REMOVER/LER/ESCREVER, por outro lado, os ficheiros apenas possuem políticas de LER/ESCREVER.", // "item.edit.authorizations.title": "Edit item's Policies", "item.edit.authorizations.title": "Editar políticas dos itens", - - - // "item.badge.private": "Private", + // "item.badge.private": "Non-discoverable", "item.badge.private": "Privado", // "item.badge.withdrawn": "Withdrawn", - "item.badge.withdrawn": "Retirado", - - - + "item.badge.withdrawn": "Retirado", + // "item.bitstreams.upload.bundle": "Bundle", "item.bitstreams.upload.bundle": "Pacote", - // "item.bitstreams.upload.bundle.placeholder": "Select a bundle", + // "item.bitstreams.upload.bundle.placeholder": "Select a bundle or input new bundle name", "item.bitstreams.upload.bundle.placeholder": "Selecione um pacote", // "item.bitstreams.upload.bundle.new": "Create bundle", @@ -2225,20 +2774,18 @@ // "item.bitstreams.upload.notifications.bundle.created.title": "Created bundle", "item.bitstreams.upload.notifications.bundle.created.title": "Pacote criado", - + // "item.bitstreams.upload.notifications.upload.failed": "Upload failed. Please verify the content before retrying.", - "item.bitstreams.upload.notifications.upload.failed": "O carregamento falhou. Verifique o ficheiro antes de tentar carregar de novo.", + "item.bitstreams.upload.notifications.upload.failed": "O carregamento falhou. Verifique os ficheiro antes de tentar carregar de novo.", // "item.bitstreams.upload.title": "Upload bitstream", - "item.bitstreams.upload.title": "Carregar ficheiro", - - + "item.bitstreams.upload.title": "Carregar ficheiro(s)", // "item.edit.bitstreams.bundle.edit.buttons.upload": "Upload", "item.edit.bitstreams.bundle.edit.buttons.upload": "Carregar", // "item.edit.bitstreams.bundle.displaying": "Currently displaying {{ amount }} bitstreams of {{ total }}.", - "item.edit.bitstreams.bundle.displaying": "A apresentar atualmente {{ amount }} ficheiros de {{ total }}.", + "item.edit.bitstreams.bundle.displaying": "Atualmente a mostrar {{ amount }} ficheiros de {{ total }}.", // "item.edit.bitstreams.bundle.load.all": "Load all ({{ total }})", "item.edit.bitstreams.bundle.load.all": "Carregar todos ({{ total }})", @@ -2250,7 +2797,7 @@ "item.edit.bitstreams.bundle.name": "PACOTE: {{ name }}", // "item.edit.bitstreams.discard-button": "Discard", - "item.edit.bitstreams.discard-button": "Descartar", + "item.edit.bitstreams.discard-button": "Cancelar", // "item.edit.bitstreams.edit.buttons.download": "Download", "item.edit.bitstreams.edit.buttons.download": "Descarregar", @@ -2265,7 +2812,7 @@ "item.edit.bitstreams.edit.buttons.remove": "Remover", // "item.edit.bitstreams.edit.buttons.undo": "Undo changes", - "item.edit.bitstreams.edit.buttons.undo": "Descartar alterações", + "item.edit.bitstreams.edit.buttons.undo": "Cancelar alterações", // "item.edit.bitstreams.empty": "This item doesn't contain any bitstreams. Click the upload button to create one.", "item.edit.bitstreams.empty": "Este item não possui ficheiros. Carregue um novo ficheiro.", @@ -2316,7 +2863,7 @@ "item.edit.bitstreams.notifications.remove.saved.title": "Alterações de remoção guardadas", // "item.edit.bitstreams.reinstate-button": "Undo", - "item.edit.bitstreams.reinstate-button": "Descartar", + "item.edit.bitstreams.reinstate-button": "Cancelar", // "item.edit.bitstreams.save-button": "Save", "item.edit.bitstreams.save-button": "Guardar", @@ -2324,8 +2871,6 @@ // "item.edit.bitstreams.upload-button": "Upload", "item.edit.bitstreams.upload-button": "Carregar", - - // "item.edit.delete.cancel": "Cancel", "item.edit.delete.cancel": "Cancelar", @@ -2345,32 +2890,97 @@ "item.edit.delete.success": "O item foi apagado", // "item.edit.head": "Edit Item", - "item.edit.head": "Editar Item", + "item.edit.head": "Editar item", // "item.edit.breadcrumbs": "Edit Item", - "item.edit.breadcrumbs": "Editar Item", + "item.edit.breadcrumbs": "Editar item", + // "item.edit.tabs.disabled.tooltip": "You're not authorized to access this tab", + "item.edit.tabs.disabled.tooltip": "Não está autorizado a aceder a esta área!", // "item.edit.tabs.mapper.head": "Collection Mapper", - "item.edit.tabs.mapper.head": "Mapeamento de Coleção", + "item.edit.tabs.mapper.head": "Mapeamento de coleção", // "item.edit.tabs.item-mapper.title": "Item Edit - Collection Mapper", - "item.edit.tabs.item-mapper.title": "Editar Item - Mapeamento de Coleção", + "item.edit.tabs.item-mapper.title": "Editar item - Mapeamento de coleção", + // "item.edit.identifiers.doi.status.UNKNOWN": "Unknown", + "item.edit.identifiers.doi.status.UNKNOWN": "Desconhecido", + + // "item.edit.identifiers.doi.status.TO_BE_REGISTERED": "Queued for registration", + "item.edit.identifiers.doi.status.TO_BE_REGISTERED": "Em fila de espera para registo", + + // "item.edit.identifiers.doi.status.TO_BE_RESERVED": "Queued for reservation", + "item.edit.identifiers.doi.status.TO_BE_RESERVED": "Em fila de espera para reserva", + + // "item.edit.identifiers.doi.status.IS_REGISTERED": "Registered", + "item.edit.identifiers.doi.status.IS_REGISTERED": "Registado", + + // "item.edit.identifiers.doi.status.IS_RESERVED": "Reserved", + "item.edit.identifiers.doi.status.IS_RESERVED": "Reservado", + + // "item.edit.identifiers.doi.status.UPDATE_RESERVED": "Reserved (update queued)", + "item.edit.identifiers.doi.status.UPDATE_RESERVED": "Reservado (fila de espera atualizada)", + + // "item.edit.identifiers.doi.status.UPDATE_REGISTERED": "Registered (update queued)", + "item.edit.identifiers.doi.status.UPDATE_REGISTERED": "Registado (fila de espera atualizada)", + + // "item.edit.identifiers.doi.status.UPDATE_BEFORE_REGISTRATION": "Queued for update and registration", + "item.edit.identifiers.doi.status.UPDATE_BEFORE_REGISTRATION": "Em fila de espera para atualização e registo", + + // "item.edit.identifiers.doi.status.TO_BE_DELETED": "Queued for deletion", + "item.edit.identifiers.doi.status.TO_BE_DELETED": "Em fila de espera para remoção", + + // "item.edit.identifiers.doi.status.DELETED": "Deleted", + "item.edit.identifiers.doi.status.DELETED": "Removido", + + // "item.edit.identifiers.doi.status.PENDING": "Pending (not registered)", + "item.edit.identifiers.doi.status.PENDING": "Pendente (não registado)", + + // "item.edit.identifiers.doi.status.MINTED": "Minted (not registered)", + "item.edit.identifiers.doi.status.MINTED": "Criado (não registado)", + + // "item.edit.tabs.status.buttons.register-doi.label": "Register a new or pending DOI", + "item.edit.tabs.status.buttons.register-doi.label": "Registar um novo DOI ou pendente", + + // "item.edit.tabs.status.buttons.register-doi.button": "Register DOI...", + "item.edit.tabs.status.buttons.register-doi.button": "Registar DOI...", + + // "item.edit.register-doi.header": "Register a new or pending DOI", + "item.edit.register-doi.header": "Registar um DOI novo ou pendente", + + // "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": "Rever em baixo quaisquer identificadores e metadados pendentes e clicar em 'Confirmar' para prosseguir com o registo DOI ou 'Cancelar' para retroceder", + + // "item.edit.register-doi.confirm": "Confirm", + "item.edit.register-doi.confirm": "Confirmar", + + // "item.edit.register-doi.cancel": "Cancel", + "item.edit.register-doi.cancel": "Cancelar", + + // "item.edit.register-doi.success": "DOI queued for registration successfully.", + "item.edit.register-doi.success": "DOI colocado em fila de espera para o registo com sucesso.", + + // "item.edit.register-doi.error": "error registering DOI", + "item.edit.register-doi.error": "erro ao registar DOI", + + // "item.edit.register-doi.to-update": "The following DOI has already been minted and will be queued for registration online", + "item.edit.register-doi.to-update": "O seguinte DOI já foi criado e será colocado em fila de espera para registo online", + // "item.edit.item-mapper.buttons.add": "Map item to selected collections", - "item.edit.item-mapper.buttons.add": "Mapear item na(s) coleção(ões) seleciona(s)", + "item.edit.item-mapper.buttons.add": "Mapear item para coleção(ões) selecionada(s)", // "item.edit.item-mapper.buttons.remove": "Remove item's mapping for selected collections", - "item.edit.item-mapper.buttons.remove": "Remover mapeamento(s) do item da(s) coleção(ões) seleciona(s)", + "item.edit.item-mapper.buttons.remove": "Remover mapeamento(s) na(s) coleção(ões) selecionada(s)", // "item.edit.item-mapper.cancel": "Cancel", "item.edit.item-mapper.cancel": "Cancelar", // "item.edit.item-mapper.description": "This is the item mapper tool that allows administrators to map this item to other collections. You can search for collections and map them, or browse the list of collections the item is currently mapped to.", - "item.edit.item-mapper.description": "Essa é a ferramenta de mapeamento de itens que permite que os administradores mapeiem esse item para outras coleções. Você pode procurar coleções e mapeá-las ou navegar na lista de coleções para as quais o item está atualmente mapeado.", + "item.edit.item-mapper.description": "Esta ferramenta permite mapear itens para outras coleções. Pode procurar coleções e mapeá-las ou navegar na lista de coleções nas quais o item está atualmente mapeado.", // "item.edit.item-mapper.head": "Item Mapper - Map Item to Collections", - "item.edit.item-mapper.head": "Mapeador de Item - Mapear Itens em Coleções", + "item.edit.item-mapper.head": "Mapeador de item - Mapear itens em coleções", // "item.edit.item-mapper.item": "Item: \"{{name}}\"", "item.edit.item-mapper.item": "Item: \"{{name}}\"", @@ -2402,19 +3012,26 @@ // "item.edit.item-mapper.notifications.remove.success.head": "Removal of mapping completed", "item.edit.item-mapper.notifications.remove.success.head": "Completou a remoção de mapeamento", + // "item.edit.item-mapper.search-form.placeholder": "Search collections...", + "item.edit.item-mapper.search-form.placeholder": "Pesquisar coleções...", + // "item.edit.item-mapper.tabs.browse": "Browse mapped collections", "item.edit.item-mapper.tabs.browse": "Navegar nas coleções mapeadas", // "item.edit.item-mapper.tabs.map": "Map new collections", "item.edit.item-mapper.tabs.map": "Mapear novas coleções", - - // "item.edit.metadata.add-button": "Add", "item.edit.metadata.add-button": "Adicionar", // "item.edit.metadata.discard-button": "Discard", - "item.edit.metadata.discard-button": "Descartar", + "item.edit.metadata.discard-button": "Cancelar", + + // "item.edit.metadata.edit.buttons.confirm": "Confirm", + "item.edit.metadata.edit.buttons.confirm": "Confirmar", + + // "item.edit.metadata.edit.buttons.drag": "Drag to reorder", + "item.edit.metadata.edit.buttons.drag": "Arrastar para reordenar", // "item.edit.metadata.edit.buttons.edit": "Edit", "item.edit.metadata.edit.buttons.edit": "Editar", @@ -2428,6 +3045,9 @@ // "item.edit.metadata.edit.buttons.unedit": "Stop editing", "item.edit.metadata.edit.buttons.unedit": "Parar edição", + // "item.edit.metadata.edit.buttons.virtual": "This is a virtual metadata value, i.e. a value inherited from a related entity. It can’t be modified directly. Add or remove the corresponding relationship in the \"Relationships\" tab", + "item.edit.metadata.edit.buttons.virtual": "Este é um valor de metadados virtual, ou seja, um valor herdado de uma entidade relacionada. Não pode ser modificado diretamente. Adicionar ou remover a relação correspondente no separador 'Relacionamentos'", + // "item.edit.metadata.empty": "The item currently doesn't contain any metadata. Click Add to start adding a metadata value.", "item.edit.metadata.empty": "O item não possui metadados. Clique 'Adicionar' para adicionar metadados.", @@ -2435,7 +3055,7 @@ "item.edit.metadata.headers.edit": "Editar", // "item.edit.metadata.headers.field": "Field", - "item.edit.metadata.headers.field": "Campo", + "item.edit.metadata.headers.field": "Campo (metadado)", // "item.edit.metadata.headers.language": "Lang", "item.edit.metadata.headers.language": "Idioma", @@ -2443,32 +3063,35 @@ // "item.edit.metadata.headers.value": "Value", "item.edit.metadata.headers.value": "Valor", + // "item.edit.metadata.metadatafield.error": "An error occurred validating the metadata field", + "item.edit.metadata.metadatafield.error": "Ocorreu um erro ao validar o campo de metadados", + // "item.edit.metadata.metadatafield.invalid": "Please choose a valid metadata field", "item.edit.metadata.metadatafield.invalid": "Por favor escolha um campo de metadados válido", // "item.edit.metadata.notifications.discarded.content": "Your changes were discarded. To reinstate your changes click the 'Undo' button", - "item.edit.metadata.notifications.discarded.content": "Suas alterações foram descartadas. Para restabelecer suas alterações, clique no botão 'Desfazer'", + "item.edit.metadata.notifications.discarded.content": "As suas alterações foram descartadas. Para restabelecer suas alterações, clique no botão 'Desfazer'", - // "item.edit.metadata.notifications.discarded.title": "Changed discarded", + // "item.edit.metadata.notifications.discarded.title": "Changes discarded", "item.edit.metadata.notifications.discarded.title": "Mudança descartada", - + // "item.edit.metadata.notifications.error.title": "An error occurred", - "item.edit.metadata.notifications.error.title": "Ocorreu um erro", + "item.edit.metadata.notifications.error.title": "Ocorreu um erro!", // "item.edit.metadata.notifications.invalid.content": "Your changes were not saved. Please make sure all fields are valid before you save.", - "item.edit.metadata.notifications.invalid.content": "Suas alterações não foram salvas. Verifique se todos os campos são válidos antes de salvar.", + "item.edit.metadata.notifications.invalid.content": "As suas alterações não foram guardadas! Verifique se todos os campos são válidos antes de guardar.", // "item.edit.metadata.notifications.invalid.title": "Metadata invalid", "item.edit.metadata.notifications.invalid.title": "Metadado inválido", // "item.edit.metadata.notifications.outdated.content": "The item you're currently working on has been changed by another user. Your current changes are discarded to prevent conflicts", - "item.edit.metadata.notifications.outdated.content": "O item em que você está trabalhando foi alterado por outro usuário. Suas alterações atuais são descartadas para evitar conflitos", + "item.edit.metadata.notifications.outdated.content": "O registo em que está a trabalhar foi alterado por outro utilizador. As suas alterações serão descartadas para evitar conflitos", - // "item.edit.metadata.notifications.outdated.title": "Changed outdated", + // "item.edit.metadata.notifications.outdated.title": "Changes outdated", "item.edit.metadata.notifications.outdated.title": "Alteração desatualizada", // "item.edit.metadata.notifications.saved.content": "Your changes to this item's metadata were saved.", - "item.edit.metadata.notifications.saved.content": "Suas alterações nos metadados deste item foram salvas.", + "item.edit.metadata.notifications.saved.content": "As alterações que realizou nos metadados deste registo foram salvas.", // "item.edit.metadata.notifications.saved.title": "Metadata saved", "item.edit.metadata.notifications.saved.title": "Metadados salvos", @@ -2476,10 +3099,11 @@ // "item.edit.metadata.reinstate-button": "Undo", "item.edit.metadata.reinstate-button": "Desfazer", + // "item.edit.metadata.reset-order-button": "Undo reorder", + "item.edit.metadata.reset-order-button": "Desfazer reordenamento", + // "item.edit.metadata.save-button": "Save", - "item.edit.metadata.save-button": "Salvar", - - + "item.edit.metadata.save-button": "Guardar", // "item.edit.modify.overview.field": "Field", "item.edit.modify.overview.field": "Campo", @@ -2490,11 +3114,15 @@ // "item.edit.modify.overview.value": "Value", "item.edit.modify.overview.value": "Valor", - - - // "item.edit.move.cancel": "Cancel", + // "item.edit.move.cancel": "Back", "item.edit.move.cancel": "Cancelar", + // "item.edit.move.save-button": "Save", + "item.edit.move.save-button": "Guardar", + + // "item.edit.move.discard-button": "Discard", + "item.edit.move.discard-button": "Cancelar", + // "item.edit.move.description": "Select the collection you wish to move this item to. To narrow down the list of displayed collections, you can enter a search query in the box.", "item.edit.move.description": "Selecione a coleção para a qual você deseja mover este item. Para restringir a lista de coleções exibidas, você pode inserir uma consulta de pesquisa na caixa.", @@ -2525,47 +3153,41 @@ // "item.edit.move.title": "Move item", "item.edit.move.title": "Mover item", - - // "item.edit.private.cancel": "Cancel", "item.edit.private.cancel": "Cancelar", - // "item.edit.private.confirm": "Make it Private", + // "item.edit.private.confirm": "Make it non-discoverable", "item.edit.private.confirm": "Tornar Privado", - // "item.edit.private.description": "Are you sure this item should be made private in the archive?", + // "item.edit.private.description": "Are you sure this item should be made non-discoverable in the archive?", "item.edit.private.description": "Tem certeza de que este item deve ser tornado privado?", - // "item.edit.private.error": "An error occurred while making the item private", + // "item.edit.private.error": "An error occurred while making the item non-discoverable", "item.edit.private.error": "Ocorreu um erro ao tornar o item privado", - // "item.edit.private.header": "Make item private: {{ id }}", + // "item.edit.private.header": "Make item non-discoverable: {{ id }}", "item.edit.private.header": "Tornar privado o item: {{ id }}", - // "item.edit.private.success": "The item is now private", + // "item.edit.private.success": "The item is now non-discoverable", "item.edit.private.success": "O item agora é privado", - - // "item.edit.public.cancel": "Cancel", "item.edit.public.cancel": "Cancelar", - // "item.edit.public.confirm": "Make it Public", + // "item.edit.public.confirm": "Make it discoverable", "item.edit.public.confirm": "Tornar público", - // "item.edit.public.description": "Are you sure this item should be made public in the archive?", + // "item.edit.public.description": "Are you sure this item should be made discoverable in the archive?", "item.edit.public.description": "Você tem certeza que deseja tornar este item público?", - // "item.edit.public.error": "An error occurred while making the item public", + // "item.edit.public.error": "An error occurred while making the item discoverable", "item.edit.public.error": "Ocorreu um erro ao tornar o item público", - // "item.edit.public.header": "Make item public: {{ id }}", + // "item.edit.public.header": "Make item discoverable: {{ id }}", "item.edit.public.header": "Tornar público o item: {{ id }}", - // "item.edit.public.success": "The item is now public", - "item.edit.public.success": "O item agora é público", - - + // "item.edit.public.success": "The item is now discoverable", + "item.edit.public.success": "O item agora é público!", // "item.edit.reinstate.cancel": "Cancel", "item.edit.reinstate.cancel": "Cancelar", @@ -2585,10 +3207,8 @@ // "item.edit.reinstate.success": "The item was reinstated successfully", "item.edit.reinstate.success": "O item foi restabelecido com sucesso", - - // "item.edit.relationships.discard-button": "Discard", - "item.edit.relationships.discard-button": "Descartar", + "item.edit.relationships.discard-button": "Cancelar", // "item.edit.relationships.edit.buttons.add": "Add", "item.edit.relationships.edit.buttons.add": "Adicionar", @@ -2597,16 +3217,16 @@ "item.edit.relationships.edit.buttons.remove": "Apagar", // "item.edit.relationships.edit.buttons.undo": "Undo changes", - "item.edit.relationships.edit.buttons.undo": "Desfazer alterações", + "item.edit.relationships.edit.buttons.undo": "Cancelar alterações", // "item.edit.relationships.no-relationships": "No relationships", "item.edit.relationships.no-relationships": "Sem relações", // "item.edit.relationships.notifications.discarded.content": "Your changes were discarded. To reinstate your changes click the 'Undo' button", - "item.edit.relationships.notifications.discarded.content": "Suas alterações foram descartadas. Para restabelecer suas alterações, clique no botão 'Desfazer'", + "item.edit.relationships.notifications.discarded.content": "Suas alterações foram canceladas. Para restabelecer suas alterações, clique no botão 'Cancelar'", // "item.edit.relationships.notifications.discarded.title": "Changes discarded", - "item.edit.relationships.notifications.discarded.title": "Alterações descartadas", + "item.edit.relationships.notifications.discarded.title": "Alterações canceladas", // "item.edit.relationships.notifications.failed.title": "Error editing relationships", "item.edit.relationships.notifications.failed.title": "Erro ao apagar relação", @@ -2627,15 +3247,16 @@ "item.edit.relationships.reinstate-button": "Desfazer", // "item.edit.relationships.save-button": "Save", - "item.edit.relationships.save-button": "Salvar", + "item.edit.relationships.save-button": "Guardar", // "item.edit.relationships.no-entity-type": "Add 'dspace.entity.type' metadata to enable relationships for this item", - "item.edit.relationships.no-entity-type": "Adicione o metadado 'dspace.entity.type' para ativar relações neste item", - + "item.edit.relationships.no-entity-type": "Adicione o metadado 'dspace.entity.type' para ativar relações neste item!", + // "item.edit.return": "Back", + "item.edit.return": "Voltar", // "item.edit.tabs.bitstreams.head": "Bitstreams", - "item.edit.tabs.bitstreams.head": "Ficheiros do Item", + "item.edit.tabs.bitstreams.head": "Ficheiros do item", // "item.edit.tabs.bitstreams.title": "Item Edit - Bitstreams", "item.edit.tabs.bitstreams.title": "Editar Item - Ficheiros", @@ -2644,28 +3265,28 @@ "item.edit.tabs.curate.head": "Curadoria", // "item.edit.tabs.curate.title": "Item Edit - Curate", - "item.edit.tabs.curate.title": "Editar Item - Curadoria", + "item.edit.tabs.curate.title": "Editar item - Curadoria", // "item.edit.tabs.metadata.head": "Metadata", - "item.edit.tabs.metadata.head": "Metadados do Item", + "item.edit.tabs.metadata.head": "Metadados do item", // "item.edit.tabs.metadata.title": "Item Edit - Metadata", "item.edit.tabs.metadata.title": "Editar Item - Metadados", // "item.edit.tabs.relationships.head": "Relationships", - "item.edit.tabs.relationships.head": "Relações do Item", + "item.edit.tabs.relationships.head": "Relações do item", // "item.edit.tabs.relationships.title": "Item Edit - Relationships", "item.edit.tabs.relationships.title": "Editar Item - Relacionamentos", // "item.edit.tabs.status.buttons.authorizations.button": "Authorizations...", - "item.edit.tabs.status.buttons.authorizations.button": "Autorizações...", + "item.edit.tabs.status.buttons.authorizations.button": "Permissões...", // "item.edit.tabs.status.buttons.authorizations.label": "Edit item's authorization policies", - "item.edit.tabs.status.buttons.authorizations.label": "Editar politicas de autorizações de item", + "item.edit.tabs.status.buttons.authorizations.label": "Editar políticas de permissões de item", // "item.edit.tabs.status.buttons.delete.button": "Permanently delete", - "item.edit.tabs.status.buttons.delete.button": "Apagar permanentemente", + "item.edit.tabs.status.buttons.delete.button": "Apagar definitivamente", // "item.edit.tabs.status.buttons.delete.label": "Completely expunge item", "item.edit.tabs.status.buttons.delete.label": "Eliminar completamente o item", @@ -2674,24 +3295,24 @@ "item.edit.tabs.status.buttons.mappedCollections.button": "Coleções mapeadas", // "item.edit.tabs.status.buttons.mappedCollections.label": "Manage mapped collections", - "item.edit.tabs.status.buttons.mappedCollections.label": "Gerenciar coleções mapeadas", + "item.edit.tabs.status.buttons.mappedCollections.label": "Gerir coleções mapeadas", - // "item.edit.tabs.status.buttons.move.button": "Move...", - "item.edit.tabs.status.buttons.move.button": "Mover...", + // "item.edit.tabs.status.buttons.move.button": "Move this Item to a different Collection", + "item.edit.tabs.status.buttons.move.button": "Mover este item para outra coleção", // "item.edit.tabs.status.buttons.move.label": "Move item to another collection", "item.edit.tabs.status.buttons.move.label": "Mover item para outra coleção", - // "item.edit.tabs.status.buttons.private.button": "Make it private...", - "item.edit.tabs.status.buttons.private.button": "Tornar o item privado ...", + // "item.edit.tabs.status.buttons.private.button": "Make it non-discoverable...", + "item.edit.tabs.status.buttons.private.button": "Tornar o item privado...", - // "item.edit.tabs.status.buttons.private.label": "Make item private", + // "item.edit.tabs.status.buttons.private.label": "Make item non-discoverable", "item.edit.tabs.status.buttons.private.label": "Tornar o item privado", - // "item.edit.tabs.status.buttons.public.button": "Make it public...", + // "item.edit.tabs.status.buttons.public.button": "Make it discoverable...", "item.edit.tabs.status.buttons.public.button": "Tornar público o item...", - // "item.edit.tabs.status.buttons.public.label": "Make item public", + // "item.edit.tabs.status.buttons.public.label": "Make item discoverable", "item.edit.tabs.status.buttons.public.label": "Tornar público o item", // "item.edit.tabs.status.buttons.reinstate.button": "Reinstate...", @@ -2700,26 +3321,29 @@ // "item.edit.tabs.status.buttons.reinstate.label": "Reinstate item into the repository", "item.edit.tabs.status.buttons.reinstate.label": "Restabelecer item no repositório", - // "item.edit.tabs.status.buttons.withdraw.button": "Withdraw...", - "item.edit.tabs.status.buttons.withdraw.button": "Retirar...", + // "item.edit.tabs.status.buttons.unauthorized": "You're not authorized to perform this action", + "item.edit.tabs.status.buttons.unauthorized": "Não possui autorizações para realizar esta ação!", + // "item.edit.tabs.status.buttons.withdraw.button": "Withdraw this item", + "item.edit.tabs.status.buttons.withdraw.button": "Retirar este item", + // "item.edit.tabs.status.buttons.withdraw.label": "Withdraw item from the repository", - "item.edit.tabs.status.buttons.withdraw.label": "Retirar item do repositório", + "item.edit.tabs.status.buttons.withdraw.label": "Retirar item da vista pública do repositório", // "item.edit.tabs.status.description": "Welcome to the item management page. From here you can withdraw, reinstate, move or delete the item. You may also update or add new metadata / bitstreams on the other tabs.", - "item.edit.tabs.status.description": "Bem-vindo à página de gerenciamento de itens. A partir daqui, você pode retirar, restabelecer, mover ou apagar o item. Você também pode atualizar ou adicionar novos metadados / bitstream nas outras guias.", + "item.edit.tabs.status.description": "Bem-vindo à página de gestão de itens. Nesta área, pode retirar, restabelecer, mover ou apagar definitivamente o item. Adicionalmente, também pode atualizar ou adicionar novos metadados / bitstreams percorrendo pelas outras abas.", // "item.edit.tabs.status.head": "Status", - "item.edit.tabs.status.head": "Estado do Item", + "item.edit.tabs.status.head": "Estado do item", // "item.edit.tabs.status.labels.handle": "Handle", "item.edit.tabs.status.labels.handle": "Handle", // "item.edit.tabs.status.labels.id": "Item Internal ID", - "item.edit.tabs.status.labels.id": "ID Interno do Item", + "item.edit.tabs.status.labels.id": "ID Interno do item", // "item.edit.tabs.status.labels.itemPage": "Item Page", - "item.edit.tabs.status.labels.itemPage": "Página do Item", + "item.edit.tabs.status.labels.itemPage": "Página do item", // "item.edit.tabs.status.labels.lastModified": "Last Modified", "item.edit.tabs.status.labels.lastModified": "Ultima alteração", @@ -2728,13 +3352,13 @@ "item.edit.tabs.status.title": "Editar Item - Estado", // "item.edit.tabs.versionhistory.head": "Version History", - "item.edit.tabs.versionhistory.head": "Histórico de Versões", + "item.edit.tabs.versionhistory.head": "Histórico de versões", // "item.edit.tabs.versionhistory.title": "Item Edit - Version History", - "item.edit.tabs.versionhistory.title": "Edições do Item - Histórico de Versões", + "item.edit.tabs.versionhistory.title": "Edições do Item - Histórico de versões", // "item.edit.tabs.versionhistory.under-construction": "Editing or adding new versions is not yet possible in this user interface.", - "item.edit.tabs.versionhistory.under-construction": "Editar ou adicionar novas versões ainda não é possível neste interface de Utilizador.", + "item.edit.tabs.versionhistory.under-construction": "Editar ou adicionar novas versões ainda não é possível neste interface de utilizador.", // "item.edit.tabs.view.head": "View Item", "item.edit.tabs.view.head": "Visualizar Item", @@ -2742,8 +3366,6 @@ // "item.edit.tabs.view.title": "Item Edit - View", "item.edit.tabs.view.title": "Editar Item - Visualizar", - - // "item.edit.withdraw.cancel": "Cancel", "item.edit.withdraw.cancel": "Cancelar", @@ -2760,24 +3382,22 @@ "item.edit.withdraw.header": "Retirar item: {{ id }}", // "item.edit.withdraw.success": "The item was withdrawn successfully", - "item.edit.withdraw.success": "O item foi retirado com sucesso", - + "item.edit.withdraw.success": "O item foi retirado com sucesso!", + // "item.orcid.return": "Back", + "item.orcid.return": "Voltar", // "item.listelement.badge": "Item", "item.listelement.badge": "Item", // "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", + "item.page.journal-issn": "ISSN da revista", // "item.page.journal-title": "Journal Title", - "item.page.journal-title": "Título da Revista", + "item.page.journal-title": "Título da revista", // "item.page.publisher": "Publisher", "item.page.publisher": "Editora", @@ -2789,13 +3409,41 @@ "item.page.volume-title": "Título do Volume", // "item.search.results.head": "Item Search Results", - "item.search.results.head": "Resultados da Pesquisa de Item", + "item.search.results.head": "Resultados da pesquisa de item", - // "item.search.title": "DSpace Angular :: Item Search", - "item.search.title": "DSpace :: Pesquisa de Item", + // "item.search.title": "Item Search", + "item.search.title": "Pesquisa de item", + // "item.truncatable-part.show-more": "Show more", + "item.truncatable-part.show-more": "Mostrar mais", + + // "item.truncatable-part.show-less": "Collapse", + "item.truncatable-part.show-less": "Colapsar", + // "workflow-item.search.result.delete-supervision.modal.header": "Delete Supervision Order", + "workflow-item.search.result.delete-supervision.modal.header": "Eliminar ordem de supervisão", + // "workflow-item.search.result.delete-supervision.modal.info": "Are you sure you want to delete Supervision Order", + "workflow-item.search.result.delete-supervision.modal.info": "Tem a certeza de que quer remover a ordem de supervisão", + + // "workflow-item.search.result.delete-supervision.modal.cancel": "Cancel", + "workflow-item.search.result.delete-supervision.modal.cancel": "Cancelar", + + // "workflow-item.search.result.delete-supervision.modal.confirm": "Delete", + "workflow-item.search.result.delete-supervision.modal.confirm": "Remover", + + // "workflow-item.search.result.notification.deleted.success": "Successfully deleted supervision order \"{{name}}\"", + "workflow-item.search.result.notification.deleted.success": "Ordem de supervisão removida com sucesso \"{{name}}\"", + + // "workflow-item.search.result.notification.deleted.failure": "Failed to delete supervision order \"{{name}}\"", + "workflow-item.search.result.notification.deleted.failure": "Falha ao remover ordem de supervisão \"{{name}}\"", + + // "workflow-item.search.result.list.element.supervised-by": "Supervised by:", + "workflow-item.search.result.list.element.supervised-by": "Supervisionado por:", + + // "workflow-item.search.result.list.element.supervised.remove-tooltip": "Remove supervision group", + "workflow-item.search.result.list.element.supervised.remove-tooltip": "Remover grupo de supervisão", + // "item.page.abstract": "Abstract", "item.page.abstract": "Resumo", @@ -2808,6 +3456,12 @@ // "item.page.collections": "Collections", "item.page.collections": "Coleções", + // "item.page.collections.loading": "Loading...", + "item.page.collections.loading": "A carregar...", + + // "item.page.collections.load-more": "Load more", + "item.page.collections.load-more": "Carregar mais", + // "item.page.date": "Date", "item.page.date": "Data", @@ -2821,7 +3475,7 @@ "item.page.filesection.description": "Descrição:", // "item.page.filesection.download": "Download", - "item.page.filesection.download": "Baixar", + "item.page.filesection.download": "Ver/Abrir", // "item.page.filesection.format": "Format:", "item.page.filesection.format": "Formato:", @@ -2841,6 +3495,12 @@ // "item.page.link.simple": "Simple item page", "item.page.link.simple": "Ver registo simples", + // "item.page.orcid.title": "ORCID", + "item.page.orcid.title": "ORCID", + + // "item.page.orcid.tooltip": "Open ORCID setting page", + "item.page.orcid.tooltip": "Abrir página de configuração do ORCID", + // "item.page.person.search.title": "Articles by this author", "item.page.person.search.title": "Artigos deste autor", @@ -2858,9 +3518,9 @@ // "item.page.relationships.isOrgUnitOfPerson": "Authors", "item.page.relationships.isOrgUnitOfPerson": "Autores", - + // "item.page.relationships.isOrgUnitOfProject": "Research Projects", - "item.page.relationships.isOrgUnitOfProject": "Projetos", + "item.page.relationships.isOrgUnitOfProject": "Projetos de investigação", // "item.page.subject": "Keywords", "item.page.subject": "Palavras-chave", @@ -2873,13 +3533,28 @@ // "item.page.bitstreams.collapse": "Collapse", "item.page.bitstreams.collapse": "Fechar", - + // "item.page.filesection.original.bundle" : "Original bundle", "item.page.filesection.original.bundle" : "Principais", // "item.page.filesection.license.bundle" : "License bundle", "item.page.filesection.license.bundle" : "Licença", + // "item.page.return": "Back", + "item.page.return": "Voltar", + + // "item.page.version.create": "Create new version", + "item.page.version.create": "Criar nova versão", + + // "item.page.version.hasDraft": "A new version cannot be created because there is an inprogress submission in the version history", + "item.page.version.hasDraft": "Um nova versão não pode ser criada porque já se encontra uma submisão em curso no histórico de versões.", + + // "item.page.claim.button": "Claim", + "item.page.claim.button": "Reivindicar", + + // "item.page.claim.tooltip": "Claim this item as profile", + "item.page.claim.tooltip": "Reivindicar este item como perfil", + // "item.preview.dc.identifier.uri": "Identifier:", "item.preview.dc.identifier.uri": "Identificador:", @@ -2904,6 +3579,39 @@ // "item.preview.dc.title": "Title:", "item.preview.dc.title": "Título:", + // "item.preview.dc.type": "Type:", + "item.preview.dc.type": "Tipo:", + + // "item.preview.oaire.citation.issue" : "Issue", + "item.preview.oaire.citation.issue" : "Issue", + + // "item.preview.oaire.citation.volume" : "Volume", + "item.preview.oaire.citation.volume" : "Volume", + + // "item.preview.dc.relation.issn" : "ISSN", + "item.preview.dc.relation.issn" : "ISSN", + + // "item.preview.dc.relation.eissn" : "EISSN", + "item.preview.dc.relation.eissn" : "EISSN", + + // "item.preview.dc.identifier.isbn" : "ISBN", + "item.preview.dc.identifier.isbn" : "ISBN", + + // "item.preview.dc.identifier.eisbn" : "EISBN", + "item.preview.dc.identifier.eisbn" : "EISBN", + + // "item.preview.dc.identifier.tid" : "TID", + "item.preview.dc.identifier.tid" : "TID", + + // "item.preview.dc.identifier": "Identifier:", + "itemm.preview.dc.identifier": "Identificador:", + + // "item.preview.dc.relation.ispartof" : "Journal or Serie", + "item.preview.dc.relation.ispartof" : "Revista ou Série", + + // "item.preview.dc.identifier.doi" : "DOI", + "item.preview.dc.identifier.doi" : "DOI", + // "item.preview.person.familyName": "Surname:", "item.preview.person.familyName": "Apelido:", @@ -2913,11 +3621,29 @@ // "item.preview.person.identifier.orcid": "ORCID:", "item.preview.person.identifier.orcid": "ORCID:", + // "item.preview.project.funder.name": "Funder:", + "item.preview.project.funder.name": "Financiador:", + + // "item.preview.project.funder.identifier": "Funder Identifier:", + "item.preview.project.funder.identifier": "Identificação do financiador:", + + // "item.preview.oaire.awardNumber": "Funding ID:", + "item.preview.oaire.awardNumber": "ID do financiamento:", + + // "item.preview.dc.title.alternative": "Acronym:", + "item.preview.dc.title.alternative": "Acrónimo:", + + // "item.preview.dc.coverage.spatial": "Jurisdiction:", + "item.preview.dc.coverage.spatial": "Jurisdição:", + + // "item.preview.oaire.fundingStream": "Funding Stream:", + "item.preview.oaire.fundingStream": "Linha de financiamento:", + // "item.select.confirm": "Confirm selected", "item.select.confirm": "Confirmar seleção", // "item.select.empty": "No items to show", - "item.select.empty": "Nenhum item para mostrar", + "item.select.empty": "Nenhum item para mostrar.", // "item.select.table.author": "Author", "item.select.table.author": "Autor", @@ -2928,19 +3654,21 @@ // "item.select.table.title": "Title", "item.select.table.title": "Título", - // "item.version.history.empty": "There are no other versions for this item yet.", - "item.version.history.empty": "Não existem ainda outras versões deste item.", + "item.version.history.empty": "Ainda não existem outras versões deste item.", // "item.version.history.head": "Version History", - "item.version.history.head": "Histórico de Versões", + "item.version.history.head": "Histórico de versões", - // "item.version.history.return": "Return", + // "item.version.history.return": "Back", "item.version.history.return": "Voltar", // "item.version.history.selected": "Selected version", "item.version.history.selected": "Versão selecionada", + // "item.version.history.selected.alert": "You are currently viewing version {{version}} of the item.", + "item.version.history.selected.alert": "Está a ver a versão {{version}} do item.", + // "item.version.history.table.version": "Version", "item.version.history.table.version": "Versão", @@ -2955,13 +3683,192 @@ // "item.version.history.table.summary": "Summary", "item.version.history.table.summary": "Sumário", - - + + // "item.version.history.table.workspaceItem": "Workspace item", + "item.version.history.table.workspaceItem": "Área de trabalho do item", + + // "item.version.history.table.workflowItem": "Workflow item", + "item.version.history.table.workflowItem": "Área de trabalho do item", + + // "item.version.history.table.actions": "Action", + "item.version.history.table.actions": "Ação", + + // "item.version.history.table.action.editWorkspaceItem": "Edit workspace item", + "item.version.history.table.action.editWorkspaceItem": "Editar área de trabalho do item", + + // "item.version.history.table.action.editSummary": "Edit summary", + "item.version.history.table.action.editSummary": "Editar sumário", + + // "item.version.history.table.action.saveSummary": "Save summary edits", + "item.version.history.table.action.saveSummary": "Guardar alterações ao sumário", + + // "item.version.history.table.action.discardSummary": "Discard summary edits", + "item.version.history.table.action.discardSummary": "Cancelar alterações ao sumário", + + // "item.version.history.table.action.newVersion": "Create new version from this one", + "item.version.history.table.action.newVersion": "Criar uma nova versão deste", + + // "item.version.history.table.action.deleteVersion": "Delete version", + "item.version.history.table.action.deleteVersion": "Remover versão", + + // "item.version.history.table.action.hasDraft": "A new version cannot be created because there is an inprogress submission in the version history", + "item.version.history.table.action.hasDraft": "Uma nova versão não pode ser criada porque se encontra um depósito em curso no histórico de versões", // "item.version.notice": "This is not the latest version of this item. The latest version can be found here.", "item.version.notice": "Esta não é a última versão deste item. A última versão pode ser encontrada aqui.", + // "item.version.create.modal.header": "New version", + "item.version.create.modal.header": "Nova versão", + + // "item.version.create.modal.text": "Create a new version for this item", + "item.version.create.modal.text": "Criar uma nova versão para este item", + // "item.version.create.modal.text.startingFrom": "starting from version {{version}}", + "item.version.create.modal.text.startingFrom": "Iniciar a partir da versão {{version}}", + + // "item.version.create.modal.button.confirm": "Create", + "item.version.create.modal.button.confirm": "Criar", + + // "item.version.create.modal.button.confirm.tooltip": "Create new version", + "item.version.create.modal.button.confirm.tooltip": "Criar uma nova versão", + + // "item.version.create.modal.button.cancel": "Cancel", + "item.version.create.modal.button.cancel": "Cancelar", + + // "item.version.create.modal.button.cancel.tooltip": "Do not create new version", + "item.version.create.modal.button.cancel.tooltip": "Não criar uma nova versão", + + // "item.version.create.modal.form.summary.label": "Summary", + "item.version.create.modal.form.summary.label": "Sumário", + + // "item.version.create.modal.form.summary.placeholder": "Insert the summary for the new version", + "item.version.create.modal.form.summary.placeholder": "Inserir o sumário para a nova versão", + + // "item.version.create.modal.submitted.header": "Creating new version...", + "item.version.create.modal.submitted.header": "Criar uma nova versão...", + + // "item.version.create.modal.submitted.text": "The new version is being created. This may take some time if the item has a lot of relationships.", + "item.version.create.modal.submitted.text": "A nova versão está a ser criada. Isto pode demorar algum tempo se o item tiver muitas relações.", + + // "item.version.create.notification.success": "New version has been created with version number {{version}}", + "item.version.create.notification.success": "Nova versão foi criada com o número {{version}}", + + // "item.version.create.notification.failure": "New version has not been created", + "item.version.create.notification.failure": "Nova versão não foi criada", + + // "item.version.create.notification.inProgress": "A new version cannot be created because there is an inprogress submission in the version history", + "item.version.create.notification.inProgress": "Uma nova versão não pode ser criada porque se encontra um depósito em curso no histórico de versões", + + // "item.version.delete.modal.header": "Delete version", + "item.version.delete.modal.header": "Remover versão", + + // "item.version.delete.modal.text": "Do you want to delete version {{version}}?", + "item.version.delete.modal.text": "Pretende remover a versão {{version}}?", + + // "item.version.delete.modal.button.confirm": "Delete", + "item.version.delete.modal.button.confirm": "Remover", + + // "item.version.delete.modal.button.confirm.tooltip": "Delete this version", + "item.version.delete.modal.button.confirm.tooltip": "Remover esta versão", + + // "item.version.delete.modal.button.cancel": "Cancel", + "item.version.delete.modal.button.cancel": "Cancelar", + + // "item.version.delete.modal.button.cancel.tooltip": "Do not delete this version", + "item.version.delete.modal.button.cancel.tooltip": "Não remover esta versão", + + // "item.version.delete.notification.success": "Version number {{version}} has been deleted", + "item.version.delete.notification.success": "A versão número {{version}} foi removida", + + // "item.version.delete.notification.failure": "Version number {{version}} has not been deleted", + "item.version.delete.notification.failure": "A versão número {{version}} não foi removida", + + // "item.version.edit.notification.success": "The summary of version number {{version}} has been changed", + "item.version.edit.notification.success": "O sumário da versão número {{version}} foi alterado", + + // "item.version.edit.notification.failure": "The summary of version number {{version}} has not been changed", + "item.version.edit.notification.failure": "O sumário da versão número {{version}} não foi alterado", + + // "itemtemplate.edit.metadata.add-button": "Add", + "itemtemplate.edit.metadata.add-button": "Adicionar", + + // "itemtemplate.edit.metadata.discard-button": "Discard", + "itemtemplate.edit.metadata.discard-button": 'Rejeitar', + + // "itemtemplate.edit.metadata.edit.buttons.confirm": "Confirm", + "itemtemplate.edit.metadata.edit.buttons.confirm": "Confirmar", + + // "itemtemplate.edit.metadata.edit.buttons.drag": "Drag to reorder", + "itemtemplate.edit.metadata.edit.buttons.drag": "Arrastar para reordenar", + + // "itemtemplate.edit.metadata.edit.buttons.edit": "Edit", + "itemtemplate.edit.metadata.edit.buttons.edit": "Editar", + + // "itemtemplate.edit.metadata.edit.buttons.remove": "Remove", + "itemtemplate.edit.metadata.edit.buttons.remove": "Remover", + + // "itemtemplate.edit.metadata.edit.buttons.undo": "Undo changes", + "itemtemplate.edit.metadata.edit.buttons.undo": "Desfazer alterações", + + // "itemtemplate.edit.metadata.edit.buttons.unedit": "Stop editing", + "itemtemplate.edit.metadata.edit.buttons.unedit": "Parar edição", + + // "itemtemplate.edit.metadata.empty": "The item template currently doesn't contain any metadata. Click Add to start adding a metadata value.", + "itemtemplate.edit.metadata.empty": "Atualmente o modelo do item não contém quaisquer metadados. Clique em 'Adicionar' para começar a adicionar um valor de metadados.", + + // "itemtemplate.edit.metadata.headers.edit": "Edit", + "itemtemplate.edit.metadata.headers.edit": "Editar", + + // "itemtemplate.edit.metadata.headers.field": "Field", + "itemtemplate.edit.metadata.headers.field": "Campo", + + // "itemtemplate.edit.metadata.headers.language": "Lang", + "itemtemplate.edit.metadata.headers.language": "Idioma", + + // "itemtemplate.edit.metadata.headers.value": "Value", + "itemtemplate.edit.metadata.headers.value": "Valor", + + // "itemtemplate.edit.metadata.metadatafield.error": "An error occurred validating the metadata field", + "itemtemplate.edit.metadata.metadatafield.error": "ocorreu um erro ao validar o campo de metadados", + + // "itemtemplate.edit.metadata.metadatafield.invalid": "Please choose a valid metadata field", + "itemtemplate.edit.metadata.metadatafield.invalid": "Por favor, selecione um campo de metadados válido", + + // "itemtemplate.edit.metadata.notifications.discarded.content": "Your changes were discarded. To reinstate your changes click the 'Undo' button", + "itemtemplate.edit.metadata.notifications.discarded.content": "As sua alterações foram descartadas. Para repor as suas alterações clique no botão 'Desfazer'", + + // "itemtemplate.edit.metadata.notifications.discarded.title": "Changed discarded", + "itemtemplate.edit.metadata.notifications.discarded.title": "Alterações descartadas", + + // "itemtemplate.edit.metadata.notifications.error.title": "An error occurred", + "itemtemplate.edit.metadata.notifications.error.title": "Ocorreu um erro", + + // "itemtemplate.edit.metadata.notifications.invalid.content": "Your changes were not saved. Please make sure all fields are valid before you save.", + "itemtemplate.edit.metadata.notifications.invalid.content": "As suas alterações não foram guardadas. Por favor, certifique-se de que todos os campos são válidos antes de os guardar.", + + // "itemtemplate.edit.metadata.notifications.invalid.title": "Metadata invalid", + "itemtemplate.edit.metadata.notifications.invalid.title": "Metadados inválidos", + + // "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": "O modelo do item que está atualmente a trabalhar foi alterado por outro utilizador. As suas alterações serão descartadas para evitar conflitos", + + // "itemtemplate.edit.metadata.notifications.outdated.title": "Changed outdated", + "itemtemplate.edit.metadata.notifications.outdated.title": "Alterações desatualizadas", + + // "itemtemplate.edit.metadata.notifications.saved.content": "Your changes to this item template's metadata were saved.", + "itemtemplate.edit.metadata.notifications.saved.content": "As suas alterações aos metadados deste modelo de item foram guardadas.", + + // "itemtemplate.edit.metadata.notifications.saved.title": "Metadata saved", + "itemtemplate.edit.metadata.notifications.saved.title": "Metadados guardados", + + // "itemtemplate.edit.metadata.reinstate-button": "Undo", + "itemtemplate.edit.metadata.reinstate-button": "Desfazer", + + // "itemtemplate.edit.metadata.reset-order-button": "Undo reorder", + "itemtemplate.edit.metadata.reset-order-button": "Desfazer reordenamento", + + // "itemtemplate.edit.metadata.save-button": "Save", + "itemtemplate.edit.metadata.save-button": "Guardar", // "journal.listelement.badge": "Journal", "journal.listelement.badge": "Revista", @@ -2983,17 +3890,18 @@ // "journal.page.titleprefix": "Journal: ", "journal.page.titleprefix": "Revista: ", - + // "journal.search.results.head": "Journal Search Results", - "journal.search.results.head": "Resultado da Pesquisa de Revistas", - - // "journal.search.title": "DSpace Angular :: Journal Search", - "journal.search.title": "DSpace :: Pesquisa de Revistas", + "journal.search.results.head": "Resultado da pesquisa de revistas", + // "journal-relationships.search.results.head": "Journal Search Results", + "journal-relationships.search.results.head": "Resultado da pesquisa de revistas", + // "journal.search.title": "Journal Search", + "journal.search.title": "Pesquisa de revistas", // "journalissue.listelement.badge": "Journal Issue", - "journalissue.listelement.badge": "Número", + "journalissue.listelement.badge": "Número de revista", // "journalissue.page.description": "Description", "journalissue.page.description": "Descrição", @@ -3002,27 +3910,25 @@ "journalissue.page.edit": "Editar este item", // "journalissue.page.issuedate": "Issue Date", - "journalissue.page.issuedate": "Data de Publicação", + "journalissue.page.issuedate": "Data de publicação", // "journalissue.page.journal-issn": "Journal ISSN", - "journalissue.page.journal-issn": "ISSN da Revista", + "journalissue.page.journal-issn": "ISSN da revista", // "journalissue.page.journal-title": "Journal Title", - "journalissue.page.journal-title": "Título da Revista", + "journalissue.page.journal-title": "Título da revista", // "journalissue.page.keyword": "Keywords", "journalissue.page.keyword": "Palavras-chave", // "journalissue.page.number": "Number", - "journalissue.page.number": "Número de Páginas", + "journalissue.page.number": "Número de páginas", // "journalissue.page.titleprefix": "Journal Issue: ", - "journalissue.page.titleprefix": "Número da Revista: ", - - + "journalissue.page.titleprefix": "Número de revista: ", // "journalvolume.listelement.badge": "Journal Volume", - "journalvolume.listelement.badge": "Volume da Revista", + "journalvolume.listelement.badge": "Volume de revista", // "journalvolume.page.description": "Description", "journalvolume.page.description": "Descrição", @@ -3031,15 +3937,46 @@ "journalvolume.page.edit": "Editar este item", // "journalvolume.page.issuedate": "Issue Date", - "journalvolume.page.issuedate": "Data de Publicação", + "journalvolume.page.issuedate": "Data de publicação", // "journalvolume.page.titleprefix": "Journal Volume: ", - "journalvolume.page.titleprefix": "Volume da Revista: ", + "journalvolume.page.titleprefix": "Volume de revista: ", // "journalvolume.page.volume": "Volume", "journalvolume.page.volume": "Volume", - + // "iiifsearchable.listelement.badge": "Document Media", + "iiifsearchable.listelement.badge": "Media do documeo", + + // "iiifsearchable.page.titleprefix": "Document: ", + "iiifsearchable.page.titleprefix": "Documento: ", + + // "iiifsearchable.page.doi": "Permanent Link: ", + "iiifsearchable.page.doi": "URI permanete: ", + + // "iiifsearchable.page.issue": "Issue: ", + "iiifsearchable.page.issue": "Núemero: ", + + // "iiifsearchable.page.description": "Description: ", + "iiifsearchable.page.description": "Descrição: ", + + // "iiifviewer.fullscreen.notice": "Use full screen for better viewing.", + "iiifviewer.fullscreen.notice": "Utilize o ecrã completo para melhor visualização .", + + // "iiif.listelement.badge": "Image Media", + "iiif.listelement.badge": "Media da imagem", + + // "iiif.page.titleprefix": "Image: ", + "iiif.page.titleprefix": "Imagem: ", + + // "iiif.page.doi": "Permanent Link: ", + "iiif.page.doi": "URI permanente: ", + + // "iiif.page.issue": "Issue: ", + "iiif.page.issue": "Número: ", + + // "iiif.page.description": "Description: ", + "iiif.page.description": "Description: ", // "loading.bitstream": "Loading bitstream...", "loading.bitstream": "A carregar ficheiro...", @@ -3081,7 +4018,7 @@ "loading.objects": "A carregar...", // "loading.recent-submissions": "Loading recent submissions...", - "loading.recent-submissions": "A carregar submissões recentes...", + "loading.recent-submissions": "A carregar depósitos recentes...", // "loading.search-results": "Loading search results...", "loading.search-results": "A carregar resultados de pesquisa...", @@ -3095,8 +4032,6 @@ // "loading.top-level-communities": "Loading top-level communities...", "loading.top-level-communities": "A carregar comunidades de nível superior...", - - // "login.form.email": "Email address", "login.form.email": "Endereço de email", @@ -3107,16 +4042,22 @@ "login.form.header": "Por favor entre no repositório", // "login.form.new-user": "New user? Click here to register.", - "login.form.new-user": "Novo Utilizador? Clique aqui para se registar.", + "login.form.new-user": "Novo utilizador? Clique aqui para se registar.", // "login.form.or-divider": "or", "login.form.or-divider": "ou", + // "login.form.oidc": "Log in with OIDC", + "login.form.oidc": "Entrar com OIDC", + + // "login.form.orcid": "Log in with ORCID", + "login.form.orcid": "Entrar com ORCID", + // "login.form.password": "Password", "login.form.password": "Palavra-chave", // "login.form.shibboleth": "Log in with Shibboleth", - "login.form.shibboleth": "Entrar com Autenticação Federada", + "login.form.shibboleth": "Entrar com autenticação federada", // "login.form.submit": "Log in", "login.form.submit": "Entrar", @@ -3127,10 +4068,8 @@ // "login.breadcrumbs": "Login", "login.breadcrumbs": "Entrar", - - // "logout.form.header": "Log out from DSpace", - "logout.form.header": "Sair do DSpace", + "logout.form.header": "Sair do repositório", // "logout.form.submit": "Log out", "logout.form.submit": "Sair", @@ -3138,18 +4077,17 @@ // "logout.title": "Logout", "logout.title": "Sair", - - - // "menu.header.admin": "Admin", + // "menu.header.admin": "Management", "menu.header.admin": "Administração", // "menu.header.image.logo": "Repository logo", "menu.header.image.logo": "Logo do repositório", - - + + // "menu.header.admin.description": "Management menu", + "menu.header.admin.description": "Menu de administração", // "menu.section.access_control": "Access Control", - "menu.section.access_control": "Controle de Acesso", + "menu.section.access_control": "Controlo de acesso", // "menu.section.access_control_authorizations": "Authorizations", "menu.section.access_control_authorizations": "Autorizações", @@ -3158,54 +4096,46 @@ "menu.section.access_control_groups": "Grupos", // "menu.section.access_control_people": "People", - "menu.section.access_control_people": "Pessoas", - - + "menu.section.access_control_people": "Pessoas", // "menu.section.admin_search": "Admin Search", - "menu.section.admin_search": "Pesquisa Administrativa", - - + "menu.section.admin_search": "Pesquisa administrativa", // "menu.section.browse_community": "This Community", - "menu.section.browse_community": "Esta Comunidade", + "menu.section.browse_community": "Esta comunidade", // "menu.section.browse_community_by_author": "By Author", - "menu.section.browse_community_by_author": "Por Autor", + "menu.section.browse_community_by_author": "Por autor", // "menu.section.browse_community_by_issue_date": "By Issue Date", - "menu.section.browse_community_by_issue_date": "Por Data de Publicação", + "menu.section.browse_community_by_issue_date": "Por data de publicação", // "menu.section.browse_community_by_title": "By Title", - "menu.section.browse_community_by_title": "Por Título", + "menu.section.browse_community_by_title": "Por título", // "menu.section.browse_global": "All of DSpace", - "menu.section.browse_global": "Percorrer", + "menu.section.browse_global": "Percorrer repositório", // "menu.section.browse_global_by_author": "By Author", - "menu.section.browse_global_by_author": "Por Autor", + "menu.section.browse_global_by_author": "Por autor", // "menu.section.browse_global_by_dateissued": "By Issue Date", - "menu.section.browse_global_by_dateissued": "Por Data de Publicação", + "menu.section.browse_global_by_dateissued": "Por data de publicação", // "menu.section.browse_global_by_subject": "By Subject", - "menu.section.browse_global_by_subject": "Por Assunto", + "menu.section.browse_global_by_subject": "Por assunto", // "menu.section.browse_global_by_title": "By Title", - "menu.section.browse_global_by_title": "Por Título", + "menu.section.browse_global_by_title": "Por título", // "menu.section.browse_global_communities_and_collections": "Communities & Collections", - "menu.section.browse_global_communities_and_collections": "Comunidades e Coleções", - - + "menu.section.browse_global_communities_and_collections": "Comunidades & Coleções", // "menu.section.control_panel": "Control Panel", - "menu.section.control_panel": "Painel de Controle", + "menu.section.control_panel": "Painel de controle", // "menu.section.curation_task": "Curation Task", - "menu.section.curation_task": "Tarefas de Curadoria", - - + "menu.section.curation_task": "Tarefas de curadoria", // "menu.section.edit": "Edit", "menu.section.edit": "Editar", @@ -3219,8 +4149,6 @@ // "menu.section.edit_item": "Item", "menu.section.edit_item": "Item", - - // "menu.section.export": "Export", "menu.section.export": "Exportar", @@ -3236,7 +4164,8 @@ // "menu.section.export_metadata": "Metadata", "menu.section.export_metadata": "Metadados", - + // "menu.section.export_batch": "Batch Export (ZIP)", + "menu.section.export_batch": "Importação em lote (ZIP)", // "menu.section.icon.access_control": "Access Control menu section", "menu.section.icon.access_control": "Secção do menu Controle de Acesso", @@ -3247,8 +4176,8 @@ // "menu.section.icon.control_panel": "Control Panel menu section", "menu.section.icon.control_panel": "Secção do menu Painel de Controlo", - // "menu.section.icon.curation_task": "Curation Task menu section", - "menu.section.icon.curation_task": "Secção do menu Tarefas de Curadoria", + // "menu.section.icon.curation_tasks": "Curation Task menu section", + "menu.section.icon.curation_tasks": "Secção do menu Tarefas de Curadoria", // "menu.section.icon.edit": "Edit menu section", "menu.section.icon.edit": "Secção do menu Editar", @@ -3259,6 +4188,9 @@ // "menu.section.icon.find": "Find menu section", "menu.section.icon.find": "Secção do menu Pesquisar", + // "menu.section.icon.health": "Health check menu section", + "menu.section.icon.health": "Seção do menu Diagnóstico do sistema", + // "menu.section.icon.import": "Import menu section", "menu.section.icon.import": "Secção do menu Importar", @@ -3268,34 +4200,33 @@ // "menu.section.icon.pin": "Pin sidebar", "menu.section.icon.pin": "Fixar barra lateral", - // "menu.section.icon.processes": "Processes menu section", - "menu.section.icon.processes": "Secção do menu Processos", - + // "menu.section.icon.processes": "Processes Health", + "menu.section.icon.processes": "Processos diagnóstico", + // "menu.section.icon.registries": "Registries menu section", "menu.section.icon.registries": "Secção do menu Registos", // "menu.section.icon.statistics_task": "Statistics Task menu section", "menu.section.icon.statistics_task": "Secção do menu Tarefas de Estatísticas", + // "menu.section.icon.workflow": "Administer workflow menu section", + "menu.section.icon.workflow": "Menu administração de tarefas", + // "menu.section.icon.unpin": "Unpin sidebar", "menu.section.icon.unpin": "Soltar barra lateral", - - // "menu.section.import": "Import", "menu.section.import": "Importar", - // "menu.section.import_batch": "Batch Import (ZIP)", - "menu.section.import_batch": "Importação em Lote (ZIP)", + // "menu.section.import_batch": "Batch import (ZIP)", + "menu.section.import_batch": "Importação em lote (ZIP)", // "menu.section.import_metadata": "Metadata", "menu.section.import_metadata": "Metadados", - - // "menu.section.new": "New", "menu.section.new": "Novo", - + // "menu.section.new_collection": "Collection", "menu.section.new_collection": "Coleção", @@ -3306,25 +4237,22 @@ "menu.section.new_item": "Item", // "menu.section.new_item_version": "Item Version", - "menu.section.new_item_version": "Versão do Item", + "menu.section.new_item_version": "Versão do item", // "menu.section.new_process": "Process", "menu.section.new_process": "Processos", - - // "menu.section.pin": "Pin sidebar", "menu.section.pin": "Fixar barra lateral", // "menu.section.unpin": "Unpin sidebar", "menu.section.unpin": "Soltar barra lateral", - - // "menu.section.processes": "Processes", "menu.section.processes": "Processos", - + // "menu.section.health": "Health", + "menu.section.health": "Diagnóstico do sistema", // "menu.section.registries": "Registries", "menu.section.registries": "Registos", @@ -3334,58 +4262,61 @@ // "menu.section.registries_metadata": "Metadata", "menu.section.registries_metadata": "Metadados", - - - - // "menu.section.statistics": "Statistics", + + // "menu.section.statistics": "Statistics", "menu.section.statistics": "Estatísticas", - + // "menu.section.statistics_task": "Statistics Task", - "menu.section.statistics_task": "Tarefas de Estatísticas", - - + "menu.section.statistics_task": "Tarefa de estatísticas", // "menu.section.toggle.access_control": "Toggle Access Control section", - "menu.section.toggle.access_control": "Alternar Secção Controle de Acesso", + "menu.section.toggle.access_control": "Alternar secção controle de acesso", // "menu.section.toggle.control_panel": "Toggle Control Panel section", - "menu.section.toggle.control_panel": "Alternar Secção Painel de COntrole", + "menu.section.toggle.control_panel": "Alternar secção painel de controle", // "menu.section.toggle.curation_task": "Toggle Curation Task section", - "menu.section.toggle.curation_task": "Alternar Secção Tarefas de Curadoria", + "menu.section.toggle.curation_task": "Alternar secção tarefas de curadoria", // "menu.section.toggle.edit": "Toggle Edit section", - "menu.section.toggle.edit": "Alternar Secção Editar", + "menu.section.toggle.edit": "Alternar secção editar", // "menu.section.toggle.export": "Toggle Export section", - "menu.section.toggle.export": "Alternar Secção Exportar", + "menu.section.toggle.export": "Alternar secção exportar", // "menu.section.toggle.find": "Toggle Find section", - "menu.section.toggle.find": "Alternar Secção Pesquisa", + "menu.section.toggle.find": "Alternar secção pesquisa", // "menu.section.toggle.import": "Toggle Import section", - "menu.section.toggle.import": "Alternar Secção Importar", + "menu.section.toggle.import": "Alternar secção importar", // "menu.section.toggle.new": "Toggle New section", - "menu.section.toggle.new": "Alternar Nova Secção", + "menu.section.toggle.new": "Alternar nova secção", // "menu.section.toggle.registries": "Toggle Registries section", - "menu.section.toggle.registries": "Alternar Secção Registos", + "menu.section.toggle.registries": "Alternar secção registos", // "menu.section.toggle.statistics_task": "Toggle Statistics Task section", - "menu.section.toggle.statistics_task": "Alternar Secção Tarefas de Estatísticas", - + "menu.section.toggle.statistics_task": "Alternar secção tarefas de estatísticas", // "menu.section.workflow": "Administer Workflow", - "menu.section.workflow": "Gestão do Workflow", + "menu.section.workflow": "Gestão do workflow", + // "metadata-export-search.tooltip": "Export search results as CSV", + "metadata-export-search.tooltip": "Exportar resultados de pesquisa em CSV", + + // "metadata-export-search.submit.success": "The export was started successfully", + "metadata-export-search.submit.success": "A exportação foi iniciada com sucesso", + + // "metadata-export-search.submit.error": "Starting the export has failed", + "metadata-export-search.submit.error": "O início da exportação falhou!", + + // "mydspace.breadcrumbs": "MyDSpace", + "mydspace.breadcrumbs": "Área Pessoal", // "mydspace.description": "", "mydspace.description": "", - // "mydspace.general.text-here": "here", - "mydspace.general.text-here": "aqui", - // "mydspace.messages.controller-help": "Select this option to send a message to item's submitter.", "mydspace.messages.controller-help": "Selecione esta opção para enviar uma mensagem para o depositante do item.", @@ -3426,7 +4357,7 @@ "mydspace.messages.to": "Para", // "mydspace.new-submission": "New submission", - "mydspace.new-submission": "Nova submissão", + "mydspace.new-submission": "Novo depósito", // "mydspace.new-submission-external": "Import metadata from external source", "mydspace.new-submission-external": "Importar metadados de fontes externas", @@ -3435,7 +4366,7 @@ "mydspace.new-submission-external-short": "Importar metadados", // "mydspace.results.head": "Your submissions", - "mydspace.results.head": "Minhas submissões", + "mydspace.results.head": "Meus depósitos", // "mydspace.results.no-abstract": "No Abstract", "mydspace.results.no-abstract": "Sem Resumo", @@ -3444,13 +4375,13 @@ "mydspace.results.no-authors": "Sem Autores", // "mydspace.results.no-collections": "No Collections", - "mydspace.results.no-collections": "Sem Coleções", + "mydspace.results.no-collections": "Sem coleções", // "mydspace.results.no-date": "No Date", - "mydspace.results.no-date": "Sem Data", + "mydspace.results.no-date": "Sem data", // "mydspace.results.no-files": "No Files", - "mydspace.results.no-files": "Sem Ficheiros", + "mydspace.results.no-files": "Sem ficheiros", // "mydspace.results.no-results": "There were no items to show", "mydspace.results.no-results": "Não havia itens a mostrar", @@ -3459,28 +4390,34 @@ "mydspace.results.no-title": "Sem título", // "mydspace.results.no-uri": "No Uri", - "mydspace.results.no-uri": "Sem Uri", + "mydspace.results.no-uri": "Sem URI", + + // "mydspace.search-form.placeholder": "Search in mydspace...", + "mydspace.search-form.placeholder": "Pesquisar na Área Pessoal...", - // "mydspace.show.workflow": "All tasks", + // "mydspace.show.workflow": "Workflow tasks", "mydspace.show.workflow": "Todas as tarefas", // "mydspace.show.workspace": "Your Submissions", - "mydspace.show.workspace": "Minhas Submissões", + "mydspace.show.workspace": "Meus depósitos", + + // "mydspace.show.supervisedWorkspace": "Supervised items", + "mydspace.show.supervisedWorkspace": "Itens supervisionados", // "mydspace.status.archived": "Archived", - "mydspace.status.archived": "Arquivado", + "mydspace.status.archived": "Depósito aceite", // "mydspace.status.validation": "Validation", - "mydspace.status.validation": "Validação", + "mydspace.status.validation": "Em validação", // "mydspace.status.waiting-for-controller": "Waiting for controller", - "mydspace.status.waiting-for-controller": "Esperando pelo controlador", + "mydspace.status.waiting-for-controller": "Aguarda validador", // "mydspace.status.workflow": "Workflow", - "mydspace.status.workflow": "Fluxo de trabalho", + "mydspace.status.workflow": "Em fluxo de trabalho", // "mydspace.status.workspace": "Workspace", - "mydspace.status.workspace": "Espaço de trabalho", + "mydspace.status.workspace": "Depósito por terminar", // "mydspace.title": "MyDSpace", "mydspace.title": "Área Pessoal", @@ -3496,30 +4433,34 @@ // "mydspace.upload.upload-multiple-successful": "{{qty}} new workspace items created.", "mydspace.upload.upload-multiple-successful": "{{qty}} novo(s) item(ns) de espaço de trabalho criados.", - - // "mydspace.upload.upload-successful": "New workspace item created. Click {{here}} for edit it.", - "mydspace.upload.upload-successful": "Novo item de espaço de trabalho criado. Clique {{here}} para o editar.", - + // "mydspace.view-btn": "View", "mydspace.view-btn": "Ver", - - // "nav.browse.header": "All of DSpace", - "nav.browse.header": "Tudo no DSpace", + "nav.browse.header": "Tudo no repositório", // "nav.community-browse.header": "By Community", - "nav.community-browse.header": "Por Comunidade", + "nav.community-browse.header": "Por comunidade", + // "nav.context-help-toggle": "Toggle context help", + "nav.context-help-toggle": "Alternar ajuda contextual", + // "nav.language": "Language switch", - "nav.language": "Escolha de idioma", + "nav.language": "Escolher idioma", // "nav.login": "Log In", "nav.login": "Entrar", + // "nav.user-profile-menu-and-logout": "User profile menu and Log Out", + "nav.user-profile-menu-and-logout": "Menu perfil do utilizador e sair", + // "nav.logout": "Log Out", "nav.logout": "Sair", + // "nav.main.description": "Main navigation bar", + "nav.main.description": "Barra de naveção principal", + // "nav.mydspace": "MyDSpace", "nav.mydspace": "Área Pessoal", @@ -3533,13 +4474,26 @@ "nav.statistics.header": "Estatísticas", // "nav.stop-impersonating": "Stop impersonating EPerson", - "nav.stop-impersonating": "Deixar de assumir o papel do Utilizador", - + "nav.stop-impersonating": "Deixar de assumir o papel do utilizador", + + // "nav.subscriptions" : "Subscriptions", + "nav.subscriptions" : "Subscrições de alertas", + // "nav.toggle" : "Toggle navigation", + "nav.toggle" : "Alternar a navegação", + + // "nav.user.description" : "User profile bar", + "nav.user.description" : "Barra do perfil de utilizador", + + // "none.listelement.badge": "Item", + "none.listelement.badge": "Item", // "orgunit.listelement.badge": "Organizational Unit", "orgunit.listelement.badge": "Organização", + // "orgunit.listelement.no-title": "Untitled", + "orgunit.listelement.no-title": "Sem título", + // "orgunit.page.city": "City", "orgunit.page.city": "Cidade", @@ -3561,7 +4515,8 @@ // "orgunit.page.titleprefix": "Organizational Unit: ", "orgunit.page.titleprefix": "Organização: ", - + // "pagination.options.description": "Pagination options", + "pagination.options.description": "Opções de paginação", // "pagination.results-per-page": "Results Per Page", "pagination.results-per-page": "Resultados por página", @@ -3573,9 +4528,7 @@ "pagination.showing.label": "A mostrar ", // "pagination.sort-direction": "Sort Options", - "pagination.sort-direction": "Opções de Ordenação", - - + "pagination.sort-direction": "Opções de ordenação", // "person.listelement.badge": "Person", "person.listelement.badge": "Pessoa", @@ -3601,6 +4554,9 @@ // "person.page.lastname": "Last Name", "person.page.lastname": "Último Nome", + // "person.page.name": "Name", + "person.page.name": "Nome", + // "person.page.link.full": "Show all metadata", "person.page.link.full": "Mostrar todos os metadados", @@ -3614,12 +4570,13 @@ "person.page.titleprefix": "Pessoa: ", // "person.search.results.head": "Person Search Results", - "person.search.results.head": "Resultado da pesquisa de Pessoa", - - // "person.search.title": "DSpace Angular :: Person Search", - "person.search.title": "DSpace :: Pesquisar Pessoa", + "person.search.results.head": "Resultados da pesquisa de pessoas", + // "person-relationships.search.results.head": "Person Search Results", + "person-relationships.search.results.head": "Resultados da pesquisa de pessoas", + // "person.search.title": "Person Search", + "person.search.title": "Pesquisar pessoa", // "process.new.select-parameters": "Parameters", "process.new.select-parameters": "Parâmetros", @@ -3627,7 +4584,7 @@ // "process.new.cancel": "Cancel", "process.new.cancel": "Cancelar", - // "process.new.submit": "Submit", + // "process.new.submit": "Save", "process.new.submit": "Guardar", // "process.new.select-script": "Script", @@ -3637,7 +4594,7 @@ "process.new.select-script.placeholder": "Escolha um script...", // "process.new.select-script.required": "Script is required", - "process.new.select-script.required": "É necessário um Script", + "process.new.select-script.required": "É necessário um script", // "process.new.parameter.file.upload-button": "Select file...", "process.new.parameter.file.upload-button": "Selecionar ficheiro...", @@ -3678,8 +4635,6 @@ // "process.new.breadcrumbs": "Create a new process", "process.new.breadcrumbs": "Criar um novo processo", - - // "process.detail.arguments" : "Arguments", "process.detail.arguments" : "Argumentos", @@ -3725,10 +4680,32 @@ // "process.detail.create" : "Create similar process", "process.detail.create" : "Criar processo similar", + // "process.detail.actions": "Actions", + "process.detail.actions": "Ações", + + // "process.detail.delete.button": "Delete process", + "process.detail.delete.button": "Remover processo", + + // "process.detail.delete.header": "Delete process", + "process.detail.delete.header": "Remover processo", + + // "process.detail.delete.body": "Are you sure you want to delete the current process?", + "process.detail.delete.body": "Tem a certeza de que quer remover o processo actual?", + + // "process.detail.delete.cancel": "Cancel", + "process.detail.delete.cancel": "Cancelar", + + // "process.detail.delete.confirm": "Delete process", + "process.detail.delete.confirm": "Remover processo", + + // "process.detail.delete.success": "The process was successfully deleted.", + "process.detail.delete.success": "O processo foi removido com sucesso.", + + // "process.detail.delete.error": "Something went wrong when deleting the process", + "process.detail.delete.error": "Ocorreu algum erro ao remover o processo", - - // "process.overview.table.finish" : "Finish time", - "process.overview.table.finish" : "Tempo de término", + // "process.overview.table.finish" : "Finish time (UTC)", + "process.overview.table.finish" : "Hora de término (UTC)", // "process.overview.table.id" : "Process ID", "process.overview.table.id" : "ID do Processo", @@ -3736,8 +4713,8 @@ // "process.overview.table.name" : "Name", "process.overview.table.name" : "Nome", - // "process.overview.table.start" : "Start time", - "process.overview.table.start" : "Início", + // "process.overview.table.start" : "Start time (UTC)", + "process.overview.table.start" : "Hora de início (UTC)", // "process.overview.table.status" : "Status", "process.overview.table.status" : "Estado", @@ -3746,38 +4723,67 @@ "process.overview.table.user" : "Utilizador", // "process.overview.title": "Processes Overview", - "process.overview.title": "Resumo dos Processos", + "process.overview.title": "Resumo dos processos", // "process.overview.breadcrumbs": "Processes Overview", - "process.overview.breadcrumbs": "Resumo dos Processos", + "process.overview.breadcrumbs": "Resumo dos processos", // "process.overview.new": "New", "process.overview.new": "Novo", + // "process.overview.table.actions": "Actions", + "process.overview.table.actions": "Ações", + + // "process.overview.delete": "Delete {{count}} processes", + "process.overview.delete": "Remover {{count}} processos", + + // "process.overview.delete.clear": "Clear delete selection", + "process.overview.delete.clear": "Limpar selecção a remover", + + // "process.overview.delete.processing": "{{count}} process(es) are being deleted. Please wait for the deletion to fully complete. Note that this can take a while.", + "process.overview.delete.processing": "{{count}} processo(s) estão a ser removidos. Por favor aguarde pela remoção completa. Notar que esta operação pode demorar algum tempo.", + + // "process.overview.delete.body": "Are you sure you want to delete {{count}} process(es)?", + "process.overview.delete.body": "Tem a certeza de que quer remover o(s) processo(s) {{count}}?", + + // "process.overview.delete.header": "Delete processes", + "process.overview.delete.header": "Remover processos", + + // "process.bulk.delete.error.head": "Error on deleteing process", + "process.bulk.delete.error.head": "Ocorreu um erro ao remover os processos", + + // "process.bulk.delete.error.body": "The process with ID {{processId}} could not be deleted. The remaining processes will continue being deleted. ", + "process.bulk.delete.error.body": "O processo com o ID {{{processId}} não pôde ser removido. Os restantes processos continuarão a ser removidos.", + + // "process.bulk.delete.success": "{{count}} process(es) have been succesfully deleted", + "process.bulk.delete.success": "{{count}} processso(s) foram removidos com sucesso", // "profile.breadcrumbs": "Update Profile", - "profile.breadcrumbs": "Atualizar Perfil", + "profile.breadcrumbs": "Atualizar perfil", // "profile.card.identify": "Identify", "profile.card.identify": "Identificação", // "profile.card.security": "Security", - "profile.card.security": "Segurança", + "profile.card.security": "Senha de acesso", - // "profile.form.submit": "Update Profile", - "profile.form.submit": "Atualizar Perfil", + // "profile.form.submit": "Save", + "profile.form.submit": "Atualizar perfil", // "profile.groups.head": "Authorization groups you belong to", "profile.groups.head": "Os seus grupos", + // "profile.special.groups.head": "Authorization special groups you belong to", + "profile.special.groups.head": "Autorização de grupos especiais aos quais pertence", + // "profile.head": "Update Profile", - "profile.head": "Atualizar Perfil", + "profile.head": "Atualizar perfil", // "profile.metadata.form.error.firstname.required": "First Name is required", - "profile.metadata.form.error.firstname.required": "O Nome é obrigatório", + "profile.metadata.form.error.firstname.required": "O preenchimento do nome é um elemento obrigatório!", // "profile.metadata.form.error.lastname.required": "Last Name is required", - "profile.metadata.form.error.lastname.required": "O Apelido é obrigatório", + "profile.metadata.form.error.lastname.required": "O preenchiento do apelido é um elemento obrigatório!", // "profile.metadata.form.label.email": "Email Address", "profile.metadata.form.label.email": "Endereço de correio eletrónico", @@ -3807,42 +4813,46 @@ "profile.notifications.warning.no-changes.title": "Sem alterações", // "profile.security.form.error.matching-passwords": "The passwords do not match.", - "profile.security.form.error.matching-passwords": "As palavras-chave não coincidem.", + "profile.security.form.error.matching-passwords": "As senhas não coincidem.", - // "profile.security.form.error.password-length": "The password should be at least 6 characters long.", - "profile.security.form.error.password-length": "A palavra-chave deve ter pelo menos 6 caracteres.", - - // "profile.security.form.info": "Optionally, you can enter a new password in the box below, and confirm it by typing it again into the second box. It should be at least six characters long.", - "profile.security.form.info": "Opcionalmente, pode incluir a nova palavra-chave na primeira caixa de texto e confirmar a mesma incluindo-a novamente na segunda caixa de texto. Deverá possuir pelo menos 6 caracteres.", + // "profile.security.form.info": "Optionally, you can enter a new password in the box below, and confirm it by typing it again into the second box.", + "profile.security.form.info": "Opcionalmente, pode criar uma nova senha introduzindo-a primeira caixa de texto e confirmando-a na segunda caixa de texto.", // "profile.security.form.label.password": "Password", - "profile.security.form.label.password": "Palavra-chave", + "profile.security.form.label.password": "Senha", // "profile.security.form.label.passwordrepeat": "Retype to confirm", - "profile.security.form.label.passwordrepeat": "Insira novamente para confirmar", + "profile.security.form.label.passwordrepeat": "Insira novamente a senha para confirmar", + + // "profile.security.form.label.current-password": "Current password", + "profile.security.form.label.current-password": "Senha atual", // "profile.security.form.notifications.success.content": "Your changes to the password were saved.", - "profile.security.form.notifications.success.content": "As alterações à palavra-chave foram guardadas.", + "profile.security.form.notifications.success.content": "As alterações da senha foram guardadas.", // "profile.security.form.notifications.success.title": "Password saved", - "profile.security.form.notifications.success.title": "Palavra-chave guardada", + "profile.security.form.notifications.success.title": "Senha guardada", // "profile.security.form.notifications.error.title": "Error changing passwords", - "profile.security.form.notifications.error.title": "Erro ao mudar a palavra-chave", + "profile.security.form.notifications.error.title": "Erro ao mudar a senha", - // "profile.security.form.notifications.error.not-long-enough": "The password has to be at least 6 characters long.", - "profile.security.form.notifications.error.not-long-enough": "A palavra-chave deve ter pelo menos 6 caracteres.", + // "profile.security.form.notifications.error.change-failed": "An error occurred while trying to change the password. Please check if the current password is correct.", + "profile.security.form.notifications.error.change-failed": "Ocorreu um erro ao tentar alterar a senha. Verifique se a senha atual está correcta.", // "profile.security.form.notifications.error.not-same": "The provided passwords are not the same.", - "profile.security.form.notifications.error.not-same": "As palavras-chave fornecidas não coincidem.", + "profile.security.form.notifications.error.not-same": "As senhas fornecidas não coincidem.", + + // "profile.security.form.notifications.error.general": "Please fill required fields of security form.", + "profile.security.form.notifications.error.general": "Por favor preencha os campos obrigatórios no formulário de segurança.", // "profile.title": "Update Profile", - "profile.title": "Atualizar Perfil", - + "profile.title": "Atualizar perfil", + // "profile.card.researcher": "Researcher Profile", + "profile.card.researcher": "Perfil do investigador", // "project.listelement.badge": "Research Project", - "project.listelement.badge": "Projeto de Investigação", + "project.listelement.badge": "Projeto de investigação", // "project.page.contributor": "Contributors", "project.page.contributor": "Contribuidores", @@ -3869,12 +4879,13 @@ "project.page.status": "Estado", // "project.page.titleprefix": "Research Project: ", - "project.page.titleprefix": "Projeto de Investigação: ", - + "project.page.titleprefix": "Projeto de investigação: ", + // "project.search.results.head": "Project Search Results", - "project.search.results.head": "Resultado da Pesquisa de Projetos", - - + "project.search.results.head": "Resultados da pesquisa de projetos", + + // "project-relationships.search.results.head": "Project Search Results", + "project-relationships.search.results.head": "Resultados da pesquisa de projetos", // "publication.listelement.badge": "Publication", "publication.listelement.badge": "Publicação", @@ -3886,10 +4897,10 @@ "publication.page.edit": "Editar este item", // "publication.page.journal-issn": "Journal ISSN", - "publication.page.journal-issn": "ISSN do Periódico", + "publication.page.journal-issn": "ISSN da revista", // "publication.page.journal-title": "Journal Title", - "publication.page.journal-title": "Título do Periódico", + "publication.page.journal-title": "Título da revista", // "publication.page.publisher": "Publisher", "publication.page.publisher": "Editora", @@ -3899,16 +4910,27 @@ // "publication.page.volume-title": "Volume Title", "publication.page.volume-title": "Título do Volume", - + // "publication.search.results.head": "Publication Search Results", - "publication.search.results.head": "Resultados da Busca de Publicação", + "publication.search.resuts.head": "Resultados da pesquisa de publicações", - // "publication.search.title": "DSpace Angular :: Publication Search", - "publication.search.title": "DSpace :: Busca de Publicações", + // "publication-relationships.search.results.head": "Publication Search Results", + "publication-relationships.search.results.head": "Resultados da pesquisa de publicações", + // "publication.search.title": "Publication Search", + "publication.search.title": "Pesquisa de publicações", + + // "media-viewer.next": "Next", + "media-viewer.next": "Próximo", + + // "media-viewer.previous": "Previous", + "media-viewer.previous": "Anterior", + + // "media-viewer.playlist": "Playlist", + "media-viewer.playlist": "Playlist", // "register-email.title": "New user registration", - "register-email.title": "Registo de Novo Utilizador", + "register-email.title": "Registo de novo utilizador", // "register-page.create-profile.header": "Create Profile", "register-page.create-profile.header": "Criar perfil", @@ -3917,22 +4939,22 @@ "register-page.create-profile.identification.header": "Identificação", // "register-page.create-profile.identification.email": "Email Address", - "register-page.create-profile.identification.email": "Endereço de Correio Eletrónico", + "register-page.create-profile.identification.email": "Endereço de correio eletrónico", // "register-page.create-profile.identification.first-name": "First Name *", "register-page.create-profile.identification.first-name": "Nome *", // "register-page.create-profile.identification.first-name.error": "Please fill in a First Name", - "register-page.create-profile.identification.first-name.error": "Inclua um Nome", + "register-page.create-profile.identification.first-name.error": "Inclua um nome", // "register-page.create-profile.identification.last-name": "Last Name *", "register-page.create-profile.identification.last-name": "Apelido *", // "register-page.create-profile.identification.last-name.error": "Please fill in a Last Name", - "register-page.create-profile.identification.last-name.error": "Inclua um Apelido", + "register-page.create-profile.identification.last-name.error": "Inclua um apelido", // "register-page.create-profile.identification.contact": "Contact Telephone", - "register-page.create-profile.identification.contact": "Contacto Telefónico", + "register-page.create-profile.identification.contact": "Contacto telefónico", // "register-page.create-profile.identification.language": "Language", "register-page.create-profile.identification.language": "Idioma", @@ -3940,8 +4962,8 @@ // "register-page.create-profile.security.header": "Security", "register-page.create-profile.security.header": "Segurança", - // "register-page.create-profile.security.info": "Please enter a password in the box below, and confirm it by typing it again into the second box. It should be at least six characters long.", - "register-page.create-profile.security.info": "Insira uma palavra-chave na caixa abaixo, e confirme colocando-a de novo da segunda caixa. Deverá ter pelo menos 6 caracteres.", + // "register-page.create-profile.security.info": "Please enter a password in the box below, and confirm it by typing it again into the second box.", + "register-page.create-profile.security.info": "Insira uma palavra-chave na caixa abaixo, e confirme colocando-a de novo da segunda caixa.", // "register-page.create-profile.security.label.password": "Password *", "register-page.create-profile.security.label.password": "Palavra-chave *", @@ -3955,39 +4977,38 @@ // "register-page.create-profile.security.error.matching-passwords": "The passwords do not match.", "register-page.create-profile.security.error.matching-passwords": "As palavras-chave não coincidem.", - // "register-page.create-profile.security.error.password-length": "The password should be at least 6 characters long.", - "register-page.create-profile.security.error.password-length": "A palavra-chave deve possuir pelo menos 6 caracteres.", - // "register-page.create-profile.submit": "Complete Registration", "register-page.create-profile.submit": "Finalizar Registo", // "register-page.create-profile.submit.error.content": "Something went wrong while registering a new user.", - "register-page.create-profile.submit.error.content": "Ocorreu um erro ao registar o Utilizador.", + "register-page.create-profile.submit.error.content": "Ocorreu um erro ao registar o utilizador.", // "register-page.create-profile.submit.error.head": "Registration failed", - "register-page.create-profile.submit.error.head": "Falha no Registo", + "register-page.create-profile.submit.error.head": "Falha no registo", // "register-page.create-profile.submit.success.content": "The registration was successful. You have been logged in as the created user.", "register-page.create-profile.submit.success.content": "O registo foi criado com sucesso. Foi iniciada sessão com o Utilizador criado.", // "register-page.create-profile.submit.success.head": "Registration completed", - "register-page.create-profile.submit.success.head": "Registo Finalizado com Sucesso", - + "register-page.create-profile.submit.success.head": "Registo finalizado com sucesso", // "register-page.registration.header": "New user registration", - "register-page.registration.header": "Registo de Novo Utilizador", + "register-page.registration.header": "Registo de novo utilizador", // "register-page.registration.info": "Register an account to subscribe to collections for email updates, and submit new items to DSpace.", - "register-page.registration.info": "Registe uma conta de Utilizador para subscrever novos conteúdos das coleções e depositar itens no repositório.", + "register-page.registration.info": "Crie uma conta de utilizador para subscrever novos conteúdos das coleções e depositar itens no repositório.", // "register-page.registration.email": "Email Address *", - "register-page.registration.email": "Endereço de Correio Eletrónico *", + "register-page.registration.email": "Endereço de correio eletrónico *", // "register-page.registration.email.error.required": "Please fill in an email address", - "register-page.registration.email.error.required": "Insira um endereço de email", + "register-page.registration.email.error.required": "Insira um endereço de correio eletrónico", - // "register-page.registration.email.error.pattern": "Please fill in a valid email address", - "register-page.registration.email.error.pattern": "Insira um endereço de email válido", + // "register-page.registration.email.error.not-email-form": "Please fill in a valid email address.", + "register-page.registration.email.error.not-email-form": "Insira um endereço de correio eletrónico válido.", + + // "register-page.registration.email.error.not-valid-domain": "Use email with allowed domains: {{ domains }}", + "register-page.registration.email.error.not-valid-domain": "Usar endereço de correio eletrónico com domínios permitidos: {{ domains }}", // "register-page.registration.email.hint": "This address will be verified and used as your login name.", "register-page.registration.email.hint": "Este endereço de correio eletrónico será verificado e usado para iniciar sessão.", @@ -3996,7 +5017,7 @@ "register-page.registration.submit": "Registo", // "register-page.registration.success.head": "Verification email sent", - "register-page.registration.success.head": "Email de verificação enviado", + "register-page.registration.success.head": "Enviado Email de verificação", // "register-page.registration.success.content": "An email has been sent to {{ email }} containing a special URL and further instructions.", "register-page.registration.success.content": "Foi enviado um email para {{ email }} com instruções e um endereço especial para confirmação.", @@ -4007,7 +5028,29 @@ // "register-page.registration.error.content": "An error occured when registering the following email address: {{ email }}", "register-page.registration.error.content": "Ocorreu um erro ao registar o seguinte endereço de correio eletrónico: {{ email }}", + // "register-page.registration.error.recaptcha": "Error when trying to authenticate with recaptcha", + "register-page.registration.error.recaptcha": "Ocorreu um erro ao tentar autenticar com o recaptcha", + + // "register-page.registration.google-recaptcha.must-accept-cookies": "In order to register you must accept the Registration and Password recovery (Google reCaptcha) cookies.", + "register-page.registration.google-recaptcha.must-accept-cookies": "Para se registar deve aceitar o registo e a senha de recuperação (Google reCaptcha) cookies.", + + // "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 endereço de e-mail não consta da lista de domínios que podem ser registados. Os domínios permitidos são {{ domains }}", + // "register-page.registration.google-recaptcha.open-cookie-settings": "Open cookie settings", + "register-page.registration.google-recaptcha.open-cookie-settings": "Configurações de Open cookie", + + // "register-page.registration.google-recaptcha.notification.title": "Google reCaptcha", + "register-page.registration.google-recaptcha.notification.title": "Google reCaptcha", + + // "register-page.registration.google-recaptcha.notification.message.error": "An error occurred during reCaptcha verification", + "register-page.registration.google-recaptcha.notification.message.error": "Ocorreu um erro na verificação do reCaptcha", + + // "register-page.registration.google-recaptcha.notification.message.expired": "Verification expired. Please verify again.", + "register-page.registration.google-recaptcha.notification.message.expired": "Verificação expirou. Por favor verifique novamente.", + + // "register-page.registration.info.maildomain": "Accounts can be registered for mail addresses of the domains", + "register-page.registration.info.maildomain": "As contas podem ser registadas para os endereços de email os domínios", // "relationships.add.error.relationship-type.content": "No suitable match could be found for relationship type {{ type }} between the two items", "relationships.add.error.relationship-type.content": "Não foi encontrado uma licação adequada no tipo de relação {{ type }} entre os dois itens", @@ -4037,13 +5080,13 @@ "relationships.isJournalOf": "Periódicos", // "relationships.isOrgUnitOf": "Organizational Units", - "relationships.isOrgUnitOf": "Unidades Organizacionais", + "relationships.isOrgUnitOf": "Unidades organizacionais", // "relationships.isPersonOf": "Authors", "relationships.isPersonOf": "Autores", // "relationships.isProjectOf": "Research Projects", - "relationships.isProjectOf": "Projetos de Investigação", + "relationships.isProjectOf": "Projetos de investigação", // "relationships.isPublicationOf": "Publications", "relationships.isPublicationOf": "Publicações", @@ -4052,19 +5095,35 @@ "relationships.isPublicationOfJournalIssue": "Artigos", // "relationships.isSingleJournalOf": "Journal", - "relationships.isSingleJournalOf": "Periódico", + "relationships.isSingleJournalOf": "Revista", // "relationships.isSingleVolumeOf": "Journal Volume", - "relationships.isSingleVolumeOf": "Volume do Periódico", + "relationships.isSingleVolumeOf": "Volume de revista", // "relationships.isVolumeOf": "Journal Volumes", - "relationships.isVolumeOf": "Volumes do Periódico", + "relationships.isVolumeOf": "Volumes da revista", // "relationships.isContributorOf": "Contributors", "relationships.isContributorOf": "Contribuidores", + // "relationships.isContributorOf.OrgUnit": "Contributor (Organizational Unit)", + "relationships.isContributorOf.OrgUnit": "Colaborador (Unidade organizacional)", + + // "relationships.isContributorOf.Person": "Contributor", + "relationships.isContributorOf.Person": "Contribuidor", + // "relationships.isFundingAgencyOf.OrgUnit": "Funder", + "relationships.isFundingAgencyOf.OrgUnit": "Financiador", + // "repository.image.logo": "Repository logo", + "repository.image.logo": "Logótipo do repositório", + + // "repository.title.prefix": "DSpace Angular :: ", + "repository.title.prefix": "Repositório :: ", + + // "repository.title.prefixDSpace": "DSpace Angular ::", + "repository.title.prefixDSpace": "Repositório ::", + // "resource-policies.add.button": "Add", "resource-policies.add.button": "Adicionar", @@ -4116,6 +5175,12 @@ // "resource-policies.edit.page.failure.content": "An error occurred while editing the resource policy.", "resource-policies.edit.page.failure.content": "Ocorreu um erro ao editar a política de recurso.", + // "resource-policies.edit.page.target-failure.content": "An error occurred while editing the target (ePerson or group) of the resource policy.", + "resource-policies.edit.page.target-failure.content": "Ocorreu um erro durante a edição da (ePerson ou grupo) da política de recursos.", + + // "resource-policies.edit.page.other-failure.content": "An error occurred while editing the resource policy. The target (ePerson or group) has been successfully updated.", + "resource-policies.edit.page.other-failure.content": "Ocorreu um erro durante a edição da política de recursos. A (ePerson ou grupo) foi actualizado com sucesso.", + // "resource-policies.edit.page.success.content": "Operation successful", "resource-policies.edit.page.success.content": "Operação bem sucedida", @@ -4123,19 +5188,19 @@ "resource-policies.edit.page.title": "Editar política de recurso", // "resource-policies.form.action-type.label": "Select the action type", - "resource-policies.form.action-type.label": "Seleccione o tipo de ação", + "resource-policies.form.action-type.label": "Selecione o tipo de ação", // "resource-policies.form.action-type.required": "You must select the resource policy action.", "resource-policies.form.action-type.required": "Deve selecionar a ação da política de recurso.", // "resource-policies.form.eperson-group-list.label": "The eperson or group that will be granted the permission", - "resource-policies.form.eperson-group-list.label": "O Utilizador ou grupo ao qual serão atribuídas as permissões", + "resource-policies.form.eperson-group-list.label": "O utilizador ou grupo ao qual serão atribuídas as permissões", // "resource-policies.form.eperson-group-list.select.btn": "Select", "resource-policies.form.eperson-group-list.select.btn": "Seleccionar", // "resource-policies.form.eperson-group-list.tab.eperson": "Search for a ePerson", - "resource-policies.form.eperson-group-list.tab.eperson": "Pesquisar um Utilizador", + "resource-policies.form.eperson-group-list.tab.eperson": "Pesquisar um utilizador", // "resource-policies.form.eperson-group-list.tab.group": "Search for a group", "resource-policies.form.eperson-group-list.tab.group": "Pesquisar um grupo", @@ -4146,14 +5211,29 @@ // "resource-policies.form.eperson-group-list.table.headers.id": "ID", "resource-policies.form.eperson-group-list.table.headers.id": "ID", - // "resource-policies.form.eperson-group-list.table.headers.name": "Name", + // "resource-policies.form.eperson-group-list.table.headers.name": "Name", "resource-policies.form.eperson-group-list.table.headers.name": "Nome", + + // "resource-policies.form.eperson-group-list.modal.header": "Cannot change type", + "resource-policies.form.eperson-group-list.modal.header": "Não pode mudar de tipo", + + // "resource-policies.form.eperson-group-list.modal.text1.toGroup": "It is not possible to replace an ePerson with a group.", + "resource-policies.form.eperson-group-list.modal.text1.toGroup": "Não é possível substituir um utilizador por um grupo.", + + // "resource-policies.form.eperson-group-list.modal.text1.toEPerson": "It is not possible to replace a group with an ePerson.", + "resource-policies.form.eperson-group-list.modal.text1.toEPerson": "Não é possível substituir um grupo por uma ePerson.", + + // "resource-policies.form.eperson-group-list.modal.text2": "Delete the current resource policy and create a new one with the desired type.", + "resource-policies.form.eperson-group-list.modal.text2": "Eliminar a política actual de recursos e criar uma nova política com o tipo desejado.", + + // "resource-policies.form.eperson-group-list.modal.close": "Ok", + "resource-policies.form.eperson-group-list.modal.close": "Ok", // "resource-policies.form.date.end.label": "End Date", - "resource-policies.form.date.end.label": "Data de Fim", + "resource-policies.form.date.end.label": "Data de fim", // "resource-policies.form.date.start.label": "Start Date", - "resource-policies.form.date.start.label": "Data de Início", + "resource-policies.form.date.start.label": "Data de início", // "resource-policies.form.description.label": "Description", "resource-policies.form.description.label": "Descrição", @@ -4162,7 +5242,7 @@ "resource-policies.form.name.label": "Nome", // "resource-policies.form.policy-type.label": "Select the policy type", - "resource-policies.form.policy-type.label": "Seleccione o tipo de política", + "resource-policies.form.policy-type.label": "Selecione o tipo de política", // "resource-policies.form.policy-type.required": "You must select the resource policy type.", "resource-policies.form.policy-type.required": "Deve selecionar um tipo de política de recurso.", @@ -4171,10 +5251,10 @@ "resource-policies.table.headers.action": "Ação", // "resource-policies.table.headers.date.end": "End Date", - "resource-policies.table.headers.date.end": "Data de Fim", + "resource-policies.table.headers.date.end": "Data de término", // "resource-policies.table.headers.date.start": "Start Date", - "resource-policies.table.headers.date.start": "Data de Início", + "resource-policies.table.headers.date.start": "Data de início", // "resource-policies.table.headers.edit": "Edit", "resource-policies.table.headers.edit": "Editar", @@ -4201,34 +5281,34 @@ "resource-policies.table.headers.policyType": "tipo", // "resource-policies.table.headers.title.for.bitstream": "Policies for Bitstream", - "resource-policies.table.headers.title.for.bitstream": "Política de Ficheiros", + "resource-policies.table.headers.title.for.bitstream": "Política de ficheiros", // "resource-policies.table.headers.title.for.bundle": "Policies for Bundle", - "resource-policies.table.headers.title.for.bundle": "Políticas para Pacote", + "resource-policies.table.headers.title.for.bundle": "Políticas para pacote", // "resource-policies.table.headers.title.for.item": "Policies for Item", - "resource-policies.table.headers.title.for.item": "Políticas para Item", + "resource-policies.table.headers.title.for.item": "Políticas para item", // "resource-policies.table.headers.title.for.community": "Policies for Community", - "resource-policies.table.headers.title.for.community": "Políticas para Comunidades", + "resource-policies.table.headers.title.for.community": "Políticas para comunidade", // "resource-policies.table.headers.title.for.collection": "Policies for Collection", - "resource-policies.table.headers.title.for.collection": "Políticas para Coleção", - - - + "resource-policies.table.headers.title.for.collection": "Políticas para coleção", + // "search.description": "", "search.description": "", // "search.switch-configuration.title": "Show", "search.switch-configuration.title": "Mostrar", + + // "search.title": "Search", + "search.title": "Pesquisa", - // "search.title": "DSpace Angular :: Search", - "search.title": "DSpace :: Pesquisa", - - // "search.breadcrumbs": "Search", + // "search.breadcrumbs": "Search", "search.breadcrumbs": "Pesquisar", + // "search.search-form.placeholder": "Search the repository ...", + "search.search-form.placeholder": "Pesquisar no repositório...", // "search.filters.applied.f.author": "Author", "search.filters.applied.f.author": "Autor", @@ -4240,13 +5320,13 @@ "search.filters.applied.f.dateIssued.min": "Data inicial", // "search.filters.applied.f.dateSubmitted": "Date submitted", - "search.filters.applied.f.dateSubmitted": "Data de submissão", + "search.filters.applied.f.dateSubmitted": "Data de depósito", - // "search.filters.applied.f.discoverable": "Private", + // "search.filters.applied.f.discoverable": "Non-discoverable", "search.filters.applied.f.discoverable": "Privado", - // "search.filters.applied.f.entityType": "Item Type", - "search.filters.applied.f.entityType": "Tipo de Item", + // "search.filters.applied.f.entityType": "Item type", + "search.filters.applied.f.entityType": "Tipo de item", // "search.filters.applied.f.has_content_in_original_bundle": "Has files", "search.filters.applied.f.has_content_in_original_bundle": "Tem ficheiros", @@ -4272,6 +5352,9 @@ // "search.filters.applied.f.birthDate.min": "Start birth date", "search.filters.applied.f.birthDate.min": "Início data de nascimento", + // "search.filters.applied.f.supervisedBy": "Supervised by", + "search.filters.applied.f.supervisedBy": "Supervisionado por", + // "search.filters.applied.f.withdrawn": "Withdrawn", "search.filters.applied.f.withdrawn": "Retirado", @@ -4281,119 +5364,182 @@ // "search.filters.filter.author.placeholder": "Author name", "search.filters.filter.author.placeholder": "Nome do autor", + // "search.filters.filter.author.label": "Search author name", + "search.filters.filter.author.label": "Pesquisar por nome", + // "search.filters.filter.birthDate.head": "Birth Date", "search.filters.filter.birthDate.head": "Data de nascimento", // "search.filters.filter.birthDate.placeholder": "Birth Date", "search.filters.filter.birthDate.placeholder": "Data de nascimento", + // "search.filters.filter.birthDate.label": "Search birth date", + "search.filters.filter.birthDate.label": "Procurar data de nascimento", + + // "search.filters.filter.collapse": "Collapse filter", + "search.filters.filter.collapse": "Fechar filtro", + // "search.filters.filter.creativeDatePublished.head": "Date Published", "search.filters.filter.creativeDatePublished.head": "Data de publicação", // "search.filters.filter.creativeDatePublished.placeholder": "Date Published", - "search.filters.filter.creativeDatePublished.placeholder": "Data de publicação", + "search.filters.filter.creativeDatePublished.placeholder": "Data de publicação", + // "search.filters.filter.creativeDatePublished.label": "Search date published", + "search.filters.filter.creativeDatePublished.label": "Procurar data de publicação", + // "search.filters.filter.creativeWorkEditor.head": "Editor", "search.filters.filter.creativeWorkEditor.head": "Editor", // "search.filters.filter.creativeWorkEditor.placeholder": "Editor", "search.filters.filter.creativeWorkEditor.placeholder": "Editor", + // "search.filters.filter.creativeWorkEditor.label": "Search editor", + "search.filters.filter.creativeWorkEditor.label": "Procurar editor", + // "search.filters.filter.creativeWorkKeywords.head": "Subject", "search.filters.filter.creativeWorkKeywords.head": "Assunto", // "search.filters.filter.creativeWorkKeywords.placeholder": "Subject", "search.filters.filter.creativeWorkKeywords.placeholder": "Assunto", + // "search.filters.filter.creativeWorkKeywords.label": "Search subject", + "search.filters.filter.creativeWorkKeywords.label": "Procurar assuntos", + // "search.filters.filter.creativeWorkPublisher.head": "Publisher", "search.filters.filter.creativeWorkPublisher.head": "Editora", // "search.filters.filter.creativeWorkPublisher.placeholder": "Publisher", "search.filters.filter.creativeWorkPublisher.placeholder": "Editora", + // "search.filters.filter.creativeWorkPublisher.label": "Search publisher", + "search.filters.filter.creativeWorkPublisher.label": "Procurar editora", + // "search.filters.filter.dateIssued.head": "Date", "search.filters.filter.dateIssued.head": "Data", - // "search.filters.filter.dateIssued.max.placeholder": "Minimum Date", - "search.filters.filter.dateIssued.max.placeholder": "Data Mínima", + // "search.filters.filter.dateIssued.max.placeholder": "Maximum Date", + "search.filters.filter.dateIssued.max.placeholder": "Data máxima", - // "search.filters.filter.dateIssued.min.placeholder": "Maximum Date", - "search.filters.filter.dateIssued.min.placeholder": "Data Máxima", + // "search.filters.filter.dateIssued.max.label": "End", + "search.filters.filter.dateIssued.max.label": "Fim", + + // "search.filters.filter.dateIssued.min.placeholder": "Minimum Date", + "search.filters.filter.dateIssued.min.placeholder": "Data mínima", + + // "search.filters.filter.dateIssued.min.label": "Start", + "search.filters.filter.dateIssued.min.label": "Início", // "search.filters.filter.dateSubmitted.head": "Date submitted", - "search.filters.filter.dateSubmitted.head": "Data de submissão", + "search.filters.filter.dateSubmitted.head": "Data de depósito", // "search.filters.filter.dateSubmitted.placeholder": "Date submitted", - "search.filters.filter.dateSubmitted.placeholder": "Data de submissão", + "search.filters.filter.dateSubmitted.placeholder": "Data de depósito", - // "search.filters.filter.discoverable.head": "Private", + // "search.filters.filter.dateSubmitted.label": "Search date submitted", + "search.filters.filter.dateSubmitted.label": "Procurar data de depósito", + + // "search.filters.filter.discoverable.head": "Non-discoverable", "search.filters.filter.discoverable.head": "Privado", // "search.filters.filter.withdrawn.head": "Withdrawn", "search.filters.filter.withdrawn.head": "Retirado", // "search.filters.filter.entityType.head": "Item Type", - "search.filters.filter.entityType.head": "Tipo de Item", + "search.filters.filter.entityType.head": "Tipo de item", // "search.filters.filter.entityType.placeholder": "Item Type", - "search.filters.filter.entityType.placeholder": "Tipo de Item", + "search.filters.filter.entityType.placeholder": "Tipo de item", + + // "search.filters.filter.entityType.label": "Search item type", + "search.filters.filter.entityType.label": "Pesquisar por tipo", + + // "search.filters.filter.expand": "Expand filter", + "search.filters.filter.expand": "Expandir filtro", // "search.filters.filter.has_content_in_original_bundle.head": "Has files", - "search.filters.filter.has_content_in_original_bundle.head": "Tem Ficheiros", + "search.filters.filter.has_content_in_original_bundle.head": "Tem ficheiros", // "search.filters.filter.itemtype.head": "Type", - "search.filters.filter.itemtype.head": "Tipo", + "search.filters.filter.itemtype.head": "Tipo de item depositado", // "search.filters.filter.itemtype.placeholder": "Type", "search.filters.filter.itemtype.placeholder": "Tipo", + // "search.filters.filter.itemtype.label": "Search type", + "search.filters.filter.itemtype.label": "Procurar por tipo", + // "search.filters.filter.jobTitle.head": "Job Title", "search.filters.filter.jobTitle.head": "Cargo", // "search.filters.filter.jobTitle.placeholder": "Job Title", "search.filters.filter.jobTitle.placeholder": "Cargo", + // "search.filters.filter.jobTitle.label": "Search job title", + "search.filters.filter.jobTitle.label": "Procurar cargo", + // "search.filters.filter.knowsLanguage.head": "Known language", "search.filters.filter.knowsLanguage.head": "Idioma conhecido", // "search.filters.filter.knowsLanguage.placeholder": "Known language", "search.filters.filter.knowsLanguage.placeholder": "Idioma conhecido", + // "search.filters.filter.knowsLanguage.label": "Search known language", + "search.filters.filter.knowsLanguage.label": "Procurar idiomas conhecidos", + // "search.filters.filter.namedresourcetype.head": "Status", - "search.filters.filter.namedresourcetype.head": "Estado", + "search.filters.filter.namedresourcetype.head": "Estado do depósito", // "search.filters.filter.namedresourcetype.placeholder": "Status", "search.filters.filter.namedresourcetype.placeholder": "Estado", + // "search.filters.filter.namedresourcetype.label": "Search status", + "search.filters.filter.namedresourcetype.label": "Pesquisa por estado", + // "search.filters.filter.objectpeople.head": "People", "search.filters.filter.objectpeople.head": "Pessoas", - + // "search.filters.filter.objectpeople.placeholder": "People", "search.filters.filter.objectpeople.placeholder": "Pessoas", + // "search.filters.filter.objectpeople.label": "Search people", + "search.filters.filter.objectpeople.label": "Procurar pessoas", + // "search.filters.filter.organizationAddressCountry.head": "Country", "search.filters.filter.organizationAddressCountry.head": "País", // "search.filters.filter.organizationAddressCountry.placeholder": "Country", "search.filters.filter.organizationAddressCountry.placeholder": "País", + // "search.filters.filter.organizationAddressCountry.label": "Search country", + "search.filters.filter.organizationAddressCountry.label": "Procurar país", + // "search.filters.filter.organizationAddressLocality.head": "City", "search.filters.filter.organizationAddressLocality.head": "Cidade", // "search.filters.filter.organizationAddressLocality.placeholder": "City", "search.filters.filter.organizationAddressLocality.placeholder": "Cidade", + // "search.filters.filter.organizationAddressLocality.label": "Search city", + "search.filters.filter.organizationAddressLocality.label": "Procurar cidade", + // "search.filters.filter.organizationFoundingDate.head": "Date Founded", - "search.filters.filter.organizationFoundingDate.head": "Data de Fundação", + "search.filters.filter.organizationFoundingDate.head": "Data de fundação", // "search.filters.filter.organizationFoundingDate.placeholder": "Date Founded", - "search.filters.filter.organizationFoundingDate.placeholder": "Data de Fundação", + "search.filters.filter.organizationFoundingDate.placeholder": "Data de fundação", + + // "search.filters.filter.organizationFoundingDate.label": "Search date founded", + "search.filters.filter.organizationFoundingDate.label": "Procurar data de fundação", // "search.filters.filter.scope.head": "Scope", "search.filters.filter.scope.head": "Âmbito", // "search.filters.filter.scope.placeholder": "Scope filter", - "search.filters.filter.scope.placeholder": "Filtrar Ãmbito", + "search.filters.filter.scope.placeholder": "Filtrar âmbito", + + // "search.filters.filter.scope.label": "Search scope filter", + "search.filters.filter.scope.label": "Filtro âmbito da pesquisa", // "search.filters.filter.show-less": "Collapse", "search.filters.filter.show-less": "Mostrar menos", @@ -4406,6 +5552,9 @@ // "search.filters.filter.subject.placeholder": "Subject", "search.filters.filter.subject.placeholder": "Assunto", + + // "search.filters.filter.subject.label": "Search subject", + "search.filters.filter.subject.label": "Pesquisar por assunto", // "search.filters.filter.submitter.head": "Submitter", "search.filters.filter.submitter.head": "Depositante", @@ -4413,13 +5562,26 @@ // "search.filters.filter.submitter.placeholder": "Submitter", "search.filters.filter.submitter.placeholder": "Depositante", - + // "search.filters.filter.submitter.label": "Search submitter", + "search.filters.filter.submitter.label": "Procurar depositante", + + // "search.filters.filter.show-tree": "browse {{ name }} tree", + "search.filters.filter.show-tree": "Percorrer por hierarquia de {{ name }}", + + // "search.filters.filter.supervisedBy.head": "Supervised By", + "search.filters.filter.supervisedBy.head": "Supervisionado por", + + // "search.filters.filter.supervisedBy.placeholder": "Supervised By", + "search.filters.filter.supervisedBy.placeholder": "Supervisionado por", + + // "search.filters.filter.supervisedBy.label": "search Supervised By", + "search.filters.filter.supervisedBy.label": "pesquisar supervisionado por", // "search.filters.entityType.JournalIssue": "Journal Issue", - "search.filters.entityType.JournalIssue": "Número de Revista", + "search.filters.entityType.JournalIssue": "Número de revista", // "search.filters.entityType.JournalVolume": "Journal Volume", - "search.filters.entityType.JournalVolume": "Volume de Revista", + "search.filters.entityType.JournalVolume": "Volume de revista", // "search.filters.entityType.OrgUnit": "Organizational Unit", "search.filters.entityType.OrgUnit": "Organização", @@ -4442,28 +5604,26 @@ // "search.filters.withdrawn.false": "No", "search.filters.withdrawn.false": "Não", - // "search.filters.head": "Filters", "search.filters.head": "Filtros", // "search.filters.reset": "Reset filters", "search.filters.reset": "Limpar filtros", - - + // "search.filters.search.submit": "Submit", + "search.filters.search.submit": "Enviar", + // "search.form.search": "Search", "search.form.search": "Pesquisar", - // "search.form.search_dspace": "Search DSpace", - "search.form.search_dspace": "Pesquisar", - - // "search.form.search_mydspace": "Search MyDSpace", - "search.form.search_mydspace": "Pesquisar na Área Pessoal", - - + // "search.form.search_dspace": "All repository", + "search.form.search_dspace": "Pesquisar tudo", + // "search.form.scope.all": "All of DSpace", + "search.form.scope.all": "Pesquisar tudo", + // "search.results.head": "Search Results", - "search.results.head": "Resultados de Busca", + "search.results.head": "Resultados da pesquisa", // "search.results.no-results": "Your search returned no results. Having trouble finding what you're looking for? Try putting", "search.results.no-results": "Sua pesquisa não retornou resultados. Tem dificuldade em encontrar o que procura? Tente incluir ", @@ -4474,7 +5634,17 @@ // "search.results.empty": "Your search returned no results.", "search.results.empty": "A sua pesquisa não retornou resultados.", + // "search.results.view-result": "View", + "search.results.view-result": "Ver", + // "search.results.response.500": "An error occurred during query execution, please try again later", + "search.results.response.500": "Ocorreu um erro durante a execução da consulta, por favor tente novamente mais tarde", + + // "default.search.results.head": "Search Results", + "default.search.results.head": "Resultados da pesquisa", + + // "default-relationships.search.results.head": "Search Results", + "default-relationships.search.results.head": "Resultados da pesquisa", // "search.sidebar.close": "Back to results", "search.sidebar.close": "Voltar para os resultados", @@ -4497,8 +5667,6 @@ // "search.sidebar.settings.title": "Settings", "search.sidebar.settings.title": "Configurações", - - // "search.view-switch.show-detail": "Show detail", "search.view-switch.show-detail": "Mostrar detalhes", @@ -4508,8 +5676,6 @@ // "search.view-switch.show-list": "Show as list", "search.view-switch.show-list": "Mostrar como lista", - - // "sorting.ASC": "Ascending", "sorting.ASC": "Ascendente", @@ -4517,22 +5683,41 @@ "sorting.DESC": "Descendente", // "sorting.dc.title.ASC": "Title Ascending", - "sorting.dc.title.ASC": "Título Ascendente", + "sorting.dc.title.ASC": "Título ascendente", // "sorting.dc.title.DESC": "Title Descending", - "sorting.dc.title.DESC": "Título Descendente", + "sorting.dc.title.DESC": "Título descendente", - // "sorting.score.DESC": "Relevance", - "sorting.score.DESC": "Relevância", + // "sorting.score.ASC": "Least Relevant", + "sorting.score.ASC": "Menos relevante", + // "sorting.score.DESC": "Most Relevant", + "sorting.score.DESC": "Mais relevante", + // "sorting.dc.date.issued.ASC": "Date Issued Ascending", + "sorting.dc.date.issued.ASC": "Data de publicação ascendente", + + // "sorting.dc.date.issued.DESC": "Date Issued Descending", + "sorting.dc.date.issued.DESC": "Data de publicação descendente", + + // "sorting.dc.date.accessioned.ASC": "Accessioned Date Ascending", + "sorting.dc.date.accessioned.ASC": "Data de disponibilização ascendente", + + // "sorting.dc.date.accessioned.DESC": "Accessioned Date Descending", + "sorting.dc.date.accessioned.DESC": "Data de disponibilização descendente", + // "sorting.lastModified.ASC": "Last modified Ascending", + "sorting.lastModified.ASC": "Última modificação ascendente", + + // "sorting.lastModified.DESC": "Last modified Descending", + "sorting.lastModified.DESC": "Última modificação descendente", + // "statistics.title": "Statistics", "statistics.title": "Estatísticas", - - // "statistics.header": "Statistics for {{ scope }}", + + // "statistics.header": "Statistics for {{ scope }}", "statistics.header": "Estatísticas para {{ scope }}", - + // "statistics.breadcrumbs": "Statistics", "statistics.breadcrumbs": "Estatísticas", @@ -4543,30 +5728,34 @@ "statistics.table.no-data": "Sem dados disponíveis", // "statistics.table.title.TotalVisits": "Total visits", - "statistics.table.title.TotalVisits": "Total de Visitas", + "statistics.table.title.TotalVisits": "Total de visitas", // "statistics.table.title.TotalVisitsPerMonth": "Total visits per month", - "statistics.table.title.TotalVisitsPerMonth": "Total de Visitas por Mês", + "statistics.table.title.TotalVisitsPerMonth": "Total de visitas por mês", // "statistics.table.title.TotalDownloads": "File Visits", "statistics.table.title.TotalDownloads": "Downloads", // "statistics.table.title.TopCountries": "Top country views", - "statistics.table.title.TopCountries": "Top de Consultas por País", + "statistics.table.title.TopCountries": "Top de consultas por país", // "statistics.table.title.TopCities": "Top city views", - "statistics.table.title.TopCities": "Top de Consultas por Cidade", + "statistics.table.title.TopCities": "Top de consultas por cidade", // "statistics.table.header.views": "Views", "statistics.table.header.views": "Consultas", - - + + // "submission.edit.breadcrumbs": "Edit Submission", + "submission.edit.breadcrumbs": "Editar depósito", // "submission.edit.title": "Edit Submission", - "submission.edit.title": "Editar Submissão", + "submission.edit.title": "Editar depósito", + + // "submission.general.cancel": "Cancel", + "submission.general.cancel": "Cancelar", // "submission.general.cannot_submit": "You have not the privilege to make a new submission.", - "submission.general.cannot_submit": "Você não tem privilégios para fazer uma nova submissão.", + "submission.general.cannot_submit": "Você não tem privilégios para fazer um novo depósito.", // "submission.general.deposit": "Deposit", "submission.general.deposit": "Depositar", @@ -4581,23 +5770,52 @@ "submission.general.discard.confirm.submit": "Sim, tenho certeza", // "submission.general.discard.confirm.title": "Discard submission", - "submission.general.discard.confirm.title": "Cancelar submissão", + "submission.general.discard.confirm.title": "Cancelar depósito", // "submission.general.discard.submit": "Discard", "submission.general.discard.submit": "Cancelar", + // "submission.general.info.saved": "Saved", + "submission.general.info.saved": "Informação guardada", + + // "submission.general.info.pending-changes": "Unsaved changes", + "submission.general.info.pending-changes": "Alterações não guardadas", + // "submission.general.save": "Save", "submission.general.save": "Guardar", // "submission.general.save-later": "Save for later", - "submission.general.save-later": "Guardar para continuar depois", - + "submission.general.save-later": "Guardar e fechar", // "submission.import-external.page.title": "Import metadata from an external source", "submission.import-external.page.title": "Importar metadados de uma fonte externa", // "submission.import-external.title": "Import metadata from an external source", "submission.import-external.title": "Importar metadados de uma fonte externa", + + // "submission.import-external.title.Journal": "Import a journal from an external source", + "submission.import-external.title.Journal": "Importar revista de uma fonte externa", + + // "submission.import-external.title.JournalIssue": "Import a journal issue from an external source", + "submission.import-external.title.JournalIssue": "Importar o número de um revista de um fonte externa", + + // "submission.import-external.title.JournalVolume": "Import a journal volume from an external source", + "submission.import-external.title.JournalVolume": "Importar o volume de uma revista de fonte externa", + + // "submission.import-external.title.OrgUnit": "Import a publisher from an external source", + "submission.import-external.title.OrgUnit": "Importar editora de uma fonte externa", + + // "submission.import-external.title.Person": "Import a person from an external source", + "submission.import-external.title.Person": "Importar pessoa de uma fonte externa", + + // "submission.import-external.title.Project": "Import a project from an external source", + "submission.import-external.title.Project": "Importar projeto de uma fonte externa", + + // "submission.import-external.title.Publication": "Import a publication from an external source", + "submission.import-external.title.Publication": "Importar uma publicação de uma fonte externa", + + // "submission.import-external.title.none": "Import metadata from an external source", + "submission.import-external.title.none": "Importar metadados de uma fonte externa", // "submission.import-external.page.hint": "Enter a query above to find items from the web to import in to DSpace.", "submission.import-external.page.hint": "Pesquise itens abaixo disponíveis na internet para que sejam importados para o repositório.", @@ -4620,35 +5838,92 @@ // "submission.import-external.source.arxiv": "arXiv", "submission.import-external.source.arxiv": "arXiv", + // "submission.import-external.source.ads": "NASA/ADS", + "submission.import-external.source.ads": "NASA/ADS", + + // "submission.import-external.source.cinii": "CiNii", + "submission.import-external.source.cinii": "CiNii", + + // "submission.import-external.source.crossref": "CrossRef", + "submission.import-external.source.crossref": "CrossRef", + + // "submission.import-external.source.datacite": "DataCite", + "submission.import-external.source.datacite": "DataCite", + + // "submission.import-external.source.scielo": "SciELO", + "submission.import-external.source.scielo": "SciELO", + + // "submission.import-external.source.scopus": "Scopus", + "submission.import-external.source.scopus": "Scopus", + + // "submission.import-external.source.vufind": "VuFind", + "submission.import-external.source.vufind": "VuFind", + + // "submission.import-external.source.wos": "Web of Science", + "submission.import-external.source.wos": "Web of Science", + + // "submission.import-external.source.orcidWorks": "ORCID", + "submission.import-external.source.orcidWorks": "ORCID", + + // "submission.import-external.source.epo": "European Patent Office (EPO)", + "submission.import-external.source.epo": "European Patent Office (EPO)", + // "submission.import-external.source.loading": "Loading ...", - "submission.import-external.source.loading": "A Carregar ...", + "submission.import-external.source.loading": "A carregar ...", // "submission.import-external.source.sherpaJournal": "SHERPA Journals", - "submission.import-external.source.sherpaJournal": "Revistas do SHERPA", + "submission.import-external.source.sherpaJournal": "Revistas Sherpa Romeo por nome", + + // "submission.import-external.source.sherpaJournalIssn": "SHERPA Journals by ISSN", + "submission.import-external.source.sherpaJournalIssn": "Revistas Sherpa Romeo por ISSN", // "submission.import-external.source.sherpaPublisher": "SHERPA Publishers", - "submission.import-external.source.sherpaPublisher": "Editores do SHERPA", + "submission.import-external.source.sherpaPublisher": "Editoras Sherpa Romeo", + // "submission.import-external.source.openAIREFunding": "Funding OpenAIRE API", + "submission.import-external.source.openAIREFunding": "Financiamento via API OpenAIRE", + // "submission.import-external.source.orcid": "ORCID", "submission.import-external.source.orcid": "ORCID", - // "submission.import-external.source.pubmed": "Pubmed", - "submission.import-external.source.pubmed": "Pubmed", + // "submission.import-external.source.pubmed": "PubMed", + "submission.import-external.source.pubmed": "PubMed", + + // "submission.import-external.source.pubmedeu": "PubMed Europe", + "submission.import-external.source.pubmedeu": "PubMed Europa", // "submission.import-external.source.lcname": "Library of Congress Names", "submission.import-external.source.lcname": "Nomes da Library of Congress", // "submission.import-external.preview.title": "Item Preview", - "submission.import-external.preview.title": "Prévisualização do Item", + "submission.import-external.preview.title": "Pré-visualização do item", + // "submission.import-external.preview.title.Publication": "Publication Preview", + "submission.import-external.preview.title.Publication": "Pré-visualização da publicação", + + // "submission.import-external.preview.title.none": "Item Preview", + "submission.import-external.preview.title.none": "Pré-visualização do Item", + + // "submission.import-external.preview.title.Journal": "Journal Preview", + "submission.import-external.preview.title.Journal": "Pré-visualização da revista", + + // "submission.import-external.preview.title.OrgUnit": "Organizational Unit Preview", + "submission.import-external.preview.title.OrgUnit": "Pré-visualização da organização", + + // "submission.import-external.preview.title.Person": "Person Preview", + "submission.import-external.preview.title.Person": "Pré-visualização dos dados pessoais a importar", + + // "submission.import-external.preview.title.Project": "Project Preview", + "submission.import-external.preview.title.Project": "Pré-visualização do dados do projeto a importar", + // "submission.import-external.preview.subtitle": "The metadata below was imported from an external source. It will be pre-filled when you start the submission.", - "submission.import-external.preview.subtitle": "Os metadados abaixo foram importados de uma fonte externa. Serão pré-preenchidos quando iniciar a submissão.", + "submission.import-external.preview.subtitle": "Os seguintes metadados foram importados de uma fonte externa. Serão pré-preenchidos quando iniciar o depósito.", // "submission.import-external.preview.button.import": "Start submission", - "submission.import-external.preview.button.import": "Iniciar submissão", + "submission.import-external.preview.button.import": "Iniciar depósito", // "submission.import-external.preview.error.import.title": "Submission error", - "submission.import-external.preview.error.import.title": "Erro na submissão", + "submission.import-external.preview.error.import.title": "Erro no depósito", // "submission.import-external.preview.error.import.body": "An error occurs during the external source entry import process.", "submission.import-external.preview.error.import.body": "Ocorreu um erro durante o processo de importação de metadados de uma fonte externa.", @@ -4658,21 +5933,63 @@ // "submission.sections.describe.relationship-lookup.external-source.added": "Successfully added local entry to the selection", "submission.sections.describe.relationship-lookup.external-source.added": "Adicionada com sucesso uma entrada local à seleção", - + // "submission.sections.describe.relationship-lookup.external-source.import-button-title.isAuthorOfPublication": "Import remote author", "submission.sections.describe.relationship-lookup.external-source.import-button-title.isAuthorOfPublication": "Importar autor remoto", - - // "submission.sections.describe.relationship-lookup.external-source.import-button-title.Journal": "Import remote journal", - "submission.sections.describe.relationship-lookup.external-source.import-button-title.Journal": "Importar Informação Remota", + + // "submission.sections.describe.relationship-lookup.external-source.import-button-title.Journal": "Import remote journal", + "submission.sections.describe.relationship-lookup.external-source.import-button-title.Journal": "Importar revista remota", // "submission.sections.describe.relationship-lookup.external-source.import-button-title.Journal Issue": "Import remote journal issue", - "submission.sections.describe.relationship-lookup.external-source.import-button-title.Journal Issue": "Importar Número de revista remoto", + "submission.sections.describe.relationship-lookup.external-source.import-button-title.Journal Issue": "Importar número de revista remoto", // "submission.sections.describe.relationship-lookup.external-source.import-button-title.Journal Volume": "Import remote journal volume", - "submission.sections.describe.relationship-lookup.external-source.import-button-title.Journal Volume": "Importar Volume de revista remoto", + "submission.sections.describe.relationship-lookup.external-source.import-button-title.Journal Volume": "Importar volume de revista remoto", + + // "submission.sections.describe.relationship-lookup.external-source.import-button-title.isProjectOfPublication": "Project", + "submission.sections.describe.relationship-lookup.external-source.import-button-title.isProjectOfPublication": "Projeto", + + // "submission.sections.describe.relationship-lookup.external-source.import-button-title.none": "Import remote item", + "submission.sections.describe.relationship-lookup.external-source.import-button-title.none": "Importar item remoto", + + // "submission.sections.describe.relationship-lookup.external-source.import-button-title.Event": "Import remote event", + "submission.sections.describe.relationship-lookup.external-source.import-button-title.Event": "Importar evento remoto", + + // "submission.sections.describe.relationship-lookup.external-source.import-button-title.Product": "Import remote product", + "submission.sections.describe.relationship-lookup.external-source.import-button-title.Product": "Importar produto remoto", + + // "submission.sections.describe.relationship-lookup.external-source.import-button-title.Equipment": "Import remote equipment", + "submission.sections.describe.relationship-lookup.external-source.import-button-title.Equipment": "Importar equipamento remoto", + + // "submission.sections.describe.relationship-lookup.external-source.import-button-title.OrgUnit": "Import remote organizational unit", + "submission.sections.describe.relationship-lookup.external-source.import-button-title.OrgUnit": "Importar organização remota", + + // "submission.sections.describe.relationship-lookup.external-source.import-button-title.Funding": "Import remote fund", + "submission.sections.describe.relationship-lookup.external-source.import-button-title.Funding": "Importar financiamento remoto", + + // "submission.sections.describe.relationship-lookup.external-source.import-button-title.Person": "Import remote person", + "submission.sections.describe.relationship-lookup.external-source.import-button-title.Person": "Import remote person", + + // "submission.sections.describe.relationship-lookup.external-source.import-button-title.Patent": "Import remote patent", + "submission.sections.describe.relationship-lookup.external-source.import-button-title.Patent": "Import remote patent", + + // "submission.sections.describe.relationship-lookup.external-source.import-button-title.Project": "Import remote project", + "submission.sections.describe.relationship-lookup.external-source.import-button-title.Project": "Importar projeto remoto", + + // "submission.sections.describe.relationship-lookup.external-source.import-button-title.Publication": "Import remote publication", + "submission.sections.describe.relationship-lookup.external-source.import-button-title.Publication": "Importar publicação remota", + + // "submission.sections.describe.relationship-lookup.external-source.import-modal.isProjectOfPublication.added.new-entity": "New Entity Added!", + "submission.sections.describe.relationship-lookup.external-source.import-modal.isProjectOfPublication.added.new-entity": "Nova entidade adicionada!", + + // "submission.sections.describe.relationship-lookup.external-source.import-modal.isProjectOfPublication.title": "Project", + "submission.sections.describe.relationship-lookup.external-source.import-modal.isProjectOfPublication.title": "Projeto", + + // "submission.sections.describe.relationship-lookup.external-source.import-modal.head.openAIREFunding": "Funding OpenAIRE API", + "submission.sections.describe.relationship-lookup.external-source.import-modal.head.openAIREFunding": "Financiamento API OpenAIRE", // "submission.sections.describe.relationship-lookup.external-source.import-modal.isAuthorOfPublication.title": "Import Remote Author", - "submission.sections.describe.relationship-lookup.external-source.import-modal.isAuthorOfPublication.title": "Importar Autor remoto", + "submission.sections.describe.relationship-lookup.external-source.import-modal.isAuthorOfPublication.title": "Importar autor remoto", // "submission.sections.describe.relationship-lookup.external-source.import-modal.isAuthorOfPublication.added.local-entity": "Successfully added local author to the selection", "submission.sections.describe.relationship-lookup.external-source.import-modal.isAuthorOfPublication.added.local-entity": "Adicionado com sucesso um autor local à seleção", @@ -4688,10 +6005,9 @@ // "submission.sections.describe.relationship-lookup.external-source.import-modal.cancel": "Cancel", "submission.sections.describe.relationship-lookup.external-source.import-modal.cancel": "Cancelar", - + // "submission.sections.describe.relationship-lookup.external-source.import-modal.collection": "Select a collection to import new entries to", - - "submission.sections.describe.relationship-lookup.external-source.import-modal.collection": "Seleccione a coleção para onde pretende importar as novas entradas", + "submission.sections.describe.relationship-lookup.external-source.import-modal.collection": "Selecione a coleção para onde pretende importar as novas entradas", // "submission.sections.describe.relationship-lookup.external-source.import-modal.entities": "Entities", "submission.sections.describe.relationship-lookup.external-source.import-modal.entities": "Entidades", @@ -4700,40 +6016,40 @@ "submission.sections.describe.relationship-lookup.external-source.import-modal.entities.new": "Importar como nova entidade local", // "submission.sections.describe.relationship-lookup.external-source.import-modal.head.lcname": "Importing from LC Name", - "submission.sections.describe.relationship-lookup.external-source.import-modal.head.lcname": "A Importar de LC Name", + "submission.sections.describe.relationship-lookup.external-source.import-modal.head.lcname": "A importar de LC Name", // "submission.sections.describe.relationship-lookup.external-source.import-modal.head.orcid": "Importing from ORCID", - "submission.sections.describe.relationship-lookup.external-source.import-modal.head.orcid": "A Importar do ORCID", + "submission.sections.describe.relationship-lookup.external-source.import-modal.head.orcid": "A importar do ORCID", // "submission.sections.describe.relationship-lookup.external-source.import-modal.head.sherpaJournal": "Importing from Sherpa Journal", - "submission.sections.describe.relationship-lookup.external-source.import-modal.head.sherpaJournal": "A Importar Revista do Sherpa", + "submission.sections.describe.relationship-lookup.external-source.import-modal.head.sherpaJournal": "A importar Revista do Sherpa", // "submission.sections.describe.relationship-lookup.external-source.import-modal.head.sherpaPublisher": "Importing from Sherpa Publisher", - "submission.sections.describe.relationship-lookup.external-source.import-modal.head.sherpaPublisher": "A Importar Editora do Sherpa", + "submission.sections.describe.relationship-lookup.external-source.import-modal.head.sherpaPublisher": "A importar Editora do Sherpa", // "submission.sections.describe.relationship-lookup.external-source.import-modal.head.pubmed": "Importing from PubMed", - "submission.sections.describe.relationship-lookup.external-source.import-modal.head.pubmed": "A Importar da PubMed", + "submission.sections.describe.relationship-lookup.external-source.import-modal.head.pubmed": "A importar da PubMed", // "submission.sections.describe.relationship-lookup.external-source.import-modal.head.arxiv": "Importing from arXiv", - "submission.sections.describe.relationship-lookup.external-source.import-modal.head.arxiv": "A Importar do arXiv", - + "submission.sections.describe.relationship-lookup.external-source.import-modal.head.arxiv": "A importar do arXiv", + // "submission.sections.describe.relationship-lookup.external-source.import-modal.import": "Import", "submission.sections.describe.relationship-lookup.external-source.import-modal.import": "Importar", // "submission.sections.describe.relationship-lookup.external-source.import-modal.Journal.title": "Import Remote Journal", - "submission.sections.describe.relationship-lookup.external-source.import-modal.Journal.title": "Importar Revista Remota", + "submission.sections.describe.relationship-lookup.external-source.import-modal.Journal.title": "Importar revista Remota", // "submission.sections.describe.relationship-lookup.external-source.import-modal.Journal.added.local-entity": "Successfully added local journal to the selection", "submission.sections.describe.relationship-lookup.external-source.import-modal.Journal.added.local-entity": "Revista local adicionada com sucesso à seleção", // "submission.sections.describe.relationship-lookup.external-source.import-modal.Journal.added.new-entity": "Successfully imported and added external journal to the selection", - "submission.sections.describe.relationship-lookup.external-source.import-modal.Journal.added.new-entity": "Importado e adicionada com sucesso uma revista externa à seleção", + "submission.sections.describe.relationship-lookup.external-source.import-modal.Journal.added.new-entity": "Importada e adicionada com sucesso uma revista externa à seleção", // "submission.sections.describe.relationship-lookup.external-source.import-modal.Journal Issue.title": "Import Remote Journal Issue", "submission.sections.describe.relationship-lookup.external-source.import-modal.Journal Issue.title": "Importar número de revista remota", // "submission.sections.describe.relationship-lookup.external-source.import-modal.Journal Issue.added.local-entity": "Successfully added local journal issue to the selection", - "submission.sections.describe.relationship-lookup.external-source.import-modal.Journal Issue.added.local-entity": "Número de Revista Local adicionado com sucesso à seleção", + "submission.sections.describe.relationship-lookup.external-source.import-modal.Journal Issue.added.local-entity": "Número de revista Local adicionado com sucesso à seleção", // "submission.sections.describe.relationship-lookup.external-source.import-modal.Journal Issue.added.new-entity": "Successfully imported and added external journal issue to the selection", "submission.sections.describe.relationship-lookup.external-source.import-modal.Journal Issue.added.new-entity": "Importado e adicionado um Número de Revista externa com sucesso à seleção", @@ -4742,22 +6058,22 @@ "submission.sections.describe.relationship-lookup.external-source.import-modal.Journal Volume.title": "Importar volume de revista remota", // "submission.sections.describe.relationship-lookup.external-source.import-modal.Journal Volume.added.local-entity": "Successfully added local journal volume to the selection", - "submission.sections.describe.relationship-lookup.external-source.import-modal.Journal Volume.added.local-entity": "Volume de Revista Local adicionado com sucesso à seleção", + "submission.sections.describe.relationship-lookup.external-source.import-modal.Journal Volume.added.local-entity": "Volume de revista Local adicionado com sucesso à seleção", // "submission.sections.describe.relationship-lookup.external-source.import-modal.Journal Volume.added.new-entity": "Successfully imported and added external journal volume to the selection", - "submission.sections.describe.relationship-lookup.external-source.import-modal.Journal Volume.added.new-entity": "Importado e adicionado um volume de Revista externa com sucesso à seleção", + "submission.sections.describe.relationship-lookup.external-source.import-modal.Journal Volume.added.new-entity": "Importado e adicionado um volume de revista externa com sucesso à seleção", // "submission.sections.describe.relationship-lookup.external-source.import-modal.select": "Select a local match:", - "submission.sections.describe.relationship-lookup.external-source.import-modal.select": "Seleccione uma correspondência local:", + "submission.sections.describe.relationship-lookup.external-source.import-modal.select": "Selecione uma correspondência local:", // "submission.sections.describe.relationship-lookup.search-tab.deselect-all": "Deselect all", - "submission.sections.describe.relationship-lookup.search-tab.deselect-all": "Deseleccionar todos", + "submission.sections.describe.relationship-lookup.search-tab.deselect-all": "Deselecionar todos", // "submission.sections.describe.relationship-lookup.search-tab.deselect-page": "Deselect page", - "submission.sections.describe.relationship-lookup.search-tab.deselect-page": "Deseleccionar página", + "submission.sections.describe.relationship-lookup.search-tab.deselect-page": "Deselecionar página", // "submission.sections.describe.relationship-lookup.search-tab.loading": "Loading...", - "submission.sections.describe.relationship-lookup.search-tab.loading": "A Carregar...", + "submission.sections.describe.relationship-lookup.search-tab.loading": "A carregar...", // "submission.sections.describe.relationship-lookup.search-tab.placeholder": "Search query", "submission.sections.describe.relationship-lookup.search-tab.placeholder": "Termos da pesquisa", @@ -4765,6 +6081,9 @@ // "submission.sections.describe.relationship-lookup.search-tab.search": "Go", "submission.sections.describe.relationship-lookup.search-tab.search": "Pesquisar", + // "submission.sections.describe.relationship-lookup.search-tab.search-form.placeholder": "Search...", + "submission.sections.describe.relationship-lookup.search-tab.search-form.placeholder": "Pesquisar...", + // "submission.sections.describe.relationship-lookup.search-tab.select-all": "Select all", "submission.sections.describe.relationship-lookup.search-tab.select-all": "Selecionar todos", @@ -4775,43 +6094,43 @@ "submission.sections.describe.relationship-lookup.selected": "Selecionados {{ size }} itens", // "submission.sections.describe.relationship-lookup.search-tab.tab-title.isAuthorOfPublication": "Local Authors ({{ count }})", - "submission.sections.describe.relationship-lookup.search-tab.tab-title.isAuthorOfPublication": "Autores Locais ({{ count }})", + "submission.sections.describe.relationship-lookup.search-tab.tab-title.isAuthorOfPublication": "Autores locais ({{ count }})", // "submission.sections.describe.relationship-lookup.search-tab.tab-title.isJournalOfPublication": "Local Journals ({{ count }})", - "submission.sections.describe.relationship-lookup.search-tab.tab-title.isJournalOfPublication": "Revistas Locais ({{ count }})", + "submission.sections.describe.relationship-lookup.search-tab.tab-title.isJournalOfPublication": "Revistas locais ({{ count }})", // "submission.sections.describe.relationship-lookup.search-tab.tab-title.Project": "Local Projects ({{ count }})", - "submission.sections.describe.relationship-lookup.search-tab.tab-title.Project": "Projetos Locais ({{ count }})", + "submission.sections.describe.relationship-lookup.search-tab.tab-title.Project": "Projetos locais ({{ count }})", // "submission.sections.describe.relationship-lookup.search-tab.tab-title.Publication": "Local Publications ({{ count }})", - "submission.sections.describe.relationship-lookup.search-tab.tab-title.Publication": "Publicações Locais ({{ count }})", + "submission.sections.describe.relationship-lookup.search-tab.tab-title.Publication": "Publicações locais ({{ count }})", // "submission.sections.describe.relationship-lookup.search-tab.tab-title.Person": "Local Authors ({{ count }})", - "submission.sections.describe.relationship-lookup.search-tab.tab-title.Person": "Autores Locais ({{ count }})", + "submission.sections.describe.relationship-lookup.search-tab.tab-title.Person": "Autores locais ({{ count }})", // "submission.sections.describe.relationship-lookup.search-tab.tab-title.OrgUnit": "Local Organizational Units ({{ count }})", - "submission.sections.describe.relationship-lookup.search-tab.tab-title.OrgUnit": "Unidades Organizacionais Locais ({{ count }})", + "submission.sections.describe.relationship-lookup.search-tab.tab-title.OrgUnit": "Unidades organizacionais locais ({{ count }})", // "submission.sections.describe.relationship-lookup.search-tab.tab-title.DataPackage": "Local Data Packages ({{ count }})", - "submission.sections.describe.relationship-lookup.search-tab.tab-title.DataPackage": "Pacotes de Dados Locais ({{ count }})", + "submission.sections.describe.relationship-lookup.search-tab.tab-title.DataPackage": "Pacotes de dados locais ({{ count }})", // "submission.sections.describe.relationship-lookup.search-tab.tab-title.DataFile": "Local Data Files ({{ count }})", - "submission.sections.describe.relationship-lookup.search-tab.tab-title.DataFile": "Ficheiros de Dados Locais ({{ count }})", + "submission.sections.describe.relationship-lookup.search-tab.tab-title.DataFile": "Ficheiros de dados locais ({{ count }})", // "submission.sections.describe.relationship-lookup.search-tab.tab-title.Journal": "Local Journals ({{ count }})", - "submission.sections.describe.relationship-lookup.search-tab.tab-title.Journal": "Revistas Locais ({{ count }})", + "submission.sections.describe.relationship-lookup.search-tab.tab-title.Journal": "Revistas locais ({{ count }})", // "submission.sections.describe.relationship-lookup.search-tab.tab-title.isJournalIssueOfPublication": "Local Journal Issues ({{ count }})", - "submission.sections.describe.relationship-lookup.search-tab.tab-title.isJournalIssueOfPublication": "Números de Revista Local ({{ count }})", - + "submission.sections.describe.relationship-lookup.search-tab.tab-title.isJournalIssueOfPublication": "Números de revistas locais ({{ count }})", + // "submission.sections.describe.relationship-lookup.search-tab.tab-title.JournalIssue": "Local Journal Issues ({{ count }})", - "submission.sections.describe.relationship-lookup.search-tab.tab-title.JournalIssue": "Números de Revista Local ({{ count }})", + "submission.sections.describe.relationship-lookup.search-tab.tab-title.JournalIssue": "Números de revista locais ({{ count }})", // "submission.sections.describe.relationship-lookup.search-tab.tab-title.isJournalVolumeOfPublication": "Local Journal Volumes ({{ count }})", - "submission.sections.describe.relationship-lookup.search-tab.tab-title.isJournalVolumeOfPublication": "Volumes de Revista Local ({{ count }})", + "submission.sections.describe.relationship-lookup.search-tab.tab-title.isJournalVolumeOfPublication": "Volumes de revistas locais ({{ count }})", // "submission.sections.describe.relationship-lookup.search-tab.tab-title.JournalVolume": "Local Journal Volumes ({{ count }})", - "submission.sections.describe.relationship-lookup.search-tab.tab-title.JournalVolume": "Volume de revista Local ({{ count }})", + "submission.sections.describe.relationship-lookup.search-tab.tab-title.JournalVolume": "Volumes de revistas locais ({{ count }})", // "submission.sections.describe.relationship-lookup.search-tab.tab-title.sherpaJournal": "Sherpa Journals ({{ count }})", "submission.sections.describe.relationship-lookup.search-tab.tab-title.sherpaJournal": "Revistas do Sherpa ({{ count }})", @@ -4823,7 +6142,7 @@ "submission.sections.describe.relationship-lookup.search-tab.tab-title.orcid": "ORCID ({{ count }})", // "submission.sections.describe.relationship-lookup.search-tab.tab-title.lcname": "LC Names ({{ count }})", - "submission.sections.describe.relationship-lookup.search-tab.tab-title.lcname": "Nomes LC ({{ count }})", + "submission.sections.describe.relationship-lookup.search-tab.tab-title.lcname": "Nomes LC ({{ count }})", // "submission.sections.describe.relationship-lookup.search-tab.tab-title.pubmed": "PubMed ({{ count }})", "submission.sections.describe.relationship-lookup.search-tab.tab-title.pubmed": "PubMed ({{ count }})", @@ -4832,28 +6151,55 @@ "submission.sections.describe.relationship-lookup.search-tab.tab-title.arxiv": "arXiv ({{ count }})", // "submission.sections.describe.relationship-lookup.search-tab.tab-title.isFundingAgencyOfPublication": "Search for Funding Agencies", - "submission.sections.describe.relationship-lookup.search-tab.tab-title.isFundingAgencyOfPublication": "Pesquisar Agências de Financiamento", - + "submission.sections.describe.relationship-lookup.search-tab.tab-title.isFundingAgencyOfPublication": "Pesquisar por agências de financiamento", + // "submission.sections.describe.relationship-lookup.search-tab.tab-title.isFundingOfPublication": "Search for Funding", - "submission.sections.describe.relationship-lookup.search-tab.tab-title.isFundingOfPublication": "Pesquisar Financiamento", + "submission.sections.describe.relationship-lookup.search-tab.tab-title.isFundingAgencyOfPublication": "Pesquisar por financiamento", // "submission.sections.describe.relationship-lookup.search-tab.tab-title.isChildOrgUnitOf": "Search for Organizational Units", - "submission.sections.describe.relationship-lookup.search-tab.tab-title.isChildOrgUnitOf": "Pesquisar Unidades Organizacionais", + "submission.sections.describe.relationship-lookup.search-tab.tab-title.isChildOrgUnitOf": "Pesquisar por unidades organizacionais", + + // "submission.sections.describe.relationship-lookup.search-tab.tab-title.openAIREFunding": "Funding OpenAIRE API", + "submission.sections.describe.relationship-lookup.search-tab.tab-title.openAIREFunding": "Via API OpenAIRE", + + // "submission.sections.describe.relationship-lookup.search-tab.tab-title.isProjectOfPublication": "Projects", + "submission.sections.describe.relationship-lookup.search-tab.tab-title.isProjectOfPublication": "Projetos", + + // "submission.sections.describe.relationship-lookup.search-tab.tab-title.isFundingAgencyOfProject": "Funder of the Project", + "submission.sections.describe.relationship-lookup.search-tab.tab-title.isFundingAgencyOfProject": "Financiador do projeto", + + // "submission.sections.describe.relationship-lookup.search-tab.tab-title.isPublicationOfAuthor": "Publication of the Author", + "submission.sections.describe.relationship-lookup.search-tab.tab-title.isPublicationOfAuthor": "Publicação do author", + + // "submission.sections.describe.relationship-lookup.selection-tab.title.openAIREFunding": "Funding OpenAIRE API", + "submission.sections.describe.relationship-lookup.selection-tab.title.openAIREFunding": "Financiamento API OpenAIRE", + + // "submission.sections.describe.relationship-lookup.selection-tab.title.isProjectOfPublication": "Project", + "submission.sections.describe.relationship-lookup.selection-tab.title.isProjectOfPublication": "Projeto", + + // "submission.sections.describe.relationship-lookup.title.isProjectOfPublication": "Projects", + "submission.sections.describe.relationship-lookup.title.isProjectOfPublication": "Projetos", + + // "submission.sections.describe.relationship-lookup.title.isFundingAgencyOfProject": "Funder of the Project", + "submission.sections.describe.relationship-lookup.title.isFundingAgencyOfProject": "Financiador do projeto", + + //"submission.sections.describe.relationship-lookup.selection-tab.search-form.placeholder": "Search...", + "submission.sections.describe.relationship-lookup.selection-tab.search-form.placeholder": "Pesquisar...", // "submission.sections.describe.relationship-lookup.selection-tab.tab-title": "Current Selection ({{ count }})", - "submission.sections.describe.relationship-lookup.selection-tab.tab-title": "Seleção Atual ({{ count }})", + "submission.sections.describe.relationship-lookup.selection-tab.tab-title": "Seleção atual ({{ count }})", // "submission.sections.describe.relationship-lookup.title.isJournalIssueOfPublication": "Journal Issues", - "submission.sections.describe.relationship-lookup.title.isJournalIssueOfPublication": "Números de Revista", + "submission.sections.describe.relationship-lookup.title.isJournalIssueOfPublication": "Números de revista", // "submission.sections.describe.relationship-lookup.title.JournalIssue": "Journal Issues", - "submission.sections.describe.relationship-lookup.title.JournalIssue": "Números de Revista", + "submission.sections.describe.relationship-lookup.title.JournalIssue": "Pesquisar números de revista", // "submission.sections.describe.relationship-lookup.title.isJournalVolumeOfPublication": "Journal Volumes", "submission.sections.describe.relationship-lookup.title.isJournalVolumeOfPublication": "Volumes de Revistas", // "submission.sections.describe.relationship-lookup.title.JournalVolume": "Journal Volumes", - "submission.sections.describe.relationship-lookup.title.JournalVolume": "Volumes de Revistas", + "submission.sections.describe.relationship-lookup.title.JournalVolume": "Volumes de revistas", // "submission.sections.describe.relationship-lookup.title.isJournalOfPublication": "Journals", "submission.sections.describe.relationship-lookup.title.isJournalOfPublication": "Revistas", @@ -4862,35 +6208,38 @@ "submission.sections.describe.relationship-lookup.title.isAuthorOfPublication": "Autores", // "submission.sections.describe.relationship-lookup.title.isFundingAgencyOfPublication": "Funding Agency", - "submission.sections.describe.relationship-lookup.title.isFundingAgencyOfPublication": "Agência de Financiamento", + "submission.sections.describe.relationship-lookup.title.isFundingAgencyOfPublication": "Agência de financiamento", // "submission.sections.describe.relationship-lookup.title.Project": "Projects", - "submission.sections.describe.relationship-lookup.title.Project": "Projetos", + "submission.sections.describe.relationship-lookup.title.Project": "Pesquisar projetos", // "submission.sections.describe.relationship-lookup.title.Publication": "Publications", "submission.sections.describe.relationship-lookup.title.Publication": "Publicações", // "submission.sections.describe.relationship-lookup.title.Person": "Authors", - "submission.sections.describe.relationship-lookup.title.Person": "Autores", + "submission.sections.describe.relationship-lookup.title.Person": "Pesquisar autores", // "submission.sections.describe.relationship-lookup.title.OrgUnit": "Organizational Units", - "submission.sections.describe.relationship-lookup.title.OrgUnit": "Unidades Organizacionais", + "submission.sections.describe.relationship-lookup.title.OrgUnit": "Pesquisar unidades organizacionais", // "submission.sections.describe.relationship-lookup.title.DataPackage": "Data Packages", - "submission.sections.describe.relationship-lookup.title.DataPackage": "Pacote de Dados", + "submission.sections.describe.relationship-lookup.title.DataPackage": "Pacote de dados", // "submission.sections.describe.relationship-lookup.title.DataFile": "Data Files", - "submission.sections.describe.relationship-lookup.title.DataFile": "Ficheiros de Dados", + "submission.sections.describe.relationship-lookup.title.DataFile": "Ficheiros de dados", // "submission.sections.describe.relationship-lookup.title.Funding Agency": "Funding Agency", - "submission.sections.describe.relationship-lookup.title.Funding Agency": "Agência de Financiamento", + "submission.sections.describe.relationship-lookup.title.Funding Agency": "Agência de financiamento", // "submission.sections.describe.relationship-lookup.title.isFundingOfPublication": "Funding", "submission.sections.describe.relationship-lookup.title.isFundingOfPublication": "Financiamento", // "submission.sections.describe.relationship-lookup.title.isChildOrgUnitOf": "Parent Organizational Unit", - "submission.sections.describe.relationship-lookup.title.isChildOrgUnitOf": "Organização Principal", + "submission.sections.describe.relationship-lookup.title.isChildOrgUnitOf": "Organização principal", + // "submission.sections.describe.relationship-lookup.title.isPublicationOfAuthor": "Publication", + "submission.sections.describe.relationship-lookup.title.isPublicationOfAuthor": "Publicação", + // "submission.sections.describe.relationship-lookup.search-tab.toggle-dropdown": "Toggle dropdown", "submission.sections.describe.relationship-lookup.search-tab.toggle-dropdown": "Alternar menu dropdown", @@ -4901,25 +6250,25 @@ "submission.sections.describe.relationship-lookup.selection-tab.no-selection": "Não selecionou nenhum item.", // "submission.sections.describe.relationship-lookup.selection-tab.title.isAuthorOfPublication": "Selected Authors", - "submission.sections.describe.relationship-lookup.selection-tab.title.isAuthorOfPublication": "Autores Selecionados", - + "submission.sections.describe.relationship-lookup.selection-tab.title.isAuthorOfPublication": "Autores selecionados", + // "submission.sections.describe.relationship-lookup.selection-tab.title.isJournalOfPublication": "Selected Journals", - "submission.sections.describe.relationship-lookup.selection-tab.title.isJournalOfPublication": "Revistas Selecionadas", + "submission.sections.describe.relationship-lookup.selection-tab.title.isJournalOfPublication": "Revistas selecionadas", // "submission.sections.describe.relationship-lookup.selection-tab.title.isJournalVolumeOfPublication": "Selected Journal Volume", - "submission.sections.describe.relationship-lookup.selection-tab.title.isJournalVolumeOfPublication": "Volume de Revista Selecionados", + "submission.sections.describe.relationship-lookup.selection-tab.title.isJournalVolumeOfPublication": "Volume de revistas selecionadas", // "submission.sections.describe.relationship-lookup.selection-tab.title.Project": "Selected Projects", - "submission.sections.describe.relationship-lookup.selection-tab.title.Project": "Projetos Selecionados", + "submission.sections.describe.relationship-lookup.selection-tab.title.Project": "Projetos selecionados", // "submission.sections.describe.relationship-lookup.selection-tab.title.Publication": "Selected Publications", - "submission.sections.describe.relationship-lookup.selection-tab.title.Publication": "Publicações Selecionados", + "submission.sections.describe.relationship-lookup.selection-tab.title.Publication": "Publicações selecionadas", // "submission.sections.describe.relationship-lookup.selection-tab.title.Person": "Selected Authors", - "submission.sections.describe.relationship-lookup.selection-tab.title.Person": "Autores Selecionados", + "submission.sections.describe.relationship-lookup.selection-tab.title.Person": "Autores selecionados", // "submission.sections.describe.relationship-lookup.selection-tab.title.OrgUnit": "Selected Organizational Units", - "submission.sections.describe.relationship-lookup.selection-tab.title.OrgUnit": "Unidades Organizacionais Selecionadas", + "submission.sections.describe.relationship-lookup.selection-tab.title.OrgUnit": "Unidades organizacionais selecionadas", // "submission.sections.describe.relationship-lookup.selection-tab.title.DataPackage": "Selected Data Packages", "submission.sections.describe.relationship-lookup.selection-tab.title.DataPackage": "Pacotes de dados selecionados", @@ -4928,64 +6277,82 @@ "submission.sections.describe.relationship-lookup.selection-tab.title.DataFile": "Ficheiros de dados selecionados", // "submission.sections.describe.relationship-lookup.selection-tab.title.Journal": "Selected Journals", - "submission.sections.describe.relationship-lookup.selection-tab.title.Journal": "Revistas Selecionadas", + "submission.sections.describe.relationship-lookup.selection-tab.title.Journal": "Revistas selecionadas", // "submission.sections.describe.relationship-lookup.selection-tab.title.isJournalIssueOfPublication": "Selected Issue", - "submission.sections.describe.relationship-lookup.selection-tab.title.isJournalIssueOfPublication": "Número Selecionado", + "submission.sections.describe.relationship-lookup.selection-tab.title.isJournalIssueOfPublication": "Número selecionado", // "submission.sections.describe.relationship-lookup.selection-tab.title.JournalVolume": "Selected Journal Volume", - "submission.sections.describe.relationship-lookup.selection-tab.title.JournalVolume": "Volume de Revista Selecionado", + "submission.sections.describe.relationship-lookup.selection-tab.title.JournalVolume": "Volume de revista selecionado", // "submission.sections.describe.relationship-lookup.selection-tab.title.isFundingAgencyOfPublication": "Selected Funding Agency", - "submission.sections.describe.relationship-lookup.selection-tab.title.isFundingAgencyOfPublication": "Agência de Financiamento selecionada", + "submission.sections.describe.relationship-lookup.selection-tab.title.isFundingAgencyOfPublication": "Agência de financiamento selecionada", // "submission.sections.describe.relationship-lookup.selection-tab.title.isFundingOfPublication": "Selected Funding", "submission.sections.describe.relationship-lookup.selection-tab.title.isFundingOfPublication": "Financiamento selecionado", // "submission.sections.describe.relationship-lookup.selection-tab.title.JournalIssue": "Selected Issue", - "submission.sections.describe.relationship-lookup.selection-tab.title.JournalIssue": "Número Selecionado", + "submission.sections.describe.relationship-lookup.selection-tab.title.JournalIssue": "Número selecionado", // "submission.sections.describe.relationship-lookup.selection-tab.title.isChildOrgUnitOf": "Selected Organizational Unit", - "submission.sections.describe.relationship-lookup.selection-tab.title.isChildOrgUnitOf": "Organização Selecionada", + "submission.sections.describe.relationship-lookup.selection-tab.title.isChildOrgUnitOf": "Organização selecionada", // "submission.sections.describe.relationship-lookup.selection-tab.title.sherpaJournal": "Search Results", - "submission.sections.describe.relationship-lookup.selection-tab.title.sherpaJournal": "Resultados da Pesquisa", + "submission.sections.describe.relationship-lookup.selection-tab.title.sherpaJournal": "Resultados da pesquisa", // "submission.sections.describe.relationship-lookup.selection-tab.title.sherpaPublisher": "Search Results", - "submission.sections.describe.relationship-lookup.selection-tab.title.sherpaPublisher": "Resultados da Pesquisa", + "submission.sections.describe.relationship-lookup.selection-tab.title.sherpaPublisher": "Resultados da pesquisa", // "submission.sections.describe.relationship-lookup.selection-tab.title.orcid": "Search Results", - "submission.sections.describe.relationship-lookup.selection-tab.title.orcid": "Resultados da Pesquisa", + "submission.sections.describe.relationship-lookup.selection-tab.title.orcid": "Resultados da pesquisa", // "submission.sections.describe.relationship-lookup.selection-tab.title.orcidv2": "Search Results", - "submission.sections.describe.relationship-lookup.selection-tab.title.orcidv2": "Resultados da Pesquisa", + "submission.sections.describe.relationship-lookup.selection-tab.title.orcidv2": "Resultados da pesquisa", // "submission.sections.describe.relationship-lookup.selection-tab.title.lcname": "Search Results", - "submission.sections.describe.relationship-lookup.selection-tab.title.lcname": "Resultados da Pesquisa", + "submission.sections.describe.relationship-lookup.selection-tab.title.lcname": "Resultados da pesquisa", // "submission.sections.describe.relationship-lookup.selection-tab.title.pubmed": "Search Results", - "submission.sections.describe.relationship-lookup.selection-tab.title.pubmed": "Resultados da Pesquisa", + "submission.sections.describe.relationship-lookup.selection-tab.title.pubmed": "Resultados da pesquisa", // "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.selection-tab.title.arxiv": "Resultados da pesquisa", + + // "submission.sections.describe.relationship-lookup.selection-tab.title.crossref": "Search Results", + "submission.sections.describe.relationship-lookup.selection-tab.title.crossref": "Resultados da pesquisa", + + // "submission.sections.describe.relationship-lookup.selection-tab.title.epo": "Search Results", + "submission.sections.describe.relationship-lookup.selection-tab.title.epo": "Resultados da pesquisa", + + // "submission.sections.describe.relationship-lookup.selection-tab.title.scopus": "Search Results", + "submission.sections.describe.relationship-lookup.selection-tab.title.scopus": "Resultados da pesquisa", + + // "submission.sections.describe.relationship-lookup.selection-tab.title.scielo": "Search Results", + "submission.sections.describe.relationship-lookup.selection-tab.title.scielo": "Resultados da pesquisa", + + // "submission.sections.describe.relationship-lookup.selection-tab.title.wos": "Search Results", + "submission.sections.describe.relationship-lookup.selection-tab.title.wos": "Resultados da pesquisa", + + // "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": "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.content": "Pretende guardar \"{{ value }}\" como um nome alternativo para esta pessoa permitindo a sua reutilização por outros em futuros depósitos? Se não, pode usar apenas neste depósito.", // "submission.sections.describe.relationship-lookup.name-variant.notification.confirm": "Save a new name variant", "submission.sections.describe.relationship-lookup.name-variant.notification.confirm": "Guardar um Nome alternativo", // "submission.sections.describe.relationship-lookup.name-variant.notification.decline": "Use only for this submission", - "submission.sections.describe.relationship-lookup.name-variant.notification.decline": "Usar apenas para esta submissão", + "submission.sections.describe.relationship-lookup.name-variant.notification.decline": "Usar apenas para este depósito", // "submission.sections.ccLicense.type": "License Type", "submission.sections.ccLicense.type": "Tipo de licença", // "submission.sections.ccLicense.select": "Select a license type…", - "submission.sections.ccLicense.select": "Selecionar o tipo de licença…", + "submission.sections.ccLicense.select": "Selecionar tipo de licença…", // "submission.sections.ccLicense.change": "Change your license type…", - "submission.sections.ccLicense.change": "Alterar o tipo de licença…", + "submission.sections.ccLicense.change": "Alterar tipo de licença…", // "submission.sections.ccLicense.none": "No licenses available", "submission.sections.ccLicense.none": "Sem licenças disponíveis", @@ -4997,54 +6364,76 @@ "submission.sections.ccLicense.link": "Escolheu a seguinte licença:", // "submission.sections.ccLicense.confirmation": "I grant the license above", - "submission.sections.ccLicense.confirmation": "Consedo a licença abaixo indicada", + "submission.sections.ccLicense.confirmation": "Concedo a licença abaixo indicada", // "submission.sections.general.add-more": "Add more", "submission.sections.general.add-more": "Adicionar mais", + // "submission.sections.general.cannot_deposit": "Deposit cannot be completed due to errors in the form.
    Please fill out all required fields to complete the deposit.", + "submission.sections.general.cannot_deposit": "O depósito não pode ser preenchido devido a erros no formulário.
    Por favor preencha todos os campos necessários para completar o depósito.", + // "submission.sections.general.collection": "Collection", "submission.sections.general.collection": "Coleção", // "submission.sections.general.deposit_error_notice": "There was an issue when submitting the item, please try again later.", - "submission.sections.general.deposit_error_notice": "Houve um problema durante a submissão do item, por favor tente novamente mais tarde.", + "submission.sections.general.deposit_error_notice": "Houve um problema durante o depósito do item, por favor tente novamente mais tarde.", // "submission.sections.general.deposit_success_notice": "Submission deposited successfully.", - "submission.sections.general.deposit_success_notice": "Submissão depositada com sucesso.", + "submission.sections.general.deposit_success_notice": "Depositado com sucesso.", // "submission.sections.general.discard_error_notice": "There was an issue when discarding the item, please try again later.", - "submission.sections.general.discard_error_notice": "Houve um problema ao descartar o item, por favor tente novamente mais tarde.", + "submission.sections.general.discard_error_notice": "Houve um problema ao cancelar o item, por favor tente novamente mais tarde.", // "submission.sections.general.discard_success_notice": "Submission discarded successfully.", - "submission.sections.general.discard_success_notice": "Submissão descartada com sucesso.", + "submission.sections.general.discard_success_notice": "Depósito cancelado com sucesso.", // "submission.sections.general.metadata-extracted": "New metadata have been extracted and added to the {{sectionId}} section.", - "submission.sections.general.metadata-extracted": "Novos metadados foram extraídos e adicionados a Secção {{sectionId}}.", + "submission.sections.general.metadata-extracted": "Novos metadados foram extraídos e adicionados à secção {{sectionId}}.", // "submission.sections.general.metadata-extracted-new-section": "New {{sectionId}} section has been added to submission.", "submission.sections.general.metadata-extracted-new-section": "Nova Secção {{sectionId}} foi adicionada a dubmissão.", // "submission.sections.general.no-collection": "No collection found", - "submission.sections.general.no-collection": "Nenhuma coleção encontrada", + "submission.sections.general.no-collection": "Não foi encontrada nenhuma coleção", // "submission.sections.general.no-sections": "No options available", "submission.sections.general.no-sections": "Sem opções disponíveis", // "submission.sections.general.save_error_notice": "There was an issue when saving the item, please try again later.", - "submission.sections.general.save_error_notice": "Houve um problema ao salvar o item, por favor tente novamente mais tarde.", + "submission.sections.general.save_error_notice": "Houve um problema ao guardar o item, por favor tente novamente mais tarde.", // "submission.sections.general.save_success_notice": "Submission saved successfully.", - "submission.sections.general.save_success_notice": "Submissão salva com sucesso.", + "submission.sections.general.save_success_notice": "Depósito guardado com sucesso.", // "submission.sections.general.search-collection": "Search for a collection", "submission.sections.general.search-collection": "Pesquisar uma coleção", // "submission.sections.general.sections_not_valid": "There are incomplete sections.", - "submission.sections.general.sections_not_valid": "Há seções incompletas.", + "submission.sections.general.sections_not_valid": "Subsistem seções incompletas.", + // "submission.sections.identifiers.info": "The following identifiers will be created for your item:", + "submission.sections.identifiers.info": "Serão criados os seguintes identificadores para o seu item:", + + // "submission.sections.identifiers.no_handle": "No handles have been minted for this item.", + "submission.sections.identifiers.no_handle": "Não foram gerados 'handles' para este item.", + // "submission.sections.identifiers.no_doi": "No DOIs have been minted for this item.", + "submission.sections.identifiers.no_doi": "Não foram gerados DOIs para este item.", + + // "submission.sections.identifiers.handle_label": "Handle: ", + "submission.sections.identifiers.handle_label": "Handle: ", + + // "submission.sections.identifiers.doi_label": "DOI: ", + "submission.sections.identifiers.doi_label": "DOI: ", + + // "submission.sections.identifiers.otherIdentifiers_label": "Other identifiers: ", + "submission.sections.identifiers.otherIdentifiers_label": "Outros identificadores: ", + // "submission.sections.submit.progressbar.accessCondition": "Item access conditions", + "submission.sections.submit.progressbar.accessCondition": "Condições de acesso do item", + // "submission.sections.submit.progressbar.CClicense": "Creative commons license", - "submission.sections.submit.progressbar.CClicense": "Licença Creative commons", + "submission.sections.submit.progressbar.CClicense": "Associar uma licença Creative Commons", // "submission.sections.submit.progressbar.describe.recycle": "Recycle", "submission.sections.submit.progressbar.describe.recycle": "Reciclar", @@ -5061,14 +6450,60 @@ // "submission.sections.submit.progressbar.detect-duplicate": "Potential duplicates", "submission.sections.submit.progressbar.detect-duplicate": "Duplicados em potencial", + // "submission.sections.submit.progressbar.identifiers": "Identifiers", + "submission.sections.submit.progressbar.identifiers": "Identificadores", + // "submission.sections.submit.progressbar.license": "Deposit license", - "submission.sections.submit.progressbar.license": "Depositar licença", + "submission.sections.submit.progressbar.license": "Licença de distribuição não-exclusiva do repositório", + + // "submission.sections.submit.progressbar.sherpapolicy": "Sherpa policies", + "submission.sections.submit.progressbar.sherpapolicy": "[Ajuda em contexto] Informação SHERPA sobre políticas de editoras e revistas face ao auto-arquivo em repositórios.", // "submission.sections.submit.progressbar.upload": "Upload files", - "submission.sections.submit.progressbar.upload": "Enviar ficheiros", + "submission.sections.submit.progressbar.upload": "Carregar ficheiro(s)", + // "submission.sections.submit.progressbar.sherpaPolicies": "Publisher open access policy information", + "submission.sections.submit.progressbar.sherpaPolicies": "Informação sobre a política de auto arquivo dos editores", + // "submission.sections.sherpa-policy.title-empty": "No publisher policy information available. If your work has an associated ISSN, please enter it above to see any related publisher open access policies.", + "submission.sections.sherpa-policy.title-empty": "Não foi encontrada informação disponível sobre política desta editora. Se o seu trabalho tem um ISSN associado, por favor, introduza-o em cima para poder visualizar as políticas de auto arquivo associadas.", + // "submission.sections.status.errors.title": "Errors", + "submission.sections.status.errors.title": "Erros", + + // "submission.sections.status.valid.title": "Valid", + "submission.sections.status.valid.title": "Válido", + + // "submission.sections.status.warnings.title": "Warnings", + "submission.sections.status.warnings.title": "Avisos", + + // "submission.sections.status.errors.aria": "has errors", + "submission.sections.status.errors.aria": "contém erros", + + // "submission.sections.status.valid.aria": "is valid", + "submission.sections.status.valid.aria": "é válido", + + // "submission.sections.status.warnings.aria": "has warnings", + "submission.sections.status.warnings.aria": "tem avisos", + + // "submission.sections.status.info.title": "Additional Information", + "submission.sections.status.info.title": "Informação adicional", + + // "submission.sections.status.info.aria": "Additional Information", + "submission.sections.status.info.aria": "Informação adicional", + + // "submission.sections.toggle.open": "Open section", + "submission.sections.toggle.open": "Seção aberta", + + // "submission.sections.toggle.close": "Close section", + "submission.sections.toggle.close": "Seção fechada", + + // "submission.sections.toggle.aria.open": "Expand {{sectionHeader}} section", + "submission.sections.toggle.aria.open": "Expandir seção {{sectionHeader}}", + + // "submission.sections.toggle.aria.close": "Collapse {{sectionHeader}} section", + "submission.sections.toggle.aria.close": "Fechar seção {{sectionHeader}}", + // "submission.sections.upload.delete.confirm.cancel": "Cancel", "submission.sections.upload.delete.confirm.cancel": "Cancelar", @@ -5077,25 +6512,43 @@ // "submission.sections.upload.delete.confirm.submit": "Yes, I'm sure", "submission.sections.upload.delete.confirm.submit": "Sim, tenho certeza", - + // "submission.sections.upload.delete.confirm.title": "Delete bitstream", - "submission.sections.upload.delete.confirm.title": "Remover bitstream", + "submission.sections.upload.delete.confirm.title": "Remover ficheiro", // "submission.sections.upload.delete.submit": "Delete", "submission.sections.upload.delete.submit": "Remover", + // "submission.sections.upload.download.title": "Download bitstream", + "submission.sections.upload.download.title": "Descarregar ficheiro", + // "submission.sections.upload.drop-message": "Drop files to attach them to the item", - "submission.sections.upload.drop-message": "Arraste ficheiros para os anexar a este item", + "submission.sections.upload.drop-message": "Arraste para aqui o(s) ficheiro(s) que pretende anexar a este registo", + + // "submission.sections.upload.edit.title": "Edit bitstream", + "submission.sections.upload.edit.title": "Editar ficheiro", // "submission.sections.upload.form.access-condition-label": "Access condition type", "submission.sections.upload.form.access-condition-label": "Tipo de condição de acesso", + // "submission.sections.upload.form.access-condition-hint": "Select an access condition to apply on the bitstream once the item is deposited", + "submission.sections.upload.form.access-condition-hint": "Selecione um tipo de acesso a aplicar ao ficheiro assim que o item seja depositado", + // "submission.sections.upload.form.date-required": "Date is required.", - "submission.sections.upload.form.date-required": "Data necessária.", + "submission.sections.upload.form.date-required": "Data necessária.", + + // "submission.sections.upload.form.date-required-from": "Grant access from date is required.", + "submission.sections.upload.form.date-required-from": "A data de início é obrigatória.", + + // "submission.sections.upload.form.date-required-until": "Grant access until date is required.", + "submission.sections.upload.form.date-required-until": "A data de fim é obrigatória.", // "submission.sections.upload.form.from-label": "Grant access from", "submission.sections.upload.form.from-label": "Acesso permitido a partir de", + // "submission.sections.upload.form.from-hint": "Select the date from which the related access condition is applied", + "submission.sections.upload.form.from-hint": "Selecione a data a partir da qual o tipo de acesso é aplicável", + // "submission.sections.upload.form.from-placeholder": "From", "submission.sections.upload.form.from-placeholder": "De", @@ -5106,25 +6559,28 @@ "submission.sections.upload.form.group-required": "Grupo é necessário.", // "submission.sections.upload.form.until-label": "Grant access until", - "submission.sections.upload.form.until-label": "Acesso permitido até", + "submission.sections.upload.form.until-label": "conceder acesso até", + + // "submission.sections.upload.form.until-hint": "Select the date until which the related access condition is applied", + "submission.sections.upload.form.until-hint": "Selecione a data até a qual o tipo de acesso será aplicado", // "submission.sections.upload.form.until-placeholder": "Until", - "submission.sections.upload.form.until-placeholder": "Até", - + "submission.sections.upload.form.until-placeholder": "Até", + // "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": "Arquivos enviados na coleção {{collectionName}} serão acessiveis de acordo com o(s) seguinte(s) grupo(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": "Por favor note que os ficheiros enviados à coleção {{collectionName}} serão acessíveis, de acordo com o que está explicitamente definido no ficheiro, no(s) seguinte(s) grupo(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 upload additional files just dragging & dropping them everywhere in the page", - "submission.sections.upload.info": "Aqui encontra todos os ficheiros que estão atualmente no item. Pode atualizar os metadados do ficheiro e condições de acesso ou carregar ficheiros adicionais arrastando os ficheiros em qualquer lugar desta página", + // "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 upload additional files by dragging & dropping them anywhere on the page.", + "submission.sections.upload.info": "Aqui encontra o(s) ficheiro(s) carregado(s) neste registo. Pode atualizar os metadados do(s) ficheiro(s), definir as suas condições de acesso ou carregar ficheiros adicionais arrastando-os em qualquer local da página.", // "submission.sections.upload.no-entry": "No", "submission.sections.upload.no-entry": "Não", // "submission.sections.upload.no-file-uploaded": "No file uploaded yet.", - "submission.sections.upload.no-file-uploaded": "Nenhum ficheiro enviado ainda.", + "submission.sections.upload.no-file-uploaded": "Nenhum ficheiro carregado!", // "submission.sections.upload.save-metadata": "Save metadata", "submission.sections.upload.save-metadata": "Guardar metadados", @@ -5138,47 +6594,194 @@ // "submission.sections.upload.upload-successful": "Upload successful", "submission.sections.upload.upload-successful": "Enviado com sucesso", + // "submission.sections.accesses.form.discoverable-description": "When checked, this item will be discoverable in search/browse. When unchecked, the item will only be available via a direct link and will never appear in search/browse.", + "submission.sections.accesses.form.discoverable-description": "Quando selecionado, este item será pesquisável na pesquisa/navegação. Se não estiver selecionado, o item apenas estará disponível através uma ligação direta (link) e não aparecerá na pesquisa/navegação.", + // "submission.sections.accesses.form.discoverable-label": "Discoverable", + "submission.sections.accesses.form.discoverable-label": "Recuperável", - // "submission.submit.title": "Submission", - "submission.submit.title": "Submissão", + // "submission.sections.accesses.form.access-condition-label": "Access condition type", + "submission.sections.accesses.form.access-condition-label": "Tipo de acesso", + // "submission.sections.accesses.form.access-condition-hint": "Select an access condition to apply on the item once it is deposited", + "submission.sections.accesses.form.access-condition-hint": "Selecione um tipo de acesso para aplicar ao item no momento do seu depósito ", + // "submission.sections.accesses.form.date-required": "Date is required.", + "submission.sections.accesses.form.date-required": "O preenchimento da data é obrigatório.", + + // "submission.sections.accesses.form.date-required-from": "Grant access from date is required.", + "submission.sections.accesses.form.date-required-from": "O preenchimento da data de início é obrigatório.", + + // "submission.sections.accesses.form.date-required-until": "Grant access until date is required.", + "submission.sections.accesses.form.date-required-until": "O preenchimento da data de término é obrigatório.", + + // "submission.sections.accesses.form.from-label": "Grant access from", + "submission.sections.accesses.form.from-label": "Conceder acesso a partir de", + + // "submission.sections.accesses.form.from-hint": "Select the date from which the related access condition is applied", + "submission.sections.accesses.form.from-hint": "Selecine a data a partir da qual o tipo de acesso é aplicável", + + // "submission.sections.accesses.form.from-placeholder": "From", + "submission.sections.accesses.form.from-placeholder": "De", + + // "submission.sections.accesses.form.group-label": "Group", + "submission.sections.accesses.form.group-label": "Grupo", + + // "submission.sections.accesses.form.group-required": "Group is required.", + "submission.sections.accesses.form.group-required": "A indicação de um grupo é obrigátória.", + // "submission.sections.accesses.form.until-label": "Grant access until", + "submission.sections.accesses.form.until-label": "Conceder acesso até", + + // "submission.sections.accesses.form.until-hint": "Select the date until which the related access condition is applied", + "submission.sections.accesses.form.until-hint": "Selecione a data até a qual o tipo de acesso é aplicável", + + // "submission.sections.accesses.form.until-placeholder": "Until", + "submission.sections.accesses.form.until-placeholder": "Até", + + // "submission.sections.license.granted-label": "I confirm the license above", + "submission.sections.license.granted-label": "Confirmo a licença", + + // "submission.sections.license.required": "You must accept the license", + "submission.sections.license.required": "A aceitação da licença constitui um requisito", + + // "submission.sections.license.notgranted": "You must accept the license", + "submission.sections.license.notgranted": "Deve aceitar a licença", + + // "submission.sections.sherpa.publication.information": "Publication information", + "submission.sections.sherpa.publication.information": "Informação sobre a publicação", + + // "submission.sections.sherpa.publication.information.title": "Title", + "submission.sections.sherpa.publication.information.title": "Título", + + // "submission.sections.sherpa.publication.information.issns": "ISSNs", + "submission.sections.sherpa.publication.information.issns": "ISSNs", + + // "submission.sections.sherpa.publication.information.url": "URL", + "submission.sections.sherpa.publication.information.url": "URL", + + // "submission.sections.sherpa.publication.information.publishers": "Publisher", + "submission.sections.sherpa.publication.information.publishers": "Editora", + + // "submission.sections.sherpa.publication.information.romeoPub": "Romeo Pub", + "submission.sections.sherpa.publication.information.romeoPub": "Romeo Pub", + + // "submission.sections.sherpa.publication.information.zetoPub": "Zeto Pub", + "submission.sections.sherpa.publication.information.zetoPub": "Zeto Pub", + + // "submission.sections.sherpa.publisher.policy": "Publisher Policy", + "submission.sections.sherpa.publisher.policy": "Política da editora", + + // "submission.sections.sherpa.publisher.policy.description": "The below information was found via Sherpa Romeo. Based on the policies of your publisher, it provides advice regarding whether an embargo may be necessary and/or which files you are allowed to upload. If you have questions, please contact your site administrator via the feedback form in the footer.", + "submission.sections.sherpa.publisher.policy.description": "A seguinte informação foi obtida através do diretório SHERPA, com base nas políticas disponíveis das editoras/revistas. Fornece informações úteis, sobre as versões dos ficheiros que deverá carregar em repositórios, bem como tipo de embargo ou restrições de acesso poderá ser aconselhável. As informações do SHERPA são fidedignas tanto quanto é do nosso conhecimento, mas não devem ser assumidas como aconselhamento jurídico. Se tiver dúvidas, por favor contacte o(s) administrador(es) do seu repositório através do formulário de feedback no rodapé.", + + // "submission.sections.sherpa.publisher.policy.openaccess": "Open Access pathways permitted by this journal's policy are listed below by article version. Click on a pathway for a more detailed view", + "submission.sections.sherpa.publisher.policy.openaccess": "As 'vias' de acesso aberto permitidas pela política desta revista estão listadas em baixo, tendo em consideração as versões do artigo (ex. 'Versão final publicada', 'Versão aceite do autor', 'Versão submetida'). Clique numa via para obter mais detalhes.", + + // "submission.sections.sherpa.publisher.policy.more.information": "For more information, please see the following links:", + "submission.sections.sherpa.publisher.policy.more.information": "Para mais informações, consulte por favor os seguintes links:", + + // "submission.sections.sherpa.publisher.policy.version": "Version", + "submission.sections.sherpa.publisher.policy.version": "Versão", + + // "submission.sections.sherpa.publisher.policy.embargo": "Embargo", + "submission.sections.sherpa.publisher.policy.embargo": "Embargo", + + // "submission.sections.sherpa.publisher.policy.noembargo": "No Embargo", + "submission.sections.sherpa.publisher.policy.noembargo": "Sem embargo", + + // "submission.sections.sherpa.publisher.policy.nolocation": "None", + "submission.sections.sherpa.publisher.policy.nolocation": "Nenhuma", + + // "submission.sections.sherpa.publisher.policy.license": "License", + "submission.sections.sherpa.publisher.policy.license": "Licença", + + // "submission.sections.sherpa.publisher.policy.prerequisites": "Prerequisites", + "submission.sections.sherpa.publisher.policy.prerequisites": "Pré-requisitos", + + // "submission.sections.sherpa.publisher.policy.location": "Location", + "submission.sections.sherpa.publisher.policy.location": "Localização", + + // "submission.sections.sherpa.publisher.policy.conditions": "Conditions", + "submission.sections.sherpa.publisher.policy.conditions": "Condições", + + // "submission.sections.sherpa.publisher.policy.refresh": "Refresh", + "submission.sections.sherpa.publisher.policy.refresh": "Atualizar", + + // "submission.sections.sherpa.record.information": "Record Information", + "submission.sections.sherpa.record.information": "Informação do registo", + + // "submission.sections.sherpa.record.information.id": "ID", + "submission.sections.sherpa.record.information.id": "ID", + + // "submission.sections.sherpa.record.information.date.created": "Date Created", + "submission.sections.sherpa.record.information.date.created": "Data de Criação", + + // "submission.sections.sherpa.record.information.date.modified": "Last Modified", + "submission.sections.sherpa.record.information.date.modified": "Última modificação", + + // "submission.sections.sherpa.record.information.uri": "URI", + "submission.sections.sherpa.record.information.uri": "URI", + + // "submission.sections.sherpa.error.message": "There was an error retrieving sherpa informations", + "submission.sections.sherpa.error.message": "Ocorreu um erro na recuperação de informações do SHERPA", + + // "submission.submit.breadcrumbs": "New submission", + "submission.submit.breadcrumbs": "Novos depósitos", + + // "submission.submit.title": "New submission", + "submission.submit.title": "Novo depósito", + // "submission.workflow.generic.delete": "Delete", - "submission.workflow.generic.delete": "Apagar", + "submission.workflow.generic.delete": "Remover", - // "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": "Se você gostaria de descartar este item, selecione \"Apagar\". Você será questionado para confirmar.", + // "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": "Clique se pretender remover definitivamente este item. Será solicitada confirmação.", // "submission.workflow.generic.edit": "Edit", "submission.workflow.generic.edit": "Editar", // "submission.workflow.generic.edit-help": "Select this option to change the item's metadata.", - "submission.workflow.generic.edit-help": "Selecione esta opção para modificar os metadados do item.", + "submission.workflow.generic.edit-help": "Selecione esta opção para modificar os metadados do item", // "submission.workflow.generic.view": "View", "submission.workflow.generic.view": "Visualizar", // "submission.workflow.generic.view-help": "Select this option to view the item's metadata.", - "submission.workflow.generic.view-help": "Selecione esta opção para ver o metadados do item.", + "submission.workflow.generic.view-help": "Visualizar os metadados do item", + // "submission.workflow.generic.submit_select_reviewer": "Select Reviewer", + "submission.workflow.generic.submit_select_reviewer": "Selecionar revisor", - - // "submission.workflow.tasks.claimed.approve": "Approve", + // "submission.workflow.generic.submit_select_reviewer-help": "", + "submission.workflow.generic.submit_select_reviewer-help": "", + + // "submission.workflow.generic.submit_score": "Rate", + "submission.workflow.generic.submit_score": "Classificar", + + // "submission.workflow.generic.submit_score-help": "", + "submission.workflow.generic.submit_score-help": "", + + // "submission.workflow.tasks.claimed.approve": "Approve", "submission.workflow.tasks.claimed.approve": "Aprovar", // "submission.workflow.tasks.claimed.approve_help": "If you have reviewed the item and it is suitable for inclusion in the collection, select \"Approve\".", - "submission.workflow.tasks.claimed.approve_help": "Se você revisou o item e este está adequado para inclusão na coleção, selecione \"Aprovar\".", + "submission.workflow.tasks.claimed.approve_help": "Se reviu o item e está adequado para inclusão na coleção, selecione \"Aprovar\".", // "submission.workflow.tasks.claimed.edit": "Edit", "submission.workflow.tasks.claimed.edit": "Editar", - + // "submission.workflow.tasks.claimed.edit_help": "Select this option to change the item's metadata.", "submission.workflow.tasks.claimed.edit_help": "Selecione esta opção para modificar os metadados do item.", + // "submission.workflow.tasks.claimed.decline": "Decline", + "submission.workflow.tasks.claimed.decline": "Declinar", + + // "submission.workflow.tasks.claimed.decline_help": "", + "submission.workflow.tasks.claimed.decline_help": "", + // "submission.workflow.tasks.claimed.reject.reason.info": "Please enter your reason for rejecting the submission into the box below, indicating whether the submitter may fix a problem and resubmit.", - "submission.workflow.tasks.claimed.reject.reason.info": "Informe o motivo da rejeição da submissão na caixa abaixo, indicando se o depositante pode corrigir algum problema e reenviar.", + "submission.workflow.tasks.claimed.reject.reason.info": "Informe o motivo da rejeição do depósito em baixo, indicando se o depositante pode corrigir algum problema e reenviar o depósito.", // "submission.workflow.tasks.claimed.reject.reason.placeholder": "Describe the reason of reject", "submission.workflow.tasks.claimed.reject.reason.placeholder": "Descreva o motivo da rejeição", @@ -5201,27 +6804,23 @@ // "submission.workflow.tasks.claimed.return_help": "Return the task to the pool so that another user may perform the task.", "submission.workflow.tasks.claimed.return_help": "Enviar a tarefa para a lista para que outra pessoa possa executar.", - - // "submission.workflow.tasks.generic.error": "Error occurred during operation...", - "submission.workflow.tasks.generic.error": "Ocorreu um erro durante a operação...", + "submission.workflow.tasks.generic.error": "ocorreu um erro durante a operação...", // "submission.workflow.tasks.generic.processing": "Processing...", - "submission.workflow.tasks.generic.processing": "Processando...", + "submission.workflow.tasks.generic.processing": "a processar...", // "submission.workflow.tasks.generic.submitter": "Submitter", - "submission.workflow.tasks.generic.submitter": "Submetedor", + "submission.workflow.tasks.generic.submitter": "Depositante", // "submission.workflow.tasks.generic.success": "Operation successful", "submission.workflow.tasks.generic.success": "Operação realizada com sucesso", - - // "submission.workflow.tasks.pool.claim": "Claim", - "submission.workflow.tasks.pool.claim": "Requerer", + "submission.workflow.tasks.pool.claim": "Assumir", // "submission.workflow.tasks.pool.claim_help": "Assign this task to yourself.", - "submission.workflow.tasks.pool.claim_help": "Atribua esta tarefa a si mesmo.", + "submission.workflow.tasks.pool.claim_help": "Assumir esta tarefa", // "submission.workflow.tasks.pool.hide-detail": "Hide detail", "submission.workflow.tasks.pool.hide-detail": "Ocultar detalhes", @@ -5229,13 +6828,144 @@ // "submission.workflow.tasks.pool.show-detail": "Show detail", "submission.workflow.tasks.pool.show-detail": "Mostrar detalhes", + // "submission.workspace.generic.view": "View", + "submission.workspace.generic.view": "Ver", + + // "submission.workspace.generic.view-help": "Select this option to view the item's metadata.", + "submission.workspace.generic.view-help": "Selecione esta opção para ver os metadados do item.", + + // "subscriptions.title": "subscriptions", + "subscriptions.title": "Subscrições de alertas", + + // "subscriptions.item": "subscriptions for items", + "subscriptions.item": "Subscrições para itens", + + // "subscriptions.collection": "subscriptions for collections", + "subscriptions.collection": "Subscrições para coleções", + + // "subscriptions.community": "subscriptions for communities", + "subscriptions.community": "Subscrições para comunidades", + + // "subscriptions.subscription_type": "Subscription type", + "subscriptions.subscription_type": "Tipo de subscrição", + + // "subscriptions.frequency": "Subscription frequency", + "subscriptions.frequency": "Frequência da subscrição", + + // "subscriptions.frequency.D": "Daily", + "subscriptions.frequency.D": "Diária", + + // "subscriptions.frequency.M": "Monthly", + "subscriptions.frequency.M": "Mensal", + + // "subscriptions.frequency.W": "Weekly", + "subscriptions.frequency.W": "Semanal", + + // "subscriptions.tooltip": "Subscribe", + "subscriptions.tooltip": "Subscrever", + + // "subscriptions.modal.title": "subscriptions", + "subscriptions.modal.title": "Subscrições de alertas", + + // "subscriptions.modal.type-frequency": "Type and frequency", + "subscriptions.modal.type-frequency": "Tipo e frequência", + + // "subscriptions.modal.close": "Close", + "subscriptions.modal.close": "Fechar", + + // "subscriptions.modal.delete-info": "To remove this subscription, please visit the \// "subscriptions\" page under your user profile", + "subscriptions.modal.delete-info": "Para remover esta subscrição, por favor aceda à página de 'subscrições' debaixo do seu perfil de utilizador", + + // "subscriptions.modal.new-subscription-form.type.content": "Content", + "subscriptions.modal.new-subscription-form.type.content": "Conteúdo", + + // "subscriptions.modal.new-subscription-form.frequency.D": "Daily", + "subscriptions.modal.new-subscription-form.frequency.D": "Diária", + + // "subscriptions.modal.new-subscription-form.frequency.W": "Weekly", + "subscriptions.modal.new-subscription-form.frequency.W": "Semanal", + + // "subscriptions.modal.new-subscription-form.frequency.M": "Monthly", + "subscriptions.modal.new-subscription-form.frequency.M": "Mensal", + + // "subscriptions.modal.new-subscription-form.submit": "Submit", + "subscriptions.modal.new-subscription-form.submit": "Submeter", + + // "subscriptions.modal.new-subscription-form.processing": "processing...", + "subscriptions.modal.new-subscription-form.processing": "A processar...", + + // "subscriptions.modal.create.success": "Subscribed to {{ type }} successfully.", + "subscriptions.modal.create.success": "Subscrição para '{{ type }}' realizada com sucessso.", + + // "subscriptions.modal.delete.success": "Subscription deleted successfully", + "subscriptions.modal.delete.success": "Subscrição removida com sucesso", + + // "subscriptions.modal.update.success": "Subscription to {{ type }} updated successfully", + "subscriptions.modal.update.success": "Subscrição para '{{ type }}' atualizada com suceso", + + // "subscriptions.modal.create.error": "An error occurs during the subscription creation", + "subscriptions.modal.create.error": "Ocorre um erro durante a criação da subscrição", + + // "subscriptions.modal.delete.error": "An error occurs during the subscription delete", + "subscriptions.modal.delete.error": "Ocorre um erro durante a remoção da subscrição", + + // "subscriptions.modal.update.error": "An error occurs during the subscription update", + "subscriptions.modal.update.error": "Ocorre um erro durante a atualização da subscrição", + + // "subscriptions.table.dso": "Subject", + "subscriptions.table.dso": "Assunto", + + // "subscriptions.table.subscription_type": "Subscription Type", + "subscriptions.table.subscription_type": "Tipo de subscrição", + + // "subscriptions.table.subscription_frequency": "Subscription Frequency", + "subscriptions.table.subscription_frequency": "Frequência da subscrição", + + // "subscriptions.table.action": "Action", + "subscriptions.table.action": "Ação", + + // "subscriptions.table.edit": "Edit", + "subscriptions.table.edit": "Editar", + + // "subscriptions.table.delete": "Delete", + "subscriptions.table.delete": "Remover", + + // "subscriptions.table.not-available": "Not available", + "subscriptions.table.not-available": "Indisponível", + + // "subscriptions.table.not-available-message": "The subscribed item has been deleted, or you don't currently have the permission to view it", + "subscriptions.table.not-available-message": "O item subscrito foi removido ou atualmente não tem permissão para o visualizar", + + // "subscriptions.table.empty.message": "You do not have any subscriptions at this time. To subscribe to email updates for a Community or Collection, use the subscription button on the object's page.", + "subscriptions.table.empty.message": "Neste momento, não tem quaisquer subscrições. Para subscrever atualizações por correio electrónico para uma 'Comunidade' ou 'Colecção', utilize o botão de 'Subscrição' na página do objeto.", + + // "thumbnail.default.alt": "Thumbnail Image", + "thumbnail.default.alt": "Miniatura", + + // "thumbnail.default.placeholder": "No Thumbnail Available", + "thumbnail.default.placeholder": "Miniatura indisponível", + + // "thumbnail.project.alt": "Project Logo", + "thumbnail.project.alt": "Logótipo do projeto", + // "thumbnail.project.placeholder": "Project Placeholder Image", + "thumbnail.project.placeholder": "Imagem do projeto", + + // "thumbnail.orgunit.alt": "OrgUnit Logo", + "thumbnail.orgunit.alt": "Logótipo da unidade", + // "thumbnail.orgunit.placeholder": "OrgUnit Placeholder Image", + "thumbnail.orgunit.placeholder": "Imagem da unidade", + + // "thumbnail.person.alt": "Profile Picture", + "thumbnail.person.alt": "Foto do perfil", + + // "thumbnail.person.placeholder": "No Profile Picture Available", + "thumbnail.person.placeholder": "Foto indisponível", + // "title": "DSpace", - "title": "DSpace", - - - + "title": "Repositório", + // "vocabulary-treeview.header": "Hierarchical tree view", "vocabulary-treeview.header": "Vista hierárquica", @@ -5246,7 +6976,7 @@ "vocabulary-treeview.search.form.reset": "Redefinir", // "vocabulary-treeview.search.form.search": "Search", - "vocabulary-treeview.search.form.search": "Pesquisar", + "vocabulary-treeview.search.form.search": "pesquisar", // "vocabulary-treeview.search.no-result": "There were no items to show", "vocabulary-treeview.search.no-result": "Não existem itens para mostrar", @@ -5256,21 +6986,24 @@ // "vocabulary-treeview.tree.description.srsc": "Research Subject Categories", "vocabulary-treeview.tree.description.srsc": "Categorias de Assuntos de Investigação", - - + + // "vocabulary-treeview.info": "Select a subject to add as search filter", + "vocabulary-treeview.info": "Selecione um assunto para adicionar como filtro de pesquisa", // "uploader.browse": "browse", - "uploader.browse": "Navegar", + "uploader.browse": "navegue para o(s) carregar.", // "uploader.drag-message": "Drag & Drop your files here", - "uploader.drag-message": "Clique e arraste os seus ficheiros aqui", + "uploader.drag-message": "Clique e arraste o(s) seu(s) ficheiro(s) para aqui", + // "uploader.delete.btn-title": "Delete", + "uploader.delete.btn-title": "Apagar", + // "uploader.or": ", or ", - "uploader.or": ", ou", + "uploader.or": " ou", // "uploader.processing": "Processing uploaded file(s)... (it's now safe to close this page)", - // TODO Source message changed - Revise the translation - "uploader.processing": "A Processar", + "uploader.processing": "A processar o(s) ficheiro(s) carregado(s)... (agora é seguro fechar esta página)", // "uploader.queue-length": "Queue length", "uploader.queue-length": "Tamanho da fila", @@ -5284,12 +7017,26 @@ // "virtual-metadata.delete-relationship.modal-head": "Select the items for which you want to save the virtual metadata as real metadata", "virtual-metadata.delete-relationship.modal-head": "Selecione os tipos para os quais pretende guardar os metadados virtuais como metadados reais", + // "supervisedWorkspace.search.results.head": "Supervised Items", + "supervisedWorkspace.search.results.head": "Itens supervisionados", + // "workspace.search.results.head": "Your submissions", + "workspace.search.results.head": "Os meus depósitos", // "workflowAdmin.search.results.head": "Administer Workflow", - "workflowAdmin.search.results.head": "Gestão do Workflow", - + "workflowAdmin.search.results.head": "Gestão do workflow", + // "workflow.search.results.head": "Workflow tasks", + "workflow.search.results.head": "Tarefas em workflow", + + // "supervision.search.results.head": "Workflow and Workspace tasks", + "supervision.search.results.head": "Workflow e tarefas na área de trabalho", + + // "workflow-item.edit.breadcrumbs": "Edit workflowitem", + "workflow-item.edit.breadcrumbs": "Editar item em processamento", + + // "workflow-item.edit.title": "Edit workflowitem", + "workflow-item.edit.title": "Editar item em processamento", // "workflow-item.delete.notification.success.title": "Deleted", "workflow-item.delete.notification.success.title": "Apagado", @@ -5304,10 +7051,10 @@ "workflow-item.delete.notification.error.content": "Não foi possível apagar o item do workflow", // "workflow-item.delete.title": "Delete workflow item", - "workflow-item.delete.title": "Apagar Item do Workflow", + "workflow-item.delete.title": "Apagar item do workflow", // "workflow-item.delete.header": "Delete workflow item", - "workflow-item.delete.header": "Apagar Item do Workflow", + "workflow-item.delete.header": "Apagar item do workflow", // "workflow-item.delete.button.cancel": "Cancel", "workflow-item.delete.button.cancel": "Cancelar", @@ -5315,7 +7062,6 @@ // "workflow-item.delete.button.confirm": "Delete", "workflow-item.delete.button.confirm": "Apagar", - // "workflow-item.send-back.notification.success.title": "Sent back to submitter", "workflow-item.send-back.notification.success.title": "Devolver ao depositante", @@ -5337,8 +7083,610 @@ // "workflow-item.send-back.button.cancel": "Cancel", "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": "Send back", + "workflow-item.send-back.button.confirm": "Devolver", + + // "workflow-item.view.breadcrumbs": "Workflow View", + "workflow-item.view.breadcrumbs": "Vista das tarefas", + + // "workspace-item.view.breadcrumbs": "Workspace View", + "workspace-item.view.breadcrumbs": "Vista das tarefas", + + // "workspace-item.view.title": "Workspace View", + "workspace-item.view.title": "Vista das tarefas", + + // "workflow-item.advanced.title": "Advanced workflow", + "workflow-item.advanced.title": "Fluxo de trabalho avançado", + + // "workflow-item.selectrevieweraction.notification.success.title": "Selected reviewer", + "workflow-item.selectrevieweraction.notification.success.title": "Selecionar revisor", + + // "workflow-item.selectrevieweraction.notification.success.content": "The reviewer for this workflow item has been successfully selected", + "workflow-item.selectrevieweraction.notification.success.content": "O revisor para o fluxo de trabalho deste item foi seleccionado com sucesso", + + // "workflow-item.selectrevieweraction.notification.error.title": "Something went wrong", + "workflow-item.selectrevieweraction.notification.error.title": "Ocorreu algum erro!", + + // "workflow-item.selectrevieweraction.notification.error.content": "Couldn't select the reviewer for this workflow item", + "workflow-item.selectrevieweraction.notification.error.content": "Não foi possível selecionar o revisor para o fluxo de trabalho deste item", + + // "workflow-item.selectrevieweraction.title": "Select Reviewer", + "workflow-item.selectrevieweraction.title": "Selecionar revisor", + + // "workflow-item.selectrevieweraction.header": "Select Reviewer", + "workflow-item.selectrevieweraction.header": "Selecionar revisor", + + // "workflow-item.selectrevieweraction.button.cancel": "Cancel", + "workflow-item.selectrevieweraction.button.cancel": "Cancelar", + + // "workflow-item.selectrevieweraction.button.confirm": "Confirm", + "workflow-item.selectrevieweraction.button.confirm": "Confirmar", + + // "workflow-item.scorereviewaction.notification.success.title": "Rating review", + "workflow-item.scorereviewaction.notification.success.title": "Classificar revisão", + + // "workflow-item.scorereviewaction.notification.success.content": "The rating for this item workflow item has been successfully submitted", + "workflow-item.scorereviewaction.notification.success.content": "A classificação para o fluxo de trabalho deste item foi submetida com sucesso", + + // "workflow-item.scorereviewaction.notification.error.title": "Something went wrong", + "workflow-item.scorereviewaction.notification.error.title": "Ocorreu algum erro!", + + // "workflow-item.scorereviewaction.notification.error.content": "Couldn't rate this item", + "workflow-item.scorereviewaction.notification.error.content": "Não foi possível classificar este item", + + // "workflow-item.scorereviewaction.title": "Rate this item", + "workflow-item.scorereviewaction.title": "Classifique este item", + + // "workflow-item.scorereviewaction.header": "Rate this item", + "workflow-item.scorereviewaction.header": "Classifique este item", + + // "workflow-item.scorereviewaction.button.cancel": "Cancel", + "workflow-item.scorereviewaction.button.cancel": "Cancelar", + + // "workflow-item.scorereviewaction.button.confirm": "Confirm", + "workflow-item.scorereviewaction.button.confirm": "Confirmar", + + // "idle-modal.header": "Session will expire soon", + "idle-modal.header": "A sua sessão vai expirar em breve!", + + // "idle-modal.info": "For security reasons, user sessions expire after {{ timeToExpire }} minutes of inactivity. Your session will expire soon. Would you like to extend it or log out?", + "idle-modal.info": "Por razões de segurança, as sessões de utilizador expiram depois de {{ timeToExpire }} minutos de inatividade. A sua sessão expira em breve. Gostaria de a prolongar ou sair?", + + // "idle-modal.log-out": "Log out", + "idle-modal.log-out": "Desligar", + + // "idle-modal.extend-session": "Extend session", + "idle-modal.extend-session": "Prolongar sessão", + + // "researcher.profile.action.processing" : "Processing...", + "researcher.profile.action.processing" : "A processar...", + + // "researcher.profile.associated": "Researcher profile associated", + "researcher.profile.associated": "Perfil do investigador associado", + + // "researcher.profile.change-visibility.fail": "An unexpected error occurs while changing the profile visibility", + "researcher.profile.change-visibility.fail": "Ocorre um erro inesperado ao alterar a visibilidade do perfil", + + // "researcher.profile.create.new": "Create new", + "researcher.profile.create.new": "Criar novo", + + // "researcher.profile.create.success": "Researcher profile created successfully", + "researcher.profile.create.success": "Perfil do investigador criado com sucesso", + + // "researcher.profile.create.fail": "An error occurs during the researcher profile creation", + "researcher.profile.create.fail": "Ocorre um erro durante a criação do perfil do investigador", + + // "researcher.profile.delete": "Delete", + "researcher.profile.delete": "Remover", + + // "researcher.profile.expose": "Expose", + "researcher.profile.expose": "Expor", + + // "researcher.profile.hide": "Hide", + "researcher.profile.hide": "Esconder", + + // "researcher.profile.not.associated": "Researcher profile not yet associated", + "researcher.profile.not.associated": "Perfil do investigador ainda não associado", + + // "researcher.profile.view": "View", + "researcher.profile.view": "Ver", + + // "researcher.profile.private.visibility" : "PRIVATE", + "researcher.profile.private.visibility" : "PRIVADO", + + // "researcher.profile.public.visibility" : "PUBLIC", + "researcher.profile.public.visibility" : "PÚBLICO", + + // "researcher.profile.status": "Status:", + "researcher.profile.status": "Estado:", + + // "researcherprofile.claim.not-authorized": "You are not authorized to claim this item. For more details contact the administrator(s).", + "researcherprofile.claim.not-authorized": "Não possui autorização para reinvindicar este artigo. Para mais pormenores, contactar o(s) administrador(es).", + + // "researcherprofile.error.claim.body" : "An error occurred while claiming the profile, please try again later", + "researcherprofile.error.claim.body" : "Ocorreu um erro ao reclamar o perfil, por favor tente novamente mais tarde", + + // "researcherprofile.error.claim.title" : "Error", + "researcherprofile.error.claim.title" : "Erro", + + // "researcherprofile.success.claim.body" : "Profile claimed with success", + "researcherprofile.success.claim.body" : "Perfil reivindicado com sucesso", + + // "researcherprofile.success.claim.title" : "Success", + "researcherprofile.success.claim.title" : "Sucesso", + + // "person.page.orcid.create": "Create an ORCID iD", + "person.page.orcid.create": "Criar um ORCID iD", + + // "person.page.orcid.granted-authorizations": "Granted authorizations", + "person.page.orcid.granted-authorizations": "Autorizações concedidas", + + // "person.page.orcid.grant-authorizations" : "Grant authorizations", + "person.page.orcid.grant-authorizations" : "Conceder autorizações", + + // "person.page.orcid.link": "Connect to ORCID iD", + "person.page.orcid.link": "Ligar ao ORCID iD", + + // "person.page.orcid.link.processing": "Linking profile to ORCID...", + "person.page.orcid.link.processing": "Ligação do perfil ao ORCID...", + + // "person.page.orcid.link.error.message": "Something went wrong while connecting the profile with ORCID. If the problem persists, contact the administrator.", + "person.page.orcid.link.error.message": "Ocorreu algum problema ao ligar o perfil ao ORCID. Se o problema persistir, contacte o administrador.", + + // "person.page.orcid.orcid-not-linked-message": "The ORCID iD of this profile ({{ orcid }}) has not yet been connected to an account on the ORCID registry or the connection is expired.", + "person.page.orcid.orcid-not-linked-message": "O ORCID iD deste perfil ({{{ orcid }}) ainda não foi ligado a uma conta no registo do ORCID ou a ligação está expirada.", + + // "person.page.orcid.unlink": "Disconnect from ORCID", + "person.page.orcid.unlink": "Desligar do ORCID", + + // "person.page.orcid.unlink.processing": "Processing...", + "person.page.orcid.unlink.processing": "A processar...", + + // "person.page.orcid.missing-authorizations": "Missing authorizations", + "person.page.orcid.missing-authorizations": "Autorizações em falta", + + // "person.page.orcid.missing-authorizations-message": "The following authorizations are missing:", + "person.page.orcid.missing-authorizations-message": "Faltam as seguintes autorizações:", + + // "person.page.orcid.no-missing-authorizations-message": "Great! This box is empty, so you have granted all access rights to use all functions offers by your institution.", + "person.page.orcid.no-missing-authorizations-message": "Óptimo! Esta caixa está vazia, pelo que lhe foram concedidas todos as permissões de acesso para utilizar todas as funções oferecidas pela sua instituição.", + + // "person.page.orcid.no-orcid-message": "No ORCID iD associated yet. By clicking on the button below it is possible to link this profile with an ORCID account.", + "person.page.orcid.no-orcid-message": "Ainda não foi associado nenhum ORCID iD. Ao clicar no botão abaixo, é possível ligar este perfil a uma conta ORCID.", + + // "person.page.orcid.profile-preferences": "Profile preferences", + "person.page.orcid.profile-preferences": "Preferências de perfil", + + // "person.page.orcid.funding-preferences": "Funding preferences", + "person.page.orcid.funding-preferences": "Preferências de financiamento", + + // "person.page.orcid.publications-preferences": "Publication preferences", + "person.page.orcid.publications-preferences": "Preferências de publicações", + + // "person.page.orcid.remove-orcid-message": "If you need to remove your ORCID, please contact the repository administrator", + "person.page.orcid.remove-orcid-message": "Se precisar de remover o seu ORCID, por favor contacte o administrador do repositório", + + // "person.page.orcid.save.preference.changes": "Update settings", + "person.page.orcid.save.preference.changes": "Atualizar configurações", + + // "person.page.orcid.sync-profile.affiliation" : "Affiliation", + "person.page.orcid.sync-profile.affiliation" : "Afiliação", + + // "person.page.orcid.sync-profile.biographical" : "Biographical data", + "person.page.orcid.sync-profile.biographical" : "Dados biográficos", + + // "person.page.orcid.sync-profile.education" : "Education", + "person.page.orcid.sync-profile.education" : "Educação", + + // "person.page.orcid.sync-profile.identifiers" : "Identifiers", + "person.page.orcid.sync-profile.identifiers" : "Identificadores", + + // "person.page.orcid.sync-fundings.all" : "All fundings", + "person.page.orcid.sync-fundings.all" : "Todos financiamentos", + + // "person.page.orcid.sync-fundings.mine" : "My fundings", + "person.page.orcid.sync-fundings.mine" : "Meus financiamentos", + + // "person.page.orcid.sync-fundings.my_selected" : "Selected fundings", + "person.page.orcid.sync-fundings.my_selected" : "Financiamentos selecionados", + + // "person.page.orcid.sync-fundings.disabled" : "Disabled", + "person.page.orcid.sync-fundings.disabled" : "Desligado", + + // "person.page.orcid.sync-publications.all" : "All publications", + "person.page.orcid.sync-publications.all" : "Todas as publicações", + + // "person.page.orcid.sync-publications.mine" : "My publications", + "person.page.orcid.sync-publications.mine" : "As minhas publicações", + + // "person.page.orcid.sync-publications.my_selected" : "Selected publications", + "person.page.orcid.sync-publications.my_selected" : "Publicações selecionadas", + + // "person.page.orcid.sync-publications.disabled" : "Disabled", + "person.page.orcid.sync-publications.disabled" : "Desligado", + + // "person.page.orcid.sync-queue.discard" : "Discard the change and do not synchronize with the ORCID registry", + "person.page.orcid.sync-queue.discard" : "Cancelar a alteração e não sincronizar com o registo ORCID", + + // "person.page.orcid.sync-queue.discard.error": "The discarding of the ORCID queue record failed", + "person.page.orcid.sync-queue.discard.error": "A eliminação do registo da fila do ORCID falhou", + + // "person.page.orcid.sync-queue.discard.success": "The ORCID queue record have been discarded successfully", + "person.page.orcid.sync-queue.discard.success": "O registo da fila do ORCID foi descartado com sucesso", + + // "person.page.orcid.sync-queue.empty-message": "The ORCID queue registry is empty", + "person.page.orcid.sync-queue.empty-message": "O registo de filas do ORCID está vazio", + + // "person.page.orcid.sync-queue.table.header.type" : "Type", + "person.page.orcid.sync-queue.table.header.type" : "Tipo", + + // "person.page.orcid.sync-queue.table.header.description" : "Description", + "person.page.orcid.sync-queue.table.header.description" : "Descrição", + + // "person.page.orcid.sync-queue.table.header.action" : "Action", + "person.page.orcid.sync-queue.table.header.action" : "Ação", + + // "person.page.orcid.sync-queue.description.affiliation": "Affiliations", + "person.page.orcid.sync-queue.description.affiliation": "Afiliações", + + // "person.page.orcid.sync-queue.description.country": "Country", + "person.page.orcid.sync-queue.description.country": "País", + + // "person.page.orcid.sync-queue.description.education": "Educations", + "person.page.orcid.sync-queue.description.education": "Educação", + + // "person.page.orcid.sync-queue.description.external_ids": "External ids", + "person.page.orcid.sync-queue.description.external_ids": "IDs externos", + + // "person.page.orcid.sync-queue.description.other_names": "Other names", + "person.page.orcid.sync-queue.description.other_names": "Outros nomes", + + // "person.page.orcid.sync-queue.description.qualification": "Qualifications", + "person.page.orcid.sync-queue.description.qualification": "Qualificações", + + // "person.page.orcid.sync-queue.description.researcher_urls": "Researcher urls", + "person.page.orcid.sync-queue.description.researcher_urls": "URLS dos investigadores", + + // "person.page.orcid.sync-queue.description.keywords": "Keywords", + "person.page.orcid.sync-queue.description.keywords": "Palavras-chave", + + // "person.page.orcid.sync-queue.tooltip.insert": "Add a new entry in the ORCID registry", + "person.page.orcid.sync-queue.tooltip.insert": "Acrescentar uma nova entrada no registo ORCID", + + // "person.page.orcid.sync-queue.tooltip.update": "Update this entry on the ORCID registry", + "person.page.orcid.sync-queue.tooltip.update": "Actualizar esta entrada no registo do ORCID", + + // "person.page.orcid.sync-queue.tooltip.delete": "Remove this entry from the ORCID registry", + "person.page.orcid.sync-queue.tooltip.delete": "Remover esta entrada do registo do ORCID", + + // "person.page.orcid.sync-queue.tooltip.publication": "Publication", + "person.page.orcid.sync-queue.tooltip.publication": "Publicação", + + // "person.page.orcid.sync-queue.tooltip.project": "Project", + "person.page.orcid.sync-queue.tooltip.project": "Projeto", + + // "person.page.orcid.sync-queue.tooltip.affiliation": "Affiliation", + "person.page.orcid.sync-queue.tooltip.affiliation": "Afiliação", + + // "person.page.orcid.sync-queue.tooltip.education": "Education", + "person.page.orcid.sync-queue.tooltip.education": "Educação", + + // "person.page.orcid.sync-queue.tooltip.qualification": "Qualification", + "person.page.orcid.sync-queue.tooltip.qualification": "Qualificação", + + // "person.page.orcid.sync-queue.tooltip.other_names": "Other name", + "person.page.orcid.sync-queue.tooltip.other_names": "Outro nome", + + // "person.page.orcid.sync-queue.tooltip.country": "Country", + "person.page.orcid.sync-queue.tooltip.country": "País", + + // "person.page.orcid.sync-queue.tooltip.keywords": "Keyword", + "person.page.orcid.sync-queue.tooltip.keywords": "Palavra-chave", + + // "person.page.orcid.sync-queue.tooltip.external_ids": "External identifier", + "person.page.orcid.sync-queue.tooltip.external_ids": "Identificadores externos", + + // "person.page.orcid.sync-queue.tooltip.researcher_urls": "Researcher url", + "person.page.orcid.sync-queue.tooltip.researcher_urls": "URL do investigador", + + // "person.page.orcid.sync-queue.send" : "Synchronize with ORCID registry", + "person.page.orcid.sync-queue.send" : "Sincronizar com o registo ORCID", + + // "person.page.orcid.sync-queue.send.unauthorized-error.title": "The submission to ORCID failed for missing authorizations.", + "person.page.orcid.sync-queue.send.unauthorized-error.title": "A submissão ao ORCID falhou por falta de autorizações.", + + // "person.page.orcid.sync-queue.send.unauthorized-error.content": "Click here to grant again the required permissions. If the problem persists, contact the administrator", + "person.page.orcid.sync-queue.send.unauthorized-error.content": "Clique aqui para conceder novamente as permissões necessárias. Se o problema persistir, por favor contacte o administrador", + + // "person.page.orcid.sync-queue.send.bad-request-error": "The submission to ORCID failed because the resource sent to ORCID registry is not valid", + "person.page.orcid.sync-queue.send.bad-request-error": "A submissão ao ORCID falhou porque o recurso enviado para o registo do ORCID não é válido", + + // "person.page.orcid.sync-queue.send.error": "The submission to ORCID failed", + "person.page.orcid.sync-queue.send.error": "A submissão ao ORCID falhou", + + // "person.page.orcid.sync-queue.send.conflict-error": "The submission to ORCID failed because the resource is already present on the ORCID registry", + "person.page.orcid.sync-queue.send.conflict-error": "A submissão ao ORCID falhou porque o recurso já existe no registo do ORCID", + + // "person.page.orcid.sync-queue.send.not-found-warning": "The resource does not exists anymore on the ORCID registry.", + "person.page.orcid.sync-queue.send.not-found-warning": "O recurso já não existe no registo do ORCID.", + + // "person.page.orcid.sync-queue.send.success": "The submission to ORCID was completed successfully", + "person.page.orcid.sync-queue.send.success": "A submissão ao ORCID foi concluída com sucesso", + + // "person.page.orcid.sync-queue.send.validation-error": "The data that you want to synchronize with ORCID is not valid", + "person.page.orcid.sync-queue.send.validation-error": "Os dados que pretende sincronizar com ORCID não são válidos", + + // "person.page.orcid.sync-queue.send.validation-error.amount-currency.required": "The amount's currency is required", + "person.page.orcid.sync-queue.send.validation-error.amount-currency.required": "O valor de financiamento é obrigatório", + + // "person.page.orcid.sync-queue.send.validation-error.external-id.required": "The resource to be sent requires at least one identifier", + "person.page.orcid.sync-queue.send.validation-error.external-id.required": "O recurso a ser enviado requer pelo menos um identificador", + + // "person.page.orcid.sync-queue.send.validation-error.title.required": "The title is required", + "person.page.orcid.sync-queue.send.validation-error.title.required": "O título é obrigatório", + + // "person.page.orcid.sync-queue.send.validation-error.type.required": "The dc.type is required", + "person.page.orcid.sync-queue.send.validation-error.type.required": "O 'dc.type' é obrigatório", + + // "person.page.orcid.sync-queue.send.validation-error.start-date.required": "The start date is required", + "person.page.orcid.sync-queue.send.validation-error.start-date.required": "A data de início é obrigatória", + + // "person.page.orcid.sync-queue.send.validation-error.funder.required": "The funder is required", + "person.page.orcid.sync-queue.send.validation-error.funder.required": "O financiador é obrigatório", + + // "person.page.orcid.sync-queue.send.validation-error.country.invalid": "Invalid 2 digits ISO 3166 country", + "person.page.orcid.sync-queue.send.validation-error.country.invalid": "País inválido (2 dígitos ISO 3166)", + + // "person.page.orcid.sync-queue.send.validation-error.organization.required": "The organization is required", + "person.page.orcid.sync-queue.send.validation-error.organization.required": "A organização é obrigatória", + + // "person.page.orcid.sync-queue.send.validation-error.organization.name-required": "The organization's name is required", + "person.page.orcid.sync-queue.send.validation-error.organization.name-required": "O nome da organização é obrigatório", + + // "person.page.orcid.sync-queue.send.validation-error.publication.date-invalid" : "The publication date must be one year after 1900", + "person.page.orcid.sync-queue.send.validation-error.publication.date-invalid" : "A data de publicação deve ser um ano após 1900", + + // "person.page.orcid.sync-queue.send.validation-error.organization.address-required": "The organization to be sent requires an address", + "person.page.orcid.sync-queue.send.validation-error.organization.address-required": "A organização a ser enviada requer um endereço", + + // "person.page.orcid.sync-queue.send.validation-error.organization.city-required": "The address of the organization to be sent requires a city", + "person.page.orcid.sync-queue.send.validation-error.organization.city-required": "O endereço da organização a enviar requer uma cidade", + + // "person.page.orcid.sync-queue.send.validation-error.organization.country-required": "The address of the organization to be sent requires a valid 2 digits ISO 3166 country", + "person.page.orcid.sync-queue.send.validation-error.organization.country-required": "O endereço da organização a enviar requer um país ISO 3166 válido de 2 dígitos", + + // "person.page.orcid.sync-queue.send.validation-error.disambiguated-organization.required": "An identifier to disambiguate organizations is required. Supported ids are GRID, Ringgold, Legal Entity identifiers (LEIs) and Crossref Funder Registry identifiers", + "person.page.orcid.sync-queue.send.validation-error.disambiguated-organization.required": "É necessário um identificador para desambiguar as organizações. Os identificadores suportados são os identificadores GRID, RINGGOLD, Legal Entity Identity (LEIs) e Crossref Funder Registry (CrossRef)", + + // "person.page.orcid.sync-queue.send.validation-error.disambiguated-organization.value-required": "The organization's identifiers requires a value", + "person.page.orcid.sync-queue.send.validation-error.disambiguated-organization.value-required": "Os identificadores da organização requerem um valor", + + // "person.page.orcid.sync-queue.send.validation-error.disambiguation-source.required": "The organization's identifiers requires a source", + "person.page.orcid.sync-queue.send.validation-error.disambiguation-source.required": "Os identificadores da organização requerem uma fonte", + + // "person.page.orcid.sync-queue.send.validation-error.disambiguation-source.invalid": "The source of one of the organization identifiers is invalid. Supported sources are RINGGOLD, GRID, LEI and FUNDREF", + "person.page.orcid.sync-queue.send.validation-error.disambiguation-source.invalid": "A fonte de um dos identificadores da organização é inválida. As fontes suportadas são RINGGOLD, GRID, LEI e FUNDREF", + + // "person.page.orcid.synchronization-mode": "Synchronization mode", + "person.page.orcid.synchronization-mode": "Modo sincronização", + + // "person.page.orcid.synchronization-mode.batch": "Batch", + "person.page.orcid.synchronization-mode.batch": "Lote", + + // "person.page.orcid.synchronization-mode.label": "Synchronization mode", + "person.page.orcid.synchronization-mode.label": "Modo sincronização", + + // "person.page.orcid.synchronization-mode-message": "Please select how you would like synchronization to ORCID to occur. The options include 'Manual' (you must send your data to ORCID manually), or 'Batch' (the system will send your data to ORCID via a scheduled script).", + "person.page.orcid.synchronization-mode-message": "Por favor, selecione a forma como deseja que a sincronização com ORCID ocorra. As opções incluem 'Manual' (deve enviar os seus dados para o ORCID manualmente), ou 'Batch' (o sistema enviará os seus dados para o ORCID através de um script agendado).", + + // "person.page.orcid.synchronization-mode-funding-message": "Select whether to send your linked Project entities to your ORCID record's list of funding information.", + "person.page.orcid.synchronization-mode-funding-message": "Selecione se pretende enviar as suas entidades ligadas de 'Projeto' para a lista de informação de financiamento do seu registo ORCID.", + + // "person.page.orcid.synchronization-mode-publication-message": "Select whether to send your linked Publication entities to your ORCID record's list of works.", + "person.page.orcid.synchronization-mode-publication-message": "Selecione se pretende enviar as suas entidades ligadas de 'Publicação' associadas à lista de obras do seu registo ORCID.", + + // "person.page.orcid.synchronization-mode-profile-message": "Select whether to send your biographical data or personal identifiers to your ORCID record.", + "person.page.orcid.synchronization-mode-profile-message": "Selecione se pretende enviar os seus dados biográficos ou identificadores pessoais para o seu registo ORCID.", + + // "person.page.orcid.synchronization-settings-update.success": "The synchronization settings have been updated successfully", + "person.page.orcid.synchronization-settings-update.success": "As definições de sincronização foram atualizadas com sucesso", + + // "person.page.orcid.synchronization-settings-update.error": "The update of the synchronization settings failed", + "person.page.orcid.synchronization-settings-update.error": "A atualização das definições de sincronização falhou", + + // "person.page.orcid.synchronization-mode.manual": "Manual", + "person.page.orcid.synchronization-mode.manual": "Manual", + + // "person.page.orcid.scope.authenticate": "Get your ORCID iD", + "person.page.orcid.scope.authenticate": "Obtenha o seu ORCID iD", + + // "person.page.orcid.scope.read-limited": "Read your information with visibility set to Trusted Parties", + "person.page.orcid.scope.read-limited": "Leia a sua informação com visibilidade definida para 'Trusted Parties'", + + // "person.page.orcid.scope.activities-update": "Add/update your research activities", + "person.page.orcid.scope.activities-update": "Acrescentar/actualizar as suas actividades de investigação", + + // "person.page.orcid.scope.person-update": "Add/update other information about you", + "person.page.orcid.scope.person-update": "Adicionar/actualizar outras informações sobre si", + + // "person.page.orcid.unlink.success": "The disconnection between the profile and the ORCID registry was successful", + "person.page.orcid.unlink.success": "A desconexão entre o perfil e o registo ORCID foi bem sucedida", + + // "person.page.orcid.unlink.error": "An error occurred while disconnecting between the profile and the ORCID registry. Try again", + "person.page.orcid.unlink.error": "Ocorreu um erro ao desligar o perfil e o registo ORCID. Tente novamente.", + + // "person.orcid.sync.setting": "ORCID Synchronization settings", + "person.orcid.sync.setting": "Definições de sincronização ORCID", + + // "person.orcid.registry.queue": "ORCID Registry Queue", + "person.orcid.registry.queue": "Fila de registo ORCID", + + // "person.orcid.registry.auth": "ORCID Authorizations", + "person.orcid.registry.auth": "Autorizações ORCID", + + // "home.recent-submissions.head": "Recent Submissions", + "home.recent-submissions.head": "Entradas recentes", + + // "listable-notification-object.default-message": "This object couldn't be retrieved", + "listable-notification-object.default-message": "Este objeto não pode ser recuperado", + + // "system-wide-alert-banner.retrieval.error": "Something went wrong retrieving the system-wide alert banner", + "system-wide-alert-banner.retrieval.error": "Algo correu mal ao recuperar o 'banner' de alerta em todo o sistema", + + // "system-wide-alert-banner.countdown.prefix": "In", + "system-wide-alert-banner.countdown.prefix": "Em", + + // "system-wide-alert-banner.countdown.days": "{{days}} day(s),", + "system-wide-alert-banner.countdown.days": "{{dias}} dia(s),", + + // "system-wide-alert-banner.countdown.hours": "{{hours}} hour(s) and", + "system-wide-alert-banner.countdown.hours": "{{hours}} hora(s) e", + + // "system-wide-alert-banner.countdown.minutes": "{{minutes}} minute(s):", + "system-wide-alert-banner.countdown.minutes": "{{minutos}} minuto(s):", + + // "menu.section.system-wide-alert": "System-wide Alert", + "menu.section.system-wide-alert": "Alertas gerais do sistema", + + // "system-wide-alert.form.header": "System-wide Alert", + "system-wide-alert.form.header": "Alertas gerais do sistema", + + // "system-wide-alert-form.retrieval.error": "Something went wrong retrieving the system-wide alert", + "system-wide-alert-form.retrieval.error": "Algo correu mal ao recuperar o alerta geral do sistema", + + // "system-wide-alert.form.cancel": "Cancel", + "system-wide-alert.form.cancel": "Cancelar", + + // "system-wide-alert.form.save": "Save", + "system-wide-alert.form.save": "Guardar", + + // "system-wide-alert.form.label.active": "ACTIVE", + "system-wide-alert.form.label.active": "ACTIVO", + + // "system-wide-alert.form.label.inactive": "INACTIVE", + "system-wide-alert.form.label.inactive": "INACTIVO", + + // "system-wide-alert.form.error.message": "The system wide alert must have a message", + "system-wide-alert.form.error.message": "O alerta geral do sistema deve conter uma mensagem", + + // "system-wide-alert.form.label.message": "Alert message", + "system-wide-alert.form.label.message": "Mensagem de alerta", + + // "system-wide-alert.form.label.countdownTo.enable": "Enable a countdown timer", + "system-wide-alert.form.label.countdownTo.enable": "Ativar um temporizador de contagem decrescente", + + // "system-wide-alert.form.label.countdownTo.hint": "Hint: Set a countdown timer. When enabled, a date can be set in the future and the system-wide alert banner will perform a countdown to the set date. When this timer ends, it will disappear from the alert. The server will NOT be automatically stopped.", + "system-wide-alert.form.label.countdownTo.hint": "Dica: Defina um temporizador de contagem decrescente. Quando ativado, pode ser definida uma data no futuro e o 'banner' de alerta geral do sistema irá realizar uma contagem decrescente para a data definida. Quando este temporizador terminar, desaparecerá do alerta. O servidor NÃO pára automaticamente.", + + // "system-wide-alert.form.label.preview": "system-wide alert preview", + "system-wide-alert.form.label.preview": "Pré-visualização de alerta geral do sistema", + + // "system-wide-alert.form.update.success": "The system-wide alert was successfully updated", + "system-wide-alert.form.update.success": "O alerta geral do sistema foi atualizado com sucesso", + + // "system-wide-alert.form.update.error": "Something went wrong when updating the system-wide alert", + "system-wide-alert.form.update.error": "Algo correu mal ao atualizar o alerta geral do sistema", + + // "system-wide-alert.form.create.success": "The system-wide alert was successfully created", + "system-wide-alert.form.create.success": "O alerta geral do sistema foi criado com sucesso", + + // "system-wide-alert.form.create.error": "Something went wrong when creating the system-wide alert", + "system-wide-alert.form.create.error": "Algo correu mal ao criar o alerta geral do sistema", + + // "admin.system-wide-alert.breadcrumbs": "System-wide Alerts", + "admin.system-wide-alert.breadcrumbs": "Alertas gerais do sistema", + + // "admin.system-wide-alert.title": "System-wide Alerts", + "admin.system-wide-alert.title": "Alertas gerais do sistema", + + + + // Other strings... + // Missing, Duplicate or Redundant ??? + + // NOT FOUND 30-05-2023 + + + // "datafile.listelement.badge": "Data file", + "datafile.listelement.badge": "Ficheiro de dados", + + // "datapackage.listelement.badge": "Data package", + "datapackage.listelement.badge": "Pacote de dados", + + // "browse.next.button": "Next", + "browse.next.button": "Próximo", + + // "browse.previous.button": "Previous", + "browse.previous.button": "Anterior", + + // "curation-task.task.registerdoi.label": "DOI check", + "curation-task.task.registerdoi.label": "Verificação de DOIs", + + // "mydspace.general.text-here": "here", + "mydspace.general.text-here": "aqui", + + // "mydspace.upload.upload-successful": "New workspace item created. Click {{here}} for edit it.", + "mydspace.upload.upload-successful": "Novo item de espaço de trabalho criado. Clique {{here}} para o editar.", + + // "profile.security.form.notifications.error.not-long-enough": "The password has to be at least 6 characters long.", + "profile.security.form.notifications.error.not-long-enough": "A senha deve ter pelo menos 6 caracteres.", + + // "register-page.create-profile.security.error.password-length": "The password should be at least 6 characters long.", + "register-page.create-profile.security.error.password-length": "A senha deve possuir pelo menos 6 caracteres.", + + // "search.form.search_mydspace": "Search MyDSpace", + "search.form.search_mydspace": "Pesquisar na Área Pessoal", + + // "forgot-password.form.error.password-length": "The password should be at least 6 characters long.", + "forgot-password.form.error.password-length": "A senha deve ter pelo menos 6 caracteres.", + + // "search.filters.entityType.Publication": "Publicação", + "search.filters.entityType.Publication": "Publicação", + + // "search.filters.entityType.Person": "Pessoa", + "search.filters.entityType.Person": "Pessoa", + + // "search.filters.entityType.Project": "Projecto", + "search.filters.entityType.Project": "Projeto", + + // "search.filters.entityType.Journal": "Revista", + "search.filters.entityType.Journal": "Revista", + + // "search.filters.entityType.DataFile": "Data File", + "search.filters.entityType.DataFile": "Ficheiro de dados", + + // "forgot-email.form.google-recaptcha.must-accept-cookies": "Must accept cookies", + "forgot-email.form.google-recaptcha.must-accept-cookies": "Deve aceitar cookies", + + // "forgot-email.form.google-recaptcha.open-cookie-settings": "Cookie settings", + "forgot-email.form.google-recaptcha.open-cookie-settings": "Configurar cookies", + + // "submission.sections.describe.relationship-lookup.external-source.import-modal.isProjectOfPublication.added.local-entity": "Successfully imported and added external project to the selection", + "submission.sections.describe.relationship-lookup.external-source.import-modal.isProjectOfPublication.added.local-entity": "Importado com sucesso e adicionado autor à seleção", + + // "search.filters.namedresourcetype.Archived": "Archived", + "search.filters.namedresourcetype.Archived": "Aceites", + + // "search.filters.namedresourcetype.Workspace": "Workspace", + "search.filters.namedresourcetype.Workspace": "Por terminar", + + // "search.filters.namedresourcetype.Workflow": "Workflow", + "search.filters.namedresourcetype.Workflow": "Em fluxo de trabalho", + + // "search.filters.namedresourcetype.Validation": "Validation", + "search.filters.namedresourcetype.Validation": "Em validação", + + // "orgunit.search.results.head": "Organizational Unit Search Results", + "orgunit.search.results.head": "Resultados da pesquisa de organizações", + + // "orgunit-relationships.search.results.head": "Organizational Unit Search Results", + "orgunit-relationships.search.results.head": "Resultados da pesquisa de organizações", + + // "journalissue.search.results.head": "Journal Issue Search Results", + "journalissue.search.results.head": "Resultados da pesquisa de números", + + // "journalissue-relationships.search.results.head": "Journal Issue Search Results", + "journalissue-relationships.search.results.head": "Resultados da pesquisa de números", } From 244608aa5c9e17938bf2fa43d03d5a1a0c5211b0 Mon Sep 17 00:00:00 2001 From: Art Lowel Date: Wed, 31 May 2023 12:11:15 +0200 Subject: [PATCH 300/409] fix issue where a colon in a uuid would get misinterpreted as a route param --- src/app/shared/menu/menu.service.spec.ts | 37 ++++++++++++++++++++++++ src/app/shared/menu/menu.service.ts | 20 +++++-------- 2 files changed, 44 insertions(+), 13 deletions(-) diff --git a/src/app/shared/menu/menu.service.spec.ts b/src/app/shared/menu/menu.service.spec.ts index f4b0fe3db8..0d8d669a0a 100644 --- a/src/app/shared/menu/menu.service.spec.ts +++ b/src/app/shared/menu/menu.service.spec.ts @@ -567,4 +567,41 @@ describe('MenuService', () => { }); }); + describe(`resolveSubstitutions`, () => { + let linkPrefix; + let link; + let uuid; + + beforeEach(() => { + linkPrefix = 'statistics_collection_'; + link = `${linkPrefix}:id`; + uuid = 'f7cc3ca4-3c2c-464d-8af8-add9f84f711c'; + }); + + it(`shouldn't do anything when there are no params`, () => { + let result = (service as any).resolveSubstitutions(link, undefined); + expect(result).toEqual(link); + result = (service as any).resolveSubstitutions(link, null); + expect(result).toEqual(link); + result = (service as any).resolveSubstitutions(link, {}); + expect(result).toEqual(link); + }); + + it(`should replace link params that are also route params`, () => { + const result = (service as any).resolveSubstitutions(link,{ 'id': uuid }); + expect(result).toEqual(linkPrefix + uuid); + }); + + it(`should not replace link params that aren't route params`, () => { + const result = (service as any).resolveSubstitutions(link,{ 'something': 'else' }); + expect(result).toEqual(link); + }); + + it(`should gracefully deal with routes that contain the name of the route param`, () => { + const selfReferentialParam = `:id:something`; + const result = (service as any).resolveSubstitutions(link,{ 'id': selfReferentialParam }); + expect(result).toEqual(linkPrefix + selfReferentialParam); + }); + }); + }); diff --git a/src/app/shared/menu/menu.service.ts b/src/app/shared/menu/menu.service.ts index 2253e9ce09..fac3b3fba7 100644 --- a/src/app/shared/menu/menu.service.ts +++ b/src/app/shared/menu/menu.service.ts @@ -17,7 +17,7 @@ import { ToggleActiveMenuSectionAction, ToggleMenuAction, } from './menu.actions'; -import { hasNoValue, hasValue, hasValueOperator, isNotEmpty } from '../empty.util'; +import { hasNoValue, hasValue, hasValueOperator, isNotEmpty, isEmpty } from '../empty.util'; import { MenuState } from './menu-state.model'; import { MenuSections } from './menu-sections.model'; import { MenuSection } from './menu-section.model'; @@ -409,20 +409,14 @@ export class MenuService { } protected resolveSubstitutions(object, params) { - let resolved; - if (typeof object === 'string') { + if (isEmpty(params)) { resolved = object; - let match: RegExpMatchArray; - do { - match = resolved.match(/:(\w+)/); - if (match) { - const substitute = params[match[1]]; - if (hasValue(substitute)) { - resolved = resolved.replace(match[0], `${substitute}`); - } - } - } while (match); + } else if (typeof object === 'string') { + resolved = object; + Object.entries(params).forEach(([key, value]: [string, string]) => + resolved = resolved.replaceAll(`:${key}`, value) + ); } else if (Array.isArray(object)) { resolved = []; object.forEach((entry, index) => { From 6483eb2c304346258f3ea797bb3826556a56ffa4 Mon Sep 17 00:00:00 2001 From: Alan Orth Date: Wed, 31 May 2023 12:51:49 +0300 Subject: [PATCH 301/409] Remove scripts/webpack.js This is no longer used. Fixes: https://github.com/DSpace/dspace-angular/issues/2285 --- README.md | 3 +-- scripts/webpack.js | 13 ------------- 2 files changed, 1 insertion(+), 15 deletions(-) delete mode 100644 scripts/webpack.js diff --git a/README.md b/README.md index c90dc1d08f..689c64a292 100644 --- a/README.md +++ b/README.md @@ -413,8 +413,7 @@ dspace-angular │ ├── merge-i18n-files.ts * │ ├── serve.ts * │ ├── sync-i18n-files.ts * -│ ├── test-rest.ts * -│ └── webpack.js * +│ └── test-rest.ts * ├── src * The source of the application │ ├── app * The source code of the application, subdivided by module/page. │ ├── assets * Folder for static resources diff --git a/scripts/webpack.js b/scripts/webpack.js deleted file mode 100644 index 93f17b4619..0000000000 --- a/scripts/webpack.js +++ /dev/null @@ -1,13 +0,0 @@ -const path = require('path'); -const child_process = require('child_process'); - -const heapSize = 4096; -const webpackPath = path.join('node_modules', 'webpack', 'bin', 'webpack.js'); - -const params = [ - '--max_old_space_size=' + heapSize, - webpackPath, - ...process.argv.slice(2) -]; - -child_process.spawn('node', params, { stdio:'inherit' }); From bbfb8bec01239e2939a13cd9b9a1b91dbc42f76a Mon Sep 17 00:00:00 2001 From: rsaraivac <122451983+rsaraivac@users.noreply.github.com> Date: Wed, 31 May 2023 18:34:59 +0100 Subject: [PATCH 302/409] Update pt-PT.json5 --- src/assets/i18n/pt-PT.json5 | 229 ++++++++++++++++++------------------ 1 file changed, 114 insertions(+), 115 deletions(-) diff --git a/src/assets/i18n/pt-PT.json5 b/src/assets/i18n/pt-PT.json5 index 761da582b6..9b37fce1c7 100644 --- a/src/assets/i18n/pt-PT.json5 +++ b/src/assets/i18n/pt-PT.json5 @@ -1,26 +1,25 @@ { - // Dspace v7.5 > i18n pt-PT > reviewed 30-05-2023 - - + // Dspace v7.5 > i18n pt-PT > reviewed 30-05-2023 + // "401.help": "You're not authorized to access this page. You can use the button below to get back to the home page.", "401.help": "Não está autorizado a aceder a esta página. Pode utilizar o botão em baixo para voltar à página de início.", // "401.link.home-page": "Take me to the home page", "401.link.home-page": "Voltar à página de início", - + // "401.unauthorized": "unauthorized", "401.unauthorized": "Não autorizado", - + // "403.help": "You don't have permission to access this page. You can use the button below to get back to the home page.", "403.help": "Não possui permissões para aceder a esta página. Pode utilizar o botão em baixo para voltar à página de início.", - + // "403.link.home-page": "Take me to the home page", "403.link.home-page": "Voltar à página de início", - + // "403.forbidden": "forbidden", "403.forbidden": "Proibido", - + // "500.page-internal-server-error": "Service Unavailable", "500.page-internal-server-error": "Serviço indisponível", @@ -29,16 +28,16 @@ // "500.link.home-page": "Take me to the home page", "500.link.home-page": "Voltar à página de início", - + // "404.help": "We can't find the page you're looking for. The page may have been moved or deleted. You can use the button below to get back to the home page. ", "404.help": "Não encontramos a página que procura. A página pode ter sido movida ou eliminada. Pode utilizar o botão em baixo para voltar à página de início. ", - + // "404.link.home-page": "Take me to the home page", "404.link.home-page": "Voltar à página de início", // "404.page-not-found": "page not found", "404.page-not-found": "página não encontrada", - + // "error-page.description.401": "unauthorized", "error-page.description.401": "Não autorizado", @@ -46,10 +45,10 @@ "error-page.description.403": "Proibido", // "error-page.description.500": "Service Unavailable", - "error-page.description.500": "Serviço indisponível", - + "error-page.description.500": "Serviço indisponível", + // "error-page.description.404": "page not found", - "error-page.description.404": "página não encontrada", + "error-page.description.404": "página não encontrada", // "error-page.orcid.generic-error": "An error occurred during login via ORCID. Make sure you have shared your ORCID account email address with DSpace. If the error persists, contact the administrator", "error-page.orcid.generic-error": "Ocorreu um erro com a sua autenticação via ORCID. Certifique-se que partilhou o seu endereço de email associado à sua conta ORCID com o repositório. Se o erro persistir, por favor contacte o administrador do sistema.", @@ -58,8 +57,8 @@ "access-status.embargo.listelement.badge": "Embargado", // "access-status.metadata.only.listelement.badge": "Metadata only", - "access-status.metadata.only.listelement.badge": "Apenas Metadados", - + "access-status.metadata.only.listelement.badge": "Apenas Metadados", + // "access-status.open.access.listelement.badge": "Open Access", "access-status.open.access.listelement.badge": "Acesso Aberto", @@ -68,16 +67,16 @@ // "access-status.unknown.listelement.badge": "Unknown", "access-status.unknown.listelement.badge": "Desconhecido", - + // "admin.curation-tasks.breadcrumbs": "System curation tasks", "admin.curation-tasks.breadcrumbs": "Tarefas de curadoria", // "admin.curation-tasks.title": "System curation tasks", "admin.curation-tasks.title": "Tarefas de curadoria", - + // "admin.curation-tasks.header": "System curation tasks", "admin.curation-tasks.header": "Tarefas de curadoria", - + // "admin.registries.bitstream-formats.breadcrumbs": "Format registry", "admin.registries.bitstream-formats.breadcrumbs": "Registo de formatos", @@ -89,31 +88,31 @@ // "admin.registries.bitstream-formats.create.failure.head": "Failure", "admin.registries.bitstream-formats.create.failure.head": "Falha", - + // "admin.registries.bitstream-formats.create.head": "Create Bitstream format", "admin.registries.bitstream-formats.create.head": "Criar formato de ficheiro", // "admin.registries.bitstream-formats.create.new": "Add a new bitstream format", "admin.registries.bitstream-formats.create.new": "Adicionar um novo formato de ficheiro", - + // "admin.registries.bitstream-formats.create.success.content": "The new bitstream format was successfully created.", "admin.registries.bitstream-formats.create.success.content": "O novo formato de ficheiro foi criado com sucesso.", - + // "admin.registries.bitstream-formats.create.success.head": "Success", "admin.registries.bitstream-formats.create.success.head": "Sucesso", - + // "admin.registries.bitstream-formats.delete.failure.amount": "Failed to remove {{ amount }} format(s)", "admin.registries.bitstream-formats.delete.failure.amount": "Falha ao remover {{ amount }} formato(s)", - + // "admin.registries.bitstream-formats.delete.failure.head": "Failure", "admin.registries.bitstream-formats.delete.failure.head": "Falha", - + // "admin.registries.bitstream-formats.delete.success.amount": "Successfully removed {{ amount }} format(s)", "admin.registries.bitstream-formats.delete.success.amount": "Removeu {{ amount }} formato(s) com sucesso", - + // "admin.registries.bitstream-formats.delete.success.head": "Success", "admin.registries.bitstream-formats.delete.success.head": "Sucesso", - + // "admin.registries.bitstream-formats.description": "This list of bitstream formats provides information about known formats and their support level.", "admin.registries.bitstream-formats.description": "Esta lista de formatos de ficheiro apresenta informações sobre formatos conhecidos e os seus níveis de suporte.", @@ -122,76 +121,76 @@ // "admin.registries.bitstream-formats.edit.description.hint": "", "admin.registries.bitstream-formats.edit.description.hint": "", - + // "admin.registries.bitstream-formats.edit.description.label": "Description", "admin.registries.bitstream-formats.edit.description.label": "Descrição", - + // "admin.registries.bitstream-formats.edit.extensions.hint": "Extensions are file extensions that are used to automatically identify the format of uploaded files. You can enter several extensions for each format.", "admin.registries.bitstream-formats.edit.extensions.hint": "Extensões são extensões de ficheiro que são usadas para identificar automaticamente o formato dos ficheiros enviados. Pode informar várias extensões para cada formato.", - + // "admin.registries.bitstream-formats.edit.extensions.label": "File extensions", "admin.registries.bitstream-formats.edit.extensions.label": "Extensões de ficheiro", - + // "admin.registries.bitstream-formats.edit.extensions.placeholder": "Enter a file extension without the dot", "admin.registries.bitstream-formats.edit.extensions.placeholder": "Indique uma extenção de ficheiro sem o ponto", - + // "admin.registries.bitstream-formats.edit.failure.content": "An error occurred while editing the bitstream format.", "admin.registries.bitstream-formats.edit.failure.content": "Ocorreu um erro ao editar o formato de bitstream.", - + // "admin.registries.bitstream-formats.edit.failure.head": "Failure", "admin.registries.bitstream-formats.edit.failure.head": "Falha", - + // "admin.registries.bitstream-formats.edit.head": "Bitstream format: {{ format }}", "admin.registries.bitstream-formats.edit.head": "Formato de bitstream: {{ format }}", - + // "admin.registries.bitstream-formats.edit.internal.hint": "Formats marked as internal are hidden from the user, and used for administrative purposes.", "admin.registries.bitstream-formats.edit.internal.hint": "Formatos marcados como internos são ocultos para o utilizador, usados por motivos administrativos.", // "admin.registries.bitstream-formats.edit.internal.label": "Internal", "admin.registries.bitstream-formats.edit.internal.label": "Interno", - + // "admin.registries.bitstream-formats.edit.mimetype.hint": "The MIME type associated with this format, does not have to be unique.", "admin.registries.bitstream-formats.edit.mimetype.hint": "O MIME type associado a este formato não tem que ser único.", - + // "admin.registries.bitstream-formats.edit.mimetype.label": "MIME Type", "admin.registries.bitstream-formats.edit.mimetype.label": "MIME Type", - + // "admin.registries.bitstream-formats.edit.shortDescription.hint": "A unique name for this format, (e.g. Microsoft Word XP or Microsoft Word 2000)", "admin.registries.bitstream-formats.edit.shortDescription.hint": "Um nome único para este formato (exemplo. Microsoft Word XP ou Microsoft Word 2000)", - + // "admin.registries.bitstream-formats.edit.shortDescription.label": "Name", "admin.registries.bitstream-formats.edit.shortDescription.label": "Nome", - + // "admin.registries.bitstream-formats.edit.success.content": "The bitstream format was successfully edited.", "admin.registries.bitstream-formats.edit.success.content": "O formato de bitstream foi editado com sucesso.", - + // "admin.registries.bitstream-formats.edit.success.head": "Success", "admin.registries.bitstream-formats.edit.success.head": "Sucesso", - + // "admin.registries.bitstream-formats.edit.supportLevel.hint": "The level of support your institution pledges for this format.", "admin.registries.bitstream-formats.edit.supportLevel.hint": "O nível de suporte que a sua instituição promete para este formato.", - + // "admin.registries.bitstream-formats.edit.supportLevel.label": "Support level", "admin.registries.bitstream-formats.edit.supportLevel.label": "Nível de suporte", - + // "admin.registries.bitstream-formats.head": "Bitstream Format Registry", "admin.registries.bitstream-formats.head": "Registo de formatos de ficheiros", // "admin.registries.bitstream-formats.no-items": "No bitstream formats to show.", "admin.registries.bitstream-formats.no-items": "Nenhum formato de bitstream para exibir.", - + // "admin.registries.bitstream-formats.table.delete": "Delete selected", "admin.registries.bitstream-formats.table.delete": "Apagar selecionado(s)", - + // "admin.registries.bitstream-formats.table.deselect-all": "Deselect all", "admin.registries.bitstream-formats.table.deselect-all": "Desselecionar todos", - + // "admin.registries.bitstream-formats.table.internal": "internal", "admin.registries.bitstream-formats.table.internal": "Interno", - + // "admin.registries.bitstream-formats.table.mimetype": "MIME Type", "admin.registries.bitstream-formats.table.mimetype": "MIME Type", - + // "admin.registries.bitstream-formats.table.name": "Name", "admin.registries.bitstream-formats.table.name": "Nome", @@ -200,76 +199,76 @@ // "admin.registries.bitstream-formats.table.return": "Back", "admin.registries.bitstream-formats.table.return": "Voltar", - + // "admin.registries.bitstream-formats.table.supportLevel.KNOWN": "Known", "admin.registries.bitstream-formats.table.supportLevel.KNOWN": "Conhecido", - + // "admin.registries.bitstream-formats.table.supportLevel.SUPPORTED": "Supported", "admin.registries.bitstream-formats.table.supportLevel.SUPPORTED": "Suportado", - + // "admin.registries.bitstream-formats.table.supportLevel.UNKNOWN": "Unknown", "admin.registries.bitstream-formats.table.supportLevel.UNKNOWN": "Desconhecido", - + // "admin.registries.bitstream-formats.table.supportLevel.head": "Support Level", "admin.registries.bitstream-formats.table.supportLevel.head": "Nível de suporte", // "admin.registries.bitstream-formats.title": "Bitstream Format Registry", "admin.registries.bitstream-formats.title": "Registo de formatos de ficheiro", - + // "admin.registries.metadata.breadcrumbs": "Metadata registry", "admin.registries.metadata.breadcrumbs": "Registo de metadados", // "admin.registries.metadata.description": "The metadata registry maintains a list of all metadata fields available in the repository. These fields may be divided amongst multiple schemas. However, DSpace requires the qualified Dublin Core schema.", "admin.registries.metadata.description": "O registo de metadados mantém a lista de todos os campos de metadados disponíveis no repositório. Estes campos podem ser divididos em multiplos esquemas. No entanto, o DSpace requer esquemas de Dublin Core qualificados.", - + // "admin.registries.metadata.form.create": "Create metadata schema", "admin.registries.metadata.form.create": "Criar esquema de metadados", // "admin.registries.metadata.form.edit": "Edit metadata schema", "admin.registries.metadata.form.edit": "Editar esquema de metadados", - + // "admin.registries.metadata.form.name": "Name", "admin.registries.metadata.form.name": "Nome", - + // "admin.registries.metadata.form.namespace": "Namespace", "admin.registries.metadata.form.namespace": "Namespace", - + // "admin.registries.metadata.head": "Metadata Registry", "admin.registries.metadata.head": "Registo de metadados", - + // "admin.registries.metadata.schemas.no-items": "No metadata schemas to show.", "admin.registries.metadata.schemas.no-items": "Nenhum esquema de metadados para mostrar.", - + // "admin.registries.metadata.schemas.table.delete": "Delete selected", "admin.registries.metadata.schemas.table.delete": "Apagar selecionado(s)", - + // "admin.registries.metadata.schemas.table.id": "ID", "admin.registries.metadata.schemas.table.id": "ID", - + // "admin.registries.metadata.schemas.table.name": "Name", "admin.registries.metadata.schemas.table.name": "Nome", - + // "admin.registries.metadata.schemas.table.namespace": "Namespace", "admin.registries.metadata.schemas.table.namespace": "Namespace", // "admin.registries.metadata.title": "Metadata Registry", "admin.registries.metadata.title": "Registo de metadados", - + // "admin.registries.schema.breadcrumbs": "Metadata schema", "admin.registries.schema.breadcrumbs": "Esquema de metadados", - + // "admin.registries.schema.description": "This is the metadata schema for \"{{namespace}}\".", "admin.registries.schema.description": "Este é o esquema de metadados para \"{{namespace}}\".", - + // "admin.registries.schema.fields.head": "Schema metadata fields", "admin.registries.schema.fields.head": "Campos do esquema de metadados", // "admin.registries.schema.fields.no-items": "No metadata fields to show.", "admin.registries.schema.fields.no-items": "Nenhum campo de metadado para exibir.", - + // "admin.registries.schema.fields.table.delete": "Delete selected", "admin.registries.schema.fields.table.delete": "Apagar selecionado(s)", - + // "admin.registries.schema.fields.table.field": "Field", "admin.registries.schema.fields.table.field": "Campo", @@ -278,7 +277,7 @@ // "admin.registries.schema.fields.table.scopenote": "Scope Note", "admin.registries.schema.fields.table.scopenote": "Descrição", - + // "admin.registries.schema.form.create": "Create metadata field", "admin.registries.schema.form.create": "Criar elemento de metadados", @@ -287,10 +286,10 @@ // "admin.registries.schema.form.element": "Element", "admin.registries.schema.form.element": "Elemento", - + // "admin.registries.schema.form.qualifier": "Qualifier", "admin.registries.schema.form.qualifier": "Qualificador", - + // "admin.registries.schema.form.scopenote": "Scope Note", "admin.registries.schema.form.scopenote": "Nota de âmbito", @@ -299,28 +298,28 @@ // "admin.registries.schema.notification.created": "Successfully created metadata schema \"{{prefix}}\"", "admin.registries.schema.notification.created": "Criou o esquema de metadados \"{{prefix}}\" com sucesso", - + // "admin.registries.schema.notification.deleted.failure": "Failed to delete {{amount}} metadata schemas", "admin.registries.schema.notification.deleted.failure": "Falhou ao apagar {{amount}} esquema(s) de metadados", - + // "admin.registries.schema.notification.deleted.success": "Successfully deleted {{amount}} metadata schemas", "admin.registries.schema.notification.deleted.success": "Apagou {{amount}} esquema(s) de metadados com sucesso", - + // "admin.registries.schema.notification.edited": "Successfully edited metadata schema \"{{prefix}}\"", "admin.registries.schema.notification.edited": "Editou o esquema de metadados \"{{prefix}}\" com sucesso", - + // "admin.registries.schema.notification.failure": "Error", "admin.registries.schema.notification.failure": "Erro", - + // "admin.registries.schema.notification.field.created": "Successfully created metadata field \"{{field}}\"", "admin.registries.schema.notification.field.created": "Criou o campo de metadado \"{{field}}\" com sucesso", - + // "admin.registries.schema.notification.field.deleted.failure": "Failed to delete {{amount}} metadata fields", "admin.registries.schema.notification.field.deleted.failure": "Falhou ao apagar {{amount}} campo(s) de metadados", - + // "admin.registries.schema.notification.field.deleted.success": "Successfully deleted {{amount}} metadata fields", "admin.registries.schema.notification.field.deleted.success": "Apagou {{amount}} campo(s) de metadados com sucesso", - + // "admin.registries.schema.notification.field.edited": "Successfully edited metadata field \"{{field}}\"", "admin.registries.schema.notification.field.edited": "Editou o campo de metadado \"{{field}}\" com sucesso", @@ -338,16 +337,16 @@ // "admin.access-control.epeople.actions.impersonate": "Impersonate EPerson", "admin.access-control.epeople.actions.impersonate": "Assumir o papel do Utilizador", - + // "admin.access-control.epeople.actions.reset": "Reset password", - "admin.access-control.epeople.actions.reset": "Redefinir password", + "admin.access-control.epeople.actions.reset": "Redefinir password", // "admin.access-control.epeople.actions.stop-impersonating": "Stop impersonating EPerson", "admin.access-control.epeople.actions.stop-impersonating": "Deixar de assumir o papel do utilizador", // "admin.access-control.epeople.breadcrumbs": "EPeople", "admin.access-control.epeople.breadcrumbs": "Utilizadores", - + // "admin.access-control.epeople.title": "EPeople", "admin.access-control.epeople.title": "Utilizadores", @@ -356,46 +355,46 @@ // "admin.access-control.epeople.search.head": "Search", "admin.access-control.epeople.search.head": "Pesquisar", - + // "admin.access-control.epeople.button.see-all": "Browse All", "admin.access-control.epeople.button.see-all": "Pesquisar tudo", // "admin.access-control.epeople.search.scope.metadata": "Metadata", "admin.access-control.epeople.search.scope.metadata": "Metadados", - + // "admin.access-control.epeople.search.scope.email": "E-mail (exact)", "admin.access-control.epeople.search.scope.email": "Email (exato)", - + // "admin.access-control.epeople.search.button": "Search", "admin.access-control.epeople.search.button": "Pesquisar", // "admin.access-control.epeople.search.placeholder": "Search people...", "admin.access-control.epeople.search.placeholder": "Pesquisar utilizadores...", - + // "admin.access-control.epeople.button.add": "Add EPerson", "admin.access-control.epeople.button.add": "Adicionar utilizador", // "admin.access-control.epeople.table.id": "ID", - "admin.access-control.epeople.table.id": "ID", - + "admin.access-control.epeople.table.id": "ID", + // "admin.access-control.epeople.table.name": "Name", "admin.access-control.epeople.table.name": "Nome", - + // "admin.access-control.epeople.table.email": "E-mail (exact)", "admin.access-control.epeople.table.email": "Email (exato)", - + // "admin.access-control.epeople.table.edit": "Edit", "admin.access-control.epeople.table.edit": "Editar", - + // "admin.access-control.epeople.table.edit.buttons.edit": "Edit \"{{name}}\"", "admin.access-control.epeople.table.edit.buttons.edit": "Editar \"{{name}}\"", // "admin.access-control.epeople.table.edit.buttons.edit-disabled": "You are not authorized to edit this group", "admin.access-control.epeople.table.edit.buttons.edit-disabled": "Não possui autorização para editar este grupo", - + // "admin.access-control.epeople.table.edit.buttons.remove": "Delete \"{{name}}\"", "admin.access-control.epeople.table.edit.buttons.remove": "Apagar \"{{name}}\"", - + // "admin.access-control.epeople.no-items": "No EPeople to show.", "admin.access-control.epeople.no-items": "Sem utilizadores para mostrar.", @@ -407,43 +406,43 @@ // "admin.access-control.epeople.form.firstName": "First name", "admin.access-control.epeople.form.firstName": "Nome", - + // "admin.access-control.epeople.form.lastName": "Last name", "admin.access-control.epeople.form.lastName": "Apelido", - + // "admin.access-control.epeople.form.email": "E-mail", "admin.access-control.epeople.form.email": "Email", - + // "admin.access-control.epeople.form.emailHint": "Must be valid e-mail address", "admin.access-control.epeople.form.emailHint": "Deve conter um email válido", - + // "admin.access-control.epeople.form.canLogIn": "Can log in", "admin.access-control.epeople.form.canLogIn": "Pode iniciar sessão", - + // "admin.access-control.epeople.form.requireCertificate": "Requires certificate", "admin.access-control.epeople.form.requireCertificate": "Requer certificado", - + // "admin.access-control.epeople.form.return": "Back", "admin.access-control.epeople.form.return": "Voltar", // "admin.access-control.epeople.form.notification.created.success": "Successfully created EPerson \"{{name}}\"", "admin.access-control.epeople.form.notification.created.success": "Utilizador criado com sucesso \"{{name}}\"", - + // "admin.access-control.epeople.form.notification.created.failure": "Failed to create EPerson \"{{name}}\"", "admin.access-control.epeople.form.notification.created.failure": "Falha ao criar o Utilizador \"{{name}}\"", - + // "admin.access-control.epeople.form.notification.created.failure.emailInUse": "Failed to create EPerson \"{{name}}\", email \"{{email}}\" already in use.", "admin.access-control.epeople.form.notification.created.failure.emailInUse": "Falha ao criar o Utilizador \"{{name}}\", o email \"{{email}}\" já está registado no repositório.", - + // "admin.access-control.epeople.form.notification.edited.failure.emailInUse": "Failed to edit EPerson \"{{name}}\", email \"{{email}}\" already in use.", "admin.access-control.epeople.form.notification.edited.failure.emailInUse": "Falha ao editar o Utilizador \"{{name}}\", o email \"{{email}}\" já está registado no repositório.", - + // "admin.access-control.epeople.form.notification.edited.success": "Successfully edited EPerson \"{{name}}\"", "admin.access-control.epeople.form.notification.edited.success": "Utilizador editado com successo \"{{name}}\"", - + // "admin.access-control.epeople.form.notification.edited.failure": "Failed to edit EPerson \"{{name}}\"", "admin.access-control.epeople.form.notification.edited.failure": "Falha ao editor Utilizador \"{{name}}\"", - + // "admin.access-control.epeople.form.notification.deleted.success": "Successfully deleted EPerson \"{{name}}\"", "admin.access-control.epeople.form.notification.deleted.success": "Utilizador removido com sucesso \"{{name}}\"", @@ -452,13 +451,13 @@ // "admin.access-control.epeople.form.groupsEPersonIsMemberOf": "Member of these groups:", "admin.access-control.epeople.form.groupsEPersonIsMemberOf": "Membro dos grupos:", - + // "admin.access-control.epeople.form.table.id": "ID", "admin.access-control.epeople.form.table.id": "ID", - + // "admin.access-control.epeople.form.table.name": "Name", "admin.access-control.epeople.form.table.name": "Nome", - + // "admin.access-control.epeople.form.table.collectionOrCommunity": "Collection/Community", "admin.access-control.epeople.form.table.collectionOrCommunity": "Coleção/Comunidade", @@ -467,7 +466,7 @@ // "admin.access-control.epeople.form.goToGroups": "Add to groups", "admin.access-control.epeople.form.goToGroups": "Adicionar a grupos", - + // "admin.access-control.epeople.notification.deleted.failure": "Failed to delete EPerson: \"{{name}}\"", "admin.access-control.epeople.notification.deleted.failure": "Falha ao apagar utilizador: \"{{name}}\"", @@ -481,8 +480,8 @@ "admin.access-control.groups.breadcrumbs": "Grupos", // "admin.access-control.groups.singleGroup.breadcrumbs": "Edit Group", - "admin.access-control.groups.singleGroup.breadcrumbs": "Editar grupo", - + "admin.access-control.groups.singleGroup.breadcrumbs": "Editar grupo", + // "admin.access-control.groups.title.singleGroup": "Edit Group", "admin.access-control.groups.title.singleGroup": "Editar grupo", @@ -491,13 +490,13 @@ // "admin.access-control.groups.addGroup.breadcrumbs": "New Group", "admin.access-control.groups.addGroup.breadcrumbs": "Novo grupo", - + // "admin.access-control.groups.head": "Groups", "admin.access-control.groups.head": "Grupos", - + // "admin.access-control.groups.button.add": "Add group", "admin.access-control.groups.button.add": "Adicionar grupo", - + // "admin.access-control.groups.search.head": "Search groups", "admin.access-control.groups.search.head": "Pesquisar grupos", @@ -7689,4 +7688,4 @@ "journalissue-relationships.search.results.head": "Resultados da pesquisa de números", -} \ No newline at end of file +} From d3d9a526fd093175e55047446c68ab50e9b50503 Mon Sep 17 00:00:00 2001 From: rsaraivac <122451983+rsaraivac@users.noreply.github.com> Date: Wed, 31 May 2023 19:29:57 +0100 Subject: [PATCH 303/409] Update pt-PT.json5 --- src/assets/i18n/pt-PT.json5 | 254 ++++++++++++++++++------------------ 1 file changed, 127 insertions(+), 127 deletions(-) diff --git a/src/assets/i18n/pt-PT.json5 b/src/assets/i18n/pt-PT.json5 index 9b37fce1c7..c7b677d597 100644 --- a/src/assets/i18n/pt-PT.json5 +++ b/src/assets/i18n/pt-PT.json5 @@ -194,8 +194,8 @@ // "admin.registries.bitstream-formats.table.name": "Name", "admin.registries.bitstream-formats.table.name": "Nome", - // "admin.registries.bitstream-formats.table.id" : "ID", - "admin.registries.bitstream-formats.table.id" : "ID", + // "admin.registries.bitstream-formats.table.id": "ID", + "admin.registries.bitstream-formats.table.id": "ID", // "admin.registries.bitstream-formats.table.return": "Back", "admin.registries.bitstream-formats.table.return": "Voltar", @@ -272,8 +272,8 @@ // "admin.registries.schema.fields.table.field": "Field", "admin.registries.schema.fields.table.field": "Campo", - // "admin.registries.schema.fields.table.id" : "ID", - "admin.registries.schema.fields.table.id" : "ID", + // "admin.registries.schema.fields.table.id": "ID", + "admin.registries.schema.fields.table.id": "ID", // "admin.registries.schema.fields.table.scopenote": "Scope Note", "admin.registries.schema.fields.table.scopenote": "Descrição", @@ -2195,8 +2195,8 @@ // "supervision-group-selector.notification.create.failure.title": "error", "supervision-group-selector.notification.create.failure.title": "erro", - // "supervision-group-selector.notification.create.already-existing" : "A supervision order already exists on this item for selected group", - "supervision-group-selector.notification.create.already-existing" : "Já existe uma ordem de supervisão sobre este item para grupo selecionado", + // "supervision-group-selector.notification.create.already-existing": "A supervision order already exists on this item for selected group", + "supervision-group-selector.notification.create.already-existing": "Já existe uma ordem de supervisão sobre este item para grupo selecionado", // "confirmation-modal.export-metadata.header": "Export metadata for {{ dsoName }}", "confirmation-modal.export-metadata.header": "Exportar metadados para {{ dsoName }}", @@ -2651,9 +2651,9 @@ // "home.title": "Home", "home.title": "Página inicial", - // "home.top-level-communities.head": "Communities in DSpace", + // "home.top-level-communities.head": "Communities in DSpace", "home.top-level-communities.head": "Comunidades", - + // "home.top-level-communities.help": "Select a community to browse its collections.", "home.top-level-communities.help": "Selecione uma comunidade para navegar nas suas coleções", @@ -2714,20 +2714,20 @@ // "info.feedback.email-label": "Your Email", "info.feedback.email-label": "O seu endereço de correio electrónico:", - // "info.feedback.create.success" : "Feedback Sent Successfully!", - "info.feedback.create.success" : "Mensagem enviada com sucesso!", + // "info.feedback.create.success": "Feedback Sent Successfully!", + "info.feedback.create.success": "Mensagem enviada com sucesso!", - // "info.feedback.error.email.required" : "A valid email address is required", - "info.feedback.error.email.required" : "Deve inserir um endereço de correio electrónico válido", + // "info.feedback.error.email.required": "A valid email address is required", + "info.feedback.error.email.required": "Deve inserir um endereço de correio electrónico válido", - // "info.feedback.error.message.required" : "A comment is required", - "info.feedback.error.message.required" : "Deve inserir uma mensagem", + // "info.feedback.error.message.required": "A comment is required", + "info.feedback.error.message.required": "Deve inserir uma mensagem", + + // "info.feedback.page-label": "Page", + "info.feedback.page-label": "Página/URL de contexo:", - // "info.feedback.page-label" : "Page", - "info.feedback.page-label" : "Página/URL de contexo:", - - // "info.feedback.page_help" : "The page related to your feedback", - "info.feedback.page_help" : "Esta é a página/URL que contextualiza o seu contacto.", + // "info.feedback.page_help": "The page related to your feedback", + "info.feedback.page_help": "Esta é a página/URL que contextualiza o seu contacto.", // "item.alerts.private": "This item is non-discoverable", "item.alerts.private": "Este item é privado", @@ -3533,11 +3533,11 @@ // "item.page.bitstreams.collapse": "Collapse", "item.page.bitstreams.collapse": "Fechar", - // "item.page.filesection.original.bundle" : "Original bundle", + // "item.page.filesection.original.bundle": "Original bundle", "item.page.filesection.original.bundle": "Principais", - // "item.page.filesection.license.bundle" : "License bundle", - "item.page.filesection.license.bundle" : "Licença", + // "item.page.filesection.license.bundle": "License bundle", + "item.page.filesection.license.bundle": "Licença", // "item.page.return": "Back", "item.page.return": "Voltar", @@ -3581,35 +3581,35 @@ // "item.preview.dc.type": "Type:", "item.preview.dc.type": "Tipo:", - // "item.preview.oaire.citation.issue" : "Issue", - "item.preview.oaire.citation.issue" : "Issue", + // "item.preview.oaire.citation.issue": "Issue", + "item.preview.oaire.citation.issue": "Issue", - // "item.preview.oaire.citation.volume" : "Volume", - "item.preview.oaire.citation.volume" : "Volume", + // "item.preview.oaire.citation.volume": "Volume", + "item.preview.oaire.citation.volume": "Volume", - // "item.preview.dc.relation.issn" : "ISSN", - "item.preview.dc.relation.issn" : "ISSN", + // "item.preview.dc.relation.issn": "ISSN", + "item.preview.dc.relation.issn": "ISSN", - // "item.preview.dc.relation.eissn" : "EISSN", - "item.preview.dc.relation.eissn" : "EISSN", + // "item.preview.dc.relation.eissn": "EISSN", + "item.preview.dc.relation.eissn": "EISSN", - // "item.preview.dc.identifier.isbn" : "ISBN", - "item.preview.dc.identifier.isbn" : "ISBN", + // "item.preview.dc.identifier.isbn": "ISBN", + "item.preview.dc.identifier.isbn": "ISBN", - // "item.preview.dc.identifier.eisbn" : "EISBN", - "item.preview.dc.identifier.eisbn" : "EISBN", + // "item.preview.dc.identifier.eisbn": "EISBN", + "item.preview.dc.identifier.eisbn": "EISBN", - // "item.preview.dc.identifier.tid" : "TID", - "item.preview.dc.identifier.tid" : "TID", + // "item.preview.dc.identifier.tid": "TID", + "item.preview.dc.identifier.tid": "TID", // "item.preview.dc.identifier": "Identifier:", "itemm.preview.dc.identifier": "Identificador:", - // "item.preview.dc.relation.ispartof" : "Journal or Serie", - "item.preview.dc.relation.ispartof" : "Revista ou Série", + // "item.preview.dc.relation.ispartof": "Journal or Serie", + "item.preview.dc.relation.ispartof": "Revista ou Série", - // "item.preview.dc.identifier.doi" : "DOI", - "item.preview.dc.identifier.doi" : "DOI", + // "item.preview.dc.identifier.doi": "DOI", + "item.preview.dc.identifier.doi": "DOI", // "item.preview.person.familyName": "Surname:", "item.preview.person.familyName": "Apelido:", @@ -4475,14 +4475,14 @@ // "nav.stop-impersonating": "Stop impersonating EPerson", "nav.stop-impersonating": "Deixar de assumir o papel do utilizador", - // "nav.subscriptions" : "Subscriptions", - "nav.subscriptions" : "Subscrições de alertas", + // "nav.subscriptions": "Subscriptions", + "nav.subscriptions": "Subscrições de alertas", - // "nav.toggle" : "Toggle navigation", - "nav.toggle" : "Alternar a navegação", + // "nav.toggle": "Toggle navigation", + "nav.toggle": "Alternar a navegação", - // "nav.user.description" : "User profile bar", - "nav.user.description" : "Barra do perfil de utilizador", + // "nav.user.description": "User profile bar", + "nav.user.description": "Barra do perfil de utilizador", // "none.listelement.badge": "Item", "none.listelement.badge": "Item", @@ -4634,16 +4634,16 @@ // "process.new.breadcrumbs": "Create a new process", "process.new.breadcrumbs": "Criar um novo processo", - // "process.detail.arguments" : "Arguments", + // "process.detail.arguments": "Arguments", "process.detail.arguments": "Argumentos", - // "process.detail.arguments.empty" : "This process doesn't contain any arguments", + // "process.detail.arguments.empty": "This process doesn't contain any arguments", "process.detail.arguments.empty": "Este processo não contém argumentos", - // "process.detail.back" : "Back", + // "process.detail.back": "Back", "process.detail.back": "Voltar", - // "process.detail.output" : "Process Output", + // "process.detail.output": "Process Output", "process.detail.output": "Output do Processo", // "process.detail.logs.button": "Retrieve process output", @@ -4655,29 +4655,29 @@ // "process.detail.logs.none": "This process has no output", "process.detail.logs.none": "Este processo não tem output", - // "process.detail.output-files" : "Output Files", + // "process.detail.output-files": "Output Files", "process.detail.output-files": "Ficheiros do Output", - // "process.detail.output-files.empty" : "This process doesn't contain any output files", + // "process.detail.output-files.empty": "This process doesn't contain any output files", "process.detail.output-files.empty": "Este processo não possui nenhum ficheiro de output", - // "process.detail.script" : "Script", + // "process.detail.script": "Script", "process.detail.script": "Script", - // "process.detail.title" : "Process: {{ id }} - {{ name }}", + // "process.detail.title": "Process: {{ id }} - {{ name }}", "process.detail.title": "Processo: {{ id }} - {{ name }}", - // "process.detail.start-time" : "Start time", + // "process.detail.start-time": "Start time", "process.detail.start-time": "Início", - // "process.detail.end-time" : "Finish time", + // "process.detail.end-time": "Finish time", "process.detail.end-time": "Fim", - // "process.detail.status" : "Status", + // "process.detail.status": "Status", "process.detail.status": "Estado", - // "process.detail.create" : "Create similar process", - "process.detail.create" : "Criar processo similar", + // "process.detail.create": "Create similar process", + "process.detail.create": "Criar processo similar", // "process.detail.actions": "Actions", "process.detail.actions": "Ações", @@ -4703,22 +4703,22 @@ // "process.detail.delete.error": "Something went wrong when deleting the process", "process.detail.delete.error": "Ocorreu algum erro ao remover o processo", - // "process.overview.table.finish" : "Finish time (UTC)", - "process.overview.table.finish" : "Hora de término (UTC)", + // "process.overview.table.finish": "Finish time (UTC)", + "process.overview.table.finish": "Hora de término (UTC)", - // "process.overview.table.id" : "Process ID", + // "process.overview.table.id": "Process ID", "process.overview.table.id": "ID do Processo", - // "process.overview.table.name" : "Name", - "process.overview.table.name" : "Nome", + // "process.overview.table.name": "Name", + "process.overview.table.name": "Nome", - // "process.overview.table.start" : "Start time (UTC)", - "process.overview.table.start" : "Hora de início (UTC)", + // "process.overview.table.start": "Start time (UTC)", + "process.overview.table.start": "Hora de início (UTC)", - // "process.overview.table.status" : "Status", + // "process.overview.table.status": "Status", "process.overview.table.status": "Estado", - // "process.overview.table.user" : "User", + // "process.overview.table.user": "User", "process.overview.table.user": "Utilizador", // "process.overview.title": "Processes Overview", @@ -5303,7 +5303,7 @@ // "search.title": "Search", "search.title": "Pesquisa", - // "search.breadcrumbs": "Search", + // "search.breadcrumbs": "Search", "search.breadcrumbs": "Pesquisar", // "search.search-form.placeholder": "Search the repository ...", @@ -5935,8 +5935,8 @@ // "submission.sections.describe.relationship-lookup.external-source.import-button-title.isAuthorOfPublication": "Import remote author", "submission.sections.describe.relationship-lookup.external-source.import-button-title.isAuthorOfPublication": "Importar autor remoto", - - // "submission.sections.describe.relationship-lookup.external-source.import-button-title.Journal": "Import remote journal", + + // "submission.sections.describe.relationship-lookup.external-source.import-button-title.Journal": "Import remote journal", "submission.sections.describe.relationship-lookup.external-source.import-button-title.Journal": "Importar revista remota", // "submission.sections.describe.relationship-lookup.external-source.import-button-title.Journal Issue": "Import remote journal issue", @@ -6484,9 +6484,9 @@ // "submission.sections.status.warnings.aria": "has warnings", "submission.sections.status.warnings.aria": "tem avisos", - + // "submission.sections.status.info.title": "Additional Information", - "submission.sections.status.info.title": "Informação adicional", + "submission.sections.status.info.title": "Informação adicional", // "submission.sections.status.info.aria": "Additional Information", "submission.sections.status.info.aria": "Informação adicional", @@ -6644,8 +6644,8 @@ // "submission.sections.license.required": "You must accept the license", "submission.sections.license.required": "A aceitação da licença constitui um requisito", - // "submission.sections.license.notgranted": "You must accept the license", - "submission.sections.license.notgranted": "Deve aceitar a licença", + // "submission.sections.license.notgranted": "You must accept the license", + "submission.sections.license.notgranted": "Deve aceitar a licença", // "submission.sections.sherpa.publication.information": "Publication information", "submission.sections.sherpa.publication.information": "Informação sobre a publicação", @@ -7157,8 +7157,8 @@ // "idle-modal.extend-session": "Extend session", "idle-modal.extend-session": "Prolongar sessão", - // "researcher.profile.action.processing" : "Processing...", - "researcher.profile.action.processing" : "A processar...", + // "researcher.profile.action.processing": "Processing...", + "researcher.profile.action.processing": "A processar...", // "researcher.profile.associated": "Researcher profile associated", "researcher.profile.associated": "Perfil do investigador associado", @@ -7190,11 +7190,11 @@ // "researcher.profile.view": "View", "researcher.profile.view": "Ver", - // "researcher.profile.private.visibility" : "PRIVATE", - "researcher.profile.private.visibility" : "PRIVADO", + // "researcher.profile.private.visibility": "PRIVATE", + "researcher.profile.private.visibility": "PRIVADO", - // "researcher.profile.public.visibility" : "PUBLIC", - "researcher.profile.public.visibility" : "PÚBLICO", + // "researcher.profile.public.visibility": "PUBLIC", + "researcher.profile.public.visibility": "PÚBLICO", // "researcher.profile.status": "Status:", "researcher.profile.status": "Estado:", @@ -7202,17 +7202,17 @@ // "researcherprofile.claim.not-authorized": "You are not authorized to claim this item. For more details contact the administrator(s).", "researcherprofile.claim.not-authorized": "Não possui autorização para reinvindicar este artigo. Para mais pormenores, contactar o(s) administrador(es).", - // "researcherprofile.error.claim.body" : "An error occurred while claiming the profile, please try again later", - "researcherprofile.error.claim.body" : "Ocorreu um erro ao reclamar o perfil, por favor tente novamente mais tarde", + // "researcherprofile.error.claim.body": "An error occurred while claiming the profile, please try again later", + "researcherprofile.error.claim.body": "Ocorreu um erro ao reclamar o perfil, por favor tente novamente mais tarde", - // "researcherprofile.error.claim.title" : "Error", - "researcherprofile.error.claim.title" : "Erro", + // "researcherprofile.error.claim.title": "Error", + "researcherprofile.error.claim.title": "Erro", - // "researcherprofile.success.claim.body" : "Profile claimed with success", - "researcherprofile.success.claim.body" : "Perfil reivindicado com sucesso", + // "researcherprofile.success.claim.body": "Profile claimed with success", + "researcherprofile.success.claim.body": "Perfil reivindicado com sucesso", - // "researcherprofile.success.claim.title" : "Success", - "researcherprofile.success.claim.title" : "Sucesso", + // "researcherprofile.success.claim.title": "Success", + "researcherprofile.success.claim.title": "Sucesso", // "person.page.orcid.create": "Create an ORCID iD", "person.page.orcid.create": "Criar um ORCID iD", @@ -7220,8 +7220,8 @@ // "person.page.orcid.granted-authorizations": "Granted authorizations", "person.page.orcid.granted-authorizations": "Autorizações concedidas", - // "person.page.orcid.grant-authorizations" : "Grant authorizations", - "person.page.orcid.grant-authorizations" : "Conceder autorizações", + // "person.page.orcid.grant-authorizations": "Grant authorizations", + "person.page.orcid.grant-authorizations": "Conceder autorizações", // "person.page.orcid.link": "Connect to ORCID iD", "person.page.orcid.link": "Ligar ao ORCID iD", @@ -7268,44 +7268,44 @@ // "person.page.orcid.save.preference.changes": "Update settings", "person.page.orcid.save.preference.changes": "Atualizar configurações", - // "person.page.orcid.sync-profile.affiliation" : "Affiliation", - "person.page.orcid.sync-profile.affiliation" : "Afiliação", + // "person.page.orcid.sync-profile.affiliation": "Affiliation", + "person.page.orcid.sync-profile.affiliation": "Afiliação", - // "person.page.orcid.sync-profile.biographical" : "Biographical data", - "person.page.orcid.sync-profile.biographical" : "Dados biográficos", + // "person.page.orcid.sync-profile.biographical": "Biographical data", + "person.page.orcid.sync-profile.biographical": "Dados biográficos", - // "person.page.orcid.sync-profile.education" : "Education", - "person.page.orcid.sync-profile.education" : "Educação", + // "person.page.orcid.sync-profile.education": "Education", + "person.page.orcid.sync-profile.education": "Educação", - // "person.page.orcid.sync-profile.identifiers" : "Identifiers", - "person.page.orcid.sync-profile.identifiers" : "Identificadores", + // "person.page.orcid.sync-profile.identifiers": "Identifiers", + "person.page.orcid.sync-profile.identifiers": "Identificadores", - // "person.page.orcid.sync-fundings.all" : "All fundings", - "person.page.orcid.sync-fundings.all" : "Todos financiamentos", + // "person.page.orcid.sync-fundings.all": "All fundings", + "person.page.orcid.sync-fundings.all": "Todos financiamentos", - // "person.page.orcid.sync-fundings.mine" : "My fundings", - "person.page.orcid.sync-fundings.mine" : "Meus financiamentos", + // "person.page.orcid.sync-fundings.mine": "My fundings", + "person.page.orcid.sync-fundings.mine": "Meus financiamentos", - // "person.page.orcid.sync-fundings.my_selected" : "Selected fundings", - "person.page.orcid.sync-fundings.my_selected" : "Financiamentos selecionados", + // "person.page.orcid.sync-fundings.my_selected": "Selected fundings", + "person.page.orcid.sync-fundings.my_selected": "Financiamentos selecionados", - // "person.page.orcid.sync-fundings.disabled" : "Disabled", - "person.page.orcid.sync-fundings.disabled" : "Desligado", + // "person.page.orcid.sync-fundings.disabled": "Disabled", + "person.page.orcid.sync-fundings.disabled": "Desligado", - // "person.page.orcid.sync-publications.all" : "All publications", - "person.page.orcid.sync-publications.all" : "Todas as publicações", + // "person.page.orcid.sync-publications.all": "All publications", + "person.page.orcid.sync-publications.all": "Todas as publicações", - // "person.page.orcid.sync-publications.mine" : "My publications", - "person.page.orcid.sync-publications.mine" : "As minhas publicações", + // "person.page.orcid.sync-publications.mine": "My publications", + "person.page.orcid.sync-publications.mine": "As minhas publicações", - // "person.page.orcid.sync-publications.my_selected" : "Selected publications", - "person.page.orcid.sync-publications.my_selected" : "Publicações selecionadas", + // "person.page.orcid.sync-publications.my_selected": "Selected publications", + "person.page.orcid.sync-publications.my_selected": "Publicações selecionadas", - // "person.page.orcid.sync-publications.disabled" : "Disabled", - "person.page.orcid.sync-publications.disabled" : "Desligado", + // "person.page.orcid.sync-publications.disabled": "Disabled", + "person.page.orcid.sync-publications.disabled": "Desligado", - // "person.page.orcid.sync-queue.discard" : "Discard the change and do not synchronize with the ORCID registry", - "person.page.orcid.sync-queue.discard" : "Cancelar a alteração e não sincronizar com o registo ORCID", + // "person.page.orcid.sync-queue.discard": "Discard the change and do not synchronize with the ORCID registry", + "person.page.orcid.sync-queue.discard": "Cancelar a alteração e não sincronizar com o registo ORCID", // "person.page.orcid.sync-queue.discard.error": "The discarding of the ORCID queue record failed", "person.page.orcid.sync-queue.discard.error": "A eliminação do registo da fila do ORCID falhou", @@ -7316,14 +7316,14 @@ // "person.page.orcid.sync-queue.empty-message": "The ORCID queue registry is empty", "person.page.orcid.sync-queue.empty-message": "O registo de filas do ORCID está vazio", - // "person.page.orcid.sync-queue.table.header.type" : "Type", - "person.page.orcid.sync-queue.table.header.type" : "Tipo", + // "person.page.orcid.sync-queue.table.header.type": "Type", + "person.page.orcid.sync-queue.table.header.type": "Tipo", - // "person.page.orcid.sync-queue.table.header.description" : "Description", - "person.page.orcid.sync-queue.table.header.description" : "Descrição", + // "person.page.orcid.sync-queue.table.header.description": "Description", + "person.page.orcid.sync-queue.table.header.description": "Descrição", - // "person.page.orcid.sync-queue.table.header.action" : "Action", - "person.page.orcid.sync-queue.table.header.action" : "Ação", + // "person.page.orcid.sync-queue.table.header.action": "Action", + "person.page.orcid.sync-queue.table.header.action": "Ação", // "person.page.orcid.sync-queue.description.affiliation": "Affiliations", "person.page.orcid.sync-queue.description.affiliation": "Afiliações", @@ -7388,8 +7388,8 @@ // "person.page.orcid.sync-queue.tooltip.researcher_urls": "Researcher url", "person.page.orcid.sync-queue.tooltip.researcher_urls": "URL do investigador", - // "person.page.orcid.sync-queue.send" : "Synchronize with ORCID registry", - "person.page.orcid.sync-queue.send" : "Sincronizar com o registo ORCID", + // "person.page.orcid.sync-queue.send": "Synchronize with ORCID registry", + "person.page.orcid.sync-queue.send": "Sincronizar com o registo ORCID", // "person.page.orcid.sync-queue.send.unauthorized-error.title": "The submission to ORCID failed for missing authorizations.", "person.page.orcid.sync-queue.send.unauthorized-error.title": "A submissão ao ORCID falhou por falta de autorizações.", @@ -7442,8 +7442,8 @@ // "person.page.orcid.sync-queue.send.validation-error.organization.name-required": "The organization's name is required", "person.page.orcid.sync-queue.send.validation-error.organization.name-required": "O nome da organização é obrigatório", - // "person.page.orcid.sync-queue.send.validation-error.publication.date-invalid" : "The publication date must be one year after 1900", - "person.page.orcid.sync-queue.send.validation-error.publication.date-invalid" : "A data de publicação deve ser um ano após 1900", + // "person.page.orcid.sync-queue.send.validation-error.publication.date-invalid": "The publication date must be one year after 1900", + "person.page.orcid.sync-queue.send.validation-error.publication.date-invalid": "A data de publicação deve ser um ano após 1900", // "person.page.orcid.sync-queue.send.validation-error.organization.address-required": "The organization to be sent requires an address", "person.page.orcid.sync-queue.send.validation-error.organization.address-required": "A organização a ser enviada requer um endereço", From 6ad0f99ca471ea8735faad179e79206a3fcb91fa Mon Sep 17 00:00:00 2001 From: rsaraivac <122451983+rsaraivac@users.noreply.github.com> Date: Wed, 31 May 2023 20:06:12 +0100 Subject: [PATCH 304/409] Update pt-PT.json5 --- src/assets/i18n/pt-PT.json5 | 2595 +++++++++++++++++------------------ 1 file changed, 1297 insertions(+), 1298 deletions(-) diff --git a/src/assets/i18n/pt-PT.json5 b/src/assets/i18n/pt-PT.json5 index c7b677d597..8dff07a387 100644 --- a/src/assets/i18n/pt-PT.json5 +++ b/src/assets/i18n/pt-PT.json5 @@ -1,502 +1,502 @@ { // Dspace v7.5 > i18n pt-PT > reviewed 30-05-2023 - + // "401.help": "You're not authorized to access this page. You can use the button below to get back to the home page.", "401.help": "Não está autorizado a aceder a esta página. Pode utilizar o botão em baixo para voltar à página de início.", - + // "401.link.home-page": "Take me to the home page", "401.link.home-page": "Voltar à página de início", - + // "401.unauthorized": "unauthorized", "401.unauthorized": "Não autorizado", - + // "403.help": "You don't have permission to access this page. You can use the button below to get back to the home page.", "403.help": "Não possui permissões para aceder a esta página. Pode utilizar o botão em baixo para voltar à página de início.", - + // "403.link.home-page": "Take me to the home page", "403.link.home-page": "Voltar à página de início", - + // "403.forbidden": "forbidden", "403.forbidden": "Proibido", - + // "500.page-internal-server-error": "Service Unavailable", "500.page-internal-server-error": "Serviço indisponível", - + // "500.help": "The server is temporarily unable to service your request due to maintenance downtime or capacity problems. Please try again later.", "500.help": "O servidor encontra-se temporariamete indisponível para responder ao seu pedido, devido a processos de manutenção em curso ou capacidade de resposta. Por favor tente mais tarde.", - + // "500.link.home-page": "Take me to the home page", "500.link.home-page": "Voltar à página de início", - + // "404.help": "We can't find the page you're looking for. The page may have been moved or deleted. You can use the button below to get back to the home page. ", "404.help": "Não encontramos a página que procura. A página pode ter sido movida ou eliminada. Pode utilizar o botão em baixo para voltar à página de início. ", - + // "404.link.home-page": "Take me to the home page", "404.link.home-page": "Voltar à página de início", - + // "404.page-not-found": "page not found", "404.page-not-found": "página não encontrada", - + // "error-page.description.401": "unauthorized", "error-page.description.401": "Não autorizado", - + // "error-page.description.403": "forbidden", "error-page.description.403": "Proibido", - + // "error-page.description.500": "Service Unavailable", "error-page.description.500": "Serviço indisponível", - + // "error-page.description.404": "page not found", "error-page.description.404": "página não encontrada", - + // "error-page.orcid.generic-error": "An error occurred during login via ORCID. Make sure you have shared your ORCID account email address with DSpace. If the error persists, contact the administrator", "error-page.orcid.generic-error": "Ocorreu um erro com a sua autenticação via ORCID. Certifique-se que partilhou o seu endereço de email associado à sua conta ORCID com o repositório. Se o erro persistir, por favor contacte o administrador do sistema.", - + // "access-status.embargo.listelement.badge": "Embargo", "access-status.embargo.listelement.badge": "Embargado", - + // "access-status.metadata.only.listelement.badge": "Metadata only", "access-status.metadata.only.listelement.badge": "Apenas Metadados", - + // "access-status.open.access.listelement.badge": "Open Access", "access-status.open.access.listelement.badge": "Acesso Aberto", - + // "access-status.restricted.listelement.badge": "Restricted", "access-status.restricted.listelement.badge": "Acesso Restrito", - + // "access-status.unknown.listelement.badge": "Unknown", "access-status.unknown.listelement.badge": "Desconhecido", - + // "admin.curation-tasks.breadcrumbs": "System curation tasks", "admin.curation-tasks.breadcrumbs": "Tarefas de curadoria", - + // "admin.curation-tasks.title": "System curation tasks", "admin.curation-tasks.title": "Tarefas de curadoria", - + // "admin.curation-tasks.header": "System curation tasks", "admin.curation-tasks.header": "Tarefas de curadoria", - + // "admin.registries.bitstream-formats.breadcrumbs": "Format registry", "admin.registries.bitstream-formats.breadcrumbs": "Registo de formatos", - + // "admin.registries.bitstream-formats.create.breadcrumbs": "Bitstream format", "admin.registries.bitstream-formats.create.breadcrumbs": "Registo de formatos de ficheiro", - + // "admin.registries.bitstream-formats.create.failure.content": "An error occurred while creating the new bitstream format.", "admin.registries.bitstream-formats.create.failure.content": "Ocorreu um erro durante a criação do novo formato de ficheiro.", - + // "admin.registries.bitstream-formats.create.failure.head": "Failure", "admin.registries.bitstream-formats.create.failure.head": "Falha", - + // "admin.registries.bitstream-formats.create.head": "Create Bitstream format", "admin.registries.bitstream-formats.create.head": "Criar formato de ficheiro", - + // "admin.registries.bitstream-formats.create.new": "Add a new bitstream format", "admin.registries.bitstream-formats.create.new": "Adicionar um novo formato de ficheiro", - + // "admin.registries.bitstream-formats.create.success.content": "The new bitstream format was successfully created.", "admin.registries.bitstream-formats.create.success.content": "O novo formato de ficheiro foi criado com sucesso.", - + // "admin.registries.bitstream-formats.create.success.head": "Success", "admin.registries.bitstream-formats.create.success.head": "Sucesso", - + // "admin.registries.bitstream-formats.delete.failure.amount": "Failed to remove {{ amount }} format(s)", "admin.registries.bitstream-formats.delete.failure.amount": "Falha ao remover {{ amount }} formato(s)", - + // "admin.registries.bitstream-formats.delete.failure.head": "Failure", "admin.registries.bitstream-formats.delete.failure.head": "Falha", - + // "admin.registries.bitstream-formats.delete.success.amount": "Successfully removed {{ amount }} format(s)", "admin.registries.bitstream-formats.delete.success.amount": "Removeu {{ amount }} formato(s) com sucesso", - + // "admin.registries.bitstream-formats.delete.success.head": "Success", "admin.registries.bitstream-formats.delete.success.head": "Sucesso", - + // "admin.registries.bitstream-formats.description": "This list of bitstream formats provides information about known formats and their support level.", "admin.registries.bitstream-formats.description": "Esta lista de formatos de ficheiro apresenta informações sobre formatos conhecidos e os seus níveis de suporte.", - + // "admin.registries.bitstream-formats.edit.breadcrumbs": "Bitstream format", "admin.registries.bitstream-formats.edit.breadcrumbs": "Formatos de ficheiro", - + // "admin.registries.bitstream-formats.edit.description.hint": "", "admin.registries.bitstream-formats.edit.description.hint": "", - + // "admin.registries.bitstream-formats.edit.description.label": "Description", "admin.registries.bitstream-formats.edit.description.label": "Descrição", - + // "admin.registries.bitstream-formats.edit.extensions.hint": "Extensions are file extensions that are used to automatically identify the format of uploaded files. You can enter several extensions for each format.", "admin.registries.bitstream-formats.edit.extensions.hint": "Extensões são extensões de ficheiro que são usadas para identificar automaticamente o formato dos ficheiros enviados. Pode informar várias extensões para cada formato.", - + // "admin.registries.bitstream-formats.edit.extensions.label": "File extensions", "admin.registries.bitstream-formats.edit.extensions.label": "Extensões de ficheiro", - + // "admin.registries.bitstream-formats.edit.extensions.placeholder": "Enter a file extension without the dot", "admin.registries.bitstream-formats.edit.extensions.placeholder": "Indique uma extenção de ficheiro sem o ponto", - + // "admin.registries.bitstream-formats.edit.failure.content": "An error occurred while editing the bitstream format.", "admin.registries.bitstream-formats.edit.failure.content": "Ocorreu um erro ao editar o formato de bitstream.", - + // "admin.registries.bitstream-formats.edit.failure.head": "Failure", "admin.registries.bitstream-formats.edit.failure.head": "Falha", - + // "admin.registries.bitstream-formats.edit.head": "Bitstream format: {{ format }}", "admin.registries.bitstream-formats.edit.head": "Formato de bitstream: {{ format }}", - + // "admin.registries.bitstream-formats.edit.internal.hint": "Formats marked as internal are hidden from the user, and used for administrative purposes.", "admin.registries.bitstream-formats.edit.internal.hint": "Formatos marcados como internos são ocultos para o utilizador, usados por motivos administrativos.", - + // "admin.registries.bitstream-formats.edit.internal.label": "Internal", "admin.registries.bitstream-formats.edit.internal.label": "Interno", - + // "admin.registries.bitstream-formats.edit.mimetype.hint": "The MIME type associated with this format, does not have to be unique.", "admin.registries.bitstream-formats.edit.mimetype.hint": "O MIME type associado a este formato não tem que ser único.", - + // "admin.registries.bitstream-formats.edit.mimetype.label": "MIME Type", "admin.registries.bitstream-formats.edit.mimetype.label": "MIME Type", - + // "admin.registries.bitstream-formats.edit.shortDescription.hint": "A unique name for this format, (e.g. Microsoft Word XP or Microsoft Word 2000)", "admin.registries.bitstream-formats.edit.shortDescription.hint": "Um nome único para este formato (exemplo. Microsoft Word XP ou Microsoft Word 2000)", - + // "admin.registries.bitstream-formats.edit.shortDescription.label": "Name", "admin.registries.bitstream-formats.edit.shortDescription.label": "Nome", - + // "admin.registries.bitstream-formats.edit.success.content": "The bitstream format was successfully edited.", "admin.registries.bitstream-formats.edit.success.content": "O formato de bitstream foi editado com sucesso.", - + // "admin.registries.bitstream-formats.edit.success.head": "Success", "admin.registries.bitstream-formats.edit.success.head": "Sucesso", - + // "admin.registries.bitstream-formats.edit.supportLevel.hint": "The level of support your institution pledges for this format.", "admin.registries.bitstream-formats.edit.supportLevel.hint": "O nível de suporte que a sua instituição promete para este formato.", - + // "admin.registries.bitstream-formats.edit.supportLevel.label": "Support level", "admin.registries.bitstream-formats.edit.supportLevel.label": "Nível de suporte", - + // "admin.registries.bitstream-formats.head": "Bitstream Format Registry", "admin.registries.bitstream-formats.head": "Registo de formatos de ficheiros", - + // "admin.registries.bitstream-formats.no-items": "No bitstream formats to show.", "admin.registries.bitstream-formats.no-items": "Nenhum formato de bitstream para exibir.", - + // "admin.registries.bitstream-formats.table.delete": "Delete selected", "admin.registries.bitstream-formats.table.delete": "Apagar selecionado(s)", - + // "admin.registries.bitstream-formats.table.deselect-all": "Deselect all", "admin.registries.bitstream-formats.table.deselect-all": "Desselecionar todos", - + // "admin.registries.bitstream-formats.table.internal": "internal", "admin.registries.bitstream-formats.table.internal": "Interno", - + // "admin.registries.bitstream-formats.table.mimetype": "MIME Type", "admin.registries.bitstream-formats.table.mimetype": "MIME Type", - + // "admin.registries.bitstream-formats.table.name": "Name", "admin.registries.bitstream-formats.table.name": "Nome", - + // "admin.registries.bitstream-formats.table.id": "ID", "admin.registries.bitstream-formats.table.id": "ID", - + // "admin.registries.bitstream-formats.table.return": "Back", "admin.registries.bitstream-formats.table.return": "Voltar", - + // "admin.registries.bitstream-formats.table.supportLevel.KNOWN": "Known", "admin.registries.bitstream-formats.table.supportLevel.KNOWN": "Conhecido", - + // "admin.registries.bitstream-formats.table.supportLevel.SUPPORTED": "Supported", "admin.registries.bitstream-formats.table.supportLevel.SUPPORTED": "Suportado", - + // "admin.registries.bitstream-formats.table.supportLevel.UNKNOWN": "Unknown", "admin.registries.bitstream-formats.table.supportLevel.UNKNOWN": "Desconhecido", - + // "admin.registries.bitstream-formats.table.supportLevel.head": "Support Level", "admin.registries.bitstream-formats.table.supportLevel.head": "Nível de suporte", - + // "admin.registries.bitstream-formats.title": "Bitstream Format Registry", "admin.registries.bitstream-formats.title": "Registo de formatos de ficheiro", - + // "admin.registries.metadata.breadcrumbs": "Metadata registry", "admin.registries.metadata.breadcrumbs": "Registo de metadados", - + // "admin.registries.metadata.description": "The metadata registry maintains a list of all metadata fields available in the repository. These fields may be divided amongst multiple schemas. However, DSpace requires the qualified Dublin Core schema.", "admin.registries.metadata.description": "O registo de metadados mantém a lista de todos os campos de metadados disponíveis no repositório. Estes campos podem ser divididos em multiplos esquemas. No entanto, o DSpace requer esquemas de Dublin Core qualificados.", - + // "admin.registries.metadata.form.create": "Create metadata schema", "admin.registries.metadata.form.create": "Criar esquema de metadados", - + // "admin.registries.metadata.form.edit": "Edit metadata schema", "admin.registries.metadata.form.edit": "Editar esquema de metadados", - + // "admin.registries.metadata.form.name": "Name", "admin.registries.metadata.form.name": "Nome", - + // "admin.registries.metadata.form.namespace": "Namespace", "admin.registries.metadata.form.namespace": "Namespace", - + // "admin.registries.metadata.head": "Metadata Registry", "admin.registries.metadata.head": "Registo de metadados", - + // "admin.registries.metadata.schemas.no-items": "No metadata schemas to show.", "admin.registries.metadata.schemas.no-items": "Nenhum esquema de metadados para mostrar.", - + // "admin.registries.metadata.schemas.table.delete": "Delete selected", "admin.registries.metadata.schemas.table.delete": "Apagar selecionado(s)", - + // "admin.registries.metadata.schemas.table.id": "ID", "admin.registries.metadata.schemas.table.id": "ID", - + // "admin.registries.metadata.schemas.table.name": "Name", "admin.registries.metadata.schemas.table.name": "Nome", - + // "admin.registries.metadata.schemas.table.namespace": "Namespace", "admin.registries.metadata.schemas.table.namespace": "Namespace", - + // "admin.registries.metadata.title": "Metadata Registry", "admin.registries.metadata.title": "Registo de metadados", - + // "admin.registries.schema.breadcrumbs": "Metadata schema", "admin.registries.schema.breadcrumbs": "Esquema de metadados", - + // "admin.registries.schema.description": "This is the metadata schema for \"{{namespace}}\".", "admin.registries.schema.description": "Este é o esquema de metadados para \"{{namespace}}\".", - + // "admin.registries.schema.fields.head": "Schema metadata fields", "admin.registries.schema.fields.head": "Campos do esquema de metadados", - + // "admin.registries.schema.fields.no-items": "No metadata fields to show.", "admin.registries.schema.fields.no-items": "Nenhum campo de metadado para exibir.", - + // "admin.registries.schema.fields.table.delete": "Delete selected", "admin.registries.schema.fields.table.delete": "Apagar selecionado(s)", - + // "admin.registries.schema.fields.table.field": "Field", "admin.registries.schema.fields.table.field": "Campo", - + // "admin.registries.schema.fields.table.id": "ID", "admin.registries.schema.fields.table.id": "ID", - + // "admin.registries.schema.fields.table.scopenote": "Scope Note", "admin.registries.schema.fields.table.scopenote": "Descrição", - + // "admin.registries.schema.form.create": "Create metadata field", "admin.registries.schema.form.create": "Criar elemento de metadados", - + // "admin.registries.schema.form.edit": "Edit metadata field", "admin.registries.schema.form.edit": "Editar campo de metadados", - + // "admin.registries.schema.form.element": "Element", "admin.registries.schema.form.element": "Elemento", - + // "admin.registries.schema.form.qualifier": "Qualifier", "admin.registries.schema.form.qualifier": "Qualificador", - + // "admin.registries.schema.form.scopenote": "Scope Note", "admin.registries.schema.form.scopenote": "Nota de âmbito", - + // "admin.registries.schema.head": "Metadata Schema", "admin.registries.schema.head": "Esquema de metadados", - + // "admin.registries.schema.notification.created": "Successfully created metadata schema \"{{prefix}}\"", "admin.registries.schema.notification.created": "Criou o esquema de metadados \"{{prefix}}\" com sucesso", - + // "admin.registries.schema.notification.deleted.failure": "Failed to delete {{amount}} metadata schemas", "admin.registries.schema.notification.deleted.failure": "Falhou ao apagar {{amount}} esquema(s) de metadados", - + // "admin.registries.schema.notification.deleted.success": "Successfully deleted {{amount}} metadata schemas", "admin.registries.schema.notification.deleted.success": "Apagou {{amount}} esquema(s) de metadados com sucesso", - + // "admin.registries.schema.notification.edited": "Successfully edited metadata schema \"{{prefix}}\"", "admin.registries.schema.notification.edited": "Editou o esquema de metadados \"{{prefix}}\" com sucesso", - + // "admin.registries.schema.notification.failure": "Error", "admin.registries.schema.notification.failure": "Erro", - + // "admin.registries.schema.notification.field.created": "Successfully created metadata field \"{{field}}\"", "admin.registries.schema.notification.field.created": "Criou o campo de metadado \"{{field}}\" com sucesso", - + // "admin.registries.schema.notification.field.deleted.failure": "Failed to delete {{amount}} metadata fields", "admin.registries.schema.notification.field.deleted.failure": "Falhou ao apagar {{amount}} campo(s) de metadados", - + // "admin.registries.schema.notification.field.deleted.success": "Successfully deleted {{amount}} metadata fields", "admin.registries.schema.notification.field.deleted.success": "Apagou {{amount}} campo(s) de metadados com sucesso", - + // "admin.registries.schema.notification.field.edited": "Successfully edited metadata field \"{{field}}\"", "admin.registries.schema.notification.field.edited": "Editou o campo de metadado \"{{field}}\" com sucesso", - + // "admin.registries.schema.notification.success": "Success", "admin.registries.schema.notification.success": "Sucesso", - + // "admin.registries.schema.return": "Back", "admin.registries.schema.return": "Voltar", - + // "admin.registries.schema.title": "Metadata Schema Registry", "admin.registries.schema.title": "Registo de esquemas de metadados", - + // "admin.access-control.epeople.actions.delete": "Delete EPerson", "admin.access-control.epeople.actions.delete": "Apagar utilizador", - + // "admin.access-control.epeople.actions.impersonate": "Impersonate EPerson", "admin.access-control.epeople.actions.impersonate": "Assumir o papel do Utilizador", - + // "admin.access-control.epeople.actions.reset": "Reset password", "admin.access-control.epeople.actions.reset": "Redefinir password", - + // "admin.access-control.epeople.actions.stop-impersonating": "Stop impersonating EPerson", "admin.access-control.epeople.actions.stop-impersonating": "Deixar de assumir o papel do utilizador", - + // "admin.access-control.epeople.breadcrumbs": "EPeople", "admin.access-control.epeople.breadcrumbs": "Utilizadores", - + // "admin.access-control.epeople.title": "EPeople", "admin.access-control.epeople.title": "Utilizadores", - + // "admin.access-control.epeople.head": "EPeople", "admin.access-control.epeople.head": "Utilizadores", - + // "admin.access-control.epeople.search.head": "Search", "admin.access-control.epeople.search.head": "Pesquisar", - + // "admin.access-control.epeople.button.see-all": "Browse All", "admin.access-control.epeople.button.see-all": "Pesquisar tudo", - + // "admin.access-control.epeople.search.scope.metadata": "Metadata", "admin.access-control.epeople.search.scope.metadata": "Metadados", - + // "admin.access-control.epeople.search.scope.email": "E-mail (exact)", "admin.access-control.epeople.search.scope.email": "Email (exato)", - + // "admin.access-control.epeople.search.button": "Search", "admin.access-control.epeople.search.button": "Pesquisar", - + // "admin.access-control.epeople.search.placeholder": "Search people...", "admin.access-control.epeople.search.placeholder": "Pesquisar utilizadores...", - - // "admin.access-control.epeople.button.add": "Add EPerson", + + // "admin.access-control.epeople.button.add": "Add EPerson", "admin.access-control.epeople.button.add": "Adicionar utilizador", - + // "admin.access-control.epeople.table.id": "ID", "admin.access-control.epeople.table.id": "ID", - + // "admin.access-control.epeople.table.name": "Name", "admin.access-control.epeople.table.name": "Nome", - + // "admin.access-control.epeople.table.email": "E-mail (exact)", "admin.access-control.epeople.table.email": "Email (exato)", - + // "admin.access-control.epeople.table.edit": "Edit", "admin.access-control.epeople.table.edit": "Editar", - + // "admin.access-control.epeople.table.edit.buttons.edit": "Edit \"{{name}}\"", "admin.access-control.epeople.table.edit.buttons.edit": "Editar \"{{name}}\"", - + // "admin.access-control.epeople.table.edit.buttons.edit-disabled": "You are not authorized to edit this group", "admin.access-control.epeople.table.edit.buttons.edit-disabled": "Não possui autorização para editar este grupo", - + // "admin.access-control.epeople.table.edit.buttons.remove": "Delete \"{{name}}\"", "admin.access-control.epeople.table.edit.buttons.remove": "Apagar \"{{name}}\"", - + // "admin.access-control.epeople.no-items": "No EPeople to show.", "admin.access-control.epeople.no-items": "Sem utilizadores para mostrar.", - + // "admin.access-control.epeople.form.create": "Create EPerson", "admin.access-control.epeople.form.create": "Criar utilizador", - + // "admin.access-control.epeople.form.edit": "Edit EPerson", "admin.access-control.epeople.form.edit": "Editar utilizador", - + // "admin.access-control.epeople.form.firstName": "First name", "admin.access-control.epeople.form.firstName": "Nome", - + // "admin.access-control.epeople.form.lastName": "Last name", "admin.access-control.epeople.form.lastName": "Apelido", - + // "admin.access-control.epeople.form.email": "E-mail", "admin.access-control.epeople.form.email": "Email", - + // "admin.access-control.epeople.form.emailHint": "Must be valid e-mail address", "admin.access-control.epeople.form.emailHint": "Deve conter um email válido", - + // "admin.access-control.epeople.form.canLogIn": "Can log in", "admin.access-control.epeople.form.canLogIn": "Pode iniciar sessão", - + // "admin.access-control.epeople.form.requireCertificate": "Requires certificate", "admin.access-control.epeople.form.requireCertificate": "Requer certificado", - + // "admin.access-control.epeople.form.return": "Back", "admin.access-control.epeople.form.return": "Voltar", - + // "admin.access-control.epeople.form.notification.created.success": "Successfully created EPerson \"{{name}}\"", "admin.access-control.epeople.form.notification.created.success": "Utilizador criado com sucesso \"{{name}}\"", - + // "admin.access-control.epeople.form.notification.created.failure": "Failed to create EPerson \"{{name}}\"", "admin.access-control.epeople.form.notification.created.failure": "Falha ao criar o Utilizador \"{{name}}\"", - + // "admin.access-control.epeople.form.notification.created.failure.emailInUse": "Failed to create EPerson \"{{name}}\", email \"{{email}}\" already in use.", "admin.access-control.epeople.form.notification.created.failure.emailInUse": "Falha ao criar o Utilizador \"{{name}}\", o email \"{{email}}\" já está registado no repositório.", - + // "admin.access-control.epeople.form.notification.edited.failure.emailInUse": "Failed to edit EPerson \"{{name}}\", email \"{{email}}\" already in use.", "admin.access-control.epeople.form.notification.edited.failure.emailInUse": "Falha ao editar o Utilizador \"{{name}}\", o email \"{{email}}\" já está registado no repositório.", - + // "admin.access-control.epeople.form.notification.edited.success": "Successfully edited EPerson \"{{name}}\"", "admin.access-control.epeople.form.notification.edited.success": "Utilizador editado com successo \"{{name}}\"", - + // "admin.access-control.epeople.form.notification.edited.failure": "Failed to edit EPerson \"{{name}}\"", "admin.access-control.epeople.form.notification.edited.failure": "Falha ao editor Utilizador \"{{name}}\"", - + // "admin.access-control.epeople.form.notification.deleted.success": "Successfully deleted EPerson \"{{name}}\"", "admin.access-control.epeople.form.notification.deleted.success": "Utilizador removido com sucesso \"{{name}}\"", - + // "admin.access-control.epeople.form.notification.deleted.failure": "Failed to delete EPerson \"{{name}}\"", "admin.access-control.epeople.form.notification.deleted.failure": "Falha ao remover o utilizador \"{{name}}\"", - + // "admin.access-control.epeople.form.groupsEPersonIsMemberOf": "Member of these groups:", "admin.access-control.epeople.form.groupsEPersonIsMemberOf": "Membro dos grupos:", - + // "admin.access-control.epeople.form.table.id": "ID", "admin.access-control.epeople.form.table.id": "ID", - + // "admin.access-control.epeople.form.table.name": "Name", "admin.access-control.epeople.form.table.name": "Nome", - + // "admin.access-control.epeople.form.table.collectionOrCommunity": "Collection/Community", "admin.access-control.epeople.form.table.collectionOrCommunity": "Coleção/Comunidade", - + // "admin.access-control.epeople.form.memberOfNoGroups": "This EPerson is not a member of any groups", "admin.access-control.epeople.form.memberOfNoGroups": "Este utilizador não é membro de nenhum grupo", - + // "admin.access-control.epeople.form.goToGroups": "Add to groups", "admin.access-control.epeople.form.goToGroups": "Adicionar a grupos", - + // "admin.access-control.epeople.notification.deleted.failure": "Failed to delete EPerson: \"{{name}}\"", "admin.access-control.epeople.notification.deleted.failure": "Falha ao apagar utilizador: \"{{name}}\"", - + // "admin.access-control.epeople.notification.deleted.success": "Successfully deleted EPerson: \"{{name}}\"", "admin.access-control.epeople.notification.deleted.success": "Utilizador removido com sucesso: \"{{name}}\"", - + // "admin.access-control.groups.title": "Groups", "admin.access-control.groups.title": "Grupos", - + // "admin.access-control.groups.breadcrumbs": "Groups", "admin.access-control.groups.breadcrumbs": "Grupos", - + // "admin.access-control.groups.singleGroup.breadcrumbs": "Edit Group", "admin.access-control.groups.singleGroup.breadcrumbs": "Editar grupo", - + // "admin.access-control.groups.title.singleGroup": "Edit Group", "admin.access-control.groups.title.singleGroup": "Editar grupo", - + // "admin.access-control.groups.title.addGroup": "New Group", "admin.access-control.groups.title.addGroup": "Novo grupo", - + // "admin.access-control.groups.addGroup.breadcrumbs": "New Group", "admin.access-control.groups.addGroup.breadcrumbs": "Novo grupo", - + // "admin.access-control.groups.head": "Groups", "admin.access-control.groups.head": "Grupos", - + // "admin.access-control.groups.button.add": "Add group", "admin.access-control.groups.button.add": "Adicionar grupo", - + // "admin.access-control.groups.search.head": "Search groups", "admin.access-control.groups.search.head": "Pesquisar grupos", @@ -505,7 +505,7 @@ // "admin.access-control.groups.search.button": "Search", "admin.access-control.groups.search.button": "Pesquisar", - + // "admin.access-control.groups.search.placeholder": "Search groups...", "admin.access-control.groups.search.placeholder": "Pesquisar grupos...", @@ -517,7 +517,7 @@ // "admin.access-control.groups.table.collectionOrCommunity": "Collection/Community", "admin.access-control.groups.table.collectionOrCommunity": "Coleção/Comunidade", - + // "admin.access-control.groups.table.members": "Members", "admin.access-control.groups.table.members": "Membros", @@ -535,19 +535,19 @@ // "admin.access-control.groups.notification.deleted.success": "Successfully deleted group \"{{name}}\"", "admin.access-control.groups.notification.deleted.success": "Grupo removido com sucesso \"{{name}}\"", - + // "admin.access-control.groups.notification.deleted.failure.title": "Failed to delete group \"{{name}}\"", - "admin.access-control.groups.notification.deleted.failure.title": "Falha ao remover grupo \"{{name}}\"", - + "admin.access-control.groups.notification.deleted.failure.title": "Falha ao remover grupo \"{{name}}\"", + // "admin.access-control.groups.notification.deleted.failure.content": "Cause: \"{{cause}}\"", "admin.access-control.groups.notification.deleted.failure.content": "Causa: \"{{cause}}\"", - + // "admin.access-control.groups.form.alert.permanent": "This group is permanent, so it can't be edited or deleted. You can still add and remove group members using this page.", "admin.access-control.groups.form.alert.permanent": "Este grupo é permanente, não pode ser editado ou apagado. Pode adicionar ou remover membros deste grupo nesta página.", - + // "admin.access-control.groups.form.alert.workflowGroup": "This group can’t be modified or deleted because it corresponds to a role in the submission and workflow process in the \"{{name}}\" {{comcol}}. You can delete it from the \"assign roles\" tab on the edit {{comcol}} page. You can still add and remove group members using this page.", "admin.access-control.groups.form.alert.workflowGroup": "Este grupo não pode ser editado ou apagado porque corresponde a um papel no 'workflow' de depósito em \"{{name}}\" {{comcol}}. Pode apagá-lo na aba \"Atribuir Papéis\" na edição da página {{comcol}}. Pode adicionar ou remover membros nesta página.", - + // "admin.access-control.groups.form.head.create": "Create group", "admin.access-control.groups.form.head.create": "Criar grupo", @@ -556,7 +556,7 @@ // "admin.access-control.groups.form.groupName": "Group name", "admin.access-control.groups.form.groupName": "Nome do grupo", - + // "admin.access-control.groups.form.groupCommunity": "Community or Collection", "admin.access-control.groups.form.groupCommunity": "Comunidade ou Coleção", @@ -610,10 +610,10 @@ // "admin.access-control.groups.form.members-list.search.head": "Add EPeople", "admin.access-control.groups.form.members-list.search.head": "Adicionar utilizador", - + // "admin.access-control.groups.form.members-list.button.see-all": "Browse All", "admin.access-control.groups.form.members-list.button.see-all": "Percorrer todos", - + // "admin.access-control.groups.form.members-list.headMembers": "Current Members", "admin.access-control.groups.form.members-list.headMembers": "Membros atuais", @@ -622,7 +622,7 @@ // "admin.access-control.groups.form.members-list.search.scope.email": "E-mail (exact)", "admin.access-control.groups.form.members-list.search.scope.email": "E-mail (completo)", - + // "admin.access-control.groups.form.members-list.search.button": "Search", "admin.access-control.groups.form.members-list.search.button": "Pesquisar", @@ -640,7 +640,7 @@ // "admin.access-control.groups.form.members-list.table.netid": "NetID", "admin.access-control.groups.form.members-list.table.netid": "NetID", - + // "admin.access-control.groups.form.members-list.table.edit": "Remove / Add", "admin.access-control.groups.form.members-list.table.edit": "Remover / Adicionar", @@ -655,10 +655,10 @@ // "admin.access-control.groups.form.members-list.notification.success.deleteMember": "Successfully deleted member: \"{{name}}\"", "admin.access-control.groups.form.members-list.notification.success.deleteMember": "Membro removido com sucesso: \"{{name}}\"", - + // "admin.access-control.groups.form.members-list.notification.failure.deleteMember": "Failed to delete member: \"{{name}}\"", "admin.access-control.groups.form.members-list.notification.failure.deleteMember": "Falha ao remover o membro: \"{{name}}\"", - + // "admin.access-control.groups.form.members-list.table.edit.buttons.add": "Add member with name \"{{name}}\"", "admin.access-control.groups.form.members-list.table.edit.buttons.add": "Adicionar membro com o nome \"{{name}}\"", @@ -682,7 +682,7 @@ // "admin.access-control.groups.form.subgroups-list.button.see-all": "Browse All", "admin.access-control.groups.form.subgroups-list.button.see-all": "Percorrer todos", - + // "admin.access-control.groups.form.subgroups-list.headSubgroups": "Current Subgroups", "admin.access-control.groups.form.subgroups-list.headSubgroups": "Subgrupos atuais", @@ -694,7 +694,7 @@ // "admin.access-control.groups.form.subgroups-list.table.name": "Name", "admin.access-control.groups.form.subgroups-list.table.name": "Nome", - + // "admin.access-control.groups.form.subgroups-list.table.collectionOrCommunity": "Collection/Community", "admin.access-control.groups.form.subgroups-list.table.collectionOrCommunity": "Coleção/Comunidade", @@ -718,10 +718,10 @@ // "admin.access-control.groups.form.subgroups-list.notification.success.deleteSubgroup": "Successfully deleted subgroup: \"{{name}}\"", "admin.access-control.groups.form.subgroups-list.notification.success.deleteSubgroup": "Subgrupo removido com sucesso: \"{{name}}\"", - + // "admin.access-control.groups.form.subgroups-list.notification.failure.deleteSubgroup": "Failed to delete subgroup: \"{{name}}\"", "admin.access-control.groups.form.subgroups-list.notification.failure.deleteSubgroup": "Falha ao remover o subgrupo: \"{{name}}\"", - + // "admin.access-control.groups.form.subgroups-list.notification.failure.noActiveGroup": "No current active group, submit a name first.", "admin.access-control.groups.form.subgroups-list.notification.failure.noActiveGroup": "Sem grupo ativo, indique um nome primeiro.", @@ -733,20 +733,20 @@ // "admin.access-control.groups.form.subgroups-list.no-subgroups-yet": "No subgroups in group yet.", "admin.access-control.groups.form.subgroups-list.no-subgroups-yet": "Este grupo ainda não tem subgrupos.", - + // "admin.access-control.groups.form.return": "Back", "admin.access-control.groups.form.return": "Voltar", - + // "admin.access-control.groups.form.tooltip.editGroupPage": "On this page, you can modify the properties and members of a group. In the top section, you can edit the group name and description, unless this is an admin group for a collection or community, in which case the group name and description are auto-generated and cannot be edited. In the following sections, you can edit group membership. See [the wiki](https://wiki.lyrasis.org/display/DSDOC7x/Create+or+manage+a+user+group) for more details.", "admin.access-control.groups.form.tooltip.editGroupPage": "Nesta página, pode modificar as propriedades e os membros de um grupo. Na secção superior, pode editar o nome e a descrição do grupo, a menos que se trate de um grupo administrativo para uma coleção ou comunidade, em que o nome e a descrição do grupo são auto-gerados e não podem ser editados. Nas seções seguintes, pode editar o nome e a descrição do grupo. Ver [wiki](https://wiki.lyrasis.org/display/DSDOC7x/Create+ou+gerir+a+utilizador+grupo) para mais detalhes.", // "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 adicionar ou remover um utilizador de/para este grupo, clique no botão 'Procurar tudo' ou use a barra de pesquisa em baixo para procurar utilizadores (use o menu suspenso, à esquerda da barra de pesquisa, para escolher se pretende pesquisar por metadados ou por e-mail). Depois clique no ícone 'mais' para cada utilizador que deseja adicionar na lista em baixo, ou no ícone 'lixo' para cada utilizador que deseja remover. A lista pode conter várias páginas: utilize os controlos no final da lista para navegar para as páginas seguintes. Quando estiver pronto, guarde as suas alterações clicando no botão 'Guardar' na seção superior.", - + // "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 adicionar ou remover um sub-grupo de/para grupo, clique no botão 'Procurar Tudo' ou use a barra de pesquisa em baixo para procurar utilizadores. Depois clique no ícone 'mais' para cada utilizador que deseja adicionar lista em baixo, ou no ícone 'lixo' para cada utilizador que deseja remover. A lista pode conter várias páginas: utilize os controlos de página no final da lista para navegar para as páginas seguintes. Quando estiver pronto, guarde as suas alterações clicando no botão 'Guardar' na seção superior.", - // "admin.search.breadcrumbs": "Administrative Search", + // "admin.search.breadcrumbs": "Administrative Search", "admin.search.breadcrumbs": "Pesquisa administrativa", // "admin.search.collection.edit": "Edit", @@ -760,13 +760,13 @@ // "admin.search.item.edit": "Edit", "admin.search.item.edit": "Editar", - + // "admin.search.item.make-private": "Make non-discoverable", "admin.search.item.make-private": "Tornar privado", - + // "admin.search.item.make-public": "Make discoverable", "admin.search.item.make-public": "Tornar público", - + // "admin.search.item.move": "Move", "admin.search.item.move": "Mover", @@ -781,64 +781,64 @@ // "administrativeView.search.results.head": "Administrative Search", "administrativeView.search.results.head": "Pesquisa administrativa", - + // "admin.workflow.breadcrumbs": "Administer Workflow", "admin.workflow.breadcrumbs": "Gestão do workflow", - + // "admin.workflow.title": "Administer Workflow", "admin.workflow.title": "Gestão do workflow", - + // "admin.workflow.item.workflow": "Workflow", "admin.workflow.item.workflow": "Workflow", - + // "admin.workflow.item.workspace": "Workspace", "admin.workflow.item.workspace": "Área de trabalho", - + // "admin.workflow.item.delete": "Delete", - "admin.workflow.item.delete": "Apagar", - + "admin.workflow.item.delete": "Apagar", + // "admin.workflow.item.send-back": "Send back", "admin.workflow.item.send-back": "Devolver", - + // "admin.workflow.item.policies": "Policies", "admin.workflow.item.policies": "Políticas", - + // "admin.workflow.item.supervision": "Supervision", - "admin.workflow.item.supervision": "Supervisão", + "admin.workflow.item.supervision": "Supervisão", // "admin.metadata-import.breadcrumbs": "Import Metadata", "admin.metadata-import.breadcrumbs": "Importação de metadados", - + // "admin.batch-import.breadcrumbs": "Import Batch", "admin.batch-import.breadcrumbs": "Importação em lote (batch)", - + // "admin.metadata-import.title": "Import Metadata", "admin.metadata-import.title": "Importação de metadados", - + // "admin.batch-import.title": "Import Batch", "admin.batch-import.title": "Importação em lote (batch)", - + // "admin.metadata-import.page.header": "Import Metadata", "admin.metadata-import.page.header": "Importação de metadados", - + // "admin.batch-import.page.header": "Import Batch", "admin.batch-import.page.header": "Importação em lote (batch)", - + // "admin.metadata-import.page.help": "You can drop or browse CSV files that contain batch metadata operations on files here", "admin.metadata-import.page.help": "Pode arrastar ou procurar ficheiros .csv que contenham operações em lote de metadados", // "admin.batch-import.page.help": "Select the Collection to import into. Then, drop or browse to a Simple Archive Format (SAF) zip file that includes the Items to import", - "admin.batch-import.page.help": "Selecione a coleção para a qual pretende importar. Em seguida, largue ou selecione ficheiro .zip em formato Simple Archive Format (SAF) que inclua os itens a importar.", - + "admin.batch-import.page.help": "Selecione a coleção para a qual pretende importar. Em seguida, largue ou selecione ficheiro .zip em formato Simple Archive Format (SAF) que inclua os itens a importar.", + // "admin.metadata-import.page.dropMsg": "Drop a metadata CSV to import", "admin.metadata-import.page.dropMsg": "Arraste ficheiro .csv para importar metadados", - + // "admin.batch-import.page.dropMsg": "Drop a batch ZIP to import", "admin.batch-import.page.dropMsg": "Arraste ficheiro .zip para importação em lote", - + // "admin.metadata-import.page.dropMsgReplace": "Drop to replace the metadata CSV to import", "admin.metadata-import.page.dropMsgReplace": "Arraste ficheiro .csv para substituir metadados a importar", - + // "admin.batch-import.page.dropMsgReplace": "Drop to replace the batch ZIP to import", "admin.batch-import.page.dropMsgReplace": "Arraste ficheiro .zip para substituir importação em lote", @@ -847,13 +847,13 @@ // "admin.metadata-import.page.button.proceed": "Proceed", "admin.metadata-import.page.button.proceed": "Continuar", - + // "admin.metadata-import.page.button.select-collection": "Select Collection", "admin.metadata-import.page.button.select-collection": "Selecione a coleção", - + // "admin.metadata-import.page.error.addFile": "Select file first!", "admin.metadata-import.page.error.addFile": "Selecione um ficheiro!", - + // "admin.batch-import.page.error.addFile": "Select Zip file first!", "admin.batch-import.page.error.addFile": "Selecione primeiro o ficheiro .zip!", @@ -862,7 +862,7 @@ // "admin.metadata-import.page.validateOnly.hint": "When selected, the uploaded CSV will be validated. You will receive a report of detected changes, but no changes will be saved.", "admin.metadata-import.page.validateOnly.hint": "Quando selecionado, o ficheiro .csv carregado será validado. Irá receber um relatório com as alterações detetadas, porém nenhuma será guardada.", - + // "advanced-workflow-action.rating.form.rating.label": "Rating", "advanced-workflow-action.rating.form.rating.label": "Classificação", @@ -916,7 +916,7 @@ // "advanced-workflow-action-select-reviewer.groups.form.reviewers-list.table.identity": "Identity", "advanced-workflow-action-select-reviewer.groups.form.reviewers-list.table.identity": "Identidade", - + // "advanced-workflow-action-select-reviewer.groups.form.reviewers-list.table.email": "Email", "advanced-workflow-action-select-reviewer.groups.form.reviewers-list.table.email": "Email", @@ -928,7 +928,7 @@ // "advanced-workflow-action-select-reviewer.groups.form.reviewers-list.table.edit.buttons.remove": "Remove member with name \"{{name}}\"", "advanced-workflow-action-select-reviewer.groups.form.reviewers-list.table.edit.buttons.remove": "Remover membro com o nome \"{{name}}\"", - + // "advanced-workflow-action-select-reviewer.groups.form.reviewers-list.notification.success.addMember": "Successfully added member: \"{{name}}\"", "advanced-workflow-action-select-reviewer.groups.form.reviewers-list.notification.success.addMember": "Membro adicionado com sucessso: \"{{name}}\"", @@ -942,7 +942,7 @@ "advanced-workflow-action-select-reviewer.groups.form.reviewers-list.notification.failure.deleteMember": "Falha ao remover o membro: \"{{name}}\"", // "advanced-workflow-action-select-reviewer.groups.form.reviewers-list.table.edit.buttons.add": "Add member with name \"{{name}}\"", - "advanced-workflow-action-select-reviewer.groups.form.reviewers-list.table.edit.buttons.add": "Adicionar membro com nome \"{{name}}\"", + "advanced-workflow-action-select-reviewer.groups.form.reviewers-list.table.edit.buttons.add": "Adicionar membro com nome \"{{name}}\"", // "advanced-workflow-action-select-reviewer.groups.form.reviewers-list.notification.failure.noActiveGroup": "No current active group, submit a name first.", "advanced-workflow-action-select-reviewer.groups.form.reviewers-list.notification.failure.noActiveGroup": "Atualmente sem grupo ativo, submeter um nome primeiro.", @@ -960,14 +960,14 @@ "admin.batch-import.page.validateOnly.hint": "Quando selecionado, o ficheiro .zip carregado será validado. Irá receber um relatório com as alterações detetadas, porém nenhuma será guardada.", // "admin.batch-import.page.remove": "remove", - "admin.batch-import.page.remove": "Remover", + "admin.batch-import.page.remove": "Remover", // "auth.errors.invalid-user": "Invalid email address or password.", "auth.errors.invalid-user": "Endereço de email ou palavra-chave inválidos.", - + // "auth.messages.expired": "Your session has expired. Please log in again.", "auth.messages.expired": "A sua sessão expirou. Por favor, autentique-se novamente.", - + // "auth.messages.token-refresh-failed": "Refreshing your session token failed. Please log in again.", "auth.messages.token-refresh-failed": "A atualização do token da sua sessão falhou. Por favor, autentique-se novamente.", @@ -976,7 +976,7 @@ // "bitstream.download.page.back": "Back", "bitstream.download.page.back": "Voltar", - + // "bitstream.edit.authorizations.link": "Edit bitstream's Policies", "bitstream.edit.authorizations.link": "Editar políticas dos bitstreams", @@ -984,7 +984,7 @@ "bitstream.edit.authorizations.title": "Editar políticas dos bitstreams", // "bitstream.edit.return": "Back", - "bitstream.edit.return": "Voltar", + "bitstream.edit.return": "Voltar", // "bitstream.edit.bitstream": "Bitstream: ", "bitstream.edit.bitstream": "Ficheiros: ", @@ -1018,21 +1018,21 @@ // "bitstream.edit.form.selectedFormat.hint": "If the format is not in the above list, select \"format not in list\" above and describe it under \"Describe new format\".", "bitstream.edit.form.selectedFormat.hint": "Se o formato não se encontrar listado, selecione por favor a opção \"Formato não está na lista\" e faculte detalhes em \"Descreva o novo formato\".", - + // "bitstream.edit.form.selectedFormat.label": "Selected Format", "bitstream.edit.form.selectedFormat.label": "Formato selecionado", - + // "bitstream.edit.form.selectedFormat.unknown": "Format not in list", "bitstream.edit.form.selectedFormat.unknown": "O formato não está na lista", - + // "bitstream.edit.notifications.error.format.title": "An error occurred saving the bitstream's format", "bitstream.edit.notifications.error.format.title": "Ocorreu um erro ao guardar o formato do ficheiro", // "bitstream.edit.form.iiifLabel.label": "IIIF Label", "bitstream.edit.form.iiifLabel.label": "IIIF Label", - + // "bitstream.edit.form.iiifLabel.hint": "Canvas label for this image. If not provided default label will be used.", - "bitstream.edit.form.iiifLabel.hint": "Etiqueta canvas para esta imagem. Se não for fornecida será utilizada uma etiqueta padrão.", + "bitstream.edit.form.iiifLabel.hint": "Etiqueta canvas para esta imagem. Se não for fornecida será utilizada uma etiqueta padrão.", // "bitstream.edit.form.iiifToc.label": "IIIF Table of Contents", "bitstream.edit.form.iiifToc.label": "Tabela de conteúdos IIIF", @@ -1047,8 +1047,8 @@ "bitstream.edit.form.iiifWidth.hint": "A largura do canvas normalmente deve corresponder à largura da imagem.", // "bitstream.edit.form.iiifHeight.label": "IIIF Canvas Height", - "bitstream.edit.form.iiifHeight.label": "Altura do canvas IIIF", - + "bitstream.edit.form.iiifHeight.label": "Altura do canvas IIIF", + // "bitstream.edit.form.iiifHeight.hint": "The canvas height should usually match the image height.", "bitstream.edit.form.iiifHeight.hint": "A altura do canvas normalmente deve corresponder à altura da imagem.", @@ -1060,7 +1060,7 @@ // "bitstream.edit.title": "Edit bitstream", "bitstream.edit.title": "Editar ficheiro", - + // "bitstream-request-a-copy.alert.canDownload1": "You already have access to this file. If you want to download the file, click ", "bitstream-request-a-copy.alert.canDownload1": "Já tem acesso a este ficheiro. Se quiser descarregar o ficheiro, clique ", @@ -1096,7 +1096,7 @@ // "bitstream-request-a-copy.allfiles.label": "Files", "bitstream-request-a-copy.allfiles.label": "Ficheiro(s) pretendido(s):", - + // "bitstream-request-a-copy.files-all-false.label": "Only the requested file", "bitstream-request-a-copy.files-all-false.label": "Apenas o ficheiro solicitado", @@ -1108,7 +1108,7 @@ // "bitstream-request-a-copy.return": "Back", "bitstream-request-a-copy.return": "Voltar", - + // "bitstream-request-a-copy.submit": "Request copy", "bitstream-request-a-copy.submit": "Solicitar cópia ao autor", @@ -1119,20 +1119,20 @@ "bitstream-request-a-copy.submit.error": "Ocorreu algum erro no envio do pedido de cópia!", // "browse.back.all-results": "All browse results", - "browse.back.all-results": "Todos os resultados", - + "browse.back.all-results": "Todos os resultados", + // "browse.comcol.by.author": "By Author", "browse.comcol.by.author": "Por autor", - + // "browse.comcol.by.dateissued": "By Issue Date", "browse.comcol.by.dateissued": "Por data de publicação", - + // "browse.comcol.by.subject": "By Subject", "browse.comcol.by.subject": "Por assunto", - + // "browse.comcol.by.title": "By Title", "browse.comcol.by.title": "Por título", - + // "browse.comcol.head": "Browse", "browse.comcol.head": "Navegar", @@ -1141,28 +1141,28 @@ // "browse.metadata.author": "Author", "browse.metadata.author": "autor", - + // "browse.metadata.dateissued": "Issue Date", "browse.metadata.dateissued": "data de Publicação", - + // "browse.metadata.subject": "Subject", "browse.metadata.subject": "assunto", - + // "browse.metadata.title": "Title", - "browse.metadata.title": "título", + "browse.metadata.title": "título", // "browse.metadata.author.breadcrumbs": "Browse by Author", "browse.metadata.author.breadcrumbs": "Percorrer por autor", - + // "browse.metadata.dateissued.breadcrumbs": "Browse by Date", "browse.metadata.dateissued.breadcrumbs": "Percorrer por data", - + // "browse.metadata.subject.breadcrumbs": "Browse by Subject", "browse.metadata.subject.breadcrumbs": "Percorrer por assunto", - + // "browse.metadata.title.breadcrumbs": "Browse by Title", "browse.metadata.title.breadcrumbs": "Percorrer por título", - + // "pagination.next.button": "Next", "pagination.next.button": "Próximo", @@ -1171,88 +1171,88 @@ // "pagination.next.button.disabled.tooltip": "No more pages of results", "pagination.next.button.disabled.tooltip": "Sem mais páginas de resultados", - + // "browse.startsWith": ", starting with {{ startsWith }}", "browse.startsWith": ", começado por {{ startsWith }}", - + // "browse.startsWith.choose_start": "(Choose start)", "browse.startsWith.choose_start": "(Escolha o início)", // "browse.startsWith.choose_year": "(Choose year)", "browse.startsWith.choose_year": "(Escolha o ano)", - + // "browse.startsWith.choose_year.label": "Choose the issue year", "browse.startsWith.choose_year.label": "Escolha o ano", // "browse.startsWith.jump": "Filter results by year or month", "browse.startsWith.jump": "Filtrar resultados por ano ou mês", - + // "browse.startsWith.months.april": "April", "browse.startsWith.months.april": "abril", - + // "browse.startsWith.months.august": "August", "browse.startsWith.months.august": "agosto", - + // "browse.startsWith.months.december": "December", "browse.startsWith.months.december": "dezembro", - + // "browse.startsWith.months.february": "February", "browse.startsWith.months.february": "fevereiro", - + // "browse.startsWith.months.january": "January", "browse.startsWith.months.january": "janeiro", - + // "browse.startsWith.months.july": "July", "browse.startsWith.months.july": "julho", - + // "browse.startsWith.months.june": "June", "browse.startsWith.months.june": "junho", - + // "browse.startsWith.months.march": "March", "browse.startsWith.months.march": "março", - + // "browse.startsWith.months.may": "May", "browse.startsWith.months.may": "maio", - + // "browse.startsWith.months.none": "(Choose month)", "browse.startsWith.months.none": "(Escolha o mês)", - + // "browse.startsWith.months.none.label": "Choose the issue month", "browse.startsWith.months.none.label": "Escolha o mês", - + // "browse.startsWith.months.november": "November", "browse.startsWith.months.november": "novembro", - + // "browse.startsWith.months.october": "October", "browse.startsWith.months.october": "outubro", - + // "browse.startsWith.months.september": "September", "browse.startsWith.months.september": "setembro", - + // "browse.startsWith.submit": "Browse", "browse.startsWith.submit": "Pesquisar", - + // "browse.startsWith.type_date": "Filter results by date", "browse.startsWith.type_date": "Filtrar resultados por data", - + // "browse.startsWith.type_date.label": "Or type in a date (year-month) and click on the Browse button", "browse.startsWith.type_date.label": "ou indique uma data (ano-mês):", - + // "browse.startsWith.type_text": "Filter results by typing the first few letters", - "browse.startsWith.type_text": "Filtrar resultados inserindo as primeiras letras", - + "browse.startsWith.type_text": "Filtrar resultados inserindo as primeiras letras", + // "browse.title": "Browsing {{ collection }} by {{ field }}{{ startsWith }} {{ value }}", "browse.title": "Percorrer {{ collection }} por {{ field }}{{ startsWith }} {{ value }}", // "browse.title.page": "Browsing {{ collection }} by {{ field }} {{ value }}", "browse.title.page": "Percorrer {{ collection }} por {{ field }} {{ value }}", - + // "search.browse.item-back": "Back to Results", "search.browse.item-back": "Voltar aos resultados", - + // "chips.remove": "Remove chip", "chips.remove": "Remover chip", - + // "claimed-approved-search-result-list-element.title": "Approved", "claimed-approved-search-result-list-element.title": "Aprovado", @@ -1261,16 +1261,16 @@ // "claimed-declined-task-search-result-list-element.title": "Declined, sent back to Review Manager's workflow", "claimed-declined-task-search-result-list-element.title": "Declinado, reenviado para a área de trabalho do gestor de revisão", - + // "collection.create.head": "Create a Collection", "collection.create.head": "Criar uma coleção", // "collection.create.notifications.success": "Successfully created the Collection", "collection.create.notifications.success": "Coleção criada com sucesso", - + // "collection.create.sub-head": "Create a Collection for Community {{ parent }}", "collection.create.sub-head": "Criar uma coleção na comunidade {{ parent }}", - + // "collection.curate.header": "Curate Collection: {{collection}}", "collection.curate.header": "Curadoria da coleção: {{collection}}", @@ -1279,16 +1279,16 @@ // "collection.delete.confirm": "Confirm", "collection.delete.confirm": "Confirmar", - + // "collection.delete.processing": "Deleting", "collection.delete.processing": "A apagar", - + // "collection.delete.head": "Delete Collection", "collection.delete.head": "Apagar coleção", - + // "collection.delete.notification.fail": "collection could not be deleted", "collection.delete.notification.fail": "Coleção não pode ser apagada", - + // "collection.delete.notification.success": "Successfully deleted collection", "collection.delete.notification.success": "Apagou a coleção com sucesso", @@ -1300,40 +1300,40 @@ // "collection.edit.head": "Edit Collection", "collection.edit.head": "Editar coleção", - + // "collection.edit.breadcrumbs": "Edit Collection", "collection.edit.breadcrumbs": "Editar coleção", - + // "collection.edit.tabs.mapper.head": "Item Mapper", "collection.edit.tabs.mapper.head": "Mapeamentos", - + // "collection.edit.tabs.item-mapper.title": "collection Edit - Item Mapper", "collection.edit.tabs.item-mapper.title": "Editar coleção - mapeamentos", - + // "collection.edit.item-mapper.cancel": "Cancel", "collection.edit.item-mapper.cancel": "Cancelar", - + // "collection.edit.item-mapper.collection": "collection: \"{{name}}\"", "collection.edit.item-mapper.collection": "Coleção: \"{{name}}\"", // "collection.edit.item-mapper.confirm": "Map selected items", "collection.edit.item-mapper.confirm": "Mapear itens selecionados", - + // "collection.edit.item-mapper.description": "This is the item mapper tool that allows collection administrators to map items from other collections into this collection. You can search for items from other collections and map them, or browse the list of currently mapped items.", "collection.edit.item-mapper.description": "Esta é a ferramenta de mapeamento de itens que permite aos administradores de coleções mapear itens de outras coleções para esta. Pode pesquisá-los noutras coleções para os mapear ou navegar na lista dos itens atualmente mapeados.", - + // "collection.edit.item-mapper.head": "Item Mapper - Map Items from Other Collections", "collection.edit.item-mapper.head": "Mapeador de Itens - Mapear itens noutras coleções", - + // "collection.edit.item-mapper.no-search": "Please enter a query to search", "collection.edit.item-mapper.no-search": "Por favor introduza um termo para pesquisar!", - + // "collection.edit.item-mapper.notifications.map.error.content": "Errors occurred for mapping of {{amount}} items.", "collection.edit.item-mapper.notifications.map.error.content": "Ocorreu erros ao mapear {{amount}} itens.", // "collection.edit.item-mapper.notifications.map.error.head": "Mapping errors", "collection.edit.item-mapper.notifications.map.error.head": "Erros de mapeamento!", - + // "collection.edit.item-mapper.notifications.map.success.content": "Successfully mapped {{amount}} items.", "collection.edit.item-mapper.notifications.map.success.content": "Mapeou {{amount}} itens com sucesso.", @@ -1348,31 +1348,31 @@ // "collection.edit.item-mapper.notifications.unmap.success.content": "Successfully removed the mappings of {{amount}} items.", "collection.edit.item-mapper.notifications.unmap.success.content": "Removeu os mapeamentos de {{amount}} item(ns) com sucesso.", - + // "collection.edit.item-mapper.notifications.unmap.success.head": "Remove mapping completed", "collection.edit.item-mapper.notifications.unmap.success.head": "Remoção de mapeamentos completa", // "collection.edit.item-mapper.remove": "Remove selected item mappings", "collection.edit.item-mapper.remove": "Remover mapeamentos selecionados", - + // "collection.edit.item-mapper.search-form.placeholder": "Search items...", "collection.edit.item-mapper.search-form.placeholder": "Pesquisar items...", - + // "collection.edit.item-mapper.tabs.browse": "Browse mapped items", "collection.edit.item-mapper.tabs.browse": "Navegar por itens mapeados", // "collection.edit.item-mapper.tabs.map": "Map new items", "collection.edit.item-mapper.tabs.map": "Mapear novos itens", - + // "collection.edit.logo.delete.title": "Delete logo", "collection.edit.logo.delete.title": "Apagar logótipo", - - // "collection.edit.logo.delete-undo.title": "Undo delete", + + // "collection.edit.logo.delete-undo.title": "Undo delete", "collection.edit.logo.delete-undo.title": "Não apagar", // "collection.edit.logo.label": "Collection logo", "collection.edit.logo.label": "Logótipo da coleção", - + // "collection.edit.logo.notifications.add.error": "Uploading Collection logo failed. Please verify the content before retrying.", "collection.edit.logo.notifications.add.error": "Falha ao carregar o logotipo da coleção. Verifique o ficheiro antes de tentar de novo.", @@ -1381,7 +1381,7 @@ // "collection.edit.logo.notifications.delete.success.title": "Logo deleted", "collection.edit.logo.notifications.delete.success.title": "Logótipo apagado", - + // "collection.edit.logo.notifications.delete.success.content": "Successfully deleted the collection's logo", "collection.edit.logo.notifications.delete.success.content": "O logotipo da coleção foi apagado com sucesso", @@ -1390,46 +1390,46 @@ // "collection.edit.logo.upload": "Drop a Collection Logo to upload", "collection.edit.logo.upload": "Arraste um logótipo da coleção para carregar", - + // "collection.edit.notifications.success": "Successfully edited the Collection", "collection.edit.notifications.success": "Coleção editada com sucesso", - + // "collection.edit.return": "Back", "collection.edit.return": "Voltar", - + // "collection.edit.tabs.curate.head": "Curate", "collection.edit.tabs.curate.head": "Curadoria", - - // "collection.edit.tabs.curate.title": "Collection Edit - Curate", + + // "collection.edit.tabs.curate.title": "Collection Edit - Curate", "collection.edit.tabs.curate.title": "Editar coleção - Curadoria", - + // "collection.edit.tabs.authorizations.head": "Authorizations", "collection.edit.tabs.authorizations.head": "Autorizações", // "collection.edit.tabs.authorizations.title": "Collection Edit - Authorizations", "collection.edit.tabs.authorizations.title": "Editar coleção - autorizações", - + // "collection.edit.item.authorizations.load-bundle-button": "Load more bundles", "collection.edit.item.authorizations.load-bundle-button": "Carregar mais pacotes", // "collection.edit.item.authorizations.load-more-button": "Load more", "collection.edit.item.authorizations.load-more-button": "Carregar mais", - + // "collection.edit.item.authorizations.show-bitstreams-button": "Show bitstream policies for bundle", "collection.edit.item.authorizations.show-bitstreams-button": "Mostrar as políticas do bitstream para o pacote", - + // "collection.edit.tabs.metadata.head": "Edit Metadata", "collection.edit.tabs.metadata.head": "Editar metadados", - + // "collection.edit.tabs.metadata.title": "Collection Edit - Metadata", "collection.edit.tabs.metadata.title": "Editar coleção - metadados", - + // "collection.edit.tabs.roles.head": "Assign Roles", "collection.edit.tabs.roles.head": "Atribuir perfis", - + // "collection.edit.tabs.roles.title": "Collection Edit - Roles", "collection.edit.tabs.roles.title": "Editar coleção - perfis", - + // "collection.edit.tabs.source.external": "This collection harvests its content from an external source", "collection.edit.tabs.source.external": "Esta coleção agrega conteúdo de uma fonte externa", @@ -1444,7 +1444,7 @@ // "collection.edit.tabs.source.form.metadataConfigId": "Metadata Format", "collection.edit.tabs.source.form.metadataConfigId": "Formato de metadados", - + // "collection.edit.tabs.source.form.oaiSetId": "OAI specific set id", "collection.edit.tabs.source.form.oaiSetId": "ID do set OAI-PMH", @@ -1462,10 +1462,10 @@ // "collection.edit.tabs.source.head": "Content Source", "collection.edit.tabs.source.head": "Fonte externa", - + // "collection.edit.tabs.source.notifications.discarded.content": "Your changes were discarded. To reinstate your changes click the 'Undo' button", "collection.edit.tabs.source.notifications.discarded.content": "As alterações foram ignoradas. Para regravar as alterações clique no botão ´Voltar'", - + // "collection.edit.tabs.source.notifications.discarded.title": "Changes discarded", "collection.edit.tabs.source.notifications.discarded.title": "Alterações descartadas", @@ -1483,7 +1483,7 @@ // "collection.edit.tabs.source.title": "Collection Edit - Content Source", "collection.edit.tabs.source.title": "Editar coleção - conteúdo fonte", - + // "collection.edit.template.add-button": "Add", "collection.edit.template.add-button": "Adicionar", @@ -1498,28 +1498,28 @@ // "collection.edit.template.edit-button": "Edit", "collection.edit.template.edit-button": "Editar", - + // "collection.edit.template.error": "An error occurred retrieving the template item", "collection.edit.template.error": "Ocorreu um erro na recuperação do template do item", - + // "collection.edit.template.head": "Edit Template Item for Collection \"{{ collection }}\"", "collection.edit.template.head": "Editar template do item para a coleção \"{{ collection }}\"", - + // "collection.edit.template.label": "Template item", "collection.edit.template.label": "Template do item", - + // "collection.edit.template.loading": "Loading template item...", "collection.edit.template.loading": "A carregar o template do item...", - + // "collection.edit.template.notifications.delete.error": "Failed to delete the item template", "collection.edit.template.notifications.delete.error": "Erro ao apagar o template do item", // "collection.edit.template.notifications.delete.success": "Successfully deleted the item template", "collection.edit.template.notifications.delete.success": "Template do item apagado com sucesso", - + // "collection.edit.template.title": "Edit Template Item", "collection.edit.template.title": "Editar template do item", - + // "collection.form.abstract": "Short Description", "collection.form.abstract": "Descrição curta", @@ -1543,25 +1543,25 @@ // "collection.form.title": "Name", "collection.form.title": "Nome", - + // "collection.form.entityType": "Entity Type", "collection.form.entityType": "Tipo de entidade", // "collection.listelement.badge": "collection", "collection.listelement.badge": "coleção", - + // "collection.page.browse.recent.head": "Recent Submissions", "collection.page.browse.recent.head": "Entradas recentes", - + // "collection.page.browse.recent.empty": "No items to show", "collection.page.browse.recent.empty": "Nenhum item a exibir", // "collection.page.edit": "Edit this collection", "collection.page.edit": "Editar esta coleção", - + // "collection.page.handle": "Permanent URI for this collection:", "collection.page.handle": "URI permanente para esta coleção:", - + // "collection.page.license": "License", "collection.page.license": "Licença", @@ -1576,94 +1576,94 @@ // "collection.select.table.title": "Title", "collection.select.table.title": "Título", - + // "collection.source.controls.head": "Harvest Controls", "collection.source.controls.head": "Controlos de importação", - + // "collection.source.controls.test.submit.error": "Something went wrong with initiating the testing of the settings", "collection.source.controls.test.submit.error": "Algo correu mal ao inicar os testes das configurações", - + // "collection.source.controls.test.failed": "The script to test the settings has failed", "collection.source.controls.test.failed": "O script para testar as configurações falhou!", - + // "collection.source.controls.test.completed": "The script to test the settings has successfully finished", "collection.source.controls.test.completed": "O script para testar as configurações terminou com sucesso!", - + // "collection.source.controls.test.submit": "Test configuration", "collection.source.controls.test.submit": "Configuração de teste", - + // "collection.source.controls.test.running": "Testing configuration...", "collection.source.controls.test.running": "A testar as configurações...", - + // "collection.source.controls.import.submit.success": "The import has been successfully initiated", "collection.source.controls.import.submit.success": "A importação iniciou com sucesso.", - + // "collection.source.controls.import.submit.error": "Something went wrong with initiating the import", "collection.source.controls.import.submit.error": "Algo correu mal ao iniciar a importação", - + // "collection.source.controls.import.submit": "Import now", "collection.source.controls.import.submit": "Importar agora", - + // "collection.source.controls.import.running": "Importing...", "collection.source.controls.import.running": "Importar...", - + // "collection.source.controls.import.failed": "An error occurred during the import", "collection.source.controls.import.failed": "Ocorreu um erro durante a importação", - + // "collection.source.controls.import.completed": "The import completed", "collection.source.controls.import.completed": "A importação encontra-se completa", - + // "collection.source.controls.reset.submit.success": "The reset and reimport has been successfully initiated", "collection.source.controls.reset.submit.success": "A reposição e re-importação iniciou-se com sucesso", - + // "collection.source.controls.reset.submit.error": "Something went wrong with initiating the reset and reimport", "collection.source.controls.reset.submit.error": "Algo correu mal com a reposição e re-importação", - + // "collection.source.controls.reset.failed": "An error occurred during the reset and reimport", "collection.source.controls.reset.failed": "Ocorreu um erro durante a reposição e a re-importação", - + // "collection.source.controls.reset.completed": "The reset and reimport completed", "collection.source.controls.reset.completed": "A reposição e a re-importação encontram-se completas", - + // "collection.source.controls.reset.submit": "Reset and reimport", "collection.source.controls.reset.submit": "Repor e re-importar", - + // "collection.source.controls.reset.running": "Resetting and reimporting...", "collection.source.controls.reset.running": "Repor e re-importar...", - + // "collection.source.controls.harvest.status": "Harvest status:", "collection.source.controls.harvest.status": "Estado da importação:", - + // "collection.source.controls.harvest.start": "Harvest start time:", "collection.source.controls.harvest.start": "Hora de início da importação:", - + // "collection.source.controls.harvest.last": "Last time harvested:", "collection.source.controls.harvest.start": "Hora de fim da importação:", - + // "collection.source.controls.harvest.message": "Harvest info:", "collection.source.controls.harvest.message": "Informação sobre a importação:", - + // "collection.source.controls.harvest.no-information": "N/A", "collection.source.controls.harvest.no-information": "N/A", - + // "collection.source.update.notifications.error.content": "The provided settings have been tested and didn't work.", "collection.source.update.notifications.error.content": "As configurações providenciadas foram testadas mas não funcionam.", // "collection.source.update.notifications.error.title": "Server Error", "collection.source.update.notifications.error.title": "Erro no servidor", - + // "communityList.breadcrumbs": "Community List", "communityList.breadcrumbs": "Lista de comunidades", - + // "communityList.tabTitle": "Community List", "communityList.tabTitle": "Lista de comunidades", - + // "communityList.title": "List of Communities", "communityList.title": "Lista de comunidades", - + // "communityList.showMore": "Show More", "communityList.showMore": "Mostrar mais", - + // "community.create.head": "Create a Community", "community.create.head": "Criar uma comunidade", @@ -1675,22 +1675,22 @@ // "community.curate.header": "Curate Community: {{community}}", "community.curate.header": "Curar comunidade: {{community}}", - + // "community.delete.cancel": "Cancel", "community.delete.cancel": "Cancelar", // "community.delete.confirm": "Confirm", "community.delete.confirm": "Confirmar", - + // "community.delete.processing": "Deleting...", "community.delete.processing": "A apagar...", - + // "community.delete.head": "Delete Community", "community.delete.head": "Apagar comunidade", - + // "community.delete.notification.fail": "Community could not be deleted", "community.delete.notification.fail": "Não foi possível apagar a comunidade", - + // "community.delete.notification.success": "Successfully deleted community", "community.delete.notification.success": "Comunidade apagada com sucesso", @@ -1702,37 +1702,37 @@ // "community.edit.head": "Edit Community", "community.edit.head": "Editar comunidade", - + // "community.edit.breadcrumbs": "Edit Community", "community.edit.breadcrumbs": "Editar Comunidade", - + // "community.edit.logo.delete.title": "Delete logo", "community.edit.logo.delete.title": "Apagar logótipo", // "community.edit.logo.delete-undo.title": "Undo delete", "community.edit.logo.delete-undo.title": "Não apagar logótipo", - + // "community.edit.logo.label": "Community logo", "community.edit.logo.label": "Logótipo da comunidade", - + // "community.edit.logo.notifications.add.error": "Uploading Community logo failed. Please verify the content before retrying.", "community.edit.logo.notifications.add.error": "Falha ao carregar o logótipo da comunidade. Verifique o conteúdo antes de tentar de novo.", - + // "community.edit.logo.notifications.add.success": "Upload Community logo successful.", "community.edit.logo.notifications.add.success": "Logótipo da comunindade carregado com sucesso.", - + // "community.edit.logo.notifications.delete.success.title": "Logo deleted", "community.edit.logo.notifications.delete.success.title": "Logótipo apagado", - + // "community.edit.logo.notifications.delete.success.content": "Successfully deleted the community's logo", "community.edit.logo.notifications.delete.success.content": "O logótipo da comuindade foi apagado com sucesso", - + // "community.edit.logo.notifications.delete.error.title": "Error deleting logo", "community.edit.logo.notifications.delete.error.title": "Erro ao apagar o logótipo", - + // "community.edit.logo.upload": "Drop a Community Logo to upload", "community.edit.logo.upload": "Arraste um logótipo da comunidade para carregar", - + // "community.edit.notifications.success": "Successfully edited the Community", "community.edit.notifications.success": "Comunidade editada com sucesso", @@ -1741,115 +1741,115 @@ // "community.edit.notifications.error": "An error occured while editing the Community", "community.edit.notifications.error": "Ocorreu um erro ao editar a comunidade", - + // "community.edit.return": "Back", "community.edit.return": "Voltar", - + // "community.edit.tabs.curate.head": "Curate", "community.edit.tabs.curate.head": "Curadoria", // "community.edit.tabs.curate.title": "Community Edit - Curate", "community.edit.tabs.curate.title": "Editar comunidade - curadoria", - + // "community.edit.tabs.metadata.head": "Edit Metadata", "community.edit.tabs.metadata.head": "Editar metadados", - + // "community.edit.tabs.metadata.title": "Community Edit - Metadata", "community.edit.tabs.metadata.title": "Editar comunidade - metadados", - + // "community.edit.tabs.roles.head": "Assign Roles", "community.edit.tabs.roles.head": "Atribuir perfis", - + // "community.edit.tabs.roles.title": "Community Edit - Roles", "community.edit.tabs.roles.title": "Editar comunidade - perfis", - + // "community.edit.tabs.authorizations.head": "Authorizations", "community.edit.tabs.authorizations.head": "Autorizações", // "community.edit.tabs.authorizations.title": "Community Edit - Authorizations", "community.edit.tabs.authorizations.title": "Editar comunidade - autorizações", - + // "community.listelement.badge": "Community", "community.listelement.badge": "Comunidade", - + // "comcol-role.edit.no-group": "None", "comcol-role.edit.no-group": "Nenhum", // "comcol-role.edit.create": "Create", "comcol-role.edit.create": "Criar", - + // "comcol-role.edit.create.error.title": "Failed to create a group for the '{{ role }}' role", "comcol-role.edit.create.error.title": "Falha na criação de um grupo para o perfil '{{ role }}'", - + // "comcol-role.edit.restrict": "Restrict", "comcol-role.edit.restrict": "Restrito", // "comcol-role.edit.delete": "Delete", "comcol-role.edit.delete": "Apagar", - + // "comcol-role.edit.delete.error.title": "Failed to delete the '{{ role }}' role's group", "comcol-role.edit.delete.error.title": "Falha na remoção do '{{ role }}' nos perfis do grupo", - + // "comcol-role.edit.community-admin.name": "Administrators", "comcol-role.edit.community-admin.name": "Administradores", // "comcol-role.edit.collection-admin.name": "Administrators", "comcol-role.edit.collection-admin.name": "Administradores", - + // "comcol-role.edit.community-admin.description": "Community administrators can create sub-communities or collections, and manage or assign management for those sub-communities or collections. In addition, they decide who can submit items to any sub-collections, edit item metadata (after submission), and add (map) existing items from other collections (subject to authorization).", "comcol-role.edit.community-admin.description": "Os 'Administradores de comunidades' podem criar 'sub-comunidades' e/ou 'coleções', podem também gerir ou delegar a gestão dessas 'sub-comunidade' ou 'coleções'. Adicionalmente, decidem quem pode depositar itens em coleções, editar metadados (após o depósito) e mapear itens de outras coleções (sujeito a autorização).", - + // "comcol-role.edit.collection-admin.description": "Collection administrators decide who can submit items to the collection, edit item metadata (after submission), and add (map) existing items from other collections to this collection (subject to authorization for that collection).", "comcol-role.edit.collection-admin.description": "Os 'Administradores de coleção' decidem quem pode depositar itens a uma coleção, editar metadados (após o depósito), e mapear itens de outras coleções (sujeito a autorização para essa coleção).", - + // "comcol-role.edit.submitters.name": "Submitters", "comcol-role.edit.submitters.name": "Depositantes", // "comcol-role.edit.submitters.description": "The E-People and Groups that have permission to submit new items to this collection.", "comcol-role.edit.submitters.description": "Os 'Utilizadores' e 'Grupos' que possuem permissões de depósito nesta coleção.", - + // "comcol-role.edit.item_read.name": "Default item read access", - "comcol-role.edit.item_read.name": "Acesso de leitura ao item predefinido (DEFAULT_ITEM_READ)", - + "comcol-role.edit.item_read.name": "Acesso de leitura ao item predefinido (DEFAULT_ITEM_READ)", + // "comcol-role.edit.item_read.description": "E-People and Groups that can read new items submitted to this collection. Changes to this role are not retroactive. Existing items in the system will still be viewable by those who had read access at the time of their addition.", "comcol-role.edit.item_read.description": "'Utilizadores' e 'Grupos' que podem ver itens depositados nesta coleção. As alterações feitas a este papel não são retroativas. Os itens existentes no sistema ainda poderão ser vistos por aqueles que tiveram acesso de leitura no momento da sua adição.", - + // "comcol-role.edit.item_read.anonymous-group": "Default read for incoming items is currently set to Anonymous.", "comcol-role.edit.item_read.anonymous-group": "A leitura de novos itens (Item Read) está predefinida para utilizadores anónimos.", - + // "comcol-role.edit.bitstream_read.name": "Default bitstream read access", "comcol-role.edit.bitstream_read.name": "Leitura predefinida de ficheiros (DEFAULT_BITSTREAM_READ)", - + // "comcol-role.edit.bitstream_read.description": "Community administrators can create sub-communities or collections, and manage or assign management for those sub-communities or collections. In addition, they decide who can submit items to any sub-collections, edit item metadata (after submission), and add (map) existing items from other collections (subject to authorization).", "comcol-role.edit.bitstream_read.description": "Os 'Administradores de comunidades' podem criar sub-comunidades e coleções, bem como gerir ou delegar a gestão dessas sub-comunidade ou coleções. Adicionalmente, decidem quem pode depositar itens em qualquer coleção, editar metadados (após depósito) e mapear itens de outras coleções (sujeito a autorização).", - + // "comcol-role.edit.bitstream_read.anonymous-group": "Default read for incoming bitstreams is currently set to Anonymous.", "comcol-role.edit.bitstream_read.anonymous-group": "A leitura de novos ficheiros (Bitstream Read) está predefinida para utilizadores anónimos.", - + // "comcol-role.edit.editor.name": "Editors", "comcol-role.edit.editor.name": "Editores", // "comcol-role.edit.editor.description": "Editors are able to edit the metadata of incoming submissions, and then accept or reject them.", - "comcol-role.edit.editor.description": "Os 'Editores' podem aceitar ou rejeitar os depósitos e podem editar os seus metadados.", + "comcol-role.edit.editor.description": "Os 'Editores' podem aceitar ou rejeitar os depósitos e podem editar os seus metadados.", // "comcol-role.edit.finaleditor.name": "Final editors", "comcol-role.edit.finaleditor.name": "Validadores finais", - + // "comcol-role.edit.finaleditor.description": "Final editors are able to edit the metadata of incoming submissions, but will not be able to reject them.", "comcol-role.edit.finaleditor.description": "Os 'Validadores finais' podem editar os metadados de um depósito, mas não os podem rejeitar.", - + // "comcol-role.edit.reviewer.name": "Reviewers", "comcol-role.edit.reviewer.name": "Revisores", // "comcol-role.edit.reviewer.description": "Reviewers are able to accept or reject incoming submissions. However, they are not able to edit the submission's metadata.", "comcol-role.edit.reviewer.description": "Os 'Revisores' podem aceitar ou rejeitar os depósitos, mas não podem editar os seus metadados.", - + // "comcol-role.edit.scorereviewers.name": "Score Reviewers", "comcol-role.edit.scorereviewers.name": "Pontuar revisores", // "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": "Os 'Revisores' podem dar uma pontuação aos depósitos recebidos, isto irá determinar se o depósito será rejeitado ou não.", - + // "community.form.abstract": "Short Description", "community.form.abstract": "Descrição curta", @@ -1861,7 +1861,7 @@ // "community.form.rights": "Copyright text (HTML)", "community.form.rights": "Texto de Copyright (HTML)", - + // "community.form.tableofcontents": "News (HTML)", "community.form.tableofcontents": "Notícias (HTML)", @@ -1873,7 +1873,7 @@ // "community.page.handle": "Permanent URI for this community", "community.page.handle": "URI permanente desta comunidade:", - + // "community.page.license": "License", "community.page.license": "Licença", @@ -1882,13 +1882,13 @@ // "community.all-lists.head": "Subcommunities and Collections", "community.all-lists.head": "Sub-comunidade e coleções", - + // "community.sub-collection-list.head": "Collections of this Community", "community.sub-collection-list.head": "Coleções desta comunidade", - + // "community.sub-community-list.head": "Communities of this Community", "community.sub-community-list.head": "Comunidades desta comunidade", - + // "cookies.consent.accept-all": "Accept all", "cookies.consent.accept-all": "Aceitar todos", @@ -1910,12 +1910,12 @@ // "cookies.consent.app.required.title": "(always required)", "cookies.consent.app.required.title": "(sempre necessária)", - // "cookies.consent.app.disable-all.description": "Use this switch to enable or disable all services.", - "cookies.consent.app.disable-all.description": "Utilize este interruptor para ativar ou desativar todos os serviços.", + // "cookies.consent.app.disable-all.description": "Use this switch to enable or disable all services.", + "cookies.consent.app.disable-all.description": "Utilize este interruptor para ativar ou desativar todos os serviços.", + + // "cookies.consent.app.disable-all.title": "Enable or disable all services", + "cookies.consent.app.disable-all.title": "Ativar ou desativar todos os serviços", - // "cookies.consent.app.disable-all.title": "Enable or disable all services", - "cookies.consent.app.disable-all.title": "Ativar ou desativar todos os serviços", - // "cookies.consent.update": "There were changes since your last visit, please update your consent.", "cookies.consent.update": "Existem alterações desde a sua última visita, atualize o seu consentimento.", @@ -1932,20 +1932,20 @@ "cookies.consent.save": "Guardar", // "cookies.consent.content-notice.title": "Cookie Consent", - "cookies.consent.content-notice.title": "Consentir cookies", - + "cookies.consent.content-notice.title": "Consentir cookies", + // "cookies.consent.content-notice.description": "We collect and process your personal information for the following purposes: Authentication, Preferences, Acknowledgement and Statistics.
    To learn more, please read our {privacyPolicy}.", "cookies.consent.content-notice.description": "Recolhemos e processamos informação pessoal para os seguintes propósitos: Autenticação, Guardar Preferências, Termos de Uso e Estatísticas.
    Para saber mais, por favor leia a nossa {privacyPolicy}.", - + // "cookies.consent.content-notice.description.no-privacy": "We collect and process your personal information for the following purposes: Authentication, Preferences, Acknowledgement and Statistics.", "cookies.consent.content-notice.description.no-privacy": "Recolhemos e processamos as suas informações pessoais para os seguintes fins: Autenticação, Preferências, Reconhecimento e Estatísticas.", - + // "cookies.consent.content-notice.learnMore": "Customize", "cookies.consent.content-notice.learnMore": "Pesonalizar", // "cookies.consent.content-modal.description": "Here you can see and customize the information that we collect about you.", "cookies.consent.content-modal.description": "Aqui pode ver e personalizar a informação pessoal que recolhemos sobre si.", - + // "cookies.consent.content-modal.privacy-policy.name": "privacy policy", "cookies.consent.content-modal.privacy-policy.name": "política de privacidade", @@ -1954,13 +1954,13 @@ // "cookies.consent.content-modal.title": "Information that we collect", "cookies.consent.content-modal.title": "Informação que recolhemos", - + // "cookies.consent.content-modal.services": "Services", "cookies.consent.content-modal.services": "Serviços", // "cookies.consent.content-modal.service": "Service", "cookies.consent.content-modal.service": "Serviço", - + // "cookies.consent.app.title.authentication": "Authentication", "cookies.consent.app.title.authentication": "Autenticação", @@ -1978,43 +1978,43 @@ // "cookies.consent.app.description.acknowledgement": "Required for saving your acknowledgements and consents", "cookies.consent.app.description.acknowledgement": "Obrigatório para guardar os 'Termos de Uso' e 'Consentimentos'", - + // "cookies.consent.app.title.google-analytics": "Google Analytics", "cookies.consent.app.title.google-analytics": "Google Analytics", // "cookies.consent.app.description.google-analytics": "Allows us to track statistical data", "cookies.consent.app.description.google-analytics": "Permite-nos rastrear dados estatísticos", - + // "cookies.consent.app.title.google-recaptcha": "Google reCaptcha", "cookies.consent.app.title.google-recaptcha": "Google reCaptcha", // "cookies.consent.app.description.google-recaptcha": "We use google reCAPTCHA service during registration and password recovery", "cookies.consent.app.description.google-recaptcha": "Utilizamos o serviço Google reCAPTCHA durante o registo e recuperação de palavra-passe", - + // "cookies.consent.purpose.functional": "Functional", "cookies.consent.purpose.functional": "Funcional", // "cookies.consent.purpose.statistical": "Statistical", "cookies.consent.purpose.statistical": "Estatísticos", - + // "cookies.consent.purpose.registration-password-recovery": "Registration and Password recovery", "cookies.consent.purpose.registration-password-recovery": "Registo e recuperação de senha", - + // "cookies.consent.purpose.sharing": "Sharing", "cookies.consent.purpose.sharing": "Partilha", - // "curation-task.task.citationpage.label": "Generate Citation Page", - "curation-task.task.citationpage.label": "Gerar página de citações", - + // "curation-task.task.citationpage.label": "Generate Citation Page", + "curation-task.task.citationpage.label": "Gerar página de citações", + // "curation-task.task.checklinks.label": "Check Links in Metadata", "curation-task.task.checklinks.label": "Verifica ligações nos metadados", - + // "curation-task.task.noop.label": "NOOP", "curation-task.task.noop.label": "NOOP", // "curation-task.task.profileformats.label": "Profile Bitstream Formats", "curation-task.task.profileformats.label": "Perfil dos formatos de ficheiro", - + // "curation-task.task.requiredmetadata.label": "Check for Required Metadata", "curation-task.task.requiredmetadata.label": "Verifica metadados obrigatórios", @@ -2023,16 +2023,16 @@ // "curation-task.task.vscan.label": "Virus Scan", "curation-task.task.vscan.label": "Scan de vírus", - + // "curation-task.task.register-doi.label": "Register DOI", "curation-task.task.register-doi.label": "Registo DOI", - + // "curation.form.task-select.label": "Task:", "curation.form.task-select.label": "Tarefa:", // "curation.form.submit": "Start", "curation.form.submit": "Iniciar", - + // "curation.form.submit.success.head": "The curation task has been started successfully", "curation.form.submit.success.head": "A tarefa de curadoria iniciou com sucesso", @@ -2044,25 +2044,25 @@ // "curation.form.submit.error.content": "An error occured when trying to start the curation task.", "curation.form.submit.error.content": "Ocorreu um erro ao tentar iniciar a tarefa de curadoria.", - + // "curation.form.submit.error.invalid-handle": "Couldn't determine the handle for this object", "curation.form.submit.error.invalid-handle": "Não foi possível determinar o handle para este objecto", - + // "curation.form.handle.label": "Handle:", "curation.form.handle.label": "Handle:", // "curation.form.handle.hint": "Hint: Enter [your-handle-prefix]/0 to run a task across entire site (not all tasks may support this capability)", "curation.form.handle.hint": "Dica: Introduza [o-seu-prefixo-handle]/0 para executar a tarefa em todo o repositório (nem todas as tarefas são compatíveis com esta opção)", - + // "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": "Caro {{ recipientName }},\ em resposta ao seu pedido, lamento informá-lo que não me é possível enviar-lhe uma cópia do(s) Ficheiro(s) que solicitou, relativamente ao documento: \"{{ itemUrl }}\" ({{ itemName }}), do qual sou autor.\n\n Com os melhores cumprimentos,\n {{ authorName }} <{{ authorEmail }}>", + "deny-request-copy.email.message": "Caro {{ recipientName }}, Em resposta ao seu pedido, lamento informá-lo que não me é possível enviar-lhe uma cópia do(s) Ficheiro(s) que solicitou, relativamente ao documento: \"{{ itemUrl }}\" ({{ itemName }}), do qual sou autor.\n\n Com os melhores cumprimentos,\n {{ authorName }} <{{ authorEmail }}>", // "deny-request-copy.email.subject": "Request copy of document", "deny-request-copy.email.subject": "Solicitar cópia ao autor", // "deny-request-copy.error": "An error occurred", "deny-request-copy.error": "Ocorreu um erro!", - + // "deny-request-copy.header": "Deny document copy request", "deny-request-copy.header": "Declinar o pedido de cópia", @@ -2074,7 +2074,7 @@ // "dso.name.untitled": "Untitled", "dso.name.untitled": "Sem título", - + // "dso-selector.create.collection.head": "New collection", "dso-selector.create.collection.head": "Nova coleção", @@ -2083,10 +2083,10 @@ // "dso-selector.create.community.head": "New community", "dso-selector.create.community.head": "Nova comunidade", - - // "dso-selector.create.community.or-divider": "or", - "dso-selector.create.community.or-divider": "ou", - + + // "dso-selector.create.community.or-divider": "or", + "dso-selector.create.community.or-divider": "ou", + // "dso-selector.create.community.sub-level": "Create a new community in", "dso-selector.create.community.sub-level": "Criar uma nova coleção em", @@ -2101,7 +2101,7 @@ // "dso-selector.create.submission.head": "New submission", "dso-selector.create.submission.head": "Novo depósito", - + // "dso-selector.edit.collection.head": "Edit collection", "dso-selector.edit.collection.head": "Editar coleção", @@ -2110,25 +2110,25 @@ // "dso-selector.edit.item.head": "Edit item", "dso-selector.edit.item.head": "Editar item", - + // "dso-selector.error.title": "An error occurred searching for a {{ type }}", "dso-selector.error.title": "Ocorreu um erro ao procurar por um(a) {{ type }}", - + // "dso-selector.export-metadata.dspaceobject.head": "Export metadata from", "dso-selector.export-metadata.dspaceobject.head": "Exportar metadados de", - + // "dso-selector.export-batch.dspaceobject.head": "Export Batch (ZIP) from", - "dso-selector.export-batch.dspaceobject.head": "Exportar lote (ZIP) de", + "dso-selector.export-batch.dspaceobject.head": "Exportar lote (ZIP) de", // "dso-selector.import-batch.dspaceobject.head": "Import batch from", - "dso-selector.import-batch.dspaceobject.head": "Importar lote de", - + "dso-selector.import-batch.dspaceobject.head": "Importar lote de", + // "dso-selector.no-results": "No {{ type }} found", "dso-selector.no-results": "Nenhum(a) {{ type }} encontrado(a)", // "dso-selector.placeholder": "Search for a {{ type }}", "dso-selector.placeholder": "Pesquisar por um(a) {{ type }}", - + // "dso-selector.select.collection.head": "Select a collection", "dso-selector.select.collection.head": "Selecione uma coleção", @@ -2143,7 +2143,7 @@ // "dso-selector.set-scope.community.input-header": "Search for a community or collection", "dso-selector.set-scope.community.input-header": "Pesquisar por uma comunidade ou coleção", - + // "dso-selector.claim.item.head": "Profile tips", "dso-selector.claim.item.head": "Dicas de Perfil", @@ -2155,7 +2155,7 @@ // "dso-selector.claim.item.create-from-scratch": "Create a new one", "dso-selector.claim.item.create-from-scratch": "Criar novo", - + // "dso-selector.results-could-not-be-retrieved": "Something went wrong, please refresh again", "dso-selector.results-could-not-be-retrieved": "Algo correu mal, por favor repita", @@ -2173,7 +2173,7 @@ // "supervision-group-selector.select.type-of-order.option.observer": "OBSERVER", "supervision-group-selector.select.type-of-order.option.observer": "OBSERVADOR", - + // "supervision-group-selector.select.group.label": "Select a Group", "supervision-group-selector.select.group.label": "Selecionar um grupo", @@ -2220,8 +2220,8 @@ "confirmation-modal.export-batch.cancel": "Cancelar", // "confirmation-modal.export-batch.confirm": "Export", - "confirmation-modal.export-batch.confirm": "Exportar", - + "confirmation-modal.export-batch.confirm": "Exportar", + // "confirmation-modal.delete-eperson.header": "Delete EPerson \"{{ dsoName }}\"", "confirmation-modal.delete-eperson.header": "Apagar Utilizador \"{{ dsoName }}\"", @@ -2233,7 +2233,7 @@ // "confirmation-modal.delete-eperson.confirm": "Delete", "confirmation-modal.delete-eperson.confirm": "Apagar", - + // "confirmation-modal.delete-profile.header": "Delete Profile", "confirmation-modal.delete-profile.header": "Apagar perfil", @@ -2244,11 +2244,11 @@ "confirmation-modal.delete-profile.cancel": "Cancelar", // "confirmation-modal.delete-profile.confirm": "Delete", - "confirmation-modal.delete-profile.confirm": "Apagar", + "confirmation-modal.delete-profile.confirm": "Apagar", // "confirmation-modal.delete-subscription.header": "Delete Subscription", "confirmation-modal.delete-subscription.header": "Apagar subscrição", - + // "confirmation-modal.delete-subscription.info": "Are you sure you want to delete subscription for \"{{ dsoName }}\"", "confirmation-modal.delete-subscription.info": "Tem a certeza de que pretende apagar a subscrição de \"{{ dsoName }}\"", @@ -2260,64 +2260,64 @@ // "error.bitstream": "Error fetching bitstream", "error.bitstream": "Erro ao aceder ao ficheiro!", - + // "error.browse-by": "Error fetching items", "error.browse-by": "Erro ao carregar itens!", - + // "error.collection": "Error fetching collection", "error.collection": "Erro ao carregar coleção!", - + // "error.collections": "Error fetching collections", "error.collections": "Erro ao carregar coleções!", - + // "error.community": "Error fetching community", "error.community": "Erro ao carregar comunidade!", - + // "error.identifier": "No item found for the identifier", "error.identifier": "Nenhum item encontrado para o identificador!", - + // "error.default": "Error", "error.default": "Erro!", - + // "error.item": "Error fetching item", "error.item": "Erro ao carregar item!", - + // "error.items": "Error fetching items", "error.items": "Erro ao carregar itens!", - + // "error.objects": "Error fetching objects", "error.objects": "Erro ao carregar objetos!", - + // "error.recent-submissions": "Error fetching recent submissions", "error.recent-submissions": "Erro ao carregar depósitos recentes!", - + // "error.search-results": "Error fetching search results", "error.search-results": "Erro ao carregar os resultados da pesquisa!", - + // "error.invalid-search-query": "Search query is not valid. Please check Solr query syntax best practices for further information about this error.", "error.invalid-search-query": "A query da pesquisa não é válida! Por favor verifique Solr query syntax best practices for further information about this error.", - + // "error.sub-collections": "Error fetching sub-collections", "error.sub-collections": "Erro ao carregar sub-coleções!", - + // "error.sub-communities": "Error fetching sub-communities", "error.sub-communities": "Erro ao carregar sub-comunidade!", - + // "error.submission.sections.init-form-error": "An error occurred during section initialize, please check your input-form configuration. Details are below :

    ", "error.submission.sections.init-form-error": "Ocorreu um erro durante a seção de inicialização, por favor verifique sua configuração de 'input-form'. Detalhes estão abaixo :

    ", - + // "error.top-level-communities": "Error fetching top-level communities", "error.top-level-communities": "Erro ao carregar as comunidade de nível superior!", - + // "error.validation.license.notgranted": "You must grant this license to complete your submission. If you are unable to grant this license at this time you may save your work and return later or remove the submission.", "error.validation.license.notgranted": "Deve concordar com esta licença para completar o depósito. Se não estiver de acordo com a licença ou pretende ponderar, pode guardar este trabalho e retomar posteriormente, ou remover definitivamente este depósito.", - + // "error.validation.pattern": "This input is restricted by the current pattern: {{ pattern }}.", "error.validation.pattern": "Este campo está restrito ao seguinte padrão: {{ pattern }}.", // "error.validation.filerequired": "The file upload is mandatory", "error.validation.filerequired": "O carregamento de ficheiros é obrigatório!", - + // "error.validation.required": "This field is required", "error.validation.required": "Este campo é de preenchimento obrigatório!", @@ -2329,112 +2329,112 @@ // "error.validation.groupExists": "This group already exists", "error.validation.groupExists": "Este grupo já existe!", - + // "feed.description": "Syndication feed", - "feed.description": "Feed", - + "feed.description": "Feed", + // "file-section.error.header": "Error obtaining files for this item", "file-section.error.header": "Erro na obteção de ficheiros para este item!", - + // "footer.copyright": "copyright © 2002-{{ year }}", "footer.copyright": "Copyright © 2003-{{ year }}", - + // "footer.link.dspace": "DSpace software", "footer.link.dspace": "Software DSpace", // "footer.link.lyrasis": "LYRASIS", - "footer.link.lyrasis": "LYRASIS", - + "footer.link.lyrasis": "LYRASIS", + // "footer.link.cookies": "Cookie settings", "footer.link.cookies": "Configurações de Cookies", // "footer.link.privacy-policy": "Privacy policy", "footer.link.privacy-policy": "Política de Privacidade", - // "footer.link.end-user-agreement":"End User Agreement", - "footer.link.end-user-agreement":"Termos de Uso", - - // "footer.link.feedback":"Send Feedback", - "footer.link.feedback":"Contacte-nos", - + // "footer.link.end-user-agreement": "End User Agreement", + "footer.link.end-user-agreement": "Termos de Uso", + + // "footer.link.feedback": "Send Feedback", + "footer.link.feedback": "Contacte-nos", + // "forgot-email.form.header": "Forgot Password", - "forgot-email.form.header": "Esqueci a senha", + "forgot-email.form.header": "Esqueci a senha", // "forgot-email.form.info": "Enter the email address associated with the account.", "forgot-email.form.info": "Caso tenha esquecido a sua senha de acesso poderá recuperá-la, para o efeito basta introduzir em baixo o seu endereço de correio electrónico associado.", - + // "forgot-email.form.email": "Email Address *", "forgot-email.form.email": "Endereço de correio eletrónico *", - + // "forgot-email.form.email.error.required": "Please fill in an email address", "forgot-email.form.email.error.required": "Indique um endereço de correio eletrónico", - + // "forgot-email.form.email.error.not-email-form": "Please fill in a valid email address", "forgot-email.form.email.error.not-email-form": "Indique um endereço de correio eletrónico válido", - + // "forgot-email.form.email.hint": "An email will be sent to this address with a further instructions.", "forgot-email.form.email.hint": "Será enviada uma mensagem para este endereço de correio electrónico com mais instruções", - + // "forgot-email.form.submit": "Reset password", "forgot-email.form.submit": "Repor senha de acesso", - + // "forgot-email.form.success.head": "Password reset email sent", "forgot-email.form.success.head": "Foi enviada mensagem para redefinição da senha de acesso", - + // "forgot-email.form.success.content": "An email has been sent to {{ email }} containing a special URL and further instructions.", "forgot-email.form.success.content": "Foi enviado uma mensagem para {{ email }} com instruções e um endereço para validação da sua conta de utilizador.", - + // "forgot-email.form.error.head": "Error when trying to reset password", "forgot-email.form.error.head": "Ocorreu um erro ao tentar redefinir a senha de acesso", // "forgot-email.form.error.content": "An error occured when attempting to reset the password for the account associated with the following email address: {{ email }}", - "forgot-email.form.error.content": "Ocorreu um erro ao tentar redefinir a senha de acesso da conta associada com o seguinte endereço de email: {{ email }}", + "forgot-email.form.error.content": "Ocorreu um erro ao tentar redefinir a senha de acesso da conta associada com o seguinte endereço de email: {{ email }}", // "forgot-password.title": "Forgot Password", "forgot-password.title": "Esqueci a senha de acesso", - + // "forgot-password.form.head": "Forgot Password", "forgot-password.form.head": "Esqueci a Senha de acesso", - + // "forgot-password.form.info": "Enter a new password in the box below, and confirm it by typing it again into the second box.", "forgot-password.form.info": "Introduza uma nova senha na caixa em baixo, e depois confirme introduzindo de novo na segunda caixa. Deverá ter pelo menos 6 caracteres.", - + // "forgot-password.form.card.security": "Security", "forgot-password.form.card.security": "Senha de acesso", - + // "forgot-password.form.identification.header": "Identify", "forgot-password.form.identification.header": "Identificação", // "forgot-password.form.identification.email": "Email address: ", "forgot-password.form.identification.email": "Endereço de correio eletrónico: ", - + // "forgot-password.form.label.password": "Password", "forgot-password.form.label.password": "Palavra-chave", // "forgot-password.form.label.passwordrepeat": "Retype to confirm", "forgot-password.form.label.passwordrepeat": "Insira a senha novamente para confirmar", - + // "forgot-password.form.error.empty-password": "Please enter a password in the box below.", "forgot-password.form.error.empty-password": "Indique uma senha na caixa abaixo.", - + // "forgot-password.form.error.matching-passwords": "The passwords do not match.", - "forgot-password.form.error.matching-passwords": "As palavras de acesso não coincidem.", - + "forgot-password.form.error.matching-passwords": "As palavras de acesso não coincidem.", + // "forgot-password.form.notification.error.title": "Error when trying to submit new password", "forgot-password.form.notification.error.title": "Erro ao submeter nova senha de acesso", - + // "forgot-password.form.notification.success.content": "The password reset was successful. You have been logged in as the created user.", "forgot-password.form.notification.success.content": "A recuperação da senha foi efetuada com sucesso. Foi iniciada sessão com o utilizador criado.", - + // "forgot-password.form.notification.success.title": "Password reset completed", "forgot-password.form.notification.success.title": "Recuperação da senha efetuada com sucesso", - + // "forgot-password.form.submit": "Submit password", "forgot-password.form.submit": "Enviar senha", - + // "form.add": "Add more", "form.add": "Adicionar mais", - + // "form.add-help": "Click here to add the current entry and to add another one", "form.add-help": "Clique aqui para submeter esta entrada e adicionar uma nova", @@ -2446,13 +2446,13 @@ // "form.clear-help": "Click here to remove the selected value", "form.clear-help": "Clique aqui para apagar o valor selecionado", - + // "form.discard": "Discard", "form.discard": "Cancelar", // "form.drag": "Drag", - "form.drag": "Arrastar", - + "form.drag": "Arrastar", + // "form.edit": "Edit", "form.edit": "Editar", @@ -2479,7 +2479,7 @@ // "form.loading": "Loading...", "form.loading": "Carregando...", - + // "form.lookup": "Lookup", "form.lookup": "Consulta", @@ -2491,7 +2491,7 @@ // "form.no-value": "No value entered", "form.no-value": "Nenhum valor informado", - + // "form.other-information": {}, "form.other-information": {}, @@ -2500,10 +2500,10 @@ // "form.save": "Save", "form.save": "Guardar", - + // "form.save-help": "Save changes", "form.save-help": "Guardar alterações", - + // "form.search": "Search", "form.search": "Pesquisar", @@ -2523,7 +2523,7 @@ "grant-deny-request-copy.email.back": "Voltar", // "grant-deny-request-copy.email.message": "Message", - "grant-deny-request-copy.email.message": "Mensagem", + "grant-deny-request-copy.email.message": "Mensagem", // "grant-deny-request-copy.email.message.empty": "Please enter a message", "grant-deny-request-copy.email.message.empty": "Por favor insira uma mensagem", @@ -2578,9 +2578,9 @@ // "grant-request-copy.success": "Successfully granted item request", "grant-request-copy.success": "Pedido de cópia concedido com sucesso!", - - // "health.breadcrumbs": "Health", - "health.breadcrumbs": "Diagnóstico do sistema", + + // "health.breadcrumbs": "Health", + "health.breadcrumbs": "Diagnóstico do sistema", // "health-page.heading": "Health", "health-page.heading": "Diagnóstico do sistema", @@ -2593,7 +2593,7 @@ // "health-page.error.msg": "The health check service is temporarily unavailable", "health-page.error.msg": "O serviço de diagnóstico está temporariamente indisponível", - + // "health-page.property.status": "Status code", "health-page.property.status": "Código Estado", @@ -2637,35 +2637,35 @@ "health-page.title": "Diagnóstico do sistema", // "health-page.section.no-issues": "No issues detected", - "health-page.section.no-issues": "Nenhum problema detetado", - + "health-page.section.no-issues": "Nenhum problema detetado", + // "home.description": "", "home.description": "", // "home.breadcrumbs": "Home", "home.breadcrumbs": "Página inicial", - + //"home.search-form.placeholder": "Search the repository...", "home.search-form.placeholder": "pesquisar no repositório...", // "home.title": "Home", "home.title": "Página inicial", - + // "home.top-level-communities.head": "Communities in DSpace", "home.top-level-communities.head": "Comunidades", - + // "home.top-level-communities.help": "Select a community to browse its collections.", "home.top-level-communities.help": "Selecione uma comunidade para navegar nas suas coleções", // "info.end-user-agreement.accept": "I have read and I agree to the End User Agreement", "info.end-user-agreement.accept": "Li e aceito os 'Termos de Uso'", - + // "info.end-user-agreement.accept.error": "An error occurred accepting the End User Agreement", "info.end-user-agreement.accept.error": "Ocorreu um erro ao aceitar os 'Termos de Uso'", - + // "info.end-user-agreement.accept.success": "Successfully updated the End User Agreement", "info.end-user-agreement.accept.success": "'Termos de Uso' atualizados com sucesso", - + // "info.end-user-agreement.breadcrumbs": "End User Agreement", "info.end-user-agreement.breadcrumbs": "Termos de Uso", @@ -2689,7 +2689,7 @@ // "info.privacy.title": "Privacy Statement", "info.privacy.title": "Política de Privacidade", - + // "info.feedback.breadcrumbs": "Feedback", "info.feedback.breadcrumbs": "Contacte-nos", @@ -2722,22 +2722,22 @@ // "info.feedback.error.message.required": "A comment is required", "info.feedback.error.message.required": "Deve inserir uma mensagem", - + // "info.feedback.page-label": "Page", "info.feedback.page-label": "Página/URL de contexo:", - // "info.feedback.page_help": "The page related to your feedback", + // "info.feedback.page_help": "The page related to your feedback", "info.feedback.page_help": "Esta é a página/URL que contextualiza o seu contacto.", - + // "item.alerts.private": "This item is non-discoverable", "item.alerts.private": "Este item é privado", // "item.alerts.withdrawn": "This item has been withdrawn", "item.alerts.withdrawn": "Este item foi retirado", - + // "item.edit.authorizations.heading": "With this editor you can view and alter the policies of an item, plus alter policies of individual item components: bundles and bitstreams. Briefly, an item is a container of bundles, and bundles are containers of bitstreams. Containers usually have ADD/REMOVE/READ/WRITE policies, while bitstreams only have READ/WRITE policies.", "item.edit.authorizations.heading": "Com este editor pode ver e alterar as políticas de um item, bem como alterar políticas de componentes individuais do item: 'pacotes' (bundles) e 'ficheiros' (bitstreams). Em resumo, um item contém 'pacotes' e os pacotes contêm 'ficheiros'. Os pacotes usualmente possuem políticas de ADICIONAR/REMOVER/LER/ESCREVER, por outro lado, os ficheiros apenas possuem políticas de LER/ESCREVER.", - + // "item.edit.authorizations.title": "Edit item's Policies", "item.edit.authorizations.title": "Editar políticas dos itens", @@ -2745,11 +2745,11 @@ "item.badge.private": "Privado", // "item.badge.withdrawn": "Withdrawn", - "item.badge.withdrawn": "Retirado", - + "item.badge.withdrawn": "Retirado", + // "item.bitstreams.upload.bundle": "Bundle", "item.bitstreams.upload.bundle": "Pacote", - + // "item.bitstreams.upload.bundle.placeholder": "Select a bundle or input new bundle name", "item.bitstreams.upload.bundle.placeholder": "Selecione um pacote ou insira o nome de um pacote novo", @@ -2773,19 +2773,19 @@ // "item.bitstreams.upload.notifications.bundle.created.title": "Created bundle", "item.bitstreams.upload.notifications.bundle.created.title": "Pacote criado", - + // "item.bitstreams.upload.notifications.upload.failed": "Upload failed. Please verify the content before retrying.", "item.bitstreams.upload.notifications.upload.failed": "O carregamento falhou. Verifique os ficheiro antes de tentar carregar de novo.", - + // "item.bitstreams.upload.title": "Upload bitstream", "item.bitstreams.upload.title": "Carregar ficheiro(s)", - + // "item.edit.bitstreams.bundle.edit.buttons.upload": "Upload", "item.edit.bitstreams.bundle.edit.buttons.upload": "Carregar", // "item.edit.bitstreams.bundle.displaying": "Currently displaying {{ amount }} bitstreams of {{ total }}.", "item.edit.bitstreams.bundle.displaying": "Atualmente a mostrar {{ amount }} ficheiros de {{ total }}.", - + // "item.edit.bitstreams.bundle.load.all": "Load all ({{ total }})", "item.edit.bitstreams.bundle.load.all": "Carregar todos ({{ total }})", @@ -2797,7 +2797,7 @@ // "item.edit.bitstreams.discard-button": "Discard", "item.edit.bitstreams.discard-button": "Cancelar", - + // "item.edit.bitstreams.edit.buttons.download": "Download", "item.edit.bitstreams.edit.buttons.download": "Descarregar", @@ -2812,7 +2812,7 @@ // "item.edit.bitstreams.edit.buttons.undo": "Undo changes", "item.edit.bitstreams.edit.buttons.undo": "Cancelar alterações", - + // "item.edit.bitstreams.empty": "This item doesn't contain any bitstreams. Click the upload button to create one.", "item.edit.bitstreams.empty": "Este item não possui ficheiros. Carregue um novo ficheiro.", @@ -2863,7 +2863,7 @@ // "item.edit.bitstreams.reinstate-button": "Undo", "item.edit.bitstreams.reinstate-button": "Cancelar", - + // "item.edit.bitstreams.save-button": "Save", "item.edit.bitstreams.save-button": "Guardar", @@ -2890,19 +2890,19 @@ // "item.edit.head": "Edit Item", "item.edit.head": "Editar item", - + // "item.edit.breadcrumbs": "Edit Item", "item.edit.breadcrumbs": "Editar item", - + // "item.edit.tabs.disabled.tooltip": "You're not authorized to access this tab", "item.edit.tabs.disabled.tooltip": "Não está autorizado a aceder a esta área!", - + // "item.edit.tabs.mapper.head": "Collection Mapper", "item.edit.tabs.mapper.head": "Mapeamento de coleção", - + // "item.edit.tabs.item-mapper.title": "Item Edit - Collection Mapper", "item.edit.tabs.item-mapper.title": "Editar item - Mapeamento de coleção", - + // "item.edit.identifiers.doi.status.UNKNOWN": "Unknown", "item.edit.identifiers.doi.status.UNKNOWN": "Desconhecido", @@ -2968,19 +2968,19 @@ // "item.edit.item-mapper.buttons.add": "Map item to selected collections", "item.edit.item-mapper.buttons.add": "Mapear item para coleção(ões) selecionada(s)", - + // "item.edit.item-mapper.buttons.remove": "Remove item's mapping for selected collections", "item.edit.item-mapper.buttons.remove": "Remover mapeamento(s) na(s) coleção(ões) selecionada(s)", - + // "item.edit.item-mapper.cancel": "Cancel", "item.edit.item-mapper.cancel": "Cancelar", // "item.edit.item-mapper.description": "This is the item mapper tool that allows administrators to map this item to other collections. You can search for collections and map them, or browse the list of collections the item is currently mapped to.", "item.edit.item-mapper.description": "Esta ferramenta permite mapear itens para outras coleções. Pode procurar coleções e mapeá-las ou navegar na lista de coleções nas quais o item está atualmente mapeado.", - + // "item.edit.item-mapper.head": "Item Mapper - Map Item to Collections", "item.edit.item-mapper.head": "Mapeador de item - Mapear itens em coleções", - + // "item.edit.item-mapper.item": "Item: \"{{name}}\"", "item.edit.item-mapper.item": "Item: \"{{name}}\"", @@ -3010,10 +3010,10 @@ // "item.edit.item-mapper.notifications.remove.success.head": "Removal of mapping completed", "item.edit.item-mapper.notifications.remove.success.head": "Completou a remoção de mapeamento", - + // "item.edit.item-mapper.search-form.placeholder": "Search collections...", "item.edit.item-mapper.search-form.placeholder": "Pesquisar coleções...", - + // "item.edit.item-mapper.tabs.browse": "Browse mapped collections", "item.edit.item-mapper.tabs.browse": "Navegar nas coleções mapeadas", @@ -3031,7 +3031,7 @@ // "item.edit.metadata.edit.buttons.drag": "Drag to reorder", "item.edit.metadata.edit.buttons.drag": "Arrastar para reordenar", - + // "item.edit.metadata.edit.buttons.edit": "Edit", "item.edit.metadata.edit.buttons.edit": "Editar", @@ -3043,7 +3043,7 @@ // "item.edit.metadata.edit.buttons.unedit": "Stop editing", "item.edit.metadata.edit.buttons.unedit": "Parar edição", - + // "item.edit.metadata.edit.buttons.virtual": "This is a virtual metadata value, i.e. a value inherited from a related entity. It can’t be modified directly. Add or remove the corresponding relationship in the \"Relationships\" tab", "item.edit.metadata.edit.buttons.virtual": "Este é um valor de metadados virtual, ou seja, um valor herdado de uma entidade relacionada. Não pode ser modificado diretamente. Adicionar ou remover a relação correspondente no separador 'Relacionamentos'", @@ -3055,13 +3055,13 @@ // "item.edit.metadata.headers.field": "Field", "item.edit.metadata.headers.field": "Campo (metadado)", - + // "item.edit.metadata.headers.language": "Lang", "item.edit.metadata.headers.language": "Idioma", // "item.edit.metadata.headers.value": "Value", "item.edit.metadata.headers.value": "Valor", - + // "item.edit.metadata.metadatafield.error": "An error occurred validating the metadata field", "item.edit.metadata.metadatafield.error": "Ocorreu um erro ao validar o campo de metadados", @@ -3070,40 +3070,40 @@ // "item.edit.metadata.notifications.discarded.content": "Your changes were discarded. To reinstate your changes click the 'Undo' button", "item.edit.metadata.notifications.discarded.content": "As suas alterações foram descartadas. Para restabelecer suas alterações, clique no botão 'Desfazer'", - + // "item.edit.metadata.notifications.discarded.title": "Changes discarded", "item.edit.metadata.notifications.discarded.title": "Mudança descartada", - + // "item.edit.metadata.notifications.error.title": "An error occurred", "item.edit.metadata.notifications.error.title": "Ocorreu um erro!", - + // "item.edit.metadata.notifications.invalid.content": "Your changes were not saved. Please make sure all fields are valid before you save.", "item.edit.metadata.notifications.invalid.content": "As suas alterações não foram guardadas! Verifique se todos os campos são válidos antes de guardar.", - + // "item.edit.metadata.notifications.invalid.title": "Metadata invalid", "item.edit.metadata.notifications.invalid.title": "Metadado inválido", // "item.edit.metadata.notifications.outdated.content": "The item you're currently working on has been changed by another user. Your current changes are discarded to prevent conflicts", "item.edit.metadata.notifications.outdated.content": "O registo em que está a trabalhar foi alterado por outro utilizador. As suas alterações serão descartadas para evitar conflitos", - + // "item.edit.metadata.notifications.outdated.title": "Changes outdated", "item.edit.metadata.notifications.outdated.title": "Alteração desatualizada", // "item.edit.metadata.notifications.saved.content": "Your changes to this item's metadata were saved.", "item.edit.metadata.notifications.saved.content": "As alterações que realizou nos metadados deste registo foram salvas.", - + // "item.edit.metadata.notifications.saved.title": "Metadata saved", "item.edit.metadata.notifications.saved.title": "Metadados salvos", // "item.edit.metadata.reinstate-button": "Undo", "item.edit.metadata.reinstate-button": "Desfazer", - + // "item.edit.metadata.reset-order-button": "Undo reorder", "item.edit.metadata.reset-order-button": "Desfazer reordenamento", - + // "item.edit.metadata.save-button": "Save", "item.edit.metadata.save-button": "Guardar", - + // "item.edit.modify.overview.field": "Field", "item.edit.modify.overview.field": "Campo", @@ -3112,16 +3112,16 @@ // "item.edit.modify.overview.value": "Value", "item.edit.modify.overview.value": "Valor", - + // "item.edit.move.cancel": "Back", "item.edit.move.cancel": "Cancelar", - + // "item.edit.move.save-button": "Save", "item.edit.move.save-button": "Guardar", - + // "item.edit.move.discard-button": "Discard", - "item.edit.move.discard-button": "Cancelar", - + "item.edit.move.discard-button": "Cancelar", + // "item.edit.move.description": "Select the collection you wish to move this item to. To narrow down the list of displayed collections, you can enter a search query in the box.", "item.edit.move.description": "Selecione a coleção para a qual você deseja mover este item. Para restringir a lista de coleções exibidas, você pode inserir uma consulta de pesquisa na caixa.", @@ -3154,40 +3154,40 @@ // "item.edit.private.cancel": "Cancel", "item.edit.private.cancel": "Cancelar", - + // "item.edit.private.confirm": "Make it non-discoverable", "item.edit.private.confirm": "Tornar Privado", - + // "item.edit.private.description": "Are you sure this item should be made non-discoverable in the archive?", "item.edit.private.description": "Tem certeza de que este item deve ser tornado privado?", - + // "item.edit.private.error": "An error occurred while making the item non-discoverable", "item.edit.private.error": "Ocorreu um erro ao tornar o item privado", - + // "item.edit.private.header": "Make item non-discoverable: {{ id }}", "item.edit.private.header": "Tornar privado o item: {{ id }}", - + // "item.edit.private.success": "The item is now non-discoverable", "item.edit.private.success": "O item agora é privado", - + // "item.edit.public.cancel": "Cancel", "item.edit.public.cancel": "Cancelar", - + // "item.edit.public.confirm": "Make it discoverable", "item.edit.public.confirm": "Tornar público", - + // "item.edit.public.description": "Are you sure this item should be made discoverable in the archive?", "item.edit.public.description": "Você tem certeza que deseja tornar este item público?", - + // "item.edit.public.error": "An error occurred while making the item discoverable", "item.edit.public.error": "Ocorreu um erro ao tornar o item público", - + // "item.edit.public.header": "Make item discoverable: {{ id }}", "item.edit.public.header": "Tornar público o item: {{ id }}", - + // "item.edit.public.success": "The item is now discoverable", "item.edit.public.success": "O item agora é público!", - + // "item.edit.reinstate.cancel": "Cancel", "item.edit.reinstate.cancel": "Cancelar", @@ -3205,10 +3205,10 @@ // "item.edit.reinstate.success": "The item was reinstated successfully", "item.edit.reinstate.success": "O item foi restabelecido com sucesso", - + // "item.edit.relationships.discard-button": "Discard", "item.edit.relationships.discard-button": "Cancelar", - + // "item.edit.relationships.edit.buttons.add": "Add", "item.edit.relationships.edit.buttons.add": "Adicionar", @@ -3217,16 +3217,16 @@ // "item.edit.relationships.edit.buttons.undo": "Undo changes", "item.edit.relationships.edit.buttons.undo": "Cancelar alterações", - + // "item.edit.relationships.no-relationships": "No relationships", "item.edit.relationships.no-relationships": "Sem relações", // "item.edit.relationships.notifications.discarded.content": "Your changes were discarded. To reinstate your changes click the 'Undo' button", "item.edit.relationships.notifications.discarded.content": "Suas alterações foram canceladas. Para restabelecer suas alterações, clique no botão 'Cancelar'", - + // "item.edit.relationships.notifications.discarded.title": "Changes discarded", "item.edit.relationships.notifications.discarded.title": "Alterações canceladas", - + // "item.edit.relationships.notifications.failed.title": "Error editing relationships", "item.edit.relationships.notifications.failed.title": "Erro ao apagar relação", @@ -3247,16 +3247,16 @@ // "item.edit.relationships.save-button": "Save", "item.edit.relationships.save-button": "Guardar", - + // "item.edit.relationships.no-entity-type": "Add 'dspace.entity.type' metadata to enable relationships for this item", "item.edit.relationships.no-entity-type": "Adicione o metadado 'dspace.entity.type' para ativar relações neste item!", - - // "item.edit.return": "Back", + + // "item.edit.return": "Back", "item.edit.return": "Voltar", - + // "item.edit.tabs.bitstreams.head": "Bitstreams", "item.edit.tabs.bitstreams.head": "Ficheiros do item", - + // "item.edit.tabs.bitstreams.title": "Item Edit - Bitstreams", "item.edit.tabs.bitstreams.title": "Editar Item - Ficheiros", @@ -3265,28 +3265,28 @@ // "item.edit.tabs.curate.title": "Item Edit - Curate", "item.edit.tabs.curate.title": "Editar item - Curadoria", - + // "item.edit.tabs.metadata.head": "Metadata", "item.edit.tabs.metadata.head": "Metadados do item", - + // "item.edit.tabs.metadata.title": "Item Edit - Metadata", "item.edit.tabs.metadata.title": "Editar Item - Metadados", // "item.edit.tabs.relationships.head": "Relationships", "item.edit.tabs.relationships.head": "Relações do item", - + // "item.edit.tabs.relationships.title": "Item Edit - Relationships", "item.edit.tabs.relationships.title": "Editar Item - Relacionamentos", // "item.edit.tabs.status.buttons.authorizations.button": "Authorizations...", "item.edit.tabs.status.buttons.authorizations.button": "Permissões...", - + // "item.edit.tabs.status.buttons.authorizations.label": "Edit item's authorization policies", "item.edit.tabs.status.buttons.authorizations.label": "Editar políticas de permissões de item", - + // "item.edit.tabs.status.buttons.delete.button": "Permanently delete", "item.edit.tabs.status.buttons.delete.button": "Apagar definitivamente", - + // "item.edit.tabs.status.buttons.delete.label": "Completely expunge item", "item.edit.tabs.status.buttons.delete.label": "Eliminar completamente o item", @@ -3295,22 +3295,22 @@ // "item.edit.tabs.status.buttons.mappedCollections.label": "Manage mapped collections", "item.edit.tabs.status.buttons.mappedCollections.label": "Gerir coleções mapeadas", - + // "item.edit.tabs.status.buttons.move.button": "Move this Item to a different Collection", "item.edit.tabs.status.buttons.move.button": "Mover este item para outra coleção", - + // "item.edit.tabs.status.buttons.move.label": "Move item to another collection", "item.edit.tabs.status.buttons.move.label": "Mover item para outra coleção", - + // "item.edit.tabs.status.buttons.private.button": "Make it non-discoverable...", "item.edit.tabs.status.buttons.private.button": "Tornar o item privado...", - + // "item.edit.tabs.status.buttons.private.label": "Make item non-discoverable", "item.edit.tabs.status.buttons.private.label": "Tornar o item privado", - + // "item.edit.tabs.status.buttons.public.button": "Make it discoverable...", "item.edit.tabs.status.buttons.public.button": "Tornar público o item...", - + // "item.edit.tabs.status.buttons.public.label": "Make item discoverable", "item.edit.tabs.status.buttons.public.label": "Tornar público o item", @@ -3319,31 +3319,31 @@ // "item.edit.tabs.status.buttons.reinstate.label": "Reinstate item into the repository", "item.edit.tabs.status.buttons.reinstate.label": "Restabelecer item no repositório", - + // "item.edit.tabs.status.buttons.unauthorized": "You're not authorized to perform this action", "item.edit.tabs.status.buttons.unauthorized": "Não possui autorizações para realizar esta ação!", - + // "item.edit.tabs.status.buttons.withdraw.button": "Withdraw this item", "item.edit.tabs.status.buttons.withdraw.button": "Retirar este item", // "item.edit.tabs.status.buttons.withdraw.label": "Withdraw item from the repository", "item.edit.tabs.status.buttons.withdraw.label": "Retirar item da vista pública do repositório", - + // "item.edit.tabs.status.description": "Welcome to the item management page. From here you can withdraw, reinstate, move or delete the item. You may also update or add new metadata / bitstreams on the other tabs.", "item.edit.tabs.status.description": "Bem-vindo à página de gestão de itens. Nesta área, pode retirar, restabelecer, mover ou apagar definitivamente o item. Adicionalmente, também pode atualizar ou adicionar novos metadados / bitstreams percorrendo pelas outras abas.", - + // "item.edit.tabs.status.head": "Status", "item.edit.tabs.status.head": "Estado do item", - + // "item.edit.tabs.status.labels.handle": "Handle", "item.edit.tabs.status.labels.handle": "Handle", // "item.edit.tabs.status.labels.id": "Item Internal ID", "item.edit.tabs.status.labels.id": "ID Interno do item", - + // "item.edit.tabs.status.labels.itemPage": "Item Page", "item.edit.tabs.status.labels.itemPage": "Página do item", - + // "item.edit.tabs.status.labels.lastModified": "Last Modified", "item.edit.tabs.status.labels.lastModified": "Ultima alteração", @@ -3352,13 +3352,13 @@ // "item.edit.tabs.versionhistory.head": "Version History", "item.edit.tabs.versionhistory.head": "Histórico de versões", - + // "item.edit.tabs.versionhistory.title": "Item Edit - Version History", "item.edit.tabs.versionhistory.title": "Edições do Item - Histórico de versões", - + // "item.edit.tabs.versionhistory.under-construction": "Editing or adding new versions is not yet possible in this user interface.", "item.edit.tabs.versionhistory.under-construction": "Editar ou adicionar novas versões ainda não é possível neste interface de utilizador.", - + // "item.edit.tabs.view.head": "View Item", "item.edit.tabs.view.head": "Visualizar Item", @@ -3382,22 +3382,22 @@ // "item.edit.withdraw.success": "The item was withdrawn successfully", "item.edit.withdraw.success": "O item foi retirado com sucesso!", - + // "item.orcid.return": "Back", "item.orcid.return": "Voltar", - + // "item.listelement.badge": "Item", "item.listelement.badge": "Item", // "item.page.description": "Description", "item.page.description": "Descrição", - + // "item.page.journal-issn": "Journal ISSN", "item.page.journal-issn": "ISSN da revista", - + // "item.page.journal-title": "Journal Title", "item.page.journal-title": "Título da revista", - + // "item.page.publisher": "Publisher", "item.page.publisher": "Editora", @@ -3409,19 +3409,19 @@ // "item.search.results.head": "Item Search Results", "item.search.results.head": "Resultados da pesquisa de item", - + // "item.search.title": "Item Search", "item.search.title": "Pesquisa de item", - + // "item.truncatable-part.show-more": "Show more", "item.truncatable-part.show-more": "Mostrar mais", // "item.truncatable-part.show-less": "Collapse", "item.truncatable-part.show-less": "Colapsar", - + // "workflow-item.search.result.delete-supervision.modal.header": "Delete Supervision Order", "workflow-item.search.result.delete-supervision.modal.header": "Eliminar ordem de supervisão", - + // "workflow-item.search.result.delete-supervision.modal.info": "Are you sure you want to delete Supervision Order", "workflow-item.search.result.delete-supervision.modal.info": "Tem a certeza de que quer remover a ordem de supervisão", @@ -3454,13 +3454,13 @@ // "item.page.collections": "Collections", "item.page.collections": "Coleções", - + // "item.page.collections.loading": "Loading...", "item.page.collections.loading": "A carregar...", - + // "item.page.collections.load-more": "Load more", "item.page.collections.load-more": "Carregar mais", - + // "item.page.date": "Date", "item.page.date": "Data", @@ -3475,7 +3475,7 @@ // "item.page.filesection.download": "Download", "item.page.filesection.download": "Ver/Abrir", - + // "item.page.filesection.format": "Format:", "item.page.filesection.format": "Formato:", @@ -3493,13 +3493,13 @@ // "item.page.link.simple": "Simple item page", "item.page.link.simple": "Ver registo simples", - + // "item.page.orcid.title": "ORCID", "item.page.orcid.title": "ORCID", // "item.page.orcid.tooltip": "Open ORCID setting page", "item.page.orcid.tooltip": "Abrir página de configuração do ORCID", - + // "item.page.person.search.title": "Articles by this author", "item.page.person.search.title": "Artigos deste autor", @@ -3517,10 +3517,10 @@ // "item.page.relationships.isOrgUnitOfPerson": "Authors", "item.page.relationships.isOrgUnitOfPerson": "Autores", - + // "item.page.relationships.isOrgUnitOfProject": "Research Projects", "item.page.relationships.isOrgUnitOfProject": "Projetos de investigação", - + // "item.page.subject": "Keywords", "item.page.subject": "Palavras-chave", @@ -3538,7 +3538,7 @@ // "item.page.filesection.license.bundle": "License bundle", "item.page.filesection.license.bundle": "Licença", - + // "item.page.return": "Back", "item.page.return": "Voltar", @@ -3546,14 +3546,14 @@ "item.page.version.create": "Criar nova versão", // "item.page.version.hasDraft": "A new version cannot be created because there is an inprogress submission in the version history", - "item.page.version.hasDraft": "Um nova versão não pode ser criada porque já se encontra uma submisão em curso no histórico de versões.", - + "item.page.version.hasDraft": "Um nova versão não pode ser criada porque já se encontra uma submisão em curso no histórico de versões.", + // "item.page.claim.button": "Claim", "item.page.claim.button": "Reivindicar", // "item.page.claim.tooltip": "Claim this item as profile", "item.page.claim.tooltip": "Reivindicar este item como perfil", - + // "item.preview.dc.identifier.uri": "Identifier:", "item.preview.dc.identifier.uri": "Identificador:", @@ -3577,10 +3577,10 @@ // "item.preview.dc.title": "Title:", "item.preview.dc.title": "Título:", - + // "item.preview.dc.type": "Type:", "item.preview.dc.type": "Tipo:", - + // "item.preview.oaire.citation.issue": "Issue", "item.preview.oaire.citation.issue": "Issue", @@ -3588,17 +3588,17 @@ "item.preview.oaire.citation.volume": "Volume", // "item.preview.dc.relation.issn": "ISSN", - "item.preview.dc.relation.issn": "ISSN", - + "item.preview.dc.relation.issn": "ISSN", + // "item.preview.dc.relation.eissn": "EISSN", "item.preview.dc.relation.eissn": "EISSN", // "item.preview.dc.identifier.isbn": "ISBN", - "item.preview.dc.identifier.isbn": "ISBN", - + "item.preview.dc.identifier.isbn": "ISBN", + // "item.preview.dc.identifier.eisbn": "EISBN", "item.preview.dc.identifier.eisbn": "EISBN", - + // "item.preview.dc.identifier.tid": "TID", "item.preview.dc.identifier.tid": "TID", @@ -3609,8 +3609,8 @@ "item.preview.dc.relation.ispartof": "Revista ou Série", // "item.preview.dc.identifier.doi": "DOI", - "item.preview.dc.identifier.doi": "DOI", - + "item.preview.dc.identifier.doi": "DOI", + // "item.preview.person.familyName": "Surname:", "item.preview.person.familyName": "Apelido:", @@ -3619,7 +3619,7 @@ // "item.preview.person.identifier.orcid": "ORCID:", "item.preview.person.identifier.orcid": "ORCID:", - + // "item.preview.project.funder.name": "Funder:", "item.preview.project.funder.name": "Financiador:", @@ -3634,16 +3634,16 @@ // "item.preview.dc.coverage.spatial": "Jurisdiction:", "item.preview.dc.coverage.spatial": "Jurisdição:", - + // "item.preview.oaire.fundingStream": "Funding Stream:", "item.preview.oaire.fundingStream": "Linha de financiamento:", - + // "item.select.confirm": "Confirm selected", "item.select.confirm": "Confirmar seleção", // "item.select.empty": "No items to show", "item.select.empty": "Nenhum item para mostrar.", - + // "item.select.table.author": "Author", "item.select.table.author": "Autor", @@ -3652,19 +3652,19 @@ // "item.select.table.title": "Title", "item.select.table.title": "Título", - + // "item.version.history.empty": "There are no other versions for this item yet.", "item.version.history.empty": "Ainda não existem outras versões deste item.", - + // "item.version.history.head": "Version History", "item.version.history.head": "Histórico de versões", - + // "item.version.history.return": "Back", "item.version.history.return": "Voltar", // "item.version.history.selected": "Selected version", "item.version.history.selected": "Versão selecionada", - + // "item.version.history.selected.alert": "You are currently viewing version {{version}} of the item.", "item.version.history.selected.alert": "Está a ver a versão {{version}} do item.", @@ -3712,16 +3712,16 @@ // "item.version.history.table.action.hasDraft": "A new version cannot be created because there is an inprogress submission in the version history", "item.version.history.table.action.hasDraft": "Uma nova versão não pode ser criada porque se encontra um depósito em curso no histórico de versões", - + // "item.version.notice": "This is not the latest version of this item. The latest version can be found here.", "item.version.notice": "Esta não é a última versão deste item. A última versão pode ser encontrada aqui.", - + // "item.version.create.modal.header": "New version", "item.version.create.modal.header": "Nova versão", // "item.version.create.modal.text": "Create a new version for this item", "item.version.create.modal.text": "Criar uma nova versão para este item", - + // "item.version.create.modal.text.startingFrom": "starting from version {{version}}", "item.version.create.modal.text.startingFrom": "Iniciar a partir da versão {{version}}", @@ -3742,16 +3742,16 @@ // "item.version.create.modal.form.summary.placeholder": "Insert the summary for the new version", "item.version.create.modal.form.summary.placeholder": "Inserir o sumário para a nova versão", - - // "item.version.create.modal.submitted.header": "Creating new version...", - "item.version.create.modal.submitted.header": "Criar uma nova versão...", - // "item.version.create.modal.submitted.text": "The new version is being created. This may take some time if the item has a lot of relationships.", + // "item.version.create.modal.submitted.header": "Creating new version...", + "item.version.create.modal.submitted.header": "Criar uma nova versão...", + + // "item.version.create.modal.submitted.text": "The new version is being created. This may take some time if the item has a lot of relationships.", "item.version.create.modal.submitted.text": "A nova versão está a ser criada. Isto pode demorar algum tempo se o item tiver muitas relações.", // "item.version.create.notification.success": "New version has been created with version number {{version}}", "item.version.create.notification.success": "Nova versão foi criada com o número {{version}}", - + // "item.version.create.notification.failure": "New version has not been created", "item.version.create.notification.failure": "Nova versão não foi criada", @@ -3763,7 +3763,7 @@ // "item.version.delete.modal.text": "Do you want to delete version {{version}}?", "item.version.delete.modal.text": "Pretende remover a versão {{version}}?", - + // "item.version.delete.modal.button.confirm": "Delete", "item.version.delete.modal.button.confirm": "Remover", @@ -3775,7 +3775,7 @@ // "item.version.delete.modal.button.cancel.tooltip": "Do not delete this version", "item.version.delete.modal.button.cancel.tooltip": "Não remover esta versão", - + // "item.version.delete.notification.success": "Version number {{version}} has been deleted", "item.version.delete.notification.success": "A versão número {{version}} foi removida", @@ -3787,12 +3787,12 @@ // "item.version.edit.notification.failure": "The summary of version number {{version}} has not been changed", "item.version.edit.notification.failure": "O sumário da versão número {{version}} não foi alterado", - + // "itemtemplate.edit.metadata.add-button": "Add", "itemtemplate.edit.metadata.add-button": "Adicionar", // "itemtemplate.edit.metadata.discard-button": "Discard", - "itemtemplate.edit.metadata.discard-button": 'Rejeitar', + "itemtemplate.edit.metadata.discard-button": "Rejeitar", // "itemtemplate.edit.metadata.edit.buttons.confirm": "Confirm", "itemtemplate.edit.metadata.edit.buttons.confirm": "Confirmar", @@ -3868,7 +3868,7 @@ // "itemtemplate.edit.metadata.save-button": "Save", "itemtemplate.edit.metadata.save-button": "Guardar", - + // "journal.listelement.badge": "Journal", "journal.listelement.badge": "Revista", @@ -3889,19 +3889,19 @@ // "journal.page.titleprefix": "Journal: ", "journal.page.titleprefix": "Revista: ", - + // "journal.search.results.head": "Journal Search Results", "journal.search.results.head": "Resultado da pesquisa de revistas", - + // "journal-relationships.search.results.head": "Journal Search Results", "journal-relationships.search.results.head": "Resultado da pesquisa de revistas", - + // "journal.search.title": "Journal Search", "journal.search.title": "Pesquisa de revistas", - + // "journalissue.listelement.badge": "Journal Issue", "journalissue.listelement.badge": "Número de revista", - + // "journalissue.page.description": "Description", "journalissue.page.description": "Descrição", @@ -3910,25 +3910,25 @@ // "journalissue.page.issuedate": "Issue Date", "journalissue.page.issuedate": "Data de publicação", - + // "journalissue.page.journal-issn": "Journal ISSN", "journalissue.page.journal-issn": "ISSN da revista", - + // "journalissue.page.journal-title": "Journal Title", "journalissue.page.journal-title": "Título da revista", - + // "journalissue.page.keyword": "Keywords", "journalissue.page.keyword": "Palavras-chave", // "journalissue.page.number": "Number", "journalissue.page.number": "Número de páginas", - + // "journalissue.page.titleprefix": "Journal Issue: ", "journalissue.page.titleprefix": "Número de revista: ", - + // "journalvolume.listelement.badge": "Journal Volume", "journalvolume.listelement.badge": "Volume de revista", - + // "journalvolume.page.description": "Description", "journalvolume.page.description": "Descrição", @@ -3937,13 +3937,13 @@ // "journalvolume.page.issuedate": "Issue Date", "journalvolume.page.issuedate": "Data de publicação", - + // "journalvolume.page.titleprefix": "Journal Volume: ", "journalvolume.page.titleprefix": "Volume de revista: ", - + // "journalvolume.page.volume": "Volume", "journalvolume.page.volume": "Volume", - + // "iiifsearchable.listelement.badge": "Document Media", "iiifsearchable.listelement.badge": "Media do documeo", @@ -3974,9 +3974,9 @@ // "iiif.page.issue": "Issue: ", "iiif.page.issue": "Número: ", - // "iiif.page.description": "Description: ", - "iiif.page.description": "Description: ", - + // "iiif.page.description": "Description: ", + "iiif.page.description": "Description: ", + // "loading.bitstream": "Loading bitstream...", "loading.bitstream": "A carregar ficheiro...", @@ -4018,7 +4018,7 @@ // "loading.recent-submissions": "Loading recent submissions...", "loading.recent-submissions": "A carregar depósitos recentes...", - + // "loading.search-results": "Loading search results...", "loading.search-results": "A carregar resultados de pesquisa...", @@ -4042,22 +4042,22 @@ // "login.form.new-user": "New user? Click here to register.", "login.form.new-user": "Novo utilizador? Clique aqui para se registar.", - + // "login.form.or-divider": "or", "login.form.or-divider": "ou", - + // "login.form.oidc": "Log in with OIDC", "login.form.oidc": "Entrar com OIDC", - + // "login.form.orcid": "Log in with ORCID", "login.form.orcid": "Entrar com ORCID", - + // "login.form.password": "Password", "login.form.password": "Palavra-chave", // "login.form.shibboleth": "Log in with Shibboleth", "login.form.shibboleth": "Entrar com autenticação federada", - + // "login.form.submit": "Log in", "login.form.submit": "Entrar", @@ -4066,16 +4066,16 @@ // "login.breadcrumbs": "Login", "login.breadcrumbs": "Entrar", - + // "logout.form.header": "Log out from DSpace", "logout.form.header": "Sair do repositório", - + // "logout.form.submit": "Log out", "logout.form.submit": "Sair", // "logout.title": "Logout", "logout.title": "Sair", - + // "menu.header.admin": "Management", "menu.header.admin": "Administração", @@ -4084,10 +4084,10 @@ // "menu.header.admin.description": "Management menu", "menu.header.admin.description": "Menu de administração", - + // "menu.section.access_control": "Access Control", "menu.section.access_control": "Controlo de acesso", - + // "menu.section.access_control_authorizations": "Authorizations", "menu.section.access_control_authorizations": "Autorizações", @@ -4095,47 +4095,47 @@ "menu.section.access_control_groups": "Grupos", // "menu.section.access_control_people": "People", - "menu.section.access_control_people": "Pessoas", - + "menu.section.access_control_people": "Pessoas", + // "menu.section.admin_search": "Admin Search", "menu.section.admin_search": "Pesquisa administrativa", - + // "menu.section.browse_community": "This Community", "menu.section.browse_community": "Esta comunidade", - + // "menu.section.browse_community_by_author": "By Author", "menu.section.browse_community_by_author": "Por autor", - + // "menu.section.browse_community_by_issue_date": "By Issue Date", "menu.section.browse_community_by_issue_date": "Por data de publicação", - + // "menu.section.browse_community_by_title": "By Title", "menu.section.browse_community_by_title": "Por título", - + // "menu.section.browse_global": "All of DSpace", "menu.section.browse_global": "Percorrer repositório", - + // "menu.section.browse_global_by_author": "By Author", "menu.section.browse_global_by_author": "Por autor", - + // "menu.section.browse_global_by_dateissued": "By Issue Date", "menu.section.browse_global_by_dateissued": "Por data de publicação", - + // "menu.section.browse_global_by_subject": "By Subject", "menu.section.browse_global_by_subject": "Por assunto", - + // "menu.section.browse_global_by_title": "By Title", "menu.section.browse_global_by_title": "Por título", - + // "menu.section.browse_global_communities_and_collections": "Communities & Collections", "menu.section.browse_global_communities_and_collections": "Comunidades & Coleções", - + // "menu.section.control_panel": "Control Panel", "menu.section.control_panel": "Painel de controle", - + // "menu.section.curation_task": "Curation Task", "menu.section.curation_task": "Tarefas de curadoria", - + // "menu.section.edit": "Edit", "menu.section.edit": "Editar", @@ -4162,10 +4162,10 @@ // "menu.section.export_metadata": "Metadata", "menu.section.export_metadata": "Metadados", - + // "menu.section.export_batch": "Batch Export (ZIP)", "menu.section.export_batch": "Importação em lote (ZIP)", - + // "menu.section.icon.access_control": "Access Control menu section", "menu.section.icon.access_control": "Secção do menu Controle de Acesso", @@ -4174,10 +4174,10 @@ // "menu.section.icon.control_panel": "Control Panel menu section", "menu.section.icon.control_panel": "Secção do menu Painel de Controlo", - + // "menu.section.icon.curation_tasks": "Curation Task menu section", "menu.section.icon.curation_tasks": "Secção do menu tarefas de curadoria", - + // "menu.section.icon.edit": "Edit menu section", "menu.section.icon.edit": "Secção do menu Editar", @@ -4186,10 +4186,10 @@ // "menu.section.icon.find": "Find menu section", "menu.section.icon.find": "Secção do menu Pesquisar", - + // "menu.section.icon.health": "Health check menu section", "menu.section.icon.health": "Seção do menu Diagnóstico do sistema", - + // "menu.section.icon.import": "Import menu section", "menu.section.icon.import": "Secção do menu Importar", @@ -4198,31 +4198,31 @@ // "menu.section.icon.pin": "Pin sidebar", "menu.section.icon.pin": "Fixar barra lateral", - + // "menu.section.icon.processes": "Processes Health", "menu.section.icon.processes": "Processos diagnóstico", - + // "menu.section.icon.registries": "Registries menu section", "menu.section.icon.registries": "Secção do menu Registos", // "menu.section.icon.statistics_task": "Statistics Task menu section", "menu.section.icon.statistics_task": "Secção do menu Tarefas de Estatísticas", - + // "menu.section.icon.workflow": "Administer workflow menu section", "menu.section.icon.workflow": "Menu administração de tarefas", - + // "menu.section.icon.unpin": "Unpin sidebar", "menu.section.icon.unpin": "Soltar barra lateral", - + // "menu.section.import": "Import", "menu.section.import": "Importar", - + // "menu.section.import_batch": "Batch import (ZIP)", "menu.section.import_batch": "Importação em lote (ZIP)", - + // "menu.section.import_metadata": "Metadata", "menu.section.import_metadata": "Metadados", - + // "menu.section.new": "New", "menu.section.new": "Novo", @@ -4237,10 +4237,10 @@ // "menu.section.new_item_version": "Item Version", "menu.section.new_item_version": "Versão do item", - + // "menu.section.new_process": "Process", "menu.section.new_process": "Processos", - + // "menu.section.pin": "Pin sidebar", "menu.section.pin": "Fixar barra lateral", @@ -4249,10 +4249,10 @@ // "menu.section.processes": "Processes", "menu.section.processes": "Processos", - + // "menu.section.health": "Health", "menu.section.health": "Diagnóstico do sistema", - + // "menu.section.registries": "Registries", "menu.section.registries": "Registos", @@ -4267,55 +4267,55 @@ // "menu.section.statistics_task": "Statistics Task", "menu.section.statistics_task": "Tarefa de estatísticas", - + // "menu.section.toggle.access_control": "Toggle Access Control section", "menu.section.toggle.access_control": "Alternar secção controle de acesso", - + // "menu.section.toggle.control_panel": "Toggle Control Panel section", "menu.section.toggle.control_panel": "Alternar secção painel de controle", - + // "menu.section.toggle.curation_task": "Toggle Curation Task section", "menu.section.toggle.curation_task": "Alternar secção tarefas de curadoria", - + // "menu.section.toggle.edit": "Toggle Edit section", "menu.section.toggle.edit": "Alternar secção editar", - + // "menu.section.toggle.export": "Toggle Export section", "menu.section.toggle.export": "Alternar secção exportar", - + // "menu.section.toggle.find": "Toggle Find section", "menu.section.toggle.find": "Alternar secção pesquisa", - + // "menu.section.toggle.import": "Toggle Import section", "menu.section.toggle.import": "Alternar secção importar", - + // "menu.section.toggle.new": "Toggle New section", "menu.section.toggle.new": "Alternar nova secção", - + // "menu.section.toggle.registries": "Toggle Registries section", "menu.section.toggle.registries": "Alternar secção registos", - + // "menu.section.toggle.statistics_task": "Toggle Statistics Task section", "menu.section.toggle.statistics_task": "Alternar secção tarefas de estatísticas", - + // "menu.section.workflow": "Administer Workflow", "menu.section.workflow": "Gestão do workflow", - + // "metadata-export-search.tooltip": "Export search results as CSV", "metadata-export-search.tooltip": "Exportar resultados de pesquisa em CSV", - - // "metadata-export-search.submit.success": "The export was started successfully", + + // "metadata-export-search.submit.success": "The export was started successfully", "metadata-export-search.submit.success": "A exportação foi iniciada com sucesso", - + // "metadata-export-search.submit.error": "Starting the export has failed", "metadata-export-search.submit.error": "O início da exportação falhou!", - + // "mydspace.breadcrumbs": "MyDSpace", - "mydspace.breadcrumbs": "Área Pessoal", - + "mydspace.breadcrumbs": "Área Pessoal", + // "mydspace.description": "", "mydspace.description": "", - + // "mydspace.messages.controller-help": "Select this option to send a message to item's submitter.", "mydspace.messages.controller-help": "Selecione esta opção para enviar uma mensagem para o depositante do item.", @@ -4357,7 +4357,7 @@ // "mydspace.new-submission": "New submission", "mydspace.new-submission": "Novo depósito", - + // "mydspace.new-submission-external": "Import metadata from external source", "mydspace.new-submission-external": "Importar metadados de fontes externas", @@ -4366,7 +4366,7 @@ // "mydspace.results.head": "Your submissions", "mydspace.results.head": "Meus depósitos", - + // "mydspace.results.no-abstract": "No Abstract", "mydspace.results.no-abstract": "Sem Resumo", @@ -4375,13 +4375,13 @@ // "mydspace.results.no-collections": "No Collections", "mydspace.results.no-collections": "Sem coleções", - + // "mydspace.results.no-date": "No Date", "mydspace.results.no-date": "Sem data", - + // "mydspace.results.no-files": "No Files", "mydspace.results.no-files": "Sem ficheiros", - + // "mydspace.results.no-results": "There were no items to show", "mydspace.results.no-results": "Não havia itens a mostrar", @@ -4392,32 +4392,32 @@ "mydspace.results.no-uri": "Sem URI", // "mydspace.search-form.placeholder": "Search in mydspace...", - "mydspace.search-form.placeholder": "Pesquisar na Área Pessoal...", - + "mydspace.search-form.placeholder": "Pesquisar na Área Pessoal...", + // "mydspace.show.workflow": "Workflow tasks", "mydspace.show.workflow": "Todas as tarefas", // "mydspace.show.workspace": "Your Submissions", "mydspace.show.workspace": "Meus depósitos", - + // "mydspace.show.supervisedWorkspace": "Supervised items", "mydspace.show.supervisedWorkspace": "Itens supervisionados", - + // "mydspace.status.archived": "Archived", "mydspace.status.archived": "Depósito aceite", - + // "mydspace.status.validation": "Validation", "mydspace.status.validation": "Em validação", - + // "mydspace.status.waiting-for-controller": "Waiting for controller", "mydspace.status.waiting-for-controller": "Aguarda validador", - + // "mydspace.status.workflow": "Workflow", "mydspace.status.workflow": "Em fluxo de trabalho", - + // "mydspace.status.workspace": "Workspace", "mydspace.status.workspace": "Depósito por terminar", - + // "mydspace.title": "MyDSpace", "mydspace.title": "Área Pessoal", @@ -4435,31 +4435,31 @@ // "mydspace.view-btn": "View", "mydspace.view-btn": "Ver", - + // "nav.browse.header": "All of DSpace", "nav.browse.header": "Tudo no repositório", - + // "nav.community-browse.header": "By Community", "nav.community-browse.header": "Por comunidade", - + // "nav.context-help-toggle": "Toggle context help", "nav.context-help-toggle": "Alternar ajuda contextual", // "nav.language": "Language switch", "nav.language": "Escolher idioma", - + // "nav.login": "Log In", "nav.login": "Entrar", - + // "nav.user-profile-menu-and-logout": "User profile menu and Log Out", "nav.user-profile-menu-and-logout": "Menu perfil do utilizador e sair", - + // "nav.logout": "Log Out", "nav.logout": "Sair", - + // "nav.main.description": "Main navigation bar", "nav.main.description": "Barra de naveção principal", - + // "nav.mydspace": "MyDSpace", "nav.mydspace": "Área Pessoal", @@ -4476,8 +4476,8 @@ "nav.stop-impersonating": "Deixar de assumir o papel do utilizador", // "nav.subscriptions": "Subscriptions", - "nav.subscriptions": "Subscrições de alertas", - + "nav.subscriptions": "Subscrições de alertas", + // "nav.toggle": "Toggle navigation", "nav.toggle": "Alternar a navegação", @@ -4486,13 +4486,13 @@ // "none.listelement.badge": "Item", "none.listelement.badge": "Item", - + // "orgunit.listelement.badge": "Organizational Unit", "orgunit.listelement.badge": "Organização", - + // "orgunit.listelement.no-title": "Untitled", "orgunit.listelement.no-title": "Sem título", - + // "orgunit.page.city": "City", "orgunit.page.city": "Cidade", @@ -4513,10 +4513,10 @@ // "orgunit.page.titleprefix": "Organizational Unit: ", "orgunit.page.titleprefix": "Organização: ", - + // "pagination.options.description": "Pagination options", - "pagination.options.description": "Opções de paginação", - + "pagination.options.description": "Opções de paginação", + // "pagination.results-per-page": "Results Per Page", "pagination.results-per-page": "Resultados por página", @@ -4528,7 +4528,7 @@ // "pagination.sort-direction": "Sort Options", "pagination.sort-direction": "Opções de ordenação", - + // "person.listelement.badge": "Person", "person.listelement.badge": "Pessoa", @@ -4555,7 +4555,7 @@ // "person.page.name": "Name", "person.page.name": "Nome", - + // "person.page.link.full": "Show all metadata", "person.page.link.full": "Mostrar todos os metadados", @@ -4570,19 +4570,19 @@ // "person.search.results.head": "Person Search Results", "person.search.results.head": "Resultados da pesquisa de pessoas", - + // "person-relationships.search.results.head": "Person Search Results", "person-relationships.search.results.head": "Resultados da pesquisa de pessoas", - + // "person.search.title": "Person Search", "person.search.title": "Pesquisar pessoa", - + // "process.new.select-parameters": "Parameters", "process.new.select-parameters": "Parâmetros", // "process.new.cancel": "Cancel", "process.new.cancel": "Cancelar", - + // "process.new.submit": "Save", "process.new.submit": "Guardar", @@ -4678,7 +4678,7 @@ // "process.detail.create": "Create similar process", "process.detail.create": "Criar processo similar", - + // "process.detail.actions": "Actions", "process.detail.actions": "Ações", @@ -4700,21 +4700,21 @@ // "process.detail.delete.success": "The process was successfully deleted.", "process.detail.delete.success": "O processo foi removido com sucesso.", - // "process.detail.delete.error": "Something went wrong when deleting the process", - "process.detail.delete.error": "Ocorreu algum erro ao remover o processo", - + // "process.detail.delete.error": "Something went wrong when deleting the process", + "process.detail.delete.error": "Ocorreu algum erro ao remover o processo", + // "process.overview.table.finish": "Finish time (UTC)", "process.overview.table.finish": "Hora de término (UTC)", - + // "process.overview.table.id": "Process ID", "process.overview.table.id": "ID do Processo", // "process.overview.table.name": "Name", "process.overview.table.name": "Nome", - + // "process.overview.table.start": "Start time (UTC)", "process.overview.table.start": "Hora de início (UTC)", - + // "process.overview.table.status": "Status", "process.overview.table.status": "Estado", @@ -4723,13 +4723,13 @@ // "process.overview.title": "Processes Overview", "process.overview.title": "Resumo dos processos", - + // "process.overview.breadcrumbs": "Processes Overview", "process.overview.breadcrumbs": "Resumo dos processos", - + // "process.overview.new": "New", "process.overview.new": "Novo", - + // "process.overview.table.actions": "Actions", "process.overview.table.actions": "Ações", @@ -4756,34 +4756,34 @@ // "process.bulk.delete.success": "{{count}} process(es) have been succesfully deleted", "process.bulk.delete.success": "{{count}} processso(s) foram removidos com sucesso", - + // "profile.breadcrumbs": "Update Profile", "profile.breadcrumbs": "Atualizar perfil", - + // "profile.card.identify": "Identify", "profile.card.identify": "Identificação", // "profile.card.security": "Security", "profile.card.security": "Senha de acesso", - + // "profile.form.submit": "Save", "profile.form.submit": "Atualizar perfil", - + // "profile.groups.head": "Authorization groups you belong to", "profile.groups.head": "Os seus grupos", - + // "profile.special.groups.head": "Authorization special groups you belong to", "profile.special.groups.head": "Autorização de grupos especiais aos quais pertence", // "profile.head": "Update Profile", "profile.head": "Atualizar perfil", - + // "profile.metadata.form.error.firstname.required": "First Name is required", "profile.metadata.form.error.firstname.required": "O preenchimento do nome é um elemento obrigatório!", - + // "profile.metadata.form.error.lastname.required": "Last Name is required", "profile.metadata.form.error.lastname.required": "O preenchiento do apelido é um elemento obrigatório!", - + // "profile.metadata.form.label.email": "Email Address", "profile.metadata.form.label.email": "Endereço de correio eletrónico", @@ -4813,46 +4813,46 @@ // "profile.security.form.error.matching-passwords": "The passwords do not match.", "profile.security.form.error.matching-passwords": "As senhas não coincidem.", - + // "profile.security.form.info": "Optionally, you can enter a new password in the box below, and confirm it by typing it again into the second box.", "profile.security.form.info": "Opcionalmente, pode criar uma nova senha introduzindo-a primeira caixa de texto e confirmando-a na segunda caixa de texto.", - + // "profile.security.form.label.password": "Password", "profile.security.form.label.password": "Senha", - + // "profile.security.form.label.passwordrepeat": "Retype to confirm", "profile.security.form.label.passwordrepeat": "Insira novamente a senha para confirmar", - + // "profile.security.form.label.current-password": "Current password", "profile.security.form.label.current-password": "Senha atual", - + // "profile.security.form.notifications.success.content": "Your changes to the password were saved.", "profile.security.form.notifications.success.content": "As alterações da senha foram guardadas.", - + // "profile.security.form.notifications.success.title": "Password saved", "profile.security.form.notifications.success.title": "Senha guardada", - + // "profile.security.form.notifications.error.title": "Error changing passwords", "profile.security.form.notifications.error.title": "Erro ao mudar a senha", - + // "profile.security.form.notifications.error.change-failed": "An error occurred while trying to change the password. Please check if the current password is correct.", "profile.security.form.notifications.error.change-failed": "Ocorreu um erro ao tentar alterar a senha. Verifique se a senha atual está correcta.", - + // "profile.security.form.notifications.error.not-same": "The provided passwords are not the same.", "profile.security.form.notifications.error.not-same": "As senhas fornecidas não coincidem.", - + // "profile.security.form.notifications.error.general": "Please fill required fields of security form.", "profile.security.form.notifications.error.general": "Por favor preencha os campos obrigatórios no formulário de segurança.", - + // "profile.title": "Update Profile", "profile.title": "Atualizar perfil", - + // "profile.card.researcher": "Researcher Profile", "profile.card.researcher": "Perfil do investigador", - + // "project.listelement.badge": "Research Project", "project.listelement.badge": "Projeto de investigação", - + // "project.page.contributor": "Contributors", "project.page.contributor": "Contribuidores", @@ -4884,8 +4884,8 @@ "project.search.results.head": "Resultados da pesquisa de projetos", // "project-relationships.search.results.head": "Project Search Results", - "project-relationships.search.results.head": "Resultados da pesquisa de projetos", - + "project-relationships.search.results.head": "Resultados da pesquisa de projetos", + // "publication.listelement.badge": "Publication", "publication.listelement.badge": "Publicação", @@ -4897,10 +4897,10 @@ // "publication.page.journal-issn": "Journal ISSN", "publication.page.journal-issn": "ISSN da revista", - + // "publication.page.journal-title": "Journal Title", "publication.page.journal-title": "Título da revista", - + // "publication.page.publisher": "Publisher", "publication.page.publisher": "Editora", @@ -4912,10 +4912,10 @@ // "publication.search.results.head": "Publication Search Results", "publication.search.resuts.head": "Resultados da pesquisa de publicações", - + // "publication-relationships.search.results.head": "Publication Search Results", "publication-relationships.search.results.head": "Resultados da pesquisa de publicações", - + // "publication.search.title": "Publication Search", "publication.search.title": "Pesquisa de publicações", @@ -4927,10 +4927,10 @@ // "media-viewer.playlist": "Playlist", "media-viewer.playlist": "Playlist", - + // "register-email.title": "New user registration", "register-email.title": "Registo de novo utilizador", - + // "register-page.create-profile.header": "Create Profile", "register-page.create-profile.header": "Criar perfil", @@ -4939,31 +4939,31 @@ // "register-page.create-profile.identification.email": "Email Address", "register-page.create-profile.identification.email": "Endereço de correio eletrónico", - + // "register-page.create-profile.identification.first-name": "First Name *", "register-page.create-profile.identification.first-name": "Nome *", // "register-page.create-profile.identification.first-name.error": "Please fill in a First Name", "register-page.create-profile.identification.first-name.error": "Inclua um nome", - + // "register-page.create-profile.identification.last-name": "Last Name *", "register-page.create-profile.identification.last-name": "Apelido *", // "register-page.create-profile.identification.last-name.error": "Please fill in a Last Name", "register-page.create-profile.identification.last-name.error": "Inclua um apelido", - + // "register-page.create-profile.identification.contact": "Contact Telephone", "register-page.create-profile.identification.contact": "Contacto telefónico", - + // "register-page.create-profile.identification.language": "Language", "register-page.create-profile.identification.language": "Idioma", // "register-page.create-profile.security.header": "Security", "register-page.create-profile.security.header": "Segurança", - + // "register-page.create-profile.security.info": "Please enter a password in the box below, and confirm it by typing it again into the second box.", "register-page.create-profile.security.info": "Insira uma palavra-chave na caixa abaixo, e confirme colocando-a de novo da segunda caixa.", - + // "register-page.create-profile.security.label.password": "Password *", "register-page.create-profile.security.label.password": "Palavra-chave *", @@ -4981,33 +4981,33 @@ // "register-page.create-profile.submit.error.content": "Something went wrong while registering a new user.", "register-page.create-profile.submit.error.content": "Ocorreu um erro ao registar o utilizador.", - + // "register-page.create-profile.submit.error.head": "Registration failed", "register-page.create-profile.submit.error.head": "Falha no registo", - + // "register-page.create-profile.submit.success.content": "The registration was successful. You have been logged in as the created user.", "register-page.create-profile.submit.success.content": "O registo foi criado com sucesso. Foi iniciada sessão com o Utilizador criado.", // "register-page.create-profile.submit.success.head": "Registration completed", "register-page.create-profile.submit.success.head": "Registo finalizado com sucesso", - + // "register-page.registration.header": "New user registration", "register-page.registration.header": "Registo de novo utilizador", - + // "register-page.registration.info": "Register an account to subscribe to collections for email updates, and submit new items to DSpace.", "register-page.registration.info": "Crie uma conta de utilizador para subscrever novos conteúdos das coleções e depositar itens no repositório.", - + // "register-page.registration.email": "Email Address *", "register-page.registration.email": "Endereço de correio eletrónico *", - + // "register-page.registration.email.error.required": "Please fill in an email address", "register-page.registration.email.error.required": "Insira um endereço de correio eletrónico", - + // "register-page.registration.email.error.not-email-form": "Please fill in a valid email address.", "register-page.registration.email.error.not-email-form": "Insira um endereço de correio eletrónico válido.", // "register-page.registration.email.error.not-valid-domain": "Use email with allowed domains: {{ domains }}", - "register-page.registration.email.error.not-valid-domain": "Usar endereço de correio eletrónico com domínios permitidos: {{ domains }}", + "register-page.registration.email.error.not-valid-domain": "Usar endereço de correio eletrónico com domínios permitidos: {{ domains }}", // "register-page.registration.email.hint": "This address will be verified and used as your login name.", "register-page.registration.email.hint": "Este endereço de correio eletrónico será verificado e usado para iniciar sessão.", @@ -5017,7 +5017,7 @@ // "register-page.registration.success.head": "Verification email sent", "register-page.registration.success.head": "Enviado email de verificação", - + // "register-page.registration.success.content": "An email has been sent to {{ email }} containing a special URL and further instructions.", "register-page.registration.success.content": "Foi enviado um email para {{ email }} com instruções e um endereço especial para confirmação.", @@ -5026,7 +5026,7 @@ // "register-page.registration.error.content": "An error occured when registering the following email address: {{ email }}", "register-page.registration.error.content": "Ocorreu um erro ao registar o seguinte endereço de correio eletrónico: {{ email }}", - + // "register-page.registration.error.recaptcha": "Error when trying to authenticate with recaptcha", "register-page.registration.error.recaptcha": "Ocorreu um erro ao tentar autenticar com o recaptcha", @@ -5034,8 +5034,8 @@ "register-page.registration.google-recaptcha.must-accept-cookies": "Para se registar deve aceitar o registo e a senha de recuperação (Google reCaptcha) cookies.", // "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 endereço de e-mail não consta da lista de domínios que podem ser registados. Os domínios permitidos são {{ domains }}", - + "register-page.registration.error.maildomain": "Este endereço de e-mail não consta da lista de domínios que podem ser registados. Os domínios permitidos são {{ domains }}", + // "register-page.registration.google-recaptcha.open-cookie-settings": "Open cookie settings", "register-page.registration.google-recaptcha.open-cookie-settings": "Configurações de Open cookie", @@ -5046,11 +5046,11 @@ "register-page.registration.google-recaptcha.notification.message.error": "Ocorreu um erro na verificação do reCaptcha", // "register-page.registration.google-recaptcha.notification.message.expired": "Verification expired. Please verify again.", - "register-page.registration.google-recaptcha.notification.message.expired": "Verificação expirou. Por favor verifique novamente.", - + "register-page.registration.google-recaptcha.notification.message.expired": "Verificação expirou. Por favor verifique novamente.", + // "register-page.registration.info.maildomain": "Accounts can be registered for mail addresses of the domains", "register-page.registration.info.maildomain": "As contas podem ser registadas para os endereços de email os domínios", - + // "relationships.add.error.relationship-type.content": "No suitable match could be found for relationship type {{ type }} between the two items", "relationships.add.error.relationship-type.content": "Não foi encontrado uma licação adequada no tipo de relação {{ type }} entre os dois itens", @@ -5080,13 +5080,13 @@ // "relationships.isOrgUnitOf": "Organizational Units", "relationships.isOrgUnitOf": "Unidades organizacionais", - + // "relationships.isPersonOf": "Authors", "relationships.isPersonOf": "Autores", // "relationships.isProjectOf": "Research Projects", "relationships.isProjectOf": "Projetos de investigação", - + // "relationships.isPublicationOf": "Publications", "relationships.isPublicationOf": "Publicações", @@ -5095,31 +5095,31 @@ // "relationships.isSingleJournalOf": "Journal", "relationships.isSingleJournalOf": "Revista", - + // "relationships.isSingleVolumeOf": "Journal Volume", "relationships.isSingleVolumeOf": "Volume de revista", - + // "relationships.isVolumeOf": "Journal Volumes", "relationships.isVolumeOf": "Volumes da revista", - + // "relationships.isContributorOf": "Contributors", "relationships.isContributorOf": "Contribuidores", - + // "relationships.isContributorOf.OrgUnit": "Contributor (Organizational Unit)", "relationships.isContributorOf.OrgUnit": "Colaborador (Unidade organizacional)", // "relationships.isContributorOf.Person": "Contributor", "relationships.isContributorOf.Person": "Contribuidor", - + // "relationships.isFundingAgencyOf.OrgUnit": "Funder", - "relationships.isFundingAgencyOf.OrgUnit": "Financiador", - + "relationships.isFundingAgencyOf.OrgUnit": "Financiador", + // "repository.image.logo": "Repository logo", - "repository.image.logo": "Logótipo do repositório", - + "repository.image.logo": "Logótipo do repositório", + // "repository.title.prefix": "DSpace Angular :: ", - "repository.title.prefix": "Repositório :: ", - + "repository.title.prefix": "Repositório :: ", + // "repository.title.prefixDSpace": "DSpace Angular ::", "repository.title.prefixDSpace": "Repositório ::", @@ -5173,13 +5173,13 @@ // "resource-policies.edit.page.failure.content": "An error occurred while editing the resource policy.", "resource-policies.edit.page.failure.content": "Ocorreu um erro ao editar a política de recurso.", - + // "resource-policies.edit.page.target-failure.content": "An error occurred while editing the target (ePerson or group) of the resource policy.", "resource-policies.edit.page.target-failure.content": "Ocorreu um erro durante a edição da (ePerson ou grupo) da política de recursos.", // "resource-policies.edit.page.other-failure.content": "An error occurred while editing the resource policy. The target (ePerson or group) has been successfully updated.", - "resource-policies.edit.page.other-failure.content": "Ocorreu um erro durante a edição da política de recursos. A (ePerson ou grupo) foi actualizado com sucesso.", - + "resource-policies.edit.page.other-failure.content": "Ocorreu um erro durante a edição da política de recursos. A (ePerson ou grupo) foi actualizado com sucesso.", + // "resource-policies.edit.page.success.content": "Operation successful", "resource-policies.edit.page.success.content": "Operação bem sucedida", @@ -5188,19 +5188,19 @@ // "resource-policies.form.action-type.label": "Select the action type", "resource-policies.form.action-type.label": "Selecione o tipo de ação", - + // "resource-policies.form.action-type.required": "You must select the resource policy action.", "resource-policies.form.action-type.required": "Deve selecionar a ação da política de recurso.", // "resource-policies.form.eperson-group-list.label": "The eperson or group that will be granted the permission", "resource-policies.form.eperson-group-list.label": "O utilizador ou grupo ao qual serão atribuídas as permissões", - + // "resource-policies.form.eperson-group-list.select.btn": "Select", "resource-policies.form.eperson-group-list.select.btn": "Seleccionar", // "resource-policies.form.eperson-group-list.tab.eperson": "Search for a ePerson", "resource-policies.form.eperson-group-list.tab.eperson": "Pesquisar um utilizador", - + // "resource-policies.form.eperson-group-list.tab.group": "Search for a group", "resource-policies.form.eperson-group-list.tab.group": "Pesquisar um grupo", @@ -5209,31 +5209,31 @@ // "resource-policies.form.eperson-group-list.table.headers.id": "ID", "resource-policies.form.eperson-group-list.table.headers.id": "ID", - - // "resource-policies.form.eperson-group-list.table.headers.name": "Name", + + // "resource-policies.form.eperson-group-list.table.headers.name": "Name", "resource-policies.form.eperson-group-list.table.headers.name": "Nome", - + // "resource-policies.form.eperson-group-list.modal.header": "Cannot change type", "resource-policies.form.eperson-group-list.modal.header": "Não pode mudar de tipo", - + // "resource-policies.form.eperson-group-list.modal.text1.toGroup": "It is not possible to replace an ePerson with a group.", "resource-policies.form.eperson-group-list.modal.text1.toGroup": "Não é possível substituir um utilizador por um grupo.", // "resource-policies.form.eperson-group-list.modal.text1.toEPerson": "It is not possible to replace a group with an ePerson.", "resource-policies.form.eperson-group-list.modal.text1.toEPerson": "Não é possível substituir um grupo por uma ePerson.", - + // "resource-policies.form.eperson-group-list.modal.text2": "Delete the current resource policy and create a new one with the desired type.", "resource-policies.form.eperson-group-list.modal.text2": "Eliminar a política actual de recursos e criar uma nova política com o tipo desejado.", // "resource-policies.form.eperson-group-list.modal.close": "Ok", "resource-policies.form.eperson-group-list.modal.close": "Ok", - + // "resource-policies.form.date.end.label": "End Date", "resource-policies.form.date.end.label": "Data de fim", - + // "resource-policies.form.date.start.label": "Start Date", "resource-policies.form.date.start.label": "Data de início", - + // "resource-policies.form.description.label": "Description", "resource-policies.form.description.label": "Descrição", @@ -5242,7 +5242,7 @@ // "resource-policies.form.policy-type.label": "Select the policy type", "resource-policies.form.policy-type.label": "Selecione o tipo de política", - + // "resource-policies.form.policy-type.required": "You must select the resource policy type.", "resource-policies.form.policy-type.required": "Deve selecionar um tipo de política de recurso.", @@ -5251,10 +5251,10 @@ // "resource-policies.table.headers.date.end": "End Date", "resource-policies.table.headers.date.end": "Data de término", - + // "resource-policies.table.headers.date.start": "Start Date", "resource-policies.table.headers.date.start": "Data de início", - + // "resource-policies.table.headers.edit": "Edit", "resource-policies.table.headers.edit": "Editar", @@ -5281,16 +5281,16 @@ // "resource-policies.table.headers.title.for.bitstream": "Policies for Bitstream", "resource-policies.table.headers.title.for.bitstream": "Política de ficheiros", - + // "resource-policies.table.headers.title.for.bundle": "Policies for Bundle", "resource-policies.table.headers.title.for.bundle": "Políticas para pacote", - + // "resource-policies.table.headers.title.for.item": "Policies for Item", "resource-policies.table.headers.title.for.item": "Políticas para item", - + // "resource-policies.table.headers.title.for.community": "Policies for Community", "resource-policies.table.headers.title.for.community": "Políticas para comunidade", - + // "resource-policies.table.headers.title.for.collection": "Policies for Collection", "resource-policies.table.headers.title.for.collection": "Políticas para coleção", @@ -5302,13 +5302,13 @@ // "search.title": "Search", "search.title": "Pesquisa", - + // "search.breadcrumbs": "Search", "search.breadcrumbs": "Pesquisar", - + // "search.search-form.placeholder": "Search the repository ...", "search.search-form.placeholder": "Pesquisar no repositório...", - + // "search.filters.applied.f.author": "Author", "search.filters.applied.f.author": "Autor", @@ -5320,10 +5320,10 @@ // "search.filters.applied.f.dateSubmitted": "Date submitted", "search.filters.applied.f.dateSubmitted": "Data de depósito", - + // "search.filters.applied.f.discoverable": "Non-discoverable", "search.filters.applied.f.discoverable": "Privado", - + // "search.filters.applied.f.entityType": "Item type", "search.filters.applied.f.entityType": "Tipo de item", @@ -5350,10 +5350,10 @@ // "search.filters.applied.f.birthDate.min": "Start birth date", "search.filters.applied.f.birthDate.min": "Início data de nascimento", - + // "search.filters.applied.f.supervisedBy": "Supervised by", "search.filters.applied.f.supervisedBy": "Supervisionado por", - + // "search.filters.applied.f.withdrawn": "Withdrawn", "search.filters.applied.f.withdrawn": "Retirado", @@ -5362,7 +5362,7 @@ // "search.filters.filter.author.placeholder": "Author name", "search.filters.filter.author.placeholder": "Nome do autor", - + // "search.filters.filter.author.label": "Search author name", "search.filters.filter.author.label": "Pesquisar por nome", @@ -5371,28 +5371,28 @@ // "search.filters.filter.birthDate.placeholder": "Birth Date", "search.filters.filter.birthDate.placeholder": "Data de nascimento", - + // "search.filters.filter.birthDate.label": "Search birth date", "search.filters.filter.birthDate.label": "Procurar data de nascimento", - + // "search.filters.filter.collapse": "Collapse filter", "search.filters.filter.collapse": "Fechar filtro", - + // "search.filters.filter.creativeDatePublished.head": "Date Published", "search.filters.filter.creativeDatePublished.head": "Data de publicação", // "search.filters.filter.creativeDatePublished.placeholder": "Date Published", - "search.filters.filter.creativeDatePublished.placeholder": "Data de publicação", - + "search.filters.filter.creativeDatePublished.placeholder": "Data de publicação", + // "search.filters.filter.creativeDatePublished.label": "Search date published", "search.filters.filter.creativeDatePublished.label": "Procurar data de publicação", - + // "search.filters.filter.creativeWorkEditor.head": "Editor", "search.filters.filter.creativeWorkEditor.head": "Editor", // "search.filters.filter.creativeWorkEditor.placeholder": "Editor", "search.filters.filter.creativeWorkEditor.placeholder": "Editor", - + // "search.filters.filter.creativeWorkEditor.label": "Search editor", "search.filters.filter.creativeWorkEditor.label": "Procurar editor", @@ -5401,7 +5401,7 @@ // "search.filters.filter.creativeWorkKeywords.placeholder": "Subject", "search.filters.filter.creativeWorkKeywords.placeholder": "Assunto", - + // "search.filters.filter.creativeWorkKeywords.label": "Search subject", "search.filters.filter.creativeWorkKeywords.label": "Procurar assuntos", @@ -5410,34 +5410,34 @@ // "search.filters.filter.creativeWorkPublisher.placeholder": "Publisher", "search.filters.filter.creativeWorkPublisher.placeholder": "Editora", - + // "search.filters.filter.creativeWorkPublisher.label": "Search publisher", "search.filters.filter.creativeWorkPublisher.label": "Procurar editora", - + // "search.filters.filter.dateIssued.head": "Date", "search.filters.filter.dateIssued.head": "Data", - + // "search.filters.filter.dateIssued.max.placeholder": "Maximum Date", "search.filters.filter.dateIssued.max.placeholder": "Data máxima", - + // "search.filters.filter.dateIssued.max.label": "End", "search.filters.filter.dateIssued.max.label": "Fim", // "search.filters.filter.dateIssued.min.placeholder": "Minimum Date", "search.filters.filter.dateIssued.min.placeholder": "Data mínima", - + // "search.filters.filter.dateIssued.min.label": "Start", "search.filters.filter.dateIssued.min.label": "Início", - + // "search.filters.filter.dateSubmitted.head": "Date submitted", "search.filters.filter.dateSubmitted.head": "Data de depósito", - + // "search.filters.filter.dateSubmitted.placeholder": "Date submitted", "search.filters.filter.dateSubmitted.placeholder": "Data de depósito", - + // "search.filters.filter.dateSubmitted.label": "Search date submitted", "search.filters.filter.dateSubmitted.label": "Procurar data de depósito", - + // "search.filters.filter.discoverable.head": "Non-discoverable", "search.filters.filter.discoverable.head": "Privado", @@ -5446,37 +5446,37 @@ // "search.filters.filter.entityType.head": "Item Type", "search.filters.filter.entityType.head": "Tipo de item", - + // "search.filters.filter.entityType.placeholder": "Item Type", - "search.filters.filter.entityType.placeholder": "Tipo de item", - + "search.filters.filter.entityType.placeholder": "Tipo de item", + // "search.filters.filter.entityType.label": "Search item type", "search.filters.filter.entityType.label": "Pesquisar por tipo", // "search.filters.filter.expand": "Expand filter", - "search.filters.filter.expand": "Expandir filtro", - + "search.filters.filter.expand": "Expandir filtro", + // "search.filters.filter.has_content_in_original_bundle.head": "Has files", "search.filters.filter.has_content_in_original_bundle.head": "Tem ficheiros", - + // "search.filters.filter.itemtype.head": "Type", "search.filters.filter.itemtype.head": "Tipo de item depositado", - + // "search.filters.filter.itemtype.placeholder": "Type", "search.filters.filter.itemtype.placeholder": "Tipo", - + // "search.filters.filter.itemtype.label": "Search type", "search.filters.filter.itemtype.label": "Procurar por tipo", - + // "search.filters.filter.jobTitle.head": "Job Title", "search.filters.filter.jobTitle.head": "Cargo", // "search.filters.filter.jobTitle.placeholder": "Job Title", "search.filters.filter.jobTitle.placeholder": "Cargo", - + // "search.filters.filter.jobTitle.label": "Search job title", "search.filters.filter.jobTitle.label": "Procurar cargo", - + // "search.filters.filter.knowsLanguage.head": "Known language", "search.filters.filter.knowsLanguage.head": "Idioma conhecido", @@ -5485,22 +5485,22 @@ // "search.filters.filter.knowsLanguage.label": "Search known language", "search.filters.filter.knowsLanguage.label": "Procurar idiomas conhecidos", - + // "search.filters.filter.namedresourcetype.head": "Status", "search.filters.filter.namedresourcetype.head": "Estado do depósito", - + // "search.filters.filter.namedresourcetype.placeholder": "Status", "search.filters.filter.namedresourcetype.placeholder": "Estado", - + // "search.filters.filter.namedresourcetype.label": "Search status", "search.filters.filter.namedresourcetype.label": "Pesquisa por estado", - + // "search.filters.filter.objectpeople.head": "People", "search.filters.filter.objectpeople.head": "Pessoas", - + // "search.filters.filter.objectpeople.placeholder": "People", "search.filters.filter.objectpeople.placeholder": "Pessoas", - + // "search.filters.filter.objectpeople.label": "Search people", "search.filters.filter.objectpeople.label": "Procurar pessoas", @@ -5509,7 +5509,7 @@ // "search.filters.filter.organizationAddressCountry.placeholder": "Country", "search.filters.filter.organizationAddressCountry.placeholder": "País", - + // "search.filters.filter.organizationAddressCountry.label": "Search country", "search.filters.filter.organizationAddressCountry.label": "Procurar país", @@ -5518,28 +5518,28 @@ // "search.filters.filter.organizationAddressLocality.placeholder": "City", "search.filters.filter.organizationAddressLocality.placeholder": "Cidade", - + // "search.filters.filter.organizationAddressLocality.label": "Search city", "search.filters.filter.organizationAddressLocality.label": "Procurar cidade", - + // "search.filters.filter.organizationFoundingDate.head": "Date Founded", "search.filters.filter.organizationFoundingDate.head": "Data de fundação", - + // "search.filters.filter.organizationFoundingDate.placeholder": "Date Founded", "search.filters.filter.organizationFoundingDate.placeholder": "Data de fundação", - + // "search.filters.filter.organizationFoundingDate.label": "Search date founded", "search.filters.filter.organizationFoundingDate.label": "Procurar data de fundação", - + // "search.filters.filter.scope.head": "Scope", "search.filters.filter.scope.head": "Âmbito", // "search.filters.filter.scope.placeholder": "Scope filter", "search.filters.filter.scope.placeholder": "Filtrar âmbito", - + // "search.filters.filter.scope.label": "Search scope filter", "search.filters.filter.scope.label": "Filtro do âmbito da pesquisa", - + // "search.filters.filter.show-less": "Collapse", "search.filters.filter.show-less": "Mostrar menos", @@ -5560,7 +5560,7 @@ // "search.filters.filter.submitter.placeholder": "Submitter", "search.filters.filter.submitter.placeholder": "Depositante", - + // "search.filters.filter.submitter.label": "Search submitter", "search.filters.filter.submitter.label": "Procurar depositante", @@ -5575,13 +5575,13 @@ // "search.filters.filter.supervisedBy.label": "search Supervised By", "search.filters.filter.supervisedBy.label": "pesquisar supervisionado por", - + // "search.filters.entityType.JournalIssue": "Journal Issue", "search.filters.entityType.JournalIssue": "Número de revista", - + // "search.filters.entityType.JournalVolume": "Journal Volume", "search.filters.entityType.JournalVolume": "Volume de revista", - + // "search.filters.entityType.OrgUnit": "Organizational Unit", "search.filters.entityType.OrgUnit": "Organização", @@ -5608,22 +5608,22 @@ // "search.filters.reset": "Reset filters", "search.filters.reset": "Limpar filtros", - + // "search.filters.search.submit": "Submit", "search.filters.search.submit": "Enviar", // "search.form.search": "Search", "search.form.search": "Pesquisar", - + // "search.form.search_dspace": "All repository", "search.form.search_dspace": "Pesquisar tudo", - + // "search.form.scope.all": "All of DSpace", "search.form.scope.all": "Pesquisar tudo", - + // "search.results.head": "Search Results", "search.results.head": "Resultados da pesquisa", - + // "search.results.no-results": "Your search returned no results. Having trouble finding what you're looking for? Try putting", "search.results.no-results": "Sua pesquisa não retornou resultados. Tem dificuldade em encontrar o que procura? Tente incluir ", @@ -5632,10 +5632,10 @@ // "search.results.empty": "Your search returned no results.", "search.results.empty": "A sua pesquisa não retornou resultados.", - + // "search.results.view-result": "View", "search.results.view-result": "Ver", - + // "search.results.response.500": "An error occurred during query execution, please try again later", "search.results.response.500": "Ocorreu um erro durante a execução da consulta, por favor tente novamente mais tarde", @@ -5683,16 +5683,16 @@ // "sorting.dc.title.ASC": "Title Ascending", "sorting.dc.title.ASC": "Título ascendente", - + // "sorting.dc.title.DESC": "Title Descending", "sorting.dc.title.DESC": "Título descendente", - + // "sorting.score.ASC": "Least Relevant", "sorting.score.ASC": "Menos relevante", - + // "sorting.score.DESC": "Most Relevant", "sorting.score.DESC": "Mais relevante", - + // "sorting.dc.date.issued.ASC": "Date Issued Ascending", "sorting.dc.date.issued.ASC": "Data de publicação ascendente", @@ -5703,8 +5703,8 @@ "sorting.dc.date.accessioned.ASC": "Data de disponibilização ascendente", // "sorting.dc.date.accessioned.DESC": "Accessioned Date Descending", - "sorting.dc.date.accessioned.DESC": "Data de disponibilização descendente", - + "sorting.dc.date.accessioned.DESC": "Data de disponibilização descendente", + // "sorting.lastModified.ASC": "Last modified Ascending", "sorting.lastModified.ASC": "Última modificação ascendente", @@ -5714,7 +5714,7 @@ // "statistics.title": "Statistics", "statistics.title": "Estatísticas", - // "statistics.header": "Statistics for {{ scope }}", + // "statistics.header": "Statistics for {{ scope }}", "statistics.header": "Estatísticas para {{ scope }}", // "statistics.breadcrumbs": "Statistics", @@ -5728,34 +5728,34 @@ // "statistics.table.title.TotalVisits": "Total visits", "statistics.table.title.TotalVisits": "Total de visitas", - + // "statistics.table.title.TotalVisitsPerMonth": "Total visits per month", "statistics.table.title.TotalVisitsPerMonth": "Total de visitas por mês", - + // "statistics.table.title.TotalDownloads": "File Visits", "statistics.table.title.TotalDownloads": "Downloads", // "statistics.table.title.TopCountries": "Top country views", "statistics.table.title.TopCountries": "Top de consultas por país", - + // "statistics.table.title.TopCities": "Top city views", "statistics.table.title.TopCities": "Top de consultas por cidade", - + // "statistics.table.header.views": "Views", "statistics.table.header.views": "Consultas", - + // "submission.edit.breadcrumbs": "Edit Submission", "submission.edit.breadcrumbs": "Editar depósito", - + // "submission.edit.title": "Edit Submission", "submission.edit.title": "Editar depósito", - + // "submission.general.cancel": "Cancel", "submission.general.cancel": "Cancelar", - + // "submission.general.cannot_submit": "You have not the privilege to make a new submission.", "submission.general.cannot_submit": "Não possui permissões para fazer um novo depósito.", - + // "submission.general.deposit": "Deposit", "submission.general.deposit": "Depositar", @@ -5769,23 +5769,23 @@ "submission.general.discard.confirm.submit": "Sim, tenho certeza", // "submission.general.discard.confirm.title": "Discard submission", - "submission.general.discard.confirm.title": "Cancelar depósito", - + "submission.general.discard.confirm.title": "Cancelar depósito", + // "submission.general.discard.submit": "Discard", "submission.general.discard.submit": "Cancelar", - + // "submission.general.info.saved": "Saved", "submission.general.info.saved": "Informação guardada", - + // "submission.general.info.pending-changes": "Unsaved changes", "submission.general.info.pending-changes": "Alterações não guardadas", - + // "submission.general.save": "Save", "submission.general.save": "Guardar", // "submission.general.save-later": "Save for later", "submission.general.save-later": "Guardar e fechar", - + // "submission.import-external.page.title": "Import metadata from an external source", "submission.import-external.page.title": "Importar metadados de uma fonte externa", @@ -5794,28 +5794,28 @@ // "submission.import-external.title.Journal": "Import a journal from an external source", "submission.import-external.title.Journal": "Importar revista de uma fonte externa", - + // "submission.import-external.title.JournalIssue": "Import a journal issue from an external source", "submission.import-external.title.JournalIssue": "Importar o número de um revista de um fonte externa", - - // "submission.import-external.title.JournalVolume": "Import a journal volume from an external source", - "submission.import-external.title.JournalVolume": "Importar o volume de uma revista de fonte externa", - + + // "submission.import-external.title.JournalVolume": "Import a journal volume from an external source", + "submission.import-external.title.JournalVolume": "Importar o volume de uma revista de fonte externa", + // "submission.import-external.title.OrgUnit": "Import a publisher from an external source", "submission.import-external.title.OrgUnit": "Importar editora de uma fonte externa", - + // "submission.import-external.title.Person": "Import a person from an external source", "submission.import-external.title.Person": "Importar pessoa de uma fonte externa", - + // "submission.import-external.title.Project": "Import a project from an external source", - "submission.import-external.title.Project": "Importar projeto de uma fonte externa", - - // "submission.import-external.title.Publication": "Import a publication from an external source", - "submission.import-external.title.Publication": "Importar uma publicação de uma fonte externa", - + "submission.import-external.title.Project": "Importar projeto de uma fonte externa", + + // "submission.import-external.title.Publication": "Import a publication from an external source", + "submission.import-external.title.Publication": "Importar uma publicação de uma fonte externa", + // "submission.import-external.title.none": "Import metadata from an external source", "submission.import-external.title.none": "Importar metadados de uma fonte externa", - + // "submission.import-external.page.hint": "Enter a query above to find items from the web to import in to DSpace.", "submission.import-external.page.hint": "Pesquise itens abaixo disponíveis na internet para que sejam importados para o repositório.", @@ -5836,7 +5836,7 @@ // "submission.import-external.source.arxiv": "arXiv", "submission.import-external.source.arxiv": "arXiv", - + // "submission.import-external.source.ads": "NASA/ADS", "submission.import-external.source.ads": "NASA/ADS", @@ -5845,7 +5845,7 @@ // "submission.import-external.source.crossref": "CrossRef", "submission.import-external.source.crossref": "CrossRef", - + // "submission.import-external.source.datacite": "DataCite", "submission.import-external.source.datacite": "DataCite", @@ -5865,38 +5865,38 @@ "submission.import-external.source.orcidWorks": "ORCID", // "submission.import-external.source.epo": "European Patent Office (EPO)", - "submission.import-external.source.epo": "European Patent Office (EPO)", - + "submission.import-external.source.epo": "European Patent Office (EPO)", + // "submission.import-external.source.loading": "Loading ...", "submission.import-external.source.loading": "A carregar ...", - + // "submission.import-external.source.sherpaJournal": "SHERPA Journals", "submission.import-external.source.sherpaJournal": "Revistas Sherpa Romeo por nome", - + // "submission.import-external.source.sherpaJournalIssn": "SHERPA Journals by ISSN", "submission.import-external.source.sherpaJournalIssn": "Revistas Sherpa Romeo por ISSN", - + // "submission.import-external.source.sherpaPublisher": "SHERPA Publishers", "submission.import-external.source.sherpaPublisher": "Editoras Sherpa Romeo", - + // "submission.import-external.source.openAIREFunding": "Funding OpenAIRE API", "submission.import-external.source.openAIREFunding": "Financiamento via API OpenAIRE", - + // "submission.import-external.source.orcid": "ORCID", "submission.import-external.source.orcid": "ORCID", - + // "submission.import-external.source.pubmed": "PubMed", "submission.import-external.source.pubmed": "PubMed", - + // "submission.import-external.source.pubmedeu": "PubMed Europe", "submission.import-external.source.pubmedeu": "PubMed Europa", - + // "submission.import-external.source.lcname": "Library of Congress Names", "submission.import-external.source.lcname": "Nomes da Library of Congress", // "submission.import-external.preview.title": "Item Preview", "submission.import-external.preview.title": "Pré-visualização do item", - + // "submission.import-external.preview.title.Publication": "Publication Preview", "submission.import-external.preview.title.Publication": "Pré-visualização da publicação", @@ -5913,17 +5913,17 @@ "submission.import-external.preview.title.Person": "Pré-visualização dos dados pessoais a importar", // "submission.import-external.preview.title.Project": "Project Preview", - "submission.import-external.preview.title.Project": "Pré-visualização do dados do projeto a importar", - + "submission.import-external.preview.title.Project": "Pré-visualização do dados do projeto a importar", + // "submission.import-external.preview.subtitle": "The metadata below was imported from an external source. It will be pre-filled when you start the submission.", "submission.import-external.preview.subtitle": "Os seguintes metadados foram importados de uma fonte externa. Serão pré-preenchidos quando iniciar o depósito.", - + // "submission.import-external.preview.button.import": "Start submission", "submission.import-external.preview.button.import": "Iniciar depósito", - + // "submission.import-external.preview.error.import.title": "Submission error", "submission.import-external.preview.error.import.title": "Erro no depósito", - + // "submission.import-external.preview.error.import.body": "An error occurs during the external source entry import process.", "submission.import-external.preview.error.import.body": "Ocorreu um erro durante o processo de importação de metadados de uma fonte externa.", @@ -5935,19 +5935,19 @@ // "submission.sections.describe.relationship-lookup.external-source.import-button-title.isAuthorOfPublication": "Import remote author", "submission.sections.describe.relationship-lookup.external-source.import-button-title.isAuthorOfPublication": "Importar autor remoto", - + // "submission.sections.describe.relationship-lookup.external-source.import-button-title.Journal": "Import remote journal", "submission.sections.describe.relationship-lookup.external-source.import-button-title.Journal": "Importar revista remota", - + // "submission.sections.describe.relationship-lookup.external-source.import-button-title.Journal Issue": "Import remote journal issue", "submission.sections.describe.relationship-lookup.external-source.import-button-title.Journal Issue": "Importar número de revista remoto", - + // "submission.sections.describe.relationship-lookup.external-source.import-button-title.Journal Volume": "Import remote journal volume", "submission.sections.describe.relationship-lookup.external-source.import-button-title.Journal Volume": "Importar volume de revista remoto", // "submission.sections.describe.relationship-lookup.external-source.import-button-title.isProjectOfPublication": "Project", "submission.sections.describe.relationship-lookup.external-source.import-button-title.isProjectOfPublication": "Projeto", - + // "submission.sections.describe.relationship-lookup.external-source.import-button-title.none": "Import remote item", "submission.sections.describe.relationship-lookup.external-source.import-button-title.none": "Importar item remoto", @@ -5976,20 +5976,20 @@ "submission.sections.describe.relationship-lookup.external-source.import-button-title.Project": "Importar projeto remoto", // "submission.sections.describe.relationship-lookup.external-source.import-button-title.Publication": "Import remote publication", - "submission.sections.describe.relationship-lookup.external-source.import-button-title.Publication": "Importar publicação remota", - + "submission.sections.describe.relationship-lookup.external-source.import-button-title.Publication": "Importar publicação remota", + // "submission.sections.describe.relationship-lookup.external-source.import-modal.isProjectOfPublication.added.new-entity": "New Entity Added!", - "submission.sections.describe.relationship-lookup.external-source.import-modal.isProjectOfPublication.added.new-entity": "Nova entidade adicionada!", + "submission.sections.describe.relationship-lookup.external-source.import-modal.isProjectOfPublication.added.new-entity": "Nova entidade adicionada!", // "submission.sections.describe.relationship-lookup.external-source.import-modal.isProjectOfPublication.title": "Project", - "submission.sections.describe.relationship-lookup.external-source.import-modal.isProjectOfPublication.title": "Projeto", - + "submission.sections.describe.relationship-lookup.external-source.import-modal.isProjectOfPublication.title": "Projeto", + // "submission.sections.describe.relationship-lookup.external-source.import-modal.head.openAIREFunding": "Funding OpenAIRE API", - "submission.sections.describe.relationship-lookup.external-source.import-modal.head.openAIREFunding": "Financiamento API OpenAIRE", - + "submission.sections.describe.relationship-lookup.external-source.import-modal.head.openAIREFunding": "Financiamento API OpenAIRE", + // "submission.sections.describe.relationship-lookup.external-source.import-modal.isAuthorOfPublication.title": "Import Remote Author", "submission.sections.describe.relationship-lookup.external-source.import-modal.isAuthorOfPublication.title": "Importar autor remoto", - + // "submission.sections.describe.relationship-lookup.external-source.import-modal.isAuthorOfPublication.added.local-entity": "Successfully added local author to the selection", "submission.sections.describe.relationship-lookup.external-source.import-modal.isAuthorOfPublication.added.local-entity": "Adicionado com sucesso um autor local à seleção", @@ -6007,7 +6007,7 @@ // "submission.sections.describe.relationship-lookup.external-source.import-modal.collection": "Select a collection to import new entries to", "submission.sections.describe.relationship-lookup.external-source.import-modal.collection": "Selecione a coleção para onde pretende importar as novas entradas", - + // "submission.sections.describe.relationship-lookup.external-source.import-modal.entities": "Entities", "submission.sections.describe.relationship-lookup.external-source.import-modal.entities": "Entidades", @@ -6016,40 +6016,40 @@ // "submission.sections.describe.relationship-lookup.external-source.import-modal.head.lcname": "Importing from LC Name", "submission.sections.describe.relationship-lookup.external-source.import-modal.head.lcname": "A importar de LC Name", - + // "submission.sections.describe.relationship-lookup.external-source.import-modal.head.orcid": "Importing from ORCID", "submission.sections.describe.relationship-lookup.external-source.import-modal.head.orcid": "A importar do ORCID", - + // "submission.sections.describe.relationship-lookup.external-source.import-modal.head.sherpaJournal": "Importing from Sherpa Journal", "submission.sections.describe.relationship-lookup.external-source.import-modal.head.sherpaJournal": "A importar revista do Sherpa", - + // "submission.sections.describe.relationship-lookup.external-source.import-modal.head.sherpaPublisher": "Importing from Sherpa Publisher", "submission.sections.describe.relationship-lookup.external-source.import-modal.head.sherpaPublisher": "A importar editora do Sherpa", - + // "submission.sections.describe.relationship-lookup.external-source.import-modal.head.pubmed": "Importing from PubMed", "submission.sections.describe.relationship-lookup.external-source.import-modal.head.pubmed": "A importar da PubMed", - + // "submission.sections.describe.relationship-lookup.external-source.import-modal.head.arxiv": "Importing from arXiv", "submission.sections.describe.relationship-lookup.external-source.import-modal.head.arxiv": "A importar do arXiv", - + // "submission.sections.describe.relationship-lookup.external-source.import-modal.import": "Import", "submission.sections.describe.relationship-lookup.external-source.import-modal.import": "Importar", // "submission.sections.describe.relationship-lookup.external-source.import-modal.Journal.title": "Import Remote Journal", "submission.sections.describe.relationship-lookup.external-source.import-modal.Journal.title": "Importar revista remota", - + // "submission.sections.describe.relationship-lookup.external-source.import-modal.Journal.added.local-entity": "Successfully added local journal to the selection", "submission.sections.describe.relationship-lookup.external-source.import-modal.Journal.added.local-entity": "Revista local adicionada com sucesso à seleção", // "submission.sections.describe.relationship-lookup.external-source.import-modal.Journal.added.new-entity": "Successfully imported and added external journal to the selection", "submission.sections.describe.relationship-lookup.external-source.import-modal.Journal.added.new-entity": "Importada e adicionada com sucesso uma revista externa à seleção", - + // "submission.sections.describe.relationship-lookup.external-source.import-modal.Journal Issue.title": "Import Remote Journal Issue", "submission.sections.describe.relationship-lookup.external-source.import-modal.Journal Issue.title": "Importar número de revista remota", // "submission.sections.describe.relationship-lookup.external-source.import-modal.Journal Issue.added.local-entity": "Successfully added local journal issue to the selection", "submission.sections.describe.relationship-lookup.external-source.import-modal.Journal Issue.added.local-entity": "Número de revista local adicionado com sucesso à seleção", - + // "submission.sections.describe.relationship-lookup.external-source.import-modal.Journal Issue.added.new-entity": "Successfully imported and added external journal issue to the selection", "submission.sections.describe.relationship-lookup.external-source.import-modal.Journal Issue.added.new-entity": "Importado e adicionado um número de revista externa com sucesso à seleção", @@ -6058,31 +6058,31 @@ // "submission.sections.describe.relationship-lookup.external-source.import-modal.Journal Volume.added.local-entity": "Successfully added local journal volume to the selection", "submission.sections.describe.relationship-lookup.external-source.import-modal.Journal Volume.added.local-entity": "Volume de revista local adicionado com sucesso à seleção", - + // "submission.sections.describe.relationship-lookup.external-source.import-modal.Journal Volume.added.new-entity": "Successfully imported and added external journal volume to the selection", "submission.sections.describe.relationship-lookup.external-source.import-modal.Journal Volume.added.new-entity": "Importado e adicionado um volume de revista externa com sucesso à seleção", - + // "submission.sections.describe.relationship-lookup.external-source.import-modal.select": "Select a local match:", "submission.sections.describe.relationship-lookup.external-source.import-modal.select": "Selecione uma correspondência local:", - + // "submission.sections.describe.relationship-lookup.search-tab.deselect-all": "Deselect all", "submission.sections.describe.relationship-lookup.search-tab.deselect-all": "Deselecionar todos", - + // "submission.sections.describe.relationship-lookup.search-tab.deselect-page": "Deselect page", "submission.sections.describe.relationship-lookup.search-tab.deselect-page": "Deselecionar página", - + // "submission.sections.describe.relationship-lookup.search-tab.loading": "Loading...", "submission.sections.describe.relationship-lookup.search-tab.loading": "A carregar...", - + // "submission.sections.describe.relationship-lookup.search-tab.placeholder": "Search query", "submission.sections.describe.relationship-lookup.search-tab.placeholder": "Termos da pesquisa", // "submission.sections.describe.relationship-lookup.search-tab.search": "Go", "submission.sections.describe.relationship-lookup.search-tab.search": "Pesquisar", - + // "submission.sections.describe.relationship-lookup.search-tab.search-form.placeholder": "Search...", - "submission.sections.describe.relationship-lookup.search-tab.search-form.placeholder": "Pesquisar...", - + "submission.sections.describe.relationship-lookup.search-tab.search-form.placeholder": "Pesquisar...", + // "submission.sections.describe.relationship-lookup.search-tab.select-all": "Select all", "submission.sections.describe.relationship-lookup.search-tab.select-all": "Selecionar todos", @@ -6094,43 +6094,43 @@ // "submission.sections.describe.relationship-lookup.search-tab.tab-title.isAuthorOfPublication": "Local Authors ({{ count }})", "submission.sections.describe.relationship-lookup.search-tab.tab-title.isAuthorOfPublication": "Autores locais ({{ count }})", - + // "submission.sections.describe.relationship-lookup.search-tab.tab-title.isJournalOfPublication": "Local Journals ({{ count }})", "submission.sections.describe.relationship-lookup.search-tab.tab-title.isJournalOfPublication": "Revistas locais ({{ count }})", // "submission.sections.describe.relationship-lookup.search-tab.tab-title.Project": "Local Projects ({{ count }})", "submission.sections.describe.relationship-lookup.search-tab.tab-title.Project": "Projetos locais ({{ count }})", - + // "submission.sections.describe.relationship-lookup.search-tab.tab-title.Publication": "Local Publications ({{ count }})", "submission.sections.describe.relationship-lookup.search-tab.tab-title.Publication": "Publicações locais ({{ count }})", - + // "submission.sections.describe.relationship-lookup.search-tab.tab-title.Person": "Local Authors ({{ count }})", "submission.sections.describe.relationship-lookup.search-tab.tab-title.Person": "Autores locais ({{ count }})", - + // "submission.sections.describe.relationship-lookup.search-tab.tab-title.OrgUnit": "Local Organizational Units ({{ count }})", "submission.sections.describe.relationship-lookup.search-tab.tab-title.OrgUnit": "Unidades organizacionais locais ({{ count }})", - + // "submission.sections.describe.relationship-lookup.search-tab.tab-title.DataPackage": "Local Data Packages ({{ count }})", "submission.sections.describe.relationship-lookup.search-tab.tab-title.DataPackage": "Pacotes de dados locais ({{ count }})", - + // "submission.sections.describe.relationship-lookup.search-tab.tab-title.DataFile": "Local Data Files ({{ count }})", "submission.sections.describe.relationship-lookup.search-tab.tab-title.DataFile": "Ficheiros de dados locais ({{ count }})", - + // "submission.sections.describe.relationship-lookup.search-tab.tab-title.Journal": "Local Journals ({{ count }})", "submission.sections.describe.relationship-lookup.search-tab.tab-title.Journal": "Revistas locais ({{ count }})", - + // "submission.sections.describe.relationship-lookup.search-tab.tab-title.isJournalIssueOfPublication": "Local Journal Issues ({{ count }})", "submission.sections.describe.relationship-lookup.search-tab.tab-title.isJournalIssueOfPublication": "Números de revistas locais ({{ count }})", - + // "submission.sections.describe.relationship-lookup.search-tab.tab-title.JournalIssue": "Local Journal Issues ({{ count }})", "submission.sections.describe.relationship-lookup.search-tab.tab-title.JournalIssue": "Números de revista locais ({{ count }})", - + // "submission.sections.describe.relationship-lookup.search-tab.tab-title.isJournalVolumeOfPublication": "Local Journal Volumes ({{ count }})", "submission.sections.describe.relationship-lookup.search-tab.tab-title.isJournalVolumeOfPublication": "Volumes de revistas locais ({{ count }})", // "submission.sections.describe.relationship-lookup.search-tab.tab-title.JournalVolume": "Local Journal Volumes ({{ count }})", "submission.sections.describe.relationship-lookup.search-tab.tab-title.JournalVolume": "Volumes de revistas locais ({{ count }})", - + // "submission.sections.describe.relationship-lookup.search-tab.tab-title.sherpaJournal": "Sherpa Journals ({{ count }})", "submission.sections.describe.relationship-lookup.search-tab.tab-title.sherpaJournal": "Revistas do Sherpa ({{ count }})", @@ -6141,8 +6141,8 @@ "submission.sections.describe.relationship-lookup.search-tab.tab-title.orcid": "ORCID ({{ count }})", // "submission.sections.describe.relationship-lookup.search-tab.tab-title.lcname": "LC Names ({{ count }})", - "submission.sections.describe.relationship-lookup.search-tab.tab-title.lcname": "Nomes LC ({{ count }})", - + "submission.sections.describe.relationship-lookup.search-tab.tab-title.lcname": "Nomes LC ({{ count }})", + // "submission.sections.describe.relationship-lookup.search-tab.tab-title.pubmed": "PubMed ({{ count }})", "submission.sections.describe.relationship-lookup.search-tab.tab-title.pubmed": "PubMed ({{ count }})", @@ -6153,38 +6153,38 @@ "submission.sections.describe.relationship-lookup.search-tab.tab-title.isFundingAgencyOfPublication": "Pesquisar por agências de financiamento", // "submission.sections.describe.relationship-lookup.search-tab.tab-title.isFundingOfPublication": "Search for Funding", - "submission.sections.describe.relationship-lookup.search-tab.tab-title.isFundingAgencyOfPublication": "Pesquisar por financiamento", - + "submission.sections.describe.relationship-lookup.search-tab.tab-title.isFundingAgencyOfPublication": "Pesquisar por financiamento", + // "submission.sections.describe.relationship-lookup.search-tab.tab-title.isChildOrgUnitOf": "Search for Organizational Units", "submission.sections.describe.relationship-lookup.search-tab.tab-title.isChildOrgUnitOf": "Pesquisar por unidades organizacionais", - + // "submission.sections.describe.relationship-lookup.search-tab.tab-title.openAIREFunding": "Funding OpenAIRE API", - "submission.sections.describe.relationship-lookup.search-tab.tab-title.openAIREFunding": "Via API OpenAIRE", + "submission.sections.describe.relationship-lookup.search-tab.tab-title.openAIREFunding": "Via API OpenAIRE", // "submission.sections.describe.relationship-lookup.search-tab.tab-title.isProjectOfPublication": "Projects", "submission.sections.describe.relationship-lookup.search-tab.tab-title.isProjectOfPublication": "Projetos", - + // "submission.sections.describe.relationship-lookup.search-tab.tab-title.isFundingAgencyOfProject": "Funder of the Project", "submission.sections.describe.relationship-lookup.search-tab.tab-title.isFundingAgencyOfProject": "Financiador do projeto", - + // "submission.sections.describe.relationship-lookup.search-tab.tab-title.isPublicationOfAuthor": "Publication of the Author", "submission.sections.describe.relationship-lookup.search-tab.tab-title.isPublicationOfAuthor": "Publicação do author", - + // "submission.sections.describe.relationship-lookup.selection-tab.title.openAIREFunding": "Funding OpenAIRE API", "submission.sections.describe.relationship-lookup.selection-tab.title.openAIREFunding": "Financiamento API OpenAIRE", - + // "submission.sections.describe.relationship-lookup.selection-tab.title.isProjectOfPublication": "Project", "submission.sections.describe.relationship-lookup.selection-tab.title.isProjectOfPublication": "Projeto", - + // "submission.sections.describe.relationship-lookup.title.isProjectOfPublication": "Projects", "submission.sections.describe.relationship-lookup.title.isProjectOfPublication": "Projetos", - + // "submission.sections.describe.relationship-lookup.title.isFundingAgencyOfProject": "Funder of the Project", "submission.sections.describe.relationship-lookup.title.isFundingAgencyOfProject": "Financiador do projeto", - + //"submission.sections.describe.relationship-lookup.selection-tab.search-form.placeholder": "Search...", - "submission.sections.describe.relationship-lookup.selection-tab.search-form.placeholder": "Pesquisar...", - + "submission.sections.describe.relationship-lookup.selection-tab.search-form.placeholder": "Pesquisar...", + // "submission.sections.describe.relationship-lookup.selection-tab.tab-title": "Current Selection ({{ count }})", "submission.sections.describe.relationship-lookup.selection-tab.tab-title": "Seleção atual ({{ count }})", @@ -6193,7 +6193,7 @@ // "submission.sections.describe.relationship-lookup.title.JournalIssue": "Journal Issues", "submission.sections.describe.relationship-lookup.title.JournalIssue": "Pesquisar números de revista", - + // "submission.sections.describe.relationship-lookup.title.isJournalVolumeOfPublication": "Journal Volumes", "submission.sections.describe.relationship-lookup.title.isJournalVolumeOfPublication": "Volumes de Revistas", @@ -6211,31 +6211,31 @@ // "submission.sections.describe.relationship-lookup.title.Project": "Projects", "submission.sections.describe.relationship-lookup.title.Project": "Pesquisar projetos", - + // "submission.sections.describe.relationship-lookup.title.Publication": "Publications", "submission.sections.describe.relationship-lookup.title.Publication": "Publicações", // "submission.sections.describe.relationship-lookup.title.Person": "Authors", "submission.sections.describe.relationship-lookup.title.Person": "Pesquisar autores", - + // "submission.sections.describe.relationship-lookup.title.OrgUnit": "Organizational Units", "submission.sections.describe.relationship-lookup.title.OrgUnit": "Pesquisar unidades organizacionais", - + // "submission.sections.describe.relationship-lookup.title.DataPackage": "Data Packages", "submission.sections.describe.relationship-lookup.title.DataPackage": "Pacote de dados", - + // "submission.sections.describe.relationship-lookup.title.DataFile": "Data Files", "submission.sections.describe.relationship-lookup.title.DataFile": "Ficheiros de dados", - + // "submission.sections.describe.relationship-lookup.title.Funding Agency": "Funding Agency", "submission.sections.describe.relationship-lookup.title.Funding Agency": "Agência de financiamento", - + // "submission.sections.describe.relationship-lookup.title.isFundingOfPublication": "Funding", "submission.sections.describe.relationship-lookup.title.isFundingOfPublication": "Financiamento", // "submission.sections.describe.relationship-lookup.title.isChildOrgUnitOf": "Parent Organizational Unit", "submission.sections.describe.relationship-lookup.title.isChildOrgUnitOf": "Organização principal", - + // "submission.sections.describe.relationship-lookup.title.isPublicationOfAuthor": "Publication", "submission.sections.describe.relationship-lookup.title.isPublicationOfAuthor": "Publicação", @@ -6253,22 +6253,22 @@ // "submission.sections.describe.relationship-lookup.selection-tab.title.isJournalOfPublication": "Selected Journals", "submission.sections.describe.relationship-lookup.selection-tab.title.isJournalOfPublication": "Revistas selecionadas", - + // "submission.sections.describe.relationship-lookup.selection-tab.title.isJournalVolumeOfPublication": "Selected Journal Volume", "submission.sections.describe.relationship-lookup.selection-tab.title.isJournalVolumeOfPublication": "Volume de revistas selecionadas", // "submission.sections.describe.relationship-lookup.selection-tab.title.Project": "Selected Projects", "submission.sections.describe.relationship-lookup.selection-tab.title.Project": "Projetos selecionados", - + // "submission.sections.describe.relationship-lookup.selection-tab.title.Publication": "Selected Publications", "submission.sections.describe.relationship-lookup.selection-tab.title.Publication": "Publicações selecionadas", - + // "submission.sections.describe.relationship-lookup.selection-tab.title.Person": "Selected Authors", "submission.sections.describe.relationship-lookup.selection-tab.title.Person": "Autores selecionados", - + // "submission.sections.describe.relationship-lookup.selection-tab.title.OrgUnit": "Selected Organizational Units", "submission.sections.describe.relationship-lookup.selection-tab.title.OrgUnit": "Unidades organizacionais selecionadas", - + // "submission.sections.describe.relationship-lookup.selection-tab.title.DataPackage": "Selected Data Packages", "submission.sections.describe.relationship-lookup.selection-tab.title.DataPackage": "Pacotes de dados selecionados", @@ -6277,46 +6277,46 @@ // "submission.sections.describe.relationship-lookup.selection-tab.title.Journal": "Selected Journals", "submission.sections.describe.relationship-lookup.selection-tab.title.Journal": "Revistas selecionadas", - + // "submission.sections.describe.relationship-lookup.selection-tab.title.isJournalIssueOfPublication": "Selected Issue", "submission.sections.describe.relationship-lookup.selection-tab.title.isJournalIssueOfPublication": "Número selecionado", // "submission.sections.describe.relationship-lookup.selection-tab.title.JournalVolume": "Selected Journal Volume", "submission.sections.describe.relationship-lookup.selection-tab.title.JournalVolume": "Volume de revista selecionado", - + // "submission.sections.describe.relationship-lookup.selection-tab.title.isFundingAgencyOfPublication": "Selected Funding Agency", "submission.sections.describe.relationship-lookup.selection-tab.title.isFundingAgencyOfPublication": "Agência de financiamento selecionada", - + // "submission.sections.describe.relationship-lookup.selection-tab.title.isFundingOfPublication": "Selected Funding", "submission.sections.describe.relationship-lookup.selection-tab.title.isFundingOfPublication": "Financiamento selecionado", // "submission.sections.describe.relationship-lookup.selection-tab.title.JournalIssue": "Selected Issue", "submission.sections.describe.relationship-lookup.selection-tab.title.JournalIssue": "Número selecionado", - + // "submission.sections.describe.relationship-lookup.selection-tab.title.isChildOrgUnitOf": "Selected Organizational Unit", "submission.sections.describe.relationship-lookup.selection-tab.title.isChildOrgUnitOf": "Organização selecionada", - + // "submission.sections.describe.relationship-lookup.selection-tab.title.sherpaJournal": "Search Results", "submission.sections.describe.relationship-lookup.selection-tab.title.sherpaJournal": "Resultados da pesquisa", - + // "submission.sections.describe.relationship-lookup.selection-tab.title.sherpaPublisher": "Search Results", "submission.sections.describe.relationship-lookup.selection-tab.title.sherpaPublisher": "Resultados da pesquisa", - + // "submission.sections.describe.relationship-lookup.selection-tab.title.orcid": "Search Results", "submission.sections.describe.relationship-lookup.selection-tab.title.orcid": "Resultados da pesquisa", - + // "submission.sections.describe.relationship-lookup.selection-tab.title.orcidv2": "Search Results", "submission.sections.describe.relationship-lookup.selection-tab.title.orcidv2": "Resultados da pesquisa", - + // "submission.sections.describe.relationship-lookup.selection-tab.title.lcname": "Search Results", "submission.sections.describe.relationship-lookup.selection-tab.title.lcname": "Resultados da pesquisa", - + // "submission.sections.describe.relationship-lookup.selection-tab.title.pubmed": "Search Results", "submission.sections.describe.relationship-lookup.selection-tab.title.pubmed": "Resultados da pesquisa", - + // "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.selection-tab.title.crossref": "Search Results", "submission.sections.describe.relationship-lookup.selection-tab.title.crossref": "Resultados da pesquisa", @@ -6333,11 +6333,11 @@ "submission.sections.describe.relationship-lookup.selection-tab.title.wos": "Resultados da pesquisa", // "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.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": "Pretende guardar \"{{ value }}\" como um nome alternativo para esta pessoa permitindo a sua reutilização por outros em futuros depósitos? Se não, pode usar apenas neste depósito.", - + // "submission.sections.describe.relationship-lookup.name-variant.notification.confirm": "Save a new name variant", "submission.sections.describe.relationship-lookup.name-variant.notification.confirm": "Guardar um Nome alternativo", @@ -6349,10 +6349,10 @@ // "submission.sections.ccLicense.select": "Select a license type…", "submission.sections.ccLicense.select": "Selecionar tipo de licença…", - + // "submission.sections.ccLicense.change": "Change your license type…", "submission.sections.ccLicense.change": "Alterar tipo de licença…", - + // "submission.sections.ccLicense.none": "No licenses available", "submission.sections.ccLicense.none": "Sem licenças disponíveis", @@ -6364,58 +6364,58 @@ // "submission.sections.ccLicense.confirmation": "I grant the license above", "submission.sections.ccLicense.confirmation": "Concedo a licença abaixo indicada", - + // "submission.sections.general.add-more": "Add more", "submission.sections.general.add-more": "Adicionar mais", - + // "submission.sections.general.cannot_deposit": "Deposit cannot be completed due to errors in the form.
    Please fill out all required fields to complete the deposit.", - "submission.sections.general.cannot_deposit": "O depósito não pode ser preenchido devido a erros no formulário.
    Por favor preencha todos os campos necessários para completar o depósito.", - + "submission.sections.general.cannot_deposit": "O depósito não pode ser preenchido devido a erros no formulário.
    Por favor preencha todos os campos necessários para completar o depósito.", + // "submission.sections.general.collection": "Collection", "submission.sections.general.collection": "Coleção", // "submission.sections.general.deposit_error_notice": "There was an issue when submitting the item, please try again later.", "submission.sections.general.deposit_error_notice": "Ocorreu um problema durante o depósito do item, por favor tente novamente mais tarde.", - + // "submission.sections.general.deposit_success_notice": "Submission deposited successfully.", "submission.sections.general.deposit_success_notice": "Depositado com sucesso.", - + // "submission.sections.general.discard_error_notice": "There was an issue when discarding the item, please try again later.", "submission.sections.general.discard_error_notice": "Ocorreu um problema ao cancelar o item, por favor tente novamente mais tarde.", - + // "submission.sections.general.discard_success_notice": "Submission discarded successfully.", "submission.sections.general.discard_success_notice": "Depósito cancelado com sucesso.", - + // "submission.sections.general.metadata-extracted": "New metadata have been extracted and added to the {{sectionId}} section.", "submission.sections.general.metadata-extracted": "Novos metadados foram extraídos e adicionados à secção {{sectionId}}.", - + // "submission.sections.general.metadata-extracted-new-section": "New {{sectionId}} section has been added to submission.", "submission.sections.general.metadata-extracted-new-section": "Nova Secção {{sectionId}} foi adicionada a dubmissão.", // "submission.sections.general.no-collection": "No collection found", "submission.sections.general.no-collection": "Não foi encontrada nenhuma coleção", - + // "submission.sections.general.no-sections": "No options available", "submission.sections.general.no-sections": "Sem opções disponíveis", // "submission.sections.general.save_error_notice": "There was an issue when saving the item, please try again later.", "submission.sections.general.save_error_notice": "Ocorreu um problema ao guardar o item, por favor tente novamente mais tarde.", - + // "submission.sections.general.save_success_notice": "Submission saved successfully.", "submission.sections.general.save_success_notice": "Depósito guardado com sucesso.", - + // "submission.sections.general.search-collection": "Search for a collection", "submission.sections.general.search-collection": "Pesquisar uma coleção", // "submission.sections.general.sections_not_valid": "There are incomplete sections.", "submission.sections.general.sections_not_valid": "Subsistem seções incompletas.", - + // "submission.sections.identifiers.info": "The following identifiers will be created for your item:", "submission.sections.identifiers.info": "Serão criados os seguintes identificadores para o seu item:", // "submission.sections.identifiers.no_handle": "No handles have been minted for this item.", "submission.sections.identifiers.no_handle": "Não foram gerados 'handles' para este item.", - + // "submission.sections.identifiers.no_doi": "No DOIs have been minted for this item.", "submission.sections.identifiers.no_doi": "Não foram gerados DOIs para este item.", @@ -6427,13 +6427,13 @@ // "submission.sections.identifiers.otherIdentifiers_label": "Other identifiers: ", "submission.sections.identifiers.otherIdentifiers_label": "Outros identificadores: ", - - // "submission.sections.submit.progressbar.accessCondition": "Item access conditions", + + // "submission.sections.submit.progressbar.accessCondition": "Item access conditions", "submission.sections.submit.progressbar.accessCondition": "Condições de acesso do item", - + // "submission.sections.submit.progressbar.CClicense": "Creative commons license", "submission.sections.submit.progressbar.CClicense": "Associar uma licença Creative Commons", - + // "submission.sections.submit.progressbar.describe.recycle": "Recycle", "submission.sections.submit.progressbar.describe.recycle": "Reciclar", @@ -6448,25 +6448,25 @@ // "submission.sections.submit.progressbar.detect-duplicate": "Potential duplicates", "submission.sections.submit.progressbar.detect-duplicate": "Potenciais duplicados", - + // "submission.sections.submit.progressbar.identifiers": "Identifiers", "submission.sections.submit.progressbar.identifiers": "Identificadores", - + // "submission.sections.submit.progressbar.license": "Deposit license", "submission.sections.submit.progressbar.license": "Licença de distribuição não-exclusiva do repositório", - + // "submission.sections.submit.progressbar.sherpapolicy": "Sherpa policies", - "submission.sections.submit.progressbar.sherpapolicy": "[Ajuda em contexto] Informação SHERPA sobre políticas de editoras e revistas face ao auto-arquivo em repositórios.", - + "submission.sections.submit.progressbar.sherpapolicy": "[Ajuda em contexto] Informação SHERPA sobre políticas de editoras e revistas face ao auto-arquivo em repositórios.", + // "submission.sections.submit.progressbar.upload": "Upload files", "submission.sections.submit.progressbar.upload": "Carregar ficheiro(s)", - + // "submission.sections.submit.progressbar.sherpaPolicies": "Publisher open access policy information", "submission.sections.submit.progressbar.sherpaPolicies": "Informação sobre a política de auto arquivo dos editores", - + // "submission.sections.sherpa-policy.title-empty": "No publisher policy information available. If your work has an associated ISSN, please enter it above to see any related publisher open access policies.", "submission.sections.sherpa-policy.title-empty": "Não foi encontrada informação disponível sobre política desta editora. Se o seu trabalho tem um ISSN associado, por favor, introduza-o em cima para poder visualizar as políticas de auto arquivo associadas.", - + // "submission.sections.status.errors.title": "Errors", "submission.sections.status.errors.title": "Erros", @@ -6484,12 +6484,12 @@ // "submission.sections.status.warnings.aria": "has warnings", "submission.sections.status.warnings.aria": "tem avisos", - + // "submission.sections.status.info.title": "Additional Information", "submission.sections.status.info.title": "Informação adicional", // "submission.sections.status.info.aria": "Additional Information", - "submission.sections.status.info.aria": "Informação adicional", + "submission.sections.status.info.aria": "Informação adicional", // "submission.sections.toggle.open": "Open section", "submission.sections.toggle.open": "Seção aberta", @@ -6499,10 +6499,10 @@ // "submission.sections.toggle.aria.open": "Expand {{sectionHeader}} section", "submission.sections.toggle.aria.open": "Expandir seção {{sectionHeader}}", - + // "submission.sections.toggle.aria.close": "Collapse {{sectionHeader}} section", "submission.sections.toggle.aria.close": "Fechar seção {{sectionHeader}}", - + // "submission.sections.upload.delete.confirm.cancel": "Cancel", "submission.sections.upload.delete.confirm.cancel": "Cancelar", @@ -6514,40 +6514,40 @@ // "submission.sections.upload.delete.confirm.title": "Delete bitstream", "submission.sections.upload.delete.confirm.title": "Remover ficheiro", - + // "submission.sections.upload.delete.submit": "Delete", "submission.sections.upload.delete.submit": "Remover", - + // "submission.sections.upload.download.title": "Download bitstream", "submission.sections.upload.download.title": "Descarregar ficheiro", - + // "submission.sections.upload.drop-message": "Drop files to attach them to the item", "submission.sections.upload.drop-message": "Arraste para aqui o(s) ficheiro(s) que pretende anexar a este registo", - + // "submission.sections.upload.edit.title": "Edit bitstream", "submission.sections.upload.edit.title": "Editar ficheiro", - + // "submission.sections.upload.form.access-condition-label": "Access condition type", "submission.sections.upload.form.access-condition-label": "Tipo de condição de acesso", - + // "submission.sections.upload.form.access-condition-hint": "Select an access condition to apply on the bitstream once the item is deposited", "submission.sections.upload.form.access-condition-hint": "Selecione um tipo de acesso a aplicar ao ficheiro assim que o item seja depositado", - + // "submission.sections.upload.form.date-required": "Date is required.", - "submission.sections.upload.form.date-required": "Data necessária.", - + "submission.sections.upload.form.date-required": "Data necessária.", + // "submission.sections.upload.form.date-required-from": "Grant access from date is required.", "submission.sections.upload.form.date-required-from": "A data de início é obrigatória.", - - // "submission.sections.upload.form.date-required-until": "Grant access until date is required.", - "submission.sections.upload.form.date-required-until": "A data de fim é obrigatória.", - + + // "submission.sections.upload.form.date-required-until": "Grant access until date is required.", + "submission.sections.upload.form.date-required-until": "A data de fim é obrigatória.", + // "submission.sections.upload.form.from-label": "Grant access from", "submission.sections.upload.form.from-label": "Acesso permitido a partir de", - + // "submission.sections.upload.form.from-hint": "Select the date from which the related access condition is applied", "submission.sections.upload.form.from-hint": "Selecione a data a partir da qual o tipo de acesso é aplicável", - + // "submission.sections.upload.form.from-placeholder": "From", "submission.sections.upload.form.from-placeholder": "De", @@ -6559,28 +6559,28 @@ // "submission.sections.upload.form.until-label": "Grant access until", "submission.sections.upload.form.until-label": "conceder acesso até", - + // "submission.sections.upload.form.until-hint": "Select the date until which the related access condition is applied", "submission.sections.upload.form.until-hint": "Selecione a data até a qual o tipo de acesso será aplicado", - + // "submission.sections.upload.form.until-placeholder": "Until", - "submission.sections.upload.form.until-placeholder": "Até", + "submission.sections.upload.form.until-placeholder": "Até", // "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": "Arquivos enviados na coleção {{collectionName}} serão acessiveis de acordo com o(s) seguinte(s) grupo(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": "Por favor note que os ficheiros enviados à coleção {{collectionName}} serão acessíveis, de acordo com o que está explicitamente definido no ficheiro, no(s) seguinte(s) grupo(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 upload additional files by dragging & dropping them anywhere on the page.", "submission.sections.upload.info": "Aqui encontra o(s) ficheiro(s) carregado(s) neste registo. Pode atualizar os metadados do(s) ficheiro(s), definir as suas condições de acesso ou carregar ficheiros adicionais arrastando-os em qualquer local da página.", - + // "submission.sections.upload.no-entry": "No", "submission.sections.upload.no-entry": "Não", // "submission.sections.upload.no-file-uploaded": "No file uploaded yet.", "submission.sections.upload.no-file-uploaded": "Nenhum ficheiro carregado!", - + // "submission.sections.upload.save-metadata": "Save metadata", "submission.sections.upload.save-metadata": "Guardar metadados", @@ -6592,19 +6592,19 @@ // "submission.sections.upload.upload-successful": "Upload successful", "submission.sections.upload.upload-successful": "Enviado com sucesso", - + // "submission.sections.accesses.form.discoverable-description": "When checked, this item will be discoverable in search/browse. When unchecked, the item will only be available via a direct link and will never appear in search/browse.", - "submission.sections.accesses.form.discoverable-description": "Quando selecionado, este item será pesquisável na pesquisa/navegação. Se não estiver selecionado, o item apenas estará disponível através uma ligação direta (link) e não aparecerá na pesquisa/navegação.", - + "submission.sections.accesses.form.discoverable-description": "Quando selecionado, este item será pesquisável na pesquisa/navegação. Se não estiver selecionado, o item apenas estará disponível através uma ligação direta (link) e não aparecerá na pesquisa/navegação.", + // "submission.sections.accesses.form.discoverable-label": "Discoverable", "submission.sections.accesses.form.discoverable-label": "Recuperável", - + // "submission.sections.accesses.form.access-condition-label": "Access condition type", "submission.sections.accesses.form.access-condition-label": "Tipo de acesso", - + // "submission.sections.accesses.form.access-condition-hint": "Select an access condition to apply on the item once it is deposited", "submission.sections.accesses.form.access-condition-hint": "Selecione um tipo de acesso para aplicar ao item no momento do seu depósito ", - + // "submission.sections.accesses.form.date-required": "Date is required.", "submission.sections.accesses.form.date-required": "O preenchimento da data é obrigatório.", @@ -6628,16 +6628,16 @@ // "submission.sections.accesses.form.group-required": "Group is required.", "submission.sections.accesses.form.group-required": "A indicação de um grupo é obrigátória.", - + // "submission.sections.accesses.form.until-label": "Grant access until", "submission.sections.accesses.form.until-label": "Conceder acesso até", // "submission.sections.accesses.form.until-hint": "Select the date until which the related access condition is applied", "submission.sections.accesses.form.until-hint": "Selecione a data até a qual o tipo de acesso é aplicável", - + // "submission.sections.accesses.form.until-placeholder": "Until", - "submission.sections.accesses.form.until-placeholder": "Até", - + "submission.sections.accesses.form.until-placeholder": "Até", + // "submission.sections.license.granted-label": "I confirm the license above", "submission.sections.license.granted-label": "Confirmo a licença", @@ -6676,7 +6676,7 @@ // "submission.sections.sherpa.publisher.policy.openaccess": "Open Access pathways permitted by this journal's policy are listed below by article version. Click on a pathway for a more detailed view", "submission.sections.sherpa.publisher.policy.openaccess": "As 'vias' de acesso aberto permitidas pela política desta revista estão listadas em baixo, tendo em consideração as versões do artigo (ex. 'Versão final publicada', 'Versão aceite do autor', 'Versão submetida'). Clique numa via para obter mais detalhes.", - + // "submission.sections.sherpa.publisher.policy.more.information": "For more information, please see the following links:", "submission.sections.sherpa.publisher.policy.more.information": "Para mais informações, consulte por favor os seguintes links:", @@ -6685,25 +6685,25 @@ // "submission.sections.sherpa.publisher.policy.embargo": "Embargo", "submission.sections.sherpa.publisher.policy.embargo": "Embargo", - + // "submission.sections.sherpa.publisher.policy.noembargo": "No Embargo", "submission.sections.sherpa.publisher.policy.noembargo": "Sem embargo", // "submission.sections.sherpa.publisher.policy.nolocation": "None", "submission.sections.sherpa.publisher.policy.nolocation": "Nenhuma", - + // "submission.sections.sherpa.publisher.policy.license": "License", "submission.sections.sherpa.publisher.policy.license": "Licença", // "submission.sections.sherpa.publisher.policy.prerequisites": "Prerequisites", "submission.sections.sherpa.publisher.policy.prerequisites": "Pré-requisitos", - + // "submission.sections.sherpa.publisher.policy.location": "Location", "submission.sections.sherpa.publisher.policy.location": "Localização", // "submission.sections.sherpa.publisher.policy.conditions": "Conditions", "submission.sections.sherpa.publisher.policy.conditions": "Condições", - + // "submission.sections.sherpa.publisher.policy.refresh": "Refresh", "submission.sections.sherpa.publisher.policy.refresh": "Atualizar", @@ -6715,7 +6715,7 @@ // "submission.sections.sherpa.record.information.date.created": "Date Created", "submission.sections.sherpa.record.information.date.created": "Data de Criação", - + // "submission.sections.sherpa.record.information.date.modified": "Last Modified", "submission.sections.sherpa.record.information.date.modified": "Última modificação", @@ -6727,31 +6727,31 @@ // "submission.submit.breadcrumbs": "New submission", "submission.submit.breadcrumbs": "Novos depósitos", - + // "submission.submit.title": "New submission", "submission.submit.title": "Novo depósito", // "submission.workflow.generic.delete": "Delete", "submission.workflow.generic.delete": "Remover", - + // "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": "Se pretende remover definitivamente este item, selecione 'Apagar'. Será solicitada confirmação.", - + // "submission.workflow.generic.edit": "Edit", "submission.workflow.generic.edit": "Editar", // "submission.workflow.generic.edit-help": "Select this option to change the item's metadata.", "submission.workflow.generic.edit-help": "Selecione esta opção para modificar os metadados do item", - + // "submission.workflow.generic.view": "View", "submission.workflow.generic.view": "Visualizar", // "submission.workflow.generic.view-help": "Select this option to view the item's metadata.", - "submission.workflow.generic.view-help": "Visualizar os metadados do item", - + "submission.workflow.generic.view-help": "Visualizar os metadados do item", + // "submission.workflow.generic.submit_select_reviewer": "Select Reviewer", "submission.workflow.generic.submit_select_reviewer": "Selecionar revisor", - + // "submission.workflow.generic.submit_select_reviewer-help": "", "submission.workflow.generic.submit_select_reviewer-help": "", @@ -6766,22 +6766,22 @@ // "submission.workflow.tasks.claimed.approve_help": "If you have reviewed the item and it is suitable for inclusion in the collection, select \"Approve\".", "submission.workflow.tasks.claimed.approve_help": "Se reviu o item e está conformidade para inclusão na coleção, selecione 'Aprovar'.", - + // "submission.workflow.tasks.claimed.edit": "Edit", "submission.workflow.tasks.claimed.edit": "Editar", // "submission.workflow.tasks.claimed.edit_help": "Select this option to change the item's metadata.", "submission.workflow.tasks.claimed.edit_help": "Selecione esta opção para modificar os metadados do item.", - + // "submission.workflow.tasks.claimed.decline": "Decline", "submission.workflow.tasks.claimed.decline": "Declinar", // "submission.workflow.tasks.claimed.decline_help": "", "submission.workflow.tasks.claimed.decline_help": "", - + // "submission.workflow.tasks.claimed.reject.reason.info": "Please enter your reason for rejecting the submission into the box below, indicating whether the submitter may fix a problem and resubmit.", "submission.workflow.tasks.claimed.reject.reason.info": "Informe em seguida o motivo da rejeição do depósito, indicando se o depositante pode corrigir algum problema e reenviar o depósito.", - + // "submission.workflow.tasks.claimed.reject.reason.placeholder": "Describe the reason of reject", "submission.workflow.tasks.claimed.reject.reason.placeholder": "Descreva o motivo da rejeição", @@ -6805,33 +6805,33 @@ // "submission.workflow.tasks.generic.error": "Error occurred during operation...", "submission.workflow.tasks.generic.error": "ocorreu um erro durante a operação...", - + // "submission.workflow.tasks.generic.processing": "Processing...", "submission.workflow.tasks.generic.processing": "A processar...", - + // "submission.workflow.tasks.generic.submitter": "Submitter", "submission.workflow.tasks.generic.submitter": "Depositante", - + // "submission.workflow.tasks.generic.success": "Operation successful", "submission.workflow.tasks.generic.success": "Operação realizada com sucesso", - + // "submission.workflow.tasks.pool.claim": "Claim", "submission.workflow.tasks.pool.claim": "Assumir", - + // "submission.workflow.tasks.pool.claim_help": "Assign this task to yourself.", "submission.workflow.tasks.pool.claim_help": "Assumir esta tarefa", - + // "submission.workflow.tasks.pool.hide-detail": "Hide detail", "submission.workflow.tasks.pool.hide-detail": "Ocultar detalhes", // "submission.workflow.tasks.pool.show-detail": "Show detail", "submission.workflow.tasks.pool.show-detail": "Mostrar detalhes", - + // "submission.workspace.generic.view": "View", "submission.workspace.generic.view": "Ver", // "submission.workspace.generic.view-help": "Select this option to view the item's metadata.", - "submission.workspace.generic.view-help": "Selecione esta opção para ver os metadados do item.", + "submission.workspace.generic.view-help": "Selecione esta opção para ver os metadados do item.", // "subscriptions.title": "subscriptions", "subscriptions.title": "Subscrições de alertas", @@ -6946,16 +6946,16 @@ // "thumbnail.project.alt": "Project Logo", "thumbnail.project.alt": "Logótipo do projeto", - + // "thumbnail.project.placeholder": "Project Placeholder Image", "thumbnail.project.placeholder": "Imagem do projeto", // "thumbnail.orgunit.alt": "OrgUnit Logo", "thumbnail.orgunit.alt": "Logótipo da unidade", - + // "thumbnail.orgunit.placeholder": "OrgUnit Placeholder Image", "thumbnail.orgunit.placeholder": "Imagem da unidade", - + // "thumbnail.person.alt": "Profile Picture", "thumbnail.person.alt": "Foto do perfil", @@ -6976,7 +6976,7 @@ // "vocabulary-treeview.search.form.search": "Search", "vocabulary-treeview.search.form.search": "pesquisar", - + // "vocabulary-treeview.search.no-result": "There were no items to show", "vocabulary-treeview.search.no-result": "Não existem itens para mostrar", @@ -6987,23 +6987,23 @@ "vocabulary-treeview.tree.description.srsc": "Categorias de Assuntos de Investigação", // "vocabulary-treeview.info": "Select a subject to add as search filter", - "vocabulary-treeview.info": "Selecione um assunto para adicionar como filtro de pesquisa", - + "vocabulary-treeview.info": "Selecione um assunto para adicionar como filtro de pesquisa", + // "uploader.browse": "browse", "uploader.browse": "navegue para o(s) carregar.", - + // "uploader.drag-message": "Drag & Drop your files here", "uploader.drag-message": "Clique e arraste o(s) seu(s) ficheiro(s) para aqui", - + // "uploader.delete.btn-title": "Delete", "uploader.delete.btn-title": "Apagar", // "uploader.or": ", or ", "uploader.or": " ou", - + // "uploader.processing": "Processing uploaded file(s)... (it's now safe to close this page)", "uploader.processing": "A processar o(s) ficheiro(s) carregado(s)... (agora é seguro fechar esta página)", - + // "uploader.queue-length": "Queue length", "uploader.queue-length": "Tamanho da fila", @@ -7015,16 +7015,16 @@ // "virtual-metadata.delete-relationship.modal-head": "Select the items for which you want to save the virtual metadata as real metadata", "virtual-metadata.delete-relationship.modal-head": "Selecione os tipos para os quais pretende guardar os metadados virtuais como metadados reais", - + // "supervisedWorkspace.search.results.head": "Supervised Items", "supervisedWorkspace.search.results.head": "Itens supervisionados", - + // "workspace.search.results.head": "Your submissions", "workspace.search.results.head": "Os meus depósitos", - + // "workflowAdmin.search.results.head": "Administer Workflow", "workflowAdmin.search.results.head": "Gestão do workflow", - + // "workflow.search.results.head": "Workflow tasks", "workflow.search.results.head": "Tarefas em workflow", @@ -7036,7 +7036,7 @@ // "workflow-item.edit.title": "Edit workflowitem", "workflow-item.edit.title": "Editar item em processamento", - + // "workflow-item.delete.notification.success.title": "Deleted", "workflow-item.delete.notification.success.title": "Apagado", @@ -7051,10 +7051,10 @@ // "workflow-item.delete.title": "Delete workflow item", "workflow-item.delete.title": "Apagar item do workflow", - + // "workflow-item.delete.header": "Delete workflow item", "workflow-item.delete.header": "Apagar item do workflow", - + // "workflow-item.delete.button.cancel": "Cancel", "workflow-item.delete.button.cancel": "Cancelar", @@ -7081,19 +7081,19 @@ // "workflow-item.send-back.button.cancel": "Cancel", "workflow-item.send-back.button.cancel": "Cancelar", - + // "workflow-item.send-back.button.confirm": "Send back", "workflow-item.send-back.button.confirm": "Devolver", - + // "workflow-item.view.breadcrumbs": "Workflow View", "workflow-item.view.breadcrumbs": "Vista das tarefas", - + // "workspace-item.view.breadcrumbs": "Workspace View", "workspace-item.view.breadcrumbs": "Vista das tarefas", - + // "workspace-item.view.title": "Workspace View", "workspace-item.view.title": "Vista das tarefas", - + // "workflow-item.advanced.title": "Advanced workflow", "workflow-item.advanced.title": "Fluxo de trabalho avançado", @@ -7144,36 +7144,36 @@ // "workflow-item.scorereviewaction.button.confirm": "Confirm", "workflow-item.scorereviewaction.button.confirm": "Confirmar", - + // "idle-modal.header": "Session will expire soon", "idle-modal.header": "A sua sessão vai expirar em breve!", - + // "idle-modal.info": "For security reasons, user sessions expire after {{ timeToExpire }} minutes of inactivity. Your session will expire soon. Would you like to extend it or log out?", "idle-modal.info": "Por razões de segurança, as sessões de utilizador expiram depois de {{ timeToExpire }} minutos de inatividade. A sua sessão expira em breve. Gostaria de a prolongar ou sair?", // "idle-modal.log-out": "Log out", "idle-modal.log-out": "Desligar", - + // "idle-modal.extend-session": "Extend session", "idle-modal.extend-session": "Prolongar sessão", - + // "researcher.profile.action.processing": "Processing...", "researcher.profile.action.processing": "A processar...", // "researcher.profile.associated": "Researcher profile associated", - "researcher.profile.associated": "Perfil do investigador associado", + "researcher.profile.associated": "Perfil do investigador associado", // "researcher.profile.change-visibility.fail": "An unexpected error occurs while changing the profile visibility", - "researcher.profile.change-visibility.fail": "Ocorre um erro inesperado ao alterar a visibilidade do perfil", + "researcher.profile.change-visibility.fail": "Ocorre um erro inesperado ao alterar a visibilidade do perfil", // "researcher.profile.create.new": "Create new", - "researcher.profile.create.new": "Criar novo", + "researcher.profile.create.new": "Criar novo", // "researcher.profile.create.success": "Researcher profile created successfully", - "researcher.profile.create.success": "Perfil do investigador criado com sucesso", + "researcher.profile.create.success": "Perfil do investigador criado com sucesso", // "researcher.profile.create.fail": "An error occurs during the researcher profile creation", - "researcher.profile.create.fail": "Ocorre um erro durante a criação do perfil do investigador", + "researcher.profile.create.fail": "Ocorre um erro durante a criação do perfil do investigador", // "researcher.profile.delete": "Delete", "researcher.profile.delete": "Remover", @@ -7185,47 +7185,47 @@ "researcher.profile.hide": "Esconder", // "researcher.profile.not.associated": "Researcher profile not yet associated", - "researcher.profile.not.associated": "Perfil do investigador ainda não associado", + "researcher.profile.not.associated": "Perfil do investigador ainda não associado", // "researcher.profile.view": "View", "researcher.profile.view": "Ver", - + // "researcher.profile.private.visibility": "PRIVATE", "researcher.profile.private.visibility": "PRIVADO", - + // "researcher.profile.public.visibility": "PUBLIC", "researcher.profile.public.visibility": "PÚBLICO", - + // "researcher.profile.status": "Status:", "researcher.profile.status": "Estado:", // "researcherprofile.claim.not-authorized": "You are not authorized to claim this item. For more details contact the administrator(s).", "researcherprofile.claim.not-authorized": "Não possui autorização para reinvindicar este artigo. Para mais pormenores, contactar o(s) administrador(es).", - + // "researcherprofile.error.claim.body": "An error occurred while claiming the profile, please try again later", "researcherprofile.error.claim.body": "Ocorreu um erro ao reclamar o perfil, por favor tente novamente mais tarde", - + // "researcherprofile.error.claim.title": "Error", - "researcherprofile.error.claim.title": "Erro", + "researcherprofile.error.claim.title": "Erro", // "researcherprofile.success.claim.body": "Profile claimed with success", "researcherprofile.success.claim.body": "Perfil reivindicado com sucesso", // "researcherprofile.success.claim.title": "Success", "researcherprofile.success.claim.title": "Sucesso", - + // "person.page.orcid.create": "Create an ORCID iD", "person.page.orcid.create": "Criar um ORCID iD", // "person.page.orcid.granted-authorizations": "Granted authorizations", - "person.page.orcid.granted-authorizations": "Autorizações concedidas", + "person.page.orcid.granted-authorizations": "Autorizações concedidas", // "person.page.orcid.grant-authorizations": "Grant authorizations", "person.page.orcid.grant-authorizations": "Conceder autorizações", - + // "person.page.orcid.link": "Connect to ORCID iD", "person.page.orcid.link": "Ligar ao ORCID iD", - + // "person.page.orcid.link.processing": "Linking profile to ORCID...", "person.page.orcid.link.processing": "Ligação do perfil ao ORCID...", @@ -7234,9 +7234,9 @@ // "person.page.orcid.orcid-not-linked-message": "The ORCID iD of this profile ({{ orcid }}) has not yet been connected to an account on the ORCID registry or the connection is expired.", "person.page.orcid.orcid-not-linked-message": "O ORCID iD deste perfil ({{{ orcid }}) ainda não foi ligado a uma conta no registo do ORCID ou a ligação está expirada.", - + // "person.page.orcid.unlink": "Disconnect from ORCID", - "person.page.orcid.unlink": "Desligar do ORCID", + "person.page.orcid.unlink": "Desligar do ORCID", // "person.page.orcid.unlink.processing": "Processing...", "person.page.orcid.unlink.processing": "A processar...", @@ -7251,11 +7251,11 @@ "person.page.orcid.no-missing-authorizations-message": "Óptimo! Esta caixa está vazia, pelo que lhe foram concedidas todos as permissões de acesso para utilizar todas as funções oferecidas pela sua instituição.", // "person.page.orcid.no-orcid-message": "No ORCID iD associated yet. By clicking on the button below it is possible to link this profile with an ORCID account.", - "person.page.orcid.no-orcid-message": "Ainda não foi associado nenhum ORCID iD. Ao clicar no botão abaixo, é possível ligar este perfil a uma conta ORCID.", - + "person.page.orcid.no-orcid-message": "Ainda não foi associado nenhum ORCID iD. Ao clicar no botão abaixo, é possível ligar este perfil a uma conta ORCID.", + // "person.page.orcid.profile-preferences": "Profile preferences", "person.page.orcid.profile-preferences": "Preferências de perfil", - + // "person.page.orcid.funding-preferences": "Funding preferences", "person.page.orcid.funding-preferences": "Preferências de financiamento", @@ -7272,14 +7272,14 @@ "person.page.orcid.sync-profile.affiliation": "Afiliação", // "person.page.orcid.sync-profile.biographical": "Biographical data", - "person.page.orcid.sync-profile.biographical": "Dados biográficos", + "person.page.orcid.sync-profile.biographical": "Dados biográficos", // "person.page.orcid.sync-profile.education": "Education", "person.page.orcid.sync-profile.education": "Educação", - + // "person.page.orcid.sync-profile.identifiers": "Identifiers", "person.page.orcid.sync-profile.identifiers": "Identificadores", - + // "person.page.orcid.sync-fundings.all": "All fundings", "person.page.orcid.sync-fundings.all": "Todos financiamentos", @@ -7288,16 +7288,16 @@ // "person.page.orcid.sync-fundings.my_selected": "Selected fundings", "person.page.orcid.sync-fundings.my_selected": "Financiamentos selecionados", - + // "person.page.orcid.sync-fundings.disabled": "Disabled", - "person.page.orcid.sync-fundings.disabled": "Desligado", + "person.page.orcid.sync-fundings.disabled": "Desligado", // "person.page.orcid.sync-publications.all": "All publications", "person.page.orcid.sync-publications.all": "Todas as publicações", - + // "person.page.orcid.sync-publications.mine": "My publications", "person.page.orcid.sync-publications.mine": "As minhas publicações", - + // "person.page.orcid.sync-publications.my_selected": "Selected publications", "person.page.orcid.sync-publications.my_selected": "Publicações selecionadas", @@ -7314,16 +7314,16 @@ "person.page.orcid.sync-queue.discard.success": "O registo da fila do ORCID foi descartado com sucesso", // "person.page.orcid.sync-queue.empty-message": "The ORCID queue registry is empty", - "person.page.orcid.sync-queue.empty-message": "O registo de filas do ORCID está vazio", + "person.page.orcid.sync-queue.empty-message": "O registo de filas do ORCID está vazio", // "person.page.orcid.sync-queue.table.header.type": "Type", - "person.page.orcid.sync-queue.table.header.type": "Tipo", + "person.page.orcid.sync-queue.table.header.type": "Tipo", // "person.page.orcid.sync-queue.table.header.description": "Description", - "person.page.orcid.sync-queue.table.header.description": "Descrição", + "person.page.orcid.sync-queue.table.header.description": "Descrição", // "person.page.orcid.sync-queue.table.header.action": "Action", - "person.page.orcid.sync-queue.table.header.action": "Ação", + "person.page.orcid.sync-queue.table.header.action": "Ação", // "person.page.orcid.sync-queue.description.affiliation": "Affiliations", "person.page.orcid.sync-queue.description.affiliation": "Afiliações", @@ -7342,7 +7342,7 @@ // "person.page.orcid.sync-queue.description.qualification": "Qualifications", "person.page.orcid.sync-queue.description.qualification": "Qualificações", - + // "person.page.orcid.sync-queue.description.researcher_urls": "Researcher urls", "person.page.orcid.sync-queue.description.researcher_urls": "URLS dos investigadores", @@ -7366,15 +7366,15 @@ // "person.page.orcid.sync-queue.tooltip.affiliation": "Affiliation", "person.page.orcid.sync-queue.tooltip.affiliation": "Afiliação", - + // "person.page.orcid.sync-queue.tooltip.education": "Education", "person.page.orcid.sync-queue.tooltip.education": "Educação", // "person.page.orcid.sync-queue.tooltip.qualification": "Qualification", "person.page.orcid.sync-queue.tooltip.qualification": "Qualificação", - + // "person.page.orcid.sync-queue.tooltip.other_names": "Other name", - "person.page.orcid.sync-queue.tooltip.other_names": "Outro nome", + "person.page.orcid.sync-queue.tooltip.other_names": "Outro nome", // "person.page.orcid.sync-queue.tooltip.country": "Country", "person.page.orcid.sync-queue.tooltip.country": "País", @@ -7383,10 +7383,10 @@ "person.page.orcid.sync-queue.tooltip.keywords": "Palavra-chave", // "person.page.orcid.sync-queue.tooltip.external_ids": "External identifier", - "person.page.orcid.sync-queue.tooltip.external_ids": "Identificadores externos", + "person.page.orcid.sync-queue.tooltip.external_ids": "Identificadores externos", // "person.page.orcid.sync-queue.tooltip.researcher_urls": "Researcher url", - "person.page.orcid.sync-queue.tooltip.researcher_urls": "URL do investigador", + "person.page.orcid.sync-queue.tooltip.researcher_urls": "URL do investigador", // "person.page.orcid.sync-queue.send": "Synchronize with ORCID registry", "person.page.orcid.sync-queue.send": "Sincronizar com o registo ORCID", @@ -7399,9 +7399,9 @@ // "person.page.orcid.sync-queue.send.bad-request-error": "The submission to ORCID failed because the resource sent to ORCID registry is not valid", "person.page.orcid.sync-queue.send.bad-request-error": "A submissão ao ORCID falhou porque o recurso enviado para o registo do ORCID não é válido", - + // "person.page.orcid.sync-queue.send.error": "The submission to ORCID failed", - "person.page.orcid.sync-queue.send.error": "A submissão ao ORCID falhou", + "person.page.orcid.sync-queue.send.error": "A submissão ao ORCID falhou", // "person.page.orcid.sync-queue.send.conflict-error": "The submission to ORCID failed because the resource is already present on the ORCID registry", "person.page.orcid.sync-queue.send.conflict-error": "A submissão ao ORCID falhou porque o recurso já existe no registo do ORCID", @@ -7425,22 +7425,22 @@ "person.page.orcid.sync-queue.send.validation-error.title.required": "O título é obrigatório", // "person.page.orcid.sync-queue.send.validation-error.type.required": "The dc.type is required", - "person.page.orcid.sync-queue.send.validation-error.type.required": "O campo 'dc.type' é obrigatório", + "person.page.orcid.sync-queue.send.validation-error.type.required": "O campo 'dc.type' é obrigatório", // "person.page.orcid.sync-queue.send.validation-error.start-date.required": "The start date is required", - "person.page.orcid.sync-queue.send.validation-error.start-date.required": "A data de início é obrigatória", + "person.page.orcid.sync-queue.send.validation-error.start-date.required": "A data de início é obrigatória", // "person.page.orcid.sync-queue.send.validation-error.funder.required": "The funder is required", - "person.page.orcid.sync-queue.send.validation-error.funder.required": "O financiador é obrigatório", + "person.page.orcid.sync-queue.send.validation-error.funder.required": "O financiador é obrigatório", // "person.page.orcid.sync-queue.send.validation-error.country.invalid": "Invalid 2 digits ISO 3166 country", "person.page.orcid.sync-queue.send.validation-error.country.invalid": "País inválido (2 dígitos ISO 3166)", - // "person.page.orcid.sync-queue.send.validation-error.organization.required": "The organization is required", + // "person.page.orcid.sync-queue.send.validation-error.organization.required": "The organization is required", "person.page.orcid.sync-queue.send.validation-error.organization.required": "A organização é obrigatória", - + // "person.page.orcid.sync-queue.send.validation-error.organization.name-required": "The organization's name is required", - "person.page.orcid.sync-queue.send.validation-error.organization.name-required": "O nome da organização é obrigatório", + "person.page.orcid.sync-queue.send.validation-error.organization.name-required": "O nome da organização é obrigatório", // "person.page.orcid.sync-queue.send.validation-error.publication.date-invalid": "The publication date must be one year after 1900", "person.page.orcid.sync-queue.send.validation-error.publication.date-invalid": "A data de publicação deve ser um ano após 1900", @@ -7464,23 +7464,23 @@ "person.page.orcid.sync-queue.send.validation-error.disambiguation-source.required": "Os identificadores da organização requerem uma fonte", // "person.page.orcid.sync-queue.send.validation-error.disambiguation-source.invalid": "The source of one of the organization identifiers is invalid. Supported sources are RINGGOLD, GRID, LEI and FUNDREF", - "person.page.orcid.sync-queue.send.validation-error.disambiguation-source.invalid": "A fonte de um dos identificadores da organização é inválida. As fontes suportadas são RINGGOLD, GRID, LEI e FUNDREF", + "person.page.orcid.sync-queue.send.validation-error.disambiguation-source.invalid": "A fonte de um dos identificadores da organização é inválida. As fontes suportadas são RINGGOLD, GRID, LEI e FUNDREF", // "person.page.orcid.synchronization-mode": "Synchronization mode", - "person.page.orcid.synchronization-mode": "Modo sincronização", + "person.page.orcid.synchronization-mode": "Modo sincronização", // "person.page.orcid.synchronization-mode.batch": "Batch", - "person.page.orcid.synchronization-mode.batch": "Lote", + "person.page.orcid.synchronization-mode.batch": "Lote", // "person.page.orcid.synchronization-mode.label": "Synchronization mode", "person.page.orcid.synchronization-mode.label": "Modo sincronização", - + // "person.page.orcid.synchronization-mode-message": "Please select how you would like synchronization to ORCID to occur. The options include 'Manual' (you must send your data to ORCID manually), or 'Batch' (the system will send your data to ORCID via a scheduled script).", "person.page.orcid.synchronization-mode-message": "Por favor, selecione a forma como deseja que a sincronização com ORCID ocorra. As opções incluem 'Manual' (deve enviar os seus dados para o ORCID manualmente), ou 'Batch' (o sistema enviará os seus dados para o ORCID através de um script agendado).", - + // "person.page.orcid.synchronization-mode-funding-message": "Select whether to send your linked Project entities to your ORCID record's list of funding information.", "person.page.orcid.synchronization-mode-funding-message": "Selecione se pretende enviar as suas entidades ligadas de 'Projeto' para a lista de informação de financiamento do seu registo ORCID.", - + // "person.page.orcid.synchronization-mode-publication-message": "Select whether to send your linked Publication entities to your ORCID record's list of works.", "person.page.orcid.synchronization-mode-publication-message": "Selecione se pretende enviar as suas entidades ligadas de 'Publicação' associadas à lista de obras do seu registo ORCID.", @@ -7494,7 +7494,7 @@ "person.page.orcid.synchronization-settings-update.error": "A atualização das definições de sincronização falhou", // "person.page.orcid.synchronization-mode.manual": "Manual", - "person.page.orcid.synchronization-mode.manual": "Manual", + "person.page.orcid.synchronization-mode.manual": "Manual", // "person.page.orcid.scope.authenticate": "Get your ORCID iD", "person.page.orcid.scope.authenticate": "Obtenha o seu ORCID iD", @@ -7510,22 +7510,22 @@ // "person.page.orcid.unlink.success": "The disconnection between the profile and the ORCID registry was successful", "person.page.orcid.unlink.success": "A desconexão entre o perfil e o registo ORCID foi bem sucedida", - + // "person.page.orcid.unlink.error": "An error occurred while disconnecting between the profile and the ORCID registry. Try again", "person.page.orcid.unlink.error": "Ocorreu um erro ao desligar o perfil e o registo ORCID. Tente novamente.", // "person.orcid.sync.setting": "ORCID Synchronization settings", - "person.orcid.sync.setting": "Definições de sincronização ORCID", - + "person.orcid.sync.setting": "Definições de sincronização ORCID", + // "person.orcid.registry.queue": "ORCID Registry Queue", "person.orcid.registry.queue": "Fila de registo ORCID", - + // "person.orcid.registry.auth": "ORCID Authorizations", - "person.orcid.registry.auth": "Autorizações ORCID", - + "person.orcid.registry.auth": "Autorizações ORCID", + // "home.recent-submissions.head": "Recent Submissions", "home.recent-submissions.head": "Entradas recentes", - + // "listable-notification-object.default-message": "This object couldn't be retrieved", "listable-notification-object.default-message": "Este objeto não pode ser recuperado", @@ -7543,7 +7543,7 @@ // "system-wide-alert-banner.countdown.minutes": "{{minutes}} minute(s):", "system-wide-alert-banner.countdown.minutes": "{{minutos}} minuto(s):", - + // "menu.section.system-wide-alert": "System-wide Alert", "menu.section.system-wide-alert": "Alertas gerais do sistema", @@ -7591,101 +7591,100 @@ // "system-wide-alert.form.create.error": "Something went wrong when creating the system-wide alert", "system-wide-alert.form.create.error": "Algo correu mal ao criar o alerta geral do sistema", - + // "admin.system-wide-alert.breadcrumbs": "System-wide Alerts", "admin.system-wide-alert.breadcrumbs": "Alertas gerais do sistema", - + // "admin.system-wide-alert.title": "System-wide Alerts", - "admin.system-wide-alert.title": "Alertas gerais do sistema", - - - - // Other strings... + "admin.system-wide-alert.title": "Alertas gerais do sistema", + + + + // Other strings... // Missing, Duplicate or Redundant ??? - + // NOT FOUND 30-05-2023 - - + + // "datafile.listelement.badge": "Data file", "datafile.listelement.badge": "Ficheiro de dados", - + // "datapackage.listelement.badge": "Data package", - "datapackage.listelement.badge": "Pacote de dados", + "datapackage.listelement.badge": "Pacote de dados", // "browse.next.button": "Next", "browse.next.button": "Próximo", // "browse.previous.button": "Previous", - "browse.previous.button": "Anterior", - + "browse.previous.button": "Anterior", + // "curation-task.task.registerdoi.label": "DOI check", "curation-task.task.registerdoi.label": "Verificação de DOIs", - + // "mydspace.general.text-here": "here", "mydspace.general.text-here": "aqui", - + // "mydspace.upload.upload-successful": "New workspace item created. Click {{here}} for edit it.", "mydspace.upload.upload-successful": "Novo item de espaço de trabalho criado. Clique {{here}} para o editar.", - + // "profile.security.form.notifications.error.not-long-enough": "The password has to be at least 6 characters long.", "profile.security.form.notifications.error.not-long-enough": "A senha deve ter pelo menos 6 caracteres.", - + // "register-page.create-profile.security.error.password-length": "The password should be at least 6 characters long.", "register-page.create-profile.security.error.password-length": "A senha deve possuir pelo menos 6 caracteres.", - + // "search.form.search_mydspace": "Search MyDSpace", "search.form.search_mydspace": "Pesquisar na Área Pessoal", - + // "forgot-password.form.error.password-length": "The password should be at least 6 characters long.", "forgot-password.form.error.password-length": "A senha deve ter pelo menos 6 caracteres.", - + // "search.filters.entityType.Publication": "Publicação", "search.filters.entityType.Publication": "Publicação", - + // "search.filters.entityType.Person": "Pessoa", "search.filters.entityType.Person": "Pessoa", - + // "search.filters.entityType.Project": "Projecto", "search.filters.entityType.Project": "Projeto", - + // "search.filters.entityType.Journal": "Revista", "search.filters.entityType.Journal": "Revista", - + // "search.filters.entityType.DataFile": "Data File", "search.filters.entityType.DataFile": "Ficheiro de dados", - + // "forgot-email.form.google-recaptcha.must-accept-cookies": "Must accept cookies", - "forgot-email.form.google-recaptcha.must-accept-cookies": "Deve aceitar cookies", - + "forgot-email.form.google-recaptcha.must-accept-cookies": "Deve aceitar cookies", + // "forgot-email.form.google-recaptcha.open-cookie-settings": "Cookie settings", - "forgot-email.form.google-recaptcha.open-cookie-settings": "Configurar cookies", - + "forgot-email.form.google-recaptcha.open-cookie-settings": "Configurar cookies", + // "submission.sections.describe.relationship-lookup.external-source.import-modal.isProjectOfPublication.added.local-entity": "Successfully imported and added external project to the selection", "submission.sections.describe.relationship-lookup.external-source.import-modal.isProjectOfPublication.added.local-entity": "Importado com sucesso e adicionado autor à seleção", // "search.filters.namedresourcetype.Archived": "Archived", "search.filters.namedresourcetype.Archived": "Aceites", - + // "search.filters.namedresourcetype.Workspace": "Workspace", "search.filters.namedresourcetype.Workspace": "Por terminar", - + // "search.filters.namedresourcetype.Workflow": "Workflow", "search.filters.namedresourcetype.Workflow": "Em fluxo de trabalho", - + // "search.filters.namedresourcetype.Validation": "Validation", "search.filters.namedresourcetype.Validation": "Em validação", - + // "orgunit.search.results.head": "Organizational Unit Search Results", "orgunit.search.results.head": "Resultados da pesquisa de organizações", - + // "orgunit-relationships.search.results.head": "Organizational Unit Search Results", "orgunit-relationships.search.results.head": "Resultados da pesquisa de organizações", - + // "journalissue.search.results.head": "Journal Issue Search Results", "journalissue.search.results.head": "Resultados da pesquisa de números", - + // "journalissue-relationships.search.results.head": "Journal Issue Search Results", "journalissue-relationships.search.results.head": "Resultados da pesquisa de números", - } From 29f283b35e7ed8f2fae3b451e5f4eccdaaba3310 Mon Sep 17 00:00:00 2001 From: rsaraivac <122451983+rsaraivac@users.noreply.github.com> Date: Wed, 31 May 2023 20:11:38 +0100 Subject: [PATCH 305/409] Update pt-PT.json5 --- src/assets/i18n/pt-PT.json5 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/assets/i18n/pt-PT.json5 b/src/assets/i18n/pt-PT.json5 index 8dff07a387..735cb4df4c 100644 --- a/src/assets/i18n/pt-PT.json5 +++ b/src/assets/i18n/pt-PT.json5 @@ -4261,8 +4261,8 @@ // "menu.section.registries_metadata": "Metadata", "menu.section.registries_metadata": "Metadados", - - // "menu.section.statistics": "Statistics", + + // "menu.section.statistics": "Statistics", "menu.section.statistics": "Estatísticas", // "menu.section.statistics_task": "Statistics Task", From c84db3ce3dabd5fe3b8884d4be9ba6ed1b5be665 Mon Sep 17 00:00:00 2001 From: rsaraivac <122451983+rsaraivac@users.noreply.github.com> Date: Wed, 31 May 2023 20:34:21 +0100 Subject: [PATCH 306/409] Update pt-PT.json5 --- src/assets/i18n/pt-PT.json5 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/assets/i18n/pt-PT.json5 b/src/assets/i18n/pt-PT.json5 index 735cb4df4c..74b1ff3e68 100644 --- a/src/assets/i18n/pt-PT.json5 +++ b/src/assets/i18n/pt-PT.json5 @@ -4261,7 +4261,7 @@ // "menu.section.registries_metadata": "Metadata", "menu.section.registries_metadata": "Metadados", - + // "menu.section.statistics": "Statistics", "menu.section.statistics": "Estatísticas", From 43e1e6d22bf97d94b531abc99e93d7f1440dc7be Mon Sep 17 00:00:00 2001 From: Art Lowel Date: Thu, 1 Jun 2023 10:56:44 +0200 Subject: [PATCH 307/409] add noreferrer to license link --- .../cc-license/submission-section-cc-licenses.component.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/submission/sections/cc-license/submission-section-cc-licenses.component.html b/src/app/submission/sections/cc-license/submission-section-cc-licenses.component.html index bdde0ff470..20743540a8 100644 --- a/src/app/submission/sections/cc-license/submission-section-cc-licenses.component.html +++ b/src/app/submission/sections/cc-license/submission-section-cc-licenses.component.html @@ -128,7 +128,7 @@
    {{ 'submission.sections.ccLicense.link' | translate }}
    - + {{ licenseLink }}
    From d1dff0553d9a2b7b8af1ac9856be4367b8a8cc4a Mon Sep 17 00:00:00 2001 From: Art Lowel Date: Thu, 1 Jun 2023 11:00:26 +0200 Subject: [PATCH 308/409] fix lint error --- src/app/core/services/browser.referrer.service.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/core/services/browser.referrer.service.ts b/src/app/core/services/browser.referrer.service.ts index 5aae750599..64be95d241 100644 --- a/src/app/core/services/browser.referrer.service.ts +++ b/src/app/core/services/browser.referrer.service.ts @@ -1,7 +1,7 @@ import { ReferrerService } from './referrer.service'; import { Observable } from 'rxjs'; import { map } from 'rxjs/operators'; -import { isEmpty, hasNoValue } from '../../shared/empty.util'; +import { hasNoValue } from '../../shared/empty.util'; import { URLCombiner } from '../url-combiner/url-combiner'; import { Inject, Injectable } from '@angular/core'; import { DOCUMENT } from '@angular/common'; From c1dcebbd049d420f88a2a0b90cca8ae6f33fd340 Mon Sep 17 00:00:00 2001 From: Enea Jahollari Date: Thu, 1 Jun 2023 15:27:11 +0200 Subject: [PATCH 309/409] Fix: fix validation and translation Show/hide the datepicker based on the value --- .../access-control-array-form.component.html | 119 ++++++++------- .../access-control-array-form.component.scss | 7 + ...ccess-control-array-form.component.spec.ts | 53 ++++--- .../access-control-array-form.component.ts | 137 +++++++----------- .../control-max-end-date.pipe.ts | 26 ---- .../control-max-start-date.pipe.ts | 27 ---- .../access-control-array-form/to-date.pipe.ts | 23 +++ ...cess-control-form-container.component.html | 4 +- .../access-control-form.module.ts | 38 +++-- src/assets/i18n/en.json5 | 22 +-- 10 files changed, 214 insertions(+), 242 deletions(-) delete mode 100644 src/app/shared/access-control-form-container/access-control-array-form/control-max-end-date.pipe.ts delete mode 100644 src/app/shared/access-control-form-container/access-control-array-form/control-max-start-date.pipe.ts create mode 100644 src/app/shared/access-control-form-container/access-control-array-form/to-date.pipe.ts diff --git a/src/app/shared/access-control-form-container/access-control-array-form/access-control-array-form.component.html b/src/app/shared/access-control-form-container/access-control-array-form/access-control-array-form.component.html index 9460fb4ffe..9158bc3576 100644 --- a/src/app/shared/access-control-form-container/access-control-array-form/access-control-array-form.component.html +++ b/src/app/shared/access-control-form-container/access-control-array-form/access-control-array-form.component.html @@ -1,65 +1,87 @@ - -
    + +
    {{'access-control-no-access-conditions-warning-message' | translate}}
    - -
    + +
    - - - {{'access-control-option-note' | translate}} + + {{'access-control-option-note' | translate}} +
    -
    - - -
    - +
    + +
    + +
    + +
    - {{'access-control-option-start-date-note' | translate}} + + {{'access-control-option-start-date-note' | translate}} +
    -
    - - -
    - +
    + +
    + +
    + +
    - {{'access-control-option-end-date-note' | translate}} + + {{'access-control-option-end-date-note' | translate}} +
    @@ -68,18 +90,17 @@
    - - - - -
    -
    - -
    -
    -
    - - - - - - From 97673471f7aadee954bf4a06cd9038c40d1f8a53 Mon Sep 17 00:00:00 2001 From: "Mark H. Wood" Date: Thu, 1 Jun 2023 12:20:59 -0400 Subject: [PATCH 315/409] Remove inherited input declarations. --- .../file/section-upload-file.component.ts | 73 +------------------ 1 file changed, 1 insertion(+), 72 deletions(-) diff --git a/src/themes/custom/app/submission/sections/upload/file/section-upload-file.component.ts b/src/themes/custom/app/submission/sections/upload/file/section-upload-file.component.ts index 00431cbbe2..369af4e36c 100644 --- a/src/themes/custom/app/submission/sections/upload/file/section-upload-file.component.ts +++ b/src/themes/custom/app/submission/sections/upload/file/section-upload-file.component.ts @@ -1,13 +1,4 @@ -import { - Component, Input, ViewChild -} from '@angular/core'; - -import { - SubmissionFormsModel -} from 'src/app/core/config/models/config-submission-forms.model'; -import { - SubmissionSectionUploadFileEditComponent -} from 'src/app/submission/sections/upload/file/edit/section-upload-file-edit.component'; +import { Component } from '@angular/core'; import { SubmissionSectionUploadFileComponent as BaseComponent } from 'src/app/submission/sections/upload/file/section-upload-file.component'; @@ -24,66 +15,4 @@ import { }) export class SubmissionSectionUploadFileComponent extends BaseComponent { - - /** - * The list of available access condition - * @type {Array} - */ - @Input() availableAccessConditionOptions: any[]; - - /** - * The submission id - * @type {string} - */ - @Input() collectionId: string; - - /** - * Define if collection access conditions policy type : - * POLICY_DEFAULT_NO_LIST : is not possible to define additional access group/s for the single file - * POLICY_DEFAULT_WITH_LIST : is possible to define additional access group/s for the single file - * @type {number} - */ - @Input() collectionPolicyType: number; - - /** - * The configuration for the bitstream's metadata form - * @type {SubmissionFormsModel} - */ - @Input() configMetadataForm: SubmissionFormsModel; - - /** - * The bitstream id - * @type {string} - */ - @Input() fileId: string; - - /** - * The bitstream array key - * @type {string} - */ - @Input() fileIndex: string; - - /** - * The bitstream id - * @type {string} - */ - @Input() fileName: string; - - /** - * The section id - * @type {string} - */ - @Input() sectionId: string; - - /** - * The submission id - * @type {string} - */ - @Input() submissionId: string; - - /** - * The [[SubmissionSectionUploadFileEditComponent]] reference - * @type {SubmissionSectionUploadFileEditComponent} - */ - @ViewChild(SubmissionSectionUploadFileEditComponent) fileEditComp: SubmissionSectionUploadFileEditComponent; } From 86e1333025a26af288d44b213d1746c335da8930 Mon Sep 17 00:00:00 2001 From: Michael Spalti Date: Fri, 5 May 2023 11:50:45 -0700 Subject: [PATCH 316/409] Possible fix for browse-by-date links --- src/app/shared/starts-with/date/starts-with-date.component.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/app/shared/starts-with/date/starts-with-date.component.ts b/src/app/shared/starts-with/date/starts-with-date.component.ts index d65d12b413..89d9361b6a 100644 --- a/src/app/shared/starts-with/date/starts-with-date.component.ts +++ b/src/app/shared/starts-with/date/starts-with-date.component.ts @@ -131,7 +131,6 @@ export class StartsWithDateComponent extends StartsWithAbstractComponent { } else { this.startsWithYear = +startsWith; } - this.setStartsWithParam(false); } /** From 8e450402af8ea6af0d038d04af666bdd0b560600 Mon Sep 17 00:00:00 2001 From: Michael Spalti Date: Thu, 1 Jun 2023 08:46:25 -0700 Subject: [PATCH 317/409] Removed unnecessary route navigation. --- src/app/shared/starts-with/starts-with-abstract.component.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/app/shared/starts-with/starts-with-abstract.component.ts b/src/app/shared/starts-with/starts-with-abstract.component.ts index 26140dcc6d..ad9c56c970 100644 --- a/src/app/shared/starts-with/starts-with-abstract.component.ts +++ b/src/app/shared/starts-with/starts-with-abstract.component.ts @@ -70,7 +70,6 @@ export abstract class StartsWithAbstractComponent implements OnInit, OnDestroy { */ setStartsWith(startsWith: string) { this.startsWith = startsWith; - this.setStartsWithParam(false); } /** From dd548c20e9c9cf0144a5ee60f003f65f36238546 Mon Sep 17 00:00:00 2001 From: "Mark H. Wood" Date: Thu, 1 Jun 2023 13:48:17 -0400 Subject: [PATCH 318/409] Add blank custom versions to 'custom' theme. --- .../deny-request-copy.component.html | 0 .../deny-request-copy.component.scss | 1 + .../deny-request-copy.component.ts | 15 +++++++++++++++ .../email-request-copy.component.html | 14 ++++++++++++++ .../email-request-copy.component.scss | 0 .../email-request-copy.component.ts | 15 +++++++++++++++ .../grant-request-copy.component.html | 0 .../grant-request-copy.component.scss | 0 .../grant-request-copy.component.ts | 15 +++++++++++++++ src/themes/custom/lazy-theme.module.ts | 12 ++++++++++++ 10 files changed, 72 insertions(+) create mode 100644 src/themes/custom/app/request-copy/deny-request-copy/deny-request-copy.component.html create mode 100644 src/themes/custom/app/request-copy/deny-request-copy/deny-request-copy.component.scss create mode 100644 src/themes/custom/app/request-copy/deny-request-copy/deny-request-copy.component.ts create mode 100644 src/themes/custom/app/request-copy/email-request-copy/email-request-copy.component.html create mode 100644 src/themes/custom/app/request-copy/email-request-copy/email-request-copy.component.scss create mode 100644 src/themes/custom/app/request-copy/email-request-copy/email-request-copy.component.ts create mode 100644 src/themes/custom/app/request-copy/grant-request-copy/grant-request-copy.component.html create mode 100644 src/themes/custom/app/request-copy/grant-request-copy/grant-request-copy.component.scss create mode 100644 src/themes/custom/app/request-copy/grant-request-copy/grant-request-copy.component.ts diff --git a/src/themes/custom/app/request-copy/deny-request-copy/deny-request-copy.component.html b/src/themes/custom/app/request-copy/deny-request-copy/deny-request-copy.component.html new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/themes/custom/app/request-copy/deny-request-copy/deny-request-copy.component.scss b/src/themes/custom/app/request-copy/deny-request-copy/deny-request-copy.component.scss new file mode 100644 index 0000000000..8b13789179 --- /dev/null +++ b/src/themes/custom/app/request-copy/deny-request-copy/deny-request-copy.component.scss @@ -0,0 +1 @@ + diff --git a/src/themes/custom/app/request-copy/deny-request-copy/deny-request-copy.component.ts b/src/themes/custom/app/request-copy/deny-request-copy/deny-request-copy.component.ts new file mode 100644 index 0000000000..fb65aae9bc --- /dev/null +++ b/src/themes/custom/app/request-copy/deny-request-copy/deny-request-copy.component.ts @@ -0,0 +1,15 @@ +import { Component } from '@angular/core'; +import { + DenyRequestCopyComponent as BaseComponent +} from 'src/app/request-copy/deny-request-copy/deny-request-copy.component'; + +@Component({ + selector: 'ds-deny-request-copy', + // styleUrls: ['./deny-request-copy.component.scss'], + styleUrls: [], + // templateUrl: './deny-request-copy.component.html', + templateUrl: './../../request-copy/deny-request-copy/deny-request-copy.component.html', +}) +export class DenyRequestCopyComponent + extends BaseComponent { +} diff --git a/src/themes/custom/app/request-copy/email-request-copy/email-request-copy.component.html b/src/themes/custom/app/request-copy/email-request-copy/email-request-copy.component.html new file mode 100644 index 0000000000..072f4d4a52 --- /dev/null +++ b/src/themes/custom/app/request-copy/email-request-copy/email-request-copy.component.html @@ -0,0 +1,14 @@ + + + + + TODO supply a title + + + + +
    TODO write content
    + + diff --git a/src/themes/custom/app/request-copy/email-request-copy/email-request-copy.component.scss b/src/themes/custom/app/request-copy/email-request-copy/email-request-copy.component.scss new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/themes/custom/app/request-copy/email-request-copy/email-request-copy.component.ts b/src/themes/custom/app/request-copy/email-request-copy/email-request-copy.component.ts new file mode 100644 index 0000000000..d4da93a99f --- /dev/null +++ b/src/themes/custom/app/request-copy/email-request-copy/email-request-copy.component.ts @@ -0,0 +1,15 @@ +import { Component } from '@angular/core'; +import { + EmailRequestCopyComponent as BaseComponent +} from 'src/app/request-copy/email-request-copy/email-request-copy.component'; + +@Component({ + selector: 'ds-email-request-copy', + // styleUrls: ['./email-request-copy.component.scss'], + styleUrls: [], + // templateUrl: './email-request-copy.component.html', + templateUrl: './../../request-copy/email-request-copy/email-request-copy.component.html', +}) +export class EmailRequestCopyComponent + extends BaseComponent { +} diff --git a/src/themes/custom/app/request-copy/grant-request-copy/grant-request-copy.component.html b/src/themes/custom/app/request-copy/grant-request-copy/grant-request-copy.component.html new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/themes/custom/app/request-copy/grant-request-copy/grant-request-copy.component.scss b/src/themes/custom/app/request-copy/grant-request-copy/grant-request-copy.component.scss new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/themes/custom/app/request-copy/grant-request-copy/grant-request-copy.component.ts b/src/themes/custom/app/request-copy/grant-request-copy/grant-request-copy.component.ts new file mode 100644 index 0000000000..20d0ae90c1 --- /dev/null +++ b/src/themes/custom/app/request-copy/grant-request-copy/grant-request-copy.component.ts @@ -0,0 +1,15 @@ +import { Component } from '@angular/core'; +import { + GrantRequestCopyComponent as BaseComponent +} from 'src/app/request-copy/grant-request-copy/grant-request-copy.component'; + +@Component({ + selector: 'ds-grant-request-copy', + // styleUrls: ['./grant-request-copy.component.scss'], + styleUrls: [], + // templateUrl: './grant-request-copy.component.html', + templateUrl: './../../request-copy/grant-request-copy/grant-request-copy.component.html', +}) +export class GrantRequestCopyComponent + extends BaseComponent { +} diff --git a/src/themes/custom/lazy-theme.module.ts b/src/themes/custom/lazy-theme.module.ts index b1290cc634..e055018db1 100644 --- a/src/themes/custom/lazy-theme.module.ts +++ b/src/themes/custom/lazy-theme.module.ts @@ -145,6 +145,15 @@ import { MediaViewerVideoComponent } from './app/item-page/media-viewer/media-viewer-video/media-viewer-video.component'; import { NgxGalleryModule } from '@kolkov/ngx-gallery'; +import { + DenyRequestCopyComponent +} from './app/request-copy/deny-request-copy/deny-request-copy.component'; +import { + EmailRequestCopyComponent +} from './app/request-copy/email-request-copy/email-request-copy.component'; +import { + GrantRequestCopyComponent +} from './app/request-copy/grant-request-copy/grant-request-copy.component'; const DECLARATIONS = [ FileSectionComponent, @@ -212,6 +221,9 @@ const DECLARATIONS = [ MediaViewerComponent, MediaViewerImageComponent, MediaViewerVideoComponent, + DenyRequestCopyComponent, + EmailRequestCopyComponent, + GrantRequestCopyComponent, ]; @NgModule({ From da245b88b8bce2bce566b745c7120a816b713dac Mon Sep 17 00:00:00 2001 From: Alan Orth Date: Fri, 2 Jun 2023 12:59:20 +0300 Subject: [PATCH 319/409] src/assets/i18n: fix English permission string The current message is not correct English. Note, there seems to be a mix of "don't" and "do not" language. Perhaps we should harmonize that eventually. --- src/assets/i18n/en.json5 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/assets/i18n/en.json5 b/src/assets/i18n/en.json5 index 93418dc189..b1959c5f95 100644 --- a/src/assets/i18n/en.json5 +++ b/src/assets/i18n/en.json5 @@ -4061,7 +4061,7 @@ "submission.general.cancel": "Cancel", - "submission.general.cannot_submit": "You have not the privilege to make a new submission.", + "submission.general.cannot_submit": "You don't have permission to make a new submission.", "submission.general.deposit": "Deposit", From 9d08cac56603dda7d0271f9af826c12082d85e35 Mon Sep 17 00:00:00 2001 From: Nona Luypaert Date: Fri, 2 Jun 2023 13:31:53 +0200 Subject: [PATCH 320/409] 101623: Reset in Treeview also resets selectedItems + Provide TreeviewService in root --- src/app/browse-by/browse-by-page.module.ts | 2 +- .../vocabularies/vocabulary.service.ts | 6 ++++-- src/app/shared/form/form.module.ts | 2 -- .../vocabulary-treeview.component.html | 2 ++ .../vocabulary-treeview.component.spec.ts | 10 ++++++++++ .../vocabulary-treeview.component.ts | 17 +++++++++++++++-- .../vocabulary-treeview.service.ts | 4 +++- src/modules/app/browser-app.module.ts | 5 ----- 8 files changed, 35 insertions(+), 13 deletions(-) diff --git a/src/app/browse-by/browse-by-page.module.ts b/src/app/browse-by/browse-by-page.module.ts index fea6668b3c..2f4ae433c9 100644 --- a/src/app/browse-by/browse-by-page.module.ts +++ b/src/app/browse-by/browse-by-page.module.ts @@ -13,7 +13,7 @@ import { BrowseByGuard } from './browse-by-guard'; providers: [ ItemDataService, BrowseService, - BrowseByGuard + BrowseByGuard, ] }) export class BrowseByPageModule { diff --git a/src/app/core/submission/vocabularies/vocabulary.service.ts b/src/app/core/submission/vocabularies/vocabulary.service.ts index f2c1747658..1ff5b30ee0 100644 --- a/src/app/core/submission/vocabularies/vocabulary.service.ts +++ b/src/app/core/submission/vocabularies/vocabulary.service.ts @@ -223,13 +223,15 @@ export class VocabularyService { * no valid cached version. Defaults to true * @param reRequestOnStale Whether or not the request should automatically be re- * requested after the response becomes stale + * @param constructId Whether constructing the full vocabularyDetail ID + * ({vocabularyName}:{detailName}) is still necessary * @param linksToFollow List of {@link FollowLinkConfig} that indicate which * {@link HALLink}s should be automatically resolved * @return {Observable>} * Return an observable that emits VocabularyEntryDetail object */ - findEntryDetailById(id: string, name: string, useCachedVersionIfAvailable = true, reRequestOnStale = true, ...linksToFollow: FollowLinkConfig[]): Observable> { - const findId = `${name}:${id}`; + findEntryDetailById(id: string, name: string, useCachedVersionIfAvailable = true, reRequestOnStale = true, constructId: boolean = true, ...linksToFollow: FollowLinkConfig[]): Observable> { + const findId: string = (constructId ? `${name}:${id}` : id); return this.vocabularyEntryDetailDataService.findById(findId, useCachedVersionIfAvailable, reRequestOnStale, ...linksToFollow); } diff --git a/src/app/shared/form/form.module.ts b/src/app/shared/form/form.module.ts index 6e3fc33832..c2fc4c855e 100644 --- a/src/app/shared/form/form.module.ts +++ b/src/app/shared/form/form.module.ts @@ -32,7 +32,6 @@ import { NumberPickerComponent } from './number-picker/number-picker.component'; import { AuthorityConfidenceStateDirective } from './directives/authority-confidence-state.directive'; import { SortablejsModule } from 'ngx-sortablejs'; import { VocabularyTreeviewComponent } from './vocabulary-treeview/vocabulary-treeview.component'; -import { VocabularyTreeviewService } from './vocabulary-treeview/vocabulary-treeview.service'; import { VocabularyTreeviewModalComponent } from './vocabulary-treeview-modal/vocabulary-treeview-modal.component'; import { FormBuilderService } from './builder/form-builder.service'; import { DsDynamicTypeBindRelationService } from './builder/ds-dynamic-form-ui/ds-dynamic-type-bind-relation.service'; @@ -104,7 +103,6 @@ const DIRECTIVES = [ useValue: dsDynamicFormControlMapFn }, ...DYNAMIC_MATCHER_PROVIDERS, - VocabularyTreeviewService, DynamicFormLayoutService, DynamicFormService, DynamicFormValidationService, diff --git a/src/app/shared/form/vocabulary-treeview/vocabulary-treeview.component.html b/src/app/shared/form/vocabulary-treeview/vocabulary-treeview.component.html index 9cbc0146a1..fb7d162008 100644 --- a/src/app/shared/form/vocabulary-treeview/vocabulary-treeview.component.html +++ b/src/app/shared/form/vocabulary-treeview/vocabulary-treeview.component.html @@ -33,6 +33,7 @@ > @@ -65,6 +66,7 @@ container="body"> diff --git a/src/app/shared/form/vocabulary-treeview/vocabulary-treeview.component.spec.ts b/src/app/shared/form/vocabulary-treeview/vocabulary-treeview.component.spec.ts index 9ca8d7ab8b..97a21b724b 100644 --- a/src/app/shared/form/vocabulary-treeview/vocabulary-treeview.component.spec.ts +++ b/src/app/shared/form/vocabulary-treeview/vocabulary-treeview.component.spec.ts @@ -21,6 +21,7 @@ import { AuthTokenInfo } from '../../../core/auth/models/auth-token-info.model'; import { authReducer } from '../../../core/auth/auth.reducer'; import { storeModuleConfig } from '../../../app.reducer'; import { By } from '@angular/platform-browser'; +import { VocabularyService } from '../../../core/submission/vocabularies/vocabulary.service'; describe('VocabularyTreeviewComponent test suite', () => { @@ -49,6 +50,14 @@ describe('VocabularyTreeviewComponent test suite', () => { restoreNodes: jasmine.createSpy('restoreNodes'), cleanTree: jasmine.createSpy('cleanTree'), }); + const vocabularyServiceStub = jasmine.createSpyObj('VocabularyService', { + getVocabularyEntriesByValue: jasmine.createSpy('getVocabularyEntriesByValue'), + getEntryDetailParent: jasmine.createSpy('getEntryDetailParent'), + findEntryDetailById: jasmine.createSpy('findEntryDetailById'), + searchTopEntries: jasmine.createSpy('searchTopEntries'), + getEntryDetailChildren: jasmine.createSpy('getEntryDetailChildren'), + clearSearchTopRequests: jasmine.createSpy('clearSearchTopRequests') + }); initialState = { core: { @@ -77,6 +86,7 @@ describe('VocabularyTreeviewComponent test suite', () => { ], providers: [ { provide: VocabularyTreeviewService, useValue: vocabularyTreeviewServiceStub }, + { provide: VocabularyService, useValue: vocabularyServiceStub }, { provide: NgbActiveModal, useValue: modalStub }, provideMockStore({ initialState }), ChangeDetectorRef, diff --git a/src/app/shared/form/vocabulary-treeview/vocabulary-treeview.component.ts b/src/app/shared/form/vocabulary-treeview/vocabulary-treeview.component.ts index 891a825745..017416e8c2 100644 --- a/src/app/shared/form/vocabulary-treeview/vocabulary-treeview.component.ts +++ b/src/app/shared/form/vocabulary-treeview/vocabulary-treeview.component.ts @@ -17,6 +17,8 @@ import { VocabularyTreeFlattener } from './vocabulary-tree-flattener'; import { VocabularyTreeFlatDataSource } from './vocabulary-tree-flat-data-source'; import { CoreState } from '../../../core/core-state.model'; import { lowerCase } from 'lodash/string'; +import { VocabularyService } from '../../../core/submission/vocabularies/vocabulary.service'; +import { getFirstSucceededRemoteDataPayload } from '../../../core/shared/operators'; /** * Component that shows a hierarchical vocabulary in a tree view @@ -114,11 +116,13 @@ export class VocabularyTreeviewComponent implements OnDestroy, OnInit { * Initialize instance variables * * @param {VocabularyTreeviewService} vocabularyTreeviewService + * @param {vocabularyService} vocabularyService * @param {Store} store * @param {TranslateService} translate */ constructor( private vocabularyTreeviewService: VocabularyTreeviewService, + private vocabularyService: VocabularyService, private store: Store, private translate: TranslateService ) { @@ -284,13 +288,22 @@ export class VocabularyTreeviewComponent implements OnDestroy, OnInit { * Reset tree resulting from a previous search */ reset() { + this.searchText = ''; + for (const item of this.selectedItems) { + this.subs.push(this.vocabularyService.findEntryDetailById(item, this.vocabularyOptions.name, true, true, false).pipe( + getFirstSucceededRemoteDataPayload(), + ).subscribe((detail: VocabularyEntryDetail) => { + this.deselect.emit(detail); + })); + this.nodeMap.get(item).isSelected = false; + } + this.selectedItems = []; + if (isNotEmpty(this.storedNodeMap)) { this.nodeMap = this.storedNodeMap; this.storedNodeMap = new Map(); this.vocabularyTreeviewService.restoreNodes(); } - - this.searchText = ''; } /** diff --git a/src/app/shared/form/vocabulary-treeview/vocabulary-treeview.service.ts b/src/app/shared/form/vocabulary-treeview/vocabulary-treeview.service.ts index d400615f1e..f524af4c0e 100644 --- a/src/app/shared/form/vocabulary-treeview/vocabulary-treeview.service.ts +++ b/src/app/shared/form/vocabulary-treeview/vocabulary-treeview.service.ts @@ -25,7 +25,9 @@ import { VocabularyEntryDetail } from '../../../core/submission/vocabularies/mod /** * A service that provides methods to deal with vocabulary tree */ -@Injectable() +@Injectable({ + providedIn: 'root' +}) export class VocabularyTreeviewService { /** diff --git a/src/modules/app/browser-app.module.ts b/src/modules/app/browser-app.module.ts index 4cdf7fbe2f..68e328a8d5 100644 --- a/src/modules/app/browser-app.module.ts +++ b/src/modules/app/browser-app.module.ts @@ -31,7 +31,6 @@ import { GoogleAnalyticsService } from '../../app/statistics/google-analytics.se import { AuthRequestService } from '../../app/core/auth/auth-request.service'; import { BrowserAuthRequestService } from '../../app/core/auth/browser-auth-request.service'; import { BrowserInitService } from './browser-init.service'; -import { VocabularyTreeviewService } from 'src/app/shared/form/vocabulary-treeview/vocabulary-treeview.service'; export const REQ_KEY = makeStateKey('req'); @@ -111,10 +110,6 @@ export function getRequest(transferState: TransferState): any { { provide: LocationToken, useFactory: locationProvider, - }, - { - provide: VocabularyTreeviewService, - useClass: VocabularyTreeviewService, } ] }) From 4cf69eb9c9b1233bbeeb13efcfe271946094add8 Mon Sep 17 00:00:00 2001 From: Nona Luypaert Date: Fri, 2 Jun 2023 19:36:53 +0200 Subject: [PATCH 321/409] 101623: Fix reset emit nog working for BrowseByTaxonomyPage --- .../browse-by-taxonomy-page.component.spec.ts | 2 ++ .../browse-by-taxonomy-page.component.ts | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/app/browse-by/browse-by-taxonomy-page/browse-by-taxonomy-page.component.spec.ts b/src/app/browse-by/browse-by-taxonomy-page/browse-by-taxonomy-page.component.spec.ts index 484992afbf..c724017b1f 100644 --- a/src/app/browse-by/browse-by-taxonomy-page/browse-by-taxonomy-page.component.spec.ts +++ b/src/app/browse-by/browse-by-taxonomy-page/browse-by-taxonomy-page.component.spec.ts @@ -47,6 +47,8 @@ describe('BrowseByTaxonomyPageComponent', () => { detail2 = new VocabularyEntryDetail(); detail1.value = 'HUMANITIES and RELIGION'; detail2.value = 'TECHNOLOGY'; + detail1.id = 'id-1'; + detail2.id = 'id-2'; }); it('should create', () => { diff --git a/src/app/browse-by/browse-by-taxonomy-page/browse-by-taxonomy-page.component.ts b/src/app/browse-by/browse-by-taxonomy-page/browse-by-taxonomy-page.component.ts index d568a97fd7..cf6345bf39 100644 --- a/src/app/browse-by/browse-by-taxonomy-page/browse-by-taxonomy-page.component.ts +++ b/src/app/browse-by/browse-by-taxonomy-page/browse-by-taxonomy-page.component.ts @@ -98,7 +98,7 @@ export class BrowseByTaxonomyPageComponent implements OnInit, OnDestroy { * @param detail VocabularyEntryDetail to be removed */ onDeselect(detail: VocabularyEntryDetail): void { - this.selectedItems = this.selectedItems.filter((entry: VocabularyEntryDetail) => { return entry !== detail; }); + this.selectedItems = this.selectedItems.filter((entry: VocabularyEntryDetail) => { return entry.id !== detail.id; }); this.filterValues = this.filterValues.filter((value: string) => { return value !== `${detail.value},equals`; }); this.updateQueryParams(); } From 165bdf77972639cca75776b32cb145feeea42a3d Mon Sep 17 00:00:00 2001 From: Alan Orth Date: Thu, 25 May 2023 15:43:18 +0300 Subject: [PATCH 322/409] src/assets: add i18n string for publisher Add string for publisher in live import item preview. Requires: https://github.com/DSpace/DSpace/pull/8866 --- src/assets/i18n/en.json5 | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/assets/i18n/en.json5 b/src/assets/i18n/en.json5 index 88b5e17a01..d9516b22b9 100644 --- a/src/assets/i18n/en.json5 +++ b/src/assets/i18n/en.json5 @@ -2536,6 +2536,8 @@ "item.preview.dc.identifier.doi": "DOI", + "item.preview.dc.publisher": "Publisher:", + "item.preview.person.familyName": "Surname:", "item.preview.person.givenName": "Name:", From 092608f6cbb114a81a34a685fefec8e5cbed2bed Mon Sep 17 00:00:00 2001 From: Giuseppe Digilio Date: Mon, 5 Jun 2023 15:11:01 +0200 Subject: [PATCH 323/409] [CST-5729] Remove additional error message --- src/app/core/data/signposting-data.service.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/app/core/data/signposting-data.service.ts b/src/app/core/data/signposting-data.service.ts index fca22ec383..d051ecf8db 100644 --- a/src/app/core/data/signposting-data.service.ts +++ b/src/app/core/data/signposting-data.service.ts @@ -29,7 +29,6 @@ export class SignpostingDataService { return this.restService.get(`${baseUrl}/signposting/links/${uuid}`).pipe( catchError((err) => { - console.error(err); return observableOf([]); }), map((res: RawRestResponse) => res.statusCode === 200 ? res.payload as SignpostingLink[] : []) From 2824469dc56510027cead4858d22404e07f6cf64 Mon Sep 17 00:00:00 2001 From: Ricardo Saraiva <122451983+rsaraivac@users.noreply.github.com> Date: Mon, 5 Jun 2023 14:41:55 +0100 Subject: [PATCH 324/409] Update pt-PT.json5 --- src/assets/i18n/pt-PT.json5 | 160 +++++++++++++++++++++++++----------- 1 file changed, 110 insertions(+), 50 deletions(-) diff --git a/src/assets/i18n/pt-PT.json5 b/src/assets/i18n/pt-PT.json5 index 74b1ff3e68..e89ff0bc60 100644 --- a/src/assets/i18n/pt-PT.json5 +++ b/src/assets/i18n/pt-PT.json5 @@ -1,6 +1,6 @@ { - // Dspace v7.5 > i18n pt-PT > reviewed 30-05-2023 + // Dspace v7.x > i18n pt-PT > reviewed 05-06-2023 // "401.help": "You're not authorized to access this page. You can use the button below to get back to the home page.", "401.help": "Não está autorizado a aceder a esta página. Pode utilizar o botão em baixo para voltar à página de início.", @@ -842,7 +842,7 @@ // "admin.batch-import.page.dropMsgReplace": "Drop to replace the batch ZIP to import", "admin.batch-import.page.dropMsgReplace": "Arraste ficheiro .zip para substituir importação em lote", - // "admin.metadata-import.page.button.return": "Return", + // "admin.metadata-import.page.button.return": "Back", "admin.metadata-import.page.button.return": "Voltar", // "admin.metadata-import.page.button.proceed": "Proceed", @@ -1286,7 +1286,7 @@ // "collection.delete.head": "Delete Collection", "collection.delete.head": "Apagar coleção", - // "collection.delete.notification.fail": "collection could not be deleted", + // "collection.delete.notification.fail": "Collection could not be deleted", "collection.delete.notification.fail": "Coleção não pode ser apagada", // "collection.delete.notification.success": "Successfully deleted collection", @@ -1307,13 +1307,13 @@ // "collection.edit.tabs.mapper.head": "Item Mapper", "collection.edit.tabs.mapper.head": "Mapeamentos", - // "collection.edit.tabs.item-mapper.title": "collection Edit - Item Mapper", + // "collection.edit.tabs.item-mapper.title": "Collection Edit - Item Mapper", "collection.edit.tabs.item-mapper.title": "Editar coleção - mapeamentos", // "collection.edit.item-mapper.cancel": "Cancel", "collection.edit.item-mapper.cancel": "Cancelar", - // "collection.edit.item-mapper.collection": "collection: \"{{name}}\"", + // "collection.edit.item-mapper.collection": "Collection: \"{{name}}\"", "collection.edit.item-mapper.collection": "Coleção: \"{{name}}\"", // "collection.edit.item-mapper.confirm": "Map selected items", @@ -1547,8 +1547,8 @@ // "collection.form.entityType": "Entity Type", "collection.form.entityType": "Tipo de entidade", - // "collection.listelement.badge": "collection", - "collection.listelement.badge": "coleção", + // "collection.listelement.badge": "Collection", + "collection.listelement.badge": "Coleção", // "collection.page.browse.recent.head": "Recent Submissions", "collection.page.browse.recent.head": "Entradas recentes", @@ -2074,6 +2074,9 @@ // "dso.name.untitled": "Untitled", "dso.name.untitled": "Sem título", + + // "dso.name.unnamed": "Unnamed", + "dso.name.unnamed": "Sem nome", // "dso-selector.create.collection.head": "New collection", "dso-selector.create.collection.head": "Nova coleção", @@ -2159,7 +2162,7 @@ // "dso-selector.results-could-not-be-retrieved": "Something went wrong, please refresh again", "dso-selector.results-could-not-be-retrieved": "Algo correu mal, por favor repita", - // "supervision-group-selector.header": "supervision Group Selector", + // "supervision-group-selector.header": "Supervision Group Selector", "supervision-group-selector.header": "Seletor de grupos de supervisão", // "supervision-group-selector.select.type-of-order.label": "Select a type of Order", @@ -2192,8 +2195,8 @@ // "supervision-group-selector.notification.create.success.title": "Successfully created supervision order for group {{ name }}", "supervision-group-selector.notification.create.success.title": "Criada com sucesso ordem de supervisão para o grupo {{ name }}", - // "supervision-group-selector.notification.create.failure.title": "error", - "supervision-group-selector.notification.create.failure.title": "erro", + // "supervision-group-selector.notification.create.failure.title": "Error", + "supervision-group-selector.notification.create.failure.title": "Erro", // "supervision-group-selector.notification.create.already-existing": "A supervision order already exists on this item for selected group", "supervision-group-selector.notification.create.already-existing": "Já existe uma ordem de supervisão sobre este item para grupo selecionado", @@ -2491,9 +2494,24 @@ // "form.no-value": "No value entered", "form.no-value": "Nenhum valor informado", + + // "form.other-information.email": "Email", + "form.other-information.email": "Email", + + // "form.other-information.first-name": "First Name", + "form.other-information.first-name": "Nome", + + // "form.other-information.insolr": "In Solr Index", + "form.other-information.insolr": "No índice SOLR", + + // "form.other-information.institution": "Institution", + "form.other-information.institution": "Instituição", + + // "form.other-information.last-name": "Last Name", + "form.other-information.last-name": "Apelido", - // "form.other-information": {}, - "form.other-information": {}, + // "form.other-information.orcid": "ORCID", + "form.other-information.orcid": "ORCID", // "form.remove": "Remove", "form.remove": "Apagar", @@ -2513,6 +2531,9 @@ // "form.submit": "Save", "form.submit": "Guardar", + // "form.create": "Create", + "form.create": "Criar", + // "form.repeatable.sort.tip": "Drop the item in the new position", "form.repeatable.sort.tip": "Largue o item na nova posição", @@ -2741,7 +2762,7 @@ // "item.edit.authorizations.title": "Edit item's Policies", "item.edit.authorizations.title": "Editar políticas dos itens", - // "item.badge.private": "Private", + // "item.badge.private": "Non-discoverable", "item.badge.private": "Privado", // "item.badge.withdrawn": "Withdrawn", @@ -2960,8 +2981,8 @@ // "item.edit.register-doi.success": "DOI queued for registration successfully.", "item.edit.register-doi.success": "DOI colocado em fila de espera para o registo com sucesso.", - // "item.edit.register-doi.error": "error registering DOI", - "item.edit.register-doi.error": "erro ao registar DOI", + // "item.edit.register-doi.error": "Error registering DOI", + "item.edit.register-doi.error": "Erro ao registar DOI", // "item.edit.register-doi.to-update": "The following DOI has already been minted and will be queued for registration online", "item.edit.register-doi.to-update": "O seguinte DOI já foi criado e será colocado em fila de espera para registo online", @@ -3265,6 +3286,9 @@ // "item.edit.tabs.curate.title": "Item Edit - Curate", "item.edit.tabs.curate.title": "Editar item - Curadoria", + + // "item.edit.curate.title": "Curate Item: {{item}}", + "item.edit.curate.title": "Curar item: {{item}}", // "item.edit.tabs.metadata.head": "Metadata", "item.edit.tabs.metadata.head": "Metadados do item", @@ -3836,7 +3860,7 @@ // "itemtemplate.edit.metadata.notifications.discarded.content": "Your changes were discarded. To reinstate your changes click the 'Undo' button", "itemtemplate.edit.metadata.notifications.discarded.content": "As sua alterações foram descartadas. Para repor as suas alterações clique no botão 'Desfazer'", - // "itemtemplate.edit.metadata.notifications.discarded.title": "Changed discarded", + // "itemtemplate.edit.metadata.notifications.discarded.title": "Changes discarded", "itemtemplate.edit.metadata.notifications.discarded.title": "Alterações descartadas", // "itemtemplate.edit.metadata.notifications.error.title": "An error occurred", @@ -3851,7 +3875,7 @@ // "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": "O modelo do item que está atualmente a trabalhar foi alterado por outro utilizador. As suas alterações serão descartadas para evitar conflitos", - // "itemtemplate.edit.metadata.notifications.outdated.title": "Changed outdated", + // "itemtemplate.edit.metadata.notifications.outdated.title": "Changes outdated", "itemtemplate.edit.metadata.notifications.outdated.title": "Alterações desatualizadas", // "itemtemplate.edit.metadata.notifications.saved.content": "Your changes to this item template's metadata were saved.", @@ -4217,7 +4241,7 @@ // "menu.section.import": "Import", "menu.section.import": "Importar", - // "menu.section.import_batch": "Batch import (ZIP)", + // "menu.section.import_batch": "Batch Import (ZIP)", "menu.section.import_batch": "Importação em lote (ZIP)", // "menu.section.import_metadata": "Metadata", @@ -4403,20 +4427,20 @@ // "mydspace.show.supervisedWorkspace": "Supervised items", "mydspace.show.supervisedWorkspace": "Itens supervisionados", - // "mydspace.status.archived": "Archived", - "mydspace.status.archived": "Depósito aceite", - - // "mydspace.status.validation": "Validation", - "mydspace.status.validation": "Em validação", - - // "mydspace.status.waiting-for-controller": "Waiting for controller", - "mydspace.status.waiting-for-controller": "Aguarda validador", - - // "mydspace.status.workflow": "Workflow", - "mydspace.status.workflow": "Em fluxo de trabalho", - - // "mydspace.status.workspace": "Workspace", - "mydspace.status.workspace": "Depósito por terminar", + // "mydspace.status.mydspaceArchived": "Archived", + "mydspace.status.mydspaceArchived": "Depósito aceite", + + // "mydspace.status.mydspaceValidation": "Validation", + "mydspace.status.mydspaceValidation": "Em validação", + + // "mydspace.status.mydspaceWaitingController": "Waiting for controller", + "mydspace.status.mydspaceWaitingController": "Aguarda validador", + + // "mydspace.status.mydspaceWorkflow": "Workflow", + "mydspace.status.mydspaceWorkflow": "Em fluxo de trabalho", + + // "mydspace.status.mydspaceWorkspace": "Workspace", + "mydspace.status.mydspaceWorkspace": "Depósito por terminar", // "mydspace.title": "MyDSpace", "mydspace.title": "Área Pessoal", @@ -4468,6 +4492,9 @@ // "nav.search": "Search", "nav.search": "Pesquisar", + + // "nav.search.button": "Submit search", + "nav.search.button": "Pesquisar", // "nav.statistics.header": "Statistics", "nav.statistics.header": "Estatísticas", @@ -4624,6 +4651,9 @@ // "process.new.notification.error.content": "An error occurred while creating this process", "process.new.notification.error.content": "Ocorreu um erro ao criar este processo", + + // "process.new.notification.error.max-upload.content": "The file exceeds the maximum upload size", + "process.new.notification.error.max-upload.content": "O ficheiro excede o tamanho máximo de carregamento!", // "process.new.header": "Create a new process", "process.new.header": "Criar um novo processo", @@ -5324,7 +5354,7 @@ // "search.filters.applied.f.discoverable": "Non-discoverable", "search.filters.applied.f.discoverable": "Privado", - // "search.filters.applied.f.entityType": "Item type", + // "search.filters.applied.f.entityType": "Item Type", "search.filters.applied.f.entityType": "Tipo de item", // "search.filters.applied.f.has_content_in_original_bundle": "Has files", @@ -5564,7 +5594,7 @@ // "search.filters.filter.submitter.label": "Search submitter", "search.filters.filter.submitter.label": "Procurar depositante", - // "search.filters.filter.show-tree": "browse {{ name }} tree", + // "search.filters.filter.show-tree": "Browse {{ name }} tree", "search.filters.filter.show-tree": "Percorrer por hierarquia de {{ name }}", // "search.filters.filter.supervisedBy.head": "Supervised By", @@ -5573,8 +5603,8 @@ // "search.filters.filter.supervisedBy.placeholder": "Supervised By", "search.filters.filter.supervisedBy.placeholder": "Supervisionado por", - // "search.filters.filter.supervisedBy.label": "search Supervised By", - "search.filters.filter.supervisedBy.label": "pesquisar supervisionado por", + // "search.filters.filter.supervisedBy.label": "Search Supervised By", + "search.filters.filter.supervisedBy.label": "Pesquisar supervisionado por", // "search.filters.entityType.JournalIssue": "Journal Issue", "search.filters.entityType.JournalIssue": "Número de revista", @@ -5743,6 +5773,9 @@ // "statistics.table.header.views": "Views", "statistics.table.header.views": "Consultas", + + // "statistics.table.no-name": "(object name could not be loaded)", + "statistics.table.no-name": "(não foi possível carregar o nome do objeto)", // "submission.edit.breadcrumbs": "Edit Submission", "submission.edit.breadcrumbs": "Editar depósito", @@ -6335,8 +6368,8 @@ // "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": "Pretende guardar \"{{ value }}\" como um nome alternativo para esta pessoa permitindo a sua reutilização por outros em futuros depósitos? Se não, pode usar apenas neste depósito.", + // "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 si e outros em futuros depósitos? Se não, pode usar apenas neste depósito.", // "submission.sections.describe.relationship-lookup.name-variant.notification.confirm": "Save a new name variant", "submission.sections.describe.relationship-lookup.name-variant.notification.confirm": "Guardar um Nome alternativo", @@ -6733,10 +6766,10 @@ // "submission.workflow.generic.delete": "Delete", "submission.workflow.generic.delete": "Remover", - - // "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": "Se pretende remover definitivamente este item, selecione 'Apagar'. Será solicitada confirmação.", - + + // "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": "Selecione esta opção para rejeitar este item. Ser-lhe-á pedida confirmação.", + // "submission.workflow.generic.edit": "Edit", "submission.workflow.generic.edit": "Editar", @@ -6832,17 +6865,20 @@ // "submission.workspace.generic.view-help": "Select this option to view the item's metadata.", "submission.workspace.generic.view-help": "Selecione esta opção para ver os metadados do item.", + + // "submitter.empty": "N/A", + "submitter.empty": "N/E", - // "subscriptions.title": "subscriptions", + // "subscriptions.title": "Subscriptions", "subscriptions.title": "Subscrições de alertas", - // "subscriptions.item": "subscriptions for items", + // "subscriptions.item": "Subscriptions for items", "subscriptions.item": "Subscrições para itens", - // "subscriptions.collection": "subscriptions for collections", + // "subscriptions.collection": "Subscriptions for collections", "subscriptions.collection": "Subscrições para coleções", - // "subscriptions.community": "subscriptions for communities", + // "subscriptions.community": "Subscriptions for communities", "subscriptions.community": "Subscrições para comunidades", // "subscriptions.subscription_type": "Subscription type", @@ -6863,7 +6899,7 @@ // "subscriptions.tooltip": "Subscribe", "subscriptions.tooltip": "Subscrever", - // "subscriptions.modal.title": "subscriptions", + // "subscriptions.modal.title": "Subscriptions", "subscriptions.modal.title": "Subscrições de alertas", // "subscriptions.modal.type-frequency": "Type and frequency", @@ -6872,7 +6908,7 @@ // "subscriptions.modal.close": "Close", "subscriptions.modal.close": "Fechar", - // "subscriptions.modal.delete-info": "To remove this subscription, please visit the \// "subscriptions\" page under your user profile", + // "subscriptions.modal.delete-info": "To remove this subscription, please visit the \"Subscriptions\" page under your user profile", "subscriptions.modal.delete-info": "Para remover esta subscrição, por favor aceda à página de 'subscrições' debaixo do seu perfil de utilizador", // "subscriptions.modal.new-subscription-form.type.content": "Content", @@ -6890,7 +6926,7 @@ // "subscriptions.modal.new-subscription-form.submit": "Submit", "subscriptions.modal.new-subscription-form.submit": "Submeter", - // "subscriptions.modal.new-subscription-form.processing": "processing...", + // "subscriptions.modal.new-subscription-form.processing": "Processing...", "subscriptions.modal.new-subscription-form.processing": "A processar...", // "subscriptions.modal.create.success": "Subscribed to {{ type }} successfully.", @@ -7093,6 +7129,30 @@ // "workspace-item.view.title": "Workspace View", "workspace-item.view.title": "Vista das tarefas", + + // "workspace-item.delete.breadcrumbs": "Workspace Delete", + "workspace-item.delete.breadcrumbs": "Apagar da área de trabalho", + + // "workspace-item.delete.header": "Delete workspace item", + "workspace-item.delete.header": "Apagar item da área de trabalho", + + // "workspace-item.delete.button.confirm": "Delete", + "workspace-item.delete.button.confirm": "Apagar", + + // "workspace-item.delete.button.cancel": "Cancel", + "workspace-item.delete.button.cancel": "Cancelar", + + // "workspace-item.delete.notification.success.title": "Deleted", + "workspace-item.delete.notification.success.title": "Apagado", + + // "workspace-item.delete.title": "This workspace item was successfully deleted", + "workspace-item.delete.title": "Este item foi removido da área de trabalho com êxito", + + // "workspace-item.delete.notification.error.title": "Something went wrong", + "workspace-item.delete.notification.error.title": "Ocorreu algum erro!", + + // "workspace-item.delete.notification.error.content": "The workspace item could not be deleted", + "workspace-item.delete.notification.error.content": "Não foi possível remover o item da área de trabalho", // "workflow-item.advanced.title": "Advanced workflow", "workflow-item.advanced.title": "Fluxo de trabalho avançado", @@ -7577,7 +7637,7 @@ // "system-wide-alert.form.label.countdownTo.hint": "Hint: Set a countdown timer. When enabled, a date can be set in the future and the system-wide alert banner will perform a countdown to the set date. When this timer ends, it will disappear from the alert. The server will NOT be automatically stopped.", "system-wide-alert.form.label.countdownTo.hint": "Dica: Defina um temporizador de contagem decrescente. Quando ativado, pode ser definida uma data no futuro e o 'banner' de alerta geral do sistema irá realizar uma contagem decrescente para a data definida. Quando este temporizador terminar, desaparecerá do alerta. O servidor NÃO pára automaticamente.", - // "system-wide-alert.form.label.preview": "system-wide alert preview", + // "system-wide-alert.form.label.preview": "System-wide alert preview", "system-wide-alert.form.label.preview": "Pré-visualização de alerta geral do sistema", // "system-wide-alert.form.update.success": "The system-wide alert was successfully updated", From 3f343dbd60a33100209feca76168168b972d1702 Mon Sep 17 00:00:00 2001 From: Ricardo Saraiva <122451983+rsaraivac@users.noreply.github.com> Date: Tue, 6 Jun 2023 11:29:47 +0100 Subject: [PATCH 325/409] Update pt-PT.json5 --- src/assets/i18n/pt-PT.json5 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/assets/i18n/pt-PT.json5 b/src/assets/i18n/pt-PT.json5 index e89ff0bc60..d623b2d431 100644 --- a/src/assets/i18n/pt-PT.json5 +++ b/src/assets/i18n/pt-PT.json5 @@ -1,6 +1,6 @@ { - // Dspace v7.x > i18n pt-PT > reviewed 05-06-2023 + // Dspace v7.x > i18n pt-PT > last reviewed 05-06-2023 // "401.help": "You're not authorized to access this page. You can use the button below to get back to the home page.", "401.help": "Não está autorizado a aceder a esta página. Pode utilizar o botão em baixo para voltar à página de início.", From 72be58aa2a597bf72bd72f4322b9affe053e06ae Mon Sep 17 00:00:00 2001 From: Ricardo Saraiva <122451983+rsaraivac@users.noreply.github.com> Date: Tue, 6 Jun 2023 11:50:35 +0100 Subject: [PATCH 326/409] Update pt-PT.json5 --- src/assets/i18n/pt-PT.json5 | 52 ++++++++++++++++++------------------- 1 file changed, 26 insertions(+), 26 deletions(-) diff --git a/src/assets/i18n/pt-PT.json5 b/src/assets/i18n/pt-PT.json5 index d623b2d431..c622c4c257 100644 --- a/src/assets/i18n/pt-PT.json5 +++ b/src/assets/i18n/pt-PT.json5 @@ -2074,7 +2074,7 @@ // "dso.name.untitled": "Untitled", "dso.name.untitled": "Sem título", - + // "dso.name.unnamed": "Unnamed", "dso.name.unnamed": "Sem nome", @@ -2494,19 +2494,19 @@ // "form.no-value": "No value entered", "form.no-value": "Nenhum valor informado", - + // "form.other-information.email": "Email", "form.other-information.email": "Email", - + // "form.other-information.first-name": "First Name", "form.other-information.first-name": "Nome", - + // "form.other-information.insolr": "In Solr Index", "form.other-information.insolr": "No índice SOLR", - + // "form.other-information.institution": "Institution", - "form.other-information.institution": "Instituição", - + "form.other-information.institution": "Instituição", + // "form.other-information.last-name": "Last Name", "form.other-information.last-name": "Apelido", @@ -2533,7 +2533,7 @@ // "form.create": "Create", "form.create": "Criar", - + // "form.repeatable.sort.tip": "Drop the item in the new position", "form.repeatable.sort.tip": "Largue o item na nova posição", @@ -3286,7 +3286,7 @@ // "item.edit.tabs.curate.title": "Item Edit - Curate", "item.edit.tabs.curate.title": "Editar item - Curadoria", - + // "item.edit.curate.title": "Curate Item: {{item}}", "item.edit.curate.title": "Curar item: {{item}}", @@ -4429,16 +4429,16 @@ // "mydspace.status.mydspaceArchived": "Archived", "mydspace.status.mydspaceArchived": "Depósito aceite", - + // "mydspace.status.mydspaceValidation": "Validation", "mydspace.status.mydspaceValidation": "Em validação", - + // "mydspace.status.mydspaceWaitingController": "Waiting for controller", "mydspace.status.mydspaceWaitingController": "Aguarda validador", - + // "mydspace.status.mydspaceWorkflow": "Workflow", "mydspace.status.mydspaceWorkflow": "Em fluxo de trabalho", - + // "mydspace.status.mydspaceWorkspace": "Workspace", "mydspace.status.mydspaceWorkspace": "Depósito por terminar", @@ -4492,7 +4492,7 @@ // "nav.search": "Search", "nav.search": "Pesquisar", - + // "nav.search.button": "Submit search", "nav.search.button": "Pesquisar", @@ -4651,7 +4651,7 @@ // "process.new.notification.error.content": "An error occurred while creating this process", "process.new.notification.error.content": "Ocorreu um erro ao criar este processo", - + // "process.new.notification.error.max-upload.content": "The file exceeds the maximum upload size", "process.new.notification.error.max-upload.content": "O ficheiro excede o tamanho máximo de carregamento!", @@ -5773,7 +5773,7 @@ // "statistics.table.header.views": "Views", "statistics.table.header.views": "Consultas", - + // "statistics.table.no-name": "(object name could not be loaded)", "statistics.table.no-name": "(não foi possível carregar o nome do objeto)", @@ -6766,10 +6766,10 @@ // "submission.workflow.generic.delete": "Delete", "submission.workflow.generic.delete": "Remover", - + // "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": "Selecione esta opção para rejeitar este item. Ser-lhe-á pedida confirmação.", - + // "submission.workflow.generic.edit": "Edit", "submission.workflow.generic.edit": "Editar", @@ -6865,7 +6865,7 @@ // "submission.workspace.generic.view-help": "Select this option to view the item's metadata.", "submission.workspace.generic.view-help": "Selecione esta opção para ver os metadados do item.", - + // "submitter.empty": "N/A", "submitter.empty": "N/E", @@ -7129,28 +7129,28 @@ // "workspace-item.view.title": "Workspace View", "workspace-item.view.title": "Vista das tarefas", - + // "workspace-item.delete.breadcrumbs": "Workspace Delete", "workspace-item.delete.breadcrumbs": "Apagar da área de trabalho", - + // "workspace-item.delete.header": "Delete workspace item", "workspace-item.delete.header": "Apagar item da área de trabalho", // "workspace-item.delete.button.confirm": "Delete", "workspace-item.delete.button.confirm": "Apagar", - + // "workspace-item.delete.button.cancel": "Cancel", "workspace-item.delete.button.cancel": "Cancelar", - + // "workspace-item.delete.notification.success.title": "Deleted", "workspace-item.delete.notification.success.title": "Apagado", - + // "workspace-item.delete.title": "This workspace item was successfully deleted", "workspace-item.delete.title": "Este item foi removido da área de trabalho com êxito", - + // "workspace-item.delete.notification.error.title": "Something went wrong", "workspace-item.delete.notification.error.title": "Ocorreu algum erro!", - + // "workspace-item.delete.notification.error.content": "The workspace item could not be deleted", "workspace-item.delete.notification.error.content": "Não foi possível remover o item da área de trabalho", From dbccda4330eb7ece591cfab4795bfa75e786e958 Mon Sep 17 00:00:00 2001 From: Enea Jahollari Date: Tue, 6 Jun 2023 14:13:13 +0200 Subject: [PATCH 327/409] rollback change for orcid sync settings --- .../orcid-sync-settings/orcid-sync-settings.component.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/app/item-page/orcid-page/orcid-sync-settings/orcid-sync-settings.component.ts b/src/app/item-page/orcid-page/orcid-sync-settings/orcid-sync-settings.component.ts index 1aec416d62..0bcbc295ac 100644 --- a/src/app/item-page/orcid-page/orcid-sync-settings/orcid-sync-settings.component.ts +++ b/src/app/item-page/orcid-page/orcid-sync-settings/orcid-sync-settings.component.ts @@ -156,8 +156,7 @@ export class OrcidSyncSettingsComponent implements OnInit { } }), ).subscribe((remoteData: RemoteData) => { - // hasSucceeded is true if the response is success or successStale - if (remoteData.hasSucceeded) { + if (remoteData.isSuccess) { this.notificationsService.success(this.translateService.get(this.messagePrefix + '.synchronization-settings-update.success')); this.settingsUpdated.emit(); } else { From 3611f375632682fe1137a3b56dbffe903b2577c4 Mon Sep 17 00:00:00 2001 From: Alisa Ismailati Date: Tue, 6 Jun 2023 14:42:49 +0200 Subject: [PATCH 328/409] [DURACOM-151] Fixed EPerson deletion --- .../epeople-registry.component.ts | 17 +++-- .../eperson-form/eperson-form.component.ts | 65 +++++++++++-------- src/app/core/data/request.service.ts | 4 +- 3 files changed, 50 insertions(+), 36 deletions(-) diff --git a/src/app/access-control/epeople-registry/epeople-registry.component.ts b/src/app/access-control/epeople-registry/epeople-registry.component.ts index 706dcab690..fb045ebb88 100644 --- a/src/app/access-control/epeople-registry/epeople-registry.component.ts +++ b/src/app/access-control/epeople-registry/epeople-registry.component.ts @@ -287,14 +287,17 @@ export class EPeopleRegistryComponent implements OnInit, OnDestroy { /** * This method will set everything to stale, which will cause the lists on this page to update. */ - reset() { + reset(): void { this.epersonService.getBrowseEndpoint().pipe( - take(1) - ).subscribe((href: string) => { - this.requestService.setStaleByHrefSubstring(href).pipe(take(1)).subscribe(() => { - this.epersonService.cancelEditEPerson(); - this.isEPersonFormShown = false; - }); + take(1), + switchMap((href: string) => { + return this.requestService.setStaleByHrefSubstring(href).pipe( + take(1), + ); + }) + ).subscribe(()=>{ + this.epersonService.cancelEditEPerson(); + this.isEPersonFormShown = false; }); } } diff --git a/src/app/access-control/epeople-registry/eperson-form/eperson-form.component.ts b/src/app/access-control/epeople-registry/eperson-form/eperson-form.component.ts index c60de00aed..1fd0e05ccb 100644 --- a/src/app/access-control/epeople-registry/eperson-form/eperson-form.component.ts +++ b/src/app/access-control/epeople-registry/eperson-form/eperson-form.component.ts @@ -8,7 +8,7 @@ import { } from '@ng-dynamic-forms/core'; import { TranslateService } from '@ngx-translate/core'; import { combineLatest as observableCombineLatest, Observable, of as observableOf, Subscription } from 'rxjs'; -import { debounceTime, switchMap, take } from 'rxjs/operators'; +import { debounceTime, finalize, map, switchMap, take } from 'rxjs/operators'; import { PaginatedList } from '../../../core/data/paginated-list.model'; import { RemoteData } from '../../../core/data/remote-data'; import { EPersonDataService } from '../../../core/eperson/eperson-data.service'; @@ -463,31 +463,43 @@ export class EPersonFormComponent implements OnInit, OnDestroy { * Deletes the EPerson from the Repository. The EPerson will be the only that this form is showing. * It'll either show a success or error message depending on whether the delete was successful or not. */ - delete() { - this.epersonService.getActiveEPerson().pipe(take(1)).subscribe((eperson: EPerson) => { - const modalRef = this.modalService.open(ConfirmationModalComponent); - modalRef.componentInstance.dso = eperson; - modalRef.componentInstance.headerLabel = 'confirmation-modal.delete-eperson.header'; - modalRef.componentInstance.infoLabel = 'confirmation-modal.delete-eperson.info'; - modalRef.componentInstance.cancelLabel = 'confirmation-modal.delete-eperson.cancel'; - modalRef.componentInstance.confirmLabel = 'confirmation-modal.delete-eperson.confirm'; - modalRef.componentInstance.brandColor = 'danger'; - modalRef.componentInstance.confirmIcon = 'fas fa-trash'; - modalRef.componentInstance.response.pipe(take(1)).subscribe((confirm: boolean) => { - if (confirm) { - if (hasValue(eperson.id)) { - this.epersonService.deleteEPerson(eperson).pipe(getFirstCompletedRemoteData()).subscribe((restResponse: RemoteData) => { - if (restResponse.hasSucceeded) { - this.notificationsService.success(this.translateService.get(this.labelPrefix + 'notification.deleted.success', { name: this.dsoNameService.getName(eperson) })); - this.submitForm.emit(); - } else { - this.notificationsService.error('Error occured when trying to delete EPerson with id: ' + eperson.id + ' with code: ' + restResponse.statusCode + ' and message: ' + restResponse.errorMessage); - } - this.cancelForm.emit(); - }); - } - } - }); + delete(): void { + this.epersonService.getActiveEPerson().pipe( + take(1), + switchMap((eperson: EPerson) => { + const modalRef = this.modalService.open(ConfirmationModalComponent); + modalRef.componentInstance.dso = eperson; + modalRef.componentInstance.headerLabel = 'confirmation-modal.delete-eperson.header'; + modalRef.componentInstance.infoLabel = 'confirmation-modal.delete-eperson.info'; + modalRef.componentInstance.cancelLabel = 'confirmation-modal.delete-eperson.cancel'; + modalRef.componentInstance.confirmLabel = 'confirmation-modal.delete-eperson.confirm'; + modalRef.componentInstance.brandColor = 'danger'; + modalRef.componentInstance.confirmIcon = 'fas fa-trash'; + + return modalRef.componentInstance.response.pipe( + take(1), + switchMap((confirm: boolean) => { + if (confirm && hasValue(eperson.id)) { + this.canDelete$ = observableOf(false); + return this.epersonService.deleteEPerson(eperson).pipe( + getFirstCompletedRemoteData(), + map((restResponse: RemoteData) => ({ restResponse, eperson })) + ); + } else { + return observableOf(null); + } + }), + finalize(() => this.canDelete$ = observableOf(true)) + ); + }) + ).subscribe(({ restResponse, eperson }: { restResponse: RemoteData | null, eperson: EPerson }) => { + if (restResponse?.hasSucceeded) { + this.notificationsService.success(this.translateService.get(this.labelPrefix + 'notification.deleted.success', { name: this.dsoNameService.getName(eperson) })); + this.submitForm.emit(); + } else { + this.notificationsService.error(`Error occurred when trying to delete EPerson with id: ${eperson?.id} with code: ${restResponse?.statusCode} and message: ${restResponse?.errorMessage}`); + } + this.cancelForm.emit(); }); } @@ -523,7 +535,6 @@ export class EPersonFormComponent implements OnInit, OnDestroy { * Cancel the current edit when component is destroyed & unsub all subscriptions */ ngOnDestroy(): void { - this.onCancel(); this.subs.filter((sub) => hasValue(sub)).forEach((sub) => sub.unsubscribe()); this.paginationService.clearPagination(this.config.id); if (hasValue(this.emailValueChangeSubscribe)) { diff --git a/src/app/core/data/request.service.ts b/src/app/core/data/request.service.ts index 94a6020975..78f53ffe3a 100644 --- a/src/app/core/data/request.service.ts +++ b/src/app/core/data/request.service.ts @@ -328,10 +328,10 @@ export class RequestService { this.store.dispatch(new RequestStaleAction(uuid)); return this.getByUUID(uuid).pipe( + take(1), map((request: RequestEntry) => isStale(request.state)), filter((stale: boolean) => stale), - take(1), - ); + ); } /** From 1b2d9829edf11c8d4b427981f2e0dad2dbac5abe Mon Sep 17 00:00:00 2001 From: Alisa Ismailati Date: Tue, 6 Jun 2023 15:35:54 +0200 Subject: [PATCH 329/409] [DURACOM-151] unit test fix --- src/app/core/data/request.service.spec.ts | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/app/core/data/request.service.spec.ts b/src/app/core/data/request.service.spec.ts index 108a588881..8509f60eb7 100644 --- a/src/app/core/data/request.service.spec.ts +++ b/src/app/core/data/request.service.spec.ts @@ -627,11 +627,8 @@ describe('RequestService', () => { it('should return an Observable that emits true as soon as the request is stale', fakeAsync(() => { dispatchSpy.and.callFake(() => { /* empty */ }); // don't actually set as stale - getByUUIDSpy.and.returnValue(cold('a-b--c--d-', { // but fake the state in the cache - a: { state: RequestEntryState.ResponsePending }, - b: { state: RequestEntryState.Success }, - c: { state: RequestEntryState.SuccessStale }, - d: { state: RequestEntryState.Error }, + getByUUIDSpy.and.returnValue(cold('-----(a|)', { // but fake the state in the cache + a: { state: RequestEntryState.SuccessStale }, })); const done$ = service.setStaleByUUID('something'); From 3fdef20dc2555d1760e53bdbfe4c37d41055f64e Mon Sep 17 00:00:00 2001 From: Enea Jahollari Date: Tue, 6 Jun 2023 15:54:57 +0200 Subject: [PATCH 330/409] added unit testing --- .../detail/process-detail.component.html | 2 +- .../detail/process-detail.component.spec.ts | 100 +++++++++++++++++- 2 files changed, 100 insertions(+), 2 deletions(-) diff --git a/src/app/process-page/detail/process-detail.component.html b/src/app/process-page/detail/process-detail.component.html index 9e7a24d3af..5f905cbfff 100644 --- a/src/app/process-page/detail/process-detail.component.html +++ b/src/app/process-page/detail/process-detail.component.html @@ -5,7 +5,7 @@ {{ 'process.detail.title' | translate:{ id: process?.processId, name: process?.scriptName } }}
    -
    +
    Refreshing in {{ seconds }}s
    diff --git a/src/app/process-page/detail/process-detail.component.spec.ts b/src/app/process-page/detail/process-detail.component.spec.ts index 8749553eae..9552f9a092 100644 --- a/src/app/process-page/detail/process-detail.component.spec.ts +++ b/src/app/process-page/detail/process-detail.component.spec.ts @@ -35,6 +35,7 @@ import { NotificationsServiceStub } from '../../shared/testing/notifications-ser import { NgbModal } from '@ng-bootstrap/ng-bootstrap'; import { NotificationsService } from '../../shared/notifications/notifications.service'; import { getProcessListRoute } from '../process-page-routing.paths'; +import {ProcessStatus} from '../processes/process-status.model'; describe('ProcessDetailComponent', () => { let component: ProcessDetailComponent; @@ -44,6 +45,7 @@ describe('ProcessDetailComponent', () => { let nameService: DSONameService; let bitstreamDataService: BitstreamDataService; let httpClient: HttpClient; + let route: ActivatedRoute; let process: Process; let fileName: string; @@ -106,7 +108,8 @@ describe('ProcessDetailComponent', () => { }); processService = jasmine.createSpyObj('processService', { getFiles: createSuccessfulRemoteDataObject$(createPaginatedList(files)), - delete: createSuccessfulRemoteDataObject$(null) + delete: createSuccessfulRemoteDataObject$(null), + findById: createSuccessfulRemoteDataObject$(process), }); bitstreamDataService = jasmine.createSpyObj('bitstreamDataService', { findByHref: createSuccessfulRemoteDataObject$(logBitstream) @@ -127,6 +130,13 @@ describe('ProcessDetailComponent', () => { router = jasmine.createSpyObj('router', { navigateByUrl:{} }); + + route = jasmine.createSpyObj('route', { + data: observableOf({ process: createSuccessfulRemoteDataObject(process) }), + snapshot: { + params: { id: process.processId } + } + }); } beforeEach(waitForAsync(() => { @@ -263,4 +273,92 @@ describe('ProcessDetailComponent', () => { }); }); + describe('refresh counter', () => { + const queryRefreshCounter = () => fixture.debugElement.query(By.css('.refresh-counter')); + + describe('if process is completed', () => { + beforeEach(() => { + process.processStatus = ProcessStatus.COMPLETED; + route.data = observableOf({process: createSuccessfulRemoteDataObject(process)}); + }); + + it('should not show', () => { + spyOn(component, 'startRefreshTimer'); + + const refreshCounter = queryRefreshCounter(); + expect(refreshCounter).toBeNull(); + + expect(component.startRefreshTimer).not.toHaveBeenCalled(); + }); + }); + + describe('if process is not finished', () => { + beforeEach(() => { + process.processStatus = ProcessStatus.RUNNING; + route.data = observableOf({process: createSuccessfulRemoteDataObject(process)}); + fixture.detectChanges(); + component.stopRefreshTimer(); + }); + + it('should call startRefreshTimer', () => { + spyOn(component, 'startRefreshTimer'); + + component.ngOnInit(); + fixture.detectChanges(); // subscribe to process observable with async pipe + + expect(component.startRefreshTimer).toHaveBeenCalled(); + }); + + it('should call refresh method every 5 seconds, until process is completed', fakeAsync(() => { + spyOn(component, 'refresh'); + spyOn(component, 'stopRefreshTimer'); + + process.processStatus = ProcessStatus.COMPLETED; + // set findbyId to return a completed process + (processService.findById as jasmine.Spy).and.returnValue(observableOf(createSuccessfulRemoteDataObject(process))); + + component.ngOnInit(); + fixture.detectChanges(); // subscribe to process observable with async pipe + + expect(component.refresh).not.toHaveBeenCalled(); + + expect(component.refreshCounter$.value).toBe(0); + + tick(1001); // 1 second + 1 ms by the setTimeout + expect(component.refreshCounter$.value).toBe(5); // 5 - 0 + + tick(2001); // 2 seconds + 1 ms by the setTimeout + expect(component.refreshCounter$.value).toBe(3); // 5 - 2 + + tick(2001); // 2 seconds + 1 ms by the setTimeout + expect(component.refreshCounter$.value).toBe(1); // 3 - 2 + + tick(1001); // 1 second + 1 ms by the setTimeout + expect(component.refreshCounter$.value).toBe(0); // 1 - 1 + + tick(1000); // 1 second + + expect(component.refresh).toHaveBeenCalledTimes(1); + expect(component.stopRefreshTimer).toHaveBeenCalled(); + + expect(component.refreshCounter$.value).toBe(0); + + tick(1001); // 1 second + 1 ms by the setTimeout + // startRefreshTimer not called again + expect(component.refreshCounter$.value).toBe(0); + + discardPeriodicTasks(); // discard any periodic tasks that have not yet executed + })); + + it('should show if refreshCounter is different from 0', () => { + component.refreshCounter$.next(1); + fixture.detectChanges(); + + const refreshCounter = queryRefreshCounter(); + expect(refreshCounter).not.toBeNull(); + }); + + }); + + }); }); From b1aa2f3550b5ab2aa01736a99d3eb307f5e7b004 Mon Sep 17 00:00:00 2001 From: Alisa Ismailati Date: Tue, 6 Jun 2023 16:57:17 +0200 Subject: [PATCH 331/409] [DURACOM-151] reverted setStaleByUUID method as it was --- .../eperson-form/eperson-form.component.ts | 1 - src/app/core/data/request.service.spec.ts | 7 +++++-- src/app/core/data/request.service.ts | 2 +- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/app/access-control/epeople-registry/eperson-form/eperson-form.component.ts b/src/app/access-control/epeople-registry/eperson-form/eperson-form.component.ts index 1fd0e05ccb..d009d56058 100644 --- a/src/app/access-control/epeople-registry/eperson-form/eperson-form.component.ts +++ b/src/app/access-control/epeople-registry/eperson-form/eperson-form.component.ts @@ -495,7 +495,6 @@ export class EPersonFormComponent implements OnInit, OnDestroy { ).subscribe(({ restResponse, eperson }: { restResponse: RemoteData | null, eperson: EPerson }) => { if (restResponse?.hasSucceeded) { this.notificationsService.success(this.translateService.get(this.labelPrefix + 'notification.deleted.success', { name: this.dsoNameService.getName(eperson) })); - this.submitForm.emit(); } else { this.notificationsService.error(`Error occurred when trying to delete EPerson with id: ${eperson?.id} with code: ${restResponse?.statusCode} and message: ${restResponse?.errorMessage}`); } diff --git a/src/app/core/data/request.service.spec.ts b/src/app/core/data/request.service.spec.ts index 8509f60eb7..108a588881 100644 --- a/src/app/core/data/request.service.spec.ts +++ b/src/app/core/data/request.service.spec.ts @@ -627,8 +627,11 @@ describe('RequestService', () => { it('should return an Observable that emits true as soon as the request is stale', fakeAsync(() => { dispatchSpy.and.callFake(() => { /* empty */ }); // don't actually set as stale - getByUUIDSpy.and.returnValue(cold('-----(a|)', { // but fake the state in the cache - a: { state: RequestEntryState.SuccessStale }, + getByUUIDSpy.and.returnValue(cold('a-b--c--d-', { // but fake the state in the cache + a: { state: RequestEntryState.ResponsePending }, + b: { state: RequestEntryState.Success }, + c: { state: RequestEntryState.SuccessStale }, + d: { state: RequestEntryState.Error }, })); const done$ = service.setStaleByUUID('something'); diff --git a/src/app/core/data/request.service.ts b/src/app/core/data/request.service.ts index 78f53ffe3a..1f6680203e 100644 --- a/src/app/core/data/request.service.ts +++ b/src/app/core/data/request.service.ts @@ -328,9 +328,9 @@ export class RequestService { this.store.dispatch(new RequestStaleAction(uuid)); return this.getByUUID(uuid).pipe( - take(1), map((request: RequestEntry) => isStale(request.state)), filter((stale: boolean) => stale), + take(1), ); } From 755451191c0dbb571f0af1ad4210518724702325 Mon Sep 17 00:00:00 2001 From: Alexandre Vryghem Date: Tue, 6 Jun 2023 18:27:07 +0200 Subject: [PATCH 332/409] 100553: Updated form validation errors from metadata schema and field form --- .../metadata-schema-form.component.ts | 10 ++++++++-- .../metadata-field-form.component.ts | 8 ++++++-- src/assets/i18n/en.json5 | 13 ++++++++++--- 3 files changed, 24 insertions(+), 7 deletions(-) diff --git a/src/app/admin/admin-registries/metadata-registry/metadata-schema-form/metadata-schema-form.component.ts b/src/app/admin/admin-registries/metadata-registry/metadata-schema-form/metadata-schema-form.component.ts index b7c16bc83f..3be4d80fa9 100644 --- a/src/app/admin/admin-registries/metadata-registry/metadata-schema-form/metadata-schema-form.component.ts +++ b/src/app/admin/admin-registries/metadata-registry/metadata-schema-form/metadata-schema-form.component.ts @@ -87,11 +87,13 @@ export class MetadataSchemaFormComponent implements OnInit, OnDestroy { name: 'name', validators: { required: null, - pattern: '^[^. ,_]{1,32}$', + pattern: '^[^. ,]*$', + maxLength: 32, }, required: true, errorMessages: { - pattern: 'error.validation.metadata.namespace.invalid-pattern', + pattern: 'error.validation.metadata.name.invalid-pattern', + maxLength: 'error.validation.metadata.name.max-length', }, }); this.namespace = new DynamicInputModel({ @@ -100,8 +102,12 @@ export class MetadataSchemaFormComponent implements OnInit, OnDestroy { name: 'namespace', validators: { required: null, + maxLength: 256, }, required: true, + errorMessages: { + maxLength: 'error.validation.metadata.namespace.max-length', + }, }); this.formModel = [ new DynamicFormGroupModel( diff --git a/src/app/admin/admin-registries/metadata-schema/metadata-field-form/metadata-field-form.component.ts b/src/app/admin/admin-registries/metadata-schema/metadata-field-form/metadata-field-form.component.ts index 55950a8773..df8373e8d2 100644 --- a/src/app/admin/admin-registries/metadata-schema/metadata-field-form/metadata-field-form.component.ts +++ b/src/app/admin/admin-registries/metadata-schema/metadata-field-form/metadata-field-form.component.ts @@ -109,11 +109,13 @@ export class MetadataFieldFormComponent implements OnInit, OnDestroy { name: 'element', validators: { required: null, - pattern: '^[^.]*$', + pattern: '^[^. ,]*$', + maxLength: 64, }, required: true, errorMessages: { pattern: 'error.validation.metadata.element.invalid-pattern', + maxLength: 'error.validation.metadata.element.max-length', }, }); this.qualifier = new DynamicInputModel({ @@ -121,11 +123,13 @@ export class MetadataFieldFormComponent implements OnInit, OnDestroy { label: qualifier, name: 'qualifier', validators: { - pattern: '^[^.]*$', + pattern: '^[^. ,]*$', + maxLength: 64, }, required: false, errorMessages: { pattern: 'error.validation.metadata.qualifier.invalid-pattern', + maxLength: 'error.validation.metadata.qualifier.max-length', }, }); this.scopeNote = new DynamicInputModel({ diff --git a/src/assets/i18n/en.json5 b/src/assets/i18n/en.json5 index c0edb83a3b..55c788ffac 100644 --- a/src/assets/i18n/en.json5 +++ b/src/assets/i18n/en.json5 @@ -1478,12 +1478,19 @@ "error.validation.groupExists": "This group already exists", - "error.validation.metadata.namespace.invalid-pattern": "This field cannot contain dots, please use the Element & Qualifier fields instead", + "error.validation.metadata.name.invalid-pattern": "This field cannot contain dots, commas or spaces. Please use the Element & Qualifier fields instead", - "error.validation.metadata.element.invalid-pattern": "This field cannot contain dots, please use the Qualifier field instead", + "error.validation.metadata.name.max-length": "This field may not contain more than 32 characters", - "error.validation.metadata.qualifier.invalid-pattern": "This field cannot contain dots", + "error.validation.metadata.namespace.max-length": "This field may not contain more than 256 characters", + "error.validation.metadata.element.invalid-pattern": "This field cannot contain dots, commas or spaces. Please use the Qualifier field instead", + + "error.validation.metadata.element.max-length": "This field may not contain more than 64 characters", + + "error.validation.metadata.qualifier.invalid-pattern": "This field cannot contain dots, commas or spaces", + + "error.validation.metadata.qualifier.max-length": "This field may not contain more than 64 characters", "feed.description": "Syndication feed", From 77a8fde646d22e060d7a44b48e1fa2c0c1875fb9 Mon Sep 17 00:00:00 2001 From: Nona Luypaert Date: Wed, 7 Jun 2023 09:36:01 +0200 Subject: [PATCH 333/409] 101623: Fix Browse By Vocabulary on comcol page --- .../browse-by-taxonomy-page.component.html | 6 +++++- src/assets/i18n/en.json5 | 2 ++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/src/app/browse-by/browse-by-taxonomy-page/browse-by-taxonomy-page.component.html b/src/app/browse-by/browse-by-taxonomy-page/browse-by-taxonomy-page.component.html index 87c7937b1b..0ae3da6847 100644 --- a/src/app/browse-by/browse-by-taxonomy-page/browse-by-taxonomy-page.component.html +++ b/src/app/browse-by/browse-by-taxonomy-page/browse-by-taxonomy-page.component.html @@ -6,5 +6,9 @@ (deselect)="onDeselect($event)">
    - {{ 'browse.taxonomy.button' | translate }} + + {{ 'browse.taxonomy.button' | translate }}
    diff --git a/src/assets/i18n/en.json5 b/src/assets/i18n/en.json5 index 0958fc5d29..33752cbb8a 100644 --- a/src/assets/i18n/en.json5 +++ b/src/assets/i18n/en.json5 @@ -701,6 +701,8 @@ "browse.comcol.by.subject": "By Subject", + "browse.comcol.by.srsc": "By Subject Category", + "browse.comcol.by.title": "By Title", "browse.comcol.head": "Browse", From 47e0314c9b5ebdaf87fdf1d284ac97df3bfe23da Mon Sep 17 00:00:00 2001 From: Enea Jahollari Date: Wed, 7 Jun 2023 13:00:12 +0200 Subject: [PATCH 334/409] CST-9639: Fixed error on control remove, fixed cancel button behavior, fixed bad state of access control tab on load, fixed translations, added jsdocs --- .../bulk-access/bulk-access.component.html | 2 +- .../access-control-array-form.component.html | 30 ++++---- .../access-control-array-form.component.ts | 70 ++++++++++++++----- ...cess-control-form-container.component.html | 4 +- .../bulk-access-control.service.ts | 21 +++++- src/assets/i18n/en.json5 | 8 ++- 6 files changed, 92 insertions(+), 43 deletions(-) diff --git a/src/app/access-control/bulk-access/bulk-access.component.html b/src/app/access-control/bulk-access/bulk-access.component.html index aa6c82e133..382caf85f4 100644 --- a/src/app/access-control/bulk-access/bulk-access.component.html +++ b/src/app/access-control/bulk-access/bulk-access.component.html @@ -7,7 +7,7 @@
    diff --git a/src/app/shared/access-control-form-container/access-control-array-form/access-control-array-form.component.ts b/src/app/shared/access-control-form-container/access-control-array-form/access-control-array-form.component.ts index 4e2fd55967..f08534e8f9 100644 --- a/src/app/shared/access-control-form-container/access-control-array-form/access-control-array-form.component.ts +++ b/src/app/shared/access-control-form-container/access-control-array-form/access-control-array-form.component.ts @@ -1,5 +1,5 @@ import {Component, Input, OnInit, ViewChild} from '@angular/core'; -import {NgForm} from '@angular/forms'; +import {NgForm, NgModelGroup} from '@angular/forms'; import {AccessesConditionOption} from '../../../core/config/models/config-accesses-conditions-options.model'; import {dateToISOFormat} from '../../date.util'; @@ -17,14 +17,13 @@ export class AccessControlArrayFormComponent implements OnInit { @ViewChild('ngForm', {static: true}) ngForm!: NgForm; form: { accessControls: AccessControlItem[] } = { - accessControls: [] + accessControls: [emptyAccessControlItem()] // Start with one empty access control item }; - ngOnInit(): void { - this.addAccessControlItem(); + formDisabled = true; - // Disable the form by default - setTimeout(() => this.disable(), 0); + ngOnInit(): void { + this.disable(); // Disable the form by default } get allControlsAreEmpty() { @@ -32,29 +31,31 @@ export class AccessControlArrayFormComponent implements OnInit { .every(x => x.itemName === null || x.itemName === ''); } + get showWarning() { + return this.mode === 'replace' && this.allControlsAreEmpty && !this.formDisabled; + } + /** * Add a new access control item to the form. * Start and end date are disabled by default. * @param itemName The name of the item to add */ addAccessControlItem(itemName: string = null) { - this.form.accessControls.push({ - itemName, - startDate: null, - hasStartDate: false, - maxStartDate: null, - endDate: null, - hasEndDate: false, - maxEndDate: null, - }); + this.form.accessControls = [ + ...this.form.accessControls, + {...emptyAccessControlItem(), itemName} + ]; } /** * Remove an access control item from the form. + * @param ngModelGroup * @param index */ - removeAccessControlItem(index: number) { - this.form.accessControls.splice(index, 1); + removeAccessControlItem(ngModelGroup: NgModelGroup, id: number) { + this.ngForm.removeFormGroup(ngModelGroup); + + this.form.accessControls = this.form.accessControls.filter(item => item.id !== id); } /** @@ -77,19 +78,30 @@ export class AccessControlArrayFormComponent implements OnInit { */ reset() { this.form.accessControls = []; + + // Add an empty access control item by default + this.addAccessControlItem(); + + this.disable(); } /** * Disable the form. * This will be used to disable the form from the parent component. */ - disable = () => this.ngForm.control.disable(); + disable = () => { + this.ngForm.form.disable(); + this.formDisabled = true; + }; /** * Enable the form. * This will be used to enable the form from the parent component. */ - enable = () => this.ngForm.control.enable(); + enable = () => { + this.ngForm.form.enable(); + this.formDisabled = false; + }; accessControlChanged(control: AccessControlItem, selectedItem: string) { const item = this.dropdownOptions @@ -105,9 +117,16 @@ export class AccessControlArrayFormComponent implements OnInit { control.maxEndDate = item?.maxEndDate || null; } + trackById(index: number, item: AccessControlItem) { + return item.id; + } + } + export interface AccessControlItem { + id: number; // will be used only locally + itemName: string | null; hasStartDate?: boolean; @@ -118,3 +137,16 @@ export interface AccessControlItem { endDate: string | null; maxEndDate?: string | null; } + +const emptyAccessControlItem = (): AccessControlItem => ({ + id: randomID(), + itemName: null, + startDate: null, + hasStartDate: false, + maxStartDate: null, + endDate: null, + hasEndDate: false, + maxEndDate: null, +}); + +const randomID = () => Math.floor(Math.random() * 1000000); diff --git a/src/app/shared/access-control-form-container/access-control-form-container.component.html b/src/app/shared/access-control-form-container/access-control-form-container.component.html index afee07139f..a5173d10d7 100644 --- a/src/app/shared/access-control-form-container/access-control-form-container.component.html +++ b/src/app/shared/access-control-form-container/access-control-form-container.component.html @@ -153,12 +153,12 @@
    -
    diff --git a/src/app/shared/access-control-form-container/bulk-access-control.service.ts b/src/app/shared/access-control-form-container/bulk-access-control.service.ts index 51eba4275d..6fb6b62532 100644 --- a/src/app/shared/access-control-form-container/bulk-access-control.service.ts +++ b/src/app/shared/access-control-form-container/bulk-access-control.service.ts @@ -21,6 +21,9 @@ export interface BulkAccessPayload { itemAccess: any; } +/** + * This service is used to create a payload file and execute the bulk access control script + */ @Injectable({ providedIn: 'root' }) export class BulkAccessControlService { constructor( @@ -28,10 +31,13 @@ export class BulkAccessControlService { private router: Router, private scriptService: ScriptDataService, private translationService: TranslateService - ) { - - } + ) {} + /** + * Create a payload file from the given payload and return the file and the url to the file + * The created file will be used as input for the bulk access control script + * @param payload The payload to create the file from + */ createPayloadFile(payload: BulkAccessPayload) { const content = convertToBulkAccessControlFileModel(payload); @@ -48,6 +54,11 @@ export class BulkAccessControlService { return { url, file }; } + /** + * Execute the bulk access control script with the given uuids and file + * @param uuids + * @param file + */ executeScript(uuids: string[], file: File): Observable { console.log('execute', { uuids, file }); @@ -80,6 +91,10 @@ export class BulkAccessControlService { } } +/** + * Convert the given payload to a BulkAccessControlFileModel + * @param payload + */ export const convertToBulkAccessControlFileModel = (payload: { state: AccessControlFormState, bitstreamAccess: AccessCondition[], itemAccess: AccessCondition[] }): BulkAccessControlFileModel => { let finalPayload: BulkAccessControlFileModel = {}; diff --git a/src/assets/i18n/en.json5 b/src/assets/i18n/en.json5 index 223c2fce27..a454131175 100644 --- a/src/assets/i18n/en.json5 +++ b/src/assets/i18n/en.json5 @@ -225,7 +225,9 @@ "admin.registries.schema.title": "Metadata Schema Registry", + "admin.access-control.bulk-access.breadcrumbs": "Bulk Access Management", + "administrativeBulkAccess.search.results.head": "Search Results", "admin.access-control.bulk-access": "Bulk Access Management", @@ -5399,14 +5401,14 @@ "access-control-option-label": "Access condition type", - "access-control-option-note": "Select an access condition to apply on the bitstream once the item is deposited", + "access-control-option-note": "Choose an access condition to apply to selected objects.", "access-control-option-start-date": "Grant access from", - "access-control-option-start-date-note": "Select the date from which the relate access condition is applied", + "access-control-option-start-date-note": "Select the date from which the related access condition is applied", "access-control-option-end-date": "Grant access until", - "access-control-option-end-date-note": "Select the date until which the relate access condition is applied", + "access-control-option-end-date-note": "Select the date until which the related access condition is applied", } From d69adab419cc415295e8240ffa05992701459182 Mon Sep 17 00:00:00 2001 From: Art Lowel Date: Wed, 7 Jun 2023 16:22:57 +0200 Subject: [PATCH 335/409] refactor primarybitstreams to work with DELETE, POST and PUT instead of PATCh --- .../bitstream-page/bitstream-page.resolver.ts | 2 +- .../edit-bitstream-page.component.ts | 96 ++++++++----- .../data/primary-bitstream-data.service.ts | 134 ++++++++++++++++++ src/app/core/shared/bundle.model.ts | 6 - 4 files changed, 197 insertions(+), 41 deletions(-) create mode 100644 src/app/core/data/primary-bitstream-data.service.ts diff --git a/src/app/bitstream-page/bitstream-page.resolver.ts b/src/app/bitstream-page/bitstream-page.resolver.ts index be92041dfc..db2af2d554 100644 --- a/src/app/bitstream-page/bitstream-page.resolver.ts +++ b/src/app/bitstream-page/bitstream-page.resolver.ts @@ -12,7 +12,7 @@ import { getFirstCompletedRemoteData } from '../core/shared/operators'; * Requesting them as embeds will limit the number of requests */ export const BITSTREAM_PAGE_LINKS_TO_FOLLOW: FollowLinkConfig[] = [ - followLink('bundle', {}, followLink('item')), + followLink('bundle', {}, followLink('primaryBitstream'), followLink('item')), followLink('format') ]; diff --git a/src/app/bitstream-page/edit-bitstream-page/edit-bitstream-page.component.ts b/src/app/bitstream-page/edit-bitstream-page/edit-bitstream-page.component.ts index 10d9652a65..8b3dad3c1c 100644 --- a/src/app/bitstream-page/edit-bitstream-page/edit-bitstream-page.component.ts +++ b/src/app/bitstream-page/edit-bitstream-page/edit-bitstream-page.component.ts @@ -1,7 +1,7 @@ import { ChangeDetectionStrategy, ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core'; import { Bitstream } from '../../core/shared/bitstream.model'; import { ActivatedRoute, Router } from '@angular/router'; -import { map, switchMap, tap } from 'rxjs/operators'; +import { map, switchMap, tap, filter } from 'rxjs/operators'; import { combineLatest, combineLatest as observableCombineLatest, Observable, of as observableOf, Subscription } from 'rxjs'; import { DynamicFormControlModel, DynamicFormGroupModel, DynamicFormLayout, DynamicFormService, DynamicInputModel, DynamicSelectModel } from '@ng-dynamic-forms/core'; import { UntypedFormGroup } from '@angular/forms'; @@ -14,7 +14,7 @@ import { NotificationsService } from '../../shared/notifications/notifications.s import { BitstreamFormatDataService } from '../../core/data/bitstream-format-data.service'; import { BitstreamFormat } from '../../core/shared/bitstream-format.model'; import { BitstreamFormatSupportLevel } from '../../core/shared/bitstream-format-support-level'; -import { hasValue, isEmpty, isNotEmpty } from '../../shared/empty.util'; +import { hasValue, isEmpty, isNotEmpty, hasValueOperator } from '../../shared/empty.util'; import { Metadata } from '../../core/shared/metadata.utils'; import { Location } from '@angular/common'; import { RemoteData } from '../../core/data/remote-data'; @@ -27,6 +27,8 @@ import { DsDynamicInputModel } from '../../shared/form/builder/ds-dynamic-form-u import { DsDynamicTextAreaModel } from '../../shared/form/builder/ds-dynamic-form-ui/models/ds-dynamic-textarea.model'; import { BundleDataService } from '../../core/data/bundle-data.service'; import { Operation } from 'fast-json-patch'; +import { PrimaryBitstreamService } from '../../core/data/primary-bitstream-data.service'; +import { hasSucceeded } from '../../core/data/request-entry-state.model'; @Component({ selector: 'ds-edit-bitstream-page', @@ -51,6 +53,11 @@ export class EditBitstreamPageComponent implements OnInit, OnDestroy { */ bitstreamFormatsRD$: Observable>>; + /** + * The UUID of the primary bitstream for this bundle + */ + primaryBitstreamUUID: string; + /** * The bitstream to edit */ @@ -383,6 +390,7 @@ export class EditBitstreamPageComponent implements OnInit, OnDestroy { public dsoNameService: DSONameService, private notificationsService: NotificationsService, private bitstreamFormatService: BitstreamFormatDataService, + private primaryBitstreamService: PrimaryBitstreamService, private bundleService: BundleDataService) { } @@ -414,6 +422,12 @@ export class EditBitstreamPageComponent implements OnInit, OnDestroy { getFirstSucceededRemoteDataPayload(), ); + const primaryBitstream$ = bundle$.pipe( + hasValueOperator(), + switchMap((bundle: Bundle) => this.bitstreamService.findByHref(bundle._links.primaryBitstream.href)), + getFirstSucceededRemoteDataPayload() + ); + const item$ = bundle$.pipe( switchMap((bundle: Bundle) => bundle.item), getFirstSucceededRemoteDataPayload() @@ -423,12 +437,16 @@ export class EditBitstreamPageComponent implements OnInit, OnDestroy { bitstream$, allFormats$, bundle$, + primaryBitstream$, item$, ).pipe() - .subscribe(([bitstream, allFormats, bundle, item]) => { + .subscribe(([bitstream, allFormats, bundle, primaryBitstream, item]) => { this.bitstream = bitstream as Bitstream; this.formats = allFormats.page; this.bundle = bundle; + // hasValue(primaryBitstream) because if there's no primaryBitstream on the bundle it will + // be a success response, but empty + this.primaryBitstreamUUID = hasValue(primaryBitstream) ? primaryBitstream.uuid : null; this.itemId = item.uuid; this.setIiifStatus(this.bitstream); }) @@ -460,7 +478,7 @@ export class EditBitstreamPageComponent implements OnInit, OnDestroy { this.formGroup.patchValue({ fileNamePrimaryContainer: { fileName: bitstream.name, - primaryBitstream: this.bundle.primaryBitstreamUUID === bitstream.uuid + primaryBitstream: this.primaryBitstreamUUID === bitstream.uuid }, descriptionContainer: { description: bitstream.firstMetadataValue('dc.description') @@ -572,26 +590,52 @@ export class EditBitstreamPageComponent implements OnInit, OnDestroy { const selectedFormat = this.formats.find((f: BitstreamFormat) => f.id === updatedValues.formatContainer.selectedFormat); const isNewFormat = selectedFormat.id !== this.originalFormat.id; const isPrimary = updatedValues.fileNamePrimaryContainer.primaryBitstream; - const wasPrimary = this.bundle.primaryBitstreamUUID === this.bitstream.uuid; + const wasPrimary = this.primaryBitstreamUUID === this.bitstream.uuid; let bitstream$; let bundle$: Observable; + let errorWhileSaving = false; if (wasPrimary !== isPrimary) { - const patchOperations: Operation[] = this.retrieveBundlePatch(wasPrimary); - bundle$ = this.bundleService.patch(this.bundle, patchOperations).pipe( - getFirstCompletedRemoteData(), - map((bundleResponse: RemoteData) => { - if (hasValue(bundleResponse) && bundleResponse.hasFailed) { - this.notificationsService.error( - this.translate.instant(this.NOTIFICATIONS_PREFIX + 'error.primaryBitstream.title'), - bundleResponse.errorMessage - ); + let bundleRd$: Observable>; + if (wasPrimary) { + bundleRd$ = this.primaryBitstreamService.delete(this.bundle); + } else if (hasValue(this.primaryBitstreamUUID)) { + bundleRd$ = this.primaryBitstreamService.put(this.bitstream, this.bundle); + } else { + bundleRd$ = this.primaryBitstreamService.create(this.bitstream, this.bundle); + } + + const completedBundleRd$ = bundleRd$.pipe(getFirstCompletedRemoteData()); + + this.subs.push(completedBundleRd$.pipe( + filter((bundleRd: RemoteData) => bundleRd.hasFailed) + ).subscribe((bundleRd: RemoteData) => { + this.notificationsService.error( + this.translate.instant(this.NOTIFICATIONS_PREFIX + 'error.primaryBitstream.title'), + bundleRd.errorMessage + ); + errorWhileSaving = true; + })); + + bundle$ = completedBundleRd$.pipe( + map((bundleRd: RemoteData) => { + if (bundleRd.hasSucceeded) { + return bundleRd.payload } else { - return bundleResponse.payload; + return this.bundle; } }) ); + + this.subs.push(bundle$.pipe( + hasValueOperator(), + switchMap((bundle: Bundle) => this.bitstreamService.findByHref(bundle._links.primaryBitstream.href, false)), + getFirstSucceededRemoteDataPayload() + ).subscribe((bitstream: Bitstream) => { + this.primaryBitstreamUUID = hasValue(bitstream) ? bitstream.uuid : null; + })); + } else { bundle$ = observableOf(this.bundle); } @@ -626,28 +670,12 @@ export class EditBitstreamPageComponent implements OnInit, OnDestroy { this.translate.instant(this.NOTIFICATIONS_PREFIX + 'saved.title'), this.translate.instant(this.NOTIFICATIONS_PREFIX + 'saved.content') ); - this.navigateToItemEditBitstreams(); + if (!errorWhileSaving) { + this.navigateToItemEditBitstreams(); + } }); } - private retrieveBundlePatch(wasPrimary: boolean): Operation[] { - // No longer primary bitstream: remove - if (wasPrimary) { - return [{ - path: this.primaryBitstreamPath, - op: 'remove' - }]; - } else { - // Has become primary bitstream - // If it already had a value: replace, otherwise: add - return [{ - path: this.primaryBitstreamPath, - op: hasValue(this.bundle.primaryBitstreamUUID) ? 'replace' : 'add', - value: this.bitstream.uuid - }]; - } - } - /** * Parse form data to an updated bitstream object * @param rawForm Raw form data diff --git a/src/app/core/data/primary-bitstream-data.service.ts b/src/app/core/data/primary-bitstream-data.service.ts new file mode 100644 index 0000000000..6380a6f148 --- /dev/null +++ b/src/app/core/data/primary-bitstream-data.service.ts @@ -0,0 +1,134 @@ +import { Bitstream } from '../shared/bitstream.model'; +import { DeleteDataImpl } from './base/delete-data'; +import { PutDataImpl } from './base/put-data'; +import { CreateDataImpl } from './base/create-data'; +import { Injectable } from '@angular/core'; +import { RequestService } from './request.service'; +import { RemoteDataBuildService } from '../cache/builders/remote-data-build.service'; +import { ObjectCacheService } from '../cache/object-cache.service'; +import { HALEndpointService } from '../shared/hal-endpoint.service'; +import { Observable, switchMap } from 'rxjs'; +import { RemoteData } from './remote-data'; +import { Bundle } from '../shared/bundle.model'; +import { NotificationsService } from '../../shared/notifications/notifications.service'; +import { constructIdEndpointDefault } from './base/identifiable-data.service'; +import { HttpOptions } from '../dspace-rest/dspace-rest.service'; +import { HttpHeaders } from '@angular/common/http'; +import { GenericConstructor } from '../shared/generic-constructor'; +import { PutRequest, PostRequest, DeleteRequest } from './request.models'; +import { getAllCompletedRemoteData } from '../shared/operators'; +import { NoContent } from '../shared/NoContent.model'; +import { BundleDataService } from './bundle-data.service'; + +@Injectable({ + providedIn: 'root', +}) +export class PrimaryBitstreamService { + private createData: CreateDataImpl; + private putData: PutDataImpl; + private deleteData: DeleteDataImpl; + + constructor( + protected requestService: RequestService, + protected rdbService: RemoteDataBuildService, + protected objectCache: ObjectCacheService, + protected halService: HALEndpointService, + protected notificationsService: NotificationsService, + protected bundleDataService: BundleDataService, + ) { + // linkPath can be undefined because we'll only use them to do things "byHref" + this.createData = new CreateDataImpl(undefined, requestService, rdbService, objectCache, halService, notificationsService, undefined); + this.putData = new PutDataImpl(undefined, requestService, rdbService, objectCache, halService, undefined); + this.deleteData = new DeleteDataImpl(undefined, requestService, rdbService, objectCache, halService, notificationsService, undefined, constructIdEndpointDefault); + } + + /** + * Returns the type of HttpOptions object needed from primary bitstream requests. + * i.e. with a Content-Type header set to `text/uri-list` + * @protected + */ + protected getHttpOptions(): HttpOptions { + const options: HttpOptions = Object.create({}); + let headers = new HttpHeaders(); + headers = headers.append('Content-Type', 'text/uri-list'); + options.headers = headers; + return options; + } + + /** + * Send a request of the given type to the endpointURL with an optional primaryBitstreamSelfLink + * as payload, and return the resulting Observable + * + * @param requestType The type of request: PostRequest, PutRequest, or DeleteRequest + * @param endpointURL The endpoint URL + * @param primaryBitstreamSelfLink + * @protected + */ + protected createAndSendRequest( + requestType: GenericConstructor, + endpointURL: string, + primaryBitstreamSelfLink?: string, + ): Observable> { + const requestId = this.requestService.generateRequestId(); + const request = new requestType( + requestId, + endpointURL, + primaryBitstreamSelfLink, + this.getHttpOptions() + ); + + this.requestService.send(request); + + return this.rdbService.buildFromRequestUUID(requestId); + } + + /** + * Create a new primaryBitstream + * + * @param primaryBitstream The object to create + * @param bundle The bundle to create it on + */ + create(primaryBitstream: Bitstream, bundle: Bundle): Observable> { + return this.createAndSendRequest( + PostRequest, + bundle._links.primaryBitstream.href, + primaryBitstream.self + ) as Observable>; + } + + /** + * Update an exiting primaryBitstream + * + * @param primaryBitstream The object to update + * @param bundle The bundle to update it on + */ + put(primaryBitstream: Bitstream, bundle: Bundle): Observable> { + return this.createAndSendRequest( + PutRequest, + bundle._links.primaryBitstream.href, + primaryBitstream.self + ) as Observable>; + } + + /** + * Delete an exiting primaryBitstream + * + * @param bundle The bundle to delete it from + */ + delete(bundle: Bundle): Observable> { + return this.createAndSendRequest( + DeleteRequest, + bundle._links.primaryBitstream.href + ).pipe( + getAllCompletedRemoteData(), + switchMap((rd: RemoteData) => { + if (rd.hasSucceeded) { + return this.bundleDataService.findByHref(bundle.self, false); + } else { + [bundle]; + } + }) + ); + } + +} diff --git a/src/app/core/shared/bundle.model.ts b/src/app/core/shared/bundle.model.ts index bcaa582703..f37cd96545 100644 --- a/src/app/core/shared/bundle.model.ts +++ b/src/app/core/shared/bundle.model.ts @@ -29,12 +29,6 @@ export class Bundle extends DSpaceObject { item: HALLink; }; - /** - * The UUID of the primaryBitstream of this Bundle - */ - @autoserialize - primaryBitstreamUUID: string; - /** * The primary Bitstream of this Bundle * Will be undefined unless the primaryBitstream {@link HALLink} has been resolved. From 12b3eb839ba63032d715bb4c25ac1a2ce00f492e Mon Sep 17 00:00:00 2001 From: Enea Jahollari Date: Wed, 7 Jun 2023 17:29:05 +0200 Subject: [PATCH 336/409] CST-9639: Added and fixed unit tests --- .../access-control-array-form.component.html | 4 +- ...ccess-control-array-form.component.spec.ts | 32 ++- .../access-control-array-form.component.ts | 6 +- ...s-control-form-container.component.spec.ts | 187 ++++++++++++++---- ...access-control-form-container.component.ts | 2 +- 5 files changed, 178 insertions(+), 53 deletions(-) diff --git a/src/app/shared/access-control-form-container/access-control-array-form/access-control-array-form.component.html b/src/app/shared/access-control-form-container/access-control-array-form/access-control-array-form.component.html index 963ae165e7..efe2259328 100644 --- a/src/app/shared/access-control-form-container/access-control-array-form/access-control-array-form.component.html +++ b/src/app/shared/access-control-form-container/access-control-array-form/access-control-array-form.component.html @@ -4,7 +4,7 @@
    -
    +
    @@ -91,7 +91,7 @@
    diff --git a/src/app/shared/access-control-form-container/access-control-array-form/access-control-array-form.component.spec.ts b/src/app/shared/access-control-form-container/access-control-array-form/access-control-array-form.component.spec.ts index 88d462ad79..964eb30de2 100644 --- a/src/app/shared/access-control-form-container/access-control-array-form/access-control-array-form.component.spec.ts +++ b/src/app/shared/access-control-form-container/access-control-array-form/access-control-array-form.component.spec.ts @@ -45,12 +45,14 @@ describe('AccessControlArrayFormComponent', () => { }); it('should remove access control item', () => { - component.removeAccessControlItem(0); - expect(component.form.accessControls.length).toEqual(0); + expect(component.form.accessControls.length).toEqual(1); component.addAccessControlItem(); - component.removeAccessControlItem(0); - expect(component.form.accessControls.length).toEqual(0); + expect(component.form.accessControls.length).toEqual(2); + + const id = component.form.accessControls[0].id; + component.removeAccessControlItem(id); + expect(component.form.accessControls.length).toEqual(1); }); it('should reset form value', () => { @@ -69,7 +71,12 @@ describe('AccessControlArrayFormComponent', () => { it('should display a select dropdown with options', () => { - const selectElement: DebugElement = fixture.debugElement.query(By.css('select#accesscontroloption-0')); + component.enable(); + fixture.detectChanges(); + + const id = component.form.accessControls[0].id; + + const selectElement: DebugElement = fixture.debugElement.query(By.css(`select#accesscontroloption-${id}`)); expect(selectElement).toBeTruthy(); const options = selectElement.nativeElement.querySelectorAll('option'); @@ -81,6 +88,9 @@ describe('AccessControlArrayFormComponent', () => { }); it('should add new access control items when clicking "Add more" button', () => { + component.enable(); + fixture.detectChanges(); + const addButton: DebugElement = fixture.debugElement.query(By.css(`button#add-btn-${component.type}`)); addButton.nativeElement.click(); fixture.detectChanges(); @@ -90,11 +100,17 @@ describe('AccessControlArrayFormComponent', () => { }); it('should remove access control items when clicking remove button', () => { - const removeButton: DebugElement = fixture.debugElement.query(By.css('button.btn-outline-danger')); - removeButton.nativeElement.click(); + component.enable(); + + component.addAccessControlItem('test'); + + fixture.detectChanges(); + + const removeButton: DebugElement[] = fixture.debugElement.queryAll(By.css('button.btn-outline-danger')); + removeButton[1].nativeElement.click(); fixture.detectChanges(); const accessControlItems = fixture.debugElement.queryAll(By.css('.access-control-item')); - expect(accessControlItems.length).toEqual(0); + expect(accessControlItems.length).toEqual(1); }); }); diff --git a/src/app/shared/access-control-form-container/access-control-array-form/access-control-array-form.component.ts b/src/app/shared/access-control-form-container/access-control-array-form/access-control-array-form.component.ts index f08534e8f9..227de596ff 100644 --- a/src/app/shared/access-control-form-container/access-control-array-form/access-control-array-form.component.ts +++ b/src/app/shared/access-control-form-container/access-control-array-form/access-control-array-form.component.ts @@ -1,5 +1,5 @@ import {Component, Input, OnInit, ViewChild} from '@angular/core'; -import {NgForm, NgModelGroup} from '@angular/forms'; +import {NgForm} from '@angular/forms'; import {AccessesConditionOption} from '../../../core/config/models/config-accesses-conditions-options.model'; import {dateToISOFormat} from '../../date.util'; @@ -52,9 +52,7 @@ export class AccessControlArrayFormComponent implements OnInit { * @param ngModelGroup * @param index */ - removeAccessControlItem(ngModelGroup: NgModelGroup, id: number) { - this.ngForm.removeFormGroup(ngModelGroup); - + removeAccessControlItem(id: number) { this.form.accessControls = this.form.accessControls.filter(item => item.id !== id); } diff --git a/src/app/shared/access-control-form-container/access-control-form-container.component.spec.ts b/src/app/shared/access-control-form-container/access-control-form-container.component.spec.ts index 66ef20444e..4d02f7a52d 100644 --- a/src/app/shared/access-control-form-container/access-control-form-container.component.spec.ts +++ b/src/app/shared/access-control-form-container/access-control-form-container.component.spec.ts @@ -1,38 +1,149 @@ -// -// describe('AccessControlFormContainerComponent', () => { -// let component: AccessControlFormContainerComponent; -// let fixture: ComponentFixture>; -// -// let bulkAccessConfigDataServiceMock: BulkAccessConfigDataService; -// -// beforeEach(async () => { -// -// bulkAccessConfigDataServiceMock = jasmine.createSpyObj('BulkAccessConfigDataService', { -// findByName: jasmine.createSpy('findByName'), -// }); -// -// -// await TestBed.configureTestingModule({ -// declarations: [ AccessControlFormContainerComponent ], -// imports: [ CommonModule, ReactiveFormsModule, SharedBrowseByModule, TranslateModule, NgbDatepickerModule ], -// providers: [ -// { provide: BulkAccessConfigDataService, useValue: bulkAccessConfigDataServiceMock }, -// // private bulkAccessControlService: BulkAccessControlService, -// // private selectableListService: SelectableListService, -// // protected modalService: NgbModal, -// // private cdr: ChangeDetectorRef -// ] -// }) -// .compileComponents(); -// }); -// -// beforeEach(() => { -// fixture = TestBed.createComponent(AccessControlFormContainerComponent); -// component = fixture.componentInstance; -// fixture.detectChanges(); -// }); -// -// it('should create', () => { -// expect(component).toBeTruthy(); -// }); -// }); +import {ComponentFixture, fakeAsync, TestBed} from '@angular/core/testing'; +import {NgbDatepickerModule, NgbModal, NgbModalRef} from '@ng-bootstrap/ng-bootstrap'; +import {Component} from '@angular/core'; +import {of} from 'rxjs'; +import {AccessControlFormContainerComponent} from './access-control-form-container.component'; +import {BulkAccessControlService} from './bulk-access-control.service'; +import {BulkAccessConfigDataService} from '../../core/config/bulk-access-config-data.service'; +import {Item} from '../../core/shared/item.model'; +import {SelectableListService} from '../object-list/selectable-list/selectable-list.service'; +import {createAccessControlInitialFormState} from './access-control-form-container-intial-state'; +import {CommonModule} from '@angular/common'; +import {SharedBrowseByModule} from '../browse-by/shared-browse-by.module'; +import {TranslateModule} from '@ngx-translate/core'; +import {FormsModule} from '@angular/forms'; +import {UiSwitchModule} from 'ngx-ui-switch'; +import { + ITEM_ACCESS_CONTROL_SELECT_BITSTREAMS_LIST_ID +} from './item-access-control-select-bitstreams-modal/item-access-control-select-bitstreams-modal.component'; +import {AccessControlFormModule} from './access-control-form.module'; + + +describe('AccessControlFormContainerComponent', () => { + let component: AccessControlFormContainerComponent; + let fixture: ComponentFixture>; + + +// Mock NgbModal + @Component({selector: 'ds-ngb-modal', template: ''}) + class MockNgbModalComponent { + } + +// Mock dependencies + const mockBulkAccessControlService = { + createPayloadFile: jasmine.createSpy('createPayloadFile').and.returnValue({file: 'mocked-file'}), + executeScript: jasmine.createSpy('executeScript').and.returnValue(of('success')), + }; + + const mockBulkAccessConfigDataService = { + findByName: jasmine.createSpy('findByName').and.returnValue(of({payload: {options: []}})), + }; + + const mockSelectableListService = { + getSelectableList: jasmine.createSpy('getSelectableList').and.returnValue(of({selection: []})), + deselectAll: jasmine.createSpy('deselectAll'), + }; + + const mockNgbModal = { + open: jasmine.createSpy('open').and.returnValue( + { componentInstance: {}, closed: of({})} as NgbModalRef + ) + }; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [AccessControlFormContainerComponent, MockNgbModalComponent], + imports: [ + CommonModule, + FormsModule, + SharedBrowseByModule, + AccessControlFormModule, + TranslateModule.forRoot(), + NgbDatepickerModule, + UiSwitchModule + ], + providers: [ + {provide: BulkAccessControlService, useValue: mockBulkAccessControlService}, + {provide: BulkAccessConfigDataService, useValue: mockBulkAccessConfigDataService}, + {provide: SelectableListService, useValue: mockSelectableListService}, + {provide: NgbModal, useValue: mockNgbModal}, + ], + }).compileComponents(); + }); + + beforeEach(() => { + fixture = TestBed.createComponent(AccessControlFormContainerComponent); + component = fixture.componentInstance; + component.state = createAccessControlInitialFormState(); + fixture.detectChanges(); + }); + + it('should create the component', () => { + expect(component).toBeTruthy(); + }); + + it('should reset the form', fakeAsync(() => { + fixture.detectChanges(); + const resetSpy = spyOn(component.bitstreamAccessCmp, 'reset'); + spyOn(component.itemAccessCmp, 'reset'); + + component.reset(); + + expect(resetSpy).toHaveBeenCalled(); + expect(component.itemAccessCmp.reset).toHaveBeenCalled(); + expect(component.state).toEqual(createAccessControlInitialFormState()); + })); + + it('should submit the form', () => { + const bitstreamAccess = 'bitstreamAccess'; + const itemAccess = 'itemAccess'; + component.bitstreamAccessCmp.getValue = jasmine.createSpy('getValue').and.returnValue(bitstreamAccess); + component.itemAccessCmp.getValue = jasmine.createSpy('getValue').and.returnValue(itemAccess); + component.itemRD = {payload: {uuid: 'item-uuid'}} as any; + + component.submit(); + + expect(mockBulkAccessControlService.createPayloadFile).toHaveBeenCalledWith({ + bitstreamAccess, + itemAccess, + state: createAccessControlInitialFormState(), + }); + expect(mockBulkAccessControlService.executeScript).toHaveBeenCalledWith(['item-uuid'], 'mocked-file'); + }); + + it('should handle the status change for bitstream access', () => { + component.bitstreamAccessCmp.enable = jasmine.createSpy('enable'); + component.bitstreamAccessCmp.disable = jasmine.createSpy('disable'); + + component.handleStatusChange('bitstream', true); + expect(component.bitstreamAccessCmp.enable).toHaveBeenCalled(); + + component.handleStatusChange('bitstream', false); + expect(component.bitstreamAccessCmp.disable).toHaveBeenCalled(); + }); + + it('should handle the status change for item access', () => { + component.itemAccessCmp.enable = jasmine.createSpy('enable'); + component.itemAccessCmp.disable = jasmine.createSpy('disable'); + + component.handleStatusChange('item', true); + expect(component.itemAccessCmp.enable).toHaveBeenCalled(); + + component.handleStatusChange('item', false); + expect(component.itemAccessCmp.disable).toHaveBeenCalled(); + }); + + it('should open the select bitstreams modal', () => { + const modalService = TestBed.inject(NgbModal); + + component.openSelectBitstreamsModal(new Item()); + expect(modalService.open).toHaveBeenCalled(); + }); + + it('should unsubscribe and deselect all on component destroy', () => { + component.ngOnDestroy(); + expect(component.selectableListService.deselectAll).toHaveBeenCalledWith( + ITEM_ACCESS_CONTROL_SELECT_BITSTREAMS_LIST_ID + ); + }); +}); diff --git a/src/app/shared/access-control-form-container/access-control-form-container.component.ts b/src/app/shared/access-control-form-container/access-control-form-container.component.ts index a97859a599..b13943e07a 100644 --- a/src/app/shared/access-control-form-container/access-control-form-container.component.ts +++ b/src/app/shared/access-control-form-container/access-control-form-container.component.ts @@ -58,7 +58,7 @@ export class AccessControlFormContainerComponent impleme constructor( private bulkAccessConfigService: BulkAccessConfigDataService, private bulkAccessControlService: BulkAccessControlService, - private selectableListService: SelectableListService, + public selectableListService: SelectableListService, protected modalService: NgbModal, private cdr: ChangeDetectorRef ) {} From 5331b43a62b15a8e86dab4e0a4afae381179c411 Mon Sep 17 00:00:00 2001 From: Alisa Ismailati Date: Wed, 7 Jun 2023 18:08:21 +0200 Subject: [PATCH 337/409] [DURACOM-152] Fixed read-only visibility for submission form fields --- .../models/ds-dynamic-input.model.ts | 1 + .../onebox/dynamic-onebox.component.html | 2 ++ .../models/onebox/dynamic-onebox.component.ts | 3 +++ ...dynamic-scrollable-dropdown.component.html | 7 ++++-- ...dynamic-scrollable-dropdown.component.scss | 4 +++ .../form/builder/models/form-field.model.ts | 4 +++ .../builder/parsers/concat-field-parser.ts | 6 +++++ .../form/builder/parsers/field-parser.ts | 17 +++++++++++-- .../builder/parsers/onebox-field-parser.ts | 11 ++++---- .../shared/form/builder/parsers/row-parser.ts | 25 ++++++++++++++++--- 10 files changed, 67 insertions(+), 13 deletions(-) diff --git a/src/app/shared/form/builder/ds-dynamic-form-ui/models/ds-dynamic-input.model.ts b/src/app/shared/form/builder/ds-dynamic-form-ui/models/ds-dynamic-input.model.ts index edbd5710d2..3c6abaa851 100644 --- a/src/app/shared/form/builder/ds-dynamic-form-ui/models/ds-dynamic-input.model.ts +++ b/src/app/shared/form/builder/ds-dynamic-form-ui/models/ds-dynamic-input.model.ts @@ -55,6 +55,7 @@ export class DsDynamicInputModel extends DynamicInputModel { this.metadataFields = config.metadataFields; this.hint = config.hint; this.readOnly = config.readOnly; + this.disabled = config.readOnly; this.value = config.value; this.relationship = config.relationship; this.submissionId = config.submissionId; diff --git a/src/app/shared/form/builder/ds-dynamic-form-ui/models/onebox/dynamic-onebox.component.html b/src/app/shared/form/builder/ds-dynamic-form-ui/models/onebox/dynamic-onebox.component.html index e6b0cf508f..3c19ecda13 100644 --- a/src/app/shared/form/builder/ds-dynamic-form-ui/models/onebox/dynamic-onebox.component.html +++ b/src/app/shared/form/builder/ds-dynamic-form-ui/models/onebox/dynamic-onebox.component.html @@ -39,6 +39,7 @@ [ngbTypeahead]="search" [placeholder]="model.placeholder" [readonly]="model.readOnly" + [disabled]="model.readOnly" [resultTemplate]="rt" [type]="model.inputType" [(ngModel)]="currentValue" @@ -63,6 +64,7 @@ [name]="model.name" [placeholder]="model.placeholder" [readonly]="true" + [disabled]="model.readOnly" [type]="model.inputType" [value]="currentValue?.display" (focus)="onFocus($event)" diff --git a/src/app/shared/form/builder/ds-dynamic-form-ui/models/onebox/dynamic-onebox.component.ts b/src/app/shared/form/builder/ds-dynamic-form-ui/models/onebox/dynamic-onebox.component.ts index db278716e1..2ff4256404 100644 --- a/src/app/shared/form/builder/ds-dynamic-form-ui/models/onebox/dynamic-onebox.component.ts +++ b/src/app/shared/form/builder/ds-dynamic-form-ui/models/onebox/dynamic-onebox.component.ts @@ -216,6 +216,9 @@ export class DsDynamicOneboxComponent extends DsDynamicVocabularyComponent imple * @param event The click event fired */ openTree(event) { + if (this.model.readOnly) { + return; + } event.preventDefault(); event.stopImmediatePropagation(); this.subs.push(this.vocabulary$.pipe( diff --git a/src/app/shared/form/builder/ds-dynamic-form-ui/models/scrollable-dropdown/dynamic-scrollable-dropdown.component.html b/src/app/shared/form/builder/ds-dynamic-form-ui/models/scrollable-dropdown/dynamic-scrollable-dropdown.component.html index 8a4d502287..3a75fe1037 100644 --- a/src/app/shared/form/builder/ds-dynamic-form-ui/models/scrollable-dropdown/dynamic-scrollable-dropdown.component.html +++ b/src/app/shared/form/builder/ds-dynamic-form-ui/models/scrollable-dropdown/dynamic-scrollable-dropdown.component.html @@ -3,8 +3,10 @@ role="combobox" [attr.aria-label]="model.label" [attr.aria-owns]="'combobox_' + id + '_listbox'"> - + + = this.initModel(newId + QUALDROP_METADATA_SUFFIX, label, false, false); selectModelConfig.hint = null; this.setOptions(selectModelConfig); if (isNotEmpty(fieldValue)) { selectModelConfig.value = fieldValue.metadata; } - inputSelectGroup.group.push(new DynamicSelectModel(selectModelConfig, clsSelect)); - - const inputModelConfig: DsDynamicInputModelConfig = this.initModel(newId + QUALDROP_VALUE_SUFFIX, label, false, false); - inputModelConfig.hint = null; - this.setValues(inputModelConfig, fieldValue); + selectModelConfig.disabled = inputModelConfig.readOnly; inputSelectGroup.readOnly = selectModelConfig.disabled && inputModelConfig.readOnly; + inputSelectGroup.group.push(new DynamicSelectModel(selectModelConfig, clsSelect)); inputSelectGroup.group.push(new DsDynamicInputModel(inputModelConfig, clsInput)); return new DynamicQualdropModel(inputSelectGroup, clsGroup); diff --git a/src/app/shared/form/builder/parsers/row-parser.ts b/src/app/shared/form/builder/parsers/row-parser.ts index 2818e37b25..6602e53714 100644 --- a/src/app/shared/form/builder/parsers/row-parser.ts +++ b/src/app/shared/form/builder/parsers/row-parser.ts @@ -1,9 +1,10 @@ +import { SectionVisibility } from './../../../../submission/objects/section-visibility.model'; import { Injectable, Injector } from '@angular/core'; import { DYNAMIC_FORM_CONTROL_TYPE_ARRAY, DynamicFormGroupModelConfig } from '@ng-dynamic-forms/core'; import uniqueId from 'lodash/uniqueId'; -import { isEmpty } from '../../../empty.util'; +import { isEmpty, isNotEmpty } from '../../../empty.util'; import { DynamicRowGroupModel } from '../ds-dynamic-form-ui/models/ds-dynamic-row-group-model'; import { FormFieldModel } from '../models/form-field.model'; import { CONFIG_DATA, FieldParser, INIT_FORM_VALUES, PARSER_OPTIONS, SUBMISSION_ID } from './field-parser'; @@ -12,6 +13,7 @@ import { ParserOptions } from './parser-options'; import { ParserType } from './parser-type'; import { setLayout } from './parser.utils'; import { DYNAMIC_FORM_CONTROL_TYPE_RELATION_GROUP } from '../ds-dynamic-form-ui/ds-dynamic-form-constants'; +import { VisibilityType } from '../../../../submission/sections/visibility-type'; export const ROW_ID_PREFIX = 'df-row-group-config-'; @@ -118,15 +120,30 @@ export class RowParser { return parsedResult; } - checksFieldScope(fieldScope, submissionScope) { - return (isEmpty(fieldScope) || isEmpty(submissionScope) || fieldScope === submissionScope); + checksFieldScope(fieldScope, submissionScope, visibility: SectionVisibility) { + return (isEmpty(fieldScope) || !this.isHidden(visibility, fieldScope, submissionScope)); + } + + /** + * Check if the field is hidden or not, based on the visibility and the submission scope + * @param visibility The visibility of the field + * @param scope the scope of the field + * @param submissionScope the scope of the submission + * @returns If the field is hidden or not + */ + private isHidden(visibility: SectionVisibility, scope: string, submissionScope: string): boolean { + return isEmpty(visibility) + || (isNotEmpty(visibility) && visibility.main !== VisibilityType.READONLY) + && isNotEmpty(submissionScope) + && (isNotEmpty(scope) + && scope !== submissionScope); } filterScopedFields(fields: FormFieldModel[], submissionScope): FormFieldModel[] { const filteredFields: FormFieldModel[] = []; fields.forEach((field: FormFieldModel) => { // Whether field scope doesn't match the submission scope, skip it - if (this.checksFieldScope(field.scope, submissionScope)) { + if (this.checksFieldScope(field.scope, submissionScope, field.visibility)) { filteredFields.push(field); } }); From 50acff1b598e912fa9b46748b99cad0ec5471e63 Mon Sep 17 00:00:00 2001 From: "Mark H. Wood" Date: Wed, 7 Jun 2023 12:22:37 -0400 Subject: [PATCH 338/409] Empty the template of local content. --- .../email-request-copy.component.html | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/src/themes/custom/app/request-copy/email-request-copy/email-request-copy.component.html b/src/themes/custom/app/request-copy/email-request-copy/email-request-copy.component.html index 072f4d4a52..e69de29bb2 100644 --- a/src/themes/custom/app/request-copy/email-request-copy/email-request-copy.component.html +++ b/src/themes/custom/app/request-copy/email-request-copy/email-request-copy.component.html @@ -1,14 +0,0 @@ - - - - - TODO supply a title - - - - -
    TODO write content
    - - From b44acd68eea20ce3876edecf6962e342dfe63b3e Mon Sep 17 00:00:00 2001 From: Enea Jahollari Date: Thu, 8 Jun 2023 09:52:25 +0200 Subject: [PATCH 339/409] CST-9639: Fix maxStartDate issue --- .../access-control-array-form.component.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/shared/access-control-form-container/access-control-array-form/access-control-array-form.component.html b/src/app/shared/access-control-form-container/access-control-array-form/access-control-array-form.component.html index efe2259328..117cc8d388 100644 --- a/src/app/shared/access-control-form-container/access-control-array-form/access-control-array-form.component.html +++ b/src/app/shared/access-control-form-container/access-control-array-form/access-control-array-form.component.html @@ -39,7 +39,7 @@ placeholder="yyyy-mm-dd" [(ngModel)]="control.startDate" name="startDate-{{control.id}}" - [minDate]="control.maxStartDate | toDate" + [maxDate]="control.maxStartDate | toDate" ngbDatepicker #d="ngbDatepicker" /> From 16ff75c92e60e1073f1a9d846e97d23044a73a07 Mon Sep 17 00:00:00 2001 From: Enea Jahollari Date: Thu, 8 Jun 2023 10:23:33 +0200 Subject: [PATCH 340/409] CST-9639: Fix calendar placement --- .../access-control-array-form.component.html | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/app/shared/access-control-form-container/access-control-array-form/access-control-array-form.component.html b/src/app/shared/access-control-form-container/access-control-array-form/access-control-array-form.component.html index 117cc8d388..cd56904bd7 100644 --- a/src/app/shared/access-control-form-container/access-control-array-form/access-control-array-form.component.html +++ b/src/app/shared/access-control-form-container/access-control-array-form/access-control-array-form.component.html @@ -41,6 +41,7 @@ name="startDate-{{control.id}}" [maxDate]="control.maxStartDate | toDate" ngbDatepicker + placement="top-start top-end bottom-start bottom-end" #d="ngbDatepicker" />
    @@ -69,6 +70,7 @@ name="endDate-{{control.id}}" [maxDate]="control.maxEndDate | toDate" ngbDatepicker + placement="top-start top-end bottom-start bottom-end" #d1="ngbDatepicker" />
    From 02bb7db1190c54be1f2a00608c624fdf67804f23 Mon Sep 17 00:00:00 2001 From: Giuseppe Digilio Date: Thu, 8 Jun 2023 13:15:02 +0200 Subject: [PATCH 341/409] [CST-5729] Fix issue with undefined link type --- .../bitstream-download-page.component.ts | 1 + .../item-page/simple/item-page.component.spec.ts | 13 +++++++++---- src/app/item-page/simple/item-page.component.ts | 15 ++++++++++----- 3 files changed, 20 insertions(+), 9 deletions(-) diff --git a/src/app/bitstream-page/bitstream-download-page/bitstream-download-page.component.ts b/src/app/bitstream-page/bitstream-download-page/bitstream-download-page.component.ts index 4d05511ca0..cf8d8e7767 100644 --- a/src/app/bitstream-page/bitstream-download-page/bitstream-download-page.component.ts +++ b/src/app/bitstream-page/bitstream-download-page/bitstream-download-page.component.ts @@ -107,6 +107,7 @@ export class BitstreamDownloadPageComponent implements OnInit { let links = ''; signpostingLinks.forEach((link: SignpostingLink) => { + links = links + (isNotEmpty(links) ? ', ' : '') + `<${link.href}> ; rel="${link.rel}"` + (isNotEmpty(link.type) ? ` ; type="${link.type}" ` : ' '); links = links + (isNotEmpty(links) ? ', ' : '') + `<${link.href}> ; rel="${link.rel}" ; type="${link.type}" `; }); diff --git a/src/app/item-page/simple/item-page.component.spec.ts b/src/app/item-page/simple/item-page.component.spec.ts index dfba4bd235..b3202108f4 100644 --- a/src/app/item-page/simple/item-page.component.spec.ts +++ b/src/app/item-page/simple/item-page.component.spec.ts @@ -49,7 +49,7 @@ const mocklink = { const mocklink2 = { href: 'http://test2.org', rel: 'rel2', - type: 'type2' + type: undefined }; const mockSignpostingLinks: SignpostingLink[] = [mocklink, mocklink2]; @@ -176,13 +176,18 @@ describe('ItemPageComponent', () => { // Check if linkHeadService.addTag() was called with the correct arguments expect(linkHeadService.addTag).toHaveBeenCalledTimes(mockSignpostingLinks.length); - expect(linkHeadService.addTag).toHaveBeenCalledWith(mockSignpostingLinks[0] as LinkDefinition); - expect(linkHeadService.addTag).toHaveBeenCalledWith(mockSignpostingLinks[1] as LinkDefinition); + let expected: LinkDefinition = mockSignpostingLinks[0] as LinkDefinition; + expect(linkHeadService.addTag).toHaveBeenCalledWith(expected); + expected = { + href: 'http://test2.org', + rel: 'rel2' + }; + expect(linkHeadService.addTag).toHaveBeenCalledWith(expected); }); it('should set Link header on the server', () => { - expect(serverResponseService.setHeader).toHaveBeenCalledWith('Link', ' ; rel="rel1" ; type="type1" , ; rel="rel2" ; type="type2" '); + expect(serverResponseService.setHeader).toHaveBeenCalledWith('Link', ' ; rel="rel1" ; type="type1" , ; rel="rel2" '); }); }); diff --git a/src/app/item-page/simple/item-page.component.ts b/src/app/item-page/simple/item-page.component.ts index a11cb22883..b9be6bebfb 100644 --- a/src/app/item-page/simple/item-page.component.ts +++ b/src/app/item-page/simple/item-page.component.ts @@ -20,7 +20,7 @@ import { ServerResponseService } from '../../core/services/server-response.servi import { SignpostingDataService } from '../../core/data/signposting-data.service'; import { SignpostingLink } from '../../core/data/signposting-links.model'; import { isNotEmpty } from '../../shared/empty.util'; -import { LinkHeadService } from '../../core/services/link-head.service'; +import { LinkDefinition, LinkHeadService } from '../../core/services/link-head.service'; /** * This component renders a simple item page. @@ -111,12 +111,17 @@ export class ItemPageComponent implements OnInit, OnDestroy { this.signpostingLinks = signpostingLinks; signpostingLinks.forEach((link: SignpostingLink) => { - links = links + (isNotEmpty(links) ? ', ' : '') + `<${link.href}> ; rel="${link.rel}" ; type="${link.type}" `; - this.linkHeadService.addTag({ + links = links + (isNotEmpty(links) ? ', ' : '') + `<${link.href}> ; rel="${link.rel}"` + (isNotEmpty(link.type) ? ` ; type="${link.type}" ` : ' '); + let tag: LinkDefinition = { href: link.href, - type: link.type, rel: link.rel - }); + }; + if (isNotEmpty(link.type)) { + tag = Object.assign(tag, { + type: link.type + }); + } + this.linkHeadService.addTag(tag); }); if (isPlatformServer(this.platformId)) { From 56cba82c2df9e2fd2cd9816db7c5fe7a2dfe419a Mon Sep 17 00:00:00 2001 From: lotte Date: Thu, 8 Jun 2023 14:16:04 +0200 Subject: [PATCH 342/409] 101289: intermediate commit for test issues --- .../edit-bitstream-page.component.spec.ts | 140 ++++++++++-------- .../edit-bitstream-page.component.ts | 31 ++-- 2 files changed, 91 insertions(+), 80 deletions(-) diff --git a/src/app/bitstream-page/edit-bitstream-page/edit-bitstream-page.component.spec.ts b/src/app/bitstream-page/edit-bitstream-page/edit-bitstream-page.component.spec.ts index 04ab4e47b0..3be3297880 100644 --- a/src/app/bitstream-page/edit-bitstream-page/edit-bitstream-page.component.spec.ts +++ b/src/app/bitstream-page/edit-bitstream-page/edit-bitstream-page.component.spec.ts @@ -24,8 +24,7 @@ import { createPaginatedList } from '../../shared/testing/utils.test'; import { Item } from '../../core/shared/item.model'; import { MetadataValueFilter } from '../../core/shared/metadata.models'; import { DSONameService } from '../../core/breadcrumbs/dso-name.service'; -import { Bundle } from '../../core/shared/bundle.model'; -import { BundleDataService } from '../../core/data/bundle-data.service'; +import { PrimaryBitstreamService } from '../../core/data/primary-bitstream-data.service'; const infoNotification: INotification = new Notification('id', NotificationType.Info, 'info'); const warningNotification: INotification = new Notification('id', NotificationType.Warning, 'warning'); @@ -34,6 +33,7 @@ const successNotification: INotification = new Notification('id', NotificationTy let notificationsService: NotificationsService; let formService: DynamicFormService; let bitstreamService: BitstreamDataService; +let primaryBitstreamService: PrimaryBitstreamService; let bitstreamFormatService: BitstreamFormatDataService; let dsoNameService: DSONameService; let bitstream: Bitstream; @@ -41,23 +41,19 @@ let bitstreamID: string; let selectedFormat: BitstreamFormat; let allFormats: BitstreamFormat[]; let router: Router; -let bundleDataService; -let bundleWithCurrentPrimary: Bundle; -let bundleWithDifferentPrimary: Bundle; -let bundleWithNoPrimary: Bundle; - +let currentPrimary: string; +let differentPrimary: string; +let bundle; let comp: EditBitstreamPageComponent; let fixture: ComponentFixture; -describe('EditBitstreamPageComponent', () => { +fdescribe('EditBitstreamPageComponent', () => { beforeEach(() => { bitstreamID = 'current-bitstream-id'; - bundleWithCurrentPrimary = Object.assign(new Bundle(), { 'primaryBitstreamUUID': bitstreamID }); - bundleWithDifferentPrimary = Object.assign(new Bundle(), { 'primaryBitstreamUUID': '12345-abcde-54321-edcba' }); - bundleWithNoPrimary = Object.assign(new Bundle(), { 'primaryBitstreamUUID': null }); - bundleDataService = jasmine.createSpyObj('BundleDataService', ['patch']); - bundleDataService.patch.and.callFake((a, b) => createSuccessfulRemoteDataObject$(a)); + currentPrimary = bitstreamID; + differentPrimary = '12345-abcde-54321-edcba'; + allFormats = [ Object.assign({ id: '1', @@ -116,12 +112,47 @@ describe('EditBitstreamPageComponent', () => { success: successNotification } ); + + bundle = { + _links: { + primaryBitstream: { + href: 'bundle-selflink' + } + }, + item: createSuccessfulRemoteDataObject$(Object.assign(new Item(), { + uuid: 'some-uuid', + firstMetadataValue(keyOrKeys: string | string[], valueFilter?: MetadataValueFilter): string { + return undefined; + }, + })) + }; + + const result = createSuccessfulRemoteDataObject$(bundle); + primaryBitstreamService = jasmine.createSpyObj('PrimaryBitstreamService', + { + put: result, + create: result, + delete: result, + }); + }); describe('EditBitstreamPageComponent no IIIF fields', () => { beforeEach(waitForAsync(() => { - + bundle = { + _links: { + primaryBitstream: { + href: 'bundle-selflink' + } + }, + item: createSuccessfulRemoteDataObject$(Object.assign(new Item(), { + uuid: 'some-uuid', + firstMetadataValue(keyOrKeys: string | string[], valueFilter?: MetadataValueFilter): string { + return undefined; + }, + })) + }; const bundleName = 'ORIGINAL'; bitstream = Object.assign(new Bitstream(), { @@ -143,17 +174,11 @@ describe('EditBitstreamPageComponent', () => { _links: { self: 'bitstream-selflink' }, - bundle: createSuccessfulRemoteDataObject$({ - item: createSuccessfulRemoteDataObject$(Object.assign(new Item(), { - uuid: 'some-uuid', - firstMetadataValue(keyOrKeys: string | string[], valueFilter?: MetadataValueFilter): string { - return undefined; - }, - })) - }) + bundle: createSuccessfulRemoteDataObject$(bundle) }); bitstreamService = jasmine.createSpyObj('bitstreamService', { findById: createSuccessfulRemoteDataObject$(bitstream), + findByHref: createSuccessfulRemoteDataObject$(bitstream), update: createSuccessfulRemoteDataObject$(bitstream), updateFormat: createSuccessfulRemoteDataObject$(bitstream), commitUpdates: {}, @@ -182,7 +207,7 @@ describe('EditBitstreamPageComponent', () => { { provide: BitstreamDataService, useValue: bitstreamService }, { provide: DSONameService, useValue: dsoNameService }, { provide: BitstreamFormatDataService, useValue: bitstreamFormatService }, - { provide: BundleDataService, useValue: bundleDataService }, + { provide: PrimaryBitstreamService, useValue: primaryBitstreamService }, ChangeDetectorRef ], schemas: [NO_ERRORS_SCHEMA] @@ -198,7 +223,7 @@ describe('EditBitstreamPageComponent', () => { spyOn(router, 'navigate'); }); - describe('on startup', () => { + fdescribe('on startup', () => { let rawForm; beforeEach(() => { @@ -222,7 +247,7 @@ describe('EditBitstreamPageComponent', () => { }); describe('when the bitstream is the primary bitstream on the bundle', () => { beforeEach(() => { - (comp as any).bundle = bundleWithCurrentPrimary; + (comp as any).primaryBitstreamUUID = currentPrimary; comp.setForm(); rawForm = comp.formGroup.getRawValue(); @@ -233,7 +258,7 @@ describe('EditBitstreamPageComponent', () => { }); describe('when the bitstream is not the primary bitstream on the bundle', () => { beforeEach(() => { - (comp as any).bundle = bundleWithDifferentPrimary; + (comp as any).primaryBitstreamUUID = differentPrimary; comp.setForm(); rawForm = comp.formGroup.getRawValue(); }); @@ -263,38 +288,23 @@ describe('EditBitstreamPageComponent', () => { describe('from a different primary bitstream', () => { beforeEach(() => { - (comp as any).bundle = bundleWithDifferentPrimary; + (comp as any).primaryBitstreamUUID = differentPrimary; comp.onSubmit(); }); - it('should call patch with a replace operation', () => { - expect(bundleDataService.patch).toHaveBeenCalledWith(bundleWithDifferentPrimary, [jasmine.objectContaining({ - op: 'replace' - })]); - }); - - it('should call patch with the correct bitstream uuid', () => { - expect(bundleDataService.patch).toHaveBeenCalledWith(bundleWithDifferentPrimary, [jasmine.objectContaining({ - value: bitstreamID - })]); + it('should call put with the correct bitstream on the PrimaryBitstreamService', () => { + expect(primaryBitstreamService.put).toHaveBeenCalledWith(jasmine.objectContaining({uuid: currentPrimary}), bundle); }); }); + describe('from no primary bitstream', () => { beforeEach(() => { - (comp as any).bundle = bundleWithNoPrimary; + (comp as any).primaryBitstreamUUID = null; comp.onSubmit(); }); - it('should call patch with an add operation', () => { - expect(bundleDataService.patch).toHaveBeenCalledWith(bundleWithNoPrimary, [jasmine.objectContaining({ - op: 'add' - })]); - }); - - it('should call patch with the correct bitstream uuid', () => { - expect(bundleDataService.patch).toHaveBeenCalledWith(bundleWithNoPrimary, [jasmine.objectContaining({ - value: bitstreamID - })]); + it('should call create with the correct bitstream on the PrimaryBitstreamService', () => { + expect(primaryBitstreamService.create).toHaveBeenCalledWith(jasmine.objectContaining({uuid: currentPrimary}), bundle); }); }); }); @@ -306,39 +316,42 @@ describe('EditBitstreamPageComponent', () => { describe('from the current bitstream', () => { beforeEach(() => { - (comp as any).bundle = bundleWithCurrentPrimary; + (comp as any).primaryBitstreamUUID = currentPrimary; comp.onSubmit(); }); - it('should call patch with a remove operation', () => { - expect(bundleDataService.patch).toHaveBeenCalledWith(bundleWithCurrentPrimary, [jasmine.objectContaining({ - op: 'remove' - })]); + it('should call delete on the PrimaryBitstreamService', () => { + expect(primaryBitstreamService.delete).toHaveBeenCalledWith(jasmine.objectContaining(bundle)); }); }); }); }); - describe('when the primaryBitstream did not changed', () => { + describe('when the primaryBitstream did not change', () => { describe('the current bitstream stayed the primary bitstream', () => { beforeEach(() => { const rawValue = Object.assign(comp.formGroup.getRawValue(), { fileNamePrimaryContainer: { primaryBitstream: true } }); spyOn(comp.formGroup, 'getRawValue').and.returnValue(rawValue); - (comp as any).bundle = bundleWithCurrentPrimary; + (comp as any).primaryBitstreamUUID = currentPrimary; comp.onSubmit(); }); - it('should not call patch on the bundle data service', () => { - expect(bundleDataService.patch).not.toHaveBeenCalled(); + it('should not call anything on the PrimaryBitstreamService', () => { + expect(primaryBitstreamService.put).not.toHaveBeenCalled(); + expect(primaryBitstreamService.delete).not.toHaveBeenCalled(); + expect(primaryBitstreamService.create).not.toHaveBeenCalled(); }); }); + describe('the bitstream was not and did not become the primary bitstream', () => { beforeEach(() => { const rawValue = Object.assign(comp.formGroup.getRawValue(), { fileNamePrimaryContainer: { primaryBitstream: false } }); spyOn(comp.formGroup, 'getRawValue').and.returnValue(rawValue); - (comp as any).bundle = bundleWithDifferentPrimary; + (comp as any).primaryBitstreamUUID = differentPrimary; comp.onSubmit(); }); - it('should not call patch on the bundle data service', () => { - expect(bundleDataService.patch).not.toHaveBeenCalled(); + it('should not call anything on the PrimaryBitstreamService', () => { + expect(primaryBitstreamService.put).not.toHaveBeenCalled(); + expect(primaryBitstreamService.delete).not.toHaveBeenCalled(); + expect(primaryBitstreamService.create).not.toHaveBeenCalled(); }); }); }); @@ -451,6 +464,7 @@ describe('EditBitstreamPageComponent', () => { }); bitstreamService = jasmine.createSpyObj('bitstreamService', { findById: createSuccessfulRemoteDataObject$(bitstream), + findByHref: createSuccessfulRemoteDataObject$(bitstream), update: createSuccessfulRemoteDataObject$(bitstream), updateFormat: createSuccessfulRemoteDataObject$(bitstream), commitUpdates: {}, @@ -477,7 +491,7 @@ describe('EditBitstreamPageComponent', () => { {provide: BitstreamDataService, useValue: bitstreamService}, {provide: DSONameService, useValue: dsoNameService}, {provide: BitstreamFormatDataService, useValue: bitstreamFormatService}, - { provide: BundleDataService, useValue: bundleDataService }, + { provide: PrimaryBitstreamService, useValue: primaryBitstreamService }, ChangeDetectorRef ], schemas: [NO_ERRORS_SCHEMA] @@ -595,7 +609,7 @@ describe('EditBitstreamPageComponent', () => { {provide: BitstreamDataService, useValue: bitstreamService}, {provide: DSONameService, useValue: dsoNameService}, {provide: BitstreamFormatDataService, useValue: bitstreamFormatService}, - { provide: BundleDataService, useValue: bundleDataService }, + { provide: PrimaryBitstreamService, useValue: primaryBitstreamService }, ChangeDetectorRef ], schemas: [NO_ERRORS_SCHEMA] @@ -617,7 +631,7 @@ describe('EditBitstreamPageComponent', () => { rawForm = comp.formGroup.getRawValue(); }); - it('should NOT set isIIIF to true', () => { + it('should NOT set is IIIF to true', () => { expect(comp.isIIIF).toBeFalse(); }); it('should put the \"IIIF Label\" input not to be shown', () => { diff --git a/src/app/bitstream-page/edit-bitstream-page/edit-bitstream-page.component.ts b/src/app/bitstream-page/edit-bitstream-page/edit-bitstream-page.component.ts index 8b3dad3c1c..25c7f41868 100644 --- a/src/app/bitstream-page/edit-bitstream-page/edit-bitstream-page.component.ts +++ b/src/app/bitstream-page/edit-bitstream-page/edit-bitstream-page.component.ts @@ -1,7 +1,7 @@ import { ChangeDetectionStrategy, ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core'; import { Bitstream } from '../../core/shared/bitstream.model'; import { ActivatedRoute, Router } from '@angular/router'; -import { map, switchMap, tap, filter } from 'rxjs/operators'; +import { filter, map, switchMap, tap } from 'rxjs/operators'; import { combineLatest, combineLatest as observableCombineLatest, Observable, of as observableOf, Subscription } from 'rxjs'; import { DynamicFormControlModel, DynamicFormGroupModel, DynamicFormLayout, DynamicFormService, DynamicInputModel, DynamicSelectModel } from '@ng-dynamic-forms/core'; import { UntypedFormGroup } from '@angular/forms'; @@ -14,7 +14,7 @@ import { NotificationsService } from '../../shared/notifications/notifications.s import { BitstreamFormatDataService } from '../../core/data/bitstream-format-data.service'; import { BitstreamFormat } from '../../core/shared/bitstream-format.model'; import { BitstreamFormatSupportLevel } from '../../core/shared/bitstream-format-support-level'; -import { hasValue, isEmpty, isNotEmpty, hasValueOperator } from '../../shared/empty.util'; +import { hasValue, hasValueOperator, isEmpty, isNotEmpty } from '../../shared/empty.util'; import { Metadata } from '../../core/shared/metadata.utils'; import { Location } from '@angular/common'; import { RemoteData } from '../../core/data/remote-data'; @@ -25,10 +25,7 @@ import { DSONameService } from '../../core/breadcrumbs/dso-name.service'; import { Item } from '../../core/shared/item.model'; import { DsDynamicInputModel } from '../../shared/form/builder/ds-dynamic-form-ui/models/ds-dynamic-input.model'; import { DsDynamicTextAreaModel } from '../../shared/form/builder/ds-dynamic-form-ui/models/ds-dynamic-textarea.model'; -import { BundleDataService } from '../../core/data/bundle-data.service'; -import { Operation } from 'fast-json-patch'; import { PrimaryBitstreamService } from '../../core/data/primary-bitstream-data.service'; -import { hasSucceeded } from '../../core/data/request-entry-state.model'; @Component({ selector: 'ds-edit-bitstream-page', @@ -374,12 +371,6 @@ export class EditBitstreamPageComponent implements OnInit, OnDestroy { */ private bundle: Bundle; - /** - * Path to patch primary bitstream on the bundle - * @private - */ - private readonly primaryBitstreamPath = '/primaryBitstreamUUID'; - constructor(private route: ActivatedRoute, private router: Router, private changeDetectorRef: ChangeDetectorRef, @@ -391,7 +382,7 @@ export class EditBitstreamPageComponent implements OnInit, OnDestroy { private notificationsService: NotificationsService, private bitstreamFormatService: BitstreamFormatDataService, private primaryBitstreamService: PrimaryBitstreamService, - private bundleService: BundleDataService) { + ) { } /** @@ -404,33 +395,39 @@ export class EditBitstreamPageComponent implements OnInit, OnDestroy { this.itemId = this.route.snapshot.queryParams.itemId; this.entityType = this.route.snapshot.queryParams.entityType; - this.bitstreamRD$ = this.route.data.pipe(map((data) => data.bitstream)); + this.bitstreamRD$ = this.route.data.pipe(map((data: any) => data.bitstream)); this.bitstreamFormatsRD$ = this.bitstreamFormatService.findAll(this.findAllOptions); const bitstream$ = this.bitstreamRD$.pipe( getFirstSucceededRemoteData(), - getRemoteDataPayload() + getRemoteDataPayload(), + tap(t => console.log(t)), ); const allFormats$ = this.bitstreamFormatsRD$.pipe( getFirstSucceededRemoteData(), - getRemoteDataPayload() + getRemoteDataPayload(), + tap(t => console.log(t)), ); const bundle$ = bitstream$.pipe( switchMap((bitstream: Bitstream) => bitstream.bundle), getFirstSucceededRemoteDataPayload(), + tap(t => console.log(t)), ); const primaryBitstream$ = bundle$.pipe( hasValueOperator(), + tap(t => console.log(t._links.primaryBitstream.href)), switchMap((bundle: Bundle) => this.bitstreamService.findByHref(bundle._links.primaryBitstream.href)), - getFirstSucceededRemoteDataPayload() + getFirstSucceededRemoteDataPayload(), + tap(t => console.log(t)), ); const item$ = bundle$.pipe( switchMap((bundle: Bundle) => bundle.item), - getFirstSucceededRemoteDataPayload() + getFirstSucceededRemoteDataPayload(), + tap(t => console.log(t)), ); this.subs.push( observableCombineLatest( From 84f4f017fbb5068292dc68eb6f2efa4c5bdc33f3 Mon Sep 17 00:00:00 2001 From: Enea Jahollari Date: Thu, 8 Jun 2023 14:52:29 +0200 Subject: [PATCH 343/409] CST-9639: Fix error when modal closes --- .../access-control-form-container.component.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/shared/access-control-form-container/access-control-form-container.component.ts b/src/app/shared/access-control-form-container/access-control-form-container.component.ts index b13943e07a..69a598f7ce 100644 --- a/src/app/shared/access-control-form-container/access-control-form-container.component.ts +++ b/src/app/shared/access-control-form-container/access-control-form-container.component.ts @@ -147,7 +147,7 @@ export class AccessControlFormContainerComponent impleme concatMap(() => this.selectableListService.getSelectableList(ITEM_ACCESS_CONTROL_SELECT_BITSTREAMS_LIST_ID)), take(1) ).subscribe((list) => { - this.state.bitstream.selectedBitstreams = list.selection; + this.state.bitstream.selectedBitstreams = list?.selection || []; this.cdr.detectChanges(); }); } From d4491083954ab4419a93e8a04318c58ac4f2c09f Mon Sep 17 00:00:00 2001 From: Giuseppe Digilio Date: Thu, 8 Jun 2023 15:23:02 +0200 Subject: [PATCH 344/409] [CST-9636] revert changes to object-list.component --- .../browse/bulk-access-browse.component.html | 34 +++++++---- .../object-list/object-list.component.html | 58 ++++++------------- .../object-list/object-list.component.ts | 5 -- .../themed-object-list.component.ts | 6 -- 4 files changed, 41 insertions(+), 62 deletions(-) diff --git a/src/app/access-control/bulk-access/browse/bulk-access-browse.component.html b/src/app/access-control/bulk-access/browse/bulk-access-browse.component.html index 6ef45cdd5b..c716aedb8b 100644 --- a/src/app/access-control/bulk-access/browse/bulk-access-browse.component.html +++ b/src/app/access-control/bulk-access/browse/bulk-access-browse.component.html @@ -34,16 +34,30 @@ {{'admin.access-control.bulk-access-browse.selected.header' | translate: {number: ((objectsSelected$ | async)?.payload?.totalElements) ? (objectsSelected$ | async)?.payload?.totalElements : '0'} }} - + +
      +
    • + + +
    • +
    +
    diff --git a/src/app/shared/object-list/object-list.component.html b/src/app/shared/object-list/object-list.component.html index 541a4794b0..b8712b85c5 100644 --- a/src/app/shared/object-list/object-list.component.html +++ b/src/app/shared/object-list/object-list.component.html @@ -16,46 +16,22 @@ (prev)="goPrev()" (next)="goNext()">
      - -
    • - - - -
    • -
      - -
    • - - - -
    • -
      +
    • + + + +
    diff --git a/src/app/shared/object-list/object-list.component.ts b/src/app/shared/object-list/object-list.component.ts index 72bff54f59..5161b75459 100644 --- a/src/app/shared/object-list/object-list.component.ts +++ b/src/app/shared/object-list/object-list.component.ts @@ -76,11 +76,6 @@ export class ObjectListComponent { */ @Input() importConfig: { buttonLabel: string }; - /** - * If true the object list provided needs to be paginated using the `paginate` pipe - */ - @Input() listToPaginate = false; - /** * Whether or not the pagination should be rendered as simple previous and next buttons instead of the normal pagination */ diff --git a/src/app/shared/object-list/themed-object-list.component.ts b/src/app/shared/object-list/themed-object-list.component.ts index 04a95de1cb..14ddf474ad 100644 --- a/src/app/shared/object-list/themed-object-list.component.ts +++ b/src/app/shared/object-list/themed-object-list.component.ts @@ -44,11 +44,6 @@ export class ThemedObjectListComponent extends ThemedComponent Date: Thu, 8 Jun 2023 15:44:30 +0200 Subject: [PATCH 345/409] fix issue where iiif tests would fail --- .../edit-bitstream-page.component.spec.ts | 19 +++++++++++++++---- .../edit-bitstream-page.component.ts | 6 ------ 2 files changed, 15 insertions(+), 10 deletions(-) diff --git a/src/app/bitstream-page/edit-bitstream-page/edit-bitstream-page.component.spec.ts b/src/app/bitstream-page/edit-bitstream-page/edit-bitstream-page.component.spec.ts index 3be3297880..2e8c6368c1 100644 --- a/src/app/bitstream-page/edit-bitstream-page/edit-bitstream-page.component.spec.ts +++ b/src/app/bitstream-page/edit-bitstream-page/edit-bitstream-page.component.spec.ts @@ -47,7 +47,7 @@ let bundle; let comp: EditBitstreamPageComponent; let fixture: ComponentFixture; -fdescribe('EditBitstreamPageComponent', () => { +describe('EditBitstreamPageComponent', () => { beforeEach(() => { bitstreamID = 'current-bitstream-id'; @@ -223,7 +223,7 @@ fdescribe('EditBitstreamPageComponent', () => { spyOn(router, 'navigate'); }); - fdescribe('on startup', () => { + describe('on startup', () => { let rawForm; beforeEach(() => { @@ -454,13 +454,18 @@ fdescribe('EditBitstreamPageComponent', () => { self: 'bitstream-selflink' }, bundle: createSuccessfulRemoteDataObject$({ + _links: { + primaryBitstream: { + href: 'bundle-selflink' + } + }, item: createSuccessfulRemoteDataObject$(Object.assign(new Item(), { uuid: 'some-uuid', firstMetadataValue(keyOrKeys: string | string[], valueFilter?: MetadataValueFilter): string { return 'True'; } })) - }) + }), }); bitstreamService = jasmine.createSpyObj('bitstreamService', { findById: createSuccessfulRemoteDataObject$(bitstream), @@ -574,16 +579,22 @@ fdescribe('EditBitstreamPageComponent', () => { self: 'bitstream-selflink' }, bundle: createSuccessfulRemoteDataObject$({ + _links: { + primaryBitstream: { + href: 'bundle-selflink' + } + }, item: createSuccessfulRemoteDataObject$(Object.assign(new Item(), { uuid: 'some-uuid', firstMetadataValue(keyOrKeys: string | string[], valueFilter?: MetadataValueFilter): string { return 'True'; } })) - }) + }), }); bitstreamService = jasmine.createSpyObj('bitstreamService', { findById: createSuccessfulRemoteDataObject$(bitstream), + findByHref: createSuccessfulRemoteDataObject$(bitstream), update: createSuccessfulRemoteDataObject$(bitstream), updateFormat: createSuccessfulRemoteDataObject$(bitstream), commitUpdates: {}, diff --git a/src/app/bitstream-page/edit-bitstream-page/edit-bitstream-page.component.ts b/src/app/bitstream-page/edit-bitstream-page/edit-bitstream-page.component.ts index 25c7f41868..0d5e1eecc1 100644 --- a/src/app/bitstream-page/edit-bitstream-page/edit-bitstream-page.component.ts +++ b/src/app/bitstream-page/edit-bitstream-page/edit-bitstream-page.component.ts @@ -401,33 +401,27 @@ export class EditBitstreamPageComponent implements OnInit, OnDestroy { const bitstream$ = this.bitstreamRD$.pipe( getFirstSucceededRemoteData(), getRemoteDataPayload(), - tap(t => console.log(t)), ); const allFormats$ = this.bitstreamFormatsRD$.pipe( getFirstSucceededRemoteData(), getRemoteDataPayload(), - tap(t => console.log(t)), ); const bundle$ = bitstream$.pipe( switchMap((bitstream: Bitstream) => bitstream.bundle), getFirstSucceededRemoteDataPayload(), - tap(t => console.log(t)), ); const primaryBitstream$ = bundle$.pipe( hasValueOperator(), - tap(t => console.log(t._links.primaryBitstream.href)), switchMap((bundle: Bundle) => this.bitstreamService.findByHref(bundle._links.primaryBitstream.href)), getFirstSucceededRemoteDataPayload(), - tap(t => console.log(t)), ); const item$ = bundle$.pipe( switchMap((bundle: Bundle) => bundle.item), getFirstSucceededRemoteDataPayload(), - tap(t => console.log(t)), ); this.subs.push( observableCombineLatest( From a936878c9673dc79d98404939595cf5c6b2f3ded Mon Sep 17 00:00:00 2001 From: lotte Date: Thu, 8 Jun 2023 16:02:33 +0200 Subject: [PATCH 346/409] 101289: tests --- .../edit-bitstream-page.component.spec.ts | 2 +- .../edit-bitstream-page.component.ts | 2 +- .../data/primary-bitstream.service.spec.ts | 158 ++++++++++++++++++ ...ervice.ts => primary-bitstream.service.ts} | 6 +- 4 files changed, 163 insertions(+), 5 deletions(-) create mode 100644 src/app/core/data/primary-bitstream.service.spec.ts rename src/app/core/data/{primary-bitstream-data.service.ts => primary-bitstream.service.ts} (97%) diff --git a/src/app/bitstream-page/edit-bitstream-page/edit-bitstream-page.component.spec.ts b/src/app/bitstream-page/edit-bitstream-page/edit-bitstream-page.component.spec.ts index 2e8c6368c1..b83f2b9664 100644 --- a/src/app/bitstream-page/edit-bitstream-page/edit-bitstream-page.component.spec.ts +++ b/src/app/bitstream-page/edit-bitstream-page/edit-bitstream-page.component.spec.ts @@ -24,7 +24,7 @@ import { createPaginatedList } from '../../shared/testing/utils.test'; import { Item } from '../../core/shared/item.model'; import { MetadataValueFilter } from '../../core/shared/metadata.models'; import { DSONameService } from '../../core/breadcrumbs/dso-name.service'; -import { PrimaryBitstreamService } from '../../core/data/primary-bitstream-data.service'; +import { PrimaryBitstreamService } from '../../core/data/primary-bitstream.service'; const infoNotification: INotification = new Notification('id', NotificationType.Info, 'info'); const warningNotification: INotification = new Notification('id', NotificationType.Warning, 'warning'); diff --git a/src/app/bitstream-page/edit-bitstream-page/edit-bitstream-page.component.ts b/src/app/bitstream-page/edit-bitstream-page/edit-bitstream-page.component.ts index 0d5e1eecc1..cdc905d456 100644 --- a/src/app/bitstream-page/edit-bitstream-page/edit-bitstream-page.component.ts +++ b/src/app/bitstream-page/edit-bitstream-page/edit-bitstream-page.component.ts @@ -25,7 +25,7 @@ import { DSONameService } from '../../core/breadcrumbs/dso-name.service'; import { Item } from '../../core/shared/item.model'; import { DsDynamicInputModel } from '../../shared/form/builder/ds-dynamic-form-ui/models/ds-dynamic-input.model'; import { DsDynamicTextAreaModel } from '../../shared/form/builder/ds-dynamic-form-ui/models/ds-dynamic-textarea.model'; -import { PrimaryBitstreamService } from '../../core/data/primary-bitstream-data.service'; +import { PrimaryBitstreamService } from '../../core/data/primary-bitstream.service'; @Component({ selector: 'ds-edit-bitstream-page', diff --git a/src/app/core/data/primary-bitstream.service.spec.ts b/src/app/core/data/primary-bitstream.service.spec.ts new file mode 100644 index 0000000000..93e9882d04 --- /dev/null +++ b/src/app/core/data/primary-bitstream.service.spec.ts @@ -0,0 +1,158 @@ +import { ObjectCacheService } from '../cache/object-cache.service'; +import { RequestService } from './request.service'; +import { Bitstream } from '../shared/bitstream.model'; +import { HALEndpointService } from '../shared/hal-endpoint.service'; +import { getMockRequestService } from '../../shared/mocks/request.service.mock'; +import { HALEndpointServiceStub } from '../../shared/testing/hal-endpoint-service.stub'; +import { RemoteDataBuildService } from '../cache/builders/remote-data-build.service'; +import { getMockRemoteDataBuildService } from '../../shared/mocks/remote-data-build.service.mock'; +import { PrimaryBitstreamService } from './primary-bitstream.service'; +import { BundleDataService } from './bundle-data.service'; +import { NotificationsService } from '../../shared/notifications/notifications.service'; +import { NotificationsServiceStub } from '../../shared/testing/notifications-service.stub'; +import { CreateRequest, DeleteRequest, PostRequest, PutRequest } from './request.models'; +import { createFailedRemoteDataObject, createSuccessfulRemoteDataObject, createSuccessfulRemoteDataObject$ } from '../../shared/remote-data.utils'; +import { Bundle } from '../shared/bundle.model'; +import { getTestScheduler } from 'jasmine-marbles'; +import { of as observableOf } from 'rxjs'; + +fdescribe('PrimaryBitstreamService', () => { + let service: PrimaryBitstreamService; + let objectCache: ObjectCacheService; + let requestService: RequestService; + let halService: HALEndpointService; + let rdbService: RemoteDataBuildService; + let notificationService: NotificationsService; + let bundleDataService: BundleDataService; + + const bitstream = Object.assign(new Bitstream(), { + uuid: 'fake-bitstream', + _links: { + self: { href: 'fake-bitstream-self' } + } + }); + + const bundle = Object.assign(new Bundle(), { + uuid: 'fake-bundle', + _links: { + self: { href: 'fake-bundle-self' }, + primaryBitstream: { href: 'fake-primary-bitstream-self' }, + } + }); + + const url = 'fake-bitstream-url'; + + beforeEach(() => { + objectCache = jasmine.createSpyObj('objectCache', { + remove: jasmine.createSpy('remove') + }); + requestService = getMockRequestService(); + halService = Object.assign(new HALEndpointServiceStub(url)); + + rdbService = getMockRemoteDataBuildService(); + notificationService = new NotificationsServiceStub() as any; + bundleDataService = jasmine.createSpyObj('bundleDataService', {'findByHref': createSuccessfulRemoteDataObject$(bundle)}); + service = new PrimaryBitstreamService(requestService, rdbService, objectCache, halService, notificationService, bundleDataService); + }); + + describe('getHttpOptions', () => { + it('should return a HttpOptions object with text/url-list Context-Type header', () => { + const result = (service as any).getHttpOptions() + expect(result.headers.get('Content-Type')).toEqual('text/uri-list'); + }); + }); + + describe('createAndSendRequest', () => { + const testId = '12345-12345'; + const options = {}; + const testResult = createSuccessfulRemoteDataObject(new Bundle()); + + beforeEach(() => { + spyOn(service as any, 'getHttpOptions').and.returnValue(options); + (requestService.generateRequestId as jasmine.Spy).and.returnValue(testId); + spyOn(rdbService, 'buildFromRequestUUID').and.returnValue(observableOf(testResult)); + }); + + it('should return a Request object with the given constructor and the given parameters', () => { + const result = (service as any).createAndSendRequest(CreateRequest, url, bitstream.self); + const request = new CreateRequest(testId, url, bitstream.self, options); + getTestScheduler().expectObservable(result).toBe('(a|)', { a: testResult }); + + expect(requestService.send).toHaveBeenCalledWith(request); + expect(rdbService.buildFromRequestUUID).toHaveBeenCalledWith(testId); + }); + }); + + describe('create', () => { + const testResult = createSuccessfulRemoteDataObject(new Bundle()); + beforeEach(() => { + spyOn((service as any), 'createAndSendRequest').and.returnValue(observableOf(testResult)); + }); + + it('should delegate the call to createAndSendRequest', () => { + const result = service.create(bitstream, bundle); + getTestScheduler().expectObservable(result).toBe('(a|)', { a: testResult }); + + expect((service as any).createAndSendRequest).toHaveBeenCalledWith( + PostRequest, + bundle._links.primaryBitstream.href, + bitstream.self + ); + }); + }); + describe('put', () => { + const testResult = createSuccessfulRemoteDataObject(new Bundle()); + beforeEach(() => { + spyOn((service as any), 'createAndSendRequest').and.returnValue(observableOf(testResult)); + }); + + it('should delegate the call to createAndSendRequest and return the requested bundle', () => { + const result = service.put(bitstream, bundle); + getTestScheduler().expectObservable(result).toBe('(a|)', { a: testResult }); + + expect((service as any).createAndSendRequest).toHaveBeenCalledWith( + PutRequest, + bundle._links.primaryBitstream.href, + bitstream.self + ); + }); + }); + describe('delete', () => { + describe('when the delete request succeeds', () => { + const testResult = createSuccessfulRemoteDataObject(new Bundle()); + const bundleServiceResult = createSuccessfulRemoteDataObject(bundle); + + beforeEach(() => { + spyOn((service as any), 'createAndSendRequest').and.returnValue(observableOf(testResult)); + (bundleDataService.findByHref as jasmine.Spy).and.returnValue(observableOf(bundleServiceResult)); + }); + + it('should delegate the call to createAndSendRequest', () => { + const result = service.delete(bundle); + getTestScheduler().expectObservable(result).toBe('(a|)', { a: testResult }); + + expect((service as any).createAndSendRequest).toHaveBeenCalledWith( + DeleteRequest, + bundle._links.primaryBitstream.href, + ); + }); + }); + describe('when the delete request fails', () => { + const testResult = createFailedRemoteDataObject(); + + beforeEach(() => { + spyOn((service as any), 'createAndSendRequest').and.returnValue(observableOf(testResult)); + }); + + it('should delegate the call to createAndSendRequest and retrieve the bundle from the rdbService', () => { + const result = service.delete(bundle); + getTestScheduler().expectObservable(result).toBe('(a|)', { a: bundle }); + + expect((service as any).createAndSendRequest).toHaveBeenCalledWith( + DeleteRequest, + bundle._links.primaryBitstream.href, + ); + }); + }); + }); +}); diff --git a/src/app/core/data/primary-bitstream-data.service.ts b/src/app/core/data/primary-bitstream.service.ts similarity index 97% rename from src/app/core/data/primary-bitstream-data.service.ts rename to src/app/core/data/primary-bitstream.service.ts index 6380a6f148..5c1c3c52ac 100644 --- a/src/app/core/data/primary-bitstream-data.service.ts +++ b/src/app/core/data/primary-bitstream.service.ts @@ -97,7 +97,7 @@ export class PrimaryBitstreamService { } /** - * Update an exiting primaryBitstream + * Update an existing primaryBitstream * * @param primaryBitstream The object to update * @param bundle The bundle to update it on @@ -111,7 +111,7 @@ export class PrimaryBitstreamService { } /** - * Delete an exiting primaryBitstream + * Delete an existing primaryBitstream * * @param bundle The bundle to delete it from */ @@ -125,7 +125,7 @@ export class PrimaryBitstreamService { if (rd.hasSucceeded) { return this.bundleDataService.findByHref(bundle.self, false); } else { - [bundle]; + return this.rdbService.buildSingle(bundle.self); } }) ); From 9d2fed4186186e22fab2b72a07e200c8c6a004de Mon Sep 17 00:00:00 2001 From: lotte Date: Thu, 8 Jun 2023 16:42:25 +0200 Subject: [PATCH 347/409] 101289: Fixed test issues --- .../edit-bitstream-page.component.ts | 2 +- .../data/primary-bitstream.service.spec.ts | 45 ++++++++++++++----- .../core/data/primary-bitstream.service.ts | 6 +-- src/app/core/shared/bundle.model.ts | 2 +- 4 files changed, 37 insertions(+), 18 deletions(-) diff --git a/src/app/bitstream-page/edit-bitstream-page/edit-bitstream-page.component.ts b/src/app/bitstream-page/edit-bitstream-page/edit-bitstream-page.component.ts index cdc905d456..b77d2151a9 100644 --- a/src/app/bitstream-page/edit-bitstream-page/edit-bitstream-page.component.ts +++ b/src/app/bitstream-page/edit-bitstream-page/edit-bitstream-page.component.ts @@ -612,7 +612,7 @@ export class EditBitstreamPageComponent implements OnInit, OnDestroy { bundle$ = completedBundleRd$.pipe( map((bundleRd: RemoteData) => { if (bundleRd.hasSucceeded) { - return bundleRd.payload + return bundleRd.payload; } else { return this.bundle; } diff --git a/src/app/core/data/primary-bitstream.service.spec.ts b/src/app/core/data/primary-bitstream.service.spec.ts index 93e9882d04..00d6d7f03c 100644 --- a/src/app/core/data/primary-bitstream.service.spec.ts +++ b/src/app/core/data/primary-bitstream.service.spec.ts @@ -16,7 +16,7 @@ import { Bundle } from '../shared/bundle.model'; import { getTestScheduler } from 'jasmine-marbles'; import { of as observableOf } from 'rxjs'; -fdescribe('PrimaryBitstreamService', () => { +describe('PrimaryBitstreamService', () => { let service: PrimaryBitstreamService; let objectCache: ObjectCacheService; let requestService: RequestService; @@ -57,7 +57,7 @@ fdescribe('PrimaryBitstreamService', () => { describe('getHttpOptions', () => { it('should return a HttpOptions object with text/url-list Context-Type header', () => { - const result = (service as any).getHttpOptions() + const result = (service as any).getHttpOptions(); expect(result.headers.get('Content-Type')).toEqual('text/uri-list'); }); }); @@ -118,9 +118,20 @@ fdescribe('PrimaryBitstreamService', () => { }); }); describe('delete', () => { + const testBundle = Object.assign(new Bundle(), { + _links: { + self: { + href: 'test-href' + }, + primaryBitstream: { + href: 'test-primaryBitstream-href' + } + } + }); + describe('when the delete request succeeds', () => { const testResult = createSuccessfulRemoteDataObject(new Bundle()); - const bundleServiceResult = createSuccessfulRemoteDataObject(bundle); + const bundleServiceResult = createSuccessfulRemoteDataObject(testBundle); beforeEach(() => { spyOn((service as any), 'createAndSendRequest').and.returnValue(observableOf(testResult)); @@ -128,30 +139,42 @@ fdescribe('PrimaryBitstreamService', () => { }); it('should delegate the call to createAndSendRequest', () => { - const result = service.delete(bundle); - getTestScheduler().expectObservable(result).toBe('(a|)', { a: testResult }); + const result = service.delete(testBundle); + getTestScheduler().expectObservable(result).toBe('(a|)', { a: bundleServiceResult }); + + result.subscribe(); + + expect(bundleDataService.findByHref).toHaveBeenCalledWith(testBundle.self, false); expect((service as any).createAndSendRequest).toHaveBeenCalledWith( DeleteRequest, - bundle._links.primaryBitstream.href, + testBundle._links.primaryBitstream.href, ); }); }); describe('when the delete request fails', () => { const testResult = createFailedRemoteDataObject(); + const bundleServiceResult = createSuccessfulRemoteDataObject(testBundle); beforeEach(() => { spyOn((service as any), 'createAndSendRequest').and.returnValue(observableOf(testResult)); + (bundleDataService.findByHref as jasmine.Spy).and.returnValue(observableOf(bundleServiceResult)); }); - it('should delegate the call to createAndSendRequest and retrieve the bundle from the rdbService', () => { - const result = service.delete(bundle); - getTestScheduler().expectObservable(result).toBe('(a|)', { a: bundle }); - + it('should delegate the call to createAndSendRequest and request the bundle from the bundleDataService', () => { + const result = service.delete(testBundle); + result.subscribe(); expect((service as any).createAndSendRequest).toHaveBeenCalledWith( DeleteRequest, - bundle._links.primaryBitstream.href, + testBundle._links.primaryBitstream.href, ); + expect(bundleDataService.findByHref).toHaveBeenCalledWith(testBundle.self, true); + + }); + + it('should delegate the call to createAndSendRequest and', () => { + const result = service.delete(bundle); + getTestScheduler().expectObservable(result).toBe('(a|)', { a: bundleServiceResult }); }); }); }); diff --git a/src/app/core/data/primary-bitstream.service.ts b/src/app/core/data/primary-bitstream.service.ts index 5c1c3c52ac..646e8271e8 100644 --- a/src/app/core/data/primary-bitstream.service.ts +++ b/src/app/core/data/primary-bitstream.service.ts @@ -122,11 +122,7 @@ export class PrimaryBitstreamService { ).pipe( getAllCompletedRemoteData(), switchMap((rd: RemoteData) => { - if (rd.hasSucceeded) { - return this.bundleDataService.findByHref(bundle.self, false); - } else { - return this.rdbService.buildSingle(bundle.self); - } + return this.bundleDataService.findByHref(bundle.self, rd.hasFailed); }) ); } diff --git a/src/app/core/shared/bundle.model.ts b/src/app/core/shared/bundle.model.ts index f37cd96545..36b7012e47 100644 --- a/src/app/core/shared/bundle.model.ts +++ b/src/app/core/shared/bundle.model.ts @@ -1,4 +1,4 @@ -import { autoserialize, deserialize, inheritSerialization } from 'cerialize'; +import { deserialize, inheritSerialization } from 'cerialize'; import { Observable } from 'rxjs'; From daf297b94b61556ddb697b440a35f1a941b127e1 Mon Sep 17 00:00:00 2001 From: lotte Date: Fri, 9 Jun 2023 11:17:00 +0200 Subject: [PATCH 348/409] 101289: Removed unnecessary data services from primary bitstream service --- src/app/core/data/primary-bitstream.service.ts | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/src/app/core/data/primary-bitstream.service.ts b/src/app/core/data/primary-bitstream.service.ts index 646e8271e8..488cb5d22e 100644 --- a/src/app/core/data/primary-bitstream.service.ts +++ b/src/app/core/data/primary-bitstream.service.ts @@ -1,7 +1,4 @@ import { Bitstream } from '../shared/bitstream.model'; -import { DeleteDataImpl } from './base/delete-data'; -import { PutDataImpl } from './base/put-data'; -import { CreateDataImpl } from './base/create-data'; import { Injectable } from '@angular/core'; import { RequestService } from './request.service'; import { RemoteDataBuildService } from '../cache/builders/remote-data-build.service'; @@ -11,7 +8,6 @@ import { Observable, switchMap } from 'rxjs'; import { RemoteData } from './remote-data'; import { Bundle } from '../shared/bundle.model'; import { NotificationsService } from '../../shared/notifications/notifications.service'; -import { constructIdEndpointDefault } from './base/identifiable-data.service'; import { HttpOptions } from '../dspace-rest/dspace-rest.service'; import { HttpHeaders } from '@angular/common/http'; import { GenericConstructor } from '../shared/generic-constructor'; @@ -24,9 +20,6 @@ import { BundleDataService } from './bundle-data.service'; providedIn: 'root', }) export class PrimaryBitstreamService { - private createData: CreateDataImpl; - private putData: PutDataImpl; - private deleteData: DeleteDataImpl; constructor( protected requestService: RequestService, @@ -36,10 +29,6 @@ export class PrimaryBitstreamService { protected notificationsService: NotificationsService, protected bundleDataService: BundleDataService, ) { - // linkPath can be undefined because we'll only use them to do things "byHref" - this.createData = new CreateDataImpl(undefined, requestService, rdbService, objectCache, halService, notificationsService, undefined); - this.putData = new PutDataImpl(undefined, requestService, rdbService, objectCache, halService, undefined); - this.deleteData = new DeleteDataImpl(undefined, requestService, rdbService, objectCache, halService, notificationsService, undefined, constructIdEndpointDefault); } /** From c4b25653733323812b4531952d0fd98acb906208 Mon Sep 17 00:00:00 2001 From: Yury Bondarenko Date: Fri, 9 Jun 2023 13:39:28 +0200 Subject: [PATCH 349/409] Workaround: don't use form-global data for check Note: we're balancing multiple bugs against eachother here, not ideal! - the diff doesn't catch removed Relationship fields; instead, form reload is triggered by a dspace.entity.type change - if we add the original `this.sectionMetadata.includes(key)` check, we filter out this change and the form fails to update - if we add `relation.*` fields to `this.sectionMetadata`, newly added Relationship entries are duplicated As of this commit, the form _seems_ to work in a stable way, but these issues shoud really investigated in more detail. --- src/app/submission/sections/form/section-form.component.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/app/submission/sections/form/section-form.component.ts b/src/app/submission/sections/form/section-form.component.ts index 9612db523c..3fa9000039 100644 --- a/src/app/submission/sections/form/section-form.component.ts +++ b/src/app/submission/sections/form/section-form.component.ts @@ -229,8 +229,10 @@ export class SubmissionSectionFormComponent extends SectionModelComponent { const sectionDataToCheck = {}; Object.keys(sectionData).forEach((key) => { - if (this.sectionData.data && hasValue(this.sectionData.data[key]) && this.inCurrentSubmissionScope(key)) { - sectionDataToCheck[key] = this.sectionData.data[key]; + // todo: removing Relationships works due to a bug -- dspace.entity.type is included in sectionData, which is what triggers the update; + // if we use this.sectionMetadata.includes(key), this field is filtered out and removed Relationships won't disappear from the form. + if (this.inCurrentSubmissionScope(key)) { + sectionDataToCheck[key] = sectionData[key]; } }); From 8cc96060ff6b9e8ee59f39f3b2ba8144403f161c Mon Sep 17 00:00:00 2001 From: damian Date: Fri, 9 Jun 2023 16:44:29 +0200 Subject: [PATCH 350/409] Variable name change. --- .../community-list/community-list.component.html | 2 +- src/app/core/shared/collection.model.ts | 4 ++-- src/app/core/shared/community.model.ts | 2 +- .../collection-list-element.component.html | 2 +- .../collection-list-element.component.spec.ts | 8 ++++---- 5 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/app/community-list-page/community-list/community-list.component.html b/src/app/community-list-page/community-list/community-list.component.html index 5f940b4405..7f8dcf0c45 100644 --- a/src/app/community-list-page/community-list/community-list.component.html +++ b/src/app/community-list-page/community-list/community-list.component.html @@ -37,7 +37,7 @@ {{node.name}} - [{{node.payload.archivedItems}}] + [{{node.payload.archivedItemsCount}}]
    diff --git a/src/app/core/shared/collection.model.ts b/src/app/core/shared/collection.model.ts index 81efc33510..c97c61eceb 100644 --- a/src/app/core/shared/collection.model.ts +++ b/src/app/core/shared/collection.model.ts @@ -16,7 +16,7 @@ import { COMMUNITY } from './community.resource-type'; import { Community } from './community.model'; import { ChildHALResource } from './child-hal-resource.model'; import { HandleObject } from './handle-object.model'; -import {excludeFromEquals} from '../utilities/equals.decorators'; +import { excludeFromEquals } from '../utilities/equals.decorators'; @typedObject @inheritSerialization(DSpaceObject) @@ -25,7 +25,7 @@ export class Collection extends DSpaceObject implements ChildHALResource, Handle @excludeFromEquals @autoserialize - archivedItems: number; + archivedItemsCount: number; /** * The {@link HALLink}s for this Collection diff --git a/src/app/core/shared/community.model.ts b/src/app/core/shared/community.model.ts index 0bab8cfa22..03b47fb024 100644 --- a/src/app/core/shared/community.model.ts +++ b/src/app/core/shared/community.model.ts @@ -21,7 +21,7 @@ export class Community extends DSpaceObject implements ChildHALResource, HandleO @excludeFromEquals @autoserialize - archivedItems: number; + archivedItemsCount: number; /** * The {@link HALLink}s for this Community diff --git a/src/app/shared/object-list/collection-list-element/collection-list-element.component.html b/src/app/shared/object-list/collection-list-element/collection-list-element.component.html index 1fdb97f17b..68a84a88e5 100644 --- a/src/app/shared/object-list/collection-list-element/collection-list-element.component.html +++ b/src/app/shared/object-list/collection-list-element/collection-list-element.component.html @@ -4,7 +4,7 @@ {{object.name}} -[{{object.archivedItems}}] +[{{object.archivedItemsCount}}]
    {{object.shortDescription}}
    diff --git a/src/app/shared/object-list/collection-list-element/collection-list-element.component.spec.ts b/src/app/shared/object-list/collection-list-element/collection-list-element.component.spec.ts index c1d9665bc3..b911bdd2eb 100644 --- a/src/app/shared/object-list/collection-list-element/collection-list-element.component.spec.ts +++ b/src/app/shared/object-list/collection-list-element/collection-list-element.component.spec.ts @@ -15,7 +15,7 @@ const mockCollectionWithArchivedItems: Collection = Object.assign(new Collection value: 'Test title' } ] - }, archivedItems: 1 + }, archivedItemsCount: 1 }); const mockCollectionWithoutArchivedItems: Collection = Object.assign(new Collection(), { @@ -26,7 +26,7 @@ const mockCollectionWithoutArchivedItems: Collection = Object.assign(new Collect value: 'Test title' } ] - }, archivedItems: 0 + }, archivedItemsCount: 0 }); @@ -38,7 +38,7 @@ const mockCollectionWithAbstract: Collection = Object.assign(new Collection(), { value: 'Short description' } ] - }, archivedItems: 1 + }, archivedItemsCount: 1 }); const mockCollectionWithoutAbstract: Collection = Object.assign(new Collection(), { @@ -49,7 +49,7 @@ const mockCollectionWithoutAbstract: Collection = Object.assign(new Collection() value: 'Test title' } ] - }, archivedItems: 1 + }, archivedItemsCount: 1 }); describe('CollectionListElementComponent', () => { From 96903d89dedfc6191fc71b5b1b81253783459d74 Mon Sep 17 00:00:00 2001 From: Giuseppe Digilio Date: Fri, 9 Jun 2023 19:24:16 +0200 Subject: [PATCH 351/409] [CST-5729] fix signposting proxy url --- server.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/server.ts b/server.ts index 282b1ce29a..d64b80b4ab 100644 --- a/server.ts +++ b/server.ts @@ -182,8 +182,8 @@ export function app() { /** * Proxy the linksets */ - router.use('/links**', createProxyMiddleware({ - target: `${environment.rest.baseUrl}/signposting`, + router.use('/signposting**', createProxyMiddleware({ + target: `${environment.rest.baseUrl}`, pathRewrite: path => path.replace(environment.ui.nameSpace, '/'), changeOrigin: true })); From b8d282ebe4ba14765e2cb5d38817934e12f1bb98 Mon Sep 17 00:00:00 2001 From: Alexandre Vryghem Date: Sun, 11 Jun 2023 16:17:14 +0200 Subject: [PATCH 352/409] Fix proxy timeout error for browse by pages --- src/app/browse-by/browse-by-guard.spec.ts | 35 +++++++++++++++-- src/app/browse-by/browse-by-guard.ts | 48 ++++++++++++++--------- 2 files changed, 62 insertions(+), 21 deletions(-) diff --git a/src/app/browse-by/browse-by-guard.spec.ts b/src/app/browse-by/browse-by-guard.spec.ts index fc483d87e2..7f57c17ac1 100644 --- a/src/app/browse-by/browse-by-guard.spec.ts +++ b/src/app/browse-by/browse-by-guard.spec.ts @@ -1,10 +1,10 @@ import { first } from 'rxjs/operators'; import { BrowseByGuard } from './browse-by-guard'; import { of as observableOf } from 'rxjs'; -import { BrowseDefinitionDataService } from '../core/browse/browse-definition-data.service'; -import { createSuccessfulRemoteDataObject$ } from '../shared/remote-data.utils'; +import { createFailedRemoteDataObject$, createSuccessfulRemoteDataObject$ } from '../shared/remote-data.utils'; import { BrowseDefinition } from '../core/shared/browse-definition.model'; import { BrowseByDataType } from './browse-by-switcher/browse-by-decorator'; +import { RouterStub } from '../shared/testing/router.stub'; describe('BrowseByGuard', () => { describe('canActivate', () => { @@ -12,6 +12,7 @@ describe('BrowseByGuard', () => { let dsoService: any; let translateService: any; let browseDefinitionService: any; + let router: any; const name = 'An interesting DSO'; const title = 'Author'; @@ -34,7 +35,9 @@ describe('BrowseByGuard', () => { findById: () => createSuccessfulRemoteDataObject$(browseDefinition) }; - guard = new BrowseByGuard(dsoService, translateService, browseDefinitionService); + router = new RouterStub() as any; + + guard = new BrowseByGuard(dsoService, translateService, browseDefinitionService, router); }); it('should return true, and sets up the data correctly, with a scope and value', () => { @@ -64,6 +67,7 @@ describe('BrowseByGuard', () => { value: '"' + value + '"' }; expect(scopedRoute.data).toEqual(result); + expect(router.navigate).not.toHaveBeenCalled(); expect(canActivate).toEqual(true); } ); @@ -96,6 +100,7 @@ describe('BrowseByGuard', () => { value: '' }; expect(scopedNoValueRoute.data).toEqual(result); + expect(router.navigate).not.toHaveBeenCalled(); expect(canActivate).toEqual(true); } ); @@ -127,9 +132,33 @@ describe('BrowseByGuard', () => { value: '"' + value + '"' }; expect(route.data).toEqual(result); + expect(router.navigate).not.toHaveBeenCalled(); expect(canActivate).toEqual(true); } ); }); + + it('should return false, and sets up the data correctly, without a scope and with a value', () => { + jasmine.getEnv().allowRespy(true); + spyOn(browseDefinitionService, 'findById').and.returnValue(createFailedRemoteDataObject$()); + const scopedRoute = { + data: { + title: field, + }, + params: { + id, + }, + queryParams: { + scope, + value + } + }; + guard.canActivate(scopedRoute as any, undefined) + .pipe(first()) + .subscribe((canActivate) => { + expect(router.navigate).toHaveBeenCalled(); + expect(canActivate).toEqual(false); + }); + }); }); }); diff --git a/src/app/browse-by/browse-by-guard.ts b/src/app/browse-by/browse-by-guard.ts index e4582cb77a..ed6a627558 100644 --- a/src/app/browse-by/browse-by-guard.ts +++ b/src/app/browse-by/browse-by-guard.ts @@ -1,13 +1,15 @@ -import { ActivatedRouteSnapshot, CanActivate, RouterStateSnapshot } from '@angular/router'; +import { ActivatedRouteSnapshot, CanActivate, Router, RouterStateSnapshot } from '@angular/router'; import { Injectable } from '@angular/core'; import { DSpaceObjectDataService } from '../core/data/dspace-object-data.service'; import { hasNoValue, hasValue } from '../shared/empty.util'; import { map, switchMap } from 'rxjs/operators'; -import { getFirstSucceededRemoteData, getFirstSucceededRemoteDataPayload } from '../core/shared/operators'; +import { getFirstCompletedRemoteData, getFirstSucceededRemoteData, } from '../core/shared/operators'; import { TranslateService } from '@ngx-translate/core'; import { Observable, of as observableOf } from 'rxjs'; import { BrowseDefinitionDataService } from '../core/browse/browse-definition-data.service'; import { BrowseDefinition } from '../core/shared/browse-definition.model'; +import { RemoteData } from '../core/data/remote-data'; +import { PAGE_NOT_FOUND_PATH } from '../app-routing-paths'; @Injectable() /** @@ -17,15 +19,20 @@ export class BrowseByGuard implements CanActivate { constructor(protected dsoService: DSpaceObjectDataService, protected translate: TranslateService, - protected browseDefinitionService: BrowseDefinitionDataService) { + protected browseDefinitionService: BrowseDefinitionDataService, + protected router: Router, + ) { } - canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) { + canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable { const title = route.data.title; const id = route.params.id || route.queryParams.id || route.data.id; - let browseDefinition$: Observable; + let browseDefinition$: Observable; if (hasNoValue(route.data.browseDefinition) && hasValue(id)) { - browseDefinition$ = this.browseDefinitionService.findById(id).pipe(getFirstSucceededRemoteDataPayload()); + browseDefinition$ = this.browseDefinitionService.findById(id).pipe( + getFirstCompletedRemoteData(), + map((browseDefinitionRD: RemoteData) => browseDefinitionRD.payload), + ); } else { browseDefinition$ = observableOf(route.data.browseDefinition); } @@ -33,19 +40,24 @@ export class BrowseByGuard implements CanActivate { const value = route.queryParams.value; const metadataTranslated = this.translate.instant('browse.metadata.' + id); return browseDefinition$.pipe( - switchMap((browseDefinition) => { - if (hasValue(scope)) { - const dsoAndMetadata$ = this.dsoService.findById(scope).pipe(getFirstSucceededRemoteData()); - return dsoAndMetadata$.pipe( - map((dsoRD) => { - const name = dsoRD.payload.name; - route.data = this.createData(title, id, browseDefinition, name, metadataTranslated, value, route); - return true; - }) - ); + switchMap((browseDefinition: BrowseDefinition | undefined) => { + if (hasValue(browseDefinition)) { + if (hasValue(scope)) { + const dsoAndMetadata$ = this.dsoService.findById(scope).pipe(getFirstSucceededRemoteData()); + return dsoAndMetadata$.pipe( + map((dsoRD) => { + const name = dsoRD.payload.name; + route.data = this.createData(title, id, browseDefinition, name, metadataTranslated, value, route); + return true; + }) + ); + } else { + route.data = this.createData(title, id, browseDefinition, '', metadataTranslated, value, route); + return observableOf(true); + } } else { - route.data = this.createData(title, id, browseDefinition, '', metadataTranslated, value, route); - return observableOf(true); + void this.router.navigate([PAGE_NOT_FOUND_PATH]); + return observableOf(false); } }) ); From 58a3ec397293b57b030f15ffc4d89bbc7ef3f89d Mon Sep 17 00:00:00 2001 From: enea4science <127771679+enea4science@users.noreply.github.com> Date: Mon, 12 Jun 2023 09:50:26 +0200 Subject: [PATCH 353/409] Update orcid-sync-settings.component.ts --- .../orcid-sync-settings/orcid-sync-settings.component.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/app/item-page/orcid-page/orcid-sync-settings/orcid-sync-settings.component.ts b/src/app/item-page/orcid-page/orcid-sync-settings/orcid-sync-settings.component.ts index 1aec416d62..0bcbc295ac 100644 --- a/src/app/item-page/orcid-page/orcid-sync-settings/orcid-sync-settings.component.ts +++ b/src/app/item-page/orcid-page/orcid-sync-settings/orcid-sync-settings.component.ts @@ -156,8 +156,7 @@ export class OrcidSyncSettingsComponent implements OnInit { } }), ).subscribe((remoteData: RemoteData) => { - // hasSucceeded is true if the response is success or successStale - if (remoteData.hasSucceeded) { + if (remoteData.isSuccess) { this.notificationsService.success(this.translateService.get(this.messagePrefix + '.synchronization-settings-update.success')); this.settingsUpdated.emit(); } else { From e85f9f2b255ccbd6169b6394d93efe692917dd95 Mon Sep 17 00:00:00 2001 From: Giuseppe Digilio Date: Mon, 12 Jun 2023 14:40:21 +0200 Subject: [PATCH 354/409] [CST-5729] fix issue with signposting endpoint url replace --- src/app/core/data/signposting-data.service.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/app/core/data/signposting-data.service.ts b/src/app/core/data/signposting-data.service.ts index d051ecf8db..34d3ffdab9 100644 --- a/src/app/core/data/signposting-data.service.ts +++ b/src/app/core/data/signposting-data.service.ts @@ -25,7 +25,8 @@ export class SignpostingDataService { * @param uuid */ getLinks(uuid: string): Observable { - const baseUrl = this.halService.getRootHref().replace('/api', ''); + const regex = /\/api$/gm; + const baseUrl = this.halService.getRootHref().replace(regex, ''); return this.restService.get(`${baseUrl}/signposting/links/${uuid}`).pipe( catchError((err) => { From 5d6edade22ff116c980465bc322ef4bf56772475 Mon Sep 17 00:00:00 2001 From: Giuseppe Digilio Date: Mon, 12 Jun 2023 15:22:33 +0200 Subject: [PATCH 355/409] [CST-5729] turn to use app config baseurl --- .../data/signposting-data.service.spec.ts | 26 +++++++++---------- src/app/core/data/signposting-data.service.ts | 9 +++---- 2 files changed, 17 insertions(+), 18 deletions(-) diff --git a/src/app/core/data/signposting-data.service.spec.ts b/src/app/core/data/signposting-data.service.spec.ts index c76899221e..f34ce6538f 100644 --- a/src/app/core/data/signposting-data.service.spec.ts +++ b/src/app/core/data/signposting-data.service.spec.ts @@ -1,14 +1,16 @@ import { fakeAsync, TestBed, tick } from '@angular/core/testing'; + +import { of } from 'rxjs'; + import { SignpostingDataService } from './signposting-data.service'; import { DspaceRestService } from '../dspace-rest/dspace-rest.service'; -import { HALEndpointService } from '../shared/hal-endpoint.service'; -import { of } from 'rxjs'; import { SignpostingLink } from './signposting-links.model'; +import { APP_CONFIG } from '../../../config/app-config.interface'; describe('SignpostingDataService', () => { let service: SignpostingDataService; let restServiceSpy: jasmine.SpyObj; - let halServiceSpy: jasmine.SpyObj; + const mocklink = { href: 'http://test.org', rel: 'test', @@ -30,21 +32,25 @@ describe('SignpostingDataService', () => { statusCode: 500 }; + const environmentRest = { + rest: { + baseUrl: 'http://localhost:8080' + } + }; + beforeEach(() => { const restSpy = jasmine.createSpyObj('DspaceRestService', ['get', 'getWithHeaders']); - const halSpy = jasmine.createSpyObj('HALEndpointService', ['getRootHref']); TestBed.configureTestingModule({ providers: [ SignpostingDataService, - { provide: DspaceRestService, useValue: restSpy }, - { provide: HALEndpointService, useValue: halSpy } + { provide: APP_CONFIG, useValue: environmentRest }, + { provide: DspaceRestService, useValue: restSpy } ] }); service = TestBed.inject(SignpostingDataService); restServiceSpy = TestBed.inject(DspaceRestService) as jasmine.SpyObj; - halServiceSpy = TestBed.inject(HALEndpointService) as jasmine.SpyObj; }); it('should be created', () => { @@ -55,8 +61,6 @@ describe('SignpostingDataService', () => { const uuid = '123'; const baseUrl = 'http://localhost:8080'; - halServiceSpy.getRootHref.and.returnValue(`${baseUrl}/api`); - restServiceSpy.get.and.returnValue(of(mockResponse)); let result: SignpostingLink[]; @@ -70,7 +74,6 @@ describe('SignpostingDataService', () => { tick(); expect(result).toEqual(expectedResult); - expect(halServiceSpy.getRootHref).toHaveBeenCalled(); expect(restServiceSpy.get).toHaveBeenCalledWith(`${baseUrl}/signposting/links/${uuid}`); })); @@ -78,8 +81,6 @@ describe('SignpostingDataService', () => { const uuid = '123'; const baseUrl = 'http://localhost:8080'; - halServiceSpy.getRootHref.and.returnValue(`${baseUrl}/api`); - restServiceSpy.get.and.returnValue(of(mockErrResponse)); let result: any; @@ -91,7 +92,6 @@ describe('SignpostingDataService', () => { tick(); expect(result).toEqual([]); - expect(halServiceSpy.getRootHref).toHaveBeenCalled(); expect(restServiceSpy.get).toHaveBeenCalledWith(`${baseUrl}/signposting/links/${uuid}`); })); }); diff --git a/src/app/core/data/signposting-data.service.ts b/src/app/core/data/signposting-data.service.ts index 34d3ffdab9..638b04dfdd 100644 --- a/src/app/core/data/signposting-data.service.ts +++ b/src/app/core/data/signposting-data.service.ts @@ -1,12 +1,12 @@ -import { Injectable } from '@angular/core'; +import { Inject, Injectable } from '@angular/core'; import { catchError, map } from 'rxjs/operators'; import { Observable, of as observableOf } from 'rxjs'; import { DspaceRestService } from '../dspace-rest/dspace-rest.service'; -import { HALEndpointService } from '../shared/hal-endpoint.service'; import { RawRestResponse } from '../dspace-rest/raw-rest-response.model'; import { SignpostingLink } from './signposting-links.model'; +import { APP_CONFIG, AppConfig } from '../../../config/app-config.interface'; /** * Service responsible for handling requests related to the Signposting endpoint @@ -16,7 +16,7 @@ import { SignpostingLink } from './signposting-links.model'; }) export class SignpostingDataService { - constructor(private restService: DspaceRestService, protected halService: HALEndpointService) { + constructor(@Inject(APP_CONFIG) protected appConfig: AppConfig, private restService: DspaceRestService) { } /** @@ -25,8 +25,7 @@ export class SignpostingDataService { * @param uuid */ getLinks(uuid: string): Observable { - const regex = /\/api$/gm; - const baseUrl = this.halService.getRootHref().replace(regex, ''); + const baseUrl = `${this.appConfig.rest.baseUrl}`; return this.restService.get(`${baseUrl}/signposting/links/${uuid}`).pipe( catchError((err) => { From de0d7bf33ae0fb59c971f88da037f7e8d948af04 Mon Sep 17 00:00:00 2001 From: Tim Donohue Date: Thu, 4 May 2023 15:01:23 -0500 Subject: [PATCH 356/409] Replace lorem ipsum with text donated by DSpaceDirect --- .../end-user-agreement-content.component.html | 132 +++++++++++++----- .../privacy-content.component.html | 128 ++++++++++++----- src/assets/i18n/en.json5 | 6 +- 3 files changed, 190 insertions(+), 76 deletions(-) diff --git a/src/app/info/end-user-agreement/end-user-agreement-content/end-user-agreement-content.component.html b/src/app/info/end-user-agreement/end-user-agreement-content/end-user-agreement-content.component.html index 1ee8712444..3ae0d0efbe 100644 --- a/src/app/info/end-user-agreement/end-user-agreement-content/end-user-agreement-content.component.html +++ b/src/app/info/end-user-agreement/end-user-agreement-content/end-user-agreement-content.component.html @@ -1,37 +1,95 @@ -

    {{ 'info.end-user-agreement.head' | translate }}

    -

    - Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Nunc sed velit dignissim sodales ut eu. In ante metus dictum at tempor. Diam phasellus vestibulum lorem sed risus. Sed cras ornare arcu dui vivamus. Sit amet consectetur adipiscing elit pellentesque. Id velit ut tortor pretium viverra suspendisse potenti. Sed euismod nisi porta lorem mollis aliquam ut. Justo laoreet sit amet cursus sit amet dictum sit. Ullamcorper morbi tincidunt ornare massa eget egestas. -

    -

    - In iaculis nunc sed augue lacus. Curabitur vitae nunc sed velit dignissim sodales ut eu sem. Tellus id interdum velit laoreet id donec ultrices tincidunt arcu. Quis vel eros donec ac odio tempor. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae. Varius quam quisque id diam vel quam. Nisl tincidunt eget nullam non nisi est sit. Nunc aliquet bibendum enim facilisis. Aenean sed adipiscing diam donec adipiscing. Convallis tellus id interdum velit laoreet. Massa placerat duis ultricies lacus sed turpis tincidunt. Sed cras ornare arcu dui vivamus arcu. Egestas integer eget aliquet nibh praesent tristique. Sit amet purus gravida quis blandit turpis cursus in hac. Porta non pulvinar neque laoreet suspendisse. Quis risus sed vulputate odio ut. Dignissim enim sit amet venenatis urna cursus. -

    -

    - Interdum velit laoreet id donec ultrices tincidunt arcu non sodales. Massa sapien faucibus et molestie. Dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Metus dictum at tempor commodo ullamcorper. Tincidunt lobortis feugiat vivamus at augue eget. Non diam phasellus vestibulum lorem sed risus ultricies. Neque aliquam vestibulum morbi blandit cursus risus at ultrices mi. Euismod lacinia at quis risus sed. Lorem mollis aliquam ut porttitor leo a diam. Ipsum dolor sit amet consectetur. Ante in nibh mauris cursus mattis molestie a iaculis at. Commodo ullamcorper a lacus vestibulum. Pellentesque elit eget gravida cum sociis. Sit amet commodo nulla facilisi nullam vehicula. Vehicula ipsum a arcu cursus vitae congue mauris rhoncus aenean. -

    -

    - Ac turpis egestas maecenas pharetra convallis. Lacus sed viverra tellus in. Nullam eget felis eget nunc lobortis mattis aliquam faucibus purus. Id aliquet risus feugiat in ante metus dictum at. Quis enim lobortis scelerisque fermentum dui faucibus. Eu volutpat odio facilisis mauris sit amet massa vitae tortor. Tellus elementum sagittis vitae et leo. Cras sed felis eget velit aliquet sagittis. Proin fermentum leo vel orci porta non pulvinar neque laoreet. Dui sapien eget mi proin sed libero enim. Ultrices mi tempus imperdiet nulla malesuada. Mattis molestie a iaculis at. Turpis massa sed elementum tempus egestas. -

    -

    - Dui faucibus in ornare quam viverra orci sagittis eu volutpat. Cras adipiscing enim eu turpis. Ac felis donec et odio pellentesque. Iaculis nunc sed augue lacus viverra vitae congue eu consequat. Posuere lorem ipsum dolor sit amet consectetur adipiscing elit duis. Elit eget gravida cum sociis natoque penatibus. Id faucibus nisl tincidunt eget nullam non. Sagittis aliquam malesuada bibendum arcu vitae. Fermentum leo vel orci porta. Aliquam ultrices sagittis orci a scelerisque purus semper. Diam maecenas sed enim ut sem viverra aliquet eget sit. Et ultrices neque ornare aenean euismod. Eu mi bibendum neque egestas congue quisque egestas diam. Eget lorem dolor sed viverra. Ut lectus arcu bibendum at. Rutrum tellus pellentesque eu tincidunt tortor. Vitae congue eu consequat ac. Elit ullamcorper dignissim cras tincidunt. Sit amet volutpat consequat mauris nunc congue nisi. -

    -

    - Cursus in hac habitasse platea dictumst quisque sagittis purus. Placerat duis ultricies lacus sed turpis tincidunt. In egestas erat imperdiet sed euismod nisi porta lorem mollis. Non nisi est sit amet facilisis magna. In massa tempor nec feugiat nisl pretium fusce. Pulvinar neque laoreet suspendisse interdum consectetur. Ullamcorper morbi tincidunt ornare massa eget egestas purus viverra accumsan. Fringilla urna porttitor rhoncus dolor purus non enim. Mauris nunc congue nisi vitae suscipit. Commodo elit at imperdiet dui accumsan sit amet nulla. Tempor id eu nisl nunc mi ipsum faucibus. Porta non pulvinar neque laoreet suspendisse. Nec nam aliquam sem et tortor consequat. -

    -

    - Eget nunc lobortis mattis aliquam faucibus purus. Odio tempor orci dapibus ultrices. Sed nisi lacus sed viverra tellus. Elit ullamcorper dignissim cras tincidunt. Porttitor rhoncus dolor purus non enim praesent elementum facilisis. Viverra orci sagittis eu volutpat odio. Pharetra massa massa ultricies mi quis. Lectus vestibulum mattis ullamcorper velit sed ullamcorper. Pulvinar neque laoreet suspendisse interdum consectetur. Vitae auctor eu augue ut. Arcu dictum varius duis at consectetur lorem donec. Massa sed elementum tempus egestas sed sed. Risus viverra adipiscing at in tellus integer. Vulputate enim nulla aliquet porttitor lacus luctus accumsan. Pharetra massa massa ultricies mi. Elementum eu facilisis sed odio morbi quis commodo odio. Tincidunt lobortis feugiat vivamus at. Felis donec et odio pellentesque diam volutpat commodo sed. Risus feugiat in ante metus dictum at tempor commodo ullamcorper. Fringilla phasellus faucibus scelerisque eleifend donec pretium vulputate. -

    -

    - Lectus proin nibh nisl condimentum id venenatis a condimentum. Id consectetur purus ut faucibus pulvinar elementum integer enim. Non pulvinar neque laoreet suspendisse interdum consectetur. Est pellentesque elit ullamcorper dignissim cras tincidunt lobortis feugiat vivamus. Suscipit tellus mauris a diam maecenas sed enim ut sem. Dolor purus non enim praesent elementum facilisis. Non enim praesent elementum facilisis leo vel. Ultricies leo integer malesuada nunc vel risus commodo viverra maecenas. Nulla porttitor massa id neque aliquam vestibulum. Erat velit scelerisque in dictum non consectetur. Amet cursus sit amet dictum. Nec tincidunt praesent semper feugiat nibh. Rutrum quisque non tellus orci ac auctor. Sagittis aliquam malesuada bibendum arcu vitae elementum. Massa tincidunt dui ut ornare lectus sit amet est. Aliquet porttitor lacus luctus accumsan tortor posuere ac. Quis hendrerit dolor magna eget est lorem ipsum dolor sit. Lectus mauris ultrices eros in. -

    -

    - Massa massa ultricies mi quis hendrerit dolor magna. Est ullamcorper eget nulla facilisi etiam dignissim diam. Vulputate sapien nec sagittis aliquam malesuada. Nisi porta lorem mollis aliquam ut porttitor leo a diam. Tempus quam pellentesque nec nam. Faucibus vitae aliquet nec ullamcorper sit amet risus nullam eget. Gravida arcu ac tortor dignissim convallis aenean et tortor. A scelerisque purus semper eget duis at tellus at. Viverra ipsum nunc aliquet bibendum enim. Semper feugiat nibh sed pulvinar proin gravida hendrerit. Et ultrices neque ornare aenean euismod. Consequat semper viverra nam libero justo laoreet. Nunc mattis enim ut tellus elementum sagittis. Consectetur lorem donec massa sapien faucibus et. Vel risus commodo viverra maecenas accumsan lacus vel facilisis. Diam sollicitudin tempor id eu nisl nunc. Dolor magna eget est lorem ipsum dolor. Adipiscing elit pellentesque habitant morbi tristique. -

    -

    - Nec sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Egestas fringilla phasellus faucibus scelerisque eleifend donec pretium vulputate sapien. Porttitor leo a diam sollicitudin tempor. Pellentesque dignissim enim sit amet venenatis urna cursus eget nunc. Posuere sollicitudin aliquam ultrices sagittis orci a scelerisque. Vehicula ipsum a arcu cursus vitae congue mauris rhoncus. Leo urna molestie at elementum. Duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Libero id faucibus nisl tincidunt eget nullam. Tellus elementum sagittis vitae et leo duis ut diam. Sodales ut etiam sit amet nisl purus in mollis. Ipsum faucibus vitae aliquet nec ullamcorper sit amet risus. Lacus laoreet non curabitur gravida arcu ac tortor dignissim convallis. Aliquam malesuada bibendum arcu vitae elementum. Leo vel orci porta non pulvinar neque laoreet. Ipsum suspendisse ultrices gravida dictum fusce. -

    -

    - Egestas erat imperdiet sed euismod nisi porta lorem. Venenatis a condimentum vitae sapien pellentesque habitant. Sit amet luctus venenatis lectus magna fringilla urna porttitor. Orci sagittis eu volutpat odio facilisis mauris sit amet massa. Ut enim blandit volutpat maecenas volutpat blandit aliquam. Libero volutpat sed cras ornare. Molestie ac feugiat sed lectus vestibulum mattis ullamcorper velit sed. Diam quis enim lobortis scelerisque fermentum dui. Pellentesque habitant morbi tristique senectus et netus. Auctor urna nunc id cursus metus aliquam eleifend. Elit scelerisque mauris pellentesque pulvinar pellentesque habitant morbi tristique. Sed risus ultricies tristique nulla aliquet enim tortor. Tincidunt arcu non sodales neque sodales ut. Sed lectus vestibulum mattis ullamcorper velit sed ullamcorper morbi tincidunt. -

    -

    - Pulvinar etiam non quam lacus suspendisse faucibus. Eu mi bibendum neque egestas congue. Egestas purus viverra accumsan in nisl nisi scelerisque eu. Vulputate enim nulla aliquet porttitor lacus luctus accumsan. Eu non diam phasellus vestibulum. Semper feugiat nibh sed pulvinar. Ante in nibh mauris cursus mattis molestie a. Maecenas accumsan lacus vel facilisis volutpat. Non quam lacus suspendisse faucibus. Quis commodo odio aenean sed adipiscing. Vel elit scelerisque mauris pellentesque pulvinar pellentesque habitant morbi. Sed cras ornare arcu dui vivamus arcu felis. Tortor vitae purus faucibus ornare suspendisse sed. Morbi tincidunt ornare massa eget egestas purus viverra. Nibh cras pulvinar mattis nunc. Luctus venenatis lectus magna fringilla urna porttitor. Enim blandit volutpat maecenas volutpat blandit aliquam etiam erat. Malesuada pellentesque elit eget gravida cum sociis natoque penatibus et. Felis eget nunc lobortis mattis aliquam faucibus purus in. Vivamus arcu felis bibendum ut. -

    +

    {{ 'info.end-user-agreement.head' | translate }}

    +

    Last updated May 4, 2023

    + +

    Agreement to terms

    +

    These Terms of Use constitute a legally binding agreement made between you, whether personally or on behalf of an entity ("you") and {{ 'repository.title' | translate }} ("Company", "we", "us", or "our"), concerning your access to and use of this website as well as any other media form, media channel, mobile website or mobile application related, linked, or otherwise connected thereto (collectively, the "Site"). You agree that by accessing the Site, you have read, understood, and agreed to be bound by all of these Terms of Use and any future amendments thereof.

    +

    Supplemental terms and conditions or documents that may be posted on the Site from time to time are hereby expressly incorporated herein by reference. We reserve the right, in our sole discretion, to make changes or modifications to these Terms of Use at any time and for any reason. We will alert you about any changes by updating the "Last updated" date of these Terms of Use, and you waive any right to receive specific notice of each such change. Please ensure that you check the applicable Terms every time you use our Site so that you understand which Terms apply. You will be subject to, and will be deemed to have been made aware of and to have accepted, the changes in any revised Terms of Use by your continued use of the Site after the date such revised Terms of Use are posted.

    +

    The information provided on the Site is not intended for distribution to or use by any person or entity in any jurisdiction or country where such distribution or use would be contrary to law or regulation or which would subject us to any registration requirement within such jurisdiction or country. Accordingly, those persons who choose to access the Site from other locations do so on their own initiative and are solely responsible for compliance with local laws, if and to the extent local laws are applicable.

    + +

    Intellectual property rights

    +

    Unless otherwise indicated, the Site is our proprietary property and all source code, databases, functionality, software, website designs, audio, video, text, photographs, and graphics on the Site (collectively, the "Content") and the trademarks, service marks, and logos contained therein (the "Marks") are owned or controlled by us or licensed to us, and are protected by copyright and trademark laws and various other intellectual property rights and unfair competition laws of {{ 'info.end-user-agreement.hosting-country' | translate }}, international copyright laws, and international conventions. The Content and the Marks are provided on the Site "AS IS" for your information and personal use only. Except as expressly provided in these Terms of Use, no part of the Site and no Content[a] or Marks may be copied, reproduced, aggregated, republished, uploaded, posted, publicly displayed, encoded, translated, transmitted, distributed, sold, licensed, or otherwise exploited for any commercial purpose whatsoever, without our express prior written permission.

    +

    Provided that you are eligible to use the Site, you are granted a limited license to access and use the Site and to download or print a copy of any portion of the Content to which you have properly gained access solely for your personal, non-commercial use. We reserve all rights not expressly granted to you in and to the Site, the Content and the Marks.

    + +

    User representations

    +

    By using the Site, you represent and warrant that: (1) all registration information you submit will be true, accurate, current, and complete; (2) you will maintain the accuracy of such information and promptly update such registration information as necessary; (3) you have the legal capacity and you agree to comply with these Terms of Use; (4) you will not use the Site for any illegal or unauthorized purpose; and (5) your use of the Site will not violate any applicable law or regulation.

    +

    If you provide any information that is untrue, inaccurate, not current, or incomplete, we have the right to suspend or terminate your account and refuse any and all current or future use of the Site (or any portion thereof).

    + +

    User registration

    +

    You may be required to register with the Site. You agree to keep your password confidential and will be responsible for all use of your account and password. We reserve the right to remove, reclaim, or change a username you select if we determine, in our sole discretion, that such username is inappropriate, obscene, or otherwise objectionable.

    + +

    Prohibited activities

    +

    You may not access or use the Site for any purpose other than that for which we make the Site available. The Site may not be used in connection with any commercial endeavors except those that are specifically endorsed or approved by us.

    +

    As a user of the Site, you agree not to:

    +
      +
    • Systematically retrieve data or other content from the Site to create or compile, directly or indirectly, a collection, compilation, database, or directory without written permission from us.
    • +
    • Trick, defraud, or mislead us and other users, especially in any attempt to learn sensitive account information such as user passwords.
    • +
    • Circumvent, disable, or otherwise interfere with security-related features of the Site, including features that prevent or restrict the use or copying of any Content or enforce limitations on the use of the Site and/or the Content contained therein.
    • +
    • Disparage, tarnish, or otherwise harm, in our opinion, us and/or the Site.
    • +
    • Use any information obtained from the Site in order to harass, abuse, or harm another person.
    • +
    • Make improper use of our support services or submit false reports of abuse or misconduct.
    • +
    • Use the Site in a manner inconsistent with any applicable laws or regulations.
    • +
    • Engage in unauthorized framing of or linking to the Site.
    • +
    • Upload or transmit (or attempt to upload or to transmit) viruses, Trojan horses, or other material, including excessive use of capital letters and spamming (continuous posting of repetitive text), that interferes with any party's uninterrupted use and enjoyment of the Site or modifies, impairs, disrupts, alters, or interferes with the use, features, functions, operation, or maintenance of the Site.
    • +
    • Delete the copyright or other proprietary rights notice from any Content.
    • +
    • Attempt to impersonate another user or person or use the username and password of another user.
    • +
    • Upload or transmit (or attempt to upload or to transmit) any material that acts as a passive or active information collection or transmission mechanism, including without limitation, clear graphics interchange formats ("gifs"), 1x1 pixels, web bugs, cookies, or other similar devices (sometimes referred to as "spyware" or "passive collection mechanisms" or "pcms").
    • +
    • Interfere with, disrupt, or create an undue burden on the Site or the networks or services connected to the Site.
    • +
    • Harass, annoy, intimidate, or threaten any of our employees or agents engaged in providing any portion of the Site to you.
    • +
    • Attempt to bypass any measures of the Site designed to prevent or restrict access to the Site, or any portion of the Site.
    • +
    • Make any unauthorized use of the Site, including collecting usernames and/or email addresses of users by electronic or other means for the purpose of sending unsolicited email or other forms of electronic communication, or creating user accounts by automated means or under false pretenses.
    • +
    • Use the Site as part of any effort to compete with us or otherwise use the Site and/or the Content for any revenue-generating endeavor or commercial enterprise.
    • +
    + +

    User generated contributions

    +

    The Site may provide you with the opportunity to create, submit, post, display, transmit, perform, publish, distribute, or broadcast content and materials to us or on the Site, including but not limited to text, writings, video, audio, photographs, graphics, comments, suggestions, or personal information or other material (collectively, "Contributions"). Contributions may be viewable by other users of the Site and through third-party websites. As such, any Contributions you transmit may be treated as non-confidential and non-proprietary. When you create or make available any Contributions, you thereby represent and warrant that:

    +
      +
    • The creation, distribution, transmission, public display, or performance, and the accessing, downloading, or copying of your Contributions do not and will not infringe the proprietary rights, including but not limited to the copyright, patent, trademark, trade secret, or moral rights of any third party.
    • +
    • You are the creator and owner of or have the necessary licenses, rights, consents, releases, and permissions to use and to authorize us, the Site, and other users of the Site to use your Contributions in any manner contemplated by the Site and these Terms of Use.
    • +
    • You have the written consent, release, and/or permission of each and every identifiable individual person in your Contributions to use the name or likeness of each and every such identifiable individual person to enable inclusion and use of your Contributions in any manner contemplated by the Site and these Terms of Use.
    • +
    • Your Contributions are not false, inaccurate, or misleading.
    • +
    • Your Contributions are not unsolicited or unauthorized advertising, promotional materials, pyramid schemes, chain letters, spam, mass mailings, or other forms of solicitation.
    • +
    • Your Contributions are not obscene, lewd, lascivious, filthy, violent, harassing, libelous, slanderous, or otherwise objectionable (as determined by us).
    • +
    • Your Contributions do not ridicule, mock, disparage, intimidate, or abuse anyone.
    • +
    • Your Contributions are not used to harass or threaten (in the legal sense of those terms) any other person, do not create and are not used to promote violence against a specific person or class of people.
    • +
    • Your Contributions do not violate any applicable law, regulation, or rule.
    • +
    • Your Contributions do not violate the privacy or publicity rights of any third party.
    • +
    • Your Contributions do not violate any applicable law concerning child pornography, or otherwise intended to protect the health or well-being of minors.
    • +
    • Your Contributions do not include any offensive comments that are connected to race, national origin, gender, sexual preference, colour, religion, creed or physical handicap.
    • +
    • Your Contributions do not otherwise violate, or link to material that violates, any provision of these Terms of Use, or any applicable law or regulation.
    • +
    +

    Any use of the Site in violation of the foregoing violates these Terms of Use and may result in, among other things, termination or suspension of your rights to use the Site.

    + +

    Site management

    +

    We reserve the right, but not the obligation, to: (1) monitor the Site for violations of these Terms of Use; (2) take appropriate legal action against anyone who, in our sole discretion, violates the law or these Terms of Use, including without limitation, reporting such user to law enforcement authorities; (3) in our sole discretion and without limitation, refuse, restrict access to, limit the availability of, or disable (to the extent technologically feasible) any of your Contributions or any portion thereof; (4) in our sole discretion and without limitation, notice, or liability, to remove from the Site or otherwise disable all files and content that are excessive in size or are in any way burdensome to our systems; and (5) otherwise manage the Site in a manner designed to protect our rights and property and to facilitate the proper functioning of the Site.

    + +

    Privacy policy

    +

    We care about data privacy and security. Please review our Privacy Policy. By using the Site, you agree to be bound by our Privacy Policy, which is incorporated into these Terms of Use.

    +

    Please be advised the Site is hosted in {{ 'info.end-user-agreement.hosting-country' | translate }}. If you access the Site from any other region of the world with laws or other requirements governing personal data collection, use, or disclosure that differ from applicable laws in {{ 'info.end-user-agreement.hosting-country' | translate }}, then through your continued use of the Site, you are transferring your data to {{ 'info.end-user-agreement.hosting-country' | translate }}, and you agree to have your data transferred to and processed in {{ 'info.end-user-agreement.hosting-country' | translate }}.

    + +

    Term and termination

    +

    These Terms of Use shall remain in full force and effect while you use the Site. WITHOUT LIMITING ANY OTHER PROVISION OF THESE TERMS OF USE, WE RESERVE THE RIGHT TO, IN OUR SOLE DISCRETION AND WITHOUT NOTICE OR LIABILITY, DENY ACCESS TO AND USE OF THE SITE (INCLUDING BLOCKING CERTAIN IP ADDRESSES), TO ANY PERSON FOR ANY REASON OR FOR NO REASON, INCLUDING WITHOUT LIMITATION FOR BREACH OF ANY REPRESENTATION, WARRANTY, OR COVENANT CONTAINED IN THESE TERMS OF USE OR OF ANY APPLICABLE LAW OR REGULATION. WE MAY TERMINATE YOUR USE OR PARTICIPATION IN THE SITE OR DELETE YOUR ACCOUNT AND ANY CONTENT OR INFORMATION THAT YOU POSTED AT ANY TIME, WITHOUT WARNING, IN OUR SOLE DISCRETION.

    +

    If we terminate or suspend your account for any reason, you are prohibited from registering and creating a new account under your name, a fake or borrowed name, or the name of any third party, even if you may be acting on behalf of the third party. In addition to terminating or suspending your account, we reserve the right to take appropriate legal action, including without limitation pursuing civil, criminal, and injunctive redress.

    + +

    Modifications and interruptions

    +

    We reserve the right to change, modify, or remove the contents of the Site at any time or for any reason at our sole discretion without notice. However, we have no obligation to update any information on our Site. We also reserve the right to modify or discontinue all or part of the Site without notice at any time. We will not be liable to you or any third party for any modification, change, suspension, or discontinuance of the Site.

    +

    We cannot guarantee the Site will be available at all times. We may experience hardware, software, or other problems or need to perform maintenance related to the Site, resulting in interruptions, delays, or errors. We reserve the right to change, revise, update, suspend, discontinue, or otherwise modify the Site at any time or for any reason without notice to you. You agree that we have no liability whatsoever for any loss, damage, or inconvenience caused by your inability to access or use the Site during any downtime or discontinuance of the Site. Nothing in these Terms of Use will be construed to obligate us to maintain and support the Site or to supply any corrections, updates, or releases in connection therewith.

    + +

    Corrections

    +

    There may be information on the Site that contains typographical errors, inaccuracies, or omissions. We reserve the right to correct any errors, inaccuracies, or omissions and to change or update the information on the Site at any time, without prior notice.

    + +

    Disclaimer

    +

    THE SITE IS PROVIDED ON AN AS-IS AND AS-AVAILABLE BASIS. YOU AGREE THAT YOUR USE OF THE SITE AND OUR SERVICES WILL BE AT YOUR SOLE RISK. TO THE FULLEST EXTENT PERMITTED BY LAW, WE DISCLAIM ALL WARRANTIES, EXPRESS OR IMPLIED, IN CONNECTION WITH THE SITE AND YOUR USE THEREOF, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. WE MAKE NO WARRANTIES OR REPRESENTATIONS ABOUT THE ACCURACY OR COMPLETENESS OF THE SITE'S CONTENT OR THE CONTENT OF ANY WEBSITES LINKED TO THE SITE AND WE WILL ASSUME NO LIABILITY OR RESPONSIBILITY FOR ANY (1) ERRORS, MISTAKES, OR INACCURACIES OF CONTENT AND MATERIALS, (2) PERSONAL INJURY OR PROPERTY DAMAGE, OF ANY NATURE WHATSOEVER, RESULTING FROM YOUR ACCESS TO AND USE OF THE SITE, (3) ANY UNAUTHORIZED ACCESS TO OR USE OF OUR SECURE SERVERS AND/OR ANY AND ALL PERSONAL INFORMATION AND/OR FINANCIAL INFORMATION STORED THEREIN, (4) ANY INTERRUPTION OR CESSATION OF TRANSMISSION TO OR FROM THE SITE, (5) ANY BUGS, VIRUSES, TROJAN HORSES, OR THE LIKE WHICH MAY BE TRANSMITTED TO OR THROUGH THE SITE BY ANY THIRD PARTY, AND/OR (6) ANY ERRORS OR OMISSIONS IN ANY CONTENT AND MATERIALS OR FOR ANY LOSS OR DAMAGE OF ANY KIND INCURRED AS A RESULT OF THE USE OF ANY CONTENT POSTED, TRANSMITTED, OR OTHERWISE MADE AVAILABLE VIA THE SITE. WE DO NOT WARRANT, ENDORSE, GUARANTEE, OR ASSUME RESPONSIBILITY FOR ANY PRODUCT OR SERVICE ADVERTISED OR OFFERED BY A THIRD PARTY THROUGH THE SITE, ANY HYPERLINKED WEBSITE, OR ANY WEBSITE OR MOBILE APPLICATION FEATURED IN ANY BANNER OR OTHER ADVERTISING, AND WE WILL NOT BE A PARTY TO OR IN ANY WAY BE RESPONSIBLE FOR MONITORING ANY TRANSACTION BETWEEN YOU AND ANY THIRD-PARTY PROVIDERS OF PRODUCTS OR SERVICES. AS WITH THE PURCHASE OF A PRODUCT OR SERVICE THROUGH ANY MEDIUM OR IN ANY ENVIRONMENT, YOU SHOULD USE YOUR BEST JUDGMENT AND EXERCISE CAUTION WHERE APPROPRIATE.

    + +

    Limitations of liability

    +

    IN NO EVENT WILL WE OR OUR DIRECTORS, EMPLOYEES, OR AGENTS BE LIABLE TO YOU OR ANY THIRD PARTY FOR ANY DIRECT, INDIRECT, CONSEQUENTIAL, EXEMPLARY, INCIDENTAL, SPECIAL, OR PUNITIVE DAMAGES, INCLUDING LOST PROFIT, LOST REVENUE, LOSS OF DATA, OR OTHER DAMAGES ARISING FROM YOUR USE OF THE SITE, EVEN IF WE HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.

    + +

    Indemnification

    +

    You agree to defend, indemnify, and hold us harmless, including our subsidiaries, affiliates, and all of our respective officers, agents, partners, and employees, from and against any loss, damage, liability, claim, or demand, including reasonable attorneys' fees and expenses, made by any third party due to or arising out of: (1) your Contributions; (2) use of the Site; (3) breach of these Terms of Use; (4) any breach of your representations and warranties set forth in these Terms of Use; (5) your violation of the rights of a third party, including but not limited to intellectual property rights; or (6) any overt harmful act toward any other user of the Site with whom you connected via the Site. Notwithstanding the foregoing, we reserve the right, at your expense, to assume the exclusive defense and control of any matter for which you are required to indemnify us, and you agree to cooperate, at your expense, with our defense of such claims. We will use reasonable efforts to notify you of any such claim, action, or proceeding which is subject to this indemnification upon becoming aware of it.

    + +

    User Data

    +

    We will maintain certain data that you transmit to the Site for the purpose of managing the performance of the Site, as well as data relating to your use of the Site. Although we perform regular routine backups of data, you are solely responsible for all data that you transmit or that relates to any activity you have undertaken using the Site. You agree that we shall have no liability to you for any loss or corruption of any such data, and you hereby waive any right of action against us arising from any such loss or corruption of such data.

    + +

    Miscellaneous

    +

    These Terms of Use and any policies or operating rules posted by us on the Site or in respect to the Site constitute the entire agreement and understanding between you and us. Our failure to exercise or enforce any right or provision of these Terms of Use shall not operate as a waiver of such right or provision. These Terms of Use operate to the fullest extent permissible by law. We may assign any or all of our rights and obligations to others at any time. We shall not be responsible or liable for any loss, damage, delay, or failure to act caused by any cause beyond our reasonable control. If any provision or part of a provision of these Terms of Use is determined to be unlawful, void, or unenforceable, that provision or part of the provision is deemed severable from these Terms of Use and does not affect the validity and enforceability of any remaining provisions. There is no joint venture, partnership, employment or agency relationship created between you and us as a result of these Terms of Use or use of the Site. You agree that these Terms of Use will not be construed against us by virtue of having drafted them. You hereby waive any and all defenses you may have based on the electronic form of these Terms of Use and the lack of signing by the parties hereto to execute these Terms of Use.

    + +

    [a] The DSpace software used to run this site is open source. Options for reuse and reproduction of the DSpace software is governed by its open source license: https://github.com/DSpace/DSpace/blob/main/LICENSE

    \ No newline at end of file diff --git a/src/app/info/privacy/privacy-content/privacy-content.component.html b/src/app/info/privacy/privacy-content/privacy-content.component.html index a5bbb3fe10..33504b1522 100644 --- a/src/app/info/privacy/privacy-content/privacy-content.component.html +++ b/src/app/info/privacy/privacy-content/privacy-content.component.html @@ -1,37 +1,91 @@ -

    {{ 'info.privacy.head' | translate }}

    -

    - Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Nunc sed velit dignissim sodales ut eu. In ante metus dictum at tempor. Diam phasellus vestibulum lorem sed risus. Sed cras ornare arcu dui vivamus. Sit amet consectetur adipiscing elit pellentesque. Id velit ut tortor pretium viverra suspendisse potenti. Sed euismod nisi porta lorem mollis aliquam ut. Justo laoreet sit amet cursus sit amet dictum sit. Ullamcorper morbi tincidunt ornare massa eget egestas. -

    -

    - In iaculis nunc sed augue lacus. Curabitur vitae nunc sed velit dignissim sodales ut eu sem. Tellus id interdum velit laoreet id donec ultrices tincidunt arcu. Quis vel eros donec ac odio tempor. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae. Varius quam quisque id diam vel quam. Nisl tincidunt eget nullam non nisi est sit. Nunc aliquet bibendum enim facilisis. Aenean sed adipiscing diam donec adipiscing. Convallis tellus id interdum velit laoreet. Massa placerat duis ultricies lacus sed turpis tincidunt. Sed cras ornare arcu dui vivamus arcu. Egestas integer eget aliquet nibh praesent tristique. Sit amet purus gravida quis blandit turpis cursus in hac. Porta non pulvinar neque laoreet suspendisse. Quis risus sed vulputate odio ut. Dignissim enim sit amet venenatis urna cursus. -

    -

    - Interdum velit laoreet id donec ultrices tincidunt arcu non sodales. Massa sapien faucibus et molestie. Dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Metus dictum at tempor commodo ullamcorper. Tincidunt lobortis feugiat vivamus at augue eget. Non diam phasellus vestibulum lorem sed risus ultricies. Neque aliquam vestibulum morbi blandit cursus risus at ultrices mi. Euismod lacinia at quis risus sed. Lorem mollis aliquam ut porttitor leo a diam. Ipsum dolor sit amet consectetur. Ante in nibh mauris cursus mattis molestie a iaculis at. Commodo ullamcorper a lacus vestibulum. Pellentesque elit eget gravida cum sociis. Sit amet commodo nulla facilisi nullam vehicula. Vehicula ipsum a arcu cursus vitae congue mauris rhoncus aenean. -

    -

    - Ac turpis egestas maecenas pharetra convallis. Lacus sed viverra tellus in. Nullam eget felis eget nunc lobortis mattis aliquam faucibus purus. Id aliquet risus feugiat in ante metus dictum at. Quis enim lobortis scelerisque fermentum dui faucibus. Eu volutpat odio facilisis mauris sit amet massa vitae tortor. Tellus elementum sagittis vitae et leo. Cras sed felis eget velit aliquet sagittis. Proin fermentum leo vel orci porta non pulvinar neque laoreet. Dui sapien eget mi proin sed libero enim. Ultrices mi tempus imperdiet nulla malesuada. Mattis molestie a iaculis at. Turpis massa sed elementum tempus egestas. -

    -

    - Dui faucibus in ornare quam viverra orci sagittis eu volutpat. Cras adipiscing enim eu turpis. Ac felis donec et odio pellentesque. Iaculis nunc sed augue lacus viverra vitae congue eu consequat. Posuere lorem ipsum dolor sit amet consectetur adipiscing elit duis. Elit eget gravida cum sociis natoque penatibus. Id faucibus nisl tincidunt eget nullam non. Sagittis aliquam malesuada bibendum arcu vitae. Fermentum leo vel orci porta. Aliquam ultrices sagittis orci a scelerisque purus semper. Diam maecenas sed enim ut sem viverra aliquet eget sit. Et ultrices neque ornare aenean euismod. Eu mi bibendum neque egestas congue quisque egestas diam. Eget lorem dolor sed viverra. Ut lectus arcu bibendum at. Rutrum tellus pellentesque eu tincidunt tortor. Vitae congue eu consequat ac. Elit ullamcorper dignissim cras tincidunt. Sit amet volutpat consequat mauris nunc congue nisi. -

    -

    - Cursus in hac habitasse platea dictumst quisque sagittis purus. Placerat duis ultricies lacus sed turpis tincidunt. In egestas erat imperdiet sed euismod nisi porta lorem mollis. Non nisi est sit amet facilisis magna. In massa tempor nec feugiat nisl pretium fusce. Pulvinar neque laoreet suspendisse interdum consectetur. Ullamcorper morbi tincidunt ornare massa eget egestas purus viverra accumsan. Fringilla urna porttitor rhoncus dolor purus non enim. Mauris nunc congue nisi vitae suscipit. Commodo elit at imperdiet dui accumsan sit amet nulla. Tempor id eu nisl nunc mi ipsum faucibus. Porta non pulvinar neque laoreet suspendisse. Nec nam aliquam sem et tortor consequat. -

    -

    - Eget nunc lobortis mattis aliquam faucibus purus. Odio tempor orci dapibus ultrices. Sed nisi lacus sed viverra tellus. Elit ullamcorper dignissim cras tincidunt. Porttitor rhoncus dolor purus non enim praesent elementum facilisis. Viverra orci sagittis eu volutpat odio. Pharetra massa massa ultricies mi quis. Lectus vestibulum mattis ullamcorper velit sed ullamcorper. Pulvinar neque laoreet suspendisse interdum consectetur. Vitae auctor eu augue ut. Arcu dictum varius duis at consectetur lorem donec. Massa sed elementum tempus egestas sed sed. Risus viverra adipiscing at in tellus integer. Vulputate enim nulla aliquet porttitor lacus luctus accumsan. Pharetra massa massa ultricies mi. Elementum eu facilisis sed odio morbi quis commodo odio. Tincidunt lobortis feugiat vivamus at. Felis donec et odio pellentesque diam volutpat commodo sed. Risus feugiat in ante metus dictum at tempor commodo ullamcorper. Fringilla phasellus faucibus scelerisque eleifend donec pretium vulputate. -

    -

    - Lectus proin nibh nisl condimentum id venenatis a condimentum. Id consectetur purus ut faucibus pulvinar elementum integer enim. Non pulvinar neque laoreet suspendisse interdum consectetur. Est pellentesque elit ullamcorper dignissim cras tincidunt lobortis feugiat vivamus. Suscipit tellus mauris a diam maecenas sed enim ut sem. Dolor purus non enim praesent elementum facilisis. Non enim praesent elementum facilisis leo vel. Ultricies leo integer malesuada nunc vel risus commodo viverra maecenas. Nulla porttitor massa id neque aliquam vestibulum. Erat velit scelerisque in dictum non consectetur. Amet cursus sit amet dictum. Nec tincidunt praesent semper feugiat nibh. Rutrum quisque non tellus orci ac auctor. Sagittis aliquam malesuada bibendum arcu vitae elementum. Massa tincidunt dui ut ornare lectus sit amet est. Aliquet porttitor lacus luctus accumsan tortor posuere ac. Quis hendrerit dolor magna eget est lorem ipsum dolor sit. Lectus mauris ultrices eros in. -

    -

    - Massa massa ultricies mi quis hendrerit dolor magna. Est ullamcorper eget nulla facilisi etiam dignissim diam. Vulputate sapien nec sagittis aliquam malesuada. Nisi porta lorem mollis aliquam ut porttitor leo a diam. Tempus quam pellentesque nec nam. Faucibus vitae aliquet nec ullamcorper sit amet risus nullam eget. Gravida arcu ac tortor dignissim convallis aenean et tortor. A scelerisque purus semper eget duis at tellus at. Viverra ipsum nunc aliquet bibendum enim. Semper feugiat nibh sed pulvinar proin gravida hendrerit. Et ultrices neque ornare aenean euismod. Consequat semper viverra nam libero justo laoreet. Nunc mattis enim ut tellus elementum sagittis. Consectetur lorem donec massa sapien faucibus et. Vel risus commodo viverra maecenas accumsan lacus vel facilisis. Diam sollicitudin tempor id eu nisl nunc. Dolor magna eget est lorem ipsum dolor. Adipiscing elit pellentesque habitant morbi tristique. -

    -

    - Nec sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Egestas fringilla phasellus faucibus scelerisque eleifend donec pretium vulputate sapien. Porttitor leo a diam sollicitudin tempor. Pellentesque dignissim enim sit amet venenatis urna cursus eget nunc. Posuere sollicitudin aliquam ultrices sagittis orci a scelerisque. Vehicula ipsum a arcu cursus vitae congue mauris rhoncus. Leo urna molestie at elementum. Duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Libero id faucibus nisl tincidunt eget nullam. Tellus elementum sagittis vitae et leo duis ut diam. Sodales ut etiam sit amet nisl purus in mollis. Ipsum faucibus vitae aliquet nec ullamcorper sit amet risus. Lacus laoreet non curabitur gravida arcu ac tortor dignissim convallis. Aliquam malesuada bibendum arcu vitae elementum. Leo vel orci porta non pulvinar neque laoreet. Ipsum suspendisse ultrices gravida dictum fusce. -

    -

    - Egestas erat imperdiet sed euismod nisi porta lorem. Venenatis a condimentum vitae sapien pellentesque habitant. Sit amet luctus venenatis lectus magna fringilla urna porttitor. Orci sagittis eu volutpat odio facilisis mauris sit amet massa. Ut enim blandit volutpat maecenas volutpat blandit aliquam. Libero volutpat sed cras ornare. Molestie ac feugiat sed lectus vestibulum mattis ullamcorper velit sed. Diam quis enim lobortis scelerisque fermentum dui. Pellentesque habitant morbi tristique senectus et netus. Auctor urna nunc id cursus metus aliquam eleifend. Elit scelerisque mauris pellentesque pulvinar pellentesque habitant morbi tristique. Sed risus ultricies tristique nulla aliquet enim tortor. Tincidunt arcu non sodales neque sodales ut. Sed lectus vestibulum mattis ullamcorper velit sed ullamcorper morbi tincidunt. -

    -

    - Pulvinar etiam non quam lacus suspendisse faucibus. Eu mi bibendum neque egestas congue. Egestas purus viverra accumsan in nisl nisi scelerisque eu. Vulputate enim nulla aliquet porttitor lacus luctus accumsan. Eu non diam phasellus vestibulum. Semper feugiat nibh sed pulvinar. Ante in nibh mauris cursus mattis molestie a. Maecenas accumsan lacus vel facilisis volutpat. Non quam lacus suspendisse faucibus. Quis commodo odio aenean sed adipiscing. Vel elit scelerisque mauris pellentesque pulvinar pellentesque habitant morbi. Sed cras ornare arcu dui vivamus arcu felis. Tortor vitae purus faucibus ornare suspendisse sed. Morbi tincidunt ornare massa eget egestas purus viverra. Nibh cras pulvinar mattis nunc. Luctus venenatis lectus magna fringilla urna porttitor. Enim blandit volutpat maecenas volutpat blandit aliquam etiam erat. Malesuada pellentesque elit eget gravida cum sociis natoque penatibus et. Felis eget nunc lobortis mattis aliquam faucibus purus in. Vivamus arcu felis bibendum ut. -

    +

    {{ 'info.privacy.head' | translate }}

    +

    Last updated May 4, 2023

    + +

    Introduction

    +

    {{ 'repository.title' | translate }} ("Company" or "We") respects your privacy and is committed to protecting it through our compliance with this policy.

    +

    This policy describes the types of information we may collect from you or that you may provide when you visit this website (our "Website") and our practices for collecting, using, maintaining, protecting, and disclosing that information.

    +

    This policy applies to information we collect:

    +
      +
    • On this Website.
    • +
    • In email, text, and other electronic messages between you and this Website.
    • +
    +

    It does not apply to information collected by:

    +
      +
    • us offline or through any other means, including on any other website operated by Company or any third party; or
    • +
    • any third party, including through any application or content (including advertising) that may link to or be accessible from or on the Website.
    • +
    +

    Please read this policy carefully to understand our policies and practices regarding your information and how we will treat it. If you do not agree with our policies and practices, your choice is not to use our Website. By accessing or using this Website, you agree to this privacy policy. This policy may change from time to time. Your continued use of this Website after we make changes is deemed to be acceptance of those changes, so please check the policy periodically for updates.

    + +

    Children under the age of 13

    +

    Our Website is not intended for children under 13 years of age. No one under age 13 may provide any personal information to or on the Website. We do not knowingly collect personal information from children under 13. If you are under 13, do not use or provide any information on this Website or provide any information about yourself to us, including your name, address, telephone number, email address, or any screen name or username you may use. If we learn we have collected or received personal information from a child under 13 without verification of parental consent, we will delete that information.

    + +

    Information we collect about you and how we collect it

    +

    We collect several types of information from and about users of our Website, including information:

    +
      +
    • by which you may be personally identified, such as name, e-mail address, telephone number, or any other identifier by which you may be contacted online or offline ("personal information"); and/or
    • +
    • about your internet connection, the equipment you use to access our Website and usage details.
    • +
    +

    We collect this information:

    +
      +
    • directly from you when you provide it to us.
    • +
    • automatically as you navigate through the site. Information collected automatically may include usage details, IP addresses, and information collected through cookies, web beacons, and other tracking technologies; and/or
    • +
    • from third parties, for example, our business partners.
    • +
    + +

    Information you provide to us

    +

    The information we collect on or through our Website may include:

    +
      +
    • Information that you provide by filling in forms on our Website. We may also ask you for information when you report a problem with our Website.
    • +
    • Records and copies of your correspondence (including email addresses), if you contact us.
    • +
    • Your responses to surveys that we might ask you to complete for research purpose.
    • +
    + +

    Information we collect through automatic data collection technologies

    +

    As you navigate through and interact with our Website, we may use automatic data collection technologies to collect certain information about your equipment, browsing actions, and patterns, including:

    +
      +
    • Details of your visits to our Website, including traffic data, location data, logs, and other communication data and the resources that you access and use on the Website.
    • +
    • Information about your computer and internet connection, including your IP address, operating system, and browser type.
    • +
    +

    The information we collect automatically is statistical data and does not include personal information, but we may maintain it or associate it with personal information we collect in other ways or receive from third parties. It helps us to improve our Website and to deliver a better and more personalized service, including by enabling us to:

    +
      +
    • Estimate our audience size and usage patterns.
    • +
    • Store information about your preferences, allowing us to customize our Website according to your individual interests.
    • +
    • Speed up your searches.
    • +
    • Recognize you when you return to our Website.
    • +
    +

    The technologies we use for this automatic data collection may include:

    +
      +
    • Cookies (or browser cookies). A cookie is a small file placed on the hard drive of your computer. You may refuse to accept browser cookies by activating the appropriate setting on your browser. However, if you select this setting you may be unable to access certain parts of our Website. Unless you have adjusted your browser setting so that it will refuse cookies, our system will issue cookies when you direct your browser to our Website.
    • +
    + +

    How we use your information

    +

    We use information that we collect about you or that you provide to us, including any personal information:

    +
      +
    • To present our Website and its contents to you.
    • +
    • To provide you with information, products, or services that you request from us.
    • +
    • To fulfill any other purpose for which you provide it.
    • +
    • To carry out our obligations and enforce our rights arising from any contracts entered into between you and us, including for billing and collection.
    • +
    • To notify you about changes to our Website or any products or services we offer or provide through it.
    • +
    • In any other way we may describe when you provide the information.
    • +
    • For any other purpose with your consent.
    • +
    + +

    Disclosure of your information

    +

    We may disclose aggregated information about our users, and information that does not identify any individual, without restriction.

    +

    We may disclose personal information that we collect or you provide as described in this privacy policy:

    +
      +
    • To contractors, service providers, and other third parties we use to support our business and who are bound by contractual obligations to keep personal information confidential and use it only for the purposes for which we disclose it to them.
    • +
    • To a buyer or other successor in the event of a merger, divestiture, restructuring, reorganization, dissolution, or other sale or transfer of some or all of Company's assets, whether as a going concern or as part of bankruptcy, liquidation, or similar proceeding, in which personal information held by Company about our Website users is among the assets transferred.
    • +
    • To fulfill the purpose for which you provide it.
    • +
    • For any other purpose disclosed by us when you provide the information.
    • +
    • With your consent.
    • +
    +

    We may also disclose your personal information:

    +
      +
    • To comply with any court order, law, or legal process, including to respond to any government or regulatory request.
    • +
    • To enforce or apply our End User Agreement and other agreements, including for billing and collection purposes.
    • +
    • If we believe disclosure is necessary or appropriate to protect the rights, property, or safety of the Company, our customers, or others.
    • +
    + +

    Changes to our privacy policy

    +

    It is our policy to post any changes we make to our privacy policy on this page. The date the privacy policy was last revised is identified at the top of the page. You are responsible for periodically visiting our Website and this privacy policy to check for any changes.

    \ No newline at end of file diff --git a/src/assets/i18n/en.json5 b/src/assets/i18n/en.json5 index 2df03302d7..b8dbd20459 100644 --- a/src/assets/i18n/en.json5 +++ b/src/assets/i18n/en.json5 @@ -1916,6 +1916,8 @@ "info.end-user-agreement.title": "End User Agreement", + "info.end-user-agreement.hosting-country": "the United States", + "info.privacy.breadcrumbs": "Privacy Statement", "info.privacy.head": "Privacy Statement", @@ -3649,9 +3651,9 @@ "repository.image.logo": "Repository logo", - "repository.title.prefix": "DSpace Angular :: ", + "repository.title": "DSpace Repository", - "repository.title.prefixDSpace": "DSpace Angular ::", + "repository.title.prefix": "DSpace Repository :: ", "resource-policies.add.button": "Add", From c3854355fd4150c93349d998e0fad3edbbc047d1 Mon Sep 17 00:00:00 2001 From: Tim Donohue Date: Thu, 4 May 2023 16:02:04 -0500 Subject: [PATCH 357/409] Fix e2e test to check for new title prefix --- cypress/e2e/homepage.cy.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cypress/e2e/homepage.cy.ts b/cypress/e2e/homepage.cy.ts index 8fdf61dbf7..a387c31a2a 100644 --- a/cypress/e2e/homepage.cy.ts +++ b/cypress/e2e/homepage.cy.ts @@ -6,8 +6,8 @@ describe('Homepage', () => { cy.visit('/'); }); - it('should display translated title "DSpace Angular :: Home"', () => { - cy.title().should('eq', 'DSpace Angular :: Home'); + it('should display translated title "DSpace Repository :: Home"', () => { + cy.title().should('eq', 'DSpace Repository :: Home'); }); it('should contain a news section', () => { From 685fbf630a7e6c5dbeadc99df52ae9c7fac63e9b Mon Sep 17 00:00:00 2001 From: Tim Donohue Date: Mon, 12 Jun 2023 17:04:02 -0500 Subject: [PATCH 358/409] Address feedback: Make links open in new window/tab. --- .../end-user-agreement-content.component.html | 4 ++-- .../privacy/privacy-content/privacy-content.component.html | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/app/info/end-user-agreement/end-user-agreement-content/end-user-agreement-content.component.html b/src/app/info/end-user-agreement/end-user-agreement-content/end-user-agreement-content.component.html index 3ae0d0efbe..d5e6de85d4 100644 --- a/src/app/info/end-user-agreement/end-user-agreement-content/end-user-agreement-content.component.html +++ b/src/app/info/end-user-agreement/end-user-agreement-content/end-user-agreement-content.component.html @@ -63,7 +63,7 @@

    We reserve the right, but not the obligation, to: (1) monitor the Site for violations of these Terms of Use; (2) take appropriate legal action against anyone who, in our sole discretion, violates the law or these Terms of Use, including without limitation, reporting such user to law enforcement authorities; (3) in our sole discretion and without limitation, refuse, restrict access to, limit the availability of, or disable (to the extent technologically feasible) any of your Contributions or any portion thereof; (4) in our sole discretion and without limitation, notice, or liability, to remove from the Site or otherwise disable all files and content that are excessive in size or are in any way burdensome to our systems; and (5) otherwise manage the Site in a manner designed to protect our rights and property and to facilitate the proper functioning of the Site.

    Privacy policy

    -

    We care about data privacy and security. Please review our Privacy Policy. By using the Site, you agree to be bound by our Privacy Policy, which is incorporated into these Terms of Use.

    +

    We care about data privacy and security. Please review our Privacy Policy. By using the Site, you agree to be bound by our Privacy Policy, which is incorporated into these Terms of Use.

    Please be advised the Site is hosted in {{ 'info.end-user-agreement.hosting-country' | translate }}. If you access the Site from any other region of the world with laws or other requirements governing personal data collection, use, or disclosure that differ from applicable laws in {{ 'info.end-user-agreement.hosting-country' | translate }}, then through your continued use of the Site, you are transferring your data to {{ 'info.end-user-agreement.hosting-country' | translate }}, and you agree to have your data transferred to and processed in {{ 'info.end-user-agreement.hosting-country' | translate }}.

    Term and termination

    @@ -92,4 +92,4 @@

    Miscellaneous

    These Terms of Use and any policies or operating rules posted by us on the Site or in respect to the Site constitute the entire agreement and understanding between you and us. Our failure to exercise or enforce any right or provision of these Terms of Use shall not operate as a waiver of such right or provision. These Terms of Use operate to the fullest extent permissible by law. We may assign any or all of our rights and obligations to others at any time. We shall not be responsible or liable for any loss, damage, delay, or failure to act caused by any cause beyond our reasonable control. If any provision or part of a provision of these Terms of Use is determined to be unlawful, void, or unenforceable, that provision or part of the provision is deemed severable from these Terms of Use and does not affect the validity and enforceability of any remaining provisions. There is no joint venture, partnership, employment or agency relationship created between you and us as a result of these Terms of Use or use of the Site. You agree that these Terms of Use will not be construed against us by virtue of having drafted them. You hereby waive any and all defenses you may have based on the electronic form of these Terms of Use and the lack of signing by the parties hereto to execute these Terms of Use.

    -

    [a] The DSpace software used to run this site is open source. Options for reuse and reproduction of the DSpace software is governed by its open source license: https://github.com/DSpace/DSpace/blob/main/LICENSE

    \ No newline at end of file +

    [a] The DSpace software used to run this site is open source. Options for reuse and reproduction of the DSpace software is governed by its open source license: https://github.com/DSpace/DSpace/blob/main/LICENSE

    \ No newline at end of file diff --git a/src/app/info/privacy/privacy-content/privacy-content.component.html b/src/app/info/privacy/privacy-content/privacy-content.component.html index 33504b1522..f29a786e8b 100644 --- a/src/app/info/privacy/privacy-content/privacy-content.component.html +++ b/src/app/info/privacy/privacy-content/privacy-content.component.html @@ -83,7 +83,7 @@

    We may also disclose your personal information:

    • To comply with any court order, law, or legal process, including to respond to any government or regulatory request.
    • -
    • To enforce or apply our End User Agreement and other agreements, including for billing and collection purposes.
    • +
    • To enforce or apply our End User Agreement and other agreements, including for billing and collection purposes.
    • If we believe disclosure is necessary or appropriate to protect the rights, property, or safety of the Company, our customers, or others.
    From ff85422bb3c6a3167a8728ae48285b7119889ad9 Mon Sep 17 00:00:00 2001 From: Alisa Ismailati Date: Tue, 13 Jun 2023 16:46:26 +0200 Subject: [PATCH 359/409] [DURACOM-155] Edit item / collection / community in sidebar menu --- .../collection-form.component.ts | 20 ++++-- .../collection-metadata.component.ts | 22 +++++-- .../community-form.component.ts | 11 +++- .../item-status/item-status.component.ts | 1 - .../comcol-form/comcol-form.component.ts | 66 ++++++++++--------- .../comcol-metadata.component.ts | 4 +- .../edit-comcol-page.component.ts | 4 +- 7 files changed, 80 insertions(+), 48 deletions(-) diff --git a/src/app/collection-page/collection-form/collection-form.component.ts b/src/app/collection-page/collection-form/collection-form.component.ts index 23698de84e..84223d260a 100644 --- a/src/app/collection-page/collection-form/collection-form.component.ts +++ b/src/app/collection-page/collection-form/collection-form.component.ts @@ -1,4 +1,4 @@ -import { Component, Input, OnInit } from '@angular/core'; +import { ChangeDetectorRef, Component, Input, OnChanges, OnInit, SimpleChange, SimpleChanges } from '@angular/core'; import { Observable } from 'rxjs'; import { TranslateService } from '@ngx-translate/core'; @@ -31,7 +31,7 @@ import { NONE_ENTITY_TYPE } from '../../core/shared/item-relationships/item-type styleUrls: ['../../shared/comcol/comcol-forms/comcol-form/comcol-form.component.scss'], templateUrl: '../../shared/comcol/comcol-forms/comcol-form/comcol-form.component.html' }) -export class CollectionFormComponent extends ComColFormComponent implements OnInit { +export class CollectionFormComponent extends ComColFormComponent implements OnInit, OnChanges { /** * @type {Collection} A new collection when a collection is being created, an existing Input collection when a collection is being edited */ @@ -61,12 +61,23 @@ export class CollectionFormComponent extends ComColFormComponent imp protected dsoService: CommunityDataService, protected requestService: RequestService, protected objectCache: ObjectCacheService, - protected entityTypeService: EntityTypeDataService) { + protected entityTypeService: EntityTypeDataService, + protected chd: ChangeDetectorRef) { super(formService, translate, notificationsService, authService, requestService, objectCache); } - ngOnInit() { + /** + * Detect changes to the dso and initialize the form, + * if the dso changes, exists and it is not the first change + */ + ngOnChanges(changes: SimpleChanges) { + const dsoChange: SimpleChange = changes.dso; + if (this.dso && dsoChange && !dsoChange.isFirstChange()) { + this.initializeForm(); + } + } + initializeForm() { let currentRelationshipValue: MetadataValue[]; if (this.dso && this.dso.metadata) { currentRelationshipValue = this.dso.metadata['dspace.entity.type']; @@ -96,6 +107,7 @@ export class CollectionFormComponent extends ComColFormComponent imp this.formModel = [...collectionFormModels, this.entityTypeSelection]; super.ngOnInit(); + this.chd.detectChanges(); }); } diff --git a/src/app/collection-page/edit-collection-page/collection-metadata/collection-metadata.component.ts b/src/app/collection-page/edit-collection-page/collection-metadata/collection-metadata.component.ts index 8e534a0829..7603b9960a 100644 --- a/src/app/collection-page/edit-collection-page/collection-metadata/collection-metadata.component.ts +++ b/src/app/collection-page/edit-collection-page/collection-metadata/collection-metadata.component.ts @@ -1,8 +1,8 @@ -import { Component } from '@angular/core'; +import { Component, OnInit } from '@angular/core'; import { ComcolMetadataComponent } from '../../../shared/comcol/comcol-forms/edit-comcol-page/comcol-metadata/comcol-metadata.component'; import { Collection } from '../../../core/shared/collection.model'; import { CollectionDataService } from '../../../core/data/collection-data.service'; -import { ActivatedRoute, Router } from '@angular/router'; +import { ActivatedRoute, NavigationEnd, Router, Scroll } from '@angular/router'; import { ItemTemplateDataService } from '../../../core/data/item-template-data.service'; import { combineLatest as combineLatestObservable, Observable } from 'rxjs'; import { RemoteData } from '../../../core/data/remote-data'; @@ -23,7 +23,7 @@ import { hasValue } from '../../../shared/empty.util'; selector: 'ds-collection-metadata', templateUrl: './collection-metadata.component.html', }) -export class CollectionMetadataComponent extends ComcolMetadataComponent { +export class CollectionMetadataComponent extends ComcolMetadataComponent implements OnInit { protected frontendURL = '/collections/'; protected type = Collection.type; @@ -44,9 +44,21 @@ export class CollectionMetadataComponent extends ComcolMetadataComponent { + if ( + event instanceof NavigationEnd || + (event instanceof Scroll && event.routerEvent instanceof NavigationEnd) + ) { + super.ngOnInit(); + this.initTemplateItem(); + } + }); } /** diff --git a/src/app/community-page/community-form/community-form.component.ts b/src/app/community-page/community-form/community-form.component.ts index c6dd1147c3..fa4809738d 100644 --- a/src/app/community-page/community-form/community-form.component.ts +++ b/src/app/community-page/community-form/community-form.component.ts @@ -1,4 +1,4 @@ -import { Component, Input } from '@angular/core'; +import { Component, Input, OnChanges, SimpleChange, SimpleChanges } from '@angular/core'; import { DynamicFormControlModel, DynamicFormService, @@ -23,7 +23,7 @@ import { environment } from '../../../environments/environment'; styleUrls: ['../../shared/comcol/comcol-forms/comcol-form/comcol-form.component.scss'], templateUrl: '../../shared/comcol/comcol-forms/comcol-form/comcol-form.component.html' }) -export class CommunityFormComponent extends ComColFormComponent { +export class CommunityFormComponent extends ComColFormComponent implements OnChanges { /** * @type {Community} A new community when a community is being created, an existing Input community when a community is being edited */ @@ -81,4 +81,11 @@ export class CommunityFormComponent extends ComColFormComponent { protected objectCache: ObjectCacheService) { super(formService, translate, notificationsService, authService, requestService, objectCache); } + + ngOnChanges(changes: SimpleChanges) { + const dsoChange: SimpleChange = changes.dso; + if (this.dso && dsoChange && !dsoChange.isFirstChange()) { + super.ngOnInit(); + } + } } diff --git a/src/app/item-page/edit-item-page/item-status/item-status.component.ts b/src/app/item-page/edit-item-page/item-status/item-status.component.ts index ce84786304..27bc86d33e 100644 --- a/src/app/item-page/edit-item-page/item-status/item-status.component.ts +++ b/src/app/item-page/edit-item-page/item-status/item-status.component.ts @@ -82,7 +82,6 @@ export class ItemStatusComponent implements OnInit { ngOnInit(): void { this.itemRD$ = this.route.parent.data.pipe(map((data) => data.dso)); this.itemRD$.pipe( - first(), map((data: RemoteData) => data.payload) ).subscribe((item: Item) => { this.statusData = Object.assign({ diff --git a/src/app/shared/comcol/comcol-forms/comcol-form/comcol-form.component.ts b/src/app/shared/comcol/comcol-forms/comcol-form/comcol-form.component.ts index bbd8b01257..631a9f0b19 100644 --- a/src/app/shared/comcol/comcol-forms/comcol-form/comcol-form.component.ts +++ b/src/app/shared/comcol/comcol-forms/comcol-form/comcol-form.component.ts @@ -127,39 +127,41 @@ export class ComColFormComponent implements On } ngOnInit(): void { - this.formModel.forEach( - (fieldModel: DynamicInputModel) => { - fieldModel.value = this.dso.firstMetadataValue(fieldModel.name); - } - ); - this.formGroup = this.formService.createFormGroup(this.formModel); - - this.updateFieldTranslations(); - this.translate.onLangChange - .subscribe(() => { - this.updateFieldTranslations(); - }); - - if (hasValue(this.dso.id)) { - this.subs.push( - observableCombineLatest([ - this.dsoService.getLogoEndpoint(this.dso.id), - this.dso.logo - ]).subscribe(([href, logoRD]: [string, RemoteData]) => { - this.uploadFilesOptions.url = href; - this.uploadFilesOptions.authToken = this.authService.buildAuthHeader(); - // If the object already contains a logo, send out a PUT request instead of POST for setting a new logo - if (hasValue(logoRD.payload)) { - this.uploadFilesOptions.method = RestRequestMethod.PUT; - } - this.initializedUploaderOptions.next(true); - }) + if (hasValue(this.formModel)) { + this.formModel.forEach( + (fieldModel: DynamicInputModel) => { + fieldModel.value = this.dso.firstMetadataValue(fieldModel.name); + } ); - } else { - // Set a placeholder URL to not break the uploader component. This will be replaced once the object is created. - this.uploadFilesOptions.url = 'placeholder'; - this.uploadFilesOptions.authToken = this.authService.buildAuthHeader(); - this.initializedUploaderOptions.next(true); + this.formGroup = this.formService.createFormGroup(this.formModel); + + this.updateFieldTranslations(); + this.translate.onLangChange + .subscribe(() => { + this.updateFieldTranslations(); + }); + + if (hasValue(this.dso.id)) { + this.subs.push( + observableCombineLatest([ + this.dsoService.getLogoEndpoint(this.dso.id), + this.dso.logo + ]).subscribe(([href, logoRD]: [string, RemoteData]) => { + this.uploadFilesOptions.url = href; + this.uploadFilesOptions.authToken = this.authService.buildAuthHeader(); + // If the object already contains a logo, send out a PUT request instead of POST for setting a new logo + if (hasValue(logoRD.payload)) { + this.uploadFilesOptions.method = RestRequestMethod.PUT; + } + this.initializedUploaderOptions.next(true); + }) + ); + } else { + // Set a placeholder URL to not break the uploader component. This will be replaced once the object is created. + this.uploadFilesOptions.url = 'placeholder'; + this.uploadFilesOptions.authToken = this.authService.buildAuthHeader(); + this.initializedUploaderOptions.next(true); + } } } diff --git a/src/app/shared/comcol/comcol-forms/edit-comcol-page/comcol-metadata/comcol-metadata.component.ts b/src/app/shared/comcol/comcol-forms/edit-comcol-page/comcol-metadata/comcol-metadata.component.ts index 5bd51ea650..d59030251d 100644 --- a/src/app/shared/comcol/comcol-forms/edit-comcol-page/comcol-metadata/comcol-metadata.component.ts +++ b/src/app/shared/comcol/comcol-forms/edit-comcol-page/comcol-metadata/comcol-metadata.component.ts @@ -3,7 +3,7 @@ import { DSpaceObject } from '../../../../../core/shared/dspace-object.model'; import { Observable } from 'rxjs'; import { RemoteData } from '../../../../../core/data/remote-data'; import { ActivatedRoute, Router } from '@angular/router'; -import { first, map, take } from 'rxjs/operators'; +import { map, take } from 'rxjs/operators'; import { getFirstCompletedRemoteData, getFirstSucceededRemoteData } from '../../../../../core/shared/operators'; import { hasValue, isEmpty } from '../../../../empty.util'; import { ResourceType } from '../../../../../core/shared/resource-type'; @@ -42,7 +42,7 @@ export class ComcolMetadataComponent imp } ngOnInit(): void { - this.dsoRD$ = this.route.parent.data.pipe(first(), map((data) => data.dso)); + this.dsoRD$ = this.route.parent.data.pipe(map((data) => data.dso)); } /** diff --git a/src/app/shared/comcol/comcol-forms/edit-comcol-page/edit-comcol-page.component.ts b/src/app/shared/comcol/comcol-forms/edit-comcol-page/edit-comcol-page.component.ts index 48eb9aec96..e4d6c9c8a7 100644 --- a/src/app/shared/comcol/comcol-forms/edit-comcol-page/edit-comcol-page.component.ts +++ b/src/app/shared/comcol/comcol-forms/edit-comcol-page/edit-comcol-page.component.ts @@ -1,7 +1,7 @@ import { Component, OnInit } from '@angular/core'; import { Observable } from 'rxjs'; -import { first, map } from 'rxjs/operators'; +import { map } from 'rxjs/operators'; import { ActivatedRoute, Router } from '@angular/router'; import { RemoteData } from '../../../../core/data/remote-data'; @@ -53,7 +53,7 @@ export class EditComColPageComponent implements On this.pages = this.route.routeConfig.children .map((child: any) => child.path) .filter((path: string) => isNotEmpty(path)); // ignore reroutes - this.dsoRD$ = this.route.data.pipe(first(), map((data) => data.dso)); + this.dsoRD$ = this.route.data.pipe(map((data) => data.dso)); } /** From ec8470de06d4adfbfd947cea6bece1e05cf47efb Mon Sep 17 00:00:00 2001 From: Alisa Ismailati Date: Tue, 13 Jun 2023 18:41:11 +0200 Subject: [PATCH 360/409] [DURACOM-155] --- .../collection-metadata.component.spec.ts | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/src/app/collection-page/edit-collection-page/collection-metadata/collection-metadata.component.spec.ts b/src/app/collection-page/edit-collection-page/collection-metadata/collection-metadata.component.spec.ts index 79e7a465e1..7cc54bd994 100644 --- a/src/app/collection-page/edit-collection-page/collection-metadata/collection-metadata.component.spec.ts +++ b/src/app/collection-page/edit-collection-page/collection-metadata/collection-metadata.component.spec.ts @@ -4,7 +4,7 @@ import { SharedModule } from '../../../shared/shared.module'; import { CommonModule } from '@angular/common'; import { RouterTestingModule } from '@angular/router/testing'; import { CollectionDataService } from '../../../core/data/collection-data.service'; -import { ActivatedRoute, Router } from '@angular/router'; +import { ActivatedRoute, NavigationEnd, Router } from '@angular/router'; import { of as observableOf } from 'rxjs'; import { NO_ERRORS_SCHEMA } from '@angular/core'; import { CollectionMetadataComponent } from './collection-metadata.component'; @@ -52,6 +52,11 @@ describe('CollectionMetadataComponent', () => { setStaleByHrefSubstring: {} }); + const routerMock = { + events: observableOf(new NavigationEnd(1, 'url', 'url')), + navigate: jasmine.createSpy('navigate'), + }; + beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ imports: [TranslateModule.forRoot(), SharedModule, CommonModule, RouterTestingModule], @@ -62,6 +67,7 @@ describe('CollectionMetadataComponent', () => { { provide: ActivatedRoute, useValue: { parent: { data: observableOf({ dso: createSuccessfulRemoteDataObject(collection) }) } } }, { provide: NotificationsService, useValue: notificationsService }, { provide: RequestService, useValue: requestService }, + { provide: Router, useValue: routerMock} ], schemas: [NO_ERRORS_SCHEMA] }).compileComponents(); @@ -70,8 +76,11 @@ describe('CollectionMetadataComponent', () => { beforeEach(() => { fixture = TestBed.createComponent(CollectionMetadataComponent); comp = fixture.componentInstance; - router = (comp as any).router; itemTemplateService = (comp as any).itemTemplateService; + spyOn(comp, 'ngOnInit'); + spyOn(comp, 'initTemplateItem'); + + routerMock.events = observableOf(new NavigationEnd(1, 'url', 'url')); fixture.detectChanges(); }); @@ -83,9 +92,8 @@ describe('CollectionMetadataComponent', () => { describe('addItemTemplate', () => { it('should navigate to the collection\'s itemtemplate page', () => { - spyOn(router, 'navigate'); comp.addItemTemplate(); - expect(router.navigate).toHaveBeenCalledWith([getCollectionItemTemplateRoute(collection.uuid)]); + expect(routerMock.navigate).toHaveBeenCalledWith([getCollectionItemTemplateRoute(collection.uuid)]); }); }); From 486aefebc7b3b3ac729ec4de35ebad017d179dc0 Mon Sep 17 00:00:00 2001 From: Giuseppe Digilio Date: Tue, 13 Jun 2023 19:00:33 +0200 Subject: [PATCH 361/409] [CST-5729] Add possibility to store response's headers into the SSR cache --- server.ts | 18 +++++++++++++----- src/config/cache-config.interface.ts | 2 ++ src/config/default-app-config.ts | 2 ++ 3 files changed, 17 insertions(+), 5 deletions(-) diff --git a/server.ts b/server.ts index d64b80b4ab..791baf7236 100644 --- a/server.ts +++ b/server.ts @@ -53,7 +53,7 @@ import { buildAppConfig } from './src/config/config.server'; import { APP_CONFIG, AppConfig } from './src/config/app-config.interface'; import { extendEnvironmentWithAppConfig } from './src/config/config.util'; import { logStartupMessage } from './startup-message'; -import { TOKENITEM } from 'src/app/core/auth/models/auth-token-info.model'; +import { TOKENITEM } from './src/app/core/auth/models/auth-token-info.model'; /* @@ -374,9 +374,15 @@ function cacheCheck(req, res, next) { } // If cached copy exists, return it to the user. - if (cachedCopy) { + if (cachedCopy && cachedCopy.page) { + if (cachedCopy.headers && Array.isArray(environment.cache.serverSide.headers) && environment.cache.serverSide.headers.length > 0) { + environment.cache.serverSide.headers.forEach((header) => { + if (environment.cache.serverSide.debug) { console.log(`Restore cached ${header} header`); } + res.setHeader(header, cachedCopy.headers[header.toLowerCase()]); + }); + } res.locals.ssr = true; // mark response as SSR-generated (enables text compression) - res.send(cachedCopy); + res.send(cachedCopy.page); // Tell Express to skip all other handlers for this path // This ensures we don't try to re-render the page since we've already returned the cached copy @@ -452,16 +458,18 @@ function saveToCache(req, page: any) { // Avoid caching "/reload/[random]" paths (these are hard refreshes after logout) if (key.startsWith('/reload')) { return; } + // Retrieve response headers + const headers = req.res.getHeaders(); // If bot cache is enabled, save it to that cache if it doesn't exist or is expired // (NOTE: has() will return false if page is expired in cache) if (botCacheEnabled() && !botCache.has(key)) { - botCache.set(key, page); + botCache.set(key, { page, headers }); if (environment.cache.serverSide.debug) { console.log(`CACHE SAVE FOR ${key} in bot cache.`); } } // If anonymous cache is enabled, save it to that cache if it doesn't exist or is expired if (anonymousCacheEnabled() && !anonymousCache.has(key)) { - anonymousCache.set(key, page); + anonymousCache.set(key, { page, headers }); if (environment.cache.serverSide.debug) { console.log(`CACHE SAVE FOR ${key} in anonymous cache.`); } } } diff --git a/src/config/cache-config.interface.ts b/src/config/cache-config.interface.ts index 9560fe46a5..14af509bbf 100644 --- a/src/config/cache-config.interface.ts +++ b/src/config/cache-config.interface.ts @@ -13,6 +13,8 @@ export interface CacheConfig extends Config { serverSide: { // Debug server-side caching. Set to true to see cache hits/misses/refreshes in console logs. debug: boolean, + // List of headers to restore from the cache hit + headers: string[], // Cache specific to known bots. Allows you to serve cached contents to bots only. botCache: { // Maximum number of pages (rendered via SSR) to cache. Setting max=0 disables the cache. diff --git a/src/config/default-app-config.ts b/src/config/default-app-config.ts index 80420407c7..a6e9e092e4 100644 --- a/src/config/default-app-config.ts +++ b/src/config/default-app-config.ts @@ -78,6 +78,8 @@ export class DefaultAppConfig implements AppConfig { // In-memory cache of server-side rendered content serverSide: { debug: false, + // Link header is used for signposting functionality + headers: ['Link'], // Cache specific to known bots. Allows you to serve cached contents to bots only. // Defaults to caching 1,000 pages. Each page expires after 1 day botCache: { From ac9be25faf9135424f4c201a24472c1d24b5f7f7 Mon Sep 17 00:00:00 2001 From: Giuseppe Digilio Date: Tue, 13 Jun 2023 19:30:40 +0200 Subject: [PATCH 362/409] [CST-5729] check if header exists --- server.ts | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/server.ts b/server.ts index 791baf7236..f73bd1b774 100644 --- a/server.ts +++ b/server.ts @@ -377,8 +377,12 @@ function cacheCheck(req, res, next) { if (cachedCopy && cachedCopy.page) { if (cachedCopy.headers && Array.isArray(environment.cache.serverSide.headers) && environment.cache.serverSide.headers.length > 0) { environment.cache.serverSide.headers.forEach((header) => { - if (environment.cache.serverSide.debug) { console.log(`Restore cached ${header} header`); } - res.setHeader(header, cachedCopy.headers[header.toLowerCase()]); + if (cachedCopy.headers[header.toLowerCase()]) { + if (environment.cache.serverSide.debug) { + console.log(`Restore cached ${header} header`); + } + res.setHeader(header, cachedCopy.headers[header.toLowerCase()]); + } }); } res.locals.ssr = true; // mark response as SSR-generated (enables text compression) From 8bcceff085825c7aad27a099c7b426b67ba0e4fe Mon Sep 17 00:00:00 2001 From: damian Date: Tue, 13 Jun 2023 19:57:30 +0200 Subject: [PATCH 363/409] Empty communities and collections items count are now shown. Show communities items count at the home page. --- .../community-list/community-list.component.html | 2 +- .../collection-list-element.component.html | 2 +- .../collection-list-element.component.spec.ts | 8 ++++---- .../community-list-element.component.html | 1 + 4 files changed, 7 insertions(+), 6 deletions(-) diff --git a/src/app/community-list-page/community-list/community-list.component.html b/src/app/community-list-page/community-list/community-list.component.html index 7f8dcf0c45..55b043f8e8 100644 --- a/src/app/community-list-page/community-list/community-list.component.html +++ b/src/app/community-list-page/community-list/community-list.component.html @@ -37,7 +37,7 @@ {{node.name}} - [{{node.payload.archivedItemsCount}}] + [{{node.payload.archivedItemsCount}}]
    diff --git a/src/app/shared/object-list/collection-list-element/collection-list-element.component.html b/src/app/shared/object-list/collection-list-element/collection-list-element.component.html index 68a84a88e5..b007db510e 100644 --- a/src/app/shared/object-list/collection-list-element/collection-list-element.component.html +++ b/src/app/shared/object-list/collection-list-element/collection-list-element.component.html @@ -4,7 +4,7 @@ {{object.name}} -[{{object.archivedItemsCount}}] +[{{object.archivedItemsCount}}]
    {{object.shortDescription}}
    diff --git a/src/app/shared/object-list/collection-list-element/collection-list-element.component.spec.ts b/src/app/shared/object-list/collection-list-element/collection-list-element.component.spec.ts index b911bdd2eb..2324cc3c1f 100644 --- a/src/app/shared/object-list/collection-list-element/collection-list-element.component.spec.ts +++ b/src/app/shared/object-list/collection-list-element/collection-list-element.component.spec.ts @@ -18,7 +18,7 @@ const mockCollectionWithArchivedItems: Collection = Object.assign(new Collection }, archivedItemsCount: 1 }); -const mockCollectionWithoutArchivedItems: Collection = Object.assign(new Collection(), { +const mockCollectionWithArchivedItemsDisabledAtBackend: Collection = Object.assign(new Collection(), { metadata: { 'dc.title': [ { @@ -26,7 +26,7 @@ const mockCollectionWithoutArchivedItems: Collection = Object.assign(new Collect value: 'Test title' } ] - }, archivedItemsCount: 0 + }, archivedItemsCount: -1 }); @@ -108,9 +108,9 @@ describe('CollectionListElementComponent', () => { }); }); - describe('When the collection has no archived items', () => { + describe('When the collection archived items are disabled at backend', () => { beforeEach(() => { - collectionListElementComponent.object = mockCollectionWithoutArchivedItems; + collectionListElementComponent.object = mockCollectionWithArchivedItemsDisabledAtBackend; fixture.detectChanges(); }); diff --git a/src/app/shared/object-list/community-list-element/community-list-element.component.html b/src/app/shared/object-list/community-list-element/community-list-element.component.html index af01999ca7..26ff040dd6 100644 --- a/src/app/shared/object-list/community-list-element/community-list-element.component.html +++ b/src/app/shared/object-list/community-list-element/community-list-element.component.html @@ -4,6 +4,7 @@ {{object.name}} +[{{object.archivedItemsCount}}]
    {{object.shortDescription}}
    From 3b93f5bd234ed0eb1e9f598b8df29bf755e743c9 Mon Sep 17 00:00:00 2001 From: Alisa Ismailati Date: Wed, 14 Jun 2023 09:44:58 +0200 Subject: [PATCH 364/409] [DURACOM-155] small fix --- .../collection-metadata/collection-metadata.component.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/app/collection-page/edit-collection-page/collection-metadata/collection-metadata.component.ts b/src/app/collection-page/edit-collection-page/collection-metadata/collection-metadata.component.ts index 7603b9960a..634363527f 100644 --- a/src/app/collection-page/edit-collection-page/collection-metadata/collection-metadata.component.ts +++ b/src/app/collection-page/edit-collection-page/collection-metadata/collection-metadata.component.ts @@ -1,4 +1,4 @@ -import { Component, OnInit } from '@angular/core'; +import { ChangeDetectorRef, Component, OnInit } from '@angular/core'; import { ComcolMetadataComponent } from '../../../shared/comcol/comcol-forms/edit-comcol-page/comcol-metadata/comcol-metadata.component'; import { Collection } from '../../../core/shared/collection.model'; import { CollectionDataService } from '../../../core/data/collection-data.service'; @@ -40,6 +40,7 @@ export class CollectionMetadataComponent extends ComcolMetadataComponent Date: Wed, 14 Jun 2023 10:49:49 +0300 Subject: [PATCH 365/409] src/assets/i18n/en.json5: lint Normalize whitespace in i18n/en.json5. This file should be clean, as it is the "upstream" of all other language assets and produces a lot of whitespace changes every time strings are merged. --- src/assets/i18n/en.json5 | 362 +++++++-------------------------------- 1 file changed, 65 insertions(+), 297 deletions(-) diff --git a/src/assets/i18n/en.json5 b/src/assets/i18n/en.json5 index b8dbd20459..480bf8834e 100644 --- a/src/assets/i18n/en.json5 +++ b/src/assets/i18n/en.json5 @@ -6,8 +6,6 @@ "401.unauthorized": "unauthorized", - - "403.help": "You don't have permission to access this page. You can use the button below to get back to the home page.", "403.link.home-page": "Take me to the home page", @@ -20,7 +18,6 @@ "500.link.home-page": "Take me to the home page", - "404.help": "We can't find the page you're looking for. The page may have been moved or deleted. You can use the button below to get back to the home page. ", "404.link.home-page": "Take me to the home page", @@ -130,6 +127,7 @@ "admin.registries.bitstream-formats.table.mimetype": "MIME Type", "admin.registries.bitstream-formats.table.name": "Name", + "admin.registries.bitstream-formats.table.id": "ID", "admin.registries.bitstream-formats.table.return": "Back", @@ -144,8 +142,6 @@ "admin.registries.bitstream-formats.title": "Bitstream Format Registry", - - "admin.registries.metadata.breadcrumbs": "Metadata registry", "admin.registries.metadata.description": "The metadata registry maintains a list of all metadata fields available in the repository. These fields may be divided amongst multiple schemas. However, DSpace requires the qualified Dublin Core schema.", @@ -172,8 +168,6 @@ "admin.registries.metadata.title": "Metadata Registry", - - "admin.registries.schema.breadcrumbs": "Metadata schema", "admin.registries.schema.description": "This is the metadata schema for \"{{namespace}}\".", @@ -185,6 +179,7 @@ "admin.registries.schema.fields.table.delete": "Delete selected", "admin.registries.schema.fields.table.field": "Field", + "admin.registries.schema.fields.table.id": "ID", "admin.registries.schema.fields.table.scopenote": "Scope Note", @@ -225,8 +220,6 @@ "admin.registries.schema.title": "Metadata Schema Registry", - - "admin.access-control.epeople.actions.delete": "Delete EPerson", "admin.access-control.epeople.actions.impersonate": "Impersonate EPerson", @@ -321,8 +314,6 @@ "admin.access-control.epeople.notification.deleted.success": "Successfully deleted EPerson: \"{{name}}\"", - - "admin.access-control.groups.title": "Groups", "admin.access-control.groups.breadcrumbs": "Groups", @@ -369,8 +360,6 @@ "admin.access-control.groups.notification.deleted.failure.content": "Cause: \"{{cause}}\"", - - "admin.access-control.groups.form.alert.permanent": "This group is permanent, so it can't be edited or deleted. You can still add and remove group members using this page.", "admin.access-control.groups.form.alert.workflowGroup": "This group can’t be modified or deleted because it corresponds to a role in the submission and workflow process in the \"{{name}}\" {{comcol}}. You can delete it from the \"assign roles\" tab on the edit {{comcol}} page. You can still add and remove group members using this page.", @@ -531,9 +520,6 @@ "administrativeView.search.results.head": "Administrative Search", - - - "admin.workflow.breadcrumbs": "Administer Workflow", "admin.workflow.title": "Administer Workflow", @@ -550,8 +536,6 @@ "admin.workflow.item.supervision": "Supervision", - - "admin.metadata-import.breadcrumbs": "Import Metadata", "admin.batch-import.breadcrumbs": "Import Batch", @@ -612,12 +596,10 @@ "advanced-workflow-action.rating.description-requiredDescription": "Please select a rating below and also add a review", - "advanced-workflow-action.select-reviewer.description-single": "Please select a single reviewer below before submitting", "advanced-workflow-action.select-reviewer.description-multiple": "Please select one or more reviewers below before submitting", - "advanced-workflow-action-select-reviewer.groups.form.reviewers-list.head": "EPeople", "advanced-workflow-action-select-reviewer.groups.form.reviewers-list.search.head": "Add EPeople", @@ -674,12 +656,9 @@ "auth.messages.token-refresh-failed": "Refreshing your session token failed. Please log in again.", + "bitstream.download.page": "Now downloading {{bitstream}}...", - - "bitstream.download.page": "Now downloading {{bitstream}}..." , - - "bitstream.download.page.back": "Back" , - + "bitstream.download.page.back": "Back", "bitstream.edit.authorizations.link": "Edit bitstream's Policies", @@ -731,7 +710,6 @@ "bitstream.edit.form.iiifHeight.hint": "The canvas height should usually match the image height.", - "bitstream.edit.notifications.saved.content": "Your changes to this bitstream were saved.", "bitstream.edit.notifications.saved.title": "Bitstream saved", @@ -747,6 +725,7 @@ "bitstream-request-a-copy.intro": "Enter the following information to request a copy for the following item: ", "bitstream-request-a-copy.intro.bitstream.one": "Requesting the following file: ", + "bitstream-request-a-copy.intro.bitstream.all": "Requesting all files. ", "bitstream-request-a-copy.name.label": "Name *", @@ -775,8 +754,6 @@ "bitstream-request-a-copy.submit.error": "Something went wrong with submitting the item request.", - - "browse.back.all-results": "All browse results", "browse.comcol.by.author": "By Author", @@ -871,20 +848,16 @@ "browse.title.page": "Browsing {{ collection }} by {{ field }} {{ value }}", - "search.browse.item-back": "Back to Results", - "chips.remove": "Remove chip", - "claimed-approved-search-result-list-element.title": "Approved", "claimed-declined-search-result-list-element.title": "Rejected, sent back to submitter", "claimed-declined-task-search-result-list-element.title": "Declined, sent back to Review Manager's workflow", - "collection.create.head": "Create a Collection", "collection.create.notifications.success": "Successfully created the Collection", @@ -907,16 +880,12 @@ "collection.delete.text": "Are you sure you want to delete collection \"{{ dso }}\"", - - "collection.edit.delete": "Delete this collection", "collection.edit.head": "Edit Collection", "collection.edit.breadcrumbs": "Edit Collection", - - "collection.edit.tabs.mapper.head": "Item Mapper", "collection.edit.tabs.item-mapper.title": "Collection Edit - Item Mapper", @@ -957,7 +926,6 @@ "collection.edit.item-mapper.tabs.map": "Map new items", - "collection.edit.logo.delete.title": "Delete logo", "collection.edit.logo.delete-undo.title": "Undo delete", @@ -976,14 +944,10 @@ "collection.edit.logo.upload": "Drop a Collection Logo to upload", - - "collection.edit.notifications.success": "Successfully edited the Collection", "collection.edit.return": "Back", - - "collection.edit.tabs.curate.head": "Curate", "collection.edit.tabs.curate.title": "Collection Edit - Curate", @@ -1042,8 +1006,6 @@ "collection.edit.tabs.source.title": "Collection Edit - Content Source", - - "collection.edit.template.add-button": "Add", "collection.edit.template.breadcrumbs": "Item template", @@ -1068,8 +1030,6 @@ "collection.edit.template.title": "Edit Template Item", - - "collection.form.abstract": "Short Description", "collection.form.description": "Introductory text (HTML)", @@ -1088,12 +1048,8 @@ "collection.form.entityType": "Entity Type", - - "collection.listelement.badge": "Collection", - - "collection.page.browse.recent.head": "Recent Submissions", "collection.page.browse.recent.empty": "No items to show", @@ -1106,46 +1062,62 @@ "collection.page.news": "News", - - "collection.select.confirm": "Confirm selected", "collection.select.empty": "No collections to show", "collection.select.table.title": "Title", - "collection.source.controls.head": "Harvest Controls", - "collection.source.controls.test.submit.error": "Something went wrong with initiating the testing of the settings", - "collection.source.controls.test.failed": "The script to test the settings has failed", - "collection.source.controls.test.completed": "The script to test the settings has successfully finished", - "collection.source.controls.test.submit": "Test configuration", - "collection.source.controls.test.running": "Testing configuration...", - "collection.source.controls.import.submit.success": "The import has been successfully initiated", - "collection.source.controls.import.submit.error": "Something went wrong with initiating the import", - "collection.source.controls.import.submit": "Import now", - "collection.source.controls.import.running": "Importing...", - "collection.source.controls.import.failed": "An error occurred during the import", - "collection.source.controls.import.completed": "The import completed", - "collection.source.controls.reset.submit.success": "The reset and reimport has been successfully initiated", - "collection.source.controls.reset.submit.error": "Something went wrong with initiating the reset and reimport", - "collection.source.controls.reset.failed": "An error occurred during the reset and reimport", - "collection.source.controls.reset.completed": "The reset and reimport completed", - "collection.source.controls.reset.submit": "Reset and reimport", - "collection.source.controls.reset.running": "Resetting and reimporting...", - "collection.source.controls.harvest.status": "Harvest status:", - "collection.source.controls.harvest.start": "Harvest start time:", - "collection.source.controls.harvest.last": "Last time harvested:", - "collection.source.controls.harvest.message": "Harvest info:", - "collection.source.controls.harvest.no-information": "N/A", + "collection.source.controls.test.submit.error": "Something went wrong with initiating the testing of the settings", + + "collection.source.controls.test.failed": "The script to test the settings has failed", + + "collection.source.controls.test.completed": "The script to test the settings has successfully finished", + + "collection.source.controls.test.submit": "Test configuration", + + "collection.source.controls.test.running": "Testing configuration...", + + "collection.source.controls.import.submit.success": "The import has been successfully initiated", + + "collection.source.controls.import.submit.error": "Something went wrong with initiating the import", + + "collection.source.controls.import.submit": "Import now", + + "collection.source.controls.import.running": "Importing...", + + "collection.source.controls.import.failed": "An error occurred during the import", + + "collection.source.controls.import.completed": "The import completed", + + "collection.source.controls.reset.submit.success": "The reset and reimport has been successfully initiated", + + "collection.source.controls.reset.submit.error": "Something went wrong with initiating the reset and reimport", + + "collection.source.controls.reset.failed": "An error occurred during the reset and reimport", + + "collection.source.controls.reset.completed": "The reset and reimport completed", + + "collection.source.controls.reset.submit": "Reset and reimport", + + "collection.source.controls.reset.running": "Resetting and reimporting...", + + "collection.source.controls.harvest.status": "Harvest status:", + + "collection.source.controls.harvest.start": "Harvest start time:", + + "collection.source.controls.harvest.last": "Last time harvested:", + + "collection.source.controls.harvest.message": "Harvest info:", + + "collection.source.controls.harvest.no-information": "N/A", "collection.source.update.notifications.error.content": "The provided settings have been tested and didn't work.", "collection.source.update.notifications.error.title": "Server Error", - - "communityList.breadcrumbs": "Community List", "communityList.tabTitle": "Community List", @@ -1154,8 +1126,6 @@ "communityList.showMore": "Show More", - - "community.create.head": "Create a Community", "community.create.notifications.success": "Successfully created the Community", @@ -1184,7 +1154,6 @@ "community.edit.breadcrumbs": "Edit Community", - "community.edit.logo.delete.title": "Delete logo", "community.edit.logo.delete-undo.title": "Undo delete", @@ -1203,8 +1172,6 @@ "community.edit.logo.upload": "Drop a Community Logo to upload", - - "community.edit.notifications.success": "Successfully edited the Community", "community.edit.notifications.unauthorized": "You do not have privileges to make this change", @@ -1213,8 +1180,6 @@ "community.edit.return": "Back", - - "community.edit.tabs.curate.head": "Curate", "community.edit.tabs.curate.title": "Community Edit - Curate", @@ -1231,12 +1196,8 @@ "community.edit.tabs.authorizations.title": "Community Edit - Authorizations", - - "community.listelement.badge": "Community", - - "comcol-role.edit.no-group": "None", "comcol-role.edit.create": "Create", @@ -1249,57 +1210,46 @@ "comcol-role.edit.delete.error.title": "Failed to delete the '{{ role }}' role's group", - "comcol-role.edit.community-admin.name": "Administrators", "comcol-role.edit.collection-admin.name": "Administrators", - "comcol-role.edit.community-admin.description": "Community administrators can create sub-communities or collections, and manage or assign management for those sub-communities or collections. In addition, they decide who can submit items to any sub-collections, edit item metadata (after submission), and add (map) existing items from other collections (subject to authorization).", "comcol-role.edit.collection-admin.description": "Collection administrators decide who can submit items to the collection, edit item metadata (after submission), and add (map) existing items from other collections to this collection (subject to authorization for that collection).", - "comcol-role.edit.submitters.name": "Submitters", "comcol-role.edit.submitters.description": "The E-People and Groups that have permission to submit new items to this collection.", - "comcol-role.edit.item_read.name": "Default item read access", "comcol-role.edit.item_read.description": "E-People and Groups that can read new items submitted to this collection. Changes to this role are not retroactive. Existing items in the system will still be viewable by those who had read access at the time of their addition.", "comcol-role.edit.item_read.anonymous-group": "Default read for incoming items is currently set to Anonymous.", - "comcol-role.edit.bitstream_read.name": "Default bitstream read access", "comcol-role.edit.bitstream_read.description": "Community administrators can create sub-communities or collections, and manage or assign management for those sub-communities or collections. In addition, they decide who can submit items to any sub-collections, edit item metadata (after submission), and add (map) existing items from other collections (subject to authorization).", "comcol-role.edit.bitstream_read.anonymous-group": "Default read for incoming bitstreams is currently set to Anonymous.", - "comcol-role.edit.editor.name": "Editors", "comcol-role.edit.editor.description": "Editors are able to edit the metadata of incoming submissions, and then accept or reject them.", - "comcol-role.edit.finaleditor.name": "Final editors", "comcol-role.edit.finaleditor.description": "Final editors are able to edit the metadata of incoming submissions, but will not be able to reject them.", - "comcol-role.edit.reviewer.name": "Reviewers", "comcol-role.edit.reviewer.description": "Reviewers are able to accept or reject incoming submissions. However, they are not able to edit the submission's metadata.", - "comcol-role.edit.scorereviewers.name": "Score Reviewers", "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.", - - "community.form.abstract": "Short Description", "community.form.description": "Introductory text (HTML)", @@ -1326,8 +1276,6 @@ "community.sub-community-list.head": "Communities of this Community", - - "cookies.consent.accept-all": "Accept all", "cookies.consent.accept-selected": "Accept selected", @@ -1380,30 +1328,22 @@ "cookies.consent.app.description.authentication": "Required for signing you in", - "cookies.consent.app.title.preferences": "Preferences", "cookies.consent.app.description.preferences": "Required for saving your preferences", - - "cookies.consent.app.title.acknowledgement": "Acknowledgement", "cookies.consent.app.description.acknowledgement": "Required for saving your acknowledgements and consents", - - "cookies.consent.app.title.google-analytics": "Google Analytics", "cookies.consent.app.description.google-analytics": "Allows us to track statistical data", - - "cookies.consent.app.title.google-recaptcha": "Google reCaptcha", "cookies.consent.app.description.google-recaptcha": "We use google reCAPTCHA service during registration and password recovery", - "cookies.consent.purpose.functional": "Functional", "cookies.consent.purpose.statistical": "Statistical", @@ -1428,8 +1368,6 @@ "curation-task.task.register-doi.label": "Register DOI", - - "curation.form.task-select.label": "Task:", "curation.form.submit": "Start", @@ -1448,8 +1386,6 @@ "curation.form.handle.hint": "Hint: Enter [your-handle-prefix]/0 to run a task across entire site (not all tasks may support this capability)", - - "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.subject": "Request copy of document", @@ -1462,14 +1398,10 @@ "deny-request-copy.success": "Successfully denied item request", - - "dso.name.untitled": "Untitled", "dso.name.unnamed": "Unnamed", - - "dso-selector.create.collection.head": "New collection", "dso-selector.create.collection.sub-level": "Create a new collection in", @@ -1656,11 +1588,8 @@ "feed.description": "Syndication feed", - "file-section.error.header": "Error obtaining files for this item", - - "footer.copyright": "copyright © 2002-{{ year }}", "footer.link.dspace": "DSpace software", @@ -1675,8 +1604,6 @@ "footer.link.feedback": "Send Feedback", - - "forgot-email.form.header": "Forgot Password", "forgot-email.form.info": "Enter the email address associated with the account.", @@ -1699,8 +1626,6 @@ "forgot-email.form.error.content": "An error occured when attempting to reset the password for the account associated with the following email address: {{ email }}", - - "forgot-password.title": "Forgot Password", "forgot-password.form.head": "Forgot Password", @@ -1729,7 +1654,6 @@ "forgot-password.form.submit": "Submit password", - "form.add": "Add more", "form.add-help": "Click here to add the current entry and to add another one", @@ -1798,8 +1722,6 @@ "form.repeatable.sort.tip": "Drop the item in the new position", - - "grant-deny-request-copy.deny": "Don't send copy", "grant-deny-request-copy.email.back": "Back", @@ -1830,8 +1752,6 @@ "grant-deny-request-copy.processed": "This request has already been processed. You can use the button below to get back to the home page.", - - "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.subject": "Request copy of document", @@ -1844,7 +1764,6 @@ "grant-request-copy.success": "Successfully granted item request", - "health.breadcrumbs": "Health", "health-page.heading": "Health", @@ -1885,7 +1804,6 @@ "health-page.section.no-issues": "No issues detected", - "home.description": "", "home.breadcrumbs": "Home", @@ -1898,8 +1816,6 @@ "home.top-level-communities.help": "Select a community to browse its collections.", - - "info.end-user-agreement.accept": "I have read and I agree to the End User Agreement", "info.end-user-agreement.accept.error": "An error occurred accepting the End User Agreement", @@ -1950,26 +1866,18 @@ "info.feedback.page_help": "Tha page related to your feedback", - - "item.alerts.private": "This item is non-discoverable", "item.alerts.withdrawn": "This item has been withdrawn", - - "item.edit.authorizations.heading": "With this editor you can view and alter the policies of an item, plus alter policies of individual item components: bundles and bitstreams. Briefly, an item is a container of bundles, and bundles are containers of bitstreams. Containers usually have ADD/REMOVE/READ/WRITE policies, while bitstreams only have READ/WRITE policies.", "item.edit.authorizations.title": "Edit item's Policies", - - "item.badge.private": "Non-discoverable", "item.badge.withdrawn": "Withdrawn", - - "item.bitstreams.upload.bundle": "Bundle", "item.bitstreams.upload.bundle.placeholder": "Select a bundle or input new bundle name", @@ -1992,8 +1900,6 @@ "item.bitstreams.upload.title": "Upload bitstream", - - "item.edit.bitstreams.bundle.edit.buttons.upload": "Upload", "item.edit.bitstreams.bundle.displaying": "Currently displaying {{ amount }} bitstreams of {{ total }}.", @@ -2054,8 +1960,6 @@ "item.edit.bitstreams.upload-button": "Upload", - - "item.edit.delete.cancel": "Cancel", "item.edit.delete.confirm": "Delete", @@ -2074,7 +1978,6 @@ "item.edit.tabs.disabled.tooltip": "You're not authorized to access this tab", - "item.edit.tabs.mapper.head": "Collection Mapper", "item.edit.tabs.item-mapper.title": "Item Edit - Collection Mapper", @@ -2157,8 +2060,6 @@ "item.edit.item-mapper.tabs.map": "Map new collections", - - "item.edit.metadata.add-button": "Add", "item.edit.metadata.discard-button": "Discard", @@ -2215,16 +2116,12 @@ "item.edit.metadata.save-button": "Save", - - "item.edit.modify.overview.field": "Field", "item.edit.modify.overview.language": "Language", "item.edit.modify.overview.value": "Value", - - "item.edit.move.cancel": "Back", "item.edit.move.save-button": "Save", @@ -2251,8 +2148,6 @@ "item.edit.move.title": "Move item", - - "item.edit.private.cancel": "Cancel", "item.edit.private.confirm": "Make it non-discoverable", @@ -2265,8 +2160,6 @@ "item.edit.private.success": "The item is now non-discoverable", - - "item.edit.public.cancel": "Cancel", "item.edit.public.confirm": "Make it discoverable", @@ -2279,8 +2172,6 @@ "item.edit.public.success": "The item is now discoverable", - - "item.edit.reinstate.cancel": "Cancel", "item.edit.reinstate.confirm": "Reinstate", @@ -2293,8 +2184,6 @@ "item.edit.reinstate.success": "The item was reinstated successfully", - - "item.edit.relationships.discard-button": "Discard", "item.edit.relationships.edit.buttons.add": "Add", @@ -2325,10 +2214,8 @@ "item.edit.relationships.no-entity-type": "Add 'dspace.entity.type' metadata to enable relationships for this item", - "item.edit.return": "Back", - "item.edit.tabs.bitstreams.head": "Bitstreams", "item.edit.tabs.bitstreams.title": "Item Edit - Bitstreams", @@ -2336,6 +2223,7 @@ "item.edit.tabs.curate.head": "Curate", "item.edit.tabs.curate.title": "Item Edit - Curate", + "item.edit.curate.title": "Curate Item: {{item}}", "item.edit.tabs.metadata.head": "Metadata", @@ -2404,8 +2292,6 @@ "item.edit.tabs.view.title": "Item Edit - View", - - "item.edit.withdraw.cancel": "Cancel", "item.edit.withdraw.confirm": "Withdraw", @@ -2420,7 +2306,6 @@ "item.orcid.return": "Back", - "item.listelement.badge": "Item", "item.page.description": "Description", @@ -2459,8 +2344,6 @@ "workflow-item.search.result.list.element.supervised.remove-tooltip": "Remove supervision group", - - "item.page.abstract": "Abstract", "item.page.author": "Authors", @@ -2587,8 +2470,6 @@ "item.preview.oaire.fundingStream": "Funding Stream:", - - "item.select.confirm": "Confirm selected", "item.select.empty": "No items to show", @@ -2599,7 +2480,6 @@ "item.select.table.title": "Title", - "item.version.history.empty": "There are no other versions for this item yet.", "item.version.history.head": "Version History", @@ -2640,10 +2520,8 @@ "item.version.history.table.action.hasDraft": "A new version cannot be created because there is an inprogress submission in the version history", - "item.version.notice": "This is not the latest version of this item. The latest version can be found here.", - "item.version.create.modal.header": "New version", "item.version.create.modal.text": "Create a new version for this item", @@ -2672,7 +2550,6 @@ "item.version.create.notification.inProgress": "A new version cannot be created because there is an inprogress submission in the version history", - "item.version.delete.modal.header": "Delete version", "item.version.delete.modal.text": "Do you want to delete version {{version}}?", @@ -2689,13 +2566,10 @@ "item.version.delete.notification.failure": "Version number {{version}} has not been deleted", - "item.version.edit.notification.success": "The summary of version number {{version}} has been changed", "item.version.edit.notification.failure": "The summary of version number {{version}} has not been changed", - - "itemtemplate.edit.metadata.add-button": "Add", "itemtemplate.edit.metadata.discard-button": "Discard", @@ -2750,8 +2624,6 @@ "itemtemplate.edit.metadata.save-button": "Save", - - "journal.listelement.badge": "Journal", "journal.page.description": "Description", @@ -2772,8 +2644,6 @@ "journal.search.title": "Journal Search", - - "journalissue.listelement.badge": "Journal Issue", "journalissue.page.description": "Description", @@ -2792,8 +2662,6 @@ "journalissue.page.titleprefix": "Journal Issue: ", - - "journalvolume.listelement.badge": "Journal Volume", "journalvolume.page.description": "Description", @@ -2806,7 +2674,6 @@ "journalvolume.page.volume": "Volume", - "iiifsearchable.listelement.badge": "Document Media", "iiifsearchable.page.titleprefix": "Document: ", @@ -2829,7 +2696,6 @@ "iiif.page.description": "Description: ", - "loading.bitstream": "Loading bitstream...", "loading.bitstreams": "Loading bitstreams...", @@ -2866,8 +2732,6 @@ "loading.top-level-communities": "Loading top-level communities...", - - "login.form.email": "Email address", "login.form.forgot-password": "Have you forgotten your password?", @@ -2892,24 +2756,18 @@ "login.breadcrumbs": "Login", - - "logout.form.header": "Log out from DSpace", "logout.form.submit": "Log out", "logout.title": "Logout", - - "menu.header.admin": "Management", "menu.header.image.logo": "Repository logo", "menu.header.admin.description": "Management menu", - - "menu.section.access_control": "Access Control", "menu.section.access_control_authorizations": "Authorizations", @@ -2918,12 +2776,8 @@ "menu.section.access_control_people": "People", - - "menu.section.admin_search": "Admin Search", - - "menu.section.browse_community": "This Community", "menu.section.browse_community_by_author": "By Author", @@ -2946,14 +2800,10 @@ "menu.section.browse_global_communities_and_collections": "Communities & Collections", - - "menu.section.control_panel": "Control Panel", "menu.section.curation_task": "Curation Task", - - "menu.section.edit": "Edit", "menu.section.edit_collection": "Collection", @@ -2962,8 +2812,6 @@ "menu.section.edit_item": "Item", - - "menu.section.export": "Export", "menu.section.export_collection": "Collection", @@ -2976,7 +2824,6 @@ "menu.section.export_batch": "Batch Export (ZIP)", - "menu.section.icon.access_control": "Access Control menu section", "menu.section.icon.admin_search": "Admin search menu section", @@ -3009,16 +2856,12 @@ "menu.section.icon.unpin": "Unpin sidebar", - - "menu.section.import": "Import", "menu.section.import_batch": "Batch Import (ZIP)", "menu.section.import_metadata": "Metadata", - - "menu.section.new": "New", "menu.section.new_collection": "Collection", @@ -3031,34 +2874,24 @@ "menu.section.new_process": "Process", - - "menu.section.pin": "Pin sidebar", "menu.section.unpin": "Unpin sidebar", - - "menu.section.processes": "Processes", "menu.section.health": "Health", - - "menu.section.registries": "Registries", "menu.section.registries_format": "Format", "menu.section.registries_metadata": "Metadata", - - "menu.section.statistics": "Statistics", "menu.section.statistics_task": "Statistics Task", - - "menu.section.toggle.access_control": "Toggle Access Control section", "menu.section.toggle.control_panel": "Toggle Control Panel section", @@ -3079,14 +2912,13 @@ "menu.section.toggle.statistics_task": "Toggle Statistics Task section", - "menu.section.workflow": "Administer Workflow", - "metadata-export-search.tooltip": "Export search results as CSV", - "metadata-export-search.submit.success": "The export was started successfully", - "metadata-export-search.submit.error": "Starting the export has failed", + "metadata-export-search.submit.success": "The export was started successfully", + + "metadata-export-search.submit.error": "Starting the export has failed", "mydspace.breadcrumbs": "MyDSpace", @@ -3172,8 +3004,6 @@ "mydspace.view-btn": "View", - - "nav.browse.header": "All of DSpace", "nav.community-browse.header": "By Community", @@ -3198,7 +3028,6 @@ "nav.search.button": "Submit search", - "nav.statistics.header": "Statistics", "nav.stop-impersonating": "Stop impersonating EPerson", @@ -3211,7 +3040,6 @@ "none.listelement.badge": "Item", - "orgunit.listelement.badge": "Organizational Unit", "orgunit.listelement.no-title": "Untitled", @@ -3230,8 +3058,6 @@ "orgunit.page.titleprefix": "Organizational Unit: ", - - "pagination.options.description": "Pagination options", "pagination.results-per-page": "Results Per Page", @@ -3242,8 +3068,6 @@ "pagination.sort-direction": "Sort Options", - - "person.listelement.badge": "Person", "person.listelement.no-title": "No name found", @@ -3276,8 +3100,6 @@ "person.search.title": "Person Search", - - "process.new.select-parameters": "Parameters", "process.new.cancel": "Cancel", @@ -3318,8 +3140,6 @@ "process.new.breadcrumbs": "Create a new process", - - "process.detail.arguments": "Arguments", "process.detail.arguments.empty": "This process doesn't contain any arguments", @@ -3366,8 +3186,6 @@ "process.detail.delete.error": "Something went wrong when deleting the process", - - "process.overview.table.finish": "Finish time (UTC)", "process.overview.table.id": "Process ID", @@ -3404,8 +3222,6 @@ "process.bulk.delete.success": "{{count}} process(es) have been succesfully deleted", - - "profile.breadcrumbs": "Update Profile", "profile.card.identify": "Identify", @@ -3492,8 +3308,6 @@ "project-relationships.search.results.head": "Project Search Results", - - "publication.listelement.badge": "Publication", "publication.page.description": "Description", @@ -3516,14 +3330,12 @@ "publication.search.title": "Publication Search", - "media-viewer.next": "Next", "media-viewer.previous": "Previous", "media-viewer.playlist": "Playlist", - "register-email.title": "New user registration", "register-page.create-profile.header": "Create Profile", @@ -3566,7 +3378,6 @@ "register-page.create-profile.submit.success.head": "Registration completed", - "register-page.registration.header": "New user registration", "register-page.registration.info": "Register an account to subscribe to collections for email updates, and submit new items to DSpace.", @@ -3594,8 +3405,8 @@ "register-page.registration.error.recaptcha": "Error when trying to authenticate with recaptcha", "register-page.registration.google-recaptcha.must-accept-cookies": "In order to register you must accept the Registration and Password recovery (Google reCaptcha) cookies.", - "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": "This email address is not on the list of domains who can register. Allowed domains are {{ domains }}", "register-page.registration.google-recaptcha.open-cookie-settings": "Open cookie settings", @@ -3604,6 +3415,7 @@ "register-page.registration.google-recaptcha.notification.message.error": "An error occurred during reCaptcha verification", "register-page.registration.google-recaptcha.notification.message.expired": "Verification expired. Please verify again.", + "register-page.registration.info.maildomain": "Accounts can be registered for mail addresses of the domains", "relationships.add.error.relationship-type.content": "No suitable match could be found for relationship type {{ type }} between the two items", @@ -3648,14 +3460,12 @@ "relationships.isFundingAgencyOf.OrgUnit": "Funder", - "repository.image.logo": "Repository logo", "repository.title": "DSpace Repository", "repository.title.prefix": "DSpace Repository :: ", - "resource-policies.add.button": "Add", "resource-policies.add.for.": "Add a new policy", @@ -3770,8 +3580,6 @@ "resource-policies.table.headers.title.for.collection": "Policies for Collection", - - "search.description": "", "search.switch-configuration.title": "Show", @@ -3782,7 +3590,6 @@ "search.search-form.placeholder": "Search the repository ...", - "search.filters.applied.f.author": "Author", "search.filters.applied.f.dateIssued.max": "End date", @@ -3815,8 +3622,6 @@ "search.filters.applied.f.withdrawn": "Withdrawn", - - "search.filters.filter.author.head": "Author", "search.filters.filter.author.placeholder": "Author name", @@ -3963,8 +3768,6 @@ "search.filters.filter.supervisedBy.label": "Search Supervised By", - - "search.filters.entityType.JournalIssue": "Journal Issue", "search.filters.entityType.JournalVolume": "Journal Volume", @@ -3983,23 +3786,18 @@ "search.filters.withdrawn.false": "No", - "search.filters.head": "Filters", "search.filters.reset": "Reset filters", "search.filters.search.submit": "Submit", - - "search.form.search": "Search", "search.form.search_dspace": "All repository", "search.form.scope.all": "All of DSpace", - - "search.results.head": "Search Results", "search.results.no-results": "Your search returned no results. Having trouble finding what you're looking for? Try putting", @@ -4016,7 +3814,6 @@ "default-relationships.search.results.head": "Search Results", - "search.sidebar.close": "Back to results", "search.sidebar.filters.title": "Filters", @@ -4031,16 +3828,12 @@ "search.sidebar.settings.title": "Settings", - - "search.view-switch.show-detail": "Show detail", "search.view-switch.show-grid": "Show as grid", "search.view-switch.show-list": "Show as list", - - "sorting.ASC": "Ascending", "sorting.DESC": "Descending", @@ -4065,7 +3858,6 @@ "sorting.lastModified.DESC": "Last modified Descending", - "statistics.title": "Statistics", "statistics.header": "Statistics for {{ scope }}", @@ -4090,8 +3882,6 @@ "statistics.table.no-name": "(object name could not be loaded)", - - "submission.edit.breadcrumbs": "Edit Submission", "submission.edit.title": "Edit Submission", @@ -4120,7 +3910,6 @@ "submission.general.save-later": "Save for later", - "submission.import-external.page.title": "Import metadata from an external source", "submission.import-external.title": "Import metadata from an external source", @@ -4328,6 +4117,7 @@ "submission.sections.describe.relationship-lookup.search-tab.tab-title.isAuthorOfPublication": "Local Authors ({{ count }})", "submission.sections.describe.relationship-lookup.search-tab.tab-title.isJournalOfPublication": "Local Journals ({{ count }})", + "submission.sections.describe.relationship-lookup.search-tab.tab-title.Project": "Local Projects ({{ count }})", "submission.sections.describe.relationship-lookup.search-tab.tab-title.Publication": "Local Publications ({{ count }})", @@ -4343,9 +4133,11 @@ "submission.sections.describe.relationship-lookup.search-tab.tab-title.Journal": "Local Journals ({{ count }})", "submission.sections.describe.relationship-lookup.search-tab.tab-title.isJournalIssueOfPublication": "Local Journal Issues ({{ count }})", + "submission.sections.describe.relationship-lookup.search-tab.tab-title.JournalIssue": "Local Journal Issues ({{ count }})", "submission.sections.describe.relationship-lookup.search-tab.tab-title.isJournalVolumeOfPublication": "Local Journal Volumes ({{ count }})", + "submission.sections.describe.relationship-lookup.search-tab.tab-title.JournalVolume": "Local Journal Volumes ({{ count }})", "submission.sections.describe.relationship-lookup.search-tab.tab-title.sherpaJournal": "Sherpa Journals ({{ count }})", @@ -4382,17 +4174,16 @@ "submission.sections.describe.relationship-lookup.title.isFundingAgencyOfProject": "Funder of the Project", - - - "submission.sections.describe.relationship-lookup.selection-tab.search-form.placeholder": "Search...", "submission.sections.describe.relationship-lookup.selection-tab.tab-title": "Current Selection ({{ count }})", "submission.sections.describe.relationship-lookup.title.isJournalIssueOfPublication": "Journal Issues", + "submission.sections.describe.relationship-lookup.title.JournalIssue": "Journal Issues", "submission.sections.describe.relationship-lookup.title.isJournalVolumeOfPublication": "Journal Volumes", + "submission.sections.describe.relationship-lookup.title.JournalVolume": "Journal Volumes", "submission.sections.describe.relationship-lookup.title.isJournalOfPublication": "Journals", @@ -4400,6 +4191,7 @@ "submission.sections.describe.relationship-lookup.title.isAuthorOfPublication": "Authors", "submission.sections.describe.relationship-lookup.title.isFundingAgencyOfPublication": "Funding Agency", + "submission.sections.describe.relationship-lookup.title.Project": "Projects", "submission.sections.describe.relationship-lookup.title.Publication": "Publications", @@ -4431,6 +4223,7 @@ "submission.sections.describe.relationship-lookup.selection-tab.title.isJournalOfPublication": "Selected Journals", "submission.sections.describe.relationship-lookup.selection-tab.title.isJournalVolumeOfPublication": "Selected Journal Volume", + "submission.sections.describe.relationship-lookup.selection-tab.title.Project": "Selected Projects", "submission.sections.describe.relationship-lookup.selection-tab.title.Publication": "Selected Publications", @@ -4446,11 +4239,13 @@ "submission.sections.describe.relationship-lookup.selection-tab.title.Journal": "Selected Journals", "submission.sections.describe.relationship-lookup.selection-tab.title.isJournalIssueOfPublication": "Selected Issue", + "submission.sections.describe.relationship-lookup.selection-tab.title.JournalVolume": "Selected Journal Volume", "submission.sections.describe.relationship-lookup.selection-tab.title.isFundingAgencyOfPublication": "Selected Funding Agency", "submission.sections.describe.relationship-lookup.selection-tab.title.isFundingOfPublication": "Selected Funding", + "submission.sections.describe.relationship-lookup.selection-tab.title.JournalIssue": "Selected Issue", "submission.sections.describe.relationship-lookup.selection-tab.title.isChildOrgUnitOf": "Selected Organizational Unit", @@ -4567,7 +4362,6 @@ "submission.sections.submit.progressbar.sherpaPolicies": "Publisher open access policy information", - "submission.sections.sherpa-policy.title-empty": "No publisher policy information available. If your work has an associated ISSN, please enter it above to see any related publisher open access policies.", "submission.sections.status.errors.title": "Errors", @@ -4690,7 +4484,6 @@ "submission.sections.license.notgranted": "You must accept the license", - "submission.sections.sherpa.publication.information": "Publication information", "submission.sections.sherpa.publication.information.title": "Title", @@ -4743,14 +4536,10 @@ "submission.sections.sherpa.error.message": "There was an error retrieving sherpa informations", - - "submission.submit.breadcrumbs": "New submission", "submission.submit.title": "New submission", - - "submission.workflow.generic.delete": "Delete", "submission.workflow.generic.delete-help": "Select this option to discard this item. You will then be asked to confirm it.", @@ -4763,17 +4552,14 @@ "submission.workflow.generic.view-help": "Select this option to view the item's metadata.", - "submission.workflow.generic.submit_select_reviewer": "Select Reviewer", "submission.workflow.generic.submit_select_reviewer-help": "", - "submission.workflow.generic.submit_score": "Rate", "submission.workflow.generic.submit_score-help": "", - "submission.workflow.tasks.claimed.approve": "Approve", "submission.workflow.tasks.claimed.approve_help": "If you have reviewed the item and it is suitable for inclusion in the collection, select \"Approve\".", @@ -4802,8 +4588,6 @@ "submission.workflow.tasks.claimed.return_help": "Return the task to the pool so that another user may perform the task.", - - "submission.workflow.tasks.generic.error": "Error occurred during operation...", "submission.workflow.tasks.generic.processing": "Processing...", @@ -4812,8 +4596,6 @@ "submission.workflow.tasks.generic.success": "Operation successful", - - "submission.workflow.tasks.pool.claim": "Claim", "submission.workflow.tasks.pool.claim_help": "Assign this task to yourself.", @@ -4822,7 +4604,6 @@ "submission.workflow.tasks.pool.show-detail": "Show detail", - "submission.workspace.generic.view": "View", "submission.workspace.generic.view-help": "Select this option to view the item's metadata.", @@ -4899,7 +4680,6 @@ "subscriptions.table.empty.message": "You do not have any subscriptions at this time. To subscribe to email updates for a Community or Collection, use the subscription button on the object's page.", - "thumbnail.default.alt": "Thumbnail Image", "thumbnail.default.placeholder": "No Thumbnail Available", @@ -4916,12 +4696,8 @@ "thumbnail.person.placeholder": "No Profile Picture Available", - - "title": "DSpace", - - "vocabulary-treeview.header": "Hierarchical tree view", "vocabulary-treeview.load-more": "Load more", @@ -4956,8 +4732,6 @@ "virtual-metadata.delete-relationship.modal-head": "Select the items for which you want to save the virtual metadata as real metadata", - - "supervisedWorkspace.search.results.head": "Supervised Items", "workspace.search.results.head": "Your submissions", @@ -4968,8 +4742,6 @@ "supervision.search.results.head": "Workflow and Workspace tasks", - - "workflow-item.edit.breadcrumbs": "Edit workflowitem", "workflow-item.edit.title": "Edit workflowitem", @@ -4990,7 +4762,6 @@ "workflow-item.delete.button.confirm": "Delete", - "workflow-item.send-back.notification.success.title": "Sent back to submitter", "workflow-item.send-back.notification.success.content": "This workflow item was successfully sent back to the submitter", @@ -5047,7 +4818,6 @@ "workflow-item.selectrevieweraction.button.confirm": "Confirm", - "workflow-item.scorereviewaction.notification.success.title": "Rating review", "workflow-item.scorereviewaction.notification.success.content": "The rating for this item workflow item has been successfully submitted", @@ -5315,11 +5085,11 @@ "person.orcid.registry.queue": "ORCID Registry Queue", "person.orcid.registry.auth": "ORCID Authorizations", + "home.recent-submissions.head": "Recent Submissions", "listable-notification-object.default-message": "This object couldn't be retrieved", - "system-wide-alert-banner.retrieval.error": "Something went wrong retrieving the system-wide alert banner", "system-wide-alert-banner.countdown.prefix": "In", @@ -5330,8 +5100,6 @@ "system-wide-alert-banner.countdown.minutes": "{{minutes}} minute(s):", - - "menu.section.system-wide-alert": "System-wide Alert", "system-wide-alert.form.header": "System-wide Alert", @@ -5367,4 +5135,4 @@ "admin.system-wide-alert.breadcrumbs": "System-wide Alerts", "admin.system-wide-alert.title": "System-wide Alerts", -} +} \ No newline at end of file From 134eac5f39791db671bca4460f973cbbb7b622ed Mon Sep 17 00:00:00 2001 From: Alan Orth Date: Wed, 14 Jun 2023 08:53:41 +0300 Subject: [PATCH 366/409] src/assets: update fi.json5 Add a few Finnish language UI strings. --- src/assets/i18n/fi.json5 | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/assets/i18n/fi.json5 b/src/assets/i18n/fi.json5 index ca41138eda..62e7e6bffe 100644 --- a/src/assets/i18n/fi.json5 +++ b/src/assets/i18n/fi.json5 @@ -1922,6 +1922,9 @@ // "home.breadcrumbs": "Home", "home.breadcrumbs": "Etusivu", + // "home.search-form.placeholder": "Search the repository ...", + "home.search-form.placeholder": "Hae julkaisuarkistosta ...", + // "home.title": "DSpace Angular :: Home", "home.title": "DSpace Angular :: Etusivu", @@ -4020,6 +4023,8 @@ // "search.breadcrumbs": "Search", "search.breadcrumbs": "Hae", + // "search.search-form.placeholder": "Search the repository ...", + "search.search-form.placeholder": "Hae julkaisuarkistosta ...", // "search.filters.applied.f.author": "Author", "search.filters.applied.f.author": "Tekijä", From ce517adf7d340f4e3043868877d595d782426483 Mon Sep 17 00:00:00 2001 From: Alisa Ismailati Date: Wed, 14 Jun 2023 13:18:33 +0200 Subject: [PATCH 367/409] [DURACOM-155] lint fix --- .../edit-item-page/item-status/item-status.component.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/item-page/edit-item-page/item-status/item-status.component.ts b/src/app/item-page/edit-item-page/item-status/item-status.component.ts index 27bc86d33e..828f8d7439 100644 --- a/src/app/item-page/edit-item-page/item-status/item-status.component.ts +++ b/src/app/item-page/edit-item-page/item-status/item-status.component.ts @@ -3,7 +3,7 @@ import { fadeIn, fadeInOut } from '../../../shared/animations/fade'; import { Item } from '../../../core/shared/item.model'; import { ActivatedRoute } from '@angular/router'; import { ItemOperation } from '../item-operation/itemOperation.model'; -import { distinctUntilChanged, first, map, mergeMap, switchMap, toArray } from 'rxjs/operators'; +import { distinctUntilChanged, map, mergeMap, switchMap, toArray } from 'rxjs/operators'; import { BehaviorSubject, Observable, Subscription } from 'rxjs'; import { RemoteData } from '../../../core/data/remote-data'; import { getItemEditRoute, getItemPageRoute } from '../../item-page-routing-paths'; From 93fcbe79aa2bdd9e41f8d6a22c455e211d227f50 Mon Sep 17 00:00:00 2001 From: "Mark H. Wood" Date: Thu, 11 May 2023 12:50:47 -0400 Subject: [PATCH 368/409] Make grant message an optional addition; main text is in backend. --- .../email-request-copy.component.html | 5 +--- .../grant-request-copy.component.ts | 30 ------------------- src/assets/i18n/en.json5 | 6 ++-- 3 files changed, 3 insertions(+), 38 deletions(-) diff --git a/src/app/request-copy/email-request-copy/email-request-copy.component.html b/src/app/request-copy/email-request-copy/email-request-copy.component.html index d7633b0334..70146ab52c 100644 --- a/src/app/request-copy/email-request-copy/email-request-copy.component.html +++ b/src/app/request-copy/email-request-copy/email-request-copy.component.html @@ -8,10 +8,7 @@
    - -
    - {{ 'grant-deny-request-copy.email.message.empty' | translate }} -
    +
    diff --git a/src/app/request-copy/grant-request-copy/grant-request-copy.component.ts b/src/app/request-copy/grant-request-copy/grant-request-copy.component.ts index 79bae360a0..3f0fd74bc7 100644 --- a/src/app/request-copy/grant-request-copy/grant-request-copy.component.ts +++ b/src/app/request-copy/grant-request-copy/grant-request-copy.component.ts @@ -9,12 +9,8 @@ import { import { RemoteData } from '../../core/data/remote-data'; import { AuthService } from '../../core/auth/auth.service'; import { TranslateService } from '@ngx-translate/core'; -import { combineLatest as observableCombineLatest } from 'rxjs'; import { ItemDataService } from '../../core/data/item-data.service'; -import { EPerson } from '../../core/eperson/models/eperson.model'; import { DSONameService } from '../../core/breadcrumbs/dso-name.service'; -import { Item } from '../../core/shared/item.model'; -import { isNotEmpty } from '../../shared/empty.util'; import { ItemRequestDataService } from '../../core/data/item-request-data.service'; import { RequestCopyEmail } from '../email-request-copy/request-copy-email.model'; import { NotificationsService } from '../../shared/notifications/notifications.service'; @@ -54,8 +50,6 @@ export class GrantRequestCopyComponent implements OnInit { private route: ActivatedRoute, private authService: AuthService, private translateService: TranslateService, - private itemDataService: ItemDataService, - private nameService: DSONameService, private itemRequestService: ItemRequestDataService, private notificationsService: NotificationsService, ) { @@ -69,31 +63,7 @@ export class GrantRequestCopyComponent implements OnInit { redirectOn4xx(this.router, this.authService), ); - const msgParams$ = observableCombineLatest([ - this.itemRequestRD$.pipe(getFirstSucceededRemoteDataPayload()), - this.authService.getAuthenticatedUserFromStore(), - ]).pipe( - switchMap(([itemRequest, user]: [ItemRequest, EPerson]) => { - return this.itemDataService.findById(itemRequest.itemId).pipe( - getFirstSucceededRemoteDataPayload(), - map((item: Item) => { - const uri = item.firstMetadataValue('dc.identifier.uri'); - return Object.assign({ - recipientName: itemRequest.requestName, - itemUrl: isNotEmpty(uri) ? uri : item.handle, - itemName: this.nameService.getName(item), - authorName: this.nameService.getName(user), - authorEmail: user.email, - }); - }), - ); - }), - ); - this.subject$ = this.translateService.get('grant-request-copy.email.subject'); - this.message$ = msgParams$.pipe( - switchMap((params) => this.translateService.get('grant-request-copy.email.message', params)), - ); } /** diff --git a/src/assets/i18n/en.json5 b/src/assets/i18n/en.json5 index 480bf8834e..b1bb88fce6 100644 --- a/src/assets/i18n/en.json5 +++ b/src/assets/i18n/en.json5 @@ -1726,7 +1726,7 @@ "grant-deny-request-copy.email.back": "Back", - "grant-deny-request-copy.email.message": "Message", + "grant-deny-request-copy.email.message": "Optional additional message", "grant-deny-request-copy.email.message.empty": "Please enter a message", @@ -1752,15 +1752,13 @@ "grant-deny-request-copy.processed": "This request has already been processed. You can use the button below to get back to the home page.", - "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.subject": "Request copy of document", "grant-request-copy.error": "An error occurred", "grant-request-copy.header": "Grant document copy request", - "grant-request-copy.intro": "This message will be sent to the applicant of the request. The requested document(s) will be attached.", + "grant-request-copy.intro": "A message will be sent to the applicant of the request. The requested document(s) will be attached.", "grant-request-copy.success": "Successfully granted item request", From 004645b5e44a10b93aa26b9b6bbd59c0e0400f28 Mon Sep 17 00:00:00 2001 From: "Mark H. Wood" Date: Thu, 11 May 2023 13:28:30 -0400 Subject: [PATCH 369/409] Remove lint. --- .../grant-request-copy/grant-request-copy.component.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/app/request-copy/grant-request-copy/grant-request-copy.component.ts b/src/app/request-copy/grant-request-copy/grant-request-copy.component.ts index 3f0fd74bc7..baf078df76 100644 --- a/src/app/request-copy/grant-request-copy/grant-request-copy.component.ts +++ b/src/app/request-copy/grant-request-copy/grant-request-copy.component.ts @@ -9,8 +9,6 @@ import { import { RemoteData } from '../../core/data/remote-data'; import { AuthService } from '../../core/auth/auth.service'; import { TranslateService } from '@ngx-translate/core'; -import { ItemDataService } from '../../core/data/item-data.service'; -import { DSONameService } from '../../core/breadcrumbs/dso-name.service'; import { ItemRequestDataService } from '../../core/data/item-request-data.service'; import { RequestCopyEmail } from '../email-request-copy/request-copy-email.model'; import { NotificationsService } from '../../shared/notifications/notifications.service'; From 2d716c7630b03be67d1df950baa808f8a07fbb96 Mon Sep 17 00:00:00 2001 From: "Mark H. Wood" Date: Thu, 11 May 2023 13:57:38 -0400 Subject: [PATCH 370/409] Remove test which is no longer valid. --- .../grant-request-copy.component.spec.ts | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/src/app/request-copy/grant-request-copy/grant-request-copy.component.spec.ts b/src/app/request-copy/grant-request-copy/grant-request-copy.component.spec.ts index b9d51f710d..32fef125ea 100644 --- a/src/app/request-copy/grant-request-copy/grant-request-copy.component.spec.ts +++ b/src/app/request-copy/grant-request-copy/grant-request-copy.component.spec.ts @@ -123,19 +123,6 @@ describe('GrantRequestCopyComponent', () => { spyOn(translateService, 'get').and.returnValue(observableOf('translated-message')); }); - it('message$ should be parameterized correctly', (done) => { - component.message$.subscribe(() => { - expect(translateService.get).toHaveBeenCalledWith(jasmine.anything(), Object.assign({ - recipientName: itemRequest.requestName, - itemUrl: itemUrl, - itemName: itemName, - authorName: user.name, - authorEmail: user.email, - })); - done(); - }); - }); - describe('grant', () => { let email: RequestCopyEmail; From 2f06a7cb17a3ede463789cba27f47858bb8961c2 Mon Sep 17 00:00:00 2001 From: Giuseppe Digilio Date: Wed, 14 Jun 2023 18:26:55 +0200 Subject: [PATCH 371/409] [CST-5729] Change in order to save header only if configured and existing --- server.ts | 27 +++++++++++++++++++++------ src/config/cache-config.interface.ts | 2 +- src/environments/environment.test.ts | 1 + 3 files changed, 23 insertions(+), 7 deletions(-) diff --git a/server.ts b/server.ts index f73bd1b774..3bbb28820a 100644 --- a/server.ts +++ b/server.ts @@ -375,13 +375,13 @@ function cacheCheck(req, res, next) { // If cached copy exists, return it to the user. if (cachedCopy && cachedCopy.page) { - if (cachedCopy.headers && Array.isArray(environment.cache.serverSide.headers) && environment.cache.serverSide.headers.length > 0) { - environment.cache.serverSide.headers.forEach((header) => { - if (cachedCopy.headers[header.toLowerCase()]) { + if (cachedCopy.headers) { + Object.keys(cachedCopy.headers).forEach((header) => { + if (cachedCopy.headers[header]) { if (environment.cache.serverSide.debug) { console.log(`Restore cached ${header} header`); } - res.setHeader(header, cachedCopy.headers[header.toLowerCase()]); + res.setHeader(header, cachedCopy.headers[header]); } }); } @@ -462,8 +462,8 @@ function saveToCache(req, page: any) { // Avoid caching "/reload/[random]" paths (these are hard refreshes after logout) if (key.startsWith('/reload')) { return; } - // Retrieve response headers - const headers = req.res.getHeaders(); + // Retrieve response headers to save, if any + const headers = retrieveHeaders(req.res); // If bot cache is enabled, save it to that cache if it doesn't exist or is expired // (NOTE: has() will return false if page is expired in cache) if (botCacheEnabled() && !botCache.has(key)) { @@ -479,6 +479,21 @@ function saveToCache(req, page: any) { } } +function retrieveHeaders(response) { + const headers = Object.create({}); + if (Array.isArray(environment.cache.serverSide.headers) && environment.cache.serverSide.headers.length > 0) { + environment.cache.serverSide.headers.forEach((header) => { + if (response.hasHeader(header)) { + if (environment.cache.serverSide.debug) { + console.log(`Save ${header} header to cache`); + } + headers[header] = response.getHeader(header); + } + }); + } + + return headers; +} /** * Whether a user is authenticated or not */ diff --git a/src/config/cache-config.interface.ts b/src/config/cache-config.interface.ts index 14af509bbf..73520c95ea 100644 --- a/src/config/cache-config.interface.ts +++ b/src/config/cache-config.interface.ts @@ -13,7 +13,7 @@ export interface CacheConfig extends Config { serverSide: { // Debug server-side caching. Set to true to see cache hits/misses/refreshes in console logs. debug: boolean, - // List of headers to restore from the cache hit + // List of response headers to save into the cache headers: string[], // Cache specific to known bots. Allows you to serve cached contents to bots only. botCache: { diff --git a/src/environments/environment.test.ts b/src/environments/environment.test.ts index 9fe58f868c..cb9d2c7130 100644 --- a/src/environments/environment.test.ts +++ b/src/environments/environment.test.ts @@ -59,6 +59,7 @@ export const environment: BuildConfig = { // In-memory cache of server-side rendered pages. Disabled in test environment (max=0) serverSide: { debug: false, + headers: ['Link'], botCache: { max: 0, timeToLive: 24 * 60 * 60 * 1000, // 1 day From fda4ef77e49b5eee2cafdbf8eec553c60b21a64b Mon Sep 17 00:00:00 2001 From: Alisa Ismailati Date: Thu, 15 Jun 2023 12:42:29 +0200 Subject: [PATCH 372/409] [DURACOM-152] Section visibility read-only --- .../sections/form/section-form.component.spec.ts | 2 ++ .../sections/form/section-form.component.ts | 16 ++++++++++++---- src/app/submission/sections/sections.service.ts | 5 +++-- 3 files changed, 17 insertions(+), 6 deletions(-) diff --git a/src/app/submission/sections/form/section-form.component.spec.ts b/src/app/submission/sections/form/section-form.component.spec.ts index 889f17c393..346a22fa84 100644 --- a/src/app/submission/sections/form/section-form.component.spec.ts +++ b/src/app/submission/sections/form/section-form.component.spec.ts @@ -249,6 +249,8 @@ describe('SubmissionSectionFormComponent test suite', () => { formConfigService.findByHref.and.returnValue(createSuccessfulRemoteDataObject$(testFormConfiguration)); sectionsServiceStub.getSectionData.and.returnValue(observableOf(sectionData)); sectionsServiceStub.getSectionServerErrors.and.returnValue(observableOf([])); + sectionsServiceStub.isSectionReadOnly.and.returnValue(observableOf(false)); + spyOn(comp, 'initForm'); spyOn(comp, 'subscriptions'); diff --git a/src/app/submission/sections/form/section-form.component.ts b/src/app/submission/sections/form/section-form.component.ts index 326d277ffb..a89a9aa886 100644 --- a/src/app/submission/sections/form/section-form.component.ts +++ b/src/app/submission/sections/form/section-form.component.ts @@ -118,6 +118,12 @@ export class SubmissionSectionFormComponent extends SectionModelComponent { protected subs: Subscription[] = []; protected submissionObject: SubmissionObject; + + /** + * A flag representing if this section is readonly + */ + protected isSectionReadonly = false; + /** * The FormComponent reference */ @@ -175,13 +181,15 @@ export class SubmissionSectionFormComponent extends SectionModelComponent { this.sectionService.getSectionData(this.submissionId, this.sectionData.id, this.sectionData.sectionType), this.submissionObjectService.findById(this.submissionId, true, false, followLink('item')).pipe( getFirstSucceededRemoteData(), - getRemoteDataPayload()) + getRemoteDataPayload()), + this.sectionService.isSectionReadOnly(this.submissionId, this.sectionData.id, this.submissionService.getSubmissionScope()) ])), take(1)) - .subscribe(([sectionData, submissionObject]: [WorkspaceitemSectionFormObject, SubmissionObject]) => { + .subscribe(([sectionData, submissionObject, isSectionReadOnly]: [WorkspaceitemSectionFormObject, SubmissionObject, boolean]) => { if (isUndefined(this.formModel)) { // this.sectionData.errorsToShow = []; this.submissionObject = submissionObject; + this.isSectionReadonly = isSectionReadOnly; // Is the first loading so init form this.initForm(sectionData); this.sectionData.data = sectionData; @@ -286,11 +294,11 @@ export class SubmissionSectionFormComponent extends SectionModelComponent { this.formConfig, this.collectionId, sectionData, - this.submissionService.getSubmissionScope() + this.submissionService.getSubmissionScope(), + this.isSectionReadonly ); const sectionMetadata = this.sectionService.computeSectionConfiguredMetadata(this.formConfig); this.sectionService.updateSectionData(this.submissionId, this.sectionData.id, sectionData, this.sectionData.errorsToShow, this.sectionData.serverValidationErrors, sectionMetadata); - } catch (e) { const msg: string = this.translate.instant('error.submission.sections.init-form-error') + e.toString(); const sectionError: SubmissionSectionError = { diff --git a/src/app/submission/sections/sections.service.ts b/src/app/submission/sections/sections.service.ts index cc2802dba7..0ea6232237 100644 --- a/src/app/submission/sections/sections.service.ts +++ b/src/app/submission/sections/sections.service.ts @@ -334,8 +334,9 @@ export class SectionsService { filter((sectionObj) => hasValue(sectionObj)), map((sectionObj: SubmissionSectionObject) => { return isNotEmpty(sectionObj.visibility) - && sectionObj.visibility.other === 'READONLY' - && submissionScope !== SubmissionScopeType.WorkspaceItem; + && ((sectionObj.visibility.other === 'READONLY' && submissionScope !== SubmissionScopeType.WorkspaceItem) + || (sectionObj.visibility.main === 'READONLY' && submissionScope === SubmissionScopeType.WorkspaceItem) + ); }), distinctUntilChanged()); } From 47543b42373a7c0a95600a7e8ef2943dcbc3ef51 Mon Sep 17 00:00:00 2001 From: Giuseppe Digilio Date: Thu, 15 Jun 2023 17:18:00 +0200 Subject: [PATCH 373/409] [CST-5729] Fix duplicate links for download page --- .../bitstream-download-page/bitstream-download-page.component.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/app/bitstream-page/bitstream-download-page/bitstream-download-page.component.ts b/src/app/bitstream-page/bitstream-download-page/bitstream-download-page.component.ts index cf8d8e7767..0b8e6a66e5 100644 --- a/src/app/bitstream-page/bitstream-download-page/bitstream-download-page.component.ts +++ b/src/app/bitstream-page/bitstream-download-page/bitstream-download-page.component.ts @@ -108,7 +108,6 @@ export class BitstreamDownloadPageComponent implements OnInit { signpostingLinks.forEach((link: SignpostingLink) => { links = links + (isNotEmpty(links) ? ', ' : '') + `<${link.href}> ; rel="${link.rel}"` + (isNotEmpty(link.type) ? ` ; type="${link.type}" ` : ' '); - links = links + (isNotEmpty(links) ? ', ' : '') + `<${link.href}> ; rel="${link.rel}" ; type="${link.type}" `; }); this.responseService.setHeader('Link', links); From 4c6cae911bcf7e55484c2d7411161f4e2c567272 Mon Sep 17 00:00:00 2001 From: Davide Negretti Date: Wed, 14 Jun 2023 12:03:11 +0200 Subject: [PATCH 374/409] [DURACOM-157] Multiple uploaders in the same page don't work --- src/app/shared/upload/uploader/uploader.component.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/app/shared/upload/uploader/uploader.component.html b/src/app/shared/upload/uploader/uploader.component.html index c55a3eee1a..88dc5926e4 100644 --- a/src/app/shared/upload/uploader/uploader.component.html +++ b/src/app/shared/upload/uploader/uploader.component.html @@ -22,10 +22,10 @@ {{dropMsg | translate}}{{'uploader.or' | translate}} -
    From d00ad0cd0e33e8eb3590768e56e64f1e24e694ba Mon Sep 17 00:00:00 2001 From: Alisa Ismailati Date: Fri, 16 Jun 2023 13:27:51 +0200 Subject: [PATCH 375/409] [DURACOM-152] Field visibility --- .../submission/submission-field-scope-type.ts | 4 ++++ .../core/submission/submission-scope-type.ts | 2 +- .../form/builder/parsers/field-parser.ts | 22 ++++++++++++++----- .../shared/form/builder/parsers/row-parser.ts | 22 +++++++++++++------ 4 files changed, 37 insertions(+), 13 deletions(-) create mode 100644 src/app/core/submission/submission-field-scope-type.ts diff --git a/src/app/core/submission/submission-field-scope-type.ts b/src/app/core/submission/submission-field-scope-type.ts new file mode 100644 index 0000000000..4a9292ec3d --- /dev/null +++ b/src/app/core/submission/submission-field-scope-type.ts @@ -0,0 +1,4 @@ +export enum SubmissionFieldScopeType { + WorkspaceItem = 'SUBMISSION', + WorkflowItem = 'WORKFLOW', +} diff --git a/src/app/core/submission/submission-scope-type.ts b/src/app/core/submission/submission-scope-type.ts index 6ed32d3b4e..f319e5c473 100644 --- a/src/app/core/submission/submission-scope-type.ts +++ b/src/app/core/submission/submission-scope-type.ts @@ -1,4 +1,4 @@ export enum SubmissionScopeType { WorkspaceItem = 'WORKSPACE', - WorkflowItem = 'WORKFLOW' + WorkflowItem = 'WORKFLOW', } diff --git a/src/app/shared/form/builder/parsers/field-parser.ts b/src/app/shared/form/builder/parsers/field-parser.ts index e118ca7add..7ea55d4454 100644 --- a/src/app/shared/form/builder/parsers/field-parser.ts +++ b/src/app/shared/form/builder/parsers/field-parser.ts @@ -24,6 +24,7 @@ import { RelationshipOptions } from '../models/relationship-options.model'; import { VocabularyOptions } from '../../../../core/submission/vocabularies/models/vocabulary-options.model'; import { ParserType } from './parser-type'; import { isNgbDateStruct } from '../../../date.util'; +import { SubmissionScopeType } from '../../../../core/submission/submission-scope-type'; export const SUBMISSION_ID: InjectionToken = new InjectionToken('submissionId'); export const CONFIG_DATA: InjectionToken = new InjectionToken('configData'); @@ -282,7 +283,7 @@ export abstract class FieldParser { controlModel.id = (this.fieldId).replace(/\./g, '_'); // Set read only option - controlModel.readOnly = this.parserOptions.readOnly || this.isFieldReadOnly(this.configData.visibility, this.parserOptions.submissionScope); + controlModel.readOnly = this.parserOptions.readOnly || this.isFieldReadOnly(this.configData.visibility, this.configData.scope, this.parserOptions.submissionScope); controlModel.disabled = controlModel.readOnly; if (hasValue(this.configData.selectableRelationship)) { controlModel.relationship = Object.assign(new RelationshipOptions(), this.configData.selectableRelationship); @@ -322,14 +323,25 @@ export abstract class FieldParser { } /** - * Check if a field is read-only with the given scope + * Checks if a field is read-only with the given scope. + * The field is readonly when submissionScope is WORKSPACE and the main visibility is READONLY + * or when submissionScope is WORKFLOW and the other visibility is READONLY * @param visibility * @param submissionScope */ - private isFieldReadOnly(visibility: SectionVisibility, submissionScope: string) { + private isFieldReadOnly(visibility: SectionVisibility, fieldScope: string, submissionScope: string) { return isNotEmpty(submissionScope) - && isNotEmpty(visibility) - && visibility.main === VisibilityType.READONLY; + && isNotEmpty(fieldScope) + && isNotEmpty(visibility) + && (( + submissionScope === SubmissionScopeType.WorkspaceItem + && visibility.main === VisibilityType.READONLY + ) + || + (visibility.other === VisibilityType.READONLY + && submissionScope === SubmissionScopeType.WorkflowItem + ) + ); } /** diff --git a/src/app/shared/form/builder/parsers/row-parser.ts b/src/app/shared/form/builder/parsers/row-parser.ts index 6602e53714..3f5b4a04c6 100644 --- a/src/app/shared/form/builder/parsers/row-parser.ts +++ b/src/app/shared/form/builder/parsers/row-parser.ts @@ -1,3 +1,4 @@ +import { SubmissionFieldScopeType } from './../../../../core/submission/submission-field-scope-type'; import { SectionVisibility } from './../../../../submission/objects/section-visibility.model'; import { Injectable, Injector } from '@angular/core'; @@ -13,7 +14,7 @@ import { ParserOptions } from './parser-options'; import { ParserType } from './parser-type'; import { setLayout } from './parser.utils'; import { DYNAMIC_FORM_CONTROL_TYPE_RELATION_GROUP } from '../ds-dynamic-form-ui/ds-dynamic-form-constants'; -import { VisibilityType } from '../../../../submission/sections/visibility-type'; +import { SubmissionScopeType } from '../../../../core/submission/submission-scope-type'; export const ROW_ID_PREFIX = 'df-row-group-config-'; @@ -125,18 +126,25 @@ export class RowParser { } /** - * Check if the field is hidden or not, based on the visibility and the submission scope + * Check if the field is hidden or not. + * It is hidden when we do have the scope, + * but we do not have the visibility, + * also the field scope should be different from the submissionScope. * @param visibility The visibility of the field * @param scope the scope of the field * @param submissionScope the scope of the submission * @returns If the field is hidden or not */ private isHidden(visibility: SectionVisibility, scope: string, submissionScope: string): boolean { - return isEmpty(visibility) - || (isNotEmpty(visibility) && visibility.main !== VisibilityType.READONLY) - && isNotEmpty(submissionScope) - && (isNotEmpty(scope) - && scope !== submissionScope); + return isNotEmpty(scope) + && ( + isEmpty(visibility) + && ( + submissionScope === SubmissionScopeType.WorkspaceItem && scope !== SubmissionFieldScopeType.WorkspaceItem + || + submissionScope === SubmissionScopeType.WorkflowItem && scope !== SubmissionFieldScopeType.WorkflowItem + ) + ); } filterScopedFields(fields: FormFieldModel[], submissionScope): FormFieldModel[] { From 69726f6fa0f1347158ae336abaf2a7188c7eb421 Mon Sep 17 00:00:00 2001 From: Sascha Szott Date: Fri, 16 Jun 2023 15:00:52 +0200 Subject: [PATCH 376/409] resolve German translation differences --- src/assets/i18n/de.json5 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/assets/i18n/de.json5 b/src/assets/i18n/de.json5 index 71dfabb1c0..b03dc21e5a 100644 --- a/src/assets/i18n/de.json5 +++ b/src/assets/i18n/de.json5 @@ -262,7 +262,7 @@ "admin.registries.schema.fields.table.id": "ID", // "admin.registries.schema.fields.table.scopenote": "Scope Note", - "admin.registries.schema.fields.table.scopenote": "Gültigkeitsbereich", + "admin.registries.schema.fields.table.scopenote": "Geltungs- bzw. Gültigkeitsbereich", // "admin.registries.schema.form.create": "Create metadata field", "admin.registries.schema.form.create": "Metadatenfeld anlegen", @@ -277,7 +277,7 @@ "admin.registries.schema.form.qualifier": "Qualifizierer", // "admin.registries.schema.form.scopenote": "Scope Note", - "admin.registries.schema.form.scopenote": "Geltungsbereich", + "admin.registries.schema.form.scopenote": "Geltungs- bzw. Gültigkeitsbereich", // "admin.registries.schema.head": "Metadata Schema", "admin.registries.schema.head": "Metadatenschema", From 42026b36d52b4468cc93b6e1f0ad8c108bad9211 Mon Sep 17 00:00:00 2001 From: Alisa Ismailati Date: Fri, 16 Jun 2023 15:31:45 +0200 Subject: [PATCH 377/409] [DURACOM-152] refactored concatenated fields visibility --- .../ds-dynamic-form-ui/models/ds-dynamic-concat.model.ts | 2 ++ src/app/shared/form/builder/parsers/concat-field-parser.ts | 6 +----- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/src/app/shared/form/builder/ds-dynamic-form-ui/models/ds-dynamic-concat.model.ts b/src/app/shared/form/builder/ds-dynamic-form-ui/models/ds-dynamic-concat.model.ts index 1d6037a409..dc7c796648 100644 --- a/src/app/shared/form/builder/ds-dynamic-form-ui/models/ds-dynamic-concat.model.ts +++ b/src/app/shared/form/builder/ds-dynamic-form-ui/models/ds-dynamic-concat.model.ts @@ -46,6 +46,7 @@ export class DynamicConcatModel extends DynamicFormGroupModel { @serializable() submissionId: string; @serializable() hasSelectableMetadata: boolean; @serializable() metadataValue: MetadataValue; + @serializable() readOnly?: boolean; isCustomGroup = true; valueUpdates: Subject; @@ -65,6 +66,7 @@ export class DynamicConcatModel extends DynamicFormGroupModel { this.valueUpdates = new Subject(); this.valueUpdates.subscribe((value: string) => this.value = value); this.typeBindRelations = config.typeBindRelations ? config.typeBindRelations : []; + this.readOnly = config.disabled; } get value() { diff --git a/src/app/shared/form/builder/parsers/concat-field-parser.ts b/src/app/shared/form/builder/parsers/concat-field-parser.ts index b849698857..e86de70c81 100644 --- a/src/app/shared/form/builder/parsers/concat-field-parser.ts +++ b/src/app/shared/form/builder/parsers/concat-field-parser.ts @@ -19,8 +19,6 @@ import { SUBMISSION_ID } from './field-parser'; import { DsDynamicInputModel, DsDynamicInputModelConfig } from '../ds-dynamic-form-ui/models/ds-dynamic-input.model'; -import { VisibilityType } from '../../../../submission/sections/visibility-type'; -import isEqual from 'lodash/isEqual'; export class ConcatFieldParser extends FieldParser { @@ -85,9 +83,7 @@ export class ConcatFieldParser extends FieldParser { input1ModelConfig.required = true; } - if (isNotEmpty(this.configData.visibility) && isEqual(this.configData.visibility.main, VisibilityType.READONLY)) { - concatGroup.disabled = true; - } + concatGroup.disabled = input1ModelConfig.readOnly; if (isNotEmpty(this.firstPlaceholder)) { input1ModelConfig.placeholder = this.firstPlaceholder; From adf8cc7bc5a6a69a8ab9d7fc16507e84a1c0ba37 Mon Sep 17 00:00:00 2001 From: Ricardo Saraiva <122451983+rsaraivac@users.noreply.github.com> Date: Fri, 16 Jun 2023 17:18:34 +0100 Subject: [PATCH 378/409] Update pt-PT.json5 Incorporates some revised translations, adds and updates newly introduced translation keys. --- src/assets/i18n/pt-PT.json5 | 280 +++++++++++++++++++++++------------- 1 file changed, 177 insertions(+), 103 deletions(-) diff --git a/src/assets/i18n/pt-PT.json5 b/src/assets/i18n/pt-PT.json5 index c622c4c257..a187ff927c 100644 --- a/src/assets/i18n/pt-PT.json5 +++ b/src/assets/i18n/pt-PT.json5 @@ -1,6 +1,6 @@ { - // Dspace v7.x > i18n pt-PT > last reviewed 05-06-2023 + // Dspace v7.x > i18n pt-PT > last reviewed 16-06-2023 // "401.help": "You're not authorized to access this page. You can use the button below to get back to the home page.", "401.help": "Não está autorizado a aceder a esta página. Pode utilizar o botão em baixo para voltar à página de início.", @@ -336,13 +336,13 @@ "admin.access-control.epeople.actions.delete": "Apagar utilizador", // "admin.access-control.epeople.actions.impersonate": "Impersonate EPerson", - "admin.access-control.epeople.actions.impersonate": "Assumir o papel do Utilizador", + "admin.access-control.epeople.actions.impersonate": "Assumir papel de utilizador", // "admin.access-control.epeople.actions.reset": "Reset password", "admin.access-control.epeople.actions.reset": "Redefinir password", // "admin.access-control.epeople.actions.stop-impersonating": "Stop impersonating EPerson", - "admin.access-control.epeople.actions.stop-impersonating": "Deixar de assumir o papel do utilizador", + "admin.access-control.epeople.actions.stop-impersonating": "Deixar de assumir o papel de utilizador", // "admin.access-control.epeople.breadcrumbs": "EPeople", "admin.access-control.epeople.breadcrumbs": "Utilizadores", @@ -777,19 +777,19 @@ "admin.search.item.withdraw": "Retirar", // "admin.search.title": "Administrative Search", - "admin.search.title": "Pesquisa Administrativa", + "admin.search.title": "Pesquisa administrativa", // "administrativeView.search.results.head": "Administrative Search", "administrativeView.search.results.head": "Pesquisa administrativa", // "admin.workflow.breadcrumbs": "Administer Workflow", - "admin.workflow.breadcrumbs": "Gestão do workflow", + "admin.workflow.breadcrumbs": "Gestão do fluxo de trabalho", // "admin.workflow.title": "Administer Workflow", - "admin.workflow.title": "Gestão do workflow", + "admin.workflow.title": "Gestão do fluxo de trabalho", // "admin.workflow.item.workflow": "Workflow", - "admin.workflow.item.workflow": "Workflow", + "admin.workflow.item.workflow": "Fluxo de trabalho", // "admin.workflow.item.workspace": "Workspace", "admin.workflow.item.workspace": "Área de trabalho", @@ -825,11 +825,14 @@ "admin.batch-import.page.header": "Importação em lote (batch)", // "admin.metadata-import.page.help": "You can drop or browse CSV files that contain batch metadata operations on files here", - "admin.metadata-import.page.help": "Pode arrastar ou procurar ficheiros .csv que contenham operações em lote de metadados", + "admin.metadata-import.page.help": "Pode arrastar ou procurar ficheiros .csv que contenham 'revisões' de metadados em lote", // "admin.batch-import.page.help": "Select the Collection to import into. Then, drop or browse to a Simple Archive Format (SAF) zip file that includes the Items to import", "admin.batch-import.page.help": "Selecione a coleção para a qual pretende importar. Em seguida, largue ou selecione ficheiro .zip em formato Simple Archive Format (SAF) que inclua os itens a importar.", + // "admin.batch-import.page.toggle.help": "It is possible to perform import either with file upload or via URL, use above toggle to set the input source", + "admin.batch-import.page.toggle.help": "É possível efetuar a importação com o carregamento de ficheiros ou através de URL. Utilize o botão de seleção em cima para definir a fonte de entrada", + // "admin.metadata-import.page.dropMsg": "Drop a metadata CSV to import", "admin.metadata-import.page.dropMsg": "Arraste ficheiro .csv para importar metadados", @@ -854,9 +857,21 @@ // "admin.metadata-import.page.error.addFile": "Select file first!", "admin.metadata-import.page.error.addFile": "Selecione um ficheiro!", + // "admin.metadata-import.page.error.addFileUrl": "Insert file url first!", + "admin.metadata-import.page.error.addFileUrl": "Insira primeiro o URL do ficheiro!", + // "admin.batch-import.page.error.addFile": "Select Zip file first!", "admin.batch-import.page.error.addFile": "Selecione primeiro o ficheiro .zip!", + // "admin.metadata-import.page.toggle.upload": "Upload", + "admin.metadata-import.page.toggle.upload": "Carregar", + + // "admin.metadata-import.page.toggle.url": "URL", + "admin.metadata-import.page.toggle.url": "URL", + + // "admin.metadata-import.page.urlMsg": "Insert the batch ZIP url to import", + "admin.metadata-import.page.urlMsg": "Insira o URL do lote ZIP a importar", + // "admin.metadata-import.page.validateOnly": "Validate Only", "admin.metadata-import.page.validateOnly": "Validar", @@ -1028,6 +1043,9 @@ // "bitstream.edit.notifications.error.format.title": "An error occurred saving the bitstream's format", "bitstream.edit.notifications.error.format.title": "Ocorreu um erro ao guardar o formato do ficheiro", + // "bitstream.edit.notifications.error.primaryBitstream.title": "An error occurred saving the primary bitstream", + "bitstream.edit.notifications.error.primaryBitstream.title": "Ocorreu um erro ao guardar o ficheiro primário", + // "bitstream.edit.form.iiifLabel.label": "IIIF Label", "bitstream.edit.form.iiifLabel.label": "IIIF Label", @@ -1130,6 +1148,9 @@ // "browse.comcol.by.subject": "By Subject", "browse.comcol.by.subject": "Por assunto", + // "browse.comcol.by.srsc": "By Subject Category", + "browse.comcol.by.srsc": "Por vocabulário controlado (SRSC)", + // "browse.comcol.by.title": "By Title", "browse.comcol.by.title": "Por título", @@ -1160,6 +1181,9 @@ // "browse.metadata.subject.breadcrumbs": "Browse by Subject", "browse.metadata.subject.breadcrumbs": "Percorrer por assunto", + // "browse.metadata.srsc.breadcrumbs": "Browse by Subject Category", + "browse.metadata.srsc.breadcrumbs": "Percorrer por vocabulário controlado (SRSC)", + // "browse.metadata.title.breadcrumbs": "Browse by Title", "browse.metadata.title.breadcrumbs": "Percorrer por título", @@ -1241,6 +1265,12 @@ // "browse.startsWith.type_text": "Filter results by typing the first few letters", "browse.startsWith.type_text": "Filtrar resultados inserindo as primeiras letras", + // "browse.startsWith.input": "Filter", + "browse.startsWith.input": "Filtrar", + + // "browse.taxonomy.button": "Browse", + "browse.taxonomy.button": "Pesquisar", + // "browse.title": "Browsing {{ collection }} by {{ field }}{{ startsWith }} {{ value }}", "browse.title": "Percorrer {{ collection }} por {{ field }}{{ startsWith }} {{ value }}", @@ -1287,7 +1317,7 @@ "collection.delete.head": "Apagar coleção", // "collection.delete.notification.fail": "Collection could not be deleted", - "collection.delete.notification.fail": "Coleção não pode ser apagada", + "collection.delete.notification.fail": "Não foi possível apagar a coleção", // "collection.delete.notification.success": "Successfully deleted collection", "collection.delete.notification.success": "Apagou a coleção com sucesso", @@ -1437,7 +1467,7 @@ "collection.edit.tabs.source.form.errors.oaiSource.required": "Deve indicar o identificador da coleção a ser agregado (set).", // "collection.edit.tabs.source.form.harvestType": "Content being harvested", - "collection.edit.tabs.source.form.harvestType": "Os conteúdo estão a ser agregados", + "collection.edit.tabs.source.form.harvestType": "Os conteúdos estão a ser agregados", // "collection.edit.tabs.source.form.head": "Configure an external source", "collection.edit.tabs.source.form.head": "Configure uma fonte externa", @@ -1559,7 +1589,7 @@ // "collection.page.edit": "Edit this collection", "collection.page.edit": "Editar esta coleção", - // "collection.page.handle": "Permanent URI for this collection:", + // "collection.page.handle": "Permanent URI for this collection", "collection.page.handle": "URI permanente para esta coleção:", // "collection.page.license": "License", @@ -1955,11 +1985,11 @@ // "cookies.consent.content-modal.title": "Information that we collect", "cookies.consent.content-modal.title": "Informação que recolhemos", - // "cookies.consent.content-modal.services": "Services", - "cookies.consent.content-modal.services": "Serviços", + // "cookies.consent.content-modal.services": "services", + "cookies.consent.content-modal.services": "serviços", - // "cookies.consent.content-modal.service": "Service", - "cookies.consent.content-modal.service": "Serviço", + // "cookies.consent.content-modal.service": "service", + "cookies.consent.content-modal.service": "serviço", // "cookies.consent.app.title.authentication": "Authentication", "cookies.consent.app.title.authentication": "Autenticação", @@ -1977,7 +2007,7 @@ "cookies.consent.app.title.acknowledgement": "Termos de Uso", // "cookies.consent.app.description.acknowledgement": "Required for saving your acknowledgements and consents", - "cookies.consent.app.description.acknowledgement": "Obrigatório para guardar os 'Termos de Uso' e 'Consentimentos'", + "cookies.consent.app.description.acknowledgement": "Obrigatório para guardar os nossos 'Termos de Uso' e 'Consentimentos'", // "cookies.consent.app.title.google-analytics": "Google Analytics", "cookies.consent.app.title.google-analytics": "Google Analytics", @@ -2333,6 +2363,26 @@ // "error.validation.groupExists": "This group already exists", "error.validation.groupExists": "Este grupo já existe!", + // "error.validation.metadata.name.invalid-pattern": "This field cannot contain dots, commas or spaces. Please use the Element & Qualifier fields instead", + + // "error.validation.metadata.name.max-length": "This field may not contain more than 32 characters", + "error.validation.metadata.name.max-length": "Este campo não pode conter mais de 32 caracteres", + + // "error.validation.metadata.namespace.max-length": "This field may not contain more than 256 characters", + "error.validation.metadata.namespace.max-length": "Este campo não pode conter mais de 256 caracteres", + + // "error.validation.metadata.element.invalid-pattern": "This field cannot contain dots, commas or spaces. Please use the Qualifier field instead", + "error.validation.metadata.element.invalid-pattern": "Este campo não pode conter pontos, vírgulas ou espaços. Ao invés, utilize o campo 'Qualificador'", + + // "error.validation.metadata.element.max-length": "This field may not contain more than 64 characters", + "error.validation.metadata.element.max-length": "Este campo não pode conter mais de 64 caracteres", + + // "error.validation.metadata.qualifier.invalid-pattern": "This field cannot contain dots, commas or spaces", + "error.validation.metadata.qualifier.invalid-pattern": "Este campo não pode conter pontos, vírgulas ou espaços.", + + // "error.validation.metadata.qualifier.max-length": "This field may not contain more than 64 characters", + "error.validation.metadata.qualifier.max-length": "Este campo não pode conter mais de 64 caracteres.", + // "feed.description": "Syndication feed", "feed.description": "Feed", @@ -2343,7 +2393,7 @@ "footer.copyright": "Copyright © 2003-{{ year }}", // "footer.link.dspace": "DSpace software", - "footer.link.dspace": "Software DSpace", + "footer.link.dspace": "Powered by DSpace", // "footer.link.lyrasis": "LYRASIS", "footer.link.lyrasis": "LYRASIS", @@ -2543,8 +2593,8 @@ // "grant-deny-request-copy.email.back": "Back", "grant-deny-request-copy.email.back": "Voltar", - // "grant-deny-request-copy.email.message": "Message", - "grant-deny-request-copy.email.message": "Mensagem", + // "grant-deny-request-copy.email.message": "Optional additional message", + "grant-deny-request-copy.email.message": "Mensagem adicional opcional", // "grant-deny-request-copy.email.message.empty": "Please enter a message", "grant-deny-request-copy.email.message.empty": "Por favor insira uma mensagem", @@ -2582,9 +2632,6 @@ // "grant-deny-request-copy.processed": "This request has already been processed. You can use the button below to get back to the home page.", "grant-deny-request-copy.processed": "Este pedido já foi processado. Pode utilizar o botão em baixo para voltar para a página principal.", - // "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": "Caro {{ recipientName }},\nEm resposta ao seu pedido de cópia, tenho o prazer de lhe enviar em anexo uma cópia do(s) ficheiro(s) relativo(s) ao documento: \"{{ itemUrl }}\" ({{ itemName }}), do qual sou autor.\n\nCom os melhores cumprimentos,\n{{ authorName }} <{{ authorEmail }}>", - // "grant-request-copy.email.subject": "Request copy of document", "grant-request-copy.email.subject": "Pedido de cópia de documento", @@ -2594,7 +2641,7 @@ // "grant-request-copy.header": "Grant document copy request", "grant-request-copy.header": "Conceder cópia de documento", - // "grant-request-copy.intro": "This message will be sent to the applicant of the request. The requested document(s) will be attached.", + // "grant-request-copy.intro": "A message will be sent to the applicant of the request. The requested document(s) will be attached.", "grant-request-copy.intro": "Esta mensagem será enviada ao requerente do pedido de cópia. Os ficheiros solicitado(s) serão anexado(s) à mensagem.", // "grant-request-copy.success": "Successfully granted item request", @@ -2702,6 +2749,9 @@ // "info.end-user-agreement.title": "End User Agreement", "info.end-user-agreement.title": "Termos de Uso", + // "info.end-user-agreement.hosting-country": "the United States", + "info.end-user-agreement.hosting-country": "Portugal", + // "info.privacy.breadcrumbs": "Privacy Statement", "info.privacy.breadcrumbs": "Política de Privacidade", @@ -3613,19 +3663,8 @@ // "item.preview.dc.relation.issn": "ISSN", "item.preview.dc.relation.issn": "ISSN", - - // "item.preview.dc.relation.eissn": "EISSN", - "item.preview.dc.relation.eissn": "EISSN", - // "item.preview.dc.identifier.isbn": "ISBN", "item.preview.dc.identifier.isbn": "ISBN", - - // "item.preview.dc.identifier.eisbn": "EISBN", - "item.preview.dc.identifier.eisbn": "EISBN", - - // "item.preview.dc.identifier.tid": "TID", - "item.preview.dc.identifier.tid": "TID", - // "item.preview.dc.identifier": "Identifier:", "itemm.preview.dc.identifier": "Identificador:", @@ -3635,6 +3674,9 @@ // "item.preview.dc.identifier.doi": "DOI", "item.preview.dc.identifier.doi": "DOI", + // "item.preview.dc.publisher": "Publisher:", + "item.preview.dc.publisher": "Editora:", + // "item.preview.person.familyName": "Surname:", "item.preview.person.familyName": "Apelido:", @@ -3711,7 +3753,7 @@ "item.version.history.table.workspaceItem": "Área de trabalho do item", // "item.version.history.table.workflowItem": "Workflow item", - "item.version.history.table.workflowItem": "Área de trabalho do item", + "item.version.history.table.workflowItem": "Fluxo de trabalho do item", // "item.version.history.table.actions": "Action", "item.version.history.table.actions": "Ação", @@ -4148,6 +4190,9 @@ // "menu.section.browse_global_by_subject": "By Subject", "menu.section.browse_global_by_subject": "Por assunto", + // "menu.section.browse_global_by_srsc": "By Subject Category", + "menu.section.browse_global_by_srsc": "Por vocabulário controlado (SRSC)", + // "menu.section.browse_global_by_title": "By Title", "menu.section.browse_global_by_title": "Por título", @@ -4191,34 +4236,34 @@ "menu.section.export_batch": "Importação em lote (ZIP)", // "menu.section.icon.access_control": "Access Control menu section", - "menu.section.icon.access_control": "Secção do menu Controle de Acesso", + "menu.section.icon.access_control": "Secção do menu controle de acesso", // "menu.section.icon.admin_search": "Admin search menu section", - "menu.section.icon.admin_search": "Secção do menu de Pesquisa Administrativa", + "menu.section.icon.admin_search": "Secção do menu pesquisa administrativa", // "menu.section.icon.control_panel": "Control Panel menu section", - "menu.section.icon.control_panel": "Secção do menu Painel de Controlo", + "menu.section.icon.control_panel": "Secção do menu painel de controlo", // "menu.section.icon.curation_tasks": "Curation Task menu section", "menu.section.icon.curation_tasks": "Secção do menu tarefas de curadoria", // "menu.section.icon.edit": "Edit menu section", - "menu.section.icon.edit": "Secção do menu Editar", + "menu.section.icon.edit": "Secção do menu editar", // "menu.section.icon.export": "Export menu section", - "menu.section.icon.export": "Secção do menu Exportar", + "menu.section.icon.export": "Secção do menu exportar", // "menu.section.icon.find": "Find menu section", - "menu.section.icon.find": "Secção do menu Pesquisar", + "menu.section.icon.find": "Secção do menu pesquisar", // "menu.section.icon.health": "Health check menu section", - "menu.section.icon.health": "Seção do menu Diagnóstico do sistema", + "menu.section.icon.health": "Seção do menu diagnóstico do sistema", // "menu.section.icon.import": "Import menu section", - "menu.section.icon.import": "Secção do menu Importar", + "menu.section.icon.import": "Secção do menu importar", // "menu.section.icon.new": "New menu section", - "menu.section.icon.new": "Secção do menu Novo", + "menu.section.icon.new": "Secção do menu novo", // "menu.section.icon.pin": "Pin sidebar", "menu.section.icon.pin": "Fixar barra lateral", @@ -4227,13 +4272,13 @@ "menu.section.icon.processes": "Processos diagnóstico", // "menu.section.icon.registries": "Registries menu section", - "menu.section.icon.registries": "Secção do menu Registos", + "menu.section.icon.registries": "Secção do menu registos", // "menu.section.icon.statistics_task": "Statistics Task menu section", - "menu.section.icon.statistics_task": "Secção do menu Tarefas de Estatísticas", + "menu.section.icon.statistics_task": "Secção do menu tarefas de estatísticas", // "menu.section.icon.workflow": "Administer workflow menu section", - "menu.section.icon.workflow": "Menu administração de tarefas", + "menu.section.icon.workflow": "Secção do menu de administração do fluxo de trabalho", // "menu.section.icon.unpin": "Unpin sidebar", "menu.section.icon.unpin": "Soltar barra lateral", @@ -4323,7 +4368,7 @@ "menu.section.toggle.statistics_task": "Alternar secção tarefas de estatísticas", // "menu.section.workflow": "Administer Workflow", - "menu.section.workflow": "Gestão do workflow", + "menu.section.workflow": "Gestão do fluxo de trabalho", // "metadata-export-search.tooltip": "Export search results as CSV", "metadata-export-search.tooltip": "Exportar resultados de pesquisa em CSV", @@ -4335,7 +4380,7 @@ "metadata-export-search.submit.error": "O início da exportação falhou!", // "mydspace.breadcrumbs": "MyDSpace", - "mydspace.breadcrumbs": "Área Pessoal", + "mydspace.breadcrumbs": "Área pessoal", // "mydspace.description": "", "mydspace.description": "", @@ -4416,7 +4461,7 @@ "mydspace.results.no-uri": "Sem URI", // "mydspace.search-form.placeholder": "Search in mydspace...", - "mydspace.search-form.placeholder": "Pesquisar na Área Pessoal...", + "mydspace.search-form.placeholder": "Pesquisar na área pessoal...", // "mydspace.show.workflow": "Workflow tasks", "mydspace.show.workflow": "Todas as tarefas", @@ -4443,7 +4488,7 @@ "mydspace.status.mydspaceWorkspace": "Depósito por terminar", // "mydspace.title": "MyDSpace", - "mydspace.title": "Área Pessoal", + "mydspace.title": "Área pessoal", // "mydspace.upload.upload-failed": "Error creating new workspace. Please verify the content uploaded before retry.", "mydspace.upload.upload-failed": "Erro ao criar novo espaço de trabalho. Por favor verifique o conteúdo enviado antes de tentar novamente.", @@ -4485,7 +4530,7 @@ "nav.main.description": "Barra de naveção principal", // "nav.mydspace": "MyDSpace", - "nav.mydspace": "Área Pessoal", + "nav.mydspace": "Área pessoal", // "nav.profile": "Profile", "nav.profile": "Perfil", @@ -5147,11 +5192,11 @@ // "repository.image.logo": "Repository logo", "repository.image.logo": "Logótipo do repositório", - // "repository.title.prefix": "DSpace Angular :: ", - "repository.title.prefix": "Repositório :: ", + // "repository.title": "DSpace Repository", + "repository.title": "Repositório :: ", - // "repository.title.prefixDSpace": "DSpace Angular ::", - "repository.title.prefixDSpace": "Repositório ::", + // "repository.title.prefix": "DSpace Repository :: ", + "repository.title.prefix": "Repositório :: ", // "resource-policies.add.button": "Add", "resource-policies.add.button": "Adicionar", @@ -5724,22 +5769,22 @@ "sorting.score.DESC": "Mais relevante", // "sorting.dc.date.issued.ASC": "Date Issued Ascending", - "sorting.dc.date.issued.ASC": "Data de publicação ascendente", + "sorting.dc.date.issued.ASC": "Data publicação ascendente", // "sorting.dc.date.issued.DESC": "Date Issued Descending", - "sorting.dc.date.issued.DESC": "Data de publicação descendente", + "sorting.dc.date.issued.DESC": "Data publicação descendente", // "sorting.dc.date.accessioned.ASC": "Accessioned Date Ascending", - "sorting.dc.date.accessioned.ASC": "Data de disponibilização ascendente", + "sorting.dc.date.accessioned.ASC": "Data depósito ascendente", // "sorting.dc.date.accessioned.DESC": "Accessioned Date Descending", - "sorting.dc.date.accessioned.DESC": "Data de disponibilização descendente", + "sorting.dc.date.accessioned.DESC": "Data depósito descendente", // "sorting.lastModified.ASC": "Last modified Ascending", - "sorting.lastModified.ASC": "Última modificação ascendente", + "sorting.lastModified.ASC": "Última alteração ascendente", // "sorting.lastModified.DESC": "Last modified Descending", - "sorting.lastModified.DESC": "Última modificação descendente", + "sorting.lastModified.DESC": "Última alteração descendente", // "statistics.title": "Statistics", "statistics.title": "Estatísticas", @@ -5786,7 +5831,7 @@ // "submission.general.cancel": "Cancel", "submission.general.cancel": "Cancelar", - // "submission.general.cannot_submit": "You have not the privilege to make a new submission.", + // "submission.general.cannot_submit": "You don't have permission to make a new submission.", "submission.general.cannot_submit": "Não possui permissões para fazer um novo depósito.", // "submission.general.deposit": "Deposit", @@ -6828,13 +6873,13 @@ "submission.workflow.tasks.claimed.reject.submit": "Rejeitar", // "submission.workflow.tasks.claimed.reject_help": "If you have reviewed the item and found it is not suitable for inclusion in the collection, select \"Reject\". You will then be asked to enter a message indicating why the item is unsuitable, and whether the submitter should change something and resubmit.", - "submission.workflow.tasks.claimed.reject_help": "Se reviu o item e achou que ele não é adequado para inclusão na coleção, selecione \"Rejeitar\". Deverá indicar numa mensagem o motivo da rejeição e se o depositante deve modificar algo e reenviar.", + "submission.workflow.tasks.claimed.reject_help": "Se reviu o item e acha que não está em conformidade para inclusão na coleção, clique em 'Rejeitar'. Deverá indicar o motivo da rejeição e/ou se o depositante pode rever algo para o reenviar.", // "submission.workflow.tasks.claimed.return": "Return to pool", - "submission.workflow.tasks.claimed.return": "Voltar para a listagem", + "submission.workflow.tasks.claimed.return": "Libertar tarefa", // "submission.workflow.tasks.claimed.return_help": "Return the task to the pool so that another user may perform the task.", - "submission.workflow.tasks.claimed.return_help": "Enviar a tarefa para a lista para que outra pessoa possa executar.", + "submission.workflow.tasks.claimed.return_help": "Libertar esta tarefa para que outra pessoa a possa executar.", // "submission.workflow.tasks.generic.error": "Error occurred during operation...", "submission.workflow.tasks.generic.error": "ocorreu um erro durante a operação...", @@ -6849,7 +6894,7 @@ "submission.workflow.tasks.generic.success": "Operação realizada com sucesso", // "submission.workflow.tasks.pool.claim": "Claim", - "submission.workflow.tasks.pool.claim": "Assumir", + "submission.workflow.tasks.pool.claim": "Assumir tarefa", // "submission.workflow.tasks.pool.claim_help": "Assign this task to yourself.", "submission.workflow.tasks.pool.claim_help": "Assumir esta tarefa", @@ -7059,37 +7104,37 @@ "workspace.search.results.head": "Os meus depósitos", // "workflowAdmin.search.results.head": "Administer Workflow", - "workflowAdmin.search.results.head": "Gestão do workflow", + "workflowAdmin.search.results.head": "Gestão do fluxo de trabalho", // "workflow.search.results.head": "Workflow tasks", - "workflow.search.results.head": "Tarefas em workflow", + "workflow.search.results.head": "Tarefas em fluxo de trabalho", // "supervision.search.results.head": "Workflow and Workspace tasks", - "supervision.search.results.head": "Workflow e tarefas na área de trabalho", + "supervision.search.results.head": "Depósitos e tarefas em áreas de trabalho", // "workflow-item.edit.breadcrumbs": "Edit workflowitem", - "workflow-item.edit.breadcrumbs": "Editar item em processamento", + "workflow-item.edit.breadcrumbs": "Editar item em fluxo de trabalho", // "workflow-item.edit.title": "Edit workflowitem", - "workflow-item.edit.title": "Editar item em processamento", + "workflow-item.edit.title": "Editar item em em fluxo de trabalho", // "workflow-item.delete.notification.success.title": "Deleted", "workflow-item.delete.notification.success.title": "Apagado", // "workflow-item.delete.notification.success.content": "This workflow item was successfully deleted", - "workflow-item.delete.notification.success.content": "Este item do workflow foi apagado com sucesso", + "workflow-item.delete.notification.success.content": "Este item em fluxo de trabalho foi apagado com sucesso", // "workflow-item.delete.notification.error.title": "Something went wrong", "workflow-item.delete.notification.error.title": "Algo correu mal", // "workflow-item.delete.notification.error.content": "The workflow item could not be deleted", - "workflow-item.delete.notification.error.content": "Não foi possível apagar o item do workflow", + "workflow-item.delete.notification.error.content": "Não foi possível apagar o item do fluxo de trabalho", // "workflow-item.delete.title": "Delete workflow item", - "workflow-item.delete.title": "Apagar item do workflow", + "workflow-item.delete.title": "Apagar item do fluxo de trabalho", // "workflow-item.delete.header": "Delete workflow item", - "workflow-item.delete.header": "Apagar item do workflow", + "workflow-item.delete.header": "Apagar item do fluxo de trabalho", // "workflow-item.delete.button.cancel": "Cancel", "workflow-item.delete.button.cancel": "Cancelar", @@ -7107,13 +7152,13 @@ "workflow-item.send-back.notification.error.title": "Algo correu mal", // "workflow-item.send-back.notification.error.content": "The workflow item could not be sent back to the submitter", - "workflow-item.send-back.notification.error.content": "Não foi pos´sivel enviar ao depositante este item do workflow", + "workflow-item.send-back.notification.error.content": "Não foi possível reenviar ao depositante este item em workflow", // "workflow-item.send-back.title": "Send workflow item back to submitter", - "workflow-item.send-back.title": "Enviar item do workflow para o depositante", + "workflow-item.send-back.title": "Enviar item em fluxo de trabalho para o depositante", // "workflow-item.send-back.header": "Send workflow item back to submitter", - "workflow-item.send-back.header": "Enviar item do workflow para o depositante", + "workflow-item.send-back.header": "Enviar item em fluxo de trabalho para o depositante", // "workflow-item.send-back.button.cancel": "Cancel", "workflow-item.send-back.button.cancel": "Cancelar", @@ -7146,10 +7191,10 @@ "workspace-item.delete.notification.success.title": "Apagado", // "workspace-item.delete.title": "This workspace item was successfully deleted", - "workspace-item.delete.title": "Este item foi removido da área de trabalho com êxito", + "workspace-item.delete.title": "Este item foi removido, com êxito, da área de trabalho", // "workspace-item.delete.notification.error.title": "Something went wrong", - "workspace-item.delete.notification.error.title": "Ocorreu algum erro!", + "workspace-item.delete.notification.error.title": "Ocorreu um erro!", // "workspace-item.delete.notification.error.content": "The workspace item could not be deleted", "workspace-item.delete.notification.error.content": "Não foi possível remover o item da área de trabalho", @@ -7274,8 +7319,8 @@ // "researcherprofile.success.claim.title": "Success", "researcherprofile.success.claim.title": "Sucesso", - // "person.page.orcid.create": "Create an ORCID iD", - "person.page.orcid.create": "Criar um ORCID iD", + // "person.page.orcid.create": "Create an ORCID ID", + "person.page.orcid.create": "Criar um ORCID ID", // "person.page.orcid.granted-authorizations": "Granted authorizations", "person.page.orcid.granted-authorizations": "Autorizações concedidas", @@ -7283,8 +7328,8 @@ // "person.page.orcid.grant-authorizations": "Grant authorizations", "person.page.orcid.grant-authorizations": "Conceder autorizações", - // "person.page.orcid.link": "Connect to ORCID iD", - "person.page.orcid.link": "Ligar ao ORCID iD", + // "person.page.orcid.link": "Connect to ORCID ID", + "person.page.orcid.link": "Ligar ao ORCID ID", // "person.page.orcid.link.processing": "Linking profile to ORCID...", "person.page.orcid.link.processing": "Ligação do perfil ao ORCID...", @@ -7663,8 +7708,40 @@ // Other strings... // Missing, Duplicate or Redundant ??? - // NOT FOUND 30-05-2023 + // NOT FOUND 16-06-2023 + // "browse.metadata.srsc": "Subject Category", + "browse.metadata.srsc": "vocabulário controlado (SRSC)", + + // "mydspace.status.archived": "Archived", + "mydspace.status.archived": "Depositado", + + // "mydspace.status.validation": "Validation", + "mydspace.status.validation": "Em validação", + + // "mydspace.status.waiting-for-controller": "Waiting for Controller", + "mydspace.status.waiting-for-controller": "Aguarda validador", + + // "mydspace.status.workflow": "Workflow", + "mydspace.status.workflow": "Em fluxo de trabalho", + + // "mydspace.status.workspace": "Workspace", + "mydspace.status.workspace": "Depósito por terminar", + + // "search.filters.namedresourcetype.Archived": "Archived", + "search.filters.namedresourcetype.Archived": "Depositado", + + // "search.filters.namedresourcetype.Validation": "Validation", + "search.filters.namedresourcetype.Validation": "Em validação", + + // "search.filters.namedresourcetype.waitingforcontroller": "Waiting for Controller", + "search.filters.namedresourcetype.waitingforcontroller": "Aguarda validador", + + // "search.filters.namedresourcetype.Workflow": "Workflow", + "search.filters.namedresourcetype.Workflow": "Em fluxo de trabalho", + + // "search.filters.namedresourcetype.Workspace": "Workspace", + "search.filters.namedresourcetype.Workspace": "Por terminar", // "datafile.listelement.badge": "Data file", "datafile.listelement.badge": "Ficheiro de dados", @@ -7694,21 +7771,21 @@ "register-page.create-profile.security.error.password-length": "A senha deve possuir pelo menos 6 caracteres.", // "search.form.search_mydspace": "Search MyDSpace", - "search.form.search_mydspace": "Pesquisar na Área Pessoal", + "search.form.search_mydspace": "Pesquisar na área pessoal", // "forgot-password.form.error.password-length": "The password should be at least 6 characters long.", "forgot-password.form.error.password-length": "A senha deve ter pelo menos 6 caracteres.", - // "search.filters.entityType.Publication": "Publicação", + // "search.filters.entityType.Publication": "Publication", "search.filters.entityType.Publication": "Publicação", - // "search.filters.entityType.Person": "Pessoa", + // "search.filters.entityType.Person": "Person", "search.filters.entityType.Person": "Pessoa", - // "search.filters.entityType.Project": "Projecto", + // "search.filters.entityType.Project": "Project", "search.filters.entityType.Project": "Projeto", - // "search.filters.entityType.Journal": "Revista", + // "search.filters.entityType.Journal": "Journal", "search.filters.entityType.Journal": "Revista", // "search.filters.entityType.DataFile": "Data File", @@ -7723,18 +7800,6 @@ // "submission.sections.describe.relationship-lookup.external-source.import-modal.isProjectOfPublication.added.local-entity": "Successfully imported and added external project to the selection", "submission.sections.describe.relationship-lookup.external-source.import-modal.isProjectOfPublication.added.local-entity": "Importado com sucesso e adicionado autor à seleção", - // "search.filters.namedresourcetype.Archived": "Archived", - "search.filters.namedresourcetype.Archived": "Aceites", - - // "search.filters.namedresourcetype.Workspace": "Workspace", - "search.filters.namedresourcetype.Workspace": "Por terminar", - - // "search.filters.namedresourcetype.Workflow": "Workflow", - "search.filters.namedresourcetype.Workflow": "Em fluxo de trabalho", - - // "search.filters.namedresourcetype.Validation": "Validation", - "search.filters.namedresourcetype.Validation": "Em validação", - // "orgunit.search.results.head": "Organizational Unit Search Results", "orgunit.search.results.head": "Resultados da pesquisa de organizações", @@ -7747,4 +7812,13 @@ // "journalissue-relationships.search.results.head": "Journal Issue Search Results", "journalissue-relationships.search.results.head": "Resultados da pesquisa de números", + // "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": "Caro {{ recipientName }},\nEm resposta ao seu pedido de cópia, tenho o prazer de lhe enviar em anexo uma cópia do(s) ficheiro(s) relativo(s) ao documento: \"{{ itemUrl }}\" ({{ itemName }}), do qual sou autor.\n\nCom os melhores cumprimentos,\n{{ authorName }} <{{ authorEmail }}>", + + // "item.preview.dc.relation.eissn": "EISSN", + "item.preview.dc.relation.eissn": "EISSN", + + // "item.preview.dc.identifier.eisbn": "EISBN", + "item.preview.dc.identifier.eisbn": "EISBN", + } From c63001c205313d963c4ad5a4a63dd582fc8df71f Mon Sep 17 00:00:00 2001 From: "Mark H. Wood" Date: Fri, 16 Jun 2023 16:08:18 -0400 Subject: [PATCH 379/409] Fix illogical templateUrl paths. Add missed DenyRequestCopyComponent. --- .../themed-deny-request-copy.component.ts | 26 +++++++++++++++++++ .../themed-email-request-copy.component.ts | 1 - .../request-copy-routing.module.ts | 4 +-- src/app/request-copy/request-copy.module.ts | 5 ++++ .../deny-request-copy.component.ts | 2 +- .../email-request-copy.component.ts | 2 +- .../grant-request-copy.component.ts | 2 +- src/themes/custom/lazy-theme.module.ts | 2 ++ 8 files changed, 38 insertions(+), 6 deletions(-) create mode 100644 src/app/request-copy/deny-request-copy/themed-deny-request-copy.component.ts diff --git a/src/app/request-copy/deny-request-copy/themed-deny-request-copy.component.ts b/src/app/request-copy/deny-request-copy/themed-deny-request-copy.component.ts new file mode 100644 index 0000000000..664e4c541b --- /dev/null +++ b/src/app/request-copy/deny-request-copy/themed-deny-request-copy.component.ts @@ -0,0 +1,26 @@ +import { Component } from '@angular/core'; +import { ThemedComponent } from 'src/app/shared/theme-support/themed.component'; + +import { DenyRequestCopyComponent } from 'src/themes/custom/app/request-copy/deny-request-copy/deny-request-copy.component'; + +/** + * Themed wrapper for deny-request-copy.component + */ +@Component({ + selector: 'ds-themed-deny-request-copy', + styleUrls: [], + templateUrl: './../../shared/theme-support/themed.component.html', +}) +export class ThemedDenyRequestCopyComponent extends ThemedComponent { + protected getComponentName(): string { + return 'DenyRequestCopyComponent'; + } + + protected importThemedComponent(themeName: string): Promise { + return import(`../../../themes/${themeName}/app/request-copy/deny-request-copy/deny-request-copy.component`); + } + + protected importUnthemedComponent(): Promise { + return import('./deny-request-copy.component'); + } +} diff --git a/src/app/request-copy/email-request-copy/themed-email-request-copy.component.ts b/src/app/request-copy/email-request-copy/themed-email-request-copy.component.ts index 6b808288ad..d010e43060 100644 --- a/src/app/request-copy/email-request-copy/themed-email-request-copy.component.ts +++ b/src/app/request-copy/email-request-copy/themed-email-request-copy.component.ts @@ -12,7 +12,6 @@ import { RequestCopyEmail } from './request-copy-email.model'; styleUrls: [], templateUrl: './../../shared/theme-support/themed.component.html', }) - export class ThemedEmailRequestCopyComponent extends ThemedComponent { /** * Event emitter for sending the email diff --git a/src/app/request-copy/request-copy-routing.module.ts b/src/app/request-copy/request-copy-routing.module.ts index c3ac0be46a..4138fc42a6 100644 --- a/src/app/request-copy/request-copy-routing.module.ts +++ b/src/app/request-copy/request-copy-routing.module.ts @@ -3,7 +3,7 @@ import { RouterModule } from '@angular/router'; import { RequestCopyResolver } from './request-copy.resolver'; import { GrantDenyRequestCopyComponent } from './grant-deny-request-copy/grant-deny-request-copy.component'; import { REQUEST_COPY_DENY_PATH, REQUEST_COPY_GRANT_PATH } from './request-copy-routing-paths'; -import { DenyRequestCopyComponent } from './deny-request-copy/deny-request-copy.component'; +import { ThemedDenyRequestCopyComponent } from './deny-request-copy/themed-deny-request-copy.component'; import { ThemedGrantRequestCopyComponent } from './grant-request-copy/themed-grant-request-copy.component'; @NgModule({ @@ -21,7 +21,7 @@ import { ThemedGrantRequestCopyComponent } from './grant-request-copy/themed-gra }, { path: REQUEST_COPY_DENY_PATH, - component: DenyRequestCopyComponent, + component: ThemedDenyRequestCopyComponent, }, { path: REQUEST_COPY_GRANT_PATH, diff --git a/src/app/request-copy/request-copy.module.ts b/src/app/request-copy/request-copy.module.ts index b5ea3da50c..90d741a879 100644 --- a/src/app/request-copy/request-copy.module.ts +++ b/src/app/request-copy/request-copy.module.ts @@ -4,6 +4,7 @@ import { SharedModule } from '../shared/shared.module'; import { GrantDenyRequestCopyComponent } from './grant-deny-request-copy/grant-deny-request-copy.component'; import { RequestCopyRoutingModule } from './request-copy-routing.module'; import { DenyRequestCopyComponent } from './deny-request-copy/deny-request-copy.component'; +import { ThemedDenyRequestCopyComponent } from './deny-request-copy/themed-deny-request-copy.component'; import { EmailRequestCopyComponent } from './email-request-copy/email-request-copy.component'; import { ThemedEmailRequestCopyComponent } from './email-request-copy/themed-email-request-copy.component'; import { GrantRequestCopyComponent } from './grant-request-copy/grant-request-copy.component'; @@ -18,11 +19,15 @@ import { ThemedGrantRequestCopyComponent } from './grant-request-copy/themed-gra declarations: [ GrantDenyRequestCopyComponent, DenyRequestCopyComponent, + ThemedDenyRequestCopyComponent, EmailRequestCopyComponent, ThemedEmailRequestCopyComponent, GrantRequestCopyComponent, ThemedGrantRequestCopyComponent, ], + exports: [ + ThemedEmailRequestCopyComponent, + ], providers: [] }) diff --git a/src/themes/custom/app/request-copy/deny-request-copy/deny-request-copy.component.ts b/src/themes/custom/app/request-copy/deny-request-copy/deny-request-copy.component.ts index fb65aae9bc..628b2b3f83 100644 --- a/src/themes/custom/app/request-copy/deny-request-copy/deny-request-copy.component.ts +++ b/src/themes/custom/app/request-copy/deny-request-copy/deny-request-copy.component.ts @@ -8,7 +8,7 @@ import { // styleUrls: ['./deny-request-copy.component.scss'], styleUrls: [], // templateUrl: './deny-request-copy.component.html', - templateUrl: './../../request-copy/deny-request-copy/deny-request-copy.component.html', + templateUrl: './../../../../../app/request-copy/deny-request-copy/deny-request-copy.component.html', }) export class DenyRequestCopyComponent extends BaseComponent { diff --git a/src/themes/custom/app/request-copy/email-request-copy/email-request-copy.component.ts b/src/themes/custom/app/request-copy/email-request-copy/email-request-copy.component.ts index d4da93a99f..a0274f6efd 100644 --- a/src/themes/custom/app/request-copy/email-request-copy/email-request-copy.component.ts +++ b/src/themes/custom/app/request-copy/email-request-copy/email-request-copy.component.ts @@ -8,7 +8,7 @@ import { // styleUrls: ['./email-request-copy.component.scss'], styleUrls: [], // templateUrl: './email-request-copy.component.html', - templateUrl: './../../request-copy/email-request-copy/email-request-copy.component.html', + templateUrl: './../../../../../app/request-copy/email-request-copy/email-request-copy.component.html', }) export class EmailRequestCopyComponent extends BaseComponent { diff --git a/src/themes/custom/app/request-copy/grant-request-copy/grant-request-copy.component.ts b/src/themes/custom/app/request-copy/grant-request-copy/grant-request-copy.component.ts index 20d0ae90c1..446044942e 100644 --- a/src/themes/custom/app/request-copy/grant-request-copy/grant-request-copy.component.ts +++ b/src/themes/custom/app/request-copy/grant-request-copy/grant-request-copy.component.ts @@ -8,7 +8,7 @@ import { // styleUrls: ['./grant-request-copy.component.scss'], styleUrls: [], // templateUrl: './grant-request-copy.component.html', - templateUrl: './../../request-copy/grant-request-copy/grant-request-copy.component.html', + templateUrl: './../../../../../app/request-copy/grant-request-copy/grant-request-copy.component.html', }) export class GrantRequestCopyComponent extends BaseComponent { diff --git a/src/themes/custom/lazy-theme.module.ts b/src/themes/custom/lazy-theme.module.ts index 6ec946a6ba..b0f94d3ab7 100644 --- a/src/themes/custom/lazy-theme.module.ts +++ b/src/themes/custom/lazy-theme.module.ts @@ -153,6 +153,7 @@ import { ThumbnailComponent } from './app/thumbnail/thumbnail.component'; import { ItemStatusComponent } from './app/item-page/edit-item-page/item-status/item-status.component'; import { EditBitstreamPageComponent } from './app/bitstream-page/edit-bitstream-page/edit-bitstream-page.component'; import { FormModule } from '../../app/shared/form/form.module'; +import { RequestCopyModule } from 'src/app/request-copy/request-copy.module'; const DECLARATIONS = [ FileSectionComponent, @@ -293,6 +294,7 @@ const DECLARATIONS = [ SystemWideAlertModule, NgxGalleryModule, FormModule, + RequestCopyModule, ], declarations: DECLARATIONS, exports: [ From d2663670706f7a93e13c67f5262469ee77328a99 Mon Sep 17 00:00:00 2001 From: Tom Misilo <1446856+misilot@users.noreply.github.com> Date: Fri, 16 Jun 2023 15:37:15 -0500 Subject: [PATCH 380/409] Fix typo for the word Series --- src/assets/i18n/en.json5 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/assets/i18n/en.json5 b/src/assets/i18n/en.json5 index da9c67cbd4..0c651991ae 100644 --- a/src/assets/i18n/en.json5 +++ b/src/assets/i18n/en.json5 @@ -2474,7 +2474,7 @@ "item.preview.dc.identifier": "Identifier:", - "item.preview.dc.relation.ispartof": "Journal or Serie", + "item.preview.dc.relation.ispartof": "Journal or Series", "item.preview.dc.identifier.doi": "DOI", From 00aa0271f2e5e5671a3b8a183188e3ec3dbb07aa Mon Sep 17 00:00:00 2001 From: Alan Orth Date: Mon, 19 Jun 2023 09:50:46 +0300 Subject: [PATCH 381/409] src/assets/i18n: update English strings Re-word two messages for better English and consistency with other similar strings. --- src/assets/i18n/en.json5 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/assets/i18n/en.json5 b/src/assets/i18n/en.json5 index 0c651991ae..6c91bae4c1 100644 --- a/src/assets/i18n/en.json5 +++ b/src/assets/i18n/en.json5 @@ -1298,9 +1298,9 @@ "community.all-lists.head": "Subcommunities and Collections", - "community.sub-collection-list.head": "Collections of this Community", + "community.sub-collection-list.head": "Collections in this Community", - "community.sub-community-list.head": "Communities of this Community", + "community.sub-community-list.head": "Communities in this Community", "cookies.consent.accept-all": "Accept all", From 4eb229791052713fd5d15775f8251b853a48000b Mon Sep 17 00:00:00 2001 From: Davide Negretti Date: Mon, 19 Jun 2023 13:24:10 +0200 Subject: [PATCH 382/409] [DURACOM-160] Hide "Send feedback" link when CanSendFeedback is false --- src/app/footer/footer.component.html | 2 +- src/app/footer/footer.component.spec.ts | 5 ++++- src/app/footer/footer.component.ts | 10 +++++++++- 3 files changed, 14 insertions(+), 3 deletions(-) diff --git a/src/app/footer/footer.component.html b/src/app/footer/footer.component.html index 97265d7a23..13d84e6e2e 100644 --- a/src/app/footer/footer.component.html +++ b/src/app/footer/footer.component.html @@ -75,7 +75,7 @@ {{ 'footer.link.end-user-agreement' | translate}} -
  • +
  • {{ 'footer.link.feedback' | translate}}
  • diff --git a/src/app/footer/footer.component.spec.ts b/src/app/footer/footer.component.spec.ts index 15b289d5fb..9f0250edc4 100644 --- a/src/app/footer/footer.component.spec.ts +++ b/src/app/footer/footer.component.spec.ts @@ -15,6 +15,8 @@ import { FooterComponent } from './footer.component'; import { TranslateLoaderMock } from '../shared/mocks/translate-loader.mock'; import { storeModuleConfig } from '../app.reducer'; +import { AuthorizationDataService } from '../core/data/feature-authorization/authorization-data.service'; +import { AuthorizationDataServiceStub } from '../shared/testing/authorization-service.stub'; let comp: FooterComponent; let fixture: ComponentFixture; @@ -34,7 +36,8 @@ describe('Footer component', () => { })], declarations: [FooterComponent], // declare the test component providers: [ - FooterComponent + FooterComponent, + { provide: AuthorizationDataService, useClass: AuthorizationDataServiceStub }, ], schemas: [CUSTOM_ELEMENTS_SCHEMA] }); diff --git a/src/app/footer/footer.component.ts b/src/app/footer/footer.component.ts index c4195c8eb3..f5e4c3799a 100644 --- a/src/app/footer/footer.component.ts +++ b/src/app/footer/footer.component.ts @@ -2,6 +2,9 @@ import { Component, Optional } from '@angular/core'; import { hasValue } from '../shared/empty.util'; import { KlaroService } from '../shared/cookies/klaro.service'; import { environment } from '../../environments/environment'; +import { Observable } from 'rxjs'; +import { AuthorizationDataService } from '../core/data/feature-authorization/authorization-data.service'; +import { FeatureID } from '../core/data/feature-authorization/feature-id'; @Component({ selector: 'ds-footer', @@ -17,8 +20,13 @@ export class FooterComponent { showTopFooter = false; showPrivacyPolicy = environment.info.enablePrivacyStatement; showEndUserAgreement = environment.info.enableEndUserAgreement; + showSendFeedback$: Observable; - constructor(@Optional() private cookies: KlaroService) { + constructor( + @Optional() private cookies: KlaroService, + private authorizationService: AuthorizationDataService, + ) { + this.showSendFeedback$ = this.authorizationService.isAuthorized(FeatureID.CanSendFeedback); } showCookieSettings() { From 52dbb213396e7d5808fa70cdebe1a197028716c8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Paulo=20Gra=C3=A7a?= Date: Mon, 19 Jun 2023 15:37:35 +0100 Subject: [PATCH 383/409] include the project metadata representation component --- .../entity-groups/research-entities/research-entities.module.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/app/entity-groups/research-entities/research-entities.module.ts b/src/app/entity-groups/research-entities/research-entities.module.ts index 680e1bd79f..95b183f630 100644 --- a/src/app/entity-groups/research-entities/research-entities.module.ts +++ b/src/app/entity-groups/research-entities/research-entities.module.ts @@ -19,6 +19,7 @@ import { OrgUnitSearchResultGridElementComponent } from './item-grid-elements/se import { ProjectSearchResultGridElementComponent } from './item-grid-elements/search-result-grid-elements/project/project-search-result-grid-element.component'; import { PersonItemMetadataListElementComponent } from './metadata-representations/person/person-item-metadata-list-element.component'; import { OrgUnitItemMetadataListElementComponent } from './metadata-representations/org-unit/org-unit-item-metadata-list-element.component'; +import { ProjectItemMetadataListElementComponent } from './metadata-representations/project/project-item-metadata-list-element.component'; import { PersonSearchResultListSubmissionElementComponent } from './submission/item-list-elements/person/person-search-result-list-submission-element.component'; import { PersonInputSuggestionsComponent } from './submission/item-list-elements/person/person-suggestions/person-input-suggestions.component'; import { NameVariantModalComponent } from './submission/name-variant-modal/name-variant-modal.component'; @@ -36,6 +37,7 @@ const ENTRY_COMPONENTS = [ // put only entry components that use custom decorator OrgUnitComponent, PersonComponent, + ProjectItemMetadataListElementComponent, ProjectComponent, OrgUnitListElementComponent, OrgUnitItemMetadataListElementComponent, From 82d17d795f5ce952ff54bb114834009eeeb22f4b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Paulo=20Gra=C3=A7a?= Date: Tue, 20 Jun 2023 10:24:53 +0100 Subject: [PATCH 384/409] add support for dsoNameService --- ...roject-item-metadata-list-element.component.html | 8 ++++---- .../project-item-metadata-list-element.component.ts | 13 ++++++++++++- 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/src/app/entity-groups/research-entities/metadata-representations/project/project-item-metadata-list-element.component.html b/src/app/entity-groups/research-entities/metadata-representations/project/project-item-metadata-list-element.component.html index 175ab6e592..acc9173bf7 100644 --- a/src/app/entity-groups/research-entities/metadata-representations/project/project-item-metadata-list-element.component.html +++ b/src/app/entity-groups/research-entities/metadata-representations/project/project-item-metadata-list-element.component.html @@ -1,12 +1,12 @@ - + - + [innerHTML]="dsoNameService.getName(mdRepresentation)" + [ngbTooltip]="dsoNameService.getName(mdRepresentation).length > 0 ? descTemplate : null"> + \ No newline at end of file diff --git a/src/app/entity-groups/research-entities/metadata-representations/project/project-item-metadata-list-element.component.ts b/src/app/entity-groups/research-entities/metadata-representations/project/project-item-metadata-list-element.component.ts index 7f291b0996..34b96ed2b7 100644 --- a/src/app/entity-groups/research-entities/metadata-representations/project/project-item-metadata-list-element.component.ts +++ b/src/app/entity-groups/research-entities/metadata-representations/project/project-item-metadata-list-element.component.ts @@ -2,6 +2,7 @@ import { Component } from '@angular/core'; import { metadataRepresentationComponent } from '../../../../shared/metadata-representation/metadata-representation.decorator'; import { MetadataRepresentationType } from '../../../../core/shared/metadata-representation/metadata-representation.model'; import { ItemMetadataRepresentationListElementComponent } from '../../../../shared/object-list/metadata-representation-list-element/item/item-metadata-representation-list-element.component'; +import { DSONameService } from '../../../../core/breadcrumbs/dso-name.service'; @metadataRepresentationComponent('Project', MetadataRepresentationType.Item) @Component({ @@ -12,4 +13,14 @@ import { ItemMetadataRepresentationListElementComponent } from '../../../../shar * The component for displaying an item of the type Project as a metadata field */ export class ProjectItemMetadataListElementComponent extends ItemMetadataRepresentationListElementComponent { -} + /** + * Initialize instance variables + * + * @param nameService + */ + constructor( + public dsoNameService: DSONameService + ) { + super(); + } +} \ No newline at end of file From 130c3c9496fb57e5a8ba401375a1db2048048d0b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Paulo=20Gra=C3=A7a?= Date: Tue, 20 Jun 2023 10:33:03 +0100 Subject: [PATCH 385/409] addressing styling issue --- .../project/project-item-metadata-list-element.component.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/entity-groups/research-entities/metadata-representations/project/project-item-metadata-list-element.component.ts b/src/app/entity-groups/research-entities/metadata-representations/project/project-item-metadata-list-element.component.ts index 34b96ed2b7..03b9e1038d 100644 --- a/src/app/entity-groups/research-entities/metadata-representations/project/project-item-metadata-list-element.component.ts +++ b/src/app/entity-groups/research-entities/metadata-representations/project/project-item-metadata-list-element.component.ts @@ -23,4 +23,4 @@ export class ProjectItemMetadataListElementComponent extends ItemMetadataReprese ) { super(); } -} \ No newline at end of file +} From e6fdc4597afb710b4fb405bdd345271cec20ac73 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Paulo=20Gra=C3=A7a?= Date: Tue, 20 Jun 2023 10:34:34 +0100 Subject: [PATCH 386/409] change param name in typescript doc --- .../project/project-item-metadata-list-element.component.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/entity-groups/research-entities/metadata-representations/project/project-item-metadata-list-element.component.ts b/src/app/entity-groups/research-entities/metadata-representations/project/project-item-metadata-list-element.component.ts index 03b9e1038d..a38a1f5cff 100644 --- a/src/app/entity-groups/research-entities/metadata-representations/project/project-item-metadata-list-element.component.ts +++ b/src/app/entity-groups/research-entities/metadata-representations/project/project-item-metadata-list-element.component.ts @@ -16,7 +16,7 @@ export class ProjectItemMetadataListElementComponent extends ItemMetadataReprese /** * Initialize instance variables * - * @param nameService + * @param dsoNameService */ constructor( public dsoNameService: DSONameService From 72eaf35de153337dd3e942f306192ec3fc161800 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Paulo=20Gra=C3=A7a?= Date: Tue, 20 Jun 2023 13:35:12 +0100 Subject: [PATCH 387/409] adding support for DSONameService --- .../project-item-metadata-list-element.component.spec.ts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/app/entity-groups/research-entities/metadata-representations/project/project-item-metadata-list-element.component.spec.ts b/src/app/entity-groups/research-entities/metadata-representations/project/project-item-metadata-list-element.component.spec.ts index fd5095d2f8..afa565ce40 100644 --- a/src/app/entity-groups/research-entities/metadata-representations/project/project-item-metadata-list-element.component.spec.ts +++ b/src/app/entity-groups/research-entities/metadata-representations/project/project-item-metadata-list-element.component.spec.ts @@ -8,6 +8,8 @@ import { ItemMetadataRepresentation } from '../../../../core/shared/metadata-rep import { Item } from '../../../../core/shared/item.model'; import { ProjectItemMetadataListElementComponent } from './project-item-metadata-list-element.component'; import { MetadataValue } from '../../../../core/shared/metadata.models'; +import { DSONameService } from '../../../../core/breadcrumbs/dso-name.service'; +import { DSONameServiceMock } from '../../../../shared/mocks/dso-name.service.mock'; const projectTitle = 'Lorem ipsum dolor sit amet'; const mockItem = Object.assign(new Item(), { metadata: { 'dc.title': [{ value: projectTitle }] } }); @@ -25,6 +27,9 @@ describe('ProjectItemMetadataListElementComponent', () => { NgbModule ], declarations: [ProjectItemMetadataListElementComponent], + providers: [ + { provide: DSONameService, useValue: new DSONameServiceMock() } + ], schemas: [NO_ERRORS_SCHEMA] }).overrideComponent(ProjectItemMetadataListElementComponent, { set: { changeDetection: ChangeDetectionStrategy.Default } From f471957c4cb15c78ece7573823979a61dd096950 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Paulo=20Gra=C3=A7a?= Date: Tue, 20 Jun 2023 14:06:48 +0100 Subject: [PATCH 388/409] adding support for DSONameService --- .../project-item-metadata-list-element.component.spec.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/app/entity-groups/research-entities/metadata-representations/project/project-item-metadata-list-element.component.spec.ts b/src/app/entity-groups/research-entities/metadata-representations/project/project-item-metadata-list-element.component.spec.ts index afa565ce40..a8534744df 100644 --- a/src/app/entity-groups/research-entities/metadata-representations/project/project-item-metadata-list-element.component.spec.ts +++ b/src/app/entity-groups/research-entities/metadata-representations/project/project-item-metadata-list-element.component.spec.ts @@ -9,7 +9,6 @@ import { Item } from '../../../../core/shared/item.model'; import { ProjectItemMetadataListElementComponent } from './project-item-metadata-list-element.component'; import { MetadataValue } from '../../../../core/shared/metadata.models'; import { DSONameService } from '../../../../core/breadcrumbs/dso-name.service'; -import { DSONameServiceMock } from '../../../../shared/mocks/dso-name.service.mock'; const projectTitle = 'Lorem ipsum dolor sit amet'; const mockItem = Object.assign(new Item(), { metadata: { 'dc.title': [{ value: projectTitle }] } }); @@ -28,7 +27,7 @@ describe('ProjectItemMetadataListElementComponent', () => { ], declarations: [ProjectItemMetadataListElementComponent], providers: [ - { provide: DSONameService, useValue: new DSONameServiceMock() } + { provide: DSONameService, useValue: dsoNameService } ], schemas: [NO_ERRORS_SCHEMA] }).overrideComponent(ProjectItemMetadataListElementComponent, { @@ -41,6 +40,9 @@ describe('ProjectItemMetadataListElementComponent', () => { comp = fixture.componentInstance; comp.mdRepresentation = mockItemMetadataRepresentation; fixture.detectChanges(); + dsoNameService = jasmine.createSpyObj({ + getName: projectTitle + }); }); it('should show the project\'s name as a link', () => { From 1919f976f41871bc2065757b051b6992238867c1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Paulo=20Gra=C3=A7a?= Date: Tue, 20 Jun 2023 15:30:56 +0100 Subject: [PATCH 389/409] adding support for DSONameService --- .../project-item-metadata-list-element.component.spec.ts | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/app/entity-groups/research-entities/metadata-representations/project/project-item-metadata-list-element.component.spec.ts b/src/app/entity-groups/research-entities/metadata-representations/project/project-item-metadata-list-element.component.spec.ts index a8534744df..afa565ce40 100644 --- a/src/app/entity-groups/research-entities/metadata-representations/project/project-item-metadata-list-element.component.spec.ts +++ b/src/app/entity-groups/research-entities/metadata-representations/project/project-item-metadata-list-element.component.spec.ts @@ -9,6 +9,7 @@ import { Item } from '../../../../core/shared/item.model'; import { ProjectItemMetadataListElementComponent } from './project-item-metadata-list-element.component'; import { MetadataValue } from '../../../../core/shared/metadata.models'; import { DSONameService } from '../../../../core/breadcrumbs/dso-name.service'; +import { DSONameServiceMock } from '../../../../shared/mocks/dso-name.service.mock'; const projectTitle = 'Lorem ipsum dolor sit amet'; const mockItem = Object.assign(new Item(), { metadata: { 'dc.title': [{ value: projectTitle }] } }); @@ -27,7 +28,7 @@ describe('ProjectItemMetadataListElementComponent', () => { ], declarations: [ProjectItemMetadataListElementComponent], providers: [ - { provide: DSONameService, useValue: dsoNameService } + { provide: DSONameService, useValue: new DSONameServiceMock() } ], schemas: [NO_ERRORS_SCHEMA] }).overrideComponent(ProjectItemMetadataListElementComponent, { @@ -40,9 +41,6 @@ describe('ProjectItemMetadataListElementComponent', () => { comp = fixture.componentInstance; comp.mdRepresentation = mockItemMetadataRepresentation; fixture.detectChanges(); - dsoNameService = jasmine.createSpyObj({ - getName: projectTitle - }); }); it('should show the project\'s name as a link', () => { From 07a8024daa74aea42745853a7331fac406f88da6 Mon Sep 17 00:00:00 2001 From: Alan Orth Date: Mon, 19 Jun 2023 20:59:05 +0300 Subject: [PATCH 390/409] src/app: adjust item count style Minor adjustment to community and collection item counts. Instead of using the Bootstrap `lead` class, which reduces weight but increases size, we should use the same badge / pill style used in other counts like on on the browse by pages. --- .../community-list.component.html | 15 +++++++++------ .../collection-list-element.component.html | 17 ++++++++++------- .../community-list-element.component.html | 17 ++++++++++------- 3 files changed, 29 insertions(+), 20 deletions(-) diff --git a/src/app/community-list-page/community-list/community-list.component.html b/src/app/community-list-page/community-list/community-list.component.html index 5043d45c93..d6fd77e79b 100644 --- a/src/app/community-list-page/community-list/community-list.component.html +++ b/src/app/community-list-page/community-list/community-list.component.html @@ -33,12 +33,15 @@ -
    - - {{ dsoNameService.getName(node.payload) }} - - [{{node.payload.archivedItemsCount}}] -
    +
    +
    + + {{ dsoNameService.getName(node.payload) }} + +   + {{node.payload.archivedItemsCount}} +
    +
    diff --git a/src/app/shared/object-list/collection-list-element/collection-list-element.component.html b/src/app/shared/object-list/collection-list-element/collection-list-element.component.html index 707adabde2..c50b382495 100644 --- a/src/app/shared/object-list/collection-list-element/collection-list-element.component.html +++ b/src/app/shared/object-list/collection-list-element/collection-list-element.component.html @@ -1,10 +1,13 @@ - - {{ dsoNameService.getName(object) }} - - - {{ dsoNameService.getName(object) }} - -[{{object.archivedItemsCount}}] +
    + + {{ dsoNameService.getName(object) }} + + + {{ dsoNameService.getName(object) }} + +   + {{object.archivedItemsCount}} +
    {{object.shortDescription}}
    diff --git a/src/app/shared/object-list/community-list-element/community-list-element.component.html b/src/app/shared/object-list/community-list-element/community-list-element.component.html index ea6782b949..2101261bdc 100644 --- a/src/app/shared/object-list/community-list-element/community-list-element.component.html +++ b/src/app/shared/object-list/community-list-element/community-list-element.component.html @@ -1,10 +1,13 @@ - - {{ dsoNameService.getName(object) }} - - - {{ dsoNameService.getName(object) }} - -[{{object.archivedItemsCount}}] +
    + + {{ dsoNameService.getName(object) }} + + + {{ dsoNameService.getName(object) }} + +   + {{object.archivedItemsCount}} +
    {{object.shortDescription}}
    From 275b057b40484218f5218555d53db22d422a6b13 Mon Sep 17 00:00:00 2001 From: Adam Doan Date: Wed, 21 Jun 2023 17:37:22 +0000 Subject: [PATCH 391/409] Add the ability to expand / collapse via keyboard --- .../dynamic-scrollable-dropdown.component.html | 2 +- .../dynamic-scrollable-dropdown.component.ts | 17 +++++++++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/src/app/shared/form/builder/ds-dynamic-form-ui/models/scrollable-dropdown/dynamic-scrollable-dropdown.component.html b/src/app/shared/form/builder/ds-dynamic-form-ui/models/scrollable-dropdown/dynamic-scrollable-dropdown.component.html index 3a75fe1037..6e2d29b789 100644 --- a/src/app/shared/form/builder/ds-dynamic-form-ui/models/scrollable-dropdown/dynamic-scrollable-dropdown.component.html +++ b/src/app/shared/form/builder/ds-dynamic-form-ui/models/scrollable-dropdown/dynamic-scrollable-dropdown.component.html @@ -23,7 +23,7 @@ (blur)="onBlur($event)" (click)="$event.stopPropagation(); openDropdown(sdRef);" (focus)="onFocus($event)" - (keypress)="$event.preventDefault()"> + (keydown)="selectOnKeyDown($event, sdRef)">
    Date: Wed, 21 Jun 2023 15:36:59 -0500 Subject: [PATCH 392/409] Implement basic 301 Redirect when SSR is used. --- .../core/data/dso-redirect.service.spec.ts | 24 +++++++++++++++++++ src/app/core/data/dso-redirect.service.ts | 21 +++++++++++++--- 2 files changed, 42 insertions(+), 3 deletions(-) diff --git a/src/app/core/data/dso-redirect.service.spec.ts b/src/app/core/data/dso-redirect.service.spec.ts index ca064b5608..64fbd94367 100644 --- a/src/app/core/data/dso-redirect.service.spec.ts +++ b/src/app/core/data/dso-redirect.service.spec.ts @@ -27,6 +27,9 @@ describe('DsoRedirectService', () => { const requestUUIDURL = `https://rest.api/rest/api/pid/find?id=${dsoUUID}`; const requestUUID = '34cfed7c-f597-49ef-9cbe-ea351f0023c2'; const objectCache = {} as ObjectCacheService; + const mockResponse = jasmine.createSpyObj(['redirect']); + const mockPlatformBrowser = 'browser'; + const mockPlatformServer = 'server'; beforeEach(() => { scheduler = getTestScheduler(); @@ -58,6 +61,8 @@ describe('DsoRedirectService', () => { objectCache, halService, router, + mockResponse, + mockPlatformBrowser // default to CSR except where explicitly SSR below ); }); @@ -141,6 +146,25 @@ describe('DsoRedirectService', () => { scheduler.flush(); expect(router.navigate).toHaveBeenCalledWith(['/communities/' + remoteData.payload.uuid]); }); + + it('should return 301 redirect when SSR is used', () => { + service = new DsoRedirectService( + requestService, + rdbService, + objectCache, + halService, + router, + mockResponse, + mockPlatformServer // explicitly SSR mode + ); + remoteData.payload.type = 'item'; + const redir = service.findByIdAndIDType(dsoHandle, IdentifierType.HANDLE); + // The framework would normally subscribe but do it here so we can test navigation. + redir.subscribe(); + scheduler.schedule(() => redir); + scheduler.flush(); + expect(mockResponse.redirect).toHaveBeenCalledWith(301, '/items/' + remoteData.payload.uuid); + }); }); describe('DataService', () => { // todo: should only test the id/uuid interpolation thingy diff --git a/src/app/core/data/dso-redirect.service.ts b/src/app/core/data/dso-redirect.service.ts index 81ce678e43..9b87590f7e 100644 --- a/src/app/core/data/dso-redirect.service.ts +++ b/src/app/core/data/dso-redirect.service.ts @@ -6,7 +6,7 @@ * http://www.dspace.org/license/ */ /* eslint-disable max-classes-per-file */ -import { Injectable } from '@angular/core'; +import { Inject, Injectable, Optional, PLATFORM_ID } from '@angular/core'; import { Router } from '@angular/router'; import { Observable } from 'rxjs'; import { tap } from 'rxjs/operators'; @@ -21,6 +21,8 @@ import { getFirstCompletedRemoteData } from '../shared/operators'; import { DSpaceObject } from '../shared/dspace-object.model'; import { IdentifiableDataService } from './base/identifiable-data.service'; import { getDSORoute } from '../../app-routing-paths'; +import { RESPONSE } from '@nguniversal/express-engine/tokens'; +import { isPlatformServer } from '@angular/common'; const ID_ENDPOINT = 'pid'; const UUID_ENDPOINT = 'dso'; @@ -75,12 +77,20 @@ export class DsoRedirectService { protected objectCache: ObjectCacheService, protected halService: HALEndpointService, private router: Router, + @Optional() @Inject(RESPONSE) private response: any, + @Inject(PLATFORM_ID) private platformId: any ) { this.dataService = new DsoByIdOrUUIDDataService(requestService, rdbService, objectCache, halService); } /** - * Retrieve a DSpaceObject by + * Redirect to a DSpaceObject's path using the given identifier type and ID. + * This is used to redirect paths like "/handle/[prefix]/[suffix]" to the object's path (e.g. /items/[uuid]). + * See LookupGuard for more examples. + * + * If this is called server side (via SSR), it performs a 301 Redirect. + * If this is called client side (via CSR), it simply uses the Angular router to do the redirect. + * * @param id the identifier of the object to retrieve * @param identifierType the type of the given identifier (defaults to UUID) */ @@ -94,7 +104,12 @@ export class DsoRedirectService { if (hasValue(dso.uuid)) { let newRoute = getDSORoute(dso); if (hasValue(newRoute)) { - this.router.navigate([newRoute]); + // If running via SSR, perform a "301 Moved Permanently" redirect for SEO purposes. + if (isPlatformServer(this.platformId)) { + this.response.redirect(301, newRoute); + } else { + this.router.navigate([newRoute]); + } } } } From 47e7eb1a4fc74b768961ca3b766b661809e58db8 Mon Sep 17 00:00:00 2001 From: Alisa Ismailati Date: Thu, 22 Jun 2023 12:14:15 +0200 Subject: [PATCH 393/409] [DURACOM-170] Fixed "add collection" behavior --- .../collection-form/collection-form.component.ts | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/app/collection-page/collection-form/collection-form.component.ts b/src/app/collection-page/collection-form/collection-form.component.ts index 84223d260a..ebb03df3b9 100644 --- a/src/app/collection-page/collection-form/collection-form.component.ts +++ b/src/app/collection-page/collection-form/collection-form.component.ts @@ -22,6 +22,8 @@ import { MetadataValue } from '../../core/shared/metadata.models'; import { getFirstSucceededRemoteListPayload } from '../../core/shared/operators'; import { collectionFormEntityTypeSelectionConfig, collectionFormModels, } from './collection-form.models'; import { NONE_ENTITY_TYPE } from '../../core/shared/item-relationships/item-type.resource-type'; +import { hasNoValue, isNotNull } from 'src/app/shared/empty.util'; + /** * Form used for creating and editing collections @@ -66,6 +68,12 @@ export class CollectionFormComponent extends ComColFormComponent imp super(formService, translate, notificationsService, authService, requestService, objectCache); } + ngOnInit(): void { + if (hasNoValue(this.formModel) && isNotNull(this.dso)) { + this.initializeForm(); + } + } + /** * Detect changes to the dso and initialize the form, * if the dso changes, exists and it is not the first change From 6a58e49fb45a78bb2439f51dd4a8d781c7d5d330 Mon Sep 17 00:00:00 2001 From: Giuseppe Digilio Date: Thu, 22 Jun 2023 18:16:53 +0200 Subject: [PATCH 394/409] [DURACOM-172] add check to save only successful response into the SSR cache --- server.ts | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/server.ts b/server.ts index 3bbb28820a..7f698a91f8 100644 --- a/server.ts +++ b/server.ts @@ -461,6 +461,8 @@ function saveToCache(req, page: any) { const key = getCacheKey(req); // Avoid caching "/reload/[random]" paths (these are hard refreshes after logout) if (key.startsWith('/reload')) { return; } + // Avoid caching not successful responses (status code different from 2XX status) + if (hasNotSucceeded(req.res.statusCode)) { return; } // Retrieve response headers to save, if any const headers = retrieveHeaders(req.res); @@ -479,6 +481,15 @@ function saveToCache(req, page: any) { } } +/** + * Check if status code is different from 2XX + * @param statusCode + */ +function hasNotSucceeded(statusCode) { + const rgx = new RegExp(/20+/); + return !rgx.test(statusCode) +} + function retrieveHeaders(response) { const headers = Object.create({}); if (Array.isArray(environment.cache.serverSide.headers) && environment.cache.serverSide.headers.length > 0) { From d4a5308d0c7f845cbe0f0caa18437635e94a3067 Mon Sep 17 00:00:00 2001 From: Tim Donohue Date: Thu, 22 Jun 2023 13:37:14 -0500 Subject: [PATCH 395/409] Refactor to use HardRedirectService. Update its redirect method to support optional statusCode --- .../core/data/dso-redirect.service.spec.ts | 45 +++++-------------- src/app/core/data/dso-redirect.service.ts | 21 +++------ .../core/services/hard-redirect.service.ts | 4 +- .../server-hard-redirect.service.spec.ts | 19 ++++++-- .../services/server-hard-redirect.service.ts | 12 +++-- 5 files changed, 44 insertions(+), 57 deletions(-) diff --git a/src/app/core/data/dso-redirect.service.spec.ts b/src/app/core/data/dso-redirect.service.spec.ts index 64fbd94367..2122dc663a 100644 --- a/src/app/core/data/dso-redirect.service.spec.ts +++ b/src/app/core/data/dso-redirect.service.spec.ts @@ -10,6 +10,7 @@ import { RequestService } from './request.service'; import { createSuccessfulRemoteDataObject } from '../../shared/remote-data.utils'; import { Item } from '../shared/item.model'; import { EMBED_SEPARATOR } from './base/base-data.service'; +import { HardRedirectService } from '../services/hard-redirect.service'; describe('DsoRedirectService', () => { let scheduler: TestScheduler; @@ -17,7 +18,7 @@ describe('DsoRedirectService', () => { let halService: HALEndpointService; let requestService: RequestService; let rdbService: RemoteDataBuildService; - let router; + let redirectService: HardRedirectService; let remoteData; const dsoUUID = '9b4f22f4-164a-49db-8817-3316b6ee5746'; const dsoHandle = '1234567789/22'; @@ -27,9 +28,6 @@ describe('DsoRedirectService', () => { const requestUUIDURL = `https://rest.api/rest/api/pid/find?id=${dsoUUID}`; const requestUUID = '34cfed7c-f597-49ef-9cbe-ea351f0023c2'; const objectCache = {} as ObjectCacheService; - const mockResponse = jasmine.createSpyObj(['redirect']); - const mockPlatformBrowser = 'browser'; - const mockPlatformServer = 'server'; beforeEach(() => { scheduler = getTestScheduler(); @@ -41,9 +39,6 @@ describe('DsoRedirectService', () => { generateRequestId: requestUUID, send: true }); - router = { - navigate: jasmine.createSpy('navigate') - }; remoteData = createSuccessfulRemoteDataObject(Object.assign(new Item(), { type: 'item', @@ -55,14 +50,17 @@ describe('DsoRedirectService', () => { a: remoteData }) }); + + redirectService = jasmine.createSpyObj('redirectService', { + redirect: {} + }); + service = new DsoRedirectService( requestService, rdbService, objectCache, halService, - router, - mockResponse, - mockPlatformBrowser // default to CSR except where explicitly SSR below + redirectService ); }); @@ -109,7 +107,7 @@ describe('DsoRedirectService', () => { redir.subscribe(); scheduler.schedule(() => redir); scheduler.flush(); - expect(router.navigate).toHaveBeenCalledWith(['/items/' + remoteData.payload.uuid]); + expect(redirectService.redirect).toHaveBeenCalledWith('/items/' + remoteData.payload.uuid, 301); }); it('should navigate to entities route with the corresponding entity type', () => { remoteData.payload.type = 'item'; @@ -126,7 +124,7 @@ describe('DsoRedirectService', () => { redir.subscribe(); scheduler.schedule(() => redir); scheduler.flush(); - expect(router.navigate).toHaveBeenCalledWith(['/entities/publication/' + remoteData.payload.uuid]); + expect(redirectService.redirect).toHaveBeenCalledWith('/entities/publication/' + remoteData.payload.uuid, 301); }); it('should navigate to collections route', () => { @@ -135,7 +133,7 @@ describe('DsoRedirectService', () => { redir.subscribe(); scheduler.schedule(() => redir); scheduler.flush(); - expect(router.navigate).toHaveBeenCalledWith(['/collections/' + remoteData.payload.uuid]); + expect(redirectService.redirect).toHaveBeenCalledWith('/collections/' + remoteData.payload.uuid, 301); }); it('should navigate to communities route', () => { @@ -144,26 +142,7 @@ describe('DsoRedirectService', () => { redir.subscribe(); scheduler.schedule(() => redir); scheduler.flush(); - expect(router.navigate).toHaveBeenCalledWith(['/communities/' + remoteData.payload.uuid]); - }); - - it('should return 301 redirect when SSR is used', () => { - service = new DsoRedirectService( - requestService, - rdbService, - objectCache, - halService, - router, - mockResponse, - mockPlatformServer // explicitly SSR mode - ); - remoteData.payload.type = 'item'; - const redir = service.findByIdAndIDType(dsoHandle, IdentifierType.HANDLE); - // The framework would normally subscribe but do it here so we can test navigation. - redir.subscribe(); - scheduler.schedule(() => redir); - scheduler.flush(); - expect(mockResponse.redirect).toHaveBeenCalledWith(301, '/items/' + remoteData.payload.uuid); + expect(redirectService.redirect).toHaveBeenCalledWith('/communities/' + remoteData.payload.uuid, 301); }); }); diff --git a/src/app/core/data/dso-redirect.service.ts b/src/app/core/data/dso-redirect.service.ts index 9b87590f7e..a27d1fb11f 100644 --- a/src/app/core/data/dso-redirect.service.ts +++ b/src/app/core/data/dso-redirect.service.ts @@ -6,8 +6,7 @@ * http://www.dspace.org/license/ */ /* eslint-disable max-classes-per-file */ -import { Inject, Injectable, Optional, PLATFORM_ID } from '@angular/core'; -import { Router } from '@angular/router'; +import { Injectable } from '@angular/core'; import { Observable } from 'rxjs'; import { tap } from 'rxjs/operators'; import { hasValue } from '../../shared/empty.util'; @@ -21,8 +20,7 @@ import { getFirstCompletedRemoteData } from '../shared/operators'; import { DSpaceObject } from '../shared/dspace-object.model'; import { IdentifiableDataService } from './base/identifiable-data.service'; import { getDSORoute } from '../../app-routing-paths'; -import { RESPONSE } from '@nguniversal/express-engine/tokens'; -import { isPlatformServer } from '@angular/common'; +import { HardRedirectService } from '../services/hard-redirect.service'; const ID_ENDPOINT = 'pid'; const UUID_ENDPOINT = 'dso'; @@ -76,9 +74,7 @@ export class DsoRedirectService { protected rdbService: RemoteDataBuildService, protected objectCache: ObjectCacheService, protected halService: HALEndpointService, - private router: Router, - @Optional() @Inject(RESPONSE) private response: any, - @Inject(PLATFORM_ID) private platformId: any + private hardRedirectService: HardRedirectService ) { this.dataService = new DsoByIdOrUUIDDataService(requestService, rdbService, objectCache, halService); } @@ -88,9 +84,6 @@ export class DsoRedirectService { * This is used to redirect paths like "/handle/[prefix]/[suffix]" to the object's path (e.g. /items/[uuid]). * See LookupGuard for more examples. * - * If this is called server side (via SSR), it performs a 301 Redirect. - * If this is called client side (via CSR), it simply uses the Angular router to do the redirect. - * * @param id the identifier of the object to retrieve * @param identifierType the type of the given identifier (defaults to UUID) */ @@ -104,12 +97,8 @@ export class DsoRedirectService { if (hasValue(dso.uuid)) { let newRoute = getDSORoute(dso); if (hasValue(newRoute)) { - // If running via SSR, perform a "301 Moved Permanently" redirect for SEO purposes. - if (isPlatformServer(this.platformId)) { - this.response.redirect(301, newRoute); - } else { - this.router.navigate([newRoute]); - } + // Use a "301 Moved Permanently" redirect for SEO purposes + this.hardRedirectService.redirect(newRoute, 301); } } } diff --git a/src/app/core/services/hard-redirect.service.ts b/src/app/core/services/hard-redirect.service.ts index 3733059283..826c7e4fa9 100644 --- a/src/app/core/services/hard-redirect.service.ts +++ b/src/app/core/services/hard-redirect.service.ts @@ -11,8 +11,10 @@ export abstract class HardRedirectService { * * @param url * the page to redirect to + * @param statusCode + * optional HTTP status code to use for redirect (default = 302, which is a temporary redirect) */ - abstract redirect(url: string); + abstract redirect(url: string, statusCode?: number); /** * Get the current route, with query params included diff --git a/src/app/core/services/server-hard-redirect.service.spec.ts b/src/app/core/services/server-hard-redirect.service.spec.ts index 4501547b92..6bd5828921 100644 --- a/src/app/core/services/server-hard-redirect.service.spec.ts +++ b/src/app/core/services/server-hard-redirect.service.spec.ts @@ -22,20 +22,33 @@ describe('ServerHardRedirectService', () => { expect(service).toBeTruthy(); }); - describe('when performing a redirect', () => { - + describe('when performing a default redirect', () => { const redirect = 'test redirect'; beforeEach(() => { service.redirect(redirect); }); - it('should update the response object', () => { + it('should perform a 302 redirect', () => { expect(mockResponse.redirect).toHaveBeenCalledWith(302, redirect); expect(mockResponse.end).toHaveBeenCalled(); }); }); + describe('when performing a 301 redirect', () => { + const redirect = 'test 301 redirect'; + const redirectStatusCode = 301; + + beforeEach(() => { + service.redirect(redirect, redirectStatusCode); + }); + + it('should redirect with passed in status code', () => { + expect(mockResponse.redirect).toHaveBeenCalledWith(redirectStatusCode, redirect); + expect(mockResponse.end).toHaveBeenCalled(); + }); + }); + describe('when requesting the current route', () => { beforeEach(() => { diff --git a/src/app/core/services/server-hard-redirect.service.ts b/src/app/core/services/server-hard-redirect.service.ts index de8b45b0e5..8c45cc864b 100644 --- a/src/app/core/services/server-hard-redirect.service.ts +++ b/src/app/core/services/server-hard-redirect.service.ts @@ -17,10 +17,14 @@ export class ServerHardRedirectService extends HardRedirectService { } /** - * Perform a hard redirect to URL + * Perform a hard redirect to a given location. + * * @param url + * the page to redirect to + * @param statusCode + * optional HTTP status code to use for redirect (default = 302, which is a temporary redirect) */ - redirect(url: string) { + redirect(url: string, statusCode?: number) { if (url === this.req.url) { return; @@ -38,8 +42,8 @@ export class ServerHardRedirectService extends HardRedirectService { process.exit(1); } } else { - // attempt to use the already set status - let status = this.res.statusCode || 0; + // attempt to use passed in statusCode or the already set status (in request) + let status = statusCode || this.res.statusCode || 0; if (status < 300 || status >= 400) { // temporary redirect status = 302; From 163014306cb3fe5c80dc807695cb2aa4978f0ecc Mon Sep 17 00:00:00 2001 From: Giuseppe Digilio Date: Fri, 23 Jun 2023 09:23:28 +0200 Subject: [PATCH 396/409] [DURACOM-172] improve regex --- server.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server.ts b/server.ts index 7f698a91f8..23327c2058 100644 --- a/server.ts +++ b/server.ts @@ -486,7 +486,7 @@ function saveToCache(req, page: any) { * @param statusCode */ function hasNotSucceeded(statusCode) { - const rgx = new RegExp(/20+/); + const rgx = new RegExp(/^20+/); return !rgx.test(statusCode) } From 3d133f6166cecd769e461c79f7b4b53413d92ff7 Mon Sep 17 00:00:00 2001 From: lotte Date: Fri, 23 Jun 2023 11:50:05 +0200 Subject: [PATCH 397/409] 103005: Fixed issue where bg colours couldn't be overwritten in themes --- src/styles/_bootstrap_variables.scss | 9 +++++++++ src/styles/_bootstrap_variables_mapping.scss | 12 ++++++------ 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/src/styles/_bootstrap_variables.scss b/src/styles/_bootstrap_variables.scss index 4c631a294a..9d46f12abb 100644 --- a/src/styles/_bootstrap_variables.scss +++ b/src/styles/_bootstrap_variables.scss @@ -23,6 +23,8 @@ $yellow: #ec9433 !default; $red: #CF4444 !default; $dark: darken($blue, 17%) !default; + + $theme-colors: ( primary: $blue, secondary: $gray-700, @@ -44,3 +46,10 @@ $navbar-light-toggler-icon-bg: url("data:image/svg+xml;charset=utf8, Date: Fri, 23 Jun 2023 12:54:41 -0500 Subject: [PATCH 398/409] Update version tag for release --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 59766e993b..719b13b23b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "dspace-angular", - "version": "7.6.0-next", + "version": "7.6.0", "scripts": { "ng": "ng", "config:watch": "nodemon", From 884aa0743096b4bfe946679aa48ad3f5727575df Mon Sep 17 00:00:00 2001 From: Tim Donohue Date: Fri, 23 Jun 2023 13:04:19 -0500 Subject: [PATCH 399/409] Update version tag for development of next release --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 719b13b23b..06d7063240 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "dspace-angular", - "version": "7.6.0", + "version": "7.6.1-next", "scripts": { "ng": "ng", "config:watch": "nodemon", From c4342d3238b73d03cb92e8ce160884e66d14b49a Mon Sep 17 00:00:00 2001 From: Tim Donohue Date: Fri, 30 Jun 2023 14:57:09 -0500 Subject: [PATCH 400/409] Update version tag for development of next major release --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 06d7063240..977a4bdc5e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "dspace-angular", - "version": "7.6.1-next", + "version": "8.0.0-next", "scripts": { "ng": "ng", "config:watch": "nodemon", From 8ac1e9a2838ba24f73b3617190efb942406c9883 Mon Sep 17 00:00:00 2001 From: Alan Orth Date: Wed, 5 Jul 2023 18:03:25 +0300 Subject: [PATCH 401/409] src/app: fix path to deny-request-copy component The themed-deny-request-copy.component erroneously includes the cus- tom theme's deny-request-copy component instead of its own. Closes: https://github.com/DSpace/dspace-angular/issues/2351 --- .../deny-request-copy/themed-deny-request-copy.component.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/request-copy/deny-request-copy/themed-deny-request-copy.component.ts b/src/app/request-copy/deny-request-copy/themed-deny-request-copy.component.ts index 664e4c541b..1539d49622 100644 --- a/src/app/request-copy/deny-request-copy/themed-deny-request-copy.component.ts +++ b/src/app/request-copy/deny-request-copy/themed-deny-request-copy.component.ts @@ -1,7 +1,7 @@ import { Component } from '@angular/core'; import { ThemedComponent } from 'src/app/shared/theme-support/themed.component'; -import { DenyRequestCopyComponent } from 'src/themes/custom/app/request-copy/deny-request-copy/deny-request-copy.component'; +import { DenyRequestCopyComponent } from './deny-request-copy.component'; /** * Themed wrapper for deny-request-copy.component From 5208008f9558cbec4882b08852da118a29a6bfbc Mon Sep 17 00:00:00 2001 From: Tim Donohue Date: Fri, 7 Jul 2023 11:56:47 -0500 Subject: [PATCH 402/409] Enable Pull Request Opened action to assign PRs to their creator --- .../pull_request_opened.yml | 26 ------------------- .github/workflows/pull_request_opened.yml | 24 +++++++++++++++++ 2 files changed, 24 insertions(+), 26 deletions(-) delete mode 100644 .github/disabled-workflows/pull_request_opened.yml create mode 100644 .github/workflows/pull_request_opened.yml diff --git a/.github/disabled-workflows/pull_request_opened.yml b/.github/disabled-workflows/pull_request_opened.yml deleted file mode 100644 index 0dc718c0b9..0000000000 --- a/.github/disabled-workflows/pull_request_opened.yml +++ /dev/null @@ -1,26 +0,0 @@ -# This workflow runs whenever a new pull request is created -# TEMPORARILY DISABLED. Unfortunately this doesn't work for PRs created from forked repositories (which is how we tend to create PRs). -# There is no known workaround yet. See https://github.community/t/how-to-use-github-token-for-prs-from-forks/16818 -name: Pull Request opened - -# Only run for newly opened PRs against the "main" branch -on: - pull_request: - types: [opened] - branches: - - main - -jobs: - automation: - runs-on: ubuntu-latest - steps: - # Assign the PR to whomever created it. This is useful for visualizing assignments on project boards - # See https://github.com/marketplace/actions/pull-request-assigner - - name: Assign PR to creator - uses: thomaseizinger/assign-pr-creator-action@v1.0.0 - # Note, this authentication token is created automatically - # See: https://docs.github.com/en/actions/configuring-and-managing-workflows/authenticating-with-the-github_token - with: - repo-token: ${{ secrets.GITHUB_TOKEN }} - # Ignore errors. It is possible the PR was created by someone who cannot be assigned - continue-on-error: true diff --git a/.github/workflows/pull_request_opened.yml b/.github/workflows/pull_request_opened.yml new file mode 100644 index 0000000000..9b61af72d1 --- /dev/null +++ b/.github/workflows/pull_request_opened.yml @@ -0,0 +1,24 @@ +# This workflow runs whenever a new pull request is created +name: Pull Request opened + +# Only run for newly opened 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 to assign a PR back to the creator when the PR comes from a forked repo) +on: + pull_request_target: + types: [ opened ] + branches: + - main + - 'dspace-**' + +permissions: + pull-requests: write + +jobs: + automation: + runs-on: ubuntu-latest + steps: + # Assign the PR to whomever created it. This is useful for visualizing assignments on project boards + # See https://github.com/toshimaru/auto-author-assign + - name: Assign PR to creator + uses: toshimaru/auto-author-assign@v1.6.2 From 15be060665e9f517f75afbede082cbf6fa749cf1 Mon Sep 17 00:00:00 2001 From: Tim Donohue Date: Fri, 7 Jul 2023 11:56:54 -0500 Subject: [PATCH 403/409] Ensure codescan and label_merge_conflicts run on maintenance branches --- .github/workflows/codescan.yml | 10 +++++++--- .github/workflows/label_merge_conflicts.yml | 7 ++++--- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/.github/workflows/codescan.yml b/.github/workflows/codescan.yml index 35a2e2d24a..8b415296c7 100644 --- a/.github/workflows/codescan.yml +++ b/.github/workflows/codescan.yml @@ -5,12 +5,16 @@ # because CodeQL requires a fresh build with all tests *disabled*. name: "Code Scanning" -# Run this code scan for all pushes / PRs to main branch. Also run once a week. +# Run this code scan for all pushes / PRs to main or maintenance branches. Also run once a week. on: push: - branches: [ main ] + branches: + - main + - 'dspace-**' pull_request: - branches: [ main ] + branches: + - main + - 'dspace-**' # Don't run if PR is only updating static documentation paths-ignore: - '**/*.md' diff --git a/.github/workflows/label_merge_conflicts.yml b/.github/workflows/label_merge_conflicts.yml index c1396b6f45..7ea3327741 100644 --- a/.github/workflows/label_merge_conflicts.yml +++ b/.github/workflows/label_merge_conflicts.yml @@ -1,11 +1,12 @@ # This workflow checks open PRs for merge conflicts and labels them when conflicts are found name: Check for merge conflicts -# Run whenever the "main" branch is updated -# NOTE: This means merge conflicts are only checked for when a PR is merged to main. +# Run this for all pushes (i.e. merges) to 'main' or maintenance branches on: push: - branches: [ main ] + branches: + - main + - 'dspace-**' # So that the `conflict_label_name` is removed if conflicts are resolved, # we allow this to run for `pull_request_target` so that github secrets are available. pull_request_target: From effe1816962b569134eea83c75704bba1721e2ae Mon Sep 17 00:00:00 2001 From: Tim Donohue Date: Fri, 7 Jul 2023 12:05:56 -0500 Subject: [PATCH 404/409] Split docker images into separate jobs to run in parallel. Ensure 'main' codebase is tagged as 'latest' --- .github/workflows/docker.yml | 84 ++++++++++++++++++++++++------------ 1 file changed, 57 insertions(+), 27 deletions(-) diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml index 9a2c838d83..0c36d5af98 100644 --- a/.github/workflows/docker.yml +++ b/.github/workflows/docker.yml @@ -15,29 +15,35 @@ on: permissions: contents: read # to fetch code (actions/checkout) + +env: + # Define tags to use for Docker images based on Git tags/branches (for docker/metadata-action) + # For a new commit on default branch (main), use the literal tag 'latest' on Docker image. + # For a new commit on other branches, use the branch name as the tag for Docker image. + # For a new tag, copy that tag name as the tag for Docker image. + IMAGE_TAGS: | + type=raw,value=latest,enable=${{ endsWith(github.ref, github.event.repository.default_branch) }} + type=ref,event=branch,enable=${{ !endsWith(github.ref, github.event.repository.default_branch) }} + type=ref,event=tag + # Define default tag "flavor" for docker/metadata-action per + # https://github.com/docker/metadata-action#flavor-input + # We manage the 'latest' tag ourselves to the 'main' branch (see settings above) + TAGS_FLAVOR: | + latest=false + # Architectures / Platforms for which we will build Docker images + # If this is a PR, we ONLY build for AMD64. For PRs we only do a sanity check test to ensure Docker builds work. + # If this is NOT a PR (e.g. a tag or merge commit), also build for ARM64. + PLATFORMS: linux/amd64${{ github.event_name != 'pull_request' && ', linux/arm64' || '' }} + + jobs: - docker: + ############################################### + # Build/Push the 'dspace/dspace-angular' image + ############################################### + dspace-angular: # Ensure this job never runs on forked repos. It's only executed for 'dspace/dspace-angular' if: github.repository == 'dspace/dspace-angular' runs-on: ubuntu-latest - env: - # Define tags to use for Docker images based on Git tags/branches (for docker/metadata-action) - # For a new commit on default branch (main), use the literal tag 'dspace-7_x' on Docker image. - # For a new commit on other branches, use the branch name as the tag for Docker image. - # For a new tag, copy that tag name as the tag for Docker image. - IMAGE_TAGS: | - type=raw,value=dspace-7_x,enable=${{ endsWith(github.ref, github.event.repository.default_branch) }} - type=ref,event=branch,enable=${{ !endsWith(github.ref, github.event.repository.default_branch) }} - type=ref,event=tag - # Define default tag "flavor" for docker/metadata-action per - # https://github.com/docker/metadata-action#flavor-input - # We turn off 'latest' tag by default. - TAGS_FLAVOR: | - latest=false - # Architectures / Platforms for which we will build Docker images - # If this is a PR, we ONLY build for AMD64. For PRs we only do a sanity check test to ensure Docker builds work. - # If this is NOT a PR (e.g. a tag or merge commit), also build for ARM64. - PLATFORMS: linux/amd64${{ github.event_name != 'pull_request' && ', linux/arm64' || '' }} steps: # https://github.com/actions/checkout @@ -61,9 +67,6 @@ jobs: username: ${{ secrets.DOCKER_USERNAME }} password: ${{ secrets.DOCKER_ACCESS_TOKEN }} - ############################################### - # Build/Push the 'dspace/dspace-angular' image - ############################################### # https://github.com/docker/metadata-action # Get Metadata for docker_build step below - name: Sync metadata (tags, labels) from GitHub to Docker for 'dspace-angular' image @@ -77,7 +80,7 @@ jobs: # https://github.com/docker/build-push-action - name: Build and push 'dspace-angular' image id: docker_build - uses: docker/build-push-action@v3 + uses: docker/build-push-action@v4 with: context: . file: ./Dockerfile @@ -89,9 +92,36 @@ jobs: tags: ${{ steps.meta_build.outputs.tags }} labels: ${{ steps.meta_build.outputs.labels }} - ##################################################### - # Build/Push the 'dspace/dspace-angular' image ('-dist' tag) - ##################################################### + ############################################################# + # Build/Push the 'dspace/dspace-angular' image ('-dist' tag) + ############################################################# + dspace-angular-dist: + # Ensure this job never runs on forked repos. It's only executed for 'dspace/dspace-angular' + if: github.repository == 'dspace/dspace-angular' + runs-on: ubuntu-latest + + steps: + # https://github.com/actions/checkout + - name: Checkout codebase + uses: actions/checkout@v3 + + # https://github.com/docker/setup-buildx-action + - name: Setup Docker Buildx + uses: docker/setup-buildx-action@v2 + + # https://github.com/docker/setup-qemu-action + - name: Set up QEMU emulation to build for multiple architectures + uses: docker/setup-qemu-action@v2 + + # https://github.com/docker/login-action + - name: Login to DockerHub + # Only login if not a PR, as PRs only trigger a Docker build and not a push + if: github.event_name != 'pull_request' + uses: docker/login-action@v2 + with: + username: ${{ secrets.DOCKER_USERNAME }} + password: ${{ secrets.DOCKER_ACCESS_TOKEN }} + # 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 @@ -107,7 +137,7 @@ jobs: - name: Build and push 'dspace-angular-dist' image id: docker_build_dist - uses: docker/build-push-action@v3 + uses: docker/build-push-action@v4 with: context: . file: ./Dockerfile.dist From 08ae7bfdbad027c0888624fdbebb1a90704a8112 Mon Sep 17 00:00:00 2001 From: Tim Donohue Date: Mon, 24 Jul 2023 16:10:23 -0500 Subject: [PATCH 405/409] Replace all old docker "dspace-7_x" tags with latest --- Dockerfile.dist | 2 +- docker/README.md | 6 +++--- docker/cli.yml | 2 +- docker/docker-compose-ci.yml | 2 +- docker/docker-compose-dist.yml | 2 +- docker/docker-compose-rest.yml | 4 ++-- docker/docker-compose.yml | 2 +- 7 files changed, 10 insertions(+), 10 deletions(-) diff --git a/Dockerfile.dist b/Dockerfile.dist index 2a6a66fc06..e4b467ae26 100644 --- a/Dockerfile.dist +++ b/Dockerfile.dist @@ -2,7 +2,7 @@ # 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 . +# docker build -f Dockerfile.dist -t dspace/dspace-angular:latest-dist . FROM node:18-alpine as build diff --git a/docker/README.md b/docker/README.md index 42deb793f9..08801137b0 100644 --- a/docker/README.md +++ b/docker/README.md @@ -23,14 +23,14 @@ the Docker compose scripts in this 'docker' folder. This Dockerfile is used to build a *development* DSpace 7 Angular UI image, published as 'dspace/dspace-angular' ``` -docker build -t dspace/dspace-angular:dspace-7_x . +docker build -t dspace/dspace-angular:latest . ``` This image is built *automatically* after each commit is made to the `main` branch. Admins to our DockerHub repo can manually publish with the following command. ``` -docker push dspace/dspace-angular:dspace-7_x +docker push dspace/dspace-angular:latest ``` ### Dockerfile.dist @@ -39,7 +39,7 @@ The `Dockerfile.dist` is used to generate a *production* build and runtime envir ```bash # build the latest image -docker build -f Dockerfile.dist -t dspace/dspace-angular:dspace-7_x-dist . +docker build -f Dockerfile.dist -t dspace/dspace-angular:latest-dist . ``` A default/demo version of this image is built *automatically*. diff --git a/docker/cli.yml b/docker/cli.yml index 54b83d4503..223ec356b9 100644 --- a/docker/cli.yml +++ b/docker/cli.yml @@ -16,7 +16,7 @@ version: "3.7" services: dspace-cli: - image: "${DOCKER_OWNER:-dspace}/dspace-cli:${DSPACE_VER:-dspace-7_x}" + image: "${DOCKER_OWNER:-dspace}/dspace-cli:${DSPACE_VER:-latest}" container_name: dspace-cli environment: # Below syntax may look odd, but it is how to override dspace.cfg settings via env variables. diff --git a/docker/docker-compose-ci.yml b/docker/docker-compose-ci.yml index 9ec8fe664a..edbb5b0759 100644 --- a/docker/docker-compose-ci.yml +++ b/docker/docker-compose-ci.yml @@ -35,7 +35,7 @@ services: solr__D__statistics__P__autoCommit: 'false' depends_on: - dspacedb - image: dspace/dspace:dspace-7_x-test + image: dspace/dspace:latest-test networks: dspacenet: ports: diff --git a/docker/docker-compose-dist.yml b/docker/docker-compose-dist.yml index 1c75539da9..a9ee4a2656 100644 --- a/docker/docker-compose-dist.yml +++ b/docker/docker-compose-dist.yml @@ -27,7 +27,7 @@ services: DSPACE_REST_HOST: api7.dspace.org DSPACE_REST_PORT: 443 DSPACE_REST_NAMESPACE: /server - image: dspace/dspace-angular:dspace-7_x-dist + image: dspace/dspace-angular:${DSPACE_VER:-latest}-dist build: context: .. dockerfile: Dockerfile.dist diff --git a/docker/docker-compose-rest.yml b/docker/docker-compose-rest.yml index e5f62600e7..ea766600ef 100644 --- a/docker/docker-compose-rest.yml +++ b/docker/docker-compose-rest.yml @@ -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: "${DOCKER_OWNER:-dspace}/dspace:${DSPACE_VER:-dspace-7_x-test}" + image: "${DOCKER_OWNER:-dspace}/dspace:${DSPACE_VER:-latest-test}" depends_on: - dspacedb networks: @@ -82,7 +82,7 @@ services: # DSpace Solr container dspacesolr: container_name: dspacesolr - image: "${DOCKER_OWNER:-dspace}/dspace-solr:${DSPACE_VER:-dspace-7_x}" + image: "${DOCKER_OWNER:-dspace}/dspace-solr:${DSPACE_VER:-latest}" # Needs main 'dspace' container to start first to guarantee access to solr_configs depends_on: - dspace diff --git a/docker/docker-compose.yml b/docker/docker-compose.yml index 1387b1de39..1071b8d6ce 100644 --- a/docker/docker-compose.yml +++ b/docker/docker-compose.yml @@ -24,7 +24,7 @@ services: DSPACE_REST_HOST: localhost DSPACE_REST_PORT: 8080 DSPACE_REST_NAMESPACE: /server - image: dspace/dspace-angular:dspace-7_x + image: dspace/dspace-angular:${DSPACE_VER:-latest} build: context: .. dockerfile: Dockerfile From 338b63ebb8ed847dfd2d2d872b2bc0a4994c7b83 Mon Sep 17 00:00:00 2001 From: Tim Donohue Date: Fri, 28 Jul 2023 14:10:44 -0500 Subject: [PATCH 406/409] Add action to automatically create a port PR when specified --- .../workflows/port_merged_pull_request.yml | 44 +++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 .github/workflows/port_merged_pull_request.yml diff --git a/.github/workflows/port_merged_pull_request.yml b/.github/workflows/port_merged_pull_request.yml new file mode 100644 index 0000000000..50faf3f886 --- /dev/null +++ b/.github/workflows/port_merged_pull_request.yml @@ -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 }} \ No newline at end of file From d75d12b423206e0261372b372c27c04c36336cff Mon Sep 17 00:00:00 2001 From: Tim Donohue Date: Fri, 28 Jul 2023 14:11:08 -0500 Subject: [PATCH 407/409] Minor update to label_merge_conflicts to ignore any errors (seem random at this time) --- .github/workflows/label_merge_conflicts.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/label_merge_conflicts.yml b/.github/workflows/label_merge_conflicts.yml index 7ea3327741..ccc6c401c0 100644 --- a/.github/workflows/label_merge_conflicts.yml +++ b/.github/workflows/label_merge_conflicts.yml @@ -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 From ec821392565737f768b0cd95917eade7e5ae6589 Mon Sep 17 00:00:00 2001 From: Francesco Bacchelli Date: Mon, 7 Aug 2023 14:26:42 +0200 Subject: [PATCH 408/409] CST-11298 COAR: Update the first community PRs for DSpace target 8.0-SNAPSHOT --- .../project-entry-import-modal.component.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/suggestion-notifications/qa/project-entry-import-modal/project-entry-import-modal.component.html b/src/app/suggestion-notifications/qa/project-entry-import-modal/project-entry-import-modal.component.html index 35b4b396a7..42eb7e4b16 100644 --- a/src/app/suggestion-notifications/qa/project-entry-import-modal/project-entry-import-modal.component.html +++ b/src/app/suggestion-notifications/qa/project-entry-import-modal/project-entry-import-modal.component.html @@ -46,7 +46,7 @@ [disableHeader]="true" [hidePaginationDetail]="false" [selectionConfig]="{ repeatable: false, listId: entityListId }" - [showExport]="false" + [showCsvExport]="false" [linkType]="linkTypes.ExternalLink" [context]="context" (deselectObject)="deselectEntity()" From 9b556fd7039449c9b8a762cb335f0b1b813001da Mon Sep 17 00:00:00 2001 From: Francesco Bacchelli Date: Tue, 22 Aug 2023 11:16:30 +0200 Subject: [PATCH 409/409] Merge branch CST-5249_suggestion of https://github.com/4Science/DSpace into CST-11299 --- .../builders/remote-data-build.service.ts | 1 + src/app/core/core.module.ts | 6 +- .../suggestion-objects.resource-type.ts | 16 ----- .../suggestion-source-object.resource-type.ts | 9 +++ .../models/suggestion-source.model.ts | 2 +- .../suggestion-target-object.resource-type.ts | 9 +++ .../models/suggestion-target.model.ts | 2 +- .../source/suggestion-source-data.service.ts | 2 +- .../suggestions-data.service.ts | 4 +- .../target/suggestion-target-data.service.ts | 3 +- src/app/home-page/home-page.component.html | 1 + src/app/home-page/home-page.module.ts | 18 ++--- src/app/menu.resolver.ts | 12 ++++ .../my-dspace-page.component.html | 1 + .../my-dspace-page/my-dspace-page.module.ts | 18 ++--- .../profile-page/profile-page.component.html | 1 + src/app/profile-page/profile-page.module.ts | 16 +++-- .../dso-selector-modal-wrapper.component.ts | 18 ++++- .../reciter-suggestions/selectors.ts | 10 +-- .../suggestion-targets.component.ts | 1 + .../suggestion-targets.effects.ts | 2 +- .../suggestion-targets.state.service.ts | 14 ++-- .../suggestions-popup.component.ts | 2 + .../suggestions.service.ts | 4 +- .../suggestion-notifications.module.ts | 12 ++++ src/assets/i18n/en.json5 | 68 +++++++++++++++++++ src/themes/custom/lazy-theme.module.ts | 3 + 27 files changed, 193 insertions(+), 62 deletions(-) create mode 100644 src/app/core/suggestion-notifications/reciter-suggestions/models/suggestion-source-object.resource-type.ts create mode 100644 src/app/core/suggestion-notifications/reciter-suggestions/models/suggestion-target-object.resource-type.ts diff --git a/src/app/core/cache/builders/remote-data-build.service.ts b/src/app/core/cache/builders/remote-data-build.service.ts index 075bf3ca0c..5b5e362406 100644 --- a/src/app/core/cache/builders/remote-data-build.service.ts +++ b/src/app/core/cache/builders/remote-data-build.service.ts @@ -161,6 +161,7 @@ export class RemoteDataBuildService { } else { // in case the elements of the paginated list were already filled in, because they're UnCacheableObjects paginatedList.page = paginatedList.page + .filter((obj: any) => obj != null) .map((obj: any) => this.plainObjectToInstance(obj)) .map((obj: any) => this.linkService.resolveLinks(obj, ...pageLink.linksToFollow) diff --git a/src/app/core/core.module.ts b/src/app/core/core.module.ts index e176af7d55..7acf132df9 100644 --- a/src/app/core/core.module.ts +++ b/src/app/core/core.module.ts @@ -185,6 +185,8 @@ import { FlatBrowseDefinition } from './shared/flat-browse-definition.model'; import { ValueListBrowseDefinition } from './shared/value-list-browse-definition.model'; import { NonHierarchicalBrowseDefinition } from './shared/non-hierarchical-browse-definition'; import { BulkAccessConditionOptions } from './config/models/bulk-access-condition-options.model'; +import { SuggestionTarget } from './suggestion-notifications/reciter-suggestions/models/suggestion-target.model'; +import { SuggestionSource } from './suggestion-notifications/reciter-suggestions/models/suggestion-source.model'; /** * When not in production, endpoint responses can be mocked for testing purposes @@ -386,7 +388,9 @@ export const models = IdentifierData, Subscription, ItemRequest, - BulkAccessConditionOptions + BulkAccessConditionOptions, + SuggestionTarget, + SuggestionSource ]; @NgModule({ diff --git a/src/app/core/suggestion-notifications/reciter-suggestions/models/suggestion-objects.resource-type.ts b/src/app/core/suggestion-notifications/reciter-suggestions/models/suggestion-objects.resource-type.ts index e31006959f..8f87027a8c 100644 --- a/src/app/core/suggestion-notifications/reciter-suggestions/models/suggestion-objects.resource-type.ts +++ b/src/app/core/suggestion-notifications/reciter-suggestions/models/suggestion-objects.resource-type.ts @@ -1,21 +1,5 @@ import { ResourceType } from '../../../shared/resource-type'; -/** - * The resource type for the Suggestion Target object - * - * Needs to be in a separate file to prevent circular - * dependencies in webpack. - */ -export const SUGGESTION_TARGET = new ResourceType('suggestiontarget'); - -/** - * The resource type for the Suggestion Source object - * - * Needs to be in a separate file to prevent circular - * dependencies in webpack. - */ -export const SUGGESTION_SOURCE = new ResourceType('suggestionsource'); - /** * The resource type for the Suggestion object * diff --git a/src/app/core/suggestion-notifications/reciter-suggestions/models/suggestion-source-object.resource-type.ts b/src/app/core/suggestion-notifications/reciter-suggestions/models/suggestion-source-object.resource-type.ts new file mode 100644 index 0000000000..2e26fe4301 --- /dev/null +++ b/src/app/core/suggestion-notifications/reciter-suggestions/models/suggestion-source-object.resource-type.ts @@ -0,0 +1,9 @@ +import { ResourceType } from '../../../shared/resource-type'; + +/** + * The resource type for the Suggestion Source object + * + * Needs to be in a separate file to prevent circular + * dependencies in webpack. + */ +export const SUGGESTION_SOURCE = new ResourceType('suggestionsource'); diff --git a/src/app/core/suggestion-notifications/reciter-suggestions/models/suggestion-source.model.ts b/src/app/core/suggestion-notifications/reciter-suggestions/models/suggestion-source.model.ts index 64ddf9863c..007520800d 100644 --- a/src/app/core/suggestion-notifications/reciter-suggestions/models/suggestion-source.model.ts +++ b/src/app/core/suggestion-notifications/reciter-suggestions/models/suggestion-source.model.ts @@ -1,6 +1,6 @@ import { autoserialize, deserialize } from 'cerialize'; -import { SUGGESTION_SOURCE } from './suggestion-objects.resource-type'; +import { SUGGESTION_SOURCE } from './suggestion-source-object.resource-type'; import { excludeFromEquals } from '../../../utilities/equals.decorators'; import { ResourceType } from '../../../shared/resource-type'; import { HALLink } from '../../../shared/hal-link.model'; diff --git a/src/app/core/suggestion-notifications/reciter-suggestions/models/suggestion-target-object.resource-type.ts b/src/app/core/suggestion-notifications/reciter-suggestions/models/suggestion-target-object.resource-type.ts new file mode 100644 index 0000000000..71dd41912a --- /dev/null +++ b/src/app/core/suggestion-notifications/reciter-suggestions/models/suggestion-target-object.resource-type.ts @@ -0,0 +1,9 @@ +import { ResourceType } from '../../../shared/resource-type'; + +/** + * The resource type for the Suggestion Target object + * + * Needs to be in a separate file to prevent circular + * dependencies in webpack. + */ +export const SUGGESTION_TARGET = new ResourceType('suggestiontarget'); diff --git a/src/app/core/suggestion-notifications/reciter-suggestions/models/suggestion-target.model.ts b/src/app/core/suggestion-notifications/reciter-suggestions/models/suggestion-target.model.ts index 970a8e7e28..2afe170e77 100644 --- a/src/app/core/suggestion-notifications/reciter-suggestions/models/suggestion-target.model.ts +++ b/src/app/core/suggestion-notifications/reciter-suggestions/models/suggestion-target.model.ts @@ -2,7 +2,7 @@ import { autoserialize, deserialize } from 'cerialize'; import { CacheableObject } from '../../../cache/cacheable-object.model'; -import { SUGGESTION_TARGET } from './suggestion-objects.resource-type'; +import { SUGGESTION_TARGET } from './suggestion-target-object.resource-type'; import { excludeFromEquals } from '../../../utilities/equals.decorators'; import { ResourceType } from '../../../shared/resource-type'; import { HALLink } from '../../../shared/hal-link.model'; diff --git a/src/app/core/suggestion-notifications/reciter-suggestions/source/suggestion-source-data.service.ts b/src/app/core/suggestion-notifications/reciter-suggestions/source/suggestion-source-data.service.ts index e4286c6b5b..c3e142044e 100644 --- a/src/app/core/suggestion-notifications/reciter-suggestions/source/suggestion-source-data.service.ts +++ b/src/app/core/suggestion-notifications/reciter-suggestions/source/suggestion-source-data.service.ts @@ -1,6 +1,6 @@ import { Injectable } from '@angular/core'; import { dataService } from '../../../data/base/data-service.decorator'; -import { SUGGESTION_SOURCE } from '../models/suggestion-objects.resource-type'; +import { SUGGESTION_SOURCE } from '../models/suggestion-source-object.resource-type'; import { IdentifiableDataService } from '../../../data/base/identifiable-data.service'; import { SuggestionSource } from '../models/suggestion-source.model'; import { FindAllData, FindAllDataImpl } from '../../../data/base/find-all-data'; diff --git a/src/app/core/suggestion-notifications/reciter-suggestions/suggestions-data.service.ts b/src/app/core/suggestion-notifications/reciter-suggestions/suggestions-data.service.ts index abdcbca0c1..944a13e3a3 100644 --- a/src/app/core/suggestion-notifications/reciter-suggestions/suggestions-data.service.ts +++ b/src/app/core/suggestion-notifications/reciter-suggestions/suggestions-data.service.ts @@ -168,8 +168,8 @@ export class SuggestionsDataService { ...linksToFollow: FollowLinkConfig[] ): Observable>> { options.searchParams = [new RequestParam('target', userId)]; - - return this.suggestionTargetsDataService.getTargetsByUser(this.searchFindByTargetMethod, options, ...linksToFollow); + //return this.suggestionTargetsDataService.getTargetsByUser(this.searchFindByTargetMethod, options, ...linksToFollow); + return this.suggestionTargetsDataService.getTargetsByUser(userId, options, ...linksToFollow); } /** diff --git a/src/app/core/suggestion-notifications/reciter-suggestions/target/suggestion-target-data.service.ts b/src/app/core/suggestion-notifications/reciter-suggestions/target/suggestion-target-data.service.ts index 372d1f9917..ce5f131c1d 100644 --- a/src/app/core/suggestion-notifications/reciter-suggestions/target/suggestion-target-data.service.ts +++ b/src/app/core/suggestion-notifications/reciter-suggestions/target/suggestion-target-data.service.ts @@ -1,6 +1,6 @@ import { Injectable } from '@angular/core'; import { dataService } from '../../../data/base/data-service.decorator'; -import { SUGGESTION_TARGET } from '../models/suggestion-objects.resource-type'; + import { IdentifiableDataService } from '../../../data/base/identifiable-data.service'; import { SuggestionTarget } from '../models/suggestion-target.model'; import { FindAllData, FindAllDataImpl } from '../../../data/base/find-all-data'; @@ -20,6 +20,7 @@ import { Observable } from 'rxjs/internal/Observable'; import { RequestParam } from '../../../cache/models/request-param.model'; import { SearchData, SearchDataImpl } from '../../../data/base/search-data'; import { DefaultChangeAnalyzer } from '../../../data/default-change-analyzer.service'; +import { SUGGESTION_TARGET } from '../models/suggestion-target-object.resource-type'; @Injectable() @dataService(SUGGESTION_TARGET) diff --git a/src/app/home-page/home-page.component.html b/src/app/home-page/home-page.component.html index caa86ac290..49329b3f04 100644 --- a/src/app/home-page/home-page.component.html +++ b/src/app/home-page/home-page.component.html @@ -7,3 +7,4 @@
    + diff --git a/src/app/home-page/home-page.module.ts b/src/app/home-page/home-page.module.ts index 1681abd805..00f9dbd8f9 100644 --- a/src/app/home-page/home-page.module.ts +++ b/src/app/home-page/home-page.module.ts @@ -13,6 +13,7 @@ import { RecentItemListComponent } from './recent-item-list/recent-item-list.com import { JournalEntitiesModule } from '../entity-groups/journal-entities/journal-entities.module'; import { ResearchEntitiesModule } from '../entity-groups/research-entities/research-entities.module'; import { ThemedTopLevelCommunityListComponent } from './top-level-community-list/themed-top-level-community-list.component'; +import { SuggestionNotificationsModule } from '../suggestion-notifications/suggestion-notifications.module'; const DECLARATIONS = [ HomePageComponent, @@ -25,14 +26,15 @@ const DECLARATIONS = [ ]; @NgModule({ - imports: [ - CommonModule, - SharedModule.withEntryComponents(), - JournalEntitiesModule.withEntryComponents(), - ResearchEntitiesModule.withEntryComponents(), - HomePageRoutingModule, - StatisticsModule.forRoot() - ], + imports: [ + CommonModule, + SharedModule.withEntryComponents(), + JournalEntitiesModule.withEntryComponents(), + ResearchEntitiesModule.withEntryComponents(), + HomePageRoutingModule, + StatisticsModule.forRoot(), + SuggestionNotificationsModule + ], declarations: [ ...DECLARATIONS, ], diff --git a/src/app/menu.resolver.ts b/src/app/menu.resolver.ts index 7a3a16d626..70e2b6462f 100644 --- a/src/app/menu.resolver.ts +++ b/src/app/menu.resolver.ts @@ -47,6 +47,7 @@ import { import { ExportBatchSelectorComponent } from './shared/dso-selector/modal-wrappers/export-batch-selector/export-batch-selector.component'; +import { NOTIFICATIONS_RECITER_SUGGESTION_PATH } from './admin/admin-notifications/admin-notifications-routing-paths'; /** * Creates all of the app's menus @@ -555,6 +556,17 @@ export class MenuResolver implements Resolve { link: '/admin/notifications/quality-assurance' } as LinkMenuItemModel, }, + { + id: 'notifications_reciter', + parentID: 'notifications', + active: false, + visible: authorized, + model: { + type: MenuItemType.LINK, + text: 'menu.section.notifications_reciter', + link: '/admin/notifications/' + NOTIFICATIONS_RECITER_SUGGESTION_PATH + } as LinkMenuItemModel, + }, /* Admin Search */ { id: 'admin_search', diff --git a/src/app/my-dspace-page/my-dspace-page.component.html b/src/app/my-dspace-page/my-dspace-page.component.html index ea5784170f..c5e49b0cec 100644 --- a/src/app/my-dspace-page/my-dspace-page.component.html +++ b/src/app/my-dspace-page/my-dspace-page.component.html @@ -1,5 +1,6 @@
    +
    +
    diff --git a/src/app/profile-page/profile-page.module.ts b/src/app/profile-page/profile-page.module.ts index 0e2902de33..c5bfad1713 100644 --- a/src/app/profile-page/profile-page.module.ts +++ b/src/app/profile-page/profile-page.module.ts @@ -12,16 +12,18 @@ import { ThemedProfilePageComponent } from './themed-profile-page.component'; import { FormModule } from '../shared/form/form.module'; import { UiSwitchModule } from 'ngx-ui-switch'; import { ProfileClaimItemModalComponent } from './profile-claim-item-modal/profile-claim-item-modal.component'; +import { SuggestionNotificationsModule } from '../suggestion-notifications/suggestion-notifications.module'; @NgModule({ - imports: [ - ProfilePageRoutingModule, - CommonModule, - SharedModule, - FormModule, - UiSwitchModule - ], + imports: [ + ProfilePageRoutingModule, + CommonModule, + SharedModule, + FormModule, + UiSwitchModule, + SuggestionNotificationsModule + ], exports: [ ProfilePageComponent, ThemedProfilePageComponent, diff --git a/src/app/shared/dso-selector/modal-wrappers/dso-selector-modal-wrapper.component.ts b/src/app/shared/dso-selector/modal-wrappers/dso-selector-modal-wrapper.component.ts index 3f81687c9f..6798449094 100644 --- a/src/app/shared/dso-selector/modal-wrappers/dso-selector-modal-wrapper.component.ts +++ b/src/app/shared/dso-selector/modal-wrappers/dso-selector-modal-wrapper.component.ts @@ -1,4 +1,4 @@ -import { Component, Input, OnInit } from '@angular/core'; +import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core'; import { ActivatedRoute, ActivatedRouteSnapshot } from '@angular/router'; import { DSpaceObject } from '../../../core/shared/dspace-object.model'; import { RemoteData } from '../../../core/data/remote-data'; @@ -29,6 +29,11 @@ export abstract class DSOSelectorModalWrapperComponent implements OnInit { */ @Input() dsoRD: RemoteData; + /** + * Representing if component should emit value of selected entries or navigate + */ + @Input() emitOnly = false; + /** * Optional header to display above the selection list * Supports i18n keys @@ -50,6 +55,11 @@ export abstract class DSOSelectorModalWrapperComponent implements OnInit { */ action: SelectorActionType; + /** + * Event emitted when a DSO entry is selected if emitOnly is set to true + */ + @Output() select: EventEmitter = new EventEmitter(); + /** * Default DSO ordering */ @@ -93,7 +103,11 @@ export abstract class DSOSelectorModalWrapperComponent implements OnInit { */ selectObject(dso: DSpaceObject) { this.close(); - this.navigate(dso); + if (this.emitOnly) { + this.select.emit(dso); + } else { + this.navigate(dso); + } } /** diff --git a/src/app/suggestion-notifications/reciter-suggestions/selectors.ts b/src/app/suggestion-notifications/reciter-suggestions/selectors.ts index cbb99fe869..ee90613271 100644 --- a/src/app/suggestion-notifications/reciter-suggestions/selectors.ts +++ b/src/app/suggestion-notifications/reciter-suggestions/selectors.ts @@ -27,7 +27,7 @@ export function reciterSuggestionTargetStateSelector(): MemoizedSelector { return subStateSelector(reciterSuggestionTargetStateSelector(), 'targets'); @@ -47,7 +47,7 @@ export const isReciterSuggestionTargetLoadedSelector = createSelector(_getRecite * @function isDeduplicationSetsProcessingSelector * @return {boolean} */ -export const isreciterSuggestionTargetProcessingSelector = createSelector(_getReciterSuggestionTargetState, +export const isReciterSuggestionTargetProcessingSelector = createSelector(_getReciterSuggestionTargetState, (state: SuggestionNotificationsState) => state.suggestionTarget.processing ); @@ -56,7 +56,7 @@ export const isreciterSuggestionTargetProcessingSelector = createSelector(_getRe * @function getreciterSuggestionTargetTotalPagesSelector * @return {number} */ -export const getreciterSuggestionTargetTotalPagesSelector = createSelector(_getReciterSuggestionTargetState, +export const getReciterSuggestionTargetTotalPagesSelector = createSelector(_getReciterSuggestionTargetState, (state: SuggestionNotificationsState) => state.suggestionTarget.totalPages ); @@ -65,7 +65,7 @@ export const getreciterSuggestionTargetTotalPagesSelector = createSelector(_getR * @function getreciterSuggestionTargetCurrentPageSelector * @return {number} */ -export const getreciterSuggestionTargetCurrentPageSelector = createSelector(_getReciterSuggestionTargetState, +export const getReciterSuggestionTargetCurrentPageSelector = createSelector(_getReciterSuggestionTargetState, (state: SuggestionNotificationsState) => state.suggestionTarget.currentPage ); @@ -74,7 +74,7 @@ export const getreciterSuggestionTargetCurrentPageSelector = createSelector(_get * @function getreciterSuggestionTargetTotalsSelector * @return {number} */ -export const getreciterSuggestionTargetTotalsSelector = createSelector(_getReciterSuggestionTargetState, +export const getReciterSuggestionTargetTotalsSelector = createSelector(_getReciterSuggestionTargetState, (state: SuggestionNotificationsState) => state.suggestionTarget.totalElements ); diff --git a/src/app/suggestion-notifications/reciter-suggestions/suggestion-targets/suggestion-targets.component.ts b/src/app/suggestion-notifications/reciter-suggestions/suggestion-targets/suggestion-targets.component.ts index cfa168e2b8..e5524765da 100644 --- a/src/app/suggestion-notifications/reciter-suggestions/suggestion-targets/suggestion-targets.component.ts +++ b/src/app/suggestion-notifications/reciter-suggestions/suggestion-targets/suggestion-targets.component.ts @@ -136,6 +136,7 @@ export class SuggestionTargetsComponent implements OnInit { distinctUntilChanged(), take(1) ).subscribe((options: PaginationComponentOptions) => { + console.log('HELLO suggestion called!', options); this.suggestionTargetsStateService.dispatchRetrieveReciterSuggestionTargets( this.source, options.pageSize, diff --git a/src/app/suggestion-notifications/reciter-suggestions/suggestion-targets/suggestion-targets.effects.ts b/src/app/suggestion-notifications/reciter-suggestions/suggestion-targets/suggestion-targets.effects.ts index 3718e0cfad..6ab587a6c2 100644 --- a/src/app/suggestion-notifications/reciter-suggestions/suggestion-targets/suggestion-targets.effects.ts +++ b/src/app/suggestion-notifications/reciter-suggestions/suggestion-targets/suggestion-targets.effects.ts @@ -62,7 +62,7 @@ export class SuggestionTargetsEffects { /** * Fetch the current user suggestion */ - refreshUserTargets$ = createEffect(() => this.actions$.pipe( + RefreshUserSuggestionsAction = createEffect(() => this.actions$.pipe( ofType(SuggestionTargetActionTypes.REFRESH_USER_SUGGESTIONS), switchMap((action: RefreshUserSuggestionsAction) => { return this.store$.select((state: any) => state.core.auth.userId) diff --git a/src/app/suggestion-notifications/reciter-suggestions/suggestion-targets/suggestion-targets.state.service.ts b/src/app/suggestion-notifications/reciter-suggestions/suggestion-targets/suggestion-targets.state.service.ts index 97792df6af..fec9e01f3c 100644 --- a/src/app/suggestion-notifications/reciter-suggestions/suggestion-targets/suggestion-targets.state.service.ts +++ b/src/app/suggestion-notifications/reciter-suggestions/suggestion-targets/suggestion-targets.state.service.ts @@ -7,10 +7,10 @@ import { map } from 'rxjs/operators'; import { getCurrentUserSuggestionTargetsSelector, getCurrentUserSuggestionTargetsVisitedSelector, - getreciterSuggestionTargetCurrentPageSelector, - getreciterSuggestionTargetTotalsSelector, + getReciterSuggestionTargetCurrentPageSelector, + getReciterSuggestionTargetTotalsSelector, isReciterSuggestionTargetLoadedSelector, - isreciterSuggestionTargetProcessingSelector, + isReciterSuggestionTargetProcessingSelector, reciterSuggestionTargetObjectSelector } from '../selectors'; import { SuggestionTarget } from '../../../core/suggestion-notifications/reciter-suggestions/models/suggestion-target.model'; @@ -74,7 +74,7 @@ export class SuggestionTargetsStateService { * 'true' if there are operations running on the targets (ex.: a REST call), 'false' otherwise. */ public isReciterSuggestionTargetsProcessing(): Observable { - return this.store.pipe(select(isreciterSuggestionTargetProcessingSelector)); + return this.store.pipe(select(isReciterSuggestionTargetProcessingSelector)); } /** @@ -84,7 +84,7 @@ export class SuggestionTargetsStateService { * The number of the Reciter Suggestion Targets pages. */ public getReciterSuggestionTargetsTotalPages(): Observable { - return this.store.pipe(select(getreciterSuggestionTargetTotalsSelector)); + return this.store.pipe(select(getReciterSuggestionTargetTotalsSelector)); } /** @@ -94,7 +94,7 @@ export class SuggestionTargetsStateService { * The number of the current Reciter Suggestion Targets page. */ public getReciterSuggestionTargetsCurrentPage(): Observable { - return this.store.pipe(select(getreciterSuggestionTargetCurrentPageSelector)); + return this.store.pipe(select(getReciterSuggestionTargetCurrentPageSelector)); } /** @@ -104,7 +104,7 @@ export class SuggestionTargetsStateService { * The number of the Reciter Suggestion Targets. */ public getReciterSuggestionTargetsTotals(): Observable { - return this.store.pipe(select(getreciterSuggestionTargetTotalsSelector)); + return this.store.pipe(select(getReciterSuggestionTargetTotalsSelector)); } /** diff --git a/src/app/suggestion-notifications/reciter-suggestions/suggestions-popup/suggestions-popup.component.ts b/src/app/suggestion-notifications/reciter-suggestions/suggestions-popup/suggestions-popup.component.ts index 0195f074ae..c0f94cadce 100644 --- a/src/app/suggestion-notifications/reciter-suggestions/suggestions-popup/suggestions-popup.component.ts +++ b/src/app/suggestion-notifications/reciter-suggestions/suggestions-popup/suggestions-popup.component.ts @@ -31,6 +31,8 @@ export class SuggestionsPopupComponent implements OnInit, OnDestroy { } public initializePopup() { + console.log('POPUP INIT dispatchRefreshUserSuggestionsAction'); + this.reciterSuggestionStateService.dispatchRefreshUserSuggestionsAction(); const notifier = new Subject(); this.subscription = combineLatest([ this.reciterSuggestionStateService.getCurrentUserSuggestionTargets(), diff --git a/src/app/suggestion-notifications/reciter-suggestions/suggestions.service.ts b/src/app/suggestion-notifications/reciter-suggestions/suggestions.service.ts index 662b4c03de..b760ddf34d 100644 --- a/src/app/suggestion-notifications/reciter-suggestions/suggestions.service.ts +++ b/src/app/suggestion-notifications/reciter-suggestions/suggestions.service.ts @@ -49,7 +49,9 @@ export class SuggestionsService { /** * Initialize the service variables. * @param {AuthService} authService - * @param {ResearcherProfileService} researcherProfileService + * @param {ResearcherProfileDataService} researcherProfileService + * @param {SuggestionSourceDataService} suggestionSourceDataService + * @param {SuggestionTargetDataService} suggestionTargetDataService * @param {SuggestionsDataService} suggestionsDataService */ constructor( diff --git a/src/app/suggestion-notifications/suggestion-notifications.module.ts b/src/app/suggestion-notifications/suggestion-notifications.module.ts index 4369d17375..fa9d81eb75 100644 --- a/src/app/suggestion-notifications/suggestion-notifications.module.ts +++ b/src/app/suggestion-notifications/suggestion-notifications.module.ts @@ -40,6 +40,15 @@ import { } from './reciter-suggestions/suggestions-notification/suggestions-notification.component'; import { SuggestionsService } from './reciter-suggestions/suggestions.service'; import { SuggestionsDataService } from '../core/suggestion-notifications/reciter-suggestions/suggestions-data.service'; +import { + SuggestionSourceDataService +} from '../core/suggestion-notifications/reciter-suggestions/source/suggestion-source-data.service'; +import { + SuggestionTargetDataService +} from '../core/suggestion-notifications/reciter-suggestions/target/suggestion-target-data.service'; +import { + SuggestionTargetsStateService +} from './reciter-suggestions/suggestion-targets/suggestion-targets.state.service'; const MODULES = [ CommonModule, @@ -77,6 +86,9 @@ const PROVIDERS = [ QualityAssuranceSourceDataService, QualityAssuranceEventDataService, SuggestionsService, + SuggestionSourceDataService, + SuggestionTargetDataService, + SuggestionTargetsStateService, SuggestionsDataService ]; diff --git a/src/assets/i18n/en.json5 b/src/assets/i18n/en.json5 index 4c13ec73d1..0d90ca693d 100644 --- a/src/assets/i18n/en.json5 +++ b/src/assets/i18n/en.json5 @@ -24,6 +24,10 @@ "404.page-not-found": "page not found", + "admin.notifications.recitersuggestion.breadcrumbs": "Suggestions", + + "admin.notifications.recitersuggestion.page.title": "Suggestions", + "error-page.description.401": "unauthorized", "error-page.description.403": "forbidden", @@ -3052,6 +3056,12 @@ "mydspace.view-btn": "View", + "mydspace.import": "Import", + + "mydspace.notification.suggestion": "We found {{count}} publications
    in the {{source}} that seems to be related to your profile.
    Please review the suggestions", + + "mydspace.notification.suggestion.page": "We found {{count}} {{type}} in the {{source}} that seems to be related to your profile. Please review the suggestions.", + "nav.browse.header": "All of DSpace", "nav.community-browse.header": "By Community", @@ -3514,6 +3524,64 @@ "media-viewer.playlist": "Playlist", + "reciter.suggestion.loading": "Loading ...", + + "reciter.suggestion.title": "Suggestions", + + "reciter.suggestion.targets.description": "Below you can see all the suggestions ", + + "reciter.suggestion.targets": "Current Suggestions", + + "reciter.suggestion.table.name": "Researcher Name", + + "reciter.suggestion.table.actions": "Actions", + + "reciter.suggestion.button.review": "Review {{ total }} suggestion(s)", + + "reciter.suggestion.noTargets": "No target found.", + + "reciter.suggestion.target.error.service.retrieve": "An error occurred while loading the Suggestion targets", + + "reciter.suggestion.evidence.type": "Type", + + "reciter.suggestion.evidence.score": "Score", + + "reciter.suggestion.evidence.notes": "Notes", + + "reciter.suggestion.approveAndImport": "Approve & import", + + "reciter.suggestion.approveAndImport.success": "The suggestion has been imported successfully. View.", + + "reciter.suggestion.approveAndImport.bulk": "Approve & import Selected", + + "reciter.suggestion.approveAndImport.bulk.success": "{{ count }} suggestions have been imported successfully ", + + "reciter.suggestion.approveAndImport.bulk.error": "{{ count }} suggestions haven't been imported due to unexpected server errors", + + "reciter.suggestion.notMine": "Not mine", + + "reciter.suggestion.notMine.success": "The suggestion has been discarded", + + "reciter.suggestion.notMine.bulk": "Not mine Selected", + + "reciter.suggestion.notMine.bulk.success": "{{ count }} suggestions have been discarded ", + + "reciter.suggestion.notMine.bulk.error": "{{ count }} suggestions haven't been discarded due to unexpected server errors", + + "reciter.suggestion.seeEvidence": "See evidence", + + "reciter.suggestion.hideEvidence": "Hide evidence", + + "reciter.suggestion.suggestionFor": "Suggestion for", + + "reciter.suggestion.source.oaire": "OpenAIRE Graph", + + "reciter.suggestion.from.source": "from the ", + + "reciter.suggestion.totalScore": "Total Score", + + "reciter.suggestion.type.oaire": "OpenAIRE", + "register-email.title": "New user registration", "register-page.create-profile.header": "Create Profile", diff --git a/src/themes/custom/lazy-theme.module.ts b/src/themes/custom/lazy-theme.module.ts index edb3f5478c..771e9e1b08 100644 --- a/src/themes/custom/lazy-theme.module.ts +++ b/src/themes/custom/lazy-theme.module.ts @@ -156,6 +156,8 @@ import { ItemStatusComponent } from './app/item-page/edit-item-page/item-status/ import { EditBitstreamPageComponent } from './app/bitstream-page/edit-bitstream-page/edit-bitstream-page.component'; import { FormModule } from '../../app/shared/form/form.module'; import { RequestCopyModule } from 'src/app/request-copy/request-copy.module'; +import { SuggestionNotificationsModule } from '../../app/suggestion-notifications/suggestion-notifications.module'; + const DECLARATIONS = [ FileSectionComponent, @@ -299,6 +301,7 @@ const DECLARATIONS = [ NgxGalleryModule, FormModule, RequestCopyModule, + SuggestionNotificationsModule ], declarations: DECLARATIONS, exports: [