mirror of
https://github.com/DSpace/dspace-angular.git
synced 2025-10-16 14:33:03 +00:00
Merge remote-tracking branch 'dspace-main/main' into w2p-96062_theme-external-source-entry-import-modal-component
# Conflicts: # src/app/shared/form/form.module.ts
This commit is contained in:
@@ -10,6 +10,16 @@ import { MembersListComponent } from './group-registry/group-form/members-list/m
|
||||
import { SubgroupsListComponent } from './group-registry/group-form/subgroup-list/subgroups-list.component';
|
||||
import { GroupsRegistryComponent } from './group-registry/groups-registry.component';
|
||||
import { FormModule } from '../shared/form/form.module';
|
||||
import { DYNAMIC_ERROR_MESSAGES_MATCHER, DynamicErrorMessagesMatcher } from '@ng-dynamic-forms/core';
|
||||
import { AbstractControl } from '@angular/forms';
|
||||
|
||||
/**
|
||||
* Condition for displaying error messages on email form field
|
||||
*/
|
||||
export const ValidateEmailErrorStateMatcher: DynamicErrorMessagesMatcher =
|
||||
(control: AbstractControl, model: any, hasFocus: boolean) => {
|
||||
return (control.touched && !hasFocus) || (control.errors?.emailTaken && hasFocus);
|
||||
};
|
||||
|
||||
@NgModule({
|
||||
imports: [
|
||||
@@ -26,6 +36,12 @@ import { FormModule } from '../shared/form/form.module';
|
||||
GroupFormComponent,
|
||||
SubgroupsListComponent,
|
||||
MembersListComponent
|
||||
],
|
||||
providers: [
|
||||
{
|
||||
provide: DYNAMIC_ERROR_MESSAGES_MATCHER,
|
||||
useValue: ValidateEmailErrorStateMatcher
|
||||
},
|
||||
]
|
||||
})
|
||||
/**
|
||||
|
@@ -10,6 +10,7 @@ import { AdminSearchModule } from './admin-search-page/admin-search.module';
|
||||
import { AdminSidebarSectionComponent } from './admin-sidebar/admin-sidebar-section/admin-sidebar-section.component';
|
||||
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 { UploadModule } from '../shared/upload/upload.module';
|
||||
|
||||
const ENTRY_COMPONENTS = [
|
||||
// put only entry components that use custom decorator
|
||||
@@ -25,7 +26,8 @@ const ENTRY_COMPONENTS = [
|
||||
AccessControlModule,
|
||||
AdminSearchModule.withEntryComponents(),
|
||||
AdminWorkflowModuleModule.withEntryComponents(),
|
||||
SharedModule
|
||||
SharedModule,
|
||||
UploadModule,
|
||||
],
|
||||
declarations: [
|
||||
AdminCurationTasksComponent,
|
||||
|
@@ -1,14 +1,12 @@
|
||||
import { APP_BASE_HREF, CommonModule, DOCUMENT } from '@angular/common';
|
||||
import { HTTP_INTERCEPTORS, HttpClientModule } from '@angular/common/http';
|
||||
import { NgModule } from '@angular/core';
|
||||
import { AbstractControl } from '@angular/forms';
|
||||
import { BrowserModule } from '@angular/platform-browser';
|
||||
|
||||
import { NgbModule } from '@ng-bootstrap/ng-bootstrap';
|
||||
import { EffectsModule } from '@ngrx/effects';
|
||||
import { RouterStateSerializer, StoreRouterConnectingModule } from '@ngrx/router-store';
|
||||
import { MetaReducer, StoreModule, USER_PROVIDED_META_REDUCERS } from '@ngrx/store';
|
||||
import { DYNAMIC_ERROR_MESSAGES_MATCHER, DYNAMIC_MATCHER_PROVIDERS, DynamicErrorMessagesMatcher } from '@ng-dynamic-forms/core';
|
||||
import { TranslateModule } from '@ngx-translate/core';
|
||||
import { ScrollToModule } from '@nicky-lenaers/ngx-scroll-to';
|
||||
import { AppRoutingModule } from './app-routing.module';
|
||||
@@ -28,7 +26,6 @@ import { XsrfInterceptor } from './core/xsrf/xsrf.interceptor';
|
||||
import { LogInterceptor } from './core/log/log.interceptor';
|
||||
import { EagerThemesModule } from '../themes/eager-themes.module';
|
||||
import { APP_CONFIG, AppConfig } from '../config/app-config.interface';
|
||||
import { NgxMaskModule } from 'ngx-mask';
|
||||
import { StoreDevModules } from '../config/store/devtools';
|
||||
import { RootModule } from './root.module';
|
||||
|
||||
@@ -46,14 +43,6 @@ export function getMetaReducers(appConfig: AppConfig): MetaReducer<AppState>[] {
|
||||
return appConfig.debug ? [...appMetaReducers, ...debugMetaReducers] : appMetaReducers;
|
||||
}
|
||||
|
||||
/**
|
||||
* Condition for displaying error messages on email form field
|
||||
*/
|
||||
export const ValidateEmailErrorStateMatcher: DynamicErrorMessagesMatcher =
|
||||
(control: AbstractControl, model: any, hasFocus: boolean) => {
|
||||
return (control.touched && !hasFocus) || (control.errors?.emailTaken && hasFocus);
|
||||
};
|
||||
|
||||
const IMPORTS = [
|
||||
CommonModule,
|
||||
SharedModule,
|
||||
@@ -64,7 +53,6 @@ const IMPORTS = [
|
||||
ScrollToModule.forRoot(),
|
||||
NgbModule,
|
||||
TranslateModule.forRoot(),
|
||||
NgxMaskModule.forRoot(),
|
||||
EffectsModule.forRoot(appEffects),
|
||||
StoreModule.forRoot(appReducers, storeModuleConfig),
|
||||
StoreRouterConnectingModule.forRoot(),
|
||||
@@ -113,11 +101,6 @@ const PROVIDERS = [
|
||||
useClass: LogInterceptor,
|
||||
multi: true
|
||||
},
|
||||
{
|
||||
provide: DYNAMIC_ERROR_MESSAGES_MATCHER,
|
||||
useValue: ValidateEmailErrorStateMatcher
|
||||
},
|
||||
...DYNAMIC_MATCHER_PROVIDERS,
|
||||
];
|
||||
|
||||
const DECLARATIONS = [
|
||||
|
@@ -25,7 +25,7 @@ import { ComcolModule } from '../shared/comcol/comcol.module';
|
||||
StatisticsModule.forRoot(),
|
||||
EditItemPageModule,
|
||||
CollectionFormModule,
|
||||
ComcolModule
|
||||
ComcolModule,
|
||||
],
|
||||
declarations: [
|
||||
CollectionPageComponent,
|
||||
@@ -38,7 +38,7 @@ import { ComcolModule } from '../shared/comcol/comcol.module';
|
||||
],
|
||||
providers: [
|
||||
SearchService,
|
||||
]
|
||||
],
|
||||
})
|
||||
export class CollectionPageModule {
|
||||
|
||||
|
@@ -25,7 +25,7 @@ import { ComcolModule } from '../../shared/comcol/comcol.module';
|
||||
CollectionFormModule,
|
||||
ResourcePoliciesModule,
|
||||
FormModule,
|
||||
ComcolModule
|
||||
ComcolModule,
|
||||
],
|
||||
declarations: [
|
||||
EditCollectionPageComponent,
|
||||
|
@@ -36,7 +36,7 @@ const DECLARATIONS = [CommunityPageComponent,
|
||||
CommunityPageRoutingModule,
|
||||
StatisticsModule.forRoot(),
|
||||
CommunityFormModule,
|
||||
ComcolModule
|
||||
ComcolModule,
|
||||
],
|
||||
declarations: [
|
||||
...DECLARATIONS
|
||||
|
@@ -21,7 +21,7 @@ import { ComcolModule } from '../../shared/comcol/comcol.module';
|
||||
EditCommunityPageRoutingModule,
|
||||
CommunityFormModule,
|
||||
ComcolModule,
|
||||
ResourcePoliciesModule
|
||||
ResourcePoliciesModule,
|
||||
],
|
||||
declarations: [
|
||||
EditCommunityPageComponent,
|
||||
|
@@ -2,15 +2,12 @@ import { CommonModule } from '@angular/common';
|
||||
import { HttpClient } from '@angular/common/http';
|
||||
import { ModuleWithProviders, NgModule, Optional, SkipSelf } from '@angular/core';
|
||||
|
||||
import { DynamicFormLayoutService, DynamicFormService, DynamicFormValidationService } from '@ng-dynamic-forms/core';
|
||||
import { EffectsModule } from '@ngrx/effects';
|
||||
|
||||
import { Action, StoreConfig, StoreModule } from '@ngrx/store';
|
||||
import { MyDSpaceGuard } from '../my-dspace-page/my-dspace.guard';
|
||||
|
||||
import { isNotEmpty } from '../shared/empty.util';
|
||||
import { FormBuilderService } from '../shared/form/builder/form-builder.service';
|
||||
import { FormService } from '../shared/form/form.service';
|
||||
import { HostWindowService } from '../shared/host-window.service';
|
||||
import { MenuService } from '../shared/menu/menu.service';
|
||||
import { EndpointMockingRestService } from '../shared/mocks/dspace-rest/endpoint-mocking-rest.service';
|
||||
@@ -24,8 +21,6 @@ import { SelectableListService } from '../shared/object-list/selectable-list/sel
|
||||
import { ObjectSelectService } from '../shared/object-select/object-select.service';
|
||||
import { PaginationComponentOptions } from '../shared/pagination/pagination-component-options.model';
|
||||
import { SidebarService } from '../shared/sidebar/sidebar.service';
|
||||
import { UploaderService } from '../shared/uploader/uploader.service';
|
||||
import { SectionFormOperationsService } from '../submission/sections/form/section-form-operations.service';
|
||||
import { AuthenticatedGuard } from './auth/authenticated.guard';
|
||||
import { AuthStatus } from './auth/models/auth-status.model';
|
||||
import { BrowseService } from './browse/browse.service';
|
||||
@@ -137,9 +132,6 @@ import {
|
||||
import { Registration } from './shared/registration.model';
|
||||
import { MetadataSchemaDataService } from './data/metadata-schema-data.service';
|
||||
import { MetadataFieldDataService } from './data/metadata-field-data.service';
|
||||
import {
|
||||
DsDynamicTypeBindRelationService
|
||||
} from '../shared/form/builder/ds-dynamic-form-ui/ds-dynamic-type-bind-relation.service';
|
||||
import { TokenResponseParsingService } from './auth/token-response-parsing.service';
|
||||
import { SubmissionCcLicenseDataService } from './submission/submission-cc-license-data.service';
|
||||
import { SubmissionCcLicence } from './submission/models/submission-cc-license.model';
|
||||
@@ -149,7 +141,6 @@ import { VocabularyEntry } from './submission/vocabularies/models/vocabulary-ent
|
||||
import { Vocabulary } from './submission/vocabularies/models/vocabulary.model';
|
||||
import { VocabularyEntryDetail } from './submission/vocabularies/models/vocabulary-entry-detail.model';
|
||||
import { VocabularyService } from './submission/vocabularies/vocabulary.service';
|
||||
import { VocabularyTreeviewService } from '../shared/vocabulary-treeview/vocabulary-treeview.service';
|
||||
import { ConfigurationDataService } from './data/configuration-data.service';
|
||||
import { ConfigurationProperty } from './shared/configuration-property.model';
|
||||
import { ReloadGuard } from './reload/reload.guard';
|
||||
@@ -210,12 +201,6 @@ const PROVIDERS = [
|
||||
DSOResponseParsingService,
|
||||
{ provide: MOCK_RESPONSE_MAP, useValue: mockResponseMap },
|
||||
{ provide: DspaceRestService, useFactory: restServiceFactory, deps: [MOCK_RESPONSE_MAP, HttpClient] },
|
||||
DynamicFormLayoutService,
|
||||
DynamicFormService,
|
||||
DynamicFormValidationService,
|
||||
FormBuilderService,
|
||||
SectionFormOperationsService,
|
||||
FormService,
|
||||
EPersonDataService,
|
||||
LinkHeadService,
|
||||
HALEndpointService,
|
||||
@@ -244,12 +229,10 @@ const PROVIDERS = [
|
||||
SubmissionResponseParsingService,
|
||||
SubmissionJsonPatchOperationsService,
|
||||
JsonPatchOperationsBuilder,
|
||||
UploaderService,
|
||||
UUIDService,
|
||||
NotificationsService,
|
||||
WorkspaceitemDataService,
|
||||
WorkflowItemDataService,
|
||||
UploaderService,
|
||||
DSpaceObjectDataService,
|
||||
ConfigurationDataService,
|
||||
DSOChangeAnalyzer,
|
||||
@@ -266,7 +249,6 @@ const PROVIDERS = [
|
||||
ClaimedTaskDataService,
|
||||
PoolTaskDataService,
|
||||
BitstreamDataService,
|
||||
DsDynamicTypeBindRelationService,
|
||||
EntityTypeDataService,
|
||||
ContentSourceResponseParsingService,
|
||||
ItemTemplateDataService,
|
||||
@@ -302,7 +284,6 @@ const PROVIDERS = [
|
||||
VocabularyService,
|
||||
VocabularyDataService,
|
||||
VocabularyEntryDetailsDataService,
|
||||
VocabularyTreeviewService,
|
||||
SequenceService,
|
||||
GroupDataService,
|
||||
FeedbackDataService,
|
||||
|
@@ -1,7 +1,17 @@
|
||||
/**
|
||||
* The contents of this file are subject to the license and copyright
|
||||
* detailed in the LICENSE and NOTICE files at the root of the source
|
||||
* tree and available online at
|
||||
*
|
||||
* http://www.dspace.org/license/
|
||||
*/
|
||||
|
||||
import { Injectable } from '@angular/core';
|
||||
|
||||
@Injectable()
|
||||
export class UploaderService {
|
||||
@Injectable({
|
||||
providedIn: 'root'
|
||||
})
|
||||
export class DragService {
|
||||
private _overrideDragOverPage = false;
|
||||
|
||||
public overrideDragOverPage() {
|
@@ -4,7 +4,7 @@ import { RemoteData } from '../../../core/data/remote-data';
|
||||
import { Item } from '../../../core/shared/item.model';
|
||||
import { map, take, switchMap } from 'rxjs/operators';
|
||||
import { ActivatedRoute, Router } from '@angular/router';
|
||||
import { UploaderOptions } from '../../../shared/uploader/uploader-options.model';
|
||||
import { UploaderOptions } from '../../../shared/upload/uploader/uploader-options.model';
|
||||
import { hasValue, isEmpty, isNotEmpty } from '../../../shared/empty.util';
|
||||
import { ItemDataService } from '../../../core/data/item-data.service';
|
||||
import { AuthService } from '../../../core/auth/auth.service';
|
||||
@@ -14,7 +14,7 @@ import { PaginatedList } from '../../../core/data/paginated-list.model';
|
||||
import { Bundle } from '../../../core/shared/bundle.model';
|
||||
import { BundleDataService } from '../../../core/data/bundle-data.service';
|
||||
import { getFirstSucceededRemoteDataPayload, getFirstCompletedRemoteData } from '../../../core/shared/operators';
|
||||
import { UploaderComponent } from '../../../shared/uploader/uploader.component';
|
||||
import { UploaderComponent } from '../../../shared/upload/uploader/uploader.component';
|
||||
import { RequestService } from '../../../core/data/request.service';
|
||||
import { getBitstreamModuleRoute } from '../../../app-routing-paths';
|
||||
import { getEntityEditRoute } from '../../item-page-routing-paths';
|
||||
|
@@ -18,6 +18,8 @@ import { NotificationsService } from '../../../../shared/notifications/notificat
|
||||
import { NotificationsServiceStub } from '../../../../shared/testing/notifications-service.stub';
|
||||
import { PaginationService } from '../../../../core/pagination/pagination.service';
|
||||
import { PaginationServiceStub } from '../../../../shared/testing/pagination-service.stub';
|
||||
import { APP_CONFIG } from 'src/config/app-config.interface';
|
||||
import { environment } from 'src/environments/environment';
|
||||
|
||||
describe('FullFileSectionComponent', () => {
|
||||
let comp: FullFileSectionComponent;
|
||||
@@ -69,7 +71,8 @@ describe('FullFileSectionComponent', () => {
|
||||
providers: [
|
||||
{ provide: BitstreamDataService, useValue: bitstreamDataService },
|
||||
{ provide: NotificationsService, useValue: new NotificationsServiceStub() },
|
||||
{ provide: PaginationService, useValue: paginationService }
|
||||
{ provide: PaginationService, useValue: paginationService },
|
||||
{ provide: APP_CONFIG, useValue: environment },
|
||||
],
|
||||
|
||||
schemas: [NO_ERRORS_SCHEMA]
|
||||
|
@@ -1,4 +1,4 @@
|
||||
import { Component, Input, OnInit } from '@angular/core';
|
||||
import { Component, Inject, Input, 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 { AppConfig, APP_CONFIG } from 'src/config/app-config.interface';
|
||||
|
||||
/**
|
||||
* This component renders the file section of the item
|
||||
@@ -34,26 +35,26 @@ export class FullFileSectionComponent extends FileSectionComponent implements On
|
||||
originals$: Observable<RemoteData<PaginatedList<Bitstream>>>;
|
||||
licenses$: Observable<RemoteData<PaginatedList<Bitstream>>>;
|
||||
|
||||
pageSize = 5;
|
||||
originalOptions = Object.assign(new PaginationComponentOptions(), {
|
||||
id: 'obo',
|
||||
currentPage: 1,
|
||||
pageSize: this.pageSize
|
||||
pageSize: this.appConfig.item.bitstream.pageSize
|
||||
});
|
||||
|
||||
licenseOptions = Object.assign(new PaginationComponentOptions(), {
|
||||
id: 'lbo',
|
||||
currentPage: 1,
|
||||
pageSize: this.pageSize
|
||||
pageSize: this.appConfig.item.bitstream.pageSize
|
||||
});
|
||||
|
||||
constructor(
|
||||
bitstreamDataService: BitstreamDataService,
|
||||
protected notificationsService: NotificationsService,
|
||||
protected translateService: TranslateService,
|
||||
protected paginationService: PaginationService
|
||||
protected paginationService: PaginationService,
|
||||
@Inject(APP_CONFIG) protected appConfig: AppConfig
|
||||
) {
|
||||
super(bitstreamDataService, notificationsService, translateService);
|
||||
super(bitstreamDataService, notificationsService, translateService, appConfig);
|
||||
}
|
||||
|
||||
ngOnInit(): void {
|
||||
|
@@ -46,6 +46,7 @@ import { OrcidPageComponent } from './orcid-page/orcid-page.component';
|
||||
import { NgbAccordionModule } from '@ng-bootstrap/ng-bootstrap';
|
||||
import { OrcidSyncSettingsComponent } from './orcid-page/orcid-sync-settings/orcid-sync-settings.component';
|
||||
import { OrcidQueueComponent } from './orcid-page/orcid-queue/orcid-queue.component';
|
||||
import { UploadModule } from '../shared/upload/upload.module';
|
||||
|
||||
|
||||
const ENTRY_COMPONENTS = [
|
||||
@@ -94,7 +95,8 @@ const DECLARATIONS = [
|
||||
JournalEntitiesModule.withEntryComponents(),
|
||||
ResearchEntitiesModule.withEntryComponents(),
|
||||
NgxGalleryModule,
|
||||
NgbAccordionModule
|
||||
NgbAccordionModule,
|
||||
UploadModule,
|
||||
],
|
||||
declarations: [
|
||||
...DECLARATIONS,
|
||||
|
@@ -17,6 +17,8 @@ import { MetadataFieldWrapperComponent } from '../../../field-components/metadat
|
||||
import { createPaginatedList } from '../../../../shared/testing/utils.test';
|
||||
import { NotificationsService } from '../../../../shared/notifications/notifications.service';
|
||||
import { NotificationsServiceStub } from '../../../../shared/testing/notifications-service.stub';
|
||||
import { APP_CONFIG } from 'src/config/app-config.interface';
|
||||
import { environment } from 'src/environments/environment';
|
||||
|
||||
describe('FileSectionComponent', () => {
|
||||
let comp: FileSectionComponent;
|
||||
@@ -65,7 +67,8 @@ describe('FileSectionComponent', () => {
|
||||
declarations: [FileSectionComponent, VarDirective, FileSizePipe, MetadataFieldWrapperComponent],
|
||||
providers: [
|
||||
{ provide: BitstreamDataService, useValue: bitstreamDataService },
|
||||
{ provide: NotificationsService, useValue: new NotificationsServiceStub() }
|
||||
{ provide: NotificationsService, useValue: new NotificationsServiceStub() },
|
||||
{ provide: APP_CONFIG, useValue: environment }
|
||||
],
|
||||
|
||||
schemas: [NO_ERRORS_SCHEMA]
|
||||
|
@@ -1,4 +1,4 @@
|
||||
import { Component, Input, OnInit } from '@angular/core';
|
||||
import { Component, Inject, Input, OnInit } from '@angular/core';
|
||||
import { BehaviorSubject } from 'rxjs';
|
||||
import { BitstreamDataService } from '../../../../core/data/bitstream-data.service';
|
||||
|
||||
@@ -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 { AppConfig, APP_CONFIG } from 'src/config/app-config.interface';
|
||||
|
||||
/**
|
||||
* This component renders the file section of the item
|
||||
@@ -35,13 +36,15 @@ export class FileSectionComponent implements OnInit {
|
||||
|
||||
isLastPage: boolean;
|
||||
|
||||
pageSize = 5;
|
||||
pageSize: number;
|
||||
|
||||
constructor(
|
||||
protected bitstreamDataService: BitstreamDataService,
|
||||
protected notificationsService: NotificationsService,
|
||||
protected translateService: TranslateService
|
||||
protected translateService: TranslateService,
|
||||
@Inject(APP_CONFIG) protected appConfig: AppConfig
|
||||
) {
|
||||
this.pageSize = this.appConfig.item.bitstream.pageSize;
|
||||
}
|
||||
|
||||
ngOnInit(): void {
|
||||
|
@@ -16,10 +16,10 @@ import { TranslateLoaderMock } from '../../shared/mocks/translate-loader.mock';
|
||||
import { NotificationsService } from '../../shared/notifications/notifications.service';
|
||||
import { NotificationsServiceStub } from '../../shared/testing/notifications-service.stub';
|
||||
import { getMockScrollToService } from '../../shared/mocks/scroll-to-service.mock';
|
||||
import { UploaderService } from '../../shared/uploader/uploader.service';
|
||||
import { DragService } from '../../core/drag.service';
|
||||
import { HostWindowService } from '../../shared/host-window.service';
|
||||
import { HostWindowServiceStub } from '../../shared/testing/host-window-service.stub';
|
||||
import { UploaderComponent } from '../../shared/uploader/uploader.component';
|
||||
import { UploaderComponent } from '../../shared/upload/uploader/uploader.component';
|
||||
import { HttpXsrfTokenExtractor } from '@angular/common/http';
|
||||
import { CookieService } from '../../core/services/cookie.service';
|
||||
import { CookieServiceMock } from '../../shared/mocks/cookie.service.mock';
|
||||
@@ -59,7 +59,7 @@ describe('MyDSpaceNewSubmissionComponent test', () => {
|
||||
NgbModal,
|
||||
ChangeDetectorRef,
|
||||
MyDSpaceNewSubmissionComponent,
|
||||
UploaderService,
|
||||
DragService,
|
||||
{ provide: HttpXsrfTokenExtractor, useValue: new HttpXsrfTokenExtractorMock('mock-token') },
|
||||
{ provide: CookieService, useValue: new CookieServiceMock() },
|
||||
{ provide: HostWindowService, useValue: new HostWindowServiceStub(800) },
|
||||
|
@@ -8,13 +8,13 @@ import { NgbModal } from '@ng-bootstrap/ng-bootstrap';
|
||||
import { AuthService } from '../../core/auth/auth.service';
|
||||
import { DSpaceObject } from '../../core/shared/dspace-object.model';
|
||||
import { NotificationsService } from '../../shared/notifications/notifications.service';
|
||||
import { UploaderOptions } from '../../shared/uploader/uploader-options.model';
|
||||
import { UploaderOptions } from '../../shared/upload/uploader/uploader-options.model';
|
||||
import { HALEndpointService } from '../../core/shared/hal-endpoint.service';
|
||||
import { hasValue } from '../../shared/empty.util';
|
||||
import { SearchResult } from '../../shared/search/models/search-result.model';
|
||||
import { CollectionSelectorComponent } from '../collection-selector/collection-selector.component';
|
||||
import { UploaderComponent } from '../../shared/uploader/uploader.component';
|
||||
import { UploaderError } from '../../shared/uploader/uploader-error.model';
|
||||
import { UploaderComponent } from '../../shared/upload/uploader/uploader.component';
|
||||
import { UploaderError } from '../../shared/upload/uploader/uploader-error.model';
|
||||
import { Router } from '@angular/router';
|
||||
|
||||
/**
|
||||
|
@@ -14,6 +14,7 @@ import { MyDSpaceNewSubmissionDropdownComponent } from './my-dspace-new-submissi
|
||||
import { MyDSpaceNewExternalDropdownComponent } from './my-dspace-new-submission/my-dspace-new-external-dropdown/my-dspace-new-external-dropdown.component';
|
||||
import { ThemedMyDSpacePageComponent } from './themed-my-dspace-page.component';
|
||||
import { SearchModule } from '../shared/search/search.module';
|
||||
import { UploadModule } from '../shared/upload/upload.module';
|
||||
|
||||
const DECLARATIONS = [
|
||||
MyDSpacePageComponent,
|
||||
@@ -30,7 +31,8 @@ const DECLARATIONS = [
|
||||
SharedModule,
|
||||
SearchModule,
|
||||
MyDspacePageRoutingModule,
|
||||
MyDspaceSearchModule.withEntryComponents()
|
||||
MyDspaceSearchModule.withEntryComponents(),
|
||||
UploadModule,
|
||||
],
|
||||
declarations: DECLARATIONS,
|
||||
providers: [
|
||||
|
@@ -21,6 +21,7 @@ const effects = [
|
||||
const ENTRY_COMPONENTS = [
|
||||
// put only entry components that use custom decorator
|
||||
NavbarSectionComponent,
|
||||
ExpandableNavbarSectionComponent,
|
||||
ThemedExpandableNavbarSectionComponent,
|
||||
];
|
||||
|
||||
@@ -34,11 +35,9 @@ const ENTRY_COMPONENTS = [
|
||||
CoreModule.forRoot()
|
||||
],
|
||||
declarations: [
|
||||
...ENTRY_COMPONENTS,
|
||||
NavbarComponent,
|
||||
ThemedNavbarComponent,
|
||||
NavbarSectionComponent,
|
||||
ExpandableNavbarSectionComponent,
|
||||
ThemedExpandableNavbarSectionComponent,
|
||||
],
|
||||
providers: [],
|
||||
exports: [
|
||||
|
@@ -95,6 +95,10 @@ describe('RegisterEmailComponent', () => {
|
||||
comp.form.patchValue({email: 'valid@email.org'});
|
||||
expect(comp.form.invalid).toBeFalse();
|
||||
});
|
||||
it('should be valid when uppercase letters are used', () => {
|
||||
comp.form.patchValue({email: 'VALID@email.org'});
|
||||
expect(comp.form.invalid).toBeFalse();
|
||||
});
|
||||
});
|
||||
describe('register', () => {
|
||||
it('should send a registration to the service and on success display a message and return to home', () => {
|
||||
|
@@ -79,7 +79,9 @@ export class RegisterEmailFormComponent implements OnInit {
|
||||
this.form = this.formBuilder.group({
|
||||
email: new FormControl('', {
|
||||
validators: [Validators.required,
|
||||
Validators.pattern('^[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,4}$')
|
||||
// Regex pattern borrowed from HTML5 specs for a valid email address:
|
||||
// https://html.spec.whatwg.org/multipage/input.html#valid-e-mail-address
|
||||
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])?)*$')
|
||||
],
|
||||
})
|
||||
});
|
||||
|
@@ -17,8 +17,8 @@ import { MetadataMap, MetadataValue } from '../../../../core/shared/metadata.mod
|
||||
import { ResourceType } from '../../../../core/shared/resource-type';
|
||||
import { hasValue, isNotEmpty } from '../../../empty.util';
|
||||
import { NotificationsService } from '../../../notifications/notifications.service';
|
||||
import { UploaderOptions } from '../../../uploader/uploader-options.model';
|
||||
import { UploaderComponent } from '../../../uploader/uploader.component';
|
||||
import { UploaderOptions } from '../../../upload/uploader/uploader-options.model';
|
||||
import { UploaderComponent } from '../../../upload/uploader/uploader.component';
|
||||
import { Operation } from 'fast-json-patch';
|
||||
import { NoContent } from '../../../../core/shared/NoContent.model';
|
||||
import { getFirstCompletedRemoteData } from '../../../../core/shared/operators';
|
||||
|
@@ -15,6 +15,7 @@ import { ThemedComcolPageBrowseByComponent } from './comcol-page-browse-by/theme
|
||||
import { ComcolRoleComponent } from './comcol-forms/edit-comcol-page/comcol-role/comcol-role.component';
|
||||
import { SharedModule } from '../shared.module';
|
||||
import { FormModule } from '../form/form.module';
|
||||
import { UploadModule } from '../upload/upload.module';
|
||||
|
||||
const COMPONENTS = [
|
||||
ComcolPageContentComponent,
|
||||
@@ -28,9 +29,7 @@ const COMPONENTS = [
|
||||
ComcolPageBrowseByComponent,
|
||||
ThemedComcolPageBrowseByComponent,
|
||||
ComcolRoleComponent,
|
||||
|
||||
ThemedComcolPageHandleComponent
|
||||
|
||||
];
|
||||
|
||||
@NgModule({
|
||||
@@ -40,10 +39,12 @@ const COMPONENTS = [
|
||||
imports: [
|
||||
CommonModule,
|
||||
FormModule,
|
||||
SharedModule
|
||||
SharedModule,
|
||||
UploadModule,
|
||||
],
|
||||
exports: [
|
||||
...COMPONENTS
|
||||
...COMPONENTS,
|
||||
UploadModule,
|
||||
]
|
||||
})
|
||||
export class ComcolModule { }
|
||||
|
@@ -1,5 +1,4 @@
|
||||
import { Injectable } from '@angular/core';
|
||||
import { setup, show } from 'klaro/dist/klaro-no-translations';
|
||||
import { Inject, Injectable, InjectionToken } from '@angular/core';
|
||||
import { combineLatest as observableCombineLatest, Observable, of as observableOf } from 'rxjs';
|
||||
import { AuthService } from '../../core/auth/auth.service';
|
||||
import { TranslateService } from '@ngx-translate/core';
|
||||
@@ -43,6 +42,17 @@ const cookiePurposeMessagePrefix = 'cookies.consent.purpose.';
|
||||
*/
|
||||
const updateDebounce = 300;
|
||||
|
||||
/**
|
||||
* By using this injection token instead of importing directly we can keep Klaro out of the main bundle
|
||||
*/
|
||||
const LAZY_KLARO = new InjectionToken<Promise<any>>(
|
||||
'Lazily loaded Klaro',
|
||||
{
|
||||
providedIn: 'root',
|
||||
factory: async () => (await import('klaro')),
|
||||
}
|
||||
);
|
||||
|
||||
/**
|
||||
* Browser implementation for the KlaroService, representing a service for handling Klaro consent preferences and UI
|
||||
*/
|
||||
@@ -65,7 +75,9 @@ export class BrowserKlaroService extends KlaroService {
|
||||
private authService: AuthService,
|
||||
private ePersonService: EPersonDataService,
|
||||
private configService: ConfigurationDataService,
|
||||
private cookieService: CookieService) {
|
||||
private cookieService: CookieService,
|
||||
@Inject(LAZY_KLARO) private lazyKlaro: Promise<any>,
|
||||
) {
|
||||
super();
|
||||
}
|
||||
|
||||
@@ -135,8 +147,7 @@ export class BrowserKlaroService extends KlaroService {
|
||||
this.translateConfiguration();
|
||||
|
||||
this.klaroConfig.services = this.filterConfigServices(servicesToHide);
|
||||
|
||||
setup(this.klaroConfig);
|
||||
this.lazyKlaro.then(({ setup }) => setup(this.klaroConfig));
|
||||
});
|
||||
}
|
||||
|
||||
@@ -220,7 +231,7 @@ export class BrowserKlaroService extends KlaroService {
|
||||
* Show the cookie consent form
|
||||
*/
|
||||
showSettings() {
|
||||
show(this.klaroConfig);
|
||||
this.lazyKlaro.then(({show}) => show(this.klaroConfig));
|
||||
}
|
||||
|
||||
/**
|
||||
|
@@ -53,8 +53,9 @@ export class AuthorizedCollectionSelectorComponent extends DSOSelectorComponent
|
||||
* Perform a search for authorized collections with the current query and page
|
||||
* @param query Query to search objects for
|
||||
* @param page Page to retrieve
|
||||
* @param useCache Whether or not to use the cache
|
||||
*/
|
||||
search(query: string, page: number): Observable<RemoteData<PaginatedList<SearchResult<DSpaceObject>>>> {
|
||||
search(query: string, page: number, useCache: boolean = true): Observable<RemoteData<PaginatedList<SearchResult<DSpaceObject>>>> {
|
||||
let searchListService$: Observable<RemoteData<PaginatedList<Collection>>> = null;
|
||||
const findOptions: FindListOptions = {
|
||||
currentPage: page,
|
||||
@@ -69,7 +70,7 @@ export class AuthorizedCollectionSelectorComponent extends DSOSelectorComponent
|
||||
findOptions);
|
||||
} else {
|
||||
searchListService$ = this.collectionDataService
|
||||
.getAuthorizedCollection(query, findOptions, true, false, followLink('parentCommunity'));
|
||||
.getAuthorizedCollection(query, findOptions, useCache, false, followLink('parentCommunity'));
|
||||
}
|
||||
return searchListService$.pipe(
|
||||
getFirstCompletedRemoteData(),
|
||||
|
@@ -21,12 +21,12 @@
|
||||
</button>
|
||||
<button *ngFor="let listEntry of (listEntries$ | async)"
|
||||
class="list-group-item list-group-item-action border-0 list-entry"
|
||||
[ngClass]="{'bg-primary': listEntry.indexableObject.id === currentDSOId}"
|
||||
[ngClass]="{'bg-primary': listEntry['id'] === currentDSOId}"
|
||||
title="{{ getName(listEntry) }}"
|
||||
dsHoverClass="ds-hover"
|
||||
(click)="onSelect.emit(listEntry.indexableObject)" #listEntryElement>
|
||||
(click)="onClick(listEntry)" #listEntryElement>
|
||||
<ds-listable-object-component-loader [object]="listEntry" [viewMode]="viewMode"
|
||||
[linkType]=linkTypes.None [context]="getContext(listEntry.indexableObject.id)"></ds-listable-object-component-loader>
|
||||
[linkType]=linkTypes.None [context]="getContext(listEntry['id'])"></ds-listable-object-component-loader>
|
||||
</button>
|
||||
</ng-container>
|
||||
<button *ngIf="loading"
|
||||
|
@@ -35,6 +35,14 @@ import { RemoteData } from '../../../core/data/remote-data';
|
||||
import { NotificationsService } from '../../notifications/notifications.service';
|
||||
import { TranslateService } from '@ngx-translate/core';
|
||||
import { DSONameService } from '../../../core/breadcrumbs/dso-name.service';
|
||||
import {
|
||||
ListableNotificationObject
|
||||
} from '../../object-list/listable-notification-object/listable-notification-object.model';
|
||||
import { ListableObject } from '../../object-collection/shared/listable-object.model';
|
||||
import { NotificationType } from '../../notifications/models/notification-type';
|
||||
import {
|
||||
LISTABLE_NOTIFICATION_OBJECT
|
||||
} from '../../object-list/listable-notification-object/listable-notification-object.resource-type';
|
||||
|
||||
@Component({
|
||||
selector: 'ds-dso-selector',
|
||||
@@ -82,7 +90,7 @@ export class DSOSelectorComponent implements OnInit, OnDestroy {
|
||||
/**
|
||||
* List with search results of DSpace objects for the current query
|
||||
*/
|
||||
listEntries$: BehaviorSubject<SearchResult<DSpaceObject>[]> = new BehaviorSubject(null);
|
||||
listEntries$: BehaviorSubject<ListableObject[]> = new BehaviorSubject(null);
|
||||
|
||||
/**
|
||||
* The current page to load
|
||||
@@ -116,11 +124,6 @@ export class DSOSelectorComponent implements OnInit, OnDestroy {
|
||||
*/
|
||||
linkTypes = CollectionElementLinkType;
|
||||
|
||||
/**
|
||||
* Track whether the element has the mouse over it
|
||||
*/
|
||||
isMouseOver = false;
|
||||
|
||||
/**
|
||||
* Array to track all subscriptions and unsubscribe them onDestroy
|
||||
* @type {Array}
|
||||
@@ -182,24 +185,28 @@ export class DSOSelectorComponent implements OnInit, OnDestroy {
|
||||
})
|
||||
);
|
||||
})
|
||||
).subscribe((rd) => {
|
||||
this.loading = false;
|
||||
if (rd.hasSucceeded) {
|
||||
const currentEntries = this.listEntries$.getValue();
|
||||
if (hasNoValue(currentEntries)) {
|
||||
this.listEntries$.next(rd.payload.page);
|
||||
} else {
|
||||
this.listEntries$.next([...currentEntries, ...rd.payload.page]);
|
||||
}
|
||||
// Check if there are more pages available after the current one
|
||||
this.hasNextPage = rd.payload.totalElements > this.listEntries$.getValue().length;
|
||||
} else {
|
||||
this.listEntries$.next(null);
|
||||
this.hasNextPage = false;
|
||||
}
|
||||
).subscribe((rd: RemoteData<PaginatedList<SearchResult<DSpaceObject>>>) => {
|
||||
this.updateList(rd);
|
||||
}));
|
||||
}
|
||||
|
||||
updateList(rd: RemoteData<PaginatedList<SearchResult<DSpaceObject>>>) {
|
||||
this.loading = false;
|
||||
const currentEntries = this.listEntries$.getValue();
|
||||
if (rd.hasSucceeded) {
|
||||
if (hasNoValue(currentEntries)) {
|
||||
this.listEntries$.next(rd.payload.page);
|
||||
} else {
|
||||
this.listEntries$.next([...currentEntries, ...rd.payload.page]);
|
||||
}
|
||||
// Check if there are more pages available after the current one
|
||||
this.hasNextPage = rd.payload.totalElements > this.listEntries$.getValue().length;
|
||||
} else {
|
||||
this.listEntries$.next([...(hasNoValue(currentEntries) ? [] : this.listEntries$.getValue()), new ListableNotificationObject(NotificationType.Error, 'dso-selector.results-could-not-be-retrieved', LISTABLE_NOTIFICATION_OBJECT.value)]);
|
||||
this.hasNextPage = false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Get a query to send for retrieving the current DSO
|
||||
*/
|
||||
@@ -211,8 +218,9 @@ export class DSOSelectorComponent implements OnInit, OnDestroy {
|
||||
* Perform a search for the current query and page
|
||||
* @param query Query to search objects for
|
||||
* @param page Page to retrieve
|
||||
* @param useCache Whether or not to use the cache
|
||||
*/
|
||||
search(query: string, page: number): Observable<RemoteData<PaginatedList<SearchResult<DSpaceObject>>>> {
|
||||
search(query: string, page: number, useCache: boolean = true): Observable<RemoteData<PaginatedList<SearchResult<DSpaceObject>>>> {
|
||||
return this.searchService.search(
|
||||
new PaginatedSearchOptions({
|
||||
query: query,
|
||||
@@ -220,7 +228,9 @@ export class DSOSelectorComponent implements OnInit, OnDestroy {
|
||||
pagination: Object.assign({}, this.defaultPagination, {
|
||||
currentPage: page
|
||||
})
|
||||
})
|
||||
}),
|
||||
null,
|
||||
useCache,
|
||||
).pipe(
|
||||
getFirstCompletedRemoteData()
|
||||
);
|
||||
@@ -262,7 +272,28 @@ export class DSOSelectorComponent implements OnInit, OnDestroy {
|
||||
this.subs.filter((sub) => hasValue(sub)).forEach((sub) => sub.unsubscribe());
|
||||
}
|
||||
|
||||
getName(searchResult: SearchResult<DSpaceObject>): string {
|
||||
return this.dsoNameService.getName(searchResult.indexableObject);
|
||||
/**
|
||||
* Handles the user clicks on the {@link ListableObject}s. When the {@link listableObject} is a
|
||||
* {@link ListableObject} it will retry the error when the user clicks it. Otherwise it will emit the {@link onSelect}.
|
||||
*
|
||||
* @param listableObject The {@link ListableObject} to evaluate
|
||||
*/
|
||||
onClick(listableObject: ListableObject): void {
|
||||
if (hasValue((listableObject as SearchResult<DSpaceObject>).indexableObject)) {
|
||||
this.onSelect.emit((listableObject as SearchResult<DSpaceObject>).indexableObject);
|
||||
} else {
|
||||
this.listEntries$.value.pop();
|
||||
this.hasNextPage = true;
|
||||
this.search(this.input.value ? this.input.value : '', this.currentPage$.value, false).pipe(
|
||||
getFirstCompletedRemoteData(),
|
||||
).subscribe((rd: RemoteData<PaginatedList<SearchResult<DSpaceObject>>>) => {
|
||||
this.updateList(rd);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
getName(listableObject: ListableObject): string {
|
||||
return hasValue((listableObject as SearchResult<DSpaceObject>).indexableObject) ?
|
||||
this.dsoNameService.getName((listableObject as SearchResult<DSpaceObject>).indexableObject) : null;
|
||||
}
|
||||
}
|
||||
|
@@ -9,7 +9,7 @@
|
||||
<h3 class="position-relative py-1 my-3 font-weight-normal">
|
||||
<hr>
|
||||
<div id="create-community-or-separator" class="text-center position-absolute w-100">
|
||||
<span class="px-4 bg-white">or</span>
|
||||
<span class="px-4 bg-white">{{'dso-selector.create.community.or-divider' | translate}}</span>
|
||||
</div>
|
||||
</h3>
|
||||
|
||||
|
@@ -20,7 +20,7 @@ import { FormFieldMetadataValueObject } from '../../../models/form-field-metadat
|
||||
import { VocabularyEntry } from '../../../../../../core/submission/vocabularies/models/vocabulary-entry.model';
|
||||
import { createTestComponent } from '../../../../../testing/utils.test';
|
||||
import { DynamicLookupNameModel } from './dynamic-lookup-name.model';
|
||||
import { AuthorityConfidenceStateDirective } from '../../../../../authority-confidence/authority-confidence-state.directive';
|
||||
import { AuthorityConfidenceStateDirective } from '../../../../directives/authority-confidence-state.directive';
|
||||
import { ObjNgFor } from '../../../../../utils/object-ngfor.pipe';
|
||||
import {
|
||||
mockDynamicFormLayoutService,
|
||||
|
@@ -21,11 +21,11 @@ import { DsDynamicOneboxComponent } from './dynamic-onebox.component';
|
||||
import { DynamicOneboxModel } from './dynamic-onebox.model';
|
||||
import { FormFieldMetadataValueObject } from '../../../models/form-field-metadata-value.model';
|
||||
import { createTestComponent } from '../../../../../testing/utils.test';
|
||||
import { AuthorityConfidenceStateDirective } from '../../../../../authority-confidence/authority-confidence-state.directive';
|
||||
import { AuthorityConfidenceStateDirective } from '../../../../directives/authority-confidence-state.directive';
|
||||
import { ObjNgFor } from '../../../../../utils/object-ngfor.pipe';
|
||||
import { VocabularyEntry } from '../../../../../../core/submission/vocabularies/models/vocabulary-entry.model';
|
||||
import { createSuccessfulRemoteDataObject$ } from '../../../../../remote-data.utils';
|
||||
import { VocabularyTreeviewComponent } from '../../../../../vocabulary-treeview/vocabulary-treeview.component';
|
||||
import { VocabularyTreeviewComponent } from '../../../../vocabulary-treeview/vocabulary-treeview.component';
|
||||
import {
|
||||
mockDynamicFormLayoutService,
|
||||
mockDynamicFormValidationService
|
||||
|
@@ -30,7 +30,7 @@ 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 { VocabularyTreeviewComponent } from '../../../../vocabulary-treeview/vocabulary-treeview.component';
|
||||
import { VocabularyEntryDetail } from '../../../../../../core/submission/vocabularies/models/vocabulary-entry-detail.model';
|
||||
|
||||
/**
|
||||
|
@@ -16,7 +16,7 @@ import { FormFieldModel } from '../../../models/form-field.model';
|
||||
import { FormBuilderService } from '../../../form-builder.service';
|
||||
import { FormService } from '../../../../form.service';
|
||||
import { FormComponent } from '../../../../form.component';
|
||||
import { Chips } from '../../../../../chips/models/chips.model';
|
||||
import { Chips } from '../../../../chips/models/chips.model';
|
||||
import { FormFieldMetadataValueObject } from '../../../models/form-field-metadata-value.model';
|
||||
import { DsDynamicInputModel } from '../ds-dynamic-input.model';
|
||||
import { createTestComponent } from '../../../../../testing/utils.test';
|
||||
|
@@ -19,10 +19,10 @@ import { FormBuilderService } from '../../../form-builder.service';
|
||||
import { SubmissionFormsModel } from '../../../../../../core/config/models/config-submission-forms.model';
|
||||
import { FormService } from '../../../../form.service';
|
||||
import { FormComponent } from '../../../../form.component';
|
||||
import { Chips } from '../../../../../chips/models/chips.model';
|
||||
import { Chips } from '../../../../chips/models/chips.model';
|
||||
import { hasValue, isEmpty, isNotEmpty, isNotNull } from '../../../../../empty.util';
|
||||
import { shrinkInOut } from '../../../../../animations/shrink';
|
||||
import { ChipsItem } from '../../../../../chips/models/chips-item.model';
|
||||
import { ChipsItem } from '../../../../chips/models/chips-item.model';
|
||||
import { hasOnlyEmptyProperties } from '../../../../../object.util';
|
||||
import { VocabularyService } from '../../../../../../core/submission/vocabularies/vocabulary.service';
|
||||
import { FormFieldMetadataValueObject } from '../../../models/form-field-metadata-value.model';
|
||||
|
@@ -13,7 +13,7 @@ import { VocabularyService } from '../../../../../../core/submission/vocabularie
|
||||
import { VocabularyServiceStub } from '../../../../../testing/vocabulary-service.stub';
|
||||
import { DsDynamicTagComponent } from './dynamic-tag.component';
|
||||
import { DynamicTagModel } from './dynamic-tag.model';
|
||||
import { Chips } from '../../../../../chips/models/chips.model';
|
||||
import { Chips } from '../../../../chips/models/chips.model';
|
||||
import { FormFieldMetadataValueObject } from '../../../models/form-field-metadata-value.model';
|
||||
import { VocabularyEntry } from '../../../../../../core/submission/vocabularies/models/vocabulary-entry.model';
|
||||
import { createTestComponent } from '../../../../../testing/utils.test';
|
||||
|
@@ -9,7 +9,7 @@ import isEqual from 'lodash/isEqual';
|
||||
|
||||
import { VocabularyService } from '../../../../../../core/submission/vocabularies/vocabulary.service';
|
||||
import { DynamicTagModel } from './dynamic-tag.model';
|
||||
import { Chips } from '../../../../../chips/models/chips.model';
|
||||
import { Chips } from '../../../../chips/models/chips.model';
|
||||
import { hasValue, isNotEmpty } from '../../../../../empty.util';
|
||||
import { environment } from '../../../../../../../environments/environment';
|
||||
import { getFirstSucceededRemoteDataPayload } from '../../../../../../core/shared/operators';
|
||||
|
@@ -3,17 +3,16 @@ import { ChangeDetectorRef, Component, CUSTOM_ELEMENTS_SCHEMA } from '@angular/c
|
||||
import { ComponentFixture, fakeAsync, inject, TestBed, tick, waitForAsync, } from '@angular/core/testing';
|
||||
|
||||
import { Chips } from './models/chips.model';
|
||||
import { UploaderService } from '../uploader/uploader.service';
|
||||
import { ChipsComponent } from './chips.component';
|
||||
import { NgbModule } from '@ng-bootstrap/ng-bootstrap';
|
||||
import { By } from '@angular/platform-browser';
|
||||
import { FormFieldMetadataValueObject } from '../form/builder/models/form-field-metadata-value.model';
|
||||
import { createTestComponent } from '../testing/utils.test';
|
||||
import { AuthorityConfidenceStateDirective } from '../authority-confidence/authority-confidence-state.directive';
|
||||
import { FormFieldMetadataValueObject } from '../builder/models/form-field-metadata-value.model';
|
||||
import { createTestComponent } from '../../testing/utils.test';
|
||||
import { AuthorityConfidenceStateDirective } from '../directives/authority-confidence-state.directive';
|
||||
import { TranslateModule } from '@ngx-translate/core';
|
||||
import { ConfidenceType } from '../../core/shared/confidence-type';
|
||||
import { ConfidenceType } from '../../../core/shared/confidence-type';
|
||||
import { SortablejsModule } from 'ngx-sortablejs';
|
||||
import { environment } from '../../../environments/environment';
|
||||
import { environment } from '../../../../environments/environment';
|
||||
|
||||
describe('ChipsComponent test suite', () => {
|
||||
|
||||
@@ -41,7 +40,6 @@ describe('ChipsComponent test suite', () => {
|
||||
providers: [
|
||||
ChangeDetectorRef,
|
||||
ChipsComponent,
|
||||
UploaderService
|
||||
],
|
||||
schemas: [CUSTOM_ELEMENTS_SCHEMA]
|
||||
});
|
@@ -5,7 +5,7 @@ import isObject from 'lodash/isObject';
|
||||
|
||||
import { Chips } from './models/chips.model';
|
||||
import { ChipsItem } from './models/chips-item.model';
|
||||
import { UploaderService } from '../uploader/uploader.service';
|
||||
import { DragService } from '../../../core/drag.service';
|
||||
import { TranslateService } from '@ngx-translate/core';
|
||||
import { Options } from 'sortablejs';
|
||||
import { BehaviorSubject } from 'rxjs';
|
||||
@@ -33,7 +33,7 @@ export class ChipsComponent implements OnChanges {
|
||||
|
||||
constructor(
|
||||
private cdr: ChangeDetectorRef,
|
||||
private uploaderService: UploaderService,
|
||||
private dragService: DragService,
|
||||
private translate: TranslateService) {
|
||||
|
||||
this.options = {
|
||||
@@ -76,12 +76,12 @@ export class ChipsComponent implements OnChanges {
|
||||
|
||||
onDragStart(index) {
|
||||
this.isDragging.next(true);
|
||||
this.uploaderService.overrideDragOverPage();
|
||||
this.dragService.overrideDragOverPage();
|
||||
this.dragged = index;
|
||||
}
|
||||
|
||||
onDragEnd(event) {
|
||||
this.uploaderService.allowDragOverPage();
|
||||
this.dragService.allowDragOverPage();
|
||||
this.dragged = -1;
|
||||
this.chips.updateOrder();
|
||||
this.isDragging.next(false);
|
@@ -1,5 +1,5 @@
|
||||
import { ChipsItem, ChipsItemIcon } from './chips-item.model';
|
||||
import { FormFieldMetadataValueObject } from '../../form/builder/models/form-field-metadata-value.model';
|
||||
import { FormFieldMetadataValueObject } from '../../builder/models/form-field-metadata-value.model';
|
||||
|
||||
describe('ChipsItem model test suite', () => {
|
||||
let item: ChipsItem;
|
@@ -1,9 +1,9 @@
|
||||
import isObject from 'lodash/isObject';
|
||||
import uniqueId from 'lodash/uniqueId';
|
||||
import { hasValue, isNotEmpty } from '../../empty.util';
|
||||
import { FormFieldMetadataValueObject } from '../../form/builder/models/form-field-metadata-value.model';
|
||||
import { ConfidenceType } from '../../../core/shared/confidence-type';
|
||||
import { PLACEHOLDER_PARENT_METADATA } from '../../form/builder/ds-dynamic-form-ui/ds-dynamic-form-constants';
|
||||
import { hasValue, isNotEmpty } from '../../../empty.util';
|
||||
import { FormFieldMetadataValueObject } from '../../builder/models/form-field-metadata-value.model';
|
||||
import { ConfidenceType } from '../../../../core/shared/confidence-type';
|
||||
import { PLACEHOLDER_PARENT_METADATA } from '../../builder/ds-dynamic-form-ui/ds-dynamic-form-constants';
|
||||
|
||||
export interface ChipsItemIcon {
|
||||
metadata: string;
|
@@ -1,6 +1,6 @@
|
||||
import { Chips } from './chips.model';
|
||||
import { ChipsItem } from './chips-item.model';
|
||||
import { FormFieldMetadataValueObject } from '../../form/builder/models/form-field-metadata-value.model';
|
||||
import { FormFieldMetadataValueObject } from '../../builder/models/form-field-metadata-value.model';
|
||||
|
||||
describe('Chips model test suite', () => {
|
||||
let items: any[];
|
@@ -3,11 +3,11 @@ import isEqual from 'lodash/isEqual';
|
||||
import isObject from 'lodash/isObject';
|
||||
import { BehaviorSubject } from 'rxjs';
|
||||
import { ChipsItem, ChipsItemIcon } from './chips-item.model';
|
||||
import { hasValue, isNotEmpty } from '../../empty.util';
|
||||
import { MetadataIconConfig } from '../../../../config/submission-config.interface';
|
||||
import { FormFieldMetadataValueObject } from '../../form/builder/models/form-field-metadata-value.model';
|
||||
import { VocabularyEntry } from '../../../core/submission/vocabularies/models/vocabulary-entry.model';
|
||||
import { PLACEHOLDER_PARENT_METADATA } from '../../form/builder/ds-dynamic-form-ui/ds-dynamic-form-constants';
|
||||
import { hasValue, isNotEmpty } from '../../../empty.util';
|
||||
import { MetadataIconConfig } from '../../../../../config/submission-config.interface';
|
||||
import { FormFieldMetadataValueObject } from '../../builder/models/form-field-metadata-value.model';
|
||||
import { VocabularyEntry } from '../../../../core/submission/vocabularies/models/vocabulary-entry.model';
|
||||
import { PLACEHOLDER_PARENT_METADATA } from '../../builder/ds-dynamic-form-ui/ds-dynamic-form-constants';
|
||||
|
||||
export class Chips {
|
||||
chipsItems: BehaviorSubject<ChipsItem[]>;
|
@@ -1,3 +1,11 @@
|
||||
/**
|
||||
* The contents of this file are subject to the license and copyright
|
||||
* detailed in the LICENSE and NOTICE files at the root of the source
|
||||
* tree and available online at
|
||||
*
|
||||
* http://www.dspace.org/license/
|
||||
*/
|
||||
|
||||
import {
|
||||
AfterViewInit,
|
||||
Directive,
|
||||
@@ -13,13 +21,13 @@ import {
|
||||
|
||||
import findIndex from 'lodash/findIndex';
|
||||
|
||||
import { VocabularyEntry } from '../../core/submission/vocabularies/models/vocabulary-entry.model';
|
||||
import { FormFieldMetadataValueObject } from '../form/builder/models/form-field-metadata-value.model';
|
||||
import { ConfidenceType } from '../../core/shared/confidence-type';
|
||||
import { isNotEmpty, isNull } from '../empty.util';
|
||||
import { ConfidenceIconConfig } from '../../../config/submission-config.interface';
|
||||
import { environment } from '../../../environments/environment';
|
||||
import { VocabularyEntryDetail } from '../../core/submission/vocabularies/models/vocabulary-entry-detail.model';
|
||||
import { VocabularyEntry } from '../../../core/submission/vocabularies/models/vocabulary-entry.model';
|
||||
import { FormFieldMetadataValueObject } from '../builder/models/form-field-metadata-value.model';
|
||||
import { ConfidenceType } from '../../../core/shared/confidence-type';
|
||||
import { isNotEmpty, isNull } from '../../empty.util';
|
||||
import { ConfidenceIconConfig } from '../../../../config/submission-config.interface';
|
||||
import { environment } from '../../../../environments/environment';
|
||||
import { VocabularyEntryDetail } from '../../../core/submission/vocabularies/models/vocabulary-entry-detail.model';
|
||||
|
||||
/**
|
||||
* Directive to add to the element a bootstrap utility class based on metadata confidence value
|
@@ -2,10 +2,7 @@ import { NgModule } from '@angular/core';
|
||||
import { CommonModule } from '@angular/common';
|
||||
import { FormComponent } from './form.component';
|
||||
import { DsDynamicFormComponent } from './builder/ds-dynamic-form-ui/ds-dynamic-form.component';
|
||||
import {
|
||||
DsDynamicFormControlContainerComponent,
|
||||
dsDynamicFormControlMapFn
|
||||
} from './builder/ds-dynamic-form-ui/ds-dynamic-form-control-container.component';
|
||||
import { DsDynamicFormControlContainerComponent, dsDynamicFormControlMapFn } from './builder/ds-dynamic-form-ui/ds-dynamic-form-control-container.component';
|
||||
import { DsDynamicListComponent } from './builder/ds-dynamic-form-ui/models/list/dynamic-list.component';
|
||||
import { DsDynamicLookupComponent } from './builder/ds-dynamic-form-ui/models/lookup/dynamic-lookup.component';
|
||||
import { DsDynamicDisabledComponent } from './builder/ds-dynamic-form-ui/models/disabled/dynamic-disabled.component';
|
||||
@@ -24,15 +21,23 @@ import { DsDynamicLookupRelationExternalSourceTabComponent } from './builder/ds-
|
||||
import { SharedModule } from '../shared.module';
|
||||
import { TranslateModule } from '@ngx-translate/core';
|
||||
import { SearchModule } from '../search/search.module';
|
||||
import { DYNAMIC_FORM_CONTROL_MAP_FN, DynamicFormsCoreModule } from '@ng-dynamic-forms/core';
|
||||
import { DYNAMIC_FORM_CONTROL_MAP_FN, DYNAMIC_MATCHER_PROVIDERS, DynamicFormLayoutService, DynamicFormsCoreModule, DynamicFormService, DynamicFormValidationService } from '@ng-dynamic-forms/core';
|
||||
import { ExistingMetadataListElementComponent } from './builder/ds-dynamic-form-ui/existing-metadata-list-element/existing-metadata-list-element.component';
|
||||
import { ExistingRelationListElementComponent } from './builder/ds-dynamic-form-ui/existing-relation-list-element/existing-relation-list-element.component';
|
||||
import { ExternalSourceEntryImportModalComponent } from './builder/ds-dynamic-form-ui/relation-lookup-modal/external-source-tab/external-source-entry-import-modal/external-source-entry-import-modal.component';
|
||||
import { CustomSwitchComponent } from './builder/ds-dynamic-form-ui/models/custom-switch/custom-switch.component';
|
||||
import { DynamicFormsNGBootstrapUIModule } from '@ng-dynamic-forms/ui-ng-bootstrap';
|
||||
import {
|
||||
ThemedExternalSourceEntryImportModalComponent
|
||||
} from './builder/ds-dynamic-form-ui/relation-lookup-modal/external-source-tab/external-source-entry-import-modal/themed-external-source-entry-import-modal.component';
|
||||
import { ChipsComponent } from './chips/chips.component';
|
||||
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 { 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';
|
||||
import { NgxMaskModule } from 'ngx-mask';
|
||||
import { ThemedExternalSourceEntryImportModalComponent } from './builder/ds-dynamic-form-ui/relation-lookup-modal/external-source-tab/external-source-entry-import-modal/themed-external-source-entry-import-modal.component';
|
||||
|
||||
const COMPONENTS = [
|
||||
CustomSwitchComponent,
|
||||
@@ -56,13 +61,21 @@ const COMPONENTS = [
|
||||
ExistingMetadataListElementComponent,
|
||||
ExistingRelationListElementComponent,
|
||||
ExternalSourceEntryImportModalComponent,
|
||||
ThemedExternalSourceEntryImportModalComponent,
|
||||
FormComponent
|
||||
FormComponent,
|
||||
ChipsComponent,
|
||||
NumberPickerComponent,
|
||||
VocabularyTreeviewComponent,
|
||||
ThemedExternalSourceEntryImportModalComponent
|
||||
];
|
||||
|
||||
const DIRECTIVES = [
|
||||
AuthorityConfidenceStateDirective,
|
||||
];
|
||||
|
||||
@NgModule({
|
||||
declarations: [
|
||||
...COMPONENTS
|
||||
...COMPONENTS,
|
||||
...DIRECTIVES,
|
||||
],
|
||||
imports: [
|
||||
CommonModule,
|
||||
@@ -70,16 +83,27 @@ const COMPONENTS = [
|
||||
DynamicFormsNGBootstrapUIModule,
|
||||
SearchModule,
|
||||
SharedModule,
|
||||
TranslateModule
|
||||
TranslateModule,
|
||||
SortablejsModule,
|
||||
NgxMaskModule.forRoot(),
|
||||
],
|
||||
exports: [
|
||||
...COMPONENTS
|
||||
...COMPONENTS,
|
||||
...DIRECTIVES,
|
||||
],
|
||||
providers: [
|
||||
{
|
||||
provide: DYNAMIC_FORM_CONTROL_MAP_FN,
|
||||
useValue: dsDynamicFormControlMapFn
|
||||
}
|
||||
},
|
||||
...DYNAMIC_MATCHER_PROVIDERS,
|
||||
VocabularyTreeviewService,
|
||||
DynamicFormLayoutService,
|
||||
DynamicFormService,
|
||||
DynamicFormValidationService,
|
||||
FormBuilderService,
|
||||
DsDynamicTypeBindRelationService,
|
||||
FormService,
|
||||
]
|
||||
})
|
||||
export class FormModule {
|
||||
|
@@ -2,12 +2,11 @@
|
||||
import { ChangeDetectorRef, Component, CUSTOM_ELEMENTS_SCHEMA } from '@angular/core';
|
||||
import { ComponentFixture, inject, TestBed, waitForAsync, } from '@angular/core/testing';
|
||||
|
||||
import { UploaderService } from '../uploader/uploader.service';
|
||||
import { NgbModule } from '@ng-bootstrap/ng-bootstrap';
|
||||
import { By } from '@angular/platform-browser';
|
||||
import { NumberPickerComponent } from './number-picker.component';
|
||||
import { FormsModule, ReactiveFormsModule } from '@angular/forms';
|
||||
import { createTestComponent } from '../testing/utils.test';
|
||||
import { createTestComponent } from '../../testing/utils.test';
|
||||
|
||||
describe('NumberPickerComponent test suite', () => {
|
||||
|
||||
@@ -33,7 +32,6 @@ describe('NumberPickerComponent test suite', () => {
|
||||
providers: [
|
||||
ChangeDetectorRef,
|
||||
NumberPickerComponent,
|
||||
UploaderService
|
||||
],
|
||||
schemas: [CUSTOM_ELEMENTS_SCHEMA]
|
||||
});
|
@@ -1,6 +1,6 @@
|
||||
import { ChangeDetectorRef, Component, EventEmitter, Input, OnInit, Output, SimpleChanges, } from '@angular/core';
|
||||
import { ControlValueAccessor, FormBuilder, NG_VALUE_ACCESSOR } from '@angular/forms';
|
||||
import { isEmpty } from '../empty.util';
|
||||
import { isEmpty } from '../../empty.util';
|
||||
|
||||
@Component({
|
||||
selector: 'ds-number-picker',
|
@@ -1,7 +1,7 @@
|
||||
/* eslint-disable max-classes-per-file */
|
||||
import { BehaviorSubject } from 'rxjs';
|
||||
import { VocabularyEntryDetail } from '../../core/submission/vocabularies/models/vocabulary-entry-detail.model';
|
||||
import { PageInfo } from '../../core/shared/page-info.model';
|
||||
import { VocabularyEntryDetail } from '../../../core/submission/vocabularies/models/vocabulary-entry-detail.model';
|
||||
import { PageInfo } from '../../../core/shared/page-info.model';
|
||||
|
||||
export const LOAD_MORE = 'LOAD_MORE';
|
||||
export const LOAD_MORE_ROOT = 'LOAD_MORE_ROOT';
|
@@ -8,18 +8,18 @@ import { TranslateModule } from '@ngx-translate/core';
|
||||
import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap';
|
||||
import { provideMockStore } from '@ngrx/store/testing';
|
||||
|
||||
import { createTestComponent } from '../testing/utils.test';
|
||||
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 { VocabularyEntryDetail } from '../../../core/submission/vocabularies/models/vocabulary-entry-detail.model';
|
||||
import { TreeviewFlatNode } from './vocabulary-treeview-node.model';
|
||||
import { FormFieldMetadataValueObject } from '../form/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';
|
||||
import { VocabularyEntry } from '../../core/submission/vocabularies/models/vocabulary-entry.model';
|
||||
import { AuthTokenInfo } from '../../core/auth/models/auth-token-info.model';
|
||||
import { authReducer } from '../../core/auth/auth.reducer';
|
||||
import { storeModuleConfig } from '../../app.reducer';
|
||||
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';
|
||||
import { VocabularyEntry } from '../../../core/submission/vocabularies/models/vocabulary-entry.model';
|
||||
import { AuthTokenInfo } from '../../../core/auth/models/auth-token-info.model';
|
||||
import { authReducer } from '../../../core/auth/auth.reducer';
|
||||
import { storeModuleConfig } from '../../../app.reducer';
|
||||
|
||||
describe('VocabularyTreeviewComponent test suite', () => {
|
||||
|
@@ -7,17 +7,17 @@ import { Observable, Subscription } from 'rxjs';
|
||||
import { select, Store } from '@ngrx/store';
|
||||
import { TranslateService } from '@ngx-translate/core';
|
||||
|
||||
import { VocabularyEntryDetail } from '../../core/submission/vocabularies/models/vocabulary-entry-detail.model';
|
||||
import { hasValue, isEmpty, isNotEmpty } from '../empty.util';
|
||||
import { isAuthenticated } from '../../core/auth/selectors';
|
||||
import { VocabularyEntryDetail } from '../../../core/submission/vocabularies/models/vocabulary-entry-detail.model';
|
||||
import { hasValue, isEmpty, isNotEmpty } from '../../empty.util';
|
||||
import { isAuthenticated } from '../../../core/auth/selectors';
|
||||
import { VocabularyTreeviewService } from './vocabulary-treeview.service';
|
||||
import { LOAD_MORE, LOAD_MORE_ROOT, TreeviewFlatNode, TreeviewNode } from './vocabulary-treeview-node.model';
|
||||
import { VocabularyOptions } from '../../core/submission/vocabularies/models/vocabulary-options.model';
|
||||
import { PageInfo } from '../../core/shared/page-info.model';
|
||||
import { VocabularyEntry } from '../../core/submission/vocabularies/models/vocabulary-entry.model';
|
||||
import { VocabularyOptions } from '../../../core/submission/vocabularies/models/vocabulary-options.model';
|
||||
import { PageInfo } from '../../../core/shared/page-info.model';
|
||||
import { VocabularyEntry } from '../../../core/submission/vocabularies/models/vocabulary-entry.model';
|
||||
import { VocabularyTreeFlattener } from './vocabulary-tree-flattener';
|
||||
import { VocabularyTreeFlatDataSource } from './vocabulary-tree-flat-data-source';
|
||||
import { CoreState } from '../../core/core-state.model';
|
||||
import { CoreState } from '../../../core/core-state.model';
|
||||
|
||||
/**
|
||||
* Component that show a hierarchical vocabulary in a tree view
|
@@ -5,15 +5,15 @@ import { TranslateLoader, TranslateModule, TranslateService } from '@ngx-transla
|
||||
import { cold, getTestScheduler, hot } from 'jasmine-marbles';
|
||||
|
||||
import { VocabularyTreeviewService } from './vocabulary-treeview.service';
|
||||
import { VocabularyService } from '../../core/submission/vocabularies/vocabulary.service';
|
||||
import { TranslateLoaderMock } from '../mocks/translate-loader.mock';
|
||||
import { VocabularyOptions } from '../../core/submission/vocabularies/models/vocabulary-options.model';
|
||||
import { VocabularyService } from '../../../core/submission/vocabularies/vocabulary.service';
|
||||
import { TranslateLoaderMock } from '../../mocks/translate-loader.mock';
|
||||
import { VocabularyOptions } from '../../../core/submission/vocabularies/models/vocabulary-options.model';
|
||||
import { LOAD_MORE_NODE, LOAD_MORE_ROOT_NODE, TreeviewFlatNode, TreeviewNode } from './vocabulary-treeview-node.model';
|
||||
import { PageInfo } from '../../core/shared/page-info.model';
|
||||
import { VocabularyEntryDetail } from '../../core/submission/vocabularies/models/vocabulary-entry-detail.model';
|
||||
import { buildPaginatedList } from '../../core/data/paginated-list.model';
|
||||
import { createSuccessfulRemoteDataObject } from '../remote-data.utils';
|
||||
import { VocabularyEntry } from '../../core/submission/vocabularies/models/vocabulary-entry.model';
|
||||
import { PageInfo } from '../../../core/shared/page-info.model';
|
||||
import { VocabularyEntryDetail } from '../../../core/submission/vocabularies/models/vocabulary-entry-detail.model';
|
||||
import { buildPaginatedList } from '../../../core/data/paginated-list.model';
|
||||
import { createSuccessfulRemoteDataObject } from '../../remote-data.utils';
|
||||
import { VocabularyEntry } from '../../../core/submission/vocabularies/models/vocabulary-entry.model';
|
||||
import { expand, map, switchMap } from 'rxjs/operators';
|
||||
import { from as observableFrom } from 'rxjs';
|
||||
|
@@ -10,17 +10,17 @@ import {
|
||||
TreeviewFlatNode,
|
||||
TreeviewNode
|
||||
} from './vocabulary-treeview-node.model';
|
||||
import { VocabularyEntry } from '../../core/submission/vocabularies/models/vocabulary-entry.model';
|
||||
import { VocabularyService } from '../../core/submission/vocabularies/vocabulary.service';
|
||||
import { PageInfo } from '../../core/shared/page-info.model';
|
||||
import { isEmpty, isNotEmpty } from '../empty.util';
|
||||
import { VocabularyOptions } from '../../core/submission/vocabularies/models/vocabulary-options.model';
|
||||
import { VocabularyEntry } from '../../../core/submission/vocabularies/models/vocabulary-entry.model';
|
||||
import { VocabularyService } from '../../../core/submission/vocabularies/vocabulary.service';
|
||||
import { PageInfo } from '../../../core/shared/page-info.model';
|
||||
import { isEmpty, isNotEmpty } from '../../empty.util';
|
||||
import { VocabularyOptions } from '../../../core/submission/vocabularies/models/vocabulary-options.model';
|
||||
import {
|
||||
getFirstSucceededRemoteDataPayload,
|
||||
getFirstSucceededRemoteListPayload
|
||||
} from '../../core/shared/operators';
|
||||
import { PaginatedList } from '../../core/data/paginated-list.model';
|
||||
import { VocabularyEntryDetail } from '../../core/submission/vocabularies/models/vocabulary-entry-detail.model';
|
||||
} from '../../../core/shared/operators';
|
||||
import { PaginatedList } from '../../../core/data/paginated-list.model';
|
||||
import { VocabularyEntryDetail } from '../../../core/submission/vocabularies/models/vocabulary-entry-detail.model';
|
||||
|
||||
/**
|
||||
* A service that provides methods to deal with vocabulary tree
|
@@ -12,8 +12,11 @@ import { ExternalLinkMenuItemComponent } from './menu-item/external-link-menu-it
|
||||
const COMPONENTS = [
|
||||
MenuSectionComponent,
|
||||
MenuComponent,
|
||||
LinkMenuItemComponent,
|
||||
];
|
||||
|
||||
const ENTRY_COMPONENTS = [
|
||||
TextMenuItemComponent,
|
||||
LinkMenuItemComponent,
|
||||
OnClickMenuItemComponent,
|
||||
ExternalLinkMenuItemComponent,
|
||||
];
|
||||
@@ -32,10 +35,12 @@ const PROVIDERS = [
|
||||
...MODULES
|
||||
],
|
||||
declarations: [
|
||||
...COMPONENTS
|
||||
...COMPONENTS,
|
||||
...ENTRY_COMPONENTS,
|
||||
],
|
||||
providers: [
|
||||
...PROVIDERS
|
||||
...PROVIDERS,
|
||||
...ENTRY_COMPONENTS,
|
||||
],
|
||||
exports: [
|
||||
...COMPONENTS
|
||||
|
@@ -0,0 +1 @@
|
||||
<div class="alert d-block {{ object?.notificationType }} m-0">{{ object?.message | translate }}</div>
|
@@ -0,0 +1,43 @@
|
||||
import { ComponentFixture, TestBed } from '@angular/core/testing';
|
||||
import { ListableNotificationObjectComponent } from './listable-notification-object.component';
|
||||
import { NotificationType } from '../../notifications/models/notification-type';
|
||||
import { ListableNotificationObject } from './listable-notification-object.model';
|
||||
import { By } from '@angular/platform-browser';
|
||||
import { TranslateModule } from '@ngx-translate/core';
|
||||
|
||||
describe('ListableNotificationObjectComponent', () => {
|
||||
let component: ListableNotificationObjectComponent;
|
||||
let fixture: ComponentFixture<ListableNotificationObjectComponent>;
|
||||
|
||||
beforeEach(async () => {
|
||||
await TestBed.configureTestingModule({
|
||||
imports: [
|
||||
TranslateModule.forRoot(),
|
||||
],
|
||||
declarations: [
|
||||
ListableNotificationObjectComponent,
|
||||
],
|
||||
}).compileComponents();
|
||||
});
|
||||
|
||||
beforeEach(() => {
|
||||
fixture = TestBed.createComponent(ListableNotificationObjectComponent);
|
||||
component = fixture.componentInstance;
|
||||
fixture.detectChanges();
|
||||
});
|
||||
|
||||
describe('ui', () => {
|
||||
it('should display the given error message', () => {
|
||||
component.object = new ListableNotificationObject(NotificationType.Error, 'test error message');
|
||||
fixture.detectChanges();
|
||||
|
||||
const listableNotificationObject: Element = fixture.debugElement.query(By.css('.alert')).nativeElement;
|
||||
expect(listableNotificationObject.className).toContain(NotificationType.Error);
|
||||
expect(listableNotificationObject.innerHTML).toBe('test error message');
|
||||
});
|
||||
});
|
||||
|
||||
afterEach(() => {
|
||||
fixture.debugElement.nativeElement.remove();
|
||||
});
|
||||
});
|
@@ -0,0 +1,21 @@
|
||||
import { Component } from '@angular/core';
|
||||
import {
|
||||
AbstractListableElementComponent
|
||||
} from '../../object-collection/shared/object-collection-element/abstract-listable-element.component';
|
||||
import { ListableNotificationObject } from './listable-notification-object.model';
|
||||
import { listableObjectComponent } from '../../object-collection/shared/listable-object/listable-object.decorator';
|
||||
import { ViewMode } from '../../../core/shared/view-mode.model';
|
||||
import { LISTABLE_NOTIFICATION_OBJECT } from './listable-notification-object.resource-type';
|
||||
|
||||
/**
|
||||
* The component for displaying a notifications inside an object list
|
||||
*/
|
||||
@listableObjectComponent(ListableNotificationObject, ViewMode.ListElement)
|
||||
@listableObjectComponent(LISTABLE_NOTIFICATION_OBJECT.value, ViewMode.ListElement)
|
||||
@Component({
|
||||
selector: 'ds-listable-notification-object',
|
||||
templateUrl: './listable-notification-object.component.html',
|
||||
styleUrls: ['./listable-notification-object.component.scss'],
|
||||
})
|
||||
export class ListableNotificationObjectComponent extends AbstractListableElementComponent<ListableNotificationObject> {
|
||||
}
|
@@ -0,0 +1,36 @@
|
||||
import { ListableObject } from '../../object-collection/shared/listable-object.model';
|
||||
import { typedObject } from '../../../core/cache/builders/build-decorators';
|
||||
import { TypedObject } from '../../../core/cache/typed-object.model';
|
||||
import { LISTABLE_NOTIFICATION_OBJECT } from './listable-notification-object.resource-type';
|
||||
import { GenericConstructor } from '../../../core/shared/generic-constructor';
|
||||
import { NotificationType } from '../../notifications/models/notification-type';
|
||||
import { ResourceType } from '../../../core/shared/resource-type';
|
||||
|
||||
/**
|
||||
* Object representing a notification message inside a list of objects
|
||||
*/
|
||||
@typedObject
|
||||
export class ListableNotificationObject extends ListableObject implements TypedObject {
|
||||
|
||||
static type: ResourceType = LISTABLE_NOTIFICATION_OBJECT;
|
||||
type: ResourceType = LISTABLE_NOTIFICATION_OBJECT;
|
||||
|
||||
protected renderTypes: string[];
|
||||
|
||||
constructor(
|
||||
public notificationType: NotificationType = NotificationType.Error,
|
||||
public message: string = 'listable-notification-object.default-message',
|
||||
...renderTypes: string[]
|
||||
) {
|
||||
super();
|
||||
this.renderTypes = renderTypes;
|
||||
}
|
||||
|
||||
/**
|
||||
* Method that returns as which type of object this object should be rendered.
|
||||
*/
|
||||
getRenderTypes(): (string | GenericConstructor<ListableObject>)[] {
|
||||
return [...this.renderTypes, this.constructor as GenericConstructor<ListableObject>];
|
||||
}
|
||||
|
||||
}
|
@@ -0,0 +1,9 @@
|
||||
import { ResourceType } from '../../../core/shared/resource-type';
|
||||
|
||||
/**
|
||||
* The resource type for {@link ListableNotificationObject}
|
||||
*
|
||||
* Needs to be in a separate file to prevent circular
|
||||
* dependencies in webpack.
|
||||
*/
|
||||
export const LISTABLE_NOTIFICATION_OBJECT = new ResourceType('listable-notification-object');
|
@@ -9,7 +9,7 @@
|
||||
<h3 class="position-relative py-1 my-3 font-weight-normal">
|
||||
<hr>
|
||||
<div id="create-community-or-separator" class="text-center position-absolute w-100">
|
||||
<span class="px-4 bg-white">or</span>
|
||||
<span class="px-4 bg-white">{{'dso-selector.' + action + '.' + objectType.toString().toLowerCase() + '.or-divider' | translate}}</span>
|
||||
</div>
|
||||
</h3>
|
||||
|
||||
|
@@ -17,7 +17,6 @@ import {
|
||||
} from '@ng-bootstrap/ng-bootstrap';
|
||||
import { MissingTranslationHandler, TranslateModule } from '@ngx-translate/core';
|
||||
import { NgxPaginationModule } from 'ngx-pagination';
|
||||
import { FileUploadModule } from 'ng2-file-upload';
|
||||
import { InfiniteScrollModule } from 'ngx-infinite-scroll';
|
||||
import { ConfirmationModalComponent } from './confirmation-modal/confirmation-modal.component';
|
||||
import {
|
||||
@@ -29,7 +28,6 @@ import {
|
||||
import {
|
||||
ImportBatchSelectorComponent
|
||||
} from './dso-selector/modal-wrappers/import-batch-selector/import-batch-selector.component';
|
||||
import { FileDropzoneNoUploaderComponent } from './file-dropzone-no-uploader/file-dropzone-no-uploader.component';
|
||||
import { ItemListElementComponent } from './object-list/item-list-element/item-types/item/item-list-element.component';
|
||||
import { EnumKeysPipe } from './utils/enum-keys-pipe';
|
||||
import { FileSizePipe } from './utils/file-size-pipe';
|
||||
@@ -72,9 +70,6 @@ import { TruncatePipe } from './utils/truncate.pipe';
|
||||
import { TruncatableComponent } from './truncatable/truncatable.component';
|
||||
import { TruncatableService } from './truncatable/truncatable.service';
|
||||
import { TruncatablePartComponent } from './truncatable/truncatable-part/truncatable-part.component';
|
||||
import { UploaderComponent } from './uploader/uploader.component';
|
||||
import { ChipsComponent } from './chips/chips.component';
|
||||
import { NumberPickerComponent } from './number-picker/number-picker.component';
|
||||
import { MockAdminGuard } from './mocks/admin-guard.service.mock';
|
||||
import { AlertComponent } from './alert/alert.component';
|
||||
import {
|
||||
@@ -110,7 +105,6 @@ import { EmphasizePipe } from './utils/emphasize.pipe';
|
||||
import { InputSuggestionsComponent } from './input-suggestions/input-suggestions.component';
|
||||
import { CapitalizePipe } from './utils/capitalize.pipe';
|
||||
import { ObjectKeysPipe } from './utils/object-keys-pipe';
|
||||
import { AuthorityConfidenceStateDirective } from './authority-confidence/authority-confidence-state.directive';
|
||||
import { LangSwitchComponent } from './lang-switch/lang-switch.component';
|
||||
import {
|
||||
PlainTextMetadataListElementComponent
|
||||
@@ -231,7 +225,6 @@ import {
|
||||
ImportableListItemControlComponent
|
||||
} from './object-collection/shared/importable-list-item-control/importable-list-item-control.component';
|
||||
import { ItemVersionsComponent } from './item/item-versions/item-versions.component';
|
||||
import { SortablejsModule } from 'ngx-sortablejs';
|
||||
import { LogInContainerComponent } from './log-in/container/log-in-container.component';
|
||||
import { LogInShibbolethComponent } from './log-in/methods/shibboleth/log-in-shibboleth.component';
|
||||
import { LogInPasswordComponent } from './log-in/methods/password/log-in-password.component';
|
||||
@@ -257,7 +250,6 @@ import { NgForTrackByIdDirective } from './ng-for-track-by-id.directive';
|
||||
import { FileDownloadLinkComponent } from './file-download-link/file-download-link.component';
|
||||
import { CollectionDropdownComponent } from './collection-dropdown/collection-dropdown.component';
|
||||
import { EntityDropdownComponent } from './entity-dropdown/entity-dropdown.component';
|
||||
import { VocabularyTreeviewComponent } from './vocabulary-treeview/vocabulary-treeview.component';
|
||||
import { CurationFormComponent } from '../curation-form/curation-form.component';
|
||||
import {
|
||||
PublicationSidebarSearchListElementComponent
|
||||
@@ -292,9 +284,6 @@ import {
|
||||
MetadataRepresentationListComponent
|
||||
} from '../item-page/simple/metadata-representation-list/metadata-representation-list.component';
|
||||
import { RelatedItemsComponent } from '../item-page/simple/related-items/related-items-component';
|
||||
import { LinkMenuItemComponent } from './menu/menu-item/link-menu-item.component';
|
||||
import { OnClickMenuItemComponent } from './menu/menu-item/onclick-menu-item.component';
|
||||
import { TextMenuItemComponent } from './menu/menu-item/text-menu-item.component';
|
||||
import { SearchNavbarComponent } from '../search-navbar/search-navbar.component';
|
||||
import { ThemedSearchNavbarComponent } from '../search-navbar/themed-search-navbar.component';
|
||||
import {
|
||||
@@ -311,7 +300,6 @@ import { DsSelectComponent } from './ds-select/ds-select.component';
|
||||
import { LogInOidcComponent } from './log-in/methods/oidc/log-in-oidc.component';
|
||||
import { ThemedItemListPreviewComponent } from './object-list/my-dspace-result-list-element/item-list-preview/themed-item-list-preview.component';
|
||||
import { RSSComponent } from './rss-feed/rss.component';
|
||||
import { ExternalLinkMenuItemComponent } from './menu/menu-item/external-link-menu-item.component';
|
||||
import { DsoPageOrcidButtonComponent } from './dso-page/dso-page-orcid-button/dso-page-orcid-button.component';
|
||||
import { LogInOrcidComponent } from './log-in/methods/orcid/log-in-orcid.component';
|
||||
import { BrowserOnlyPipe } from './utils/browser-only.pipe';
|
||||
@@ -323,11 +311,13 @@ import {
|
||||
} from '../item-page/simple/field-components/specific-field/title/item-page-title-field.component';
|
||||
import { MarkdownPipe } from './utils/markdown.pipe';
|
||||
import { GoogleRecaptchaModule } from '../core/google-recaptcha/google-recaptcha.module';
|
||||
import { MenuModule } from './menu/menu.module';
|
||||
import {
|
||||
ListableNotificationObjectComponent
|
||||
} from './object-list/listable-notification-object/listable-notification-object.component';
|
||||
|
||||
const MODULES = [
|
||||
CommonModule,
|
||||
SortablejsModule,
|
||||
FileUploadModule,
|
||||
FormsModule,
|
||||
InfiniteScrollModule,
|
||||
NgbNavModule,
|
||||
@@ -344,6 +334,7 @@ const MODULES = [
|
||||
DragDropModule,
|
||||
CdkTreeModule,
|
||||
GoogleRecaptchaModule,
|
||||
MenuModule,
|
||||
];
|
||||
|
||||
const ROOT_MODULES = [
|
||||
@@ -375,7 +366,6 @@ const COMPONENTS = [
|
||||
AuthNavMenuComponent,
|
||||
ThemedAuthNavMenuComponent,
|
||||
UserMenuComponent,
|
||||
ChipsComponent,
|
||||
DsSelectComponent,
|
||||
ErrorComponent,
|
||||
FileSectionComponent,
|
||||
@@ -384,7 +374,6 @@ const COMPONENTS = [
|
||||
ThemedLoadingComponent,
|
||||
LogInComponent,
|
||||
LogOutComponent,
|
||||
NumberPickerComponent,
|
||||
ObjectListComponent,
|
||||
ThemedObjectListComponent,
|
||||
ObjectDetailComponent,
|
||||
@@ -399,8 +388,6 @@ const COMPONENTS = [
|
||||
SidebarFilterComponent,
|
||||
SidebarFilterSelectedOptionComponent,
|
||||
ThumbnailComponent,
|
||||
UploaderComponent,
|
||||
FileDropzoneNoUploaderComponent,
|
||||
ItemListPreviewComponent,
|
||||
ThemedItemListPreviewComponent,
|
||||
MyDSpaceItemStatusComponent,
|
||||
@@ -408,10 +395,6 @@ const COMPONENTS = [
|
||||
ItemDetailPreviewComponent,
|
||||
ItemDetailPreviewFieldComponent,
|
||||
ClaimedTaskActionsComponent,
|
||||
ClaimedTaskActionsApproveComponent,
|
||||
ClaimedTaskActionsRejectComponent,
|
||||
ClaimedTaskActionsReturnToPoolComponent,
|
||||
ClaimedTaskActionsEditMetadataComponent,
|
||||
ClaimedTaskActionsLoaderComponent,
|
||||
ItemActionsComponent,
|
||||
PoolTaskActionsComponent,
|
||||
@@ -426,90 +409,33 @@ const COMPONENTS = [
|
||||
ValidationSuggestionsComponent,
|
||||
DsoInputSuggestionsComponent,
|
||||
DSOSelectorComponent,
|
||||
CreateCommunityParentSelectorComponent,
|
||||
ThemedCreateCommunityParentSelectorComponent,
|
||||
CreateCollectionParentSelectorComponent,
|
||||
ThemedCreateCollectionParentSelectorComponent,
|
||||
CreateItemParentSelectorComponent,
|
||||
ThemedCreateItemParentSelectorComponent,
|
||||
EditCommunitySelectorComponent,
|
||||
ThemedEditCommunitySelectorComponent,
|
||||
EditCollectionSelectorComponent,
|
||||
ThemedEditCollectionSelectorComponent,
|
||||
EditItemSelectorComponent,
|
||||
ThemedEditItemSelectorComponent,
|
||||
CommunitySearchResultListElementComponent,
|
||||
CollectionSearchResultListElementComponent,
|
||||
BrowseByComponent,
|
||||
|
||||
CollectionSearchResultGridElementComponent,
|
||||
CommunitySearchResultGridElementComponent,
|
||||
SearchExportCsvComponent,
|
||||
PageSizeSelectorComponent,
|
||||
ListableObjectComponentLoaderComponent,
|
||||
CollectionListElementComponent,
|
||||
CommunityListElementComponent,
|
||||
CollectionGridElementComponent,
|
||||
CommunityGridElementComponent,
|
||||
BrowseByComponent,
|
||||
AbstractTrackableComponent,
|
||||
ComcolMetadataComponent,
|
||||
TypeBadgeComponent,
|
||||
AccessStatusBadgeComponent,
|
||||
BrowseByComponent,
|
||||
AbstractTrackableComponent,
|
||||
|
||||
ItemSelectComponent,
|
||||
CollectionSelectComponent,
|
||||
MetadataRepresentationLoaderComponent,
|
||||
SelectableListItemControlComponent,
|
||||
|
||||
ImportableListItemControlComponent,
|
||||
|
||||
LogInShibbolethComponent,
|
||||
LogInOidcComponent,
|
||||
LogInOrcidComponent,
|
||||
LogInPasswordComponent,
|
||||
LogInContainerComponent,
|
||||
ItemVersionsComponent,
|
||||
ItemSearchResultListElementComponent,
|
||||
ItemVersionsNoticeComponent,
|
||||
ModifyItemOverviewComponent,
|
||||
ImpersonateNavbarComponent,
|
||||
FileDownloadLinkComponent,
|
||||
BitstreamDownloadPageComponent,
|
||||
BitstreamRequestACopyPageComponent,
|
||||
CollectionDropdownComponent,
|
||||
EntityDropdownComponent,
|
||||
ExportMetadataSelectorComponent,
|
||||
ImportBatchSelectorComponent,
|
||||
ExportBatchSelectorComponent,
|
||||
ConfirmationModalComponent,
|
||||
VocabularyTreeviewComponent,
|
||||
AuthorizedCollectionSelectorComponent,
|
||||
CurationFormComponent,
|
||||
SearchResultListElementComponent,
|
||||
SearchResultGridElementComponent,
|
||||
ItemListElementComponent,
|
||||
ItemGridElementComponent,
|
||||
ItemSearchResultGridElementComponent,
|
||||
BrowseEntryListElementComponent,
|
||||
SearchResultDetailElementComponent,
|
||||
PlainTextMetadataListElementComponent,
|
||||
ItemMetadataListElementComponent,
|
||||
MetadataRepresentationListElementComponent,
|
||||
ItemMetadataRepresentationListElementComponent,
|
||||
BundleListElementComponent,
|
||||
StartsWithDateComponent,
|
||||
StartsWithTextComponent,
|
||||
SidebarSearchListElementComponent,
|
||||
PublicationSidebarSearchListElementComponent,
|
||||
CollectionSidebarSearchListElementComponent,
|
||||
CommunitySidebarSearchListElementComponent,
|
||||
SearchNavbarComponent,
|
||||
ScopeSelectorModalComponent,
|
||||
ItemPageTitleFieldComponent,
|
||||
ThemedSearchNavbarComponent,
|
||||
ListableNotificationObjectComponent,
|
||||
];
|
||||
|
||||
const ENTRY_COMPONENTS = [
|
||||
@@ -566,16 +492,12 @@ const ENTRY_COMPONENTS = [
|
||||
ImportBatchSelectorComponent,
|
||||
ExportBatchSelectorComponent,
|
||||
ConfirmationModalComponent,
|
||||
VocabularyTreeviewComponent,
|
||||
SidebarSearchListElementComponent,
|
||||
PublicationSidebarSearchListElementComponent,
|
||||
CollectionSidebarSearchListElementComponent,
|
||||
CommunitySidebarSearchListElementComponent,
|
||||
LinkMenuItemComponent,
|
||||
OnClickMenuItemComponent,
|
||||
TextMenuItemComponent,
|
||||
ScopeSelectorModalComponent,
|
||||
ExternalLinkMenuItemComponent
|
||||
ListableNotificationObjectComponent,
|
||||
];
|
||||
|
||||
const SHARED_ITEM_PAGE_COMPONENTS = [
|
||||
@@ -603,7 +525,6 @@ const DIRECTIVES = [
|
||||
DragClickDirective,
|
||||
DebounceDirective,
|
||||
ClickOutsideDirective,
|
||||
AuthorityConfidenceStateDirective,
|
||||
InListValidator,
|
||||
AutoFocusDirective,
|
||||
RoleDirective,
|
||||
@@ -626,6 +547,7 @@ const DIRECTIVES = [
|
||||
declarations: [
|
||||
...PIPES,
|
||||
...COMPONENTS,
|
||||
...ENTRY_COMPONENTS,
|
||||
...DIRECTIVES,
|
||||
...SHARED_ITEM_PAGE_COMPONENTS,
|
||||
ItemVersionsSummaryModalComponent,
|
||||
@@ -638,9 +560,10 @@ const DIRECTIVES = [
|
||||
...MODULES,
|
||||
...PIPES,
|
||||
...COMPONENTS,
|
||||
...ENTRY_COMPONENTS,
|
||||
...SHARED_ITEM_PAGE_COMPONENTS,
|
||||
...DIRECTIVES,
|
||||
TranslateModule
|
||||
TranslateModule,
|
||||
]
|
||||
})
|
||||
|
||||
|
38
src/app/shared/upload/upload.module.ts
Normal file
38
src/app/shared/upload/upload.module.ts
Normal file
@@ -0,0 +1,38 @@
|
||||
/**
|
||||
* The contents of this file are subject to the license and copyright
|
||||
* detailed in the LICENSE and NOTICE files at the root of the source
|
||||
* tree and available online at
|
||||
*
|
||||
* http://www.dspace.org/license/
|
||||
*/
|
||||
import { NgModule } from '@angular/core';
|
||||
import { CommonModule } from '@angular/common';
|
||||
import { SharedModule } from '../shared.module';
|
||||
import { FileUploadModule } from 'ng2-file-upload';
|
||||
import { UploaderComponent } from './uploader/uploader.component';
|
||||
import { FileDropzoneNoUploaderComponent } from './file-dropzone-no-uploader/file-dropzone-no-uploader.component';
|
||||
|
||||
const COMPONENTS = [
|
||||
UploaderComponent,
|
||||
FileDropzoneNoUploaderComponent,
|
||||
];
|
||||
|
||||
@NgModule({
|
||||
imports: [
|
||||
CommonModule,
|
||||
SharedModule,
|
||||
FileUploadModule,
|
||||
],
|
||||
declarations: [
|
||||
...COMPONENTS,
|
||||
],
|
||||
providers: [
|
||||
...COMPONENTS,
|
||||
],
|
||||
exports: [
|
||||
...COMPONENTS,
|
||||
FileUploadModule,
|
||||
]
|
||||
})
|
||||
export class UploadModule {
|
||||
}
|
@@ -1,4 +1,4 @@
|
||||
import { RestRequestMethod } from '../../core/data/rest-request-method';
|
||||
import { RestRequestMethod } from '../../../core/data/rest-request-method';
|
||||
|
||||
export class UploaderOptions {
|
||||
/**
|
@@ -1,4 +1,4 @@
|
||||
import { MetadataMap } from '../../core/shared/metadata.models';
|
||||
import { MetadataMap } from '../../../core/shared/metadata.models';
|
||||
|
||||
/**
|
||||
* Properties to send to the REST API for uploading a bitstream
|
@@ -4,16 +4,16 @@ import { ComponentFixture, inject, TestBed, waitForAsync, } from '@angular/core/
|
||||
|
||||
import { ScrollToService } from '@nicky-lenaers/ngx-scroll-to';
|
||||
|
||||
import { UploaderService } from './uploader.service';
|
||||
import { DragService } from '../../../core/drag.service';
|
||||
import { UploaderOptions } from './uploader-options.model';
|
||||
import { UploaderComponent } from './uploader.component';
|
||||
import { FileUploadModule } from 'ng2-file-upload';
|
||||
import { TranslateModule } from '@ngx-translate/core';
|
||||
import { createTestComponent } from '../testing/utils.test';
|
||||
import { createTestComponent } from '../../testing/utils.test';
|
||||
import { HttpXsrfTokenExtractor } from '@angular/common/http';
|
||||
import { CookieService } from '../../core/services/cookie.service';
|
||||
import { CookieServiceMock } from '../mocks/cookie.service.mock';
|
||||
import { HttpXsrfTokenExtractorMock } from '../mocks/http-xsrf-token-extractor.mock';
|
||||
import { CookieService } from '../../../core/services/cookie.service';
|
||||
import { CookieServiceMock } from '../../mocks/cookie.service.mock';
|
||||
import { HttpXsrfTokenExtractorMock } from '../../mocks/http-xsrf-token-extractor.mock';
|
||||
|
||||
describe('Chips component', () => {
|
||||
|
||||
@@ -37,7 +37,7 @@ describe('Chips component', () => {
|
||||
ChangeDetectorRef,
|
||||
ScrollToService,
|
||||
UploaderComponent,
|
||||
UploaderService,
|
||||
DragService,
|
||||
{ provide: HttpXsrfTokenExtractor, useValue: new HttpXsrfTokenExtractorMock('mock-token') },
|
||||
{ provide: CookieService, useValue: new CookieServiceMock() },
|
||||
],
|
@@ -6,12 +6,12 @@ import uniqueId from 'lodash/uniqueId';
|
||||
import { ScrollToService } from '@nicky-lenaers/ngx-scroll-to';
|
||||
|
||||
import { UploaderOptions } from './uploader-options.model';
|
||||
import { hasValue, isNotEmpty, isUndefined } from '../empty.util';
|
||||
import { UploaderService } from './uploader.service';
|
||||
import { hasValue, isNotEmpty, isUndefined } from '../../empty.util';
|
||||
import { UploaderProperties } from './uploader-properties.model';
|
||||
import { HttpXsrfTokenExtractor } from '@angular/common/http';
|
||||
import { XSRF_COOKIE, XSRF_REQUEST_HEADER, XSRF_RESPONSE_HEADER } from '../../core/xsrf/xsrf.interceptor';
|
||||
import { CookieService } from '../../core/services/cookie.service';
|
||||
import { XSRF_COOKIE, XSRF_REQUEST_HEADER, XSRF_RESPONSE_HEADER } from '../../../core/xsrf/xsrf.interceptor';
|
||||
import { CookieService } from '../../../core/services/cookie.service';
|
||||
import { DragService } from '../../../core/drag.service';
|
||||
|
||||
@Component({
|
||||
selector: 'ds-uploader',
|
||||
@@ -76,7 +76,7 @@ export class UploaderComponent {
|
||||
@HostListener('window:dragover', ['$event'])
|
||||
onDragOver(event: any) {
|
||||
|
||||
if (this.enableDragOverDocument && this.uploaderService.isAllowedDragOverPage()) {
|
||||
if (this.enableDragOverDocument && this.dragService.isAllowedDragOverPage()) {
|
||||
// Show drop area on the page
|
||||
event.preventDefault();
|
||||
if ((event.target as any).tagName !== 'HTML') {
|
||||
@@ -85,9 +85,13 @@ export class UploaderComponent {
|
||||
}
|
||||
}
|
||||
|
||||
constructor(private cdr: ChangeDetectorRef, private scrollToService: ScrollToService,
|
||||
private uploaderService: UploaderService, private tokenExtractor: HttpXsrfTokenExtractor,
|
||||
private cookieService: CookieService) {
|
||||
constructor(
|
||||
private cdr: ChangeDetectorRef,
|
||||
private scrollToService: ScrollToService,
|
||||
private dragService: DragService,
|
||||
private tokenExtractor: HttpXsrfTokenExtractor,
|
||||
private cookieService: CookieService
|
||||
) {
|
||||
}
|
||||
|
||||
/**
|
@@ -10,7 +10,7 @@ import { SubmissionObject } from '../../core/submission/models/submission-object
|
||||
import { WorkspaceitemSectionsObject } from '../../core/submission/models/workspaceitem-sections.model';
|
||||
|
||||
import { hasValue, isNotEmpty } from '../../shared/empty.util';
|
||||
import { UploaderOptions } from '../../shared/uploader/uploader-options.model';
|
||||
import { UploaderOptions } from '../../shared/upload/uploader/uploader-options.model';
|
||||
import { SubmissionObjectEntry } from '../objects/submission-objects.reducer';
|
||||
import { SectionDataObject } from '../sections/models/section-data.model';
|
||||
import { SubmissionService } from '../submission.service';
|
||||
|
@@ -28,7 +28,7 @@ import { SubmissionJsonPatchOperationsServiceStub } from '../../../shared/testin
|
||||
import { SubmissionJsonPatchOperationsService } from '../../../core/submission/submission-json-patch-operations.service';
|
||||
import { SharedModule } from '../../../shared/shared.module';
|
||||
import { createTestComponent } from '../../../shared/testing/utils.test';
|
||||
import { UploaderOptions } from '../../../shared/uploader/uploader-options.model';
|
||||
import { UploaderOptions } from '../../../shared/upload/uploader/uploader-options.model';
|
||||
|
||||
describe('SubmissionUploadFilesComponent Component', () => {
|
||||
|
||||
|
@@ -9,7 +9,7 @@ import { hasValue, isEmpty, isNotEmpty } from '../../../shared/empty.util';
|
||||
import { normalizeSectionData } from '../../../core/submission/submission-response-parsing.service';
|
||||
import { SubmissionService } from '../../submission.service';
|
||||
import { NotificationsService } from '../../../shared/notifications/notifications.service';
|
||||
import { UploaderOptions } from '../../../shared/uploader/uploader-options.model';
|
||||
import { UploaderOptions } from '../../../shared/upload/uploader/uploader-options.model';
|
||||
import parseSectionErrors from '../../utils/parseSectionErrors';
|
||||
import { SubmissionJsonPatchOperationsService } from '../../../core/submission/submission-json-patch-operations.service';
|
||||
import { WorkspaceItem } from '../../../core/submission/models/workspaceitem.model';
|
||||
|
@@ -60,9 +60,11 @@ import { PublisherPolicyComponent } from './sections/sherpa-policies/publisher-p
|
||||
import {
|
||||
PublicationInformationComponent
|
||||
} from './sections/sherpa-policies/publication-information/publication-information.component';
|
||||
import { UploadModule } from '../shared/upload/upload.module';
|
||||
import {
|
||||
MetadataInformationComponent
|
||||
} from './sections/sherpa-policies/metadata-information/metadata-information.component';
|
||||
import { SectionFormOperationsService } from './sections/form/section-form-operations.service';
|
||||
|
||||
const ENTRY_COMPONENTS = [
|
||||
// put only entry components that use custom decorator
|
||||
@@ -114,16 +116,21 @@ const DECLARATIONS = [
|
||||
FormModule,
|
||||
NgbModalModule,
|
||||
NgbCollapseModule,
|
||||
NgbAccordionModule
|
||||
NgbAccordionModule,
|
||||
UploadModule,
|
||||
],
|
||||
declarations: DECLARATIONS,
|
||||
exports: DECLARATIONS,
|
||||
exports: [
|
||||
...DECLARATIONS,
|
||||
FormModule,
|
||||
],
|
||||
providers: [
|
||||
SectionUploadService,
|
||||
SectionsService,
|
||||
SubmissionUploadsConfigDataService,
|
||||
SubmissionAccessesConfigDataService,
|
||||
SectionAccessesService,
|
||||
SectionFormOperationsService,
|
||||
]
|
||||
})
|
||||
|
||||
|
@@ -3,6 +3,7 @@ import { NgModule } from '@angular/core';
|
||||
import { SharedModule } from '../shared/shared.module';
|
||||
import { SubmitPageRoutingModule } from './submit-page-routing.module';
|
||||
import { SubmissionModule } from '../submission/submission.module';
|
||||
import { FormModule } from '../shared/form/form.module';
|
||||
|
||||
@NgModule({
|
||||
imports: [
|
||||
@@ -10,6 +11,7 @@ import { SubmissionModule } from '../submission/submission.module';
|
||||
CommonModule,
|
||||
SharedModule,
|
||||
SubmissionModule,
|
||||
FormModule,
|
||||
],
|
||||
})
|
||||
/**
|
||||
|
@@ -1320,6 +1320,8 @@
|
||||
|
||||
"curation-task.task.vscan.label": "Virus Scan",
|
||||
|
||||
"curation-task.task.registerdoi.label": "Register DOI",
|
||||
|
||||
|
||||
|
||||
"curation.form.task-select.label": "Task:",
|
||||
@@ -1366,6 +1368,8 @@
|
||||
|
||||
"dso-selector.create.community.head": "New community",
|
||||
|
||||
"dso-selector.create.community.or-divider": "or",
|
||||
|
||||
"dso-selector.create.community.sub-level": "Create a new community in",
|
||||
|
||||
"dso-selector.create.community.top-level": "Create a new top-level community",
|
||||
@@ -1400,6 +1404,8 @@
|
||||
|
||||
"dso-selector.set-scope.community.button": "Search all of DSpace",
|
||||
|
||||
"dso-selector.set-scope.community.or-divider": "or",
|
||||
|
||||
"dso-selector.set-scope.community.input-header": "Search for a community or collection",
|
||||
|
||||
"dso-selector.claim.item.head": "Profile tips",
|
||||
@@ -1410,6 +1416,8 @@
|
||||
|
||||
"dso-selector.claim.item.create-from-scratch": "Create a new one",
|
||||
|
||||
"dso-selector.results-could-not-be-retrieved": "Something went wrong, please refresh again ↻",
|
||||
|
||||
"confirmation-modal.export-metadata.header": "Export metadata for {{ dsoName }}",
|
||||
|
||||
"confirmation-modal.export-metadata.info": "Are you sure you want to export metadata for {{ dsoName }}",
|
||||
@@ -4037,6 +4045,8 @@
|
||||
|
||||
"submission.sections.describe.relationship-lookup.search-tab.tab-title.isFundingAgencyOfProject": "Funder of the Project",
|
||||
|
||||
"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.isProjectOfPublication": "Project",
|
||||
@@ -4081,6 +4091,8 @@
|
||||
|
||||
"submission.sections.describe.relationship-lookup.title.isChildOrgUnitOf": "Parent Organizational Unit",
|
||||
|
||||
"submission.sections.describe.relationship-lookup.title.isPublicationOfAuthor": "Publication",
|
||||
|
||||
"submission.sections.describe.relationship-lookup.search-tab.toggle-dropdown": "Toggle dropdown",
|
||||
|
||||
"submission.sections.describe.relationship-lookup.selection-tab.settings": "Settings",
|
||||
@@ -4826,4 +4838,5 @@
|
||||
"person.orcid.registry.auth": "ORCID Authorizations",
|
||||
"home.recent-submissions.head": "Recent Submissions",
|
||||
|
||||
"listable-notification-object.default-message": "This object couldn't be retrieved",
|
||||
}
|
||||
|
5475
src/assets/i18n/uk.json5
Normal file
5475
src/assets/i18n/uk.json5
Normal file
File diff suppressed because it is too large
Load Diff
@@ -204,7 +204,8 @@ export class DefaultAppConfig implements AppConfig {
|
||||
{ code: 'kk', label: 'Қазақ', active: true },
|
||||
{ code: 'bn', label: 'বাংলা', active: true },
|
||||
{ code: 'hi', label: 'हिंदी', active: true},
|
||||
{ code: 'el', label: 'Ελληνικά', active: true }
|
||||
{ code: 'el', label: 'Ελληνικά', active: true },
|
||||
{ code: 'uk', label: 'Yкраї́нська', active: true}
|
||||
];
|
||||
|
||||
// Browse-By Pages
|
||||
@@ -245,7 +246,13 @@ export class DefaultAppConfig implements AppConfig {
|
||||
undoTimeout: 10000 // 10 seconds
|
||||
},
|
||||
// Show the item access status label in items lists
|
||||
showAccessStatuses: false
|
||||
showAccessStatuses: false,
|
||||
bitstream: {
|
||||
// Number of entries in the bitstream list in the item view page.
|
||||
// Rounded to the nearest size in the list of selectable sizes on the
|
||||
// settings menu. See pageSizeOptions in 'pagination-component-options.model.ts'.
|
||||
pageSize: 5
|
||||
}
|
||||
};
|
||||
|
||||
// Collection Page Config
|
||||
|
@@ -6,4 +6,11 @@ export interface ItemConfig extends Config {
|
||||
};
|
||||
// This is used to show the access status label of items in results lists
|
||||
showAccessStatuses: boolean;
|
||||
|
||||
bitstream: {
|
||||
// Number of entries in the bitstream list in the item view page.
|
||||
// Rounded to the nearest size in the list of selectable sizes on the
|
||||
// settings menu. See pageSizeOptions in 'pagination-component-options.model.ts'.
|
||||
pageSize: number;
|
||||
}
|
||||
}
|
||||
|
@@ -229,7 +229,13 @@ export const environment: BuildConfig = {
|
||||
undoTimeout: 10000 // 10 seconds
|
||||
},
|
||||
// Show the item access status label in items lists
|
||||
showAccessStatuses: false
|
||||
showAccessStatuses: false,
|
||||
bitstream: {
|
||||
// Number of entries in the bitstream list in the item view page.
|
||||
// Rounded to the nearest size in the list of selectable sizes on the
|
||||
// settings menu. See pageSizeOptions in 'pagination-component-options.model.ts'.
|
||||
pageSize: 5
|
||||
}
|
||||
},
|
||||
collection: {
|
||||
edit: {
|
||||
|
@@ -9,7 +9,7 @@
|
||||
<h3 class="position-relative py-1 my-3 font-weight-normal">
|
||||
<hr>
|
||||
<div id="create-community-or-separator" class="text-center position-absolute w-100">
|
||||
<span class="px-4 bg-white">or</span>
|
||||
<span class="px-4 bg-white">{{'dso-selector.create.community.or-divider' | translate}}</span>
|
||||
</div>
|
||||
</h3>
|
||||
|
||||
|
Reference in New Issue
Block a user