mirror of
https://github.com/DSpace/dspace-angular.git
synced 2025-10-17 23:13:04 +00:00
Autofix lint issues
This commit is contained in:
@@ -1,96 +1,109 @@
|
||||
import { ChangeDetectorRef, Component, NO_ERRORS_SCHEMA } from '@angular/core';
|
||||
import { BrowserModule } from '@angular/platform-browser';
|
||||
import { CommonModule } from '@angular/common';
|
||||
import { FormsModule, ReactiveFormsModule } from '@angular/forms';
|
||||
import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing';
|
||||
import {
|
||||
ChangeDetectorRef,
|
||||
Component,
|
||||
NO_ERRORS_SCHEMA,
|
||||
} from '@angular/core';
|
||||
import {
|
||||
ComponentFixture,
|
||||
TestBed,
|
||||
waitForAsync,
|
||||
} from '@angular/core/testing';
|
||||
import {
|
||||
FormsModule,
|
||||
ReactiveFormsModule,
|
||||
} from '@angular/forms';
|
||||
import { BrowserModule } from '@angular/platform-browser';
|
||||
import { NoopAnimationsModule } from '@angular/platform-browser/animations';
|
||||
|
||||
import { NgxPaginationModule } from 'ngx-pagination';
|
||||
import { cold } from 'jasmine-marbles';
|
||||
import { of as observableOf } from 'rxjs';
|
||||
import { TranslateModule } from '@ngx-translate/core';
|
||||
import { cold } from 'jasmine-marbles';
|
||||
import { NgxPaginationModule } from 'ngx-pagination';
|
||||
import { of as observableOf } from 'rxjs';
|
||||
|
||||
import { createSuccessfulRemoteDataObject$ } from '../../../shared/remote-data.utils';
|
||||
import { NotificationsService } from '../../../shared/notifications/notifications.service';
|
||||
import { NotificationsServiceStub } from '../../../shared/testing/notifications-service.stub';
|
||||
import { SubmissionService } from '../../submission.service';
|
||||
import { SubmissionServiceStub } from '../../../shared/testing/submission-service.stub';
|
||||
import { SectionsService } from '../sections.service';
|
||||
import { SectionsServiceStub } from '../../../shared/testing/sections-service.stub';
|
||||
import { SubmissionFormsConfigDataService } from '../../../core/config/submission-forms-config-data.service';
|
||||
import { CollectionDataService } from '../../../core/data/collection-data.service';
|
||||
import { JsonPatchOperationPathCombiner } from '../../../core/json-patch/builder/json-patch-operation-path-combiner';
|
||||
import { JsonPatchOperationsBuilder } from '../../../core/json-patch/builder/json-patch-operations-builder';
|
||||
import { PaginationService } from '../../../core/pagination/pagination.service';
|
||||
import { Collection } from '../../../core/shared/collection.model';
|
||||
import { License } from '../../../core/shared/license.model';
|
||||
import { MetadataValue } from '../../../core/shared/metadata.models';
|
||||
import { SubmissionScopeType } from '../../../core/submission/submission-scope-type';
|
||||
import { FormBuilderService } from '../../../shared/form/builder/form-builder.service';
|
||||
import { FormService } from '../../../shared/form/form.service';
|
||||
import { getMockFormOperationsService } from '../../../shared/mocks/form-operations-service.mock';
|
||||
import { getMockFormService } from '../../../shared/mocks/form-service.mock';
|
||||
import { FormService } from '../../../shared/form/form.service';
|
||||
import { SubmissionFormsConfigDataService } from '../../../core/config/submission-forms-config-data.service';
|
||||
import { SectionsType } from '../sections-type';
|
||||
import { mockSubmissionCollectionId, mockSubmissionId } from '../../../shared/mocks/submission.mock';
|
||||
import { JsonPatchOperationPathCombiner } from '../../../core/json-patch/builder/json-patch-operation-path-combiner';
|
||||
import { SubmissionSectionDuplicatesComponent } from './section-duplicates.component';
|
||||
import { CollectionDataService } from '../../../core/data/collection-data.service';
|
||||
import { JsonPatchOperationsBuilder } from '../../../core/json-patch/builder/json-patch-operations-builder';
|
||||
import { SectionFormOperationsService } from '../form/section-form-operations.service';
|
||||
import { SubmissionScopeType } from '../../../core/submission/submission-scope-type';
|
||||
import { License } from '../../../core/shared/license.model';
|
||||
import { Collection } from '../../../core/shared/collection.model';
|
||||
import {
|
||||
mockSubmissionCollectionId,
|
||||
mockSubmissionId,
|
||||
} from '../../../shared/mocks/submission.mock';
|
||||
import { defaultUUID } from '../../../shared/mocks/uuid.service.mock';
|
||||
import { NotificationsService } from '../../../shared/notifications/notifications.service';
|
||||
import { Duplicate } from '../../../shared/object-list/duplicate-data/duplicate.model';
|
||||
import { DUPLICATE } from '../../../shared/object-list/duplicate-data/duplicate.resource-type';
|
||||
import { createSuccessfulRemoteDataObject$ } from '../../../shared/remote-data.utils';
|
||||
import { NotificationsServiceStub } from '../../../shared/testing/notifications-service.stub';
|
||||
import { PaginationServiceStub } from '../../../shared/testing/pagination-service.stub';
|
||||
import { SectionsServiceStub } from '../../../shared/testing/sections-service.stub';
|
||||
import { SubmissionServiceStub } from '../../../shared/testing/submission-service.stub';
|
||||
import { ObjNgFor } from '../../../shared/utils/object-ngfor.pipe';
|
||||
import { VarDirective } from '../../../shared/utils/var.directive';
|
||||
import { PaginationService } from '../../../core/pagination/pagination.service';
|
||||
import { PaginationServiceStub } from '../../../shared/testing/pagination-service.stub';
|
||||
import { Duplicate } from '../../../shared/object-list/duplicate-data/duplicate.model';
|
||||
import { MetadataValue } from '../../../core/shared/metadata.models';
|
||||
import { defaultUUID } from '../../../shared/mocks/uuid.service.mock';
|
||||
import { DUPLICATE } from '../../../shared/object-list/duplicate-data/duplicate.resource-type';
|
||||
import { SubmissionService } from '../../submission.service';
|
||||
import { SectionFormOperationsService } from '../form/section-form-operations.service';
|
||||
import { SectionsService } from '../sections.service';
|
||||
import { SectionsType } from '../sections-type';
|
||||
import { SubmissionSectionDuplicatesComponent } from './section-duplicates.component';
|
||||
|
||||
function getMockSubmissionFormsConfigService(): SubmissionFormsConfigDataService {
|
||||
return jasmine.createSpyObj('FormOperationsService', {
|
||||
getConfigAll: jasmine.createSpy('getConfigAll'),
|
||||
getConfigByHref: jasmine.createSpy('getConfigByHref'),
|
||||
getConfigByName: jasmine.createSpy('getConfigByName'),
|
||||
getConfigBySearch: jasmine.createSpy('getConfigBySearch')
|
||||
getConfigBySearch: jasmine.createSpy('getConfigBySearch'),
|
||||
});
|
||||
}
|
||||
|
||||
function getMockCollectionDataService(): CollectionDataService {
|
||||
return jasmine.createSpyObj('CollectionDataService', {
|
||||
findById: jasmine.createSpy('findById'),
|
||||
findByHref: jasmine.createSpy('findByHref')
|
||||
findByHref: jasmine.createSpy('findByHref'),
|
||||
});
|
||||
}
|
||||
|
||||
const duplicates: Duplicate[] = [{
|
||||
title: 'Unique title',
|
||||
uuid: defaultUUID,
|
||||
workflowItemId: 1,
|
||||
workspaceItemId: 2,
|
||||
owningCollection: 'Test Collection',
|
||||
metadata: {
|
||||
'dc.title': [
|
||||
Object.assign(new MetadataValue(), {
|
||||
title: 'Unique title',
|
||||
uuid: defaultUUID,
|
||||
workflowItemId: 1,
|
||||
workspaceItemId: 2,
|
||||
owningCollection: 'Test Collection',
|
||||
metadata: {
|
||||
'dc.title': [
|
||||
Object.assign(new MetadataValue(), {
|
||||
'value': 'Unique title',
|
||||
'language': null,
|
||||
'authority': null,
|
||||
'confidence': -1,
|
||||
'place': 0
|
||||
})]
|
||||
'place': 0,
|
||||
})],
|
||||
},
|
||||
type: DUPLICATE,
|
||||
_links: {
|
||||
self: {
|
||||
href: 'http://localhost:8080/server/api/core/submission/duplicates/search?uuid=testid',
|
||||
},
|
||||
type: DUPLICATE,
|
||||
_links: {
|
||||
self: {
|
||||
href: 'http://localhost:8080/server/api/core/submission/duplicates/search?uuid=testid'
|
||||
}
|
||||
}
|
||||
}];
|
||||
},
|
||||
}];
|
||||
|
||||
const sectionObject = {
|
||||
header: 'submission.sections.submit.progressbar.duplicates',
|
||||
mandatory: true,
|
||||
opened: true,
|
||||
data: {potentialDuplicates: duplicates},
|
||||
data: { potentialDuplicates: duplicates },
|
||||
errorsToShow: [],
|
||||
serverValidationErrors: [],
|
||||
id: 'duplicates',
|
||||
sectionType: SectionsType.Duplicates,
|
||||
sectionVisibility: null
|
||||
sectionVisibility: null,
|
||||
};
|
||||
|
||||
describe('SubmissionSectionDuplicatesComponent test suite', () => {
|
||||
@@ -120,9 +133,9 @@ describe('SubmissionSectionDuplicatesComponent test suite', () => {
|
||||
{
|
||||
key: 'dc.title',
|
||||
language: 'en_US',
|
||||
value: 'Community 1-Collection 1'
|
||||
value: 'Community 1-Collection 1',
|
||||
}],
|
||||
license: createSuccessfulRemoteDataObject$(Object.assign(new License(), { text: licenseText }))
|
||||
license: createSuccessfulRemoteDataObject$(Object.assign(new License(), { text: licenseText })),
|
||||
});
|
||||
const paginationService = new PaginationServiceStub();
|
||||
|
||||
@@ -157,9 +170,9 @@ describe('SubmissionSectionDuplicatesComponent test suite', () => {
|
||||
{ provide: 'submissionIdProvider', useValue: submissionId },
|
||||
{ provide: PaginationService, useValue: paginationService },
|
||||
ChangeDetectorRef,
|
||||
FormBuilderService
|
||||
FormBuilderService,
|
||||
],
|
||||
schemas: [NO_ERRORS_SCHEMA]
|
||||
schemas: [NO_ERRORS_SCHEMA],
|
||||
}).compileComponents().then();
|
||||
}));
|
||||
|
||||
@@ -213,7 +226,7 @@ describe('SubmissionSectionDuplicatesComponent test suite', () => {
|
||||
sectionsServiceStub.isSectionReadOnly.and.returnValue(observableOf(false));
|
||||
compAsAny.submissionService.getSubmissionScope.and.returnValue(SubmissionScopeType.WorkspaceItem);
|
||||
spyOn(comp, 'getSectionStatus').and.returnValue(observableOf(true));
|
||||
spyOn(comp, 'getDuplicateData').and.returnValue(observableOf({potentialDuplicates: duplicates}));
|
||||
spyOn(comp, 'getDuplicateData').and.returnValue(observableOf({ potentialDuplicates: duplicates }));
|
||||
expect(comp.isLoading).toBeTruthy();
|
||||
comp.onSectionInit();
|
||||
fixture.detectChanges();
|
||||
@@ -225,13 +238,13 @@ describe('SubmissionSectionDuplicatesComponent test suite', () => {
|
||||
it('Should return TRUE if the isLoading is FALSE', () => {
|
||||
compAsAny.isLoading = false;
|
||||
expect(compAsAny.getSectionStatus()).toBeObservable(cold('(a|)', {
|
||||
a: true
|
||||
a: true,
|
||||
}));
|
||||
});
|
||||
it('Should return FALSE', () => {
|
||||
compAsAny.isLoadin = true;
|
||||
expect(compAsAny.getSectionStatus()).toBeObservable(cold('(a|)', {
|
||||
a: false
|
||||
a: false,
|
||||
}));
|
||||
});
|
||||
});
|
||||
@@ -241,7 +254,7 @@ describe('SubmissionSectionDuplicatesComponent test suite', () => {
|
||||
// declare a test component
|
||||
@Component({
|
||||
selector: 'ds-test-cmp',
|
||||
template: ``
|
||||
template: ``,
|
||||
})
|
||||
class TestComponent {
|
||||
|
||||
|
@@ -1,20 +1,26 @@
|
||||
import {ChangeDetectionStrategy, Component, Inject } from '@angular/core';
|
||||
|
||||
import { Observable, of as observableOf, Subscription } from 'rxjs';
|
||||
import { TranslateService } from '@ngx-translate/core';
|
||||
import { SectionsType } from '../sections-type';
|
||||
import { SectionModelComponent } from '../models/section.model';
|
||||
import { renderSectionFor } from '../sections-decorator';
|
||||
import { SectionDataObject } from '../models/section-data.model';
|
||||
import { SubmissionService } from '../../submission.service';
|
||||
import { AlertType } from '../../../shared/alert/alert-type';
|
||||
import { SectionsService } from '../sections.service';
|
||||
import {
|
||||
WorkspaceitemSectionDuplicatesObject
|
||||
} from '../../../core/submission/models/workspaceitem-section-duplicates.model';
|
||||
ChangeDetectionStrategy,
|
||||
Component,
|
||||
Inject,
|
||||
} from '@angular/core';
|
||||
import { TranslateService } from '@ngx-translate/core';
|
||||
import {
|
||||
Observable,
|
||||
of as observableOf,
|
||||
Subscription,
|
||||
} from 'rxjs';
|
||||
|
||||
import { Metadata } from '../../../core/shared/metadata.utils';
|
||||
import { WorkspaceitemSectionDuplicatesObject } from '../../../core/submission/models/workspaceitem-section-duplicates.model';
|
||||
import { URLCombiner } from '../../../core/url-combiner/url-combiner';
|
||||
import { getItemModuleRoute } from '../../../item-page/item-page-routing-paths';
|
||||
import { AlertType } from '../../../shared/alert/alert-type';
|
||||
import { SubmissionService } from '../../submission.service';
|
||||
import { SectionModelComponent } from '../models/section.model';
|
||||
import { SectionDataObject } from '../models/section-data.model';
|
||||
import { SectionsService } from '../sections.service';
|
||||
import { renderSectionFor } from '../sections-decorator';
|
||||
import { SectionsType } from '../sections-type';
|
||||
|
||||
/**
|
||||
* Detect duplicates step
|
||||
@@ -24,7 +30,7 @@ import { getItemModuleRoute } from '../../../item-page/item-page-routing-paths';
|
||||
@Component({
|
||||
selector: 'ds-submission-section-duplicates',
|
||||
templateUrl: './section-duplicates.component.html',
|
||||
changeDetection: ChangeDetectionStrategy.Default
|
||||
changeDetection: ChangeDetectionStrategy.Default,
|
||||
})
|
||||
|
||||
@renderSectionFor(SectionsType.Duplicates)
|
||||
@@ -68,7 +74,7 @@ export class SubmissionSectionDuplicatesComponent extends SectionModelComponent
|
||||
}
|
||||
|
||||
ngOnInit() {
|
||||
super.ngOnInit();
|
||||
super.ngOnInit();
|
||||
}
|
||||
|
||||
/**
|
||||
|
@@ -1,8 +1,29 @@
|
||||
import { ChangeDetectorRef, Component, Inject, ViewChild } from '@angular/core';
|
||||
import { DynamicCheckboxModel, DynamicFormControlEvent, DynamicFormControlModel, DynamicFormLayout } from '@ng-dynamic-forms/core';
|
||||
import {
|
||||
ChangeDetectorRef,
|
||||
Component,
|
||||
Inject,
|
||||
ViewChild,
|
||||
} from '@angular/core';
|
||||
import {
|
||||
DynamicCheckboxModel,
|
||||
DynamicFormControlEvent,
|
||||
DynamicFormControlModel,
|
||||
DynamicFormLayout,
|
||||
} from '@ng-dynamic-forms/core';
|
||||
import { TranslateService } from '@ngx-translate/core';
|
||||
import { Observable, Subscription } from 'rxjs';
|
||||
import { distinctUntilChanged, filter, find, map, mergeMap, startWith, take } from 'rxjs/operators';
|
||||
import {
|
||||
Observable,
|
||||
Subscription,
|
||||
} from 'rxjs';
|
||||
import {
|
||||
distinctUntilChanged,
|
||||
filter,
|
||||
find,
|
||||
map,
|
||||
mergeMap,
|
||||
startWith,
|
||||
take,
|
||||
} from 'rxjs/operators';
|
||||
|
||||
import { CollectionDataService } from '../../../core/data/collection-data.service';
|
||||
import { RemoteData } from '../../../core/data/remote-data';
|
||||
@@ -11,7 +32,12 @@ import { JsonPatchOperationsBuilder } from '../../../core/json-patch/builder/jso
|
||||
import { Collection } from '../../../core/shared/collection.model';
|
||||
import { License } from '../../../core/shared/license.model';
|
||||
import { WorkspaceitemSectionLicenseObject } from '../../../core/submission/models/workspaceitem-section-license.model';
|
||||
import { hasValue, isNotEmpty, isNotNull, isNotUndefined } from '../../../shared/empty.util';
|
||||
import {
|
||||
hasValue,
|
||||
isNotEmpty,
|
||||
isNotNull,
|
||||
isNotUndefined,
|
||||
} from '../../../shared/empty.util';
|
||||
import { FormBuilderService } from '../../../shared/form/builder/form-builder.service';
|
||||
import { FormComponent } from '../../../shared/form/form.component';
|
||||
import { FormService } from '../../../shared/form/form.service';
|
||||
@@ -23,7 +49,10 @@ import { SectionDataObject } from '../models/section-data.model';
|
||||
import { SectionsService } from '../sections.service';
|
||||
import { renderSectionFor } from '../sections-decorator';
|
||||
import { SectionsType } from '../sections-type';
|
||||
import { SECTION_LICENSE_FORM_LAYOUT, SECTION_LICENSE_FORM_MODEL } from './section-license.model';
|
||||
import {
|
||||
SECTION_LICENSE_FORM_LAYOUT,
|
||||
SECTION_LICENSE_FORM_MODEL,
|
||||
} from './section-license.model';
|
||||
|
||||
/**
|
||||
* This component represents a section that contains the submission license form.
|
||||
|
@@ -1,25 +1,29 @@
|
||||
import { CoarNotifyConfigDataService } from './coar-notify-config-data.service';
|
||||
import { testFindAllDataImplementation } from '../../../core/data/base/find-all-data.spec';
|
||||
import { FindAllData } from '../../../core/data/base/find-all-data';
|
||||
import { cold, getTestScheduler } from 'jasmine-marbles';
|
||||
import { ObjectCacheService } from '../../../core/cache/object-cache.service';
|
||||
import { TestScheduler } from 'rxjs/testing';
|
||||
import { RequestService } from '../../../core/data/request.service';
|
||||
import { RemoteDataBuildService } from '../../../core/cache/builders/remote-data-build.service';
|
||||
import { HALEndpointService } from '../../../core/shared/hal-endpoint.service';
|
||||
import { NotificationsService } from '../../../shared/notifications/notifications.service';
|
||||
import { RequestEntry } from '../../../core/data/request-entry.model';
|
||||
import { RemoteData } from '../../../core/data/remote-data';
|
||||
import { RequestEntryState } from '../../../core/data/request-entry-state.model';
|
||||
import { RestResponse } from '../../../core/cache/response.models';
|
||||
import {
|
||||
cold,
|
||||
getTestScheduler,
|
||||
} from 'jasmine-marbles';
|
||||
import { of } from 'rxjs';
|
||||
import { createSuccessfulRemoteDataObject$ } from '../../../shared/remote-data.utils';
|
||||
import { testPatchDataImplementation } from '../../../core/data/base/patch-data.spec';
|
||||
import { testDeleteDataImplementation } from '../../../core/data/base/delete-data.spec';
|
||||
import { DeleteData } from '../../../core/data/base/delete-data';
|
||||
import { PatchData } from '../../../core/data/base/patch-data';
|
||||
import { TestScheduler } from 'rxjs/testing';
|
||||
|
||||
import { RemoteDataBuildService } from '../../../core/cache/builders/remote-data-build.service';
|
||||
import { ObjectCacheService } from '../../../core/cache/object-cache.service';
|
||||
import { RestResponse } from '../../../core/cache/response.models';
|
||||
import { CreateData } from '../../../core/data/base/create-data';
|
||||
import { testCreateDataImplementation } from '../../../core/data/base/create-data.spec';
|
||||
import { DeleteData } from '../../../core/data/base/delete-data';
|
||||
import { testDeleteDataImplementation } from '../../../core/data/base/delete-data.spec';
|
||||
import { FindAllData } from '../../../core/data/base/find-all-data';
|
||||
import { testFindAllDataImplementation } from '../../../core/data/base/find-all-data.spec';
|
||||
import { PatchData } from '../../../core/data/base/patch-data';
|
||||
import { testPatchDataImplementation } from '../../../core/data/base/patch-data.spec';
|
||||
import { RemoteData } from '../../../core/data/remote-data';
|
||||
import { RequestService } from '../../../core/data/request.service';
|
||||
import { RequestEntry } from '../../../core/data/request-entry.model';
|
||||
import { RequestEntryState } from '../../../core/data/request-entry-state.model';
|
||||
import { HALEndpointService } from '../../../core/shared/hal-endpoint.service';
|
||||
import { NotificationsService } from '../../../shared/notifications/notifications.service';
|
||||
import { createSuccessfulRemoteDataObject$ } from '../../../shared/remote-data.utils';
|
||||
import { CoarNotifyConfigDataService } from './coar-notify-config-data.service';
|
||||
|
||||
describe('CoarNotifyConfigDataService test', () => {
|
||||
let scheduler: TestScheduler;
|
||||
@@ -44,7 +48,7 @@ describe('CoarNotifyConfigDataService test', () => {
|
||||
rdbService,
|
||||
objectCache,
|
||||
halService,
|
||||
notificationsService
|
||||
notificationsService,
|
||||
);
|
||||
}
|
||||
|
||||
@@ -66,12 +70,12 @@ describe('CoarNotifyConfigDataService test', () => {
|
||||
});
|
||||
|
||||
halService = jasmine.createSpyObj('halService', {
|
||||
getEndpoint: of(endpointURL)
|
||||
getEndpoint: of(endpointURL),
|
||||
});
|
||||
|
||||
rdbService = jasmine.createSpyObj('rdbService', {
|
||||
buildSingle: createSuccessfulRemoteDataObject$({}, 500),
|
||||
buildList: cold('a', { a: remoteDataMocks.Success })
|
||||
buildList: cold('a', { a: remoteDataMocks.Success }),
|
||||
});
|
||||
|
||||
|
||||
|
@@ -1,31 +1,47 @@
|
||||
import { Injectable } from '@angular/core';
|
||||
import { dataService } from '../../../core/data/base/data-service.decorator';
|
||||
import { IdentifiableDataService } from '../../../core/data/base/identifiable-data.service';
|
||||
import { FindAllData, FindAllDataImpl } from '../../../core/data/base/find-all-data';
|
||||
import { DeleteData, DeleteDataImpl } from '../../../core/data/base/delete-data';
|
||||
import { RequestService } from '../../../core/data/request.service';
|
||||
import { RemoteDataBuildService } from '../../../core/cache/builders/remote-data-build.service';
|
||||
import { ObjectCacheService } from '../../../core/cache/object-cache.service';
|
||||
import { HALEndpointService } from '../../../core/shared/hal-endpoint.service';
|
||||
import { NotificationsService } from '../../../shared/notifications/notifications.service';
|
||||
import { FindListOptions } from '../../../core/data/find-list-options.model';
|
||||
import { FollowLinkConfig } from '../../../shared/utils/follow-link-config.model';
|
||||
import { Operation } from 'fast-json-patch';
|
||||
import { Observable } from 'rxjs';
|
||||
import { RemoteData } from '../../../core/data/remote-data';
|
||||
import {
|
||||
map,
|
||||
take,
|
||||
} from 'rxjs/operators';
|
||||
|
||||
import { RemoteDataBuildService } from '../../../core/cache/builders/remote-data-build.service';
|
||||
import { RequestParam } from '../../../core/cache/models/request-param.model';
|
||||
import { ObjectCacheService } from '../../../core/cache/object-cache.service';
|
||||
import {
|
||||
CreateData,
|
||||
CreateDataImpl,
|
||||
} from '../../../core/data/base/create-data';
|
||||
import { dataService } from '../../../core/data/base/data-service.decorator';
|
||||
import {
|
||||
DeleteData,
|
||||
DeleteDataImpl,
|
||||
} from '../../../core/data/base/delete-data';
|
||||
import {
|
||||
FindAllData,
|
||||
FindAllDataImpl,
|
||||
} from '../../../core/data/base/find-all-data';
|
||||
import { IdentifiableDataService } from '../../../core/data/base/identifiable-data.service';
|
||||
import {
|
||||
PatchData,
|
||||
PatchDataImpl,
|
||||
} from '../../../core/data/base/patch-data';
|
||||
import { ChangeAnalyzer } from '../../../core/data/change-analyzer';
|
||||
import { FindListOptions } from '../../../core/data/find-list-options.model';
|
||||
import { PaginatedList } from '../../../core/data/paginated-list.model';
|
||||
import { NoContent } from '../../../core/shared/NoContent.model';
|
||||
import { map, take } from 'rxjs/operators';
|
||||
import { URLCombiner } from '../../../core/url-combiner/url-combiner';
|
||||
import { RemoteData } from '../../../core/data/remote-data';
|
||||
import { MultipartPostRequest } from '../../../core/data/request.models';
|
||||
import { RequestService } from '../../../core/data/request.service';
|
||||
import { RestRequest } from '../../../core/data/rest-request.model';
|
||||
import { RestRequestMethod } from '../../../core/data/rest-request-method';
|
||||
import { HALEndpointService } from '../../../core/shared/hal-endpoint.service';
|
||||
import { NoContent } from '../../../core/shared/NoContent.model';
|
||||
import { URLCombiner } from '../../../core/url-combiner/url-combiner';
|
||||
import { NotificationsService } from '../../../shared/notifications/notifications.service';
|
||||
import { FollowLinkConfig } from '../../../shared/utils/follow-link-config.model';
|
||||
import { SUBMISSION_COAR_NOTIFY_CONFIG } from './section-coar-notify-service.resource-type';
|
||||
import { SubmissionCoarNotifyConfig } from './submission-coar-notify.config';
|
||||
import { CreateData, CreateDataImpl } from '../../../core/data/base/create-data';
|
||||
import { PatchData, PatchDataImpl } from '../../../core/data/base/patch-data';
|
||||
import { ChangeAnalyzer } from '../../../core/data/change-analyzer';
|
||||
import { Operation } from 'fast-json-patch';
|
||||
import { RestRequestMethod } from '../../../core/data/rest-request-method';
|
||||
import { RequestParam } from '../../../core/cache/models/request-param.model';
|
||||
|
||||
|
||||
/**
|
||||
@@ -97,7 +113,7 @@ export class CoarNotifyConfigDataService extends IdentifiableDataService<Submiss
|
||||
map((endpoint: string) => {
|
||||
const body = this.getInvocationFormData(files);
|
||||
return new MultipartPostRequest(requestId, endpoint, body);
|
||||
})
|
||||
}),
|
||||
).subscribe((request: RestRequest) => this.requestService.send(request));
|
||||
|
||||
return this.rdbService.buildFromRequestUUID<SubmissionCoarNotifyConfig>(requestId);
|
||||
|
@@ -1,19 +1,25 @@
|
||||
import { ComponentFixture, TestBed } from '@angular/core/testing';
|
||||
|
||||
import { SubmissionSectionCoarNotifyComponent } from './section-coar-notify.component';
|
||||
import { LdnServicesService } from '../../../admin/admin-ldn-services/ldn-services-data/ldn-services-data.service';
|
||||
import { NgbDropdown } from '@ng-bootstrap/ng-bootstrap';
|
||||
import { JsonPatchOperationsBuilder } from '../../../core/json-patch/builder/json-patch-operations-builder';
|
||||
import { SectionsService } from '../sections.service';
|
||||
import { CoarNotifyConfigDataService } from './coar-notify-config-data.service';
|
||||
import { ChangeDetectorRef } from '@angular/core';
|
||||
import { SubmissionCoarNotifyConfig } from './submission-coar-notify.config';
|
||||
import {
|
||||
ComponentFixture,
|
||||
TestBed,
|
||||
} from '@angular/core/testing';
|
||||
import { NgbDropdown } from '@ng-bootstrap/ng-bootstrap';
|
||||
import { TranslateModule } from '@ngx-translate/core';
|
||||
import { of } from 'rxjs';
|
||||
|
||||
import { LdnServicesService } from '../../../admin/admin-ldn-services/ldn-services-data/ldn-services-data.service';
|
||||
import { NotifyServicePattern } from '../../../admin/admin-ldn-services/ldn-services-model/ldn-service-patterns.model';
|
||||
import {
|
||||
LdnService,
|
||||
LdnServiceByPattern,
|
||||
} from '../../../admin/admin-ldn-services/ldn-services-model/ldn-services.model';
|
||||
import { JsonPatchOperationsBuilder } from '../../../core/json-patch/builder/json-patch-operations-builder';
|
||||
import { createSuccessfulRemoteDataObject$ } from '../../../shared/remote-data.utils';
|
||||
import { createPaginatedList } from '../../../shared/testing/utils.test';
|
||||
import { of } from 'rxjs';
|
||||
import { LdnService, LdnServiceByPattern } from '../../../admin/admin-ldn-services/ldn-services-model/ldn-services.model';
|
||||
import { NotifyServicePattern } from '../../../admin/admin-ldn-services/ldn-services-model/ldn-service-patterns.model';
|
||||
import { TranslateModule } from '@ngx-translate/core';
|
||||
import { SectionsService } from '../sections.service';
|
||||
import { CoarNotifyConfigDataService } from './coar-notify-config-data.service';
|
||||
import { SubmissionSectionCoarNotifyComponent } from './section-coar-notify.component';
|
||||
import { SubmissionCoarNotifyConfig } from './submission-coar-notify.config';
|
||||
|
||||
describe('SubmissionSectionCoarNotifyComponent', () => {
|
||||
let component: SubmissionSectionCoarNotifyComponent;
|
||||
@@ -30,8 +36,8 @@ describe('SubmissionSectionCoarNotifyComponent', () => {
|
||||
const patterns: SubmissionCoarNotifyConfig[] = Object.assign(
|
||||
[new SubmissionCoarNotifyConfig()],
|
||||
{
|
||||
patterns: [{pattern: 'review', multipleRequest: false}, {pattern: 'endorsment', multipleRequest: false}],
|
||||
}
|
||||
patterns: [{ pattern: 'review', multipleRequest: false }, { pattern: 'endorsment', multipleRequest: false }],
|
||||
},
|
||||
);
|
||||
const patternsPL = createPaginatedList(patterns);
|
||||
const coarNotifyConfig = createSuccessfulRemoteDataObject$(patternsPL);
|
||||
@@ -42,7 +48,7 @@ describe('SubmissionSectionCoarNotifyComponent', () => {
|
||||
]);
|
||||
coarNotifyConfigDataService = jasmine.createSpyObj(
|
||||
'CoarNotifyConfigDataService',
|
||||
['findAll']
|
||||
['findAll'],
|
||||
);
|
||||
operationsBuilder = jasmine.createSpyObj('JsonPatchOperationsBuilder', [
|
||||
'remove',
|
||||
@@ -64,12 +70,12 @@ describe('SubmissionSectionCoarNotifyComponent', () => {
|
||||
declarations: [SubmissionSectionCoarNotifyComponent],
|
||||
providers: [
|
||||
{ provide: LdnServicesService, useValue: ldnServicesService },
|
||||
{ provide: CoarNotifyConfigDataService, useValue: coarNotifyConfigDataService},
|
||||
{ provide: CoarNotifyConfigDataService, useValue: coarNotifyConfigDataService },
|
||||
{ provide: JsonPatchOperationsBuilder, useValue: operationsBuilder },
|
||||
{ provide: SectionsService, useValue: sectionService },
|
||||
{ provide: ChangeDetectorRef, useValue: cdRefStub },
|
||||
{ provide: 'collectionIdProvider', useValue: 'collectionId' },
|
||||
{ provide: 'sectionDataProvider', useValue: { id: 'sectionId', data: {} }},
|
||||
{ provide: 'sectionDataProvider', useValue: { id: 'sectionId', data: {} } },
|
||||
{ provide: 'submissionIdProvider', useValue: 'submissionId' },
|
||||
NgbDropdown,
|
||||
],
|
||||
@@ -86,8 +92,8 @@ describe('SubmissionSectionCoarNotifyComponent', () => {
|
||||
Object.assign([], {
|
||||
path: 'sections/sectionId/data/notifyCoar',
|
||||
message: 'error',
|
||||
})
|
||||
)
|
||||
}),
|
||||
),
|
||||
);
|
||||
fixture.detectChanges();
|
||||
});
|
||||
@@ -109,7 +115,7 @@ describe('SubmissionSectionCoarNotifyComponent', () => {
|
||||
});
|
||||
|
||||
describe('onChange', () => {
|
||||
const ldnPattern = {pattern: 'review', multipleRequest: false};
|
||||
const ldnPattern = { pattern: 'review', multipleRequest: false };
|
||||
const index = 0;
|
||||
const selectedService: LdnService = Object.assign(new LdnService(), {
|
||||
id: 1,
|
||||
@@ -125,7 +131,7 @@ describe('SubmissionSectionCoarNotifyComponent', () => {
|
||||
beforeEach(() => {
|
||||
component.ldnServiceByPattern[ldnPattern.pattern] = {
|
||||
allowsMultipleRequests: false,
|
||||
services: []
|
||||
services: [],
|
||||
} as LdnServiceByPattern;
|
||||
|
||||
component.patterns = [];
|
||||
@@ -146,7 +152,7 @@ describe('SubmissionSectionCoarNotifyComponent', () => {
|
||||
component.onChange(ldnPattern.pattern, index, null);
|
||||
|
||||
expect(componentAsAny.operationsBuilder.flushOperation).toHaveBeenCalledWith(
|
||||
componentAsAny.pathCombiner.getPath([ldnPattern.pattern, '-'])
|
||||
componentAsAny.pathCombiner.getPath([ldnPattern.pattern, '-']),
|
||||
);
|
||||
expect(component.ldnServiceByPattern[ldnPattern.pattern].services[index]).toBeNull();
|
||||
expect(component.previousServices[ldnPattern.pattern].services[index]).toBeNull();
|
||||
@@ -166,7 +172,7 @@ describe('SubmissionSectionCoarNotifyComponent', () => {
|
||||
component.ldnServiceByPattern[ldnPattern.pattern].services[index] = previousService;
|
||||
component.previousServices[ldnPattern.pattern] = {
|
||||
allowsMultipleRequests: false,
|
||||
services: [previousService]
|
||||
services: [previousService],
|
||||
} as LdnServiceByPattern;
|
||||
|
||||
component.onChange(ldnPattern.pattern, index, selectedService);
|
||||
@@ -175,13 +181,13 @@ describe('SubmissionSectionCoarNotifyComponent', () => {
|
||||
componentAsAny.pathCombiner.getPath([ldnPattern.pattern, '-']),
|
||||
[selectedService.id],
|
||||
false,
|
||||
true
|
||||
true,
|
||||
);
|
||||
expect(component.ldnServiceByPattern[ldnPattern.pattern].services[index]).toEqual(
|
||||
selectedService
|
||||
selectedService,
|
||||
);
|
||||
expect(component.previousServices[ldnPattern.pattern].services[index].id).toEqual(
|
||||
selectedService.id
|
||||
selectedService.id,
|
||||
);
|
||||
});
|
||||
|
||||
@@ -192,20 +198,20 @@ describe('SubmissionSectionCoarNotifyComponent', () => {
|
||||
componentAsAny.pathCombiner.getPath([ldnPattern.pattern, '-']),
|
||||
[selectedService.id],
|
||||
false,
|
||||
true
|
||||
true,
|
||||
);
|
||||
expect(component.ldnServiceByPattern[ldnPattern.pattern].services[index]).toEqual(
|
||||
selectedService
|
||||
selectedService,
|
||||
);
|
||||
expect(component.previousServices[ldnPattern.pattern].services[index].id).toEqual(
|
||||
selectedService.id
|
||||
selectedService.id,
|
||||
);
|
||||
});
|
||||
});
|
||||
|
||||
describe('initSelectedServicesByPattern', () => {
|
||||
const pattern1 = {pattern: 'review', multipleRequest: false};
|
||||
const pattern2 = {pattern: 'endorsement', multipleRequest: false};
|
||||
const pattern1 = { pattern: 'review', multipleRequest: false };
|
||||
const pattern2 = { pattern: 'endorsement', multipleRequest: false };
|
||||
const service1: LdnService = Object.assign(new LdnService(), {
|
||||
id: 1,
|
||||
uuid: 1,
|
||||
@@ -244,16 +250,16 @@ describe('SubmissionSectionCoarNotifyComponent', () => {
|
||||
|
||||
beforeEach(() => {
|
||||
ldnServicesService.findByInboundPattern.and.returnValue(
|
||||
createSuccessfulRemoteDataObject$(createPaginatedList(services))
|
||||
createSuccessfulRemoteDataObject$(createPaginatedList(services)),
|
||||
);
|
||||
component.ldnServiceByPattern[pattern1.pattern] = {
|
||||
allowsMultipleRequests: false,
|
||||
services: []
|
||||
services: [],
|
||||
} as LdnServiceByPattern;
|
||||
|
||||
component.ldnServiceByPattern[pattern2.pattern] = {
|
||||
allowsMultipleRequests: false,
|
||||
services: []
|
||||
services: [],
|
||||
} as LdnServiceByPattern;
|
||||
|
||||
component.patterns = [pattern1, pattern2];
|
||||
@@ -287,7 +293,7 @@ describe('SubmissionSectionCoarNotifyComponent', () => {
|
||||
});
|
||||
|
||||
describe('addService', () => {
|
||||
const ldnPattern = {pattern: 'review', multipleRequest: false};
|
||||
const ldnPattern = { pattern: 'review', multipleRequest: false };
|
||||
const service: any = {
|
||||
id: 1,
|
||||
name: 'service1',
|
||||
@@ -297,7 +303,7 @@ describe('SubmissionSectionCoarNotifyComponent', () => {
|
||||
beforeEach(() => {
|
||||
component.ldnServiceByPattern[ldnPattern.pattern] = {
|
||||
allowsMultipleRequests: false,
|
||||
services: []
|
||||
services: [],
|
||||
} as LdnServiceByPattern;
|
||||
});
|
||||
|
||||
@@ -309,7 +315,7 @@ describe('SubmissionSectionCoarNotifyComponent', () => {
|
||||
});
|
||||
|
||||
describe('removeService', () => {
|
||||
const ldnPattern = {pattern: 'review', multipleRequest: false};
|
||||
const ldnPattern = { pattern: 'review', multipleRequest: false };
|
||||
const service1: LdnService = Object.assign(new LdnService(), {
|
||||
id: 1,
|
||||
name: 'service1',
|
||||
@@ -341,7 +347,7 @@ describe('SubmissionSectionCoarNotifyComponent', () => {
|
||||
beforeEach(() => {
|
||||
component.ldnServiceByPattern[ldnPattern.pattern] = {
|
||||
allowsMultipleRequests: false,
|
||||
services: []
|
||||
services: [],
|
||||
} as LdnServiceByPattern;
|
||||
});
|
||||
|
||||
@@ -378,7 +384,7 @@ describe('SubmissionSectionCoarNotifyComponent', () => {
|
||||
|
||||
beforeEach(() => {
|
||||
ldnServicesService.findByInboundPattern.and.returnValue(
|
||||
createSuccessfulRemoteDataObject$(createPaginatedList(services))
|
||||
createSuccessfulRemoteDataObject$(createPaginatedList(services)),
|
||||
);
|
||||
});
|
||||
|
||||
@@ -412,7 +418,7 @@ describe('SubmissionSectionCoarNotifyComponent', () => {
|
||||
{ path: 'sections/sectionId/data/notifyCoar', message: 'error' },
|
||||
];
|
||||
sectionService.getSectionServerErrors.and.returnValue(
|
||||
of(validationErrors)
|
||||
of(validationErrors),
|
||||
);
|
||||
|
||||
componentAsAny.getSectionServerErrorsAndSetErrorsToDisplay();
|
||||
@@ -420,7 +426,7 @@ describe('SubmissionSectionCoarNotifyComponent', () => {
|
||||
expect(sectionService.setSectionError).toHaveBeenCalledWith(
|
||||
component.submissionId,
|
||||
component.sectionData.id,
|
||||
validationErrors[0]
|
||||
validationErrors[0],
|
||||
);
|
||||
});
|
||||
});
|
||||
|
@@ -1,22 +1,44 @@
|
||||
import { ChangeDetectorRef, Component, Inject } from '@angular/core';
|
||||
import { Observable, Subscription } from 'rxjs';
|
||||
import { SectionModelComponent } from '../models/section.model';
|
||||
import { renderSectionFor } from '../sections-decorator';
|
||||
import { SectionsType } from '../sections-type';
|
||||
import {
|
||||
ChangeDetectorRef,
|
||||
Component,
|
||||
Inject,
|
||||
} from '@angular/core';
|
||||
import { NgbDropdown } from '@ng-bootstrap/ng-bootstrap';
|
||||
import {
|
||||
Observable,
|
||||
Subscription,
|
||||
} from 'rxjs';
|
||||
import {
|
||||
filter,
|
||||
map,
|
||||
take,
|
||||
tap,
|
||||
} from 'rxjs/operators';
|
||||
|
||||
import { LdnServicesService } from '../../../admin/admin-ldn-services/ldn-services-data/ldn-services-data.service';
|
||||
import {
|
||||
LdnService,
|
||||
LdnServiceByPattern,
|
||||
} from '../../../admin/admin-ldn-services/ldn-services-model/ldn-services.model';
|
||||
import { JsonPatchOperationPathCombiner } from '../../../core/json-patch/builder/json-patch-operation-path-combiner';
|
||||
import { JsonPatchOperationsBuilder } from '../../../core/json-patch/builder/json-patch-operations-builder';
|
||||
import { SectionsService } from '../sections.service';
|
||||
import { SectionDataObject } from '../models/section-data.model';
|
||||
|
||||
import { hasValue, isEmpty, isNotEmpty } from '../../../shared/empty.util';
|
||||
|
||||
import { getFirstCompletedRemoteData, getPaginatedListPayload, getRemoteDataPayload } from '../../../core/shared/operators';
|
||||
import { LdnServicesService } from '../../../admin/admin-ldn-services/ldn-services-data/ldn-services-data.service';
|
||||
import { LdnService, LdnServiceByPattern } from '../../../admin/admin-ldn-services/ldn-services-model/ldn-services.model';
|
||||
import { CoarNotifyConfigDataService } from './coar-notify-config-data.service';
|
||||
import { filter, map, take, tap } from 'rxjs/operators';
|
||||
import { NgbDropdown } from '@ng-bootstrap/ng-bootstrap';
|
||||
import {
|
||||
getFirstCompletedRemoteData,
|
||||
getPaginatedListPayload,
|
||||
getRemoteDataPayload,
|
||||
} from '../../../core/shared/operators';
|
||||
import {
|
||||
hasValue,
|
||||
isEmpty,
|
||||
isNotEmpty,
|
||||
} from '../../../shared/empty.util';
|
||||
import { SubmissionSectionError } from '../../objects/submission-section-error.model';
|
||||
import { SectionModelComponent } from '../models/section.model';
|
||||
import { SectionDataObject } from '../models/section-data.model';
|
||||
import { SectionsService } from '../sections.service';
|
||||
import { renderSectionFor } from '../sections-decorator';
|
||||
import { SectionsType } from '../sections-type';
|
||||
import { CoarNotifyConfigDataService } from './coar-notify-config-data.service';
|
||||
import { LdnPattern } from './submission-coar-notify.config';
|
||||
|
||||
/**
|
||||
@@ -26,7 +48,7 @@ import { LdnPattern } from './submission-coar-notify.config';
|
||||
selector: 'ds-submission-section-coar-notify',
|
||||
templateUrl: './section-coar-notify.component.html',
|
||||
styleUrls: ['./section-coar-notify.component.scss'],
|
||||
providers: [NgbDropdown]
|
||||
providers: [NgbDropdown],
|
||||
})
|
||||
@renderSectionFor(SectionsType.CoarNotify)
|
||||
export class SubmissionSectionCoarNotifyComponent extends SectionModelComponent {
|
||||
@@ -100,7 +122,7 @@ export class SubmissionSectionCoarNotifyComponent extends SectionModelComponent
|
||||
setCoarNotifyConfig() {
|
||||
this.subs.push(
|
||||
this.coarNotifyConfigDataService.findAll().pipe(
|
||||
getFirstCompletedRemoteData()
|
||||
getFirstCompletedRemoteData(),
|
||||
).subscribe((data) => {
|
||||
if (data.hasSucceeded) {
|
||||
this.patterns = data.payload.page[0].patterns;
|
||||
@@ -125,7 +147,7 @@ export class SubmissionSectionCoarNotifyComponent extends SectionModelComponent
|
||||
if (!this.previousServices[pattern]) {
|
||||
this.previousServices[pattern] = {
|
||||
services: [],
|
||||
allowsMultipleRequests: this.patterns.find(ldnPattern => ldnPattern.pattern === pattern)?.multipleRequest
|
||||
allowsMultipleRequests: this.patterns.find(ldnPattern => ldnPattern.pattern === pattern)?.multipleRequest,
|
||||
};
|
||||
}
|
||||
|
||||
@@ -170,7 +192,7 @@ export class SubmissionSectionCoarNotifyComponent extends SectionModelComponent
|
||||
if (!this.ldnServiceByPattern[ldnPattern.pattern]) {
|
||||
this.ldnServiceByPattern[ldnPattern.pattern] = {
|
||||
services: [],
|
||||
allowsMultipleRequests: ldnPattern.multipleRequest
|
||||
allowsMultipleRequests: ldnPattern.multipleRequest,
|
||||
};
|
||||
}
|
||||
|
||||
@@ -179,12 +201,12 @@ export class SubmissionSectionCoarNotifyComponent extends SectionModelComponent
|
||||
this.addService(ldnPattern, selection);
|
||||
return this.sectionData.data[ldnPattern.pattern].includes(service.uuid);
|
||||
});
|
||||
})
|
||||
}),
|
||||
);
|
||||
} else {
|
||||
this.ldnServiceByPattern[ldnPattern.pattern] = {
|
||||
services: [],
|
||||
allowsMultipleRequests: ldnPattern.multipleRequest
|
||||
allowsMultipleRequests: ldnPattern.multipleRequest,
|
||||
};
|
||||
this.addService(ldnPattern, null);
|
||||
}
|
||||
@@ -202,7 +224,7 @@ export class SubmissionSectionCoarNotifyComponent extends SectionModelComponent
|
||||
if (!this.ldnServiceByPattern[ldnPattern.pattern]) {
|
||||
this.ldnServiceByPattern[ldnPattern.pattern] = {
|
||||
services: [],
|
||||
allowsMultipleRequests: ldnPattern.multipleRequest
|
||||
allowsMultipleRequests: ldnPattern.multipleRequest,
|
||||
};
|
||||
}
|
||||
this.ldnServiceByPattern[ldnPattern.pattern].services.push(newService);
|
||||
@@ -250,11 +272,11 @@ export class SubmissionSectionCoarNotifyComponent extends SectionModelComponent
|
||||
}
|
||||
}),
|
||||
map((res: LdnService[]) => res.filter((service) => {
|
||||
if (!this.hasSectionData){
|
||||
this.hasSectionData = this.hasInboundPattern(service, pattern);
|
||||
}
|
||||
return this.hasInboundPattern(service, pattern);
|
||||
}))
|
||||
if (!this.hasSectionData){
|
||||
this.hasSectionData = this.hasInboundPattern(service, pattern);
|
||||
}
|
||||
return this.hasInboundPattern(service, pattern);
|
||||
})),
|
||||
);
|
||||
}
|
||||
|
||||
@@ -304,7 +326,7 @@ export class SubmissionSectionCoarNotifyComponent extends SectionModelComponent
|
||||
const path = `${pattern}/${index}`;
|
||||
return error.path.includes(path);
|
||||
});
|
||||
})
|
||||
}),
|
||||
);
|
||||
}
|
||||
|
||||
@@ -313,7 +335,7 @@ export class SubmissionSectionCoarNotifyComponent extends SectionModelComponent
|
||||
*/
|
||||
protected getSectionStatus(): Observable<boolean> {
|
||||
return this.sectionService.getSectionServerErrors(this.submissionId, this.sectionData.id).pipe(
|
||||
map((validationErrors) => isEmpty(validationErrors)
|
||||
map((validationErrors) => isEmpty(validationErrors),
|
||||
));
|
||||
}
|
||||
|
||||
|
@@ -1,8 +1,13 @@
|
||||
import { CacheableObject } from '../../../core/cache/cacheable-object.model';
|
||||
import { autoserialize, deserialize, deserializeAs, inheritSerialization } from 'cerialize';
|
||||
import {
|
||||
autoserialize,
|
||||
deserialize,
|
||||
deserializeAs,
|
||||
inheritSerialization,
|
||||
} from 'cerialize';
|
||||
|
||||
import { excludeFromEquals } from '../../../core/utilities/equals.decorators';
|
||||
import { typedObject } from '../../../core/cache/builders/build-decorators';
|
||||
import { CacheableObject } from '../../../core/cache/cacheable-object.model';
|
||||
import { excludeFromEquals } from '../../../core/utilities/equals.decorators';
|
||||
import { COAR_NOTIFY_WORKSPACEITEM } from './section-coar-notify-service.resource-type';
|
||||
|
||||
/** An CoarNotify and its properties. */
|
||||
@@ -13,16 +18,16 @@ export class SubmissionCoarNotifyWorkspaceitemModel extends CacheableObject {
|
||||
|
||||
@excludeFromEquals
|
||||
@autoserialize
|
||||
endorsement?: number[];
|
||||
endorsement?: number[];
|
||||
|
||||
@deserializeAs('id')
|
||||
review?: number[];
|
||||
review?: number[];
|
||||
|
||||
@autoserialize
|
||||
ingest?: number[];
|
||||
ingest?: number[];
|
||||
|
||||
@deserialize
|
||||
_links: {
|
||||
_links: {
|
||||
self: {
|
||||
href: string;
|
||||
};
|
||||
|
@@ -1,9 +1,14 @@
|
||||
import { ResourceType } from '../../../core/shared/resource-type';
|
||||
import { CacheableObject } from '../../../core/cache/cacheable-object.model';
|
||||
import { autoserialize, deserialize, deserializeAs, inheritSerialization } from 'cerialize';
|
||||
import {
|
||||
autoserialize,
|
||||
deserialize,
|
||||
deserializeAs,
|
||||
inheritSerialization,
|
||||
} from 'cerialize';
|
||||
|
||||
import { excludeFromEquals } from '../../../core/utilities/equals.decorators';
|
||||
import { typedObject } from '../../../core/cache/builders/build-decorators';
|
||||
import { CacheableObject } from '../../../core/cache/cacheable-object.model';
|
||||
import { ResourceType } from '../../../core/shared/resource-type';
|
||||
import { excludeFromEquals } from '../../../core/utilities/equals.decorators';
|
||||
import { SUBMISSION_COAR_NOTIFY_CONFIG } from './section-coar-notify-service.resource-type';
|
||||
|
||||
export interface LdnPattern {
|
||||
@@ -18,19 +23,19 @@ export class SubmissionCoarNotifyConfig extends CacheableObject {
|
||||
|
||||
@excludeFromEquals
|
||||
@autoserialize
|
||||
type: ResourceType;
|
||||
type: ResourceType;
|
||||
|
||||
@autoserialize
|
||||
id: string;
|
||||
id: string;
|
||||
|
||||
@deserializeAs('id')
|
||||
uuid: string;
|
||||
uuid: string;
|
||||
|
||||
@autoserialize
|
||||
patterns: LdnPattern[];
|
||||
patterns: LdnPattern[];
|
||||
|
||||
@deserialize
|
||||
_links: {
|
||||
_links: {
|
||||
self: {
|
||||
href: string;
|
||||
};
|
||||
|
@@ -1,10 +1,32 @@
|
||||
import { CommonModule } from '@angular/common';
|
||||
import { ChangeDetectorRef, Component, NO_ERRORS_SCHEMA } from '@angular/core';
|
||||
import { ComponentFixture, fakeAsync, inject, TestBed, tick, waitForAsync } from '@angular/core/testing';
|
||||
import { FormsModule, ReactiveFormsModule } from '@angular/forms';
|
||||
import {
|
||||
ChangeDetectorRef,
|
||||
Component,
|
||||
NO_ERRORS_SCHEMA,
|
||||
} from '@angular/core';
|
||||
import {
|
||||
ComponentFixture,
|
||||
fakeAsync,
|
||||
inject,
|
||||
TestBed,
|
||||
tick,
|
||||
waitForAsync,
|
||||
} from '@angular/core/testing';
|
||||
import {
|
||||
FormsModule,
|
||||
ReactiveFormsModule,
|
||||
} from '@angular/forms';
|
||||
import { BrowserModule } from '@angular/platform-browser';
|
||||
import { NgbActiveModal, NgbModal } from '@ng-bootstrap/ng-bootstrap';
|
||||
import { DynamicFormArrayModel, DynamicFormControlEvent, DynamicFormGroupModel, DynamicSelectModel } from '@ng-dynamic-forms/core';
|
||||
import {
|
||||
NgbActiveModal,
|
||||
NgbModal,
|
||||
} from '@ng-bootstrap/ng-bootstrap';
|
||||
import {
|
||||
DynamicFormArrayModel,
|
||||
DynamicFormControlEvent,
|
||||
DynamicFormGroupModel,
|
||||
DynamicSelectModel,
|
||||
} from '@ng-dynamic-forms/core';
|
||||
import { TranslateModule } from '@ngx-translate/core';
|
||||
import { of } from 'rxjs';
|
||||
|
||||
@@ -12,20 +34,28 @@ import { JsonPatchOperationPathCombiner } from '../../../../../core/json-patch/b
|
||||
import { JsonPatchOperationsBuilder } from '../../../../../core/json-patch/builder/json-patch-operations-builder';
|
||||
import { SubmissionJsonPatchOperationsService } from '../../../../../core/submission/submission-json-patch-operations.service';
|
||||
import { dateToISOFormat } from '../../../../../shared/date.util';
|
||||
import { DynamicCustomSwitchModel } from '../../../../../shared/form/builder/ds-dynamic-form-ui/models/custom-switch/custom-switch.model';
|
||||
import { FormBuilderService } from '../../../../../shared/form/builder/form-builder.service';
|
||||
import { FormFieldMetadataValueObject } from '../../../../../shared/form/builder/models/form-field-metadata-value.model';
|
||||
import { FormComponent } from '../../../../../shared/form/form.component';
|
||||
import { FormService } from '../../../../../shared/form/form.service';
|
||||
import { getMockFormService } from '../../../../../shared/mocks/form-service.mock';
|
||||
import { getMockSectionUploadService } from '../../../../../shared/mocks/section-upload.service.mock';
|
||||
import { mockFileFormData, mockSubmissionCollectionId, mockSubmissionId, mockSubmissionObject, mockUploadConfigResponse, mockUploadConfigResponseMetadata, mockUploadFiles } from '../../../../../shared/mocks/submission.mock';
|
||||
import {
|
||||
mockFileFormData,
|
||||
mockSubmissionCollectionId,
|
||||
mockSubmissionId,
|
||||
mockSubmissionObject,
|
||||
mockUploadConfigResponse,
|
||||
mockUploadConfigResponseMetadata,
|
||||
mockUploadFiles,
|
||||
} from '../../../../../shared/mocks/submission.mock';
|
||||
import { SubmissionJsonPatchOperationsServiceStub } from '../../../../../shared/testing/submission-json-patch-operations-service.stub';
|
||||
import { SubmissionServiceStub } from '../../../../../shared/testing/submission-service.stub';
|
||||
import { createTestComponent } from '../../../../../shared/testing/utils.test';
|
||||
import { SubmissionService } from '../../../../submission.service';
|
||||
import { POLICY_DEFAULT_WITH_LIST } from '../../section-upload.component';
|
||||
import { SectionUploadService } from '../../section-upload.service';
|
||||
import { DynamicCustomSwitchModel } from '../../../../../shared/form/builder/ds-dynamic-form-ui/models/custom-switch/custom-switch.model';
|
||||
import { SubmissionSectionUploadFileEditComponent } from './section-upload-file-edit.component';
|
||||
|
||||
const jsonPatchOpBuilder: any = jasmine.createSpyObj('jsonPatchOpBuilder', {
|
||||
@@ -248,10 +278,10 @@ describe('SubmissionSectionUploadFileEditComponent test suite', () => {
|
||||
sections: {
|
||||
upload: {
|
||||
primary: true,
|
||||
files: mockUploadFiles
|
||||
}
|
||||
}
|
||||
})
|
||||
files: mockUploadFiles,
|
||||
},
|
||||
},
|
||||
}),
|
||||
];
|
||||
operationsService.jsonPatchByResourceID.and.returnValue(of(response));
|
||||
|
||||
@@ -294,7 +324,7 @@ describe('SubmissionSectionUploadFileEditComponent test suite', () => {
|
||||
}));
|
||||
|
||||
it('should update Bitstream data properly when access options are omitted', fakeAsync(() => {
|
||||
compAsAny.formRef = {formGroup: null};
|
||||
compAsAny.formRef = { formGroup: null };
|
||||
compAsAny.fileData = fileData;
|
||||
compAsAny.pathCombiner = pathCombiner;
|
||||
formService.validateAllFormFields.and.callFake(() => null);
|
||||
@@ -304,10 +334,10 @@ describe('SubmissionSectionUploadFileEditComponent test suite', () => {
|
||||
Object.assign(mockSubmissionObject, {
|
||||
sections: {
|
||||
upload: {
|
||||
files: mockUploadFiles
|
||||
}
|
||||
}
|
||||
})
|
||||
files: mockUploadFiles,
|
||||
},
|
||||
},
|
||||
}),
|
||||
];
|
||||
operationsService.jsonPatchByResourceID.and.returnValue(of(response));
|
||||
comp.saveBitstreamData();
|
||||
|
@@ -1,11 +1,32 @@
|
||||
import { ChangeDetectorRef, Component, OnDestroy, OnInit, ViewChild } from '@angular/core';
|
||||
import {
|
||||
ChangeDetectorRef,
|
||||
Component,
|
||||
OnDestroy,
|
||||
OnInit,
|
||||
ViewChild,
|
||||
} from '@angular/core';
|
||||
import { UntypedFormControl } from '@angular/forms';
|
||||
import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap';
|
||||
import { DYNAMIC_FORM_CONTROL_TYPE_DATEPICKER, DynamicDatePickerModel, DynamicFormArrayModel, DynamicFormControlEvent, DynamicFormControlModel, DynamicFormGroupModel, DynamicSelectModel, MATCH_ENABLED, OR_OPERATOR } from '@ng-dynamic-forms/core';
|
||||
import {
|
||||
DYNAMIC_FORM_CONTROL_TYPE_DATEPICKER,
|
||||
DynamicDatePickerModel,
|
||||
DynamicFormArrayModel,
|
||||
DynamicFormControlEvent,
|
||||
DynamicFormControlModel,
|
||||
DynamicFormGroupModel,
|
||||
DynamicSelectModel,
|
||||
MATCH_ENABLED,
|
||||
OR_OPERATOR,
|
||||
} from '@ng-dynamic-forms/core';
|
||||
import { DynamicDateControlValue } from '@ng-dynamic-forms/core/lib/model/dynamic-date-control.model';
|
||||
import { DynamicFormControlCondition } from '@ng-dynamic-forms/core/lib/model/misc/dynamic-form-control-relation.model';
|
||||
import { Subscription } from 'rxjs';
|
||||
import { filter, mergeMap, take } from 'rxjs/operators';
|
||||
import {
|
||||
filter,
|
||||
mergeMap,
|
||||
take,
|
||||
} from 'rxjs/operators';
|
||||
import { DynamicCustomSwitchModel } from 'src/app/shared/form/builder/ds-dynamic-form-ui/models/custom-switch/custom-switch.model';
|
||||
|
||||
import { AccessConditionOption } from '../../../../../core/config/models/config-access-condition-option.model';
|
||||
import { SubmissionFormsModel } from '../../../../../core/config/models/config-submission-forms.model';
|
||||
@@ -16,7 +37,12 @@ import { WorkspaceitemSectionUploadObject } from '../../../../../core/submission
|
||||
import { WorkspaceitemSectionUploadFileObject } from '../../../../../core/submission/models/workspaceitem-section-upload-file.model';
|
||||
import { SubmissionJsonPatchOperationsService } from '../../../../../core/submission/submission-json-patch-operations.service';
|
||||
import { dateToISOFormat } from '../../../../../shared/date.util';
|
||||
import { hasNoValue, hasValue, isNotEmpty, isNotNull } from '../../../../../shared/empty.util';
|
||||
import {
|
||||
hasNoValue,
|
||||
hasValue,
|
||||
isNotEmpty,
|
||||
isNotNull,
|
||||
} from '../../../../../shared/empty.util';
|
||||
import { FormBuilderService } from '../../../../../shared/form/builder/form-builder.service';
|
||||
import { FormFieldModel } from '../../../../../shared/form/builder/models/form-field.model';
|
||||
import { FormComponent } from '../../../../../shared/form/form.component';
|
||||
@@ -24,8 +50,22 @@ import { FormService } from '../../../../../shared/form/form.service';
|
||||
import { SubmissionService } from '../../../../submission.service';
|
||||
import { POLICY_DEFAULT_WITH_LIST } from '../../section-upload.component';
|
||||
import { SectionUploadService } from '../../section-upload.service';
|
||||
import { BITSTREAM_ACCESS_CONDITION_GROUP_CONFIG, BITSTREAM_ACCESS_CONDITION_GROUP_LAYOUT, BITSTREAM_ACCESS_CONDITIONS_FORM_ARRAY_CONFIG, BITSTREAM_ACCESS_CONDITIONS_FORM_ARRAY_LAYOUT, BITSTREAM_FORM_ACCESS_CONDITION_END_DATE_CONFIG, BITSTREAM_FORM_ACCESS_CONDITION_END_DATE_LAYOUT, BITSTREAM_FORM_ACCESS_CONDITION_START_DATE_CONFIG, BITSTREAM_FORM_ACCESS_CONDITION_START_DATE_LAYOUT, BITSTREAM_FORM_ACCESS_CONDITION_TYPE_CONFIG, BITSTREAM_FORM_ACCESS_CONDITION_TYPE_LAYOUT, BITSTREAM_FORM_PRIMARY, BITSTREAM_FORM_PRIMARY_LAYOUT, BITSTREAM_METADATA_FORM_GROUP_CONFIG, BITSTREAM_METADATA_FORM_GROUP_LAYOUT } from './section-upload-file-edit.model';
|
||||
import { DynamicCustomSwitchModel } from 'src/app/shared/form/builder/ds-dynamic-form-ui/models/custom-switch/custom-switch.model';
|
||||
import {
|
||||
BITSTREAM_ACCESS_CONDITION_GROUP_CONFIG,
|
||||
BITSTREAM_ACCESS_CONDITION_GROUP_LAYOUT,
|
||||
BITSTREAM_ACCESS_CONDITIONS_FORM_ARRAY_CONFIG,
|
||||
BITSTREAM_ACCESS_CONDITIONS_FORM_ARRAY_LAYOUT,
|
||||
BITSTREAM_FORM_ACCESS_CONDITION_END_DATE_CONFIG,
|
||||
BITSTREAM_FORM_ACCESS_CONDITION_END_DATE_LAYOUT,
|
||||
BITSTREAM_FORM_ACCESS_CONDITION_START_DATE_CONFIG,
|
||||
BITSTREAM_FORM_ACCESS_CONDITION_START_DATE_LAYOUT,
|
||||
BITSTREAM_FORM_ACCESS_CONDITION_TYPE_CONFIG,
|
||||
BITSTREAM_FORM_ACCESS_CONDITION_TYPE_LAYOUT,
|
||||
BITSTREAM_FORM_PRIMARY,
|
||||
BITSTREAM_FORM_PRIMARY_LAYOUT,
|
||||
BITSTREAM_METADATA_FORM_GROUP_CONFIG,
|
||||
BITSTREAM_METADATA_FORM_GROUP_LAYOUT,
|
||||
} from './section-upload-file-edit.model';
|
||||
|
||||
/**
|
||||
* This component represents the edit form for bitstream
|
||||
@@ -421,51 +461,51 @@ implements OnInit, OnDestroy {
|
||||
const currentAccessCondition = Object.assign({}, accessCondition);
|
||||
currentAccessCondition.name = this.retrieveValueFromField(accessCondition.name);
|
||||
|
||||
/* When start and end date fields are deactivated, their values may be still present in formData,
|
||||
/* When start and end date fields are deactivated, their values may be still present in formData,
|
||||
therefore it is necessary to delete them if they're not allowed by the current access condition option. */
|
||||
if (!accessConditionOpt.hasStartDate) {
|
||||
delete currentAccessCondition.startDate;
|
||||
} else if (accessCondition.startDate) {
|
||||
const startDate = this.retrieveValueFromField(accessCondition.startDate);
|
||||
// Clamp the start date to the maximum, if any, since the
|
||||
// datepicker sometimes exceeds it.
|
||||
let startDateDate = new Date(startDate);
|
||||
if (accessConditionOpt.maxStartDate) {
|
||||
const maxStartDateDate = new Date(accessConditionOpt.maxStartDate);
|
||||
if (startDateDate > maxStartDateDate) {
|
||||
startDateDate = maxStartDateDate;
|
||||
if (!accessConditionOpt.hasStartDate) {
|
||||
delete currentAccessCondition.startDate;
|
||||
} else if (accessCondition.startDate) {
|
||||
const startDate = this.retrieveValueFromField(accessCondition.startDate);
|
||||
// Clamp the start date to the maximum, if any, since the
|
||||
// datepicker sometimes exceeds it.
|
||||
let startDateDate = new Date(startDate);
|
||||
if (accessConditionOpt.maxStartDate) {
|
||||
const maxStartDateDate = new Date(accessConditionOpt.maxStartDate);
|
||||
if (startDateDate > maxStartDateDate) {
|
||||
startDateDate = maxStartDateDate;
|
||||
}
|
||||
}
|
||||
currentAccessCondition.startDate = dateToISOFormat(startDateDate);
|
||||
}
|
||||
currentAccessCondition.startDate = dateToISOFormat(startDateDate);
|
||||
}
|
||||
if (!accessConditionOpt.hasEndDate) {
|
||||
delete currentAccessCondition.endDate;
|
||||
} else if (accessCondition.endDate) {
|
||||
const endDate = this.retrieveValueFromField(accessCondition.endDate);
|
||||
// Clamp the end date to the maximum, if any, since the
|
||||
// datepicker sometimes exceeds it.
|
||||
let endDateDate = new Date(endDate);
|
||||
if (accessConditionOpt.maxEndDate) {
|
||||
const maxEndDateDate = new Date(accessConditionOpt.maxEndDate);
|
||||
if (endDateDate > maxEndDateDate) {
|
||||
endDateDate = maxEndDateDate;
|
||||
if (!accessConditionOpt.hasEndDate) {
|
||||
delete currentAccessCondition.endDate;
|
||||
} else if (accessCondition.endDate) {
|
||||
const endDate = this.retrieveValueFromField(accessCondition.endDate);
|
||||
// Clamp the end date to the maximum, if any, since the
|
||||
// datepicker sometimes exceeds it.
|
||||
let endDateDate = new Date(endDate);
|
||||
if (accessConditionOpt.maxEndDate) {
|
||||
const maxEndDateDate = new Date(accessConditionOpt.maxEndDate);
|
||||
if (endDateDate > maxEndDateDate) {
|
||||
endDateDate = maxEndDateDate;
|
||||
}
|
||||
}
|
||||
currentAccessCondition.endDate = dateToISOFormat(endDateDate);
|
||||
}
|
||||
currentAccessCondition.endDate = dateToISOFormat(endDateDate);
|
||||
accessConditionsToSave.push(currentAccessCondition);
|
||||
}
|
||||
accessConditionsToSave.push(currentAccessCondition);
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
if (isNotEmpty(accessConditionsToSave)) {
|
||||
this.operationsBuilder.add(this.pathCombiner.getPath([...pathFragment, 'accessConditions']), accessConditionsToSave, true);
|
||||
}
|
||||
// dispatch a PATCH request to save metadata
|
||||
return this.operationsService.jsonPatchByResourceID(
|
||||
this.submissionService.getSubmissionObjectLinkName(),
|
||||
this.submissionId,
|
||||
this.pathCombiner.rootElement,
|
||||
this.pathCombiner.subRootElement);
|
||||
// dispatch a PATCH request to save metadata
|
||||
return this.operationsService.jsonPatchByResourceID(
|
||||
this.submissionService.getSubmissionObjectLinkName(),
|
||||
this.submissionId,
|
||||
this.pathCombiner.rootElement,
|
||||
this.pathCombiner.subRootElement);
|
||||
}),
|
||||
).subscribe((result: SubmissionObject[]) => {
|
||||
const section = result[0].sections[this.sectionId];
|
||||
@@ -479,7 +519,7 @@ implements OnInit, OnDestroy {
|
||||
Object.keys(uploadSection.files)
|
||||
.filter((key) => uploadSection.files[key].uuid === this.fileId)
|
||||
.forEach((key) => this.uploadService.updateFileData(
|
||||
this.submissionId, this.sectionId, this.fileId, uploadSection.files[key]),
|
||||
this.submissionId, this.sectionId, this.fileId, uploadSection.files[key]),
|
||||
);
|
||||
this.isSaving = false;
|
||||
this.activeModal.close();
|
||||
|
@@ -1,4 +1,13 @@
|
||||
import { DynamicDatePickerModelConfig, DynamicFormArrayModelConfig, DynamicFormControlLayout, DynamicFormGroupModelConfig, DynamicSelectModelConfig, DynamicSwitchModelConfig, MATCH_ENABLED, OR_OPERATOR } from '@ng-dynamic-forms/core';
|
||||
import {
|
||||
DynamicDatePickerModelConfig,
|
||||
DynamicFormArrayModelConfig,
|
||||
DynamicFormControlLayout,
|
||||
DynamicFormGroupModelConfig,
|
||||
DynamicSelectModelConfig,
|
||||
DynamicSwitchModelConfig,
|
||||
MATCH_ENABLED,
|
||||
OR_OPERATOR,
|
||||
} from '@ng-dynamic-forms/core';
|
||||
|
||||
export const BITSTREAM_METADATA_FORM_GROUP_CONFIG: DynamicFormGroupModelConfig = {
|
||||
id: 'metadata',
|
||||
@@ -51,14 +60,14 @@ export const BITSTREAM_FORM_ACCESS_CONDITION_TYPE_LAYOUT: DynamicFormControlLayo
|
||||
export const BITSTREAM_FORM_PRIMARY_LAYOUT: DynamicFormControlLayout = {
|
||||
element: {
|
||||
host: 'col-12',
|
||||
container: 'text-right'
|
||||
container: 'text-right',
|
||||
},
|
||||
};
|
||||
|
||||
export const BITSTREAM_FORM_PRIMARY: DynamicSwitchModelConfig = {
|
||||
id: 'primary',
|
||||
name: 'primary',
|
||||
label: 'bitstream.edit.form.primaryBitstream.label'
|
||||
label: 'bitstream.edit.form.primaryBitstream.label',
|
||||
};
|
||||
|
||||
|
||||
|
@@ -1,10 +1,28 @@
|
||||
import { CommonModule } from '@angular/common';
|
||||
import { ChangeDetectorRef, Component, NO_ERRORS_SCHEMA } from '@angular/core';
|
||||
import { ComponentFixture, inject, TestBed, waitForAsync } from '@angular/core/testing';
|
||||
import { BrowserModule, By } from '@angular/platform-browser';
|
||||
import { NgbModal, NgbModule } from '@ng-bootstrap/ng-bootstrap';
|
||||
import {
|
||||
ChangeDetectorRef,
|
||||
Component,
|
||||
NO_ERRORS_SCHEMA,
|
||||
} from '@angular/core';
|
||||
import {
|
||||
ComponentFixture,
|
||||
inject,
|
||||
TestBed,
|
||||
waitForAsync,
|
||||
} from '@angular/core/testing';
|
||||
import {
|
||||
BrowserModule,
|
||||
By,
|
||||
} from '@angular/platform-browser';
|
||||
import {
|
||||
NgbModal,
|
||||
NgbModule,
|
||||
} from '@ng-bootstrap/ng-bootstrap';
|
||||
import { TranslateModule } from '@ngx-translate/core';
|
||||
import { of as observableOf, of } from 'rxjs';
|
||||
import {
|
||||
of as observableOf,
|
||||
of,
|
||||
} from 'rxjs';
|
||||
|
||||
import { JsonPatchOperationPathCombiner } from '../../../../core/json-patch/builder/json-patch-operation-path-combiner';
|
||||
import { JsonPatchOperationsBuilder } from '../../../../core/json-patch/builder/json-patch-operations-builder';
|
||||
@@ -14,7 +32,12 @@ import { FormBuilderService } from '../../../../shared/form/builder/form-builder
|
||||
import { FormService } from '../../../../shared/form/form.service';
|
||||
import { getMockFormService } from '../../../../shared/mocks/form-service.mock';
|
||||
import { getMockSectionUploadService } from '../../../../shared/mocks/section-upload.service.mock';
|
||||
import { mockSubmissionCollectionId, mockSubmissionId, mockUploadConfigResponse, mockUploadFiles } from '../../../../shared/mocks/submission.mock';
|
||||
import {
|
||||
mockSubmissionCollectionId,
|
||||
mockSubmissionId,
|
||||
mockUploadConfigResponse,
|
||||
mockUploadFiles,
|
||||
} from '../../../../shared/mocks/submission.mock';
|
||||
import { HALEndpointServiceStub } from '../../../../shared/testing/hal-endpoint-service.stub';
|
||||
import { SubmissionJsonPatchOperationsServiceStub } from '../../../../shared/testing/submission-json-patch-operations-service.stub';
|
||||
import { SubmissionServiceStub } from '../../../../shared/testing/submission-service.stub';
|
||||
|
@@ -1,21 +1,34 @@
|
||||
import { Component, Input, OnChanges, OnDestroy, OnInit, SimpleChanges, ViewChild } from '@angular/core';
|
||||
|
||||
import { BehaviorSubject, Observable, Subscription } from 'rxjs';
|
||||
import {
|
||||
Component,
|
||||
Input,
|
||||
OnChanges,
|
||||
OnDestroy,
|
||||
OnInit,
|
||||
SimpleChanges,
|
||||
ViewChild,
|
||||
} from '@angular/core';
|
||||
import { NgbModal } from '@ng-bootstrap/ng-bootstrap';
|
||||
import { NgbModalOptions } from '@ng-bootstrap/ng-bootstrap/modal/modal-config';
|
||||
import { DynamicFormControlModel } from '@ng-dynamic-forms/core';
|
||||
import {
|
||||
BehaviorSubject,
|
||||
Observable,
|
||||
Subscription,
|
||||
} from 'rxjs';
|
||||
import { filter } from 'rxjs/operators';
|
||||
|
||||
import { SubmissionFormsModel } from '../../../../core/config/models/config-submission-forms.model';
|
||||
import { SubmissionService } from '../../../submission.service';
|
||||
import { JsonPatchOperationPathCombiner } from '../../../../core/json-patch/builder/json-patch-operation-path-combiner';
|
||||
import { JsonPatchOperationsBuilder } from '../../../../core/json-patch/builder/json-patch-operations-builder';
|
||||
import { Bitstream } from '../../../../core/shared/bitstream.model';
|
||||
import { HALEndpointService } from '../../../../core/shared/hal-endpoint.service';
|
||||
import { WorkspaceitemSectionUploadFileObject } from '../../../../core/submission/models/workspaceitem-section-upload-file.model';
|
||||
import { SubmissionJsonPatchOperationsService } from '../../../../core/submission/submission-json-patch-operations.service';
|
||||
import { hasValue, isNotUndefined } from '../../../../shared/empty.util';
|
||||
import {
|
||||
hasValue,
|
||||
isNotUndefined,
|
||||
} from '../../../../shared/empty.util';
|
||||
import { FormService } from '../../../../shared/form/form.service';
|
||||
import { SubmissionService } from '../../../submission.service';
|
||||
import { SectionUploadService } from '../section-upload.service';
|
||||
import { SubmissionSectionUploadFileEditComponent } from './edit/section-upload-file-edit.component';
|
||||
|
||||
@@ -139,11 +152,11 @@ export class SubmissionSectionUploadFileComponent implements OnChanges, OnInit,
|
||||
*/
|
||||
protected pathCombiner: JsonPatchOperationPathCombiner;
|
||||
|
||||
/**
|
||||
/**
|
||||
* The [JsonPatchOperationPathCombiner] object
|
||||
* @type {JsonPatchOperationPathCombiner}
|
||||
*/
|
||||
protected primaryBitstreamPathCombiner: JsonPatchOperationPathCombiner;
|
||||
protected primaryBitstreamPathCombiner: JsonPatchOperationPathCombiner;
|
||||
|
||||
/**
|
||||
* Array to track all subscriptions and unsubscribe them onDestroy
|
||||
|
@@ -1,4 +1,7 @@
|
||||
import { Component, Input } from '@angular/core';
|
||||
import {
|
||||
Component,
|
||||
Input,
|
||||
} from '@angular/core';
|
||||
import { SubmissionFormsModel } from 'src/app/core/config/models/config-submission-forms.model';
|
||||
import { ThemedComponent } from 'src/app/shared/theme-support/themed.component';
|
||||
|
||||
|
@@ -329,7 +329,7 @@ describe('SubmissionSectionUploadComponent test suite', () => {
|
||||
|
||||
comp.onSectionInit();
|
||||
|
||||
expect(comp.required$.getValue()).toBe(true);
|
||||
expect(comp.required$.getValue()).toBe(true);
|
||||
|
||||
expect(compAsAny.getSectionStatus()).toBeObservable(cold('-c-d', {
|
||||
c: false,
|
||||
|
@@ -1,6 +1,24 @@
|
||||
import { ChangeDetectorRef, Component, Inject } from '@angular/core';
|
||||
import { BehaviorSubject, combineLatest as observableCombineLatest, combineLatest, Observable, Subscription } from 'rxjs';
|
||||
import { distinctUntilChanged, filter, map, mergeMap, switchMap, tap } from 'rxjs/operators';
|
||||
import {
|
||||
ChangeDetectorRef,
|
||||
Component,
|
||||
Inject,
|
||||
} from '@angular/core';
|
||||
import {
|
||||
BehaviorSubject,
|
||||
combineLatest,
|
||||
combineLatest as observableCombineLatest,
|
||||
Observable,
|
||||
Subscription,
|
||||
} from 'rxjs';
|
||||
import {
|
||||
distinctUntilChanged,
|
||||
filter,
|
||||
map,
|
||||
mergeMap,
|
||||
switchMap,
|
||||
tap,
|
||||
} from 'rxjs/operators';
|
||||
import { WorkspaceitemSectionUploadObject } from 'src/app/core/submission/models/workspaceitem-section-upload.model';
|
||||
|
||||
import { DSONameService } from '../../../core/breadcrumbs/dso-name.service';
|
||||
import { AccessConditionOption } from '../../../core/config/models/config-access-condition-option.model';
|
||||
@@ -15,14 +33,18 @@ import { ResourcePolicyDataService } from '../../../core/resource-policy/resourc
|
||||
import { Collection } from '../../../core/shared/collection.model';
|
||||
import { getFirstSucceededRemoteData } from '../../../core/shared/operators';
|
||||
import { AlertType } from '../../../shared/alert/alert-type';
|
||||
import { hasValue, isNotEmpty, isNotUndefined, isUndefined } from '../../../shared/empty.util';
|
||||
import {
|
||||
hasValue,
|
||||
isNotEmpty,
|
||||
isNotUndefined,
|
||||
isUndefined,
|
||||
} from '../../../shared/empty.util';
|
||||
import { followLink } from '../../../shared/utils/follow-link-config.model';
|
||||
import { SubmissionObjectEntry } from '../../objects/submission-objects.reducer';
|
||||
import { SubmissionService } from '../../submission.service';
|
||||
import { SectionModelComponent } from '../models/section.model';
|
||||
import { SectionDataObject } from '../models/section-data.model';
|
||||
import { SectionsService } from '../sections.service';
|
||||
import { WorkspaceitemSectionUploadObject } from 'src/app/core/submission/models/workspaceitem-section-upload.model';
|
||||
import { renderSectionFor } from '../sections-decorator';
|
||||
import { SectionsType } from '../sections-type';
|
||||
import { SectionUploadService } from './section-upload.service';
|
||||
@@ -198,11 +220,11 @@ export class SubmissionSectionUploadComponent extends SectionModelComponent {
|
||||
}),
|
||||
distinctUntilChanged())
|
||||
.subscribe(([configMetadataForm, { primary, files }]: [SubmissionFormsModel, WorkspaceitemSectionUploadObject]) => {
|
||||
this.primaryBitstreamUUID = primary;
|
||||
this.fileList = files;
|
||||
this.fileNames = Array.from(files, file => this.getFileName(configMetadataForm, file));
|
||||
}
|
||||
)
|
||||
this.primaryBitstreamUUID = primary;
|
||||
this.fileList = files;
|
||||
this.fileNames = Array.from(files, file => this.getFileName(configMetadataForm, file));
|
||||
},
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
|
@@ -1,9 +1,16 @@
|
||||
import { NO_ERRORS_SCHEMA } from '@angular/core';
|
||||
import { TestBed, waitForAsync } from '@angular/core/testing';
|
||||
import {
|
||||
TestBed,
|
||||
waitForAsync,
|
||||
} from '@angular/core/testing';
|
||||
import {
|
||||
Store,
|
||||
StoreModule,
|
||||
} from '@ngrx/store';
|
||||
import { JsonPatchOperationPathCombiner } from 'src/app/core/json-patch/builder/json-patch-operation-path-combiner';
|
||||
import { JsonPatchOperationsBuilder } from 'src/app/core/json-patch/builder/json-patch-operations-builder';
|
||||
|
||||
import { SectionUploadService } from './section-upload.service';
|
||||
import { Store, StoreModule } from '@ngrx/store';
|
||||
|
||||
const jsonPatchOpBuilder: any = jasmine.createSpyObj('jsonPatchOpBuilder', {
|
||||
add: jasmine.createSpy('add'),
|
||||
@@ -25,7 +32,7 @@ describe('SectionUploadService test suite', () => {
|
||||
SectionUploadService,
|
||||
{ provide: JsonPatchOperationsBuilder, useValue: jsonPatchOpBuilder },
|
||||
],
|
||||
schemas: [NO_ERRORS_SCHEMA]
|
||||
schemas: [NO_ERRORS_SCHEMA],
|
||||
});
|
||||
}));
|
||||
|
||||
@@ -36,28 +43,28 @@ describe('SectionUploadService test suite', () => {
|
||||
|
||||
[
|
||||
{
|
||||
initialPrimary: null,
|
||||
primary: true,
|
||||
operationName: 'add',
|
||||
expected: [primaryPath, fileId, false, true]
|
||||
initialPrimary: null,
|
||||
primary: true,
|
||||
operationName: 'add',
|
||||
expected: [primaryPath, fileId, false, true],
|
||||
},
|
||||
{
|
||||
initialPrimary: true,
|
||||
primary: false,
|
||||
operationName: 'remove',
|
||||
expected: [primaryPath]
|
||||
initialPrimary: true,
|
||||
primary: false,
|
||||
operationName: 'remove',
|
||||
expected: [primaryPath],
|
||||
},
|
||||
{
|
||||
initialPrimary: false,
|
||||
primary: true,
|
||||
operationName: 'replace',
|
||||
expected: [primaryPath, fileId, true]
|
||||
}
|
||||
initialPrimary: false,
|
||||
primary: true,
|
||||
operationName: 'replace',
|
||||
expected: [primaryPath, fileId, true],
|
||||
},
|
||||
].forEach(({ initialPrimary, primary, operationName, expected }) => {
|
||||
it(`updatePrimaryBitstreamOperation should add ${operationName} operation`, () => {
|
||||
const path = pathCombiner.getPath('primary');
|
||||
sectionUploadService.updatePrimaryBitstreamOperation(path, initialPrimary, primary, fileId);
|
||||
expect(operationsBuilder[operationName]).toHaveBeenCalledWith(...expected);
|
||||
});
|
||||
const path = pathCombiner.getPath('primary');
|
||||
sectionUploadService.updatePrimaryBitstreamOperation(path, initialPrimary, primary, fileId);
|
||||
expect(operationsBuilder[operationName]).toHaveBeenCalledWith(...expected);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
@@ -1,21 +1,29 @@
|
||||
import { Injectable } from '@angular/core';
|
||||
import { Store } from '@ngrx/store';
|
||||
import { Observable } from 'rxjs';
|
||||
import { distinctUntilChanged, filter, map } from 'rxjs/operators';
|
||||
import {
|
||||
distinctUntilChanged,
|
||||
filter,
|
||||
map,
|
||||
} from 'rxjs/operators';
|
||||
import { JsonPatchOperationPathObject } from 'src/app/core/json-patch/builder/json-patch-operation-path-combiner';
|
||||
import { JsonPatchOperationsBuilder } from 'src/app/core/json-patch/builder/json-patch-operations-builder';
|
||||
import { WorkspaceitemSectionUploadObject } from 'src/app/core/submission/models/workspaceitem-section-upload.model';
|
||||
|
||||
import { WorkspaceitemSectionUploadFileObject } from '../../../core/submission/models/workspaceitem-section-upload-file.model';
|
||||
import { isUndefined } from '../../../shared/empty.util';
|
||||
import { submissionSectionDataFromIdSelector, submissionUploadedFileFromUuidSelector, submissionUploadedFilesFromIdSelector } from '../../selectors';
|
||||
import { WorkspaceitemSectionUploadObject } from 'src/app/core/submission/models/workspaceitem-section-upload.model';
|
||||
import { JsonPatchOperationPathObject } from 'src/app/core/json-patch/builder/json-patch-operation-path-combiner';
|
||||
import { JsonPatchOperationsBuilder } from 'src/app/core/json-patch/builder/json-patch-operations-builder';
|
||||
import { SubmissionState } from '../../submission.reducers';
|
||||
import {
|
||||
DeleteUploadedFileAction,
|
||||
EditFileDataAction,
|
||||
EditFilePrimaryBitstreamAction,
|
||||
NewUploadedFileAction,
|
||||
} from '../../objects/submission-objects.actions';
|
||||
import {
|
||||
submissionSectionDataFromIdSelector,
|
||||
submissionUploadedFileFromUuidSelector,
|
||||
submissionUploadedFilesFromIdSelector,
|
||||
} from '../../selectors';
|
||||
import { SubmissionState } from '../../submission.reducers';
|
||||
|
||||
/**
|
||||
* A service that provides methods to handle submission's bitstream state.
|
||||
@@ -31,7 +39,7 @@ export class SectionUploadService {
|
||||
*/
|
||||
constructor(private store: Store<SubmissionState>, private operationsBuilder: JsonPatchOperationsBuilder) {}
|
||||
|
||||
/**
|
||||
/**
|
||||
* Define and add an operation based on a change
|
||||
*
|
||||
* @param path
|
||||
@@ -152,7 +160,7 @@ export class SectionUploadService {
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
/**
|
||||
* Update primary bitstream into the state
|
||||
*
|
||||
* @param submissionId
|
||||
@@ -162,9 +170,9 @@ export class SectionUploadService {
|
||||
* @param fileUUID
|
||||
* The bitstream UUID
|
||||
*/
|
||||
public updateFilePrimaryBitstream(submissionId: string, sectionId: string, fileUUID: string | null) {
|
||||
public updateFilePrimaryBitstream(submissionId: string, sectionId: string, fileUUID: string | null) {
|
||||
this.store.dispatch(
|
||||
new EditFilePrimaryBitstreamAction(submissionId, sectionId, fileUUID)
|
||||
new EditFilePrimaryBitstreamAction(submissionId, sectionId, fileUUID),
|
||||
);
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user