Autofix lint issues

This commit is contained in:
Yury Bondarenko
2024-03-06 10:30:19 +01:00
parent dbf7fd67fd
commit 2b540cd91c
483 changed files with 9002 additions and 4652 deletions

View File

@@ -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 {

View File

@@ -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();
}
/**

View File

@@ -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.

View File

@@ -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 }),
});

View File

@@ -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);

View File

@@ -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],
);
});
});

View File

@@ -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),
));
}

View File

@@ -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;
};

View File

@@ -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;
};

View File

@@ -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();

View File

@@ -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();

View File

@@ -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',
};

View File

@@ -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';

View File

@@ -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

View File

@@ -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';

View File

@@ -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,

View File

@@ -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));
},
),
);
}

View 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);
});
});
});

View File

@@ -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),
);
}