Merge remote-tracking branch 'github/DURACOM-191' into DURACOM-191

This commit is contained in:
Andrea Barbasso
2024-01-19 12:25:17 +01:00
18 changed files with 73 additions and 42 deletions

View File

@@ -40,7 +40,8 @@
"cypress:run": "cypress run",
"env:yaml": "ts-node --project ./tsconfig.ts-node.json scripts/env-to-yaml.ts",
"base-href": "ts-node --project ./tsconfig.ts-node.json scripts/base-href.ts",
"check-circ-deps": "npx madge --exclude '(bitstream|bundle|collection|config-submission-form|eperson|item|version)\\.model\\.ts$' --circular --extensions ts ./"
"check-circ-deps": "npx madge --exclude '(bitstream|bundle|collection|config-submission-form|eperson|item|version)\\.model\\.ts$' --circular --extensions ts ./",
"check-circ-deps-fix": "npx madge --exclude '(bitstream|bundle|collection|config-submission-form|eperson|item|version)\\.model\\.ts$|data\\-services\\-map\\.ts' --circular --extensions ts ./"
},
"browser": {
"fs": false,

View File

@@ -2,11 +2,11 @@ import { first } from 'rxjs/operators';
import { BrowseByGuard } from './browse-by-guard';
import { of as observableOf } from 'rxjs';
import { createFailedRemoteDataObject$, createSuccessfulRemoteDataObject$ } from '../shared/remote-data.utils';
import { BrowseByDataType } from './browse-by-switcher/browse-by-decorator';
import { ValueListBrowseDefinition } from '../core/shared/value-list-browse-definition.model';
import { DSONameServiceMock } from '../shared/mocks/dso-name.service.mock';
import { DSONameService } from '../core/breadcrumbs/dso-name.service';
import { RouterStub } from '../shared/testing/router.stub';
import { BrowseByDataType } from './browse-by-switcher/browse-by-data-type';
describe('BrowseByGuard', () => {
describe('canActivate', () => {

View File

@@ -0,0 +1,6 @@
export enum BrowseByDataType {
Title = 'title',
Metadata = 'text',
Date = 'date',
Hierarchy = 'hierarchy'
}

View File

@@ -1,4 +1,5 @@
import { BrowseByDataType, rendersBrowseBy } from './browse-by-decorator';
import { rendersBrowseBy } from './browse-by-decorator';
import { BrowseByDataType } from './browse-by-data-type';
describe('BrowseByDecorator', () => {
const titleDecorator = rendersBrowseBy(BrowseByDataType.Title);

View File

@@ -13,13 +13,7 @@ import {
ThemedBrowseByTaxonomyPageComponent
} from '../browse-by-taxonomy-page/themed-browse-by-taxonomy-page.component';
import { ThemedBrowseByTitlePageComponent } from '../browse-by-title-page/themed-browse-by-title-page.component';
export enum BrowseByDataType {
Title = 'title',
Metadata = 'text',
Date = 'date',
Hierarchy = 'hierarchy'
}
import { BrowseByDataType } from './browse-by-data-type';
export const DEFAULT_BROWSE_BY_TYPE = BrowseByDataType.Metadata;

View File

@@ -2,12 +2,13 @@ import { BrowseBySwitcherComponent } from './browse-by-switcher.component';
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 { BROWSE_BY_COMPONENT_FACTORY } from './browse-by-decorator';
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';
import { BrowseByDataType } from './browse-by-data-type';
describe('BrowseBySwitcherComponent', () => {
let comp: BrowseBySwitcherComponent;

View File

@@ -1,4 +1,4 @@
import { Inject, Injectable, Injector } from '@angular/core';
import { Inject, Injectable, InjectionToken, Injector } from '@angular/core';
import { hasValue, isNotEmpty } from '../../../shared/empty.util';
import { FollowLinkConfig } from '../../../shared/utils/follow-link-config.model';
import { GenericConstructor } from '../../shared/generic-constructor';
@@ -10,7 +10,8 @@ import { HALDataService } from '../../data/base/hal-data-service.interface';
import { PaginatedList } from '../../data/paginated-list.model';
import { lazyService } from '../../lazy-service';
import { catchError, switchMap } from 'rxjs/operators';
import { LAZY_DATA_SERVICES } from '../../data-services-map';
import { APP_DATA_SERVICES_MAP, LazyDataServicesMap } from '../../../../config/app-config.interface';
/**
* A Service to handle the resolving and removing
@@ -21,6 +22,7 @@ export class LinkService {
constructor(
protected injector: Injector,
@Inject(APP_DATA_SERVICES_MAP) private map: InjectionToken<LazyDataServicesMap>,
@Inject(LINK_DEFINITION_FACTORY) private getLinkDefinition: <T extends HALResource>(source: GenericConstructor<T>, linkName: keyof T['_links']) => LinkDefinition<T>,
@Inject(LINK_DEFINITION_MAP_FACTORY) private getLinkDefinitions: <T extends HALResource>(source: GenericConstructor<T>) => Map<keyof T['_links'], LinkDefinition<T>>,
) {
@@ -50,7 +52,7 @@ export class LinkService {
public resolveLinkWithoutAttaching<T extends HALResource, U extends HALResource>(model, linkToFollow: FollowLinkConfig<T>): Observable<RemoteData<U | PaginatedList<U>>> {
const matchingLinkDef = this.getLinkDefinition(model.constructor, linkToFollow.name);
if (hasValue(matchingLinkDef)) {
const lazyProvider$: Observable<HALDataService<any>> = lazyService(LAZY_DATA_SERVICES[matchingLinkDef.resourceType.value], this.injector);
const lazyProvider$: Observable<HALDataService<any>> = lazyService(this.map[matchingLinkDef.resourceType.value], this.injector);
return lazyProvider$.pipe(
switchMap((provider: HALDataService<any>) => {
const link = model._links[matchingLinkDef.linkName];

View File

@@ -46,8 +46,6 @@ import { VERSION } from './shared/version.resource-type';
import { FEATURE } from './shared/feature.resource-type';
import { DSPACE_OBJECT } from './shared/dspace-object.resource-type';
import { BITSTREAM_FORMAT } from './shared/bitstream-format.resource-type';
import { Type } from '@angular/core';
import { HALDataService } from './data/base/hal-data-service.interface';
import { SYSTEMWIDEALERT } from '../system-wide-alert/system-wide-alert.resource-type';
import {
ACCESS_STATUS
@@ -56,8 +54,9 @@ import { SUBSCRIPTION } from '../shared/subscriptions/models/subscription.resour
import { SCRIPT } from '../process-page/scripts/script.resource-type';
import { PROCESS } from '../process-page/processes/process.resource-type';
import { IDENTIFIERS } from '../shared/object-list/identifier-data/identifier-data.resource-type';
import { LazyDataServicesMap } from '../../config/app-config.interface';
export const LAZY_DATA_SERVICES: {[key: string]: () => Promise<Type<HALDataService<any>>>} = {
export const LAZY_DATA_SERVICES: LazyDataServicesMap = {
[AUTHORIZATION.value]: () => import('./data/feature-authorization/authorization-data.service').then(m => m.AuthorizationDataService),
[BROWSE_DEFINITION.value]: () => import('./browse/browse-definition-data.service').then(m => m.BrowseDefinitionDataService),
[BULK_ACCESS_CONDITION_OPTIONS.value]: () => import('./config/bulk-access-config-data.service').then(m => m.BulkAccessConfigDataService),

View File

@@ -1,7 +1,7 @@
import { autoserialize, autoserializeAs, inheritSerialization } from 'cerialize';
import { SortOption } from './sort-option.model';
import { BrowseDefinition } from './browse-definition.model';
import { BrowseByDataType } from '../../browse-by/browse-by-data-type';
import { BrowseByDataType } from '../../browse-by/browse-by-switcher/browse-by-data-type';
/**
* Super class for NonHierarchicalBrowseDefinition models,

View File

@@ -10,7 +10,7 @@ import { CheckAuthenticationTokenAction } from './core/auth/auth.actions';
import { CorrelationIdService } from './correlation-id/correlation-id.service';
import { APP_INITIALIZER, Inject, Provider, Type } from '@angular/core';
import { makeStateKey, TransferState } from '@angular/platform-browser';
import { APP_CONFIG, AppConfig } from '../config/app-config.interface';
import { APP_CONFIG, APP_DATA_SERVICES_MAP, AppConfig } from '../config/app-config.interface';
import { environment } from '../environments/environment';
import { AppState } from './app.reducer';
import isEqual from 'lodash/isEqual';
@@ -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 { LAZY_DATA_SERVICES } from './core/data-services-map';
/**
* Performs the initialization of the app.
@@ -90,6 +91,10 @@ export abstract class InitService {
deps: [ InitService ],
multi: true,
},
{
provide: APP_DATA_SERVICES_MAP,
useValue: LAZY_DATA_SERVICES,
},
];
}

View File

@@ -1,22 +1,34 @@
import { RelatedEntitiesSearchComponent } from './simple/related-entities/related-entities-search/related-entities-search.component';
import {
RelatedEntitiesSearchComponent
} from './simple/related-entities/related-entities-search/related-entities-search.component';
import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { SearchModule } from '../shared/search/search.module';
import { TranslateModule } from '@ngx-translate/core';
import { DYNAMIC_FORM_CONTROL_MAP_FN } from '@ng-dynamic-forms/core';
import { TabbedRelatedEntitiesSearchComponent } from './simple/related-entities/tabbed-related-entities-search/tabbed-related-entities-search.component';
import { ItemVersionsDeleteModalComponent } from './versions/item-versions-delete-modal/item-versions-delete-modal.component';
import { ItemVersionsSummaryModalComponent } from './versions/item-versions-summary-modal/item-versions-summary-modal.component';
import {
TabbedRelatedEntitiesSearchComponent
} from './simple/related-entities/tabbed-related-entities-search/tabbed-related-entities-search.component';
import {
ItemVersionsDeleteModalComponent
} from './versions/item-versions-delete-modal/item-versions-delete-modal.component';
import {
ItemVersionsSummaryModalComponent
} from './versions/item-versions-summary-modal/item-versions-summary-modal.component';
import { MetadataValuesComponent } from './field-components/metadata-values/metadata-values.component';
import { GenericItemPageFieldComponent } from './simple/field-components/specific-field/generic/generic-item-page-field.component';
import { MetadataRepresentationListComponent } from './simple/metadata-representation-list/metadata-representation-list.component';
import {
GenericItemPageFieldComponent
} from './simple/field-components/specific-field/generic/generic-item-page-field.component';
import {
MetadataRepresentationListComponent
} from './simple/metadata-representation-list/metadata-representation-list.component';
import { RelatedItemsComponent } from './simple/related-items/related-items-component';
import {
ThemedMetadataRepresentationListComponent
} from './simple/metadata-representation-list/themed-metadata-representation-list.component';
import {
dsDynamicFormControlMapFn
} from '../shared/form/builder/ds-dynamic-form-ui/ds-dynamic-form-control-container.map';
} from '../shared/form/builder/ds-dynamic-form-ui/ds-dynamic-form-control-container.component';
const ENTRY_COMPONENTS = [
ItemVersionsDeleteModalComponent,

View File

@@ -1,9 +1,9 @@
import { Component, EventEmitter, NgZone, OnDestroy, OnInit, Output } from '@angular/core';
import { combineLatest as observableCombineLatest, Observable, Subscription, BehaviorSubject } from 'rxjs';
import { BehaviorSubject, combineLatest as observableCombineLatest, Observable, Subscription } from 'rxjs';
import { NgbActiveModal, NgbNavModule } from '@ng-bootstrap/ng-bootstrap';
import { hasValue, isNotEmpty } from '../../../../empty.util';
import { map, skip, switchMap, take } from 'rxjs/operators';
import { SEARCH_CONFIG_SERVICE } from '../../../../../my-dspace-page/my-dspace-page.component';
import { SEARCH_CONFIG_SERVICE } from '../../../../../my-dspace-page/my-dspace-configuration.service';
import { SearchConfigurationService } from '../../../../../core/shared/search/search-configuration.service';
import { SelectableListService } from '../../../../object-list/selectable-list/selectable-list.service';
import { SelectableListState } from '../../../../object-list/selectable-list/selectable-list.reducer';

View File

@@ -1,5 +1,5 @@
import { Component, EventEmitter, Input, OnDestroy, OnInit, Output, ComponentRef } from '@angular/core';
import { SEARCH_CONFIG_SERVICE } from '../../../../../../my-dspace-page/my-dspace-page.component';
import { Component, ComponentRef, EventEmitter, Input, OnDestroy, OnInit, Output } from '@angular/core';
import { SEARCH_CONFIG_SERVICE } from '../../../../../../my-dspace-page/my-dspace-configuration.service';
import { SearchConfigurationService } from '../../../../../../core/shared/search/search-configuration.service';
import { Router } from '@angular/router';
import { ExternalSourceDataService } from '../../../../../../core/data/external-source-data.service';
@@ -15,8 +15,12 @@ import { fadeIn, fadeInOut } from '../../../../../animations/fade';
import { PaginationComponentOptions } from '../../../../../pagination/pagination-component-options.model';
import { RelationshipOptions } from '../../../models/relationship-options.model';
import { NgbModal, NgbModalRef } from '@ng-bootstrap/ng-bootstrap';
import { ExternalSourceEntryImportModalComponent } from './external-source-entry-import-modal/external-source-entry-import-modal.component';
import { ThemedExternalSourceEntryImportModalComponent } from './external-source-entry-import-modal/themed-external-source-entry-import-modal.component';
import {
ExternalSourceEntryImportModalComponent
} from './external-source-entry-import-modal/external-source-entry-import-modal.component';
import {
ThemedExternalSourceEntryImportModalComponent
} from './external-source-entry-import-modal/themed-external-source-entry-import-modal.component';
import { hasValue, hasValueOperator } from '../../../../../empty.util';
import { SelectableListService } from '../../../../../object-list/selectable-list/selectable-list.service';
import { Item } from '../../../../../../core/shared/item.model';

View File

@@ -1,10 +1,10 @@
import { Component, EventEmitter, Input, OnDestroy, OnInit, Output } from '@angular/core';
import { SEARCH_CONFIG_SERVICE } from '../../../../../../my-dspace-page/my-dspace-page.component';
import { SEARCH_CONFIG_SERVICE } from '../../../../../../my-dspace-page/my-dspace-configuration.service';
import { SearchConfigurationService } from '../../../../../../core/shared/search/search-configuration.service';
import { Item } from '../../../../../../core/shared/item.model';
import { SearchResult } from '../../../../../search/models/search-result.model';
import { PaginatedList } from '../../../../../../core/data/paginated-list.model';
import { Observable, BehaviorSubject } from 'rxjs';
import { BehaviorSubject, Observable } from 'rxjs';
import { RelationshipOptions } from '../../../models/relationship-options.model';
import { PaginationComponentOptions } from '../../../../../pagination/pagination-component-options.model';
import { ListableObject } from '../../../../../object-collection/shared/listable-object.model';

View File

@@ -1,5 +1,5 @@
import { Component, EventEmitter, Input, Output } from '@angular/core';
import { SEARCH_CONFIG_SERVICE } from '../../../../../../my-dspace-page/my-dspace-page.component';
import { SEARCH_CONFIG_SERVICE } from '../../../../../../my-dspace-page/my-dspace-configuration.service';
import { SearchConfigurationService } from '../../../../../../core/shared/search/search-configuration.service';
import { Observable } from 'rxjs';
import { ListableObject } from '../../../../../object-collection/shared/listable-object.model';

View File

@@ -1,5 +1,5 @@
import { Component, Injector, Input, OnInit, Type } from '@angular/core';
import { rendersAuthMethodType } from '../methods/log-in.methods-decorator';
import { Component, Injector, Input, OnInit } from '@angular/core';
import { AuthMethodTypeComponent, rendersAuthMethodType } from '../methods/log-in.methods-decorator';
import { AuthMethod } from '../../../core/auth/models/auth.method';
import { NgComponentOutlet } from '@angular/common';
@@ -50,7 +50,7 @@ export class LogInContainerComponent implements OnInit {
/**
* Find the correct component based on the AuthMethod's type
*/
getAuthMethodContent(): Type<Component> {
getAuthMethodContent(): AuthMethodTypeComponent {
return rendersAuthMethodType(this.authMethod.authMethodType);
}

View File

@@ -2,7 +2,7 @@ import { AuthMethodType } from '../../../core/auth/models/auth.method-type';
import { LogInPasswordComponent } from './password/log-in-password.component';
import { LogInExternalProviderComponent } from './log-in-external-provider/log-in-external-provider.component';
type AuthMethodTypeComponent =
export type AuthMethodTypeComponent =
typeof LogInPasswordComponent |
typeof LogInExternalProviderComponent;

View File

@@ -1,4 +1,4 @@
import { InjectionToken } from '@angular/core';
import { InjectionToken, Type } from '@angular/core';
import { makeStateKey } from '@angular/platform-browser';
import { Config } from './config.interface';
import { ServerConfig } from './server-config.interface';
@@ -23,6 +23,7 @@ import { MarkdownConfig } from './markdown-config.interface';
import { FilterVocabularyConfig } from './filter-vocabulary-config';
import { DiscoverySortConfig } from './discovery-sort.config';
import { QualityAssuranceConfig } from './quality-assurance.config';
import { HALDataService } from '../app/core/data/base/hal-data-service.interface';
interface AppConfig extends Config {
ui: UIServerConfig;
@@ -60,6 +61,11 @@ const APP_CONFIG = new InjectionToken<AppConfig>('APP_CONFIG');
const APP_CONFIG_STATE = makeStateKey<AppConfig>('APP_CONFIG_STATE');
export interface LazyDataServicesMap {
[type: string]: () => Promise<Type<HALDataService<any>>>
}
export const APP_DATA_SERVICES_MAP: InjectionToken<LazyDataServicesMap> = new InjectionToken<LazyDataServicesMap>('APP_DATA_SERVICES_MAP');
export {
AppConfig,
APP_CONFIG,