diff --git a/src/app/core/config/models/config-submission-access.model.ts b/src/app/core/config/models/config-submission-access.model.ts index a13a42a303..9584fc6e3c 100644 --- a/src/app/core/config/models/config-submission-access.model.ts +++ b/src/app/core/config/models/config-submission-access.model.ts @@ -19,6 +19,9 @@ export class SubmissionAccessModel extends ConfigObject { @autoserialize discoverable: boolean; + @autoserialize + canChangeDiscoverable: boolean; + @deserialize _links: { self: HALLink diff --git a/src/app/shared/mocks/section-accesses-config.service.mock.ts b/src/app/shared/mocks/section-accesses-config.service.mock.ts index 0362493035..1ab9565acc 100644 --- a/src/app/shared/mocks/section-accesses-config.service.mock.ts +++ b/src/app/shared/mocks/section-accesses-config.service.mock.ts @@ -37,8 +37,51 @@ const configRes = Object.assign(new SubmissionFormsModel(), { } }); + +const configResNotChangeDiscoverable = Object.assign(new SubmissionFormsModel(), { + 'id': 'AccessConditionDefaultConfiguration', + 'canChangeDiscoverable': false, + 'accessConditionOptions': [ + { + 'name': 'openaccess', + 'hasStartDate': false, + 'hasEndDate': false + }, + { + 'name': 'lease', + 'hasStartDate': false, + 'hasEndDate': true, + 'maxEndDate': '2022-06-20T12:17:44.420+00:00' + }, + { + 'name': 'embargo', + 'hasStartDate': true, + 'hasEndDate': false, + 'maxStartDate': '2024-12-20T12:17:44.420+00:00' + }, + { + 'name': 'administrator', + 'hasStartDate': false, + 'hasEndDate': false + } + ], + 'type': 'submissionaccessoption', + '_links': { + 'self': { + 'href': 'http://localhost:8080/server/api/config/submissionaccessoptions/AccessConditionDefaultConfiguration' + } + } +}); + export function getSubmissionAccessesConfigService(): SubmissionFormsConfigService { return jasmine.createSpyObj('SubmissionAccessesConfigService', { findByHref: createSuccessfulRemoteDataObject$(configRes), }); } + + +export function getSubmissionAccessesConfigNotChangeDiscoverableService(): SubmissionFormsConfigService { + return jasmine.createSpyObj('SubmissionAccessesConfigService', { + findByHref: createSuccessfulRemoteDataObject$(configResNotChangeDiscoverable), + }); +} diff --git a/src/app/submission/sections/accesses/section-accesses.component.spec.ts b/src/app/submission/sections/accesses/section-accesses.component.spec.ts index 669d905ec2..4683283691 100644 --- a/src/app/submission/sections/accesses/section-accesses.component.spec.ts +++ b/src/app/submission/sections/accesses/section-accesses.component.spec.ts @@ -8,7 +8,7 @@ import { SectionsServiceStub } from '../../../shared/testing/sections-service.st import { FormBuilderService } from '../../../shared/form/builder/form-builder.service'; import { getMockFormBuilderService } from '../../../shared/mocks/form-builder-service.mock'; import { SubmissionAccessesConfigService } from '../../../core/config/submission-accesses-config.service'; -import { getSubmissionAccessesConfigService } from '../../../shared/mocks/section-accesses-config.service.mock'; +import { getSubmissionAccessesConfigService, getSubmissionAccessesConfigNotChangeDiscoverableService } from '../../../shared/mocks/section-accesses-config.service.mock'; import { SectionAccessesService } from './section-accesses.service'; import { SectionFormOperationsService } from '../form/section-form-operations.service'; import { JsonPatchOperationsBuilder } from '../../../core/json-patch/builder/json-patch-operations-builder'; @@ -72,78 +72,130 @@ describe('SubmissionSectionAccessesComponent', () => { isValid: true }; + describe('First with canChangeDiscoverable true', () => { + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [ + BrowserModule, + TranslateModule.forRoot() + ], + declarations: [SubmissionSectionAccessesComponent, FormComponent], + providers: [ + { provide: SectionsService, useValue: sectionsServiceStub }, + { provide: FormBuilderService, useValue: builderService }, + { provide: SubmissionAccessesConfigService, useValue: submissionAccessesConfigService }, + { provide: SectionAccessesService, useValue: sectionAccessesService }, + { provide: SectionFormOperationsService, useValue: sectionFormOperationsService }, + { provide: JsonPatchOperationsBuilder, useValue: operationsBuilder }, + { provide: TranslateService, useValue: getMockTranslateService() }, + { provide: FormService, useValue: getMockFormService() }, + { provide: Store, useValue: storeStub }, + { provide: SubmissionJsonPatchOperationsService, useValue: SubmissionJsonPatchOperationsServiceStub }, + { provide: 'sectionDataProvider', useValue: sectionData }, + { provide: 'submissionIdProvider', useValue: '1508' }, + ] + }) + .compileComponents(); + }); + + beforeEach(inject([Store], (store: Store) => { + fixture = TestBed.createComponent(SubmissionSectionAccessesComponent); + component = fixture.componentInstance; + formService = TestBed.inject(FormService); + formService.validateAllFormFields.and.callFake(() => null); + formService.isValid.and.returnValue(observableOf(true)); + formService.getFormData.and.returnValue(observableOf(mockAccessesFormData)); + fixture.detectChanges(); + })); - beforeEach(async () => { - await TestBed.configureTestingModule({ - imports: [ - BrowserModule, - TranslateModule.forRoot() - ], - declarations: [SubmissionSectionAccessesComponent, FormComponent], - providers: [ - { provide: SectionsService, useValue: sectionsServiceStub }, - { provide: FormBuilderService, useValue: builderService }, - { provide: SubmissionAccessesConfigService, useValue: submissionAccessesConfigService }, - { provide: SectionAccessesService, useValue: sectionAccessesService }, - { provide: SectionFormOperationsService, useValue: sectionFormOperationsService }, - { provide: JsonPatchOperationsBuilder, useValue: operationsBuilder }, - { provide: TranslateService, useValue: getMockTranslateService() }, - { provide: FormService, useValue: getMockFormService() }, - { provide: Store, useValue: storeStub }, - { provide: SubmissionJsonPatchOperationsService, useValue: SubmissionJsonPatchOperationsServiceStub }, - { provide: 'sectionDataProvider', useValue: sectionData }, - { provide: 'submissionIdProvider', useValue: '1508' }, - ] - }) - .compileComponents(); + it('should create', () => { + expect(component).toBeTruthy(); + }); + + it('should have created formModel', () => { + expect(component.formModel).toBeTruthy(); + }); + + it('should have formModel length should be 2', () => { + expect(component.formModel.length).toEqual(2); + }); + + it('formModel should have 1 model type checkbox and 1 model type array', () => { + expect(component.formModel[0] instanceof DynamicCheckboxModel).toBeTrue(); + expect(component.formModel[1] instanceof DynamicFormArrayModel).toBeTrue(); + }); + + it('formModel type array should have formgroup with 1 input and 2 datepickers', () => { + const formModel: any = component.formModel[1]; + const formGroup = formModel.groupFactory()[0].group; + expect(formGroup[0] instanceof DynamicSelectModel).toBeTrue(); + expect(formGroup[1] instanceof DynamicDatePickerModel).toBeTrue(); + expect(formGroup[2] instanceof DynamicDatePickerModel).toBeTrue(); + }); + + it('when checkbox changed it should call operationsBuilder replace function', () => { + component.onChange(checkboxChangeEvent); + fixture.detectChanges(); + + expect(operationsBuilder.replace).toHaveBeenCalled(); + }); + + it('when dropdown select changed it should call operationsBuilder add function', () => { + component.onChange(accessConditionChangeEvent); + fixture.detectChanges(); + expect(operationsBuilder.add).toHaveBeenCalled(); + }); }); - beforeEach(inject([Store], (store: Store) => { - fixture = TestBed.createComponent(SubmissionSectionAccessesComponent); - component = fixture.componentInstance; - formService = TestBed.inject(FormService); - formService.validateAllFormFields.and.callFake(() => null); - formService.isValid.and.returnValue(observableOf(true)); - formService.getFormData.and.returnValue(observableOf(mockAccessesFormData)); - fixture.detectChanges(); - })); + describe('when canDescoverable is false', () => { - it('should create', () => { - expect(component).toBeTruthy(); - }); - it('should have created formModel', () => { - expect(component.formModel).toBeTruthy(); - }); - it('should have formModel length should be 2', () => { - expect(component.formModel.length).toEqual(2); - }); + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [ + BrowserModule, + TranslateModule.forRoot() + ], + declarations: [SubmissionSectionAccessesComponent, FormComponent], + providers: [ + { provide: SectionsService, useValue: sectionsServiceStub }, + { provide: FormBuilderService, useValue: builderService }, + { provide: SubmissionAccessesConfigService, useValue: getSubmissionAccessesConfigNotChangeDiscoverableService() }, + { provide: SectionAccessesService, useValue: sectionAccessesService }, + { provide: SectionFormOperationsService, useValue: sectionFormOperationsService }, + { provide: JsonPatchOperationsBuilder, useValue: operationsBuilder }, + { provide: TranslateService, useValue: getMockTranslateService() }, + { provide: FormService, useValue: getMockFormService() }, + { provide: Store, useValue: storeStub }, + { provide: SubmissionJsonPatchOperationsService, useValue: SubmissionJsonPatchOperationsServiceStub }, + { provide: 'sectionDataProvider', useValue: sectionData }, + { provide: 'submissionIdProvider', useValue: '1508' }, + ] + }) + .compileComponents(); + }); - it('formModel should have 1 model type checkbox and 1 model type array', () => { - expect(component.formModel[0] instanceof DynamicCheckboxModel).toBeTrue(); - expect(component.formModel[1] instanceof DynamicFormArrayModel).toBeTrue(); - }); + beforeEach(inject([Store], (store: Store) => { + fixture = TestBed.createComponent(SubmissionSectionAccessesComponent); + component = fixture.componentInstance; + formService = TestBed.inject(FormService); + formService.validateAllFormFields.and.callFake(() => null); + formService.isValid.and.returnValue(observableOf(true)); + formService.getFormData.and.returnValue(observableOf(mockAccessesFormData)); + fixture.detectChanges(); + })); - it('formModel type array should have formgroup with 1 input and 2 datepickers', () => { - const formModel: any = component.formModel[1]; - const formGroup = formModel.groupFactory()[0].group; - expect(formGroup[0] instanceof DynamicSelectModel).toBeTrue(); - expect(formGroup[1] instanceof DynamicDatePickerModel).toBeTrue(); - expect(formGroup[2] instanceof DynamicDatePickerModel).toBeTrue(); - }); - it('when checkbox changed it should call operationsBuilder replace function', () => { - component.onChange(checkboxChangeEvent); - fixture.detectChanges(); + it('should have formModel length should be 1', () => { + expect(component.formModel.length).toEqual(1); + }); - expect(operationsBuilder.replace).toHaveBeenCalled(); - }); + it('formModel should have only 1 model type array', () => { + expect(component.formModel[0] instanceof DynamicFormArrayModel).toBeTrue(); + }); - it('when dropdown select changed it should call operationsBuilder add function', () => { - component.onChange(accessConditionChangeEvent); - fixture.detectChanges(); - expect(operationsBuilder.add).toHaveBeenCalled(); }); }); diff --git a/src/app/submission/sections/accesses/section-accesses.component.ts b/src/app/submission/sections/accesses/section-accesses.component.ts index a1113501ee..7f738e65a5 100644 --- a/src/app/submission/sections/accesses/section-accesses.component.ts +++ b/src/app/submission/sections/accesses/section-accesses.component.ts @@ -113,6 +113,12 @@ export class SubmissionSectionAccessesComponent extends SectionModelComponent { */ protected fieldsOnTheirWayToBeRemoved: Map = new Map(); + /** + * Defines if the access discoverable property can be managed + */ + public canChangeDiscoverable: boolean; + + /** * Initialize instance variables * @@ -282,6 +288,7 @@ export class SubmissionSectionAccessesComponent extends SectionModelComponent { combineLatest(config$, accessData$).subscribe(([config, accessData]) => { this.availableAccessConditionOptions = isNotEmpty(config.accessConditionOptions) ? config.accessConditionOptions : []; + this.canChangeDiscoverable = !!config.canChangeDiscoverable; this.accessesData = accessData; this.formModel = this.buildFileEditForm(); }); @@ -305,14 +312,17 @@ export class SubmissionSectionAccessesComponent extends SectionModelComponent { protected buildFileEditForm() { const formModel: DynamicFormControlModel[] = []; - formModel.push( - new DynamicCheckboxModel({ - id: 'discoverable', - label: this.translate.instant('submission.sections.accesses.form.discoverable-label'), - name: 'discoverable', - value: this.accessesData.discoverable - }) - ); + if (this.canChangeDiscoverable) { + formModel.push( + new DynamicCheckboxModel({ + id: 'discoverable', + label: this.translate.instant('submission.sections.accesses.form.discoverable-label'), + name: 'discoverable', + value: this.accessesData.discoverable + }) + ); + } + const accessConditionTypeModelConfig = Object.assign({}, FORM_ACCESS_CONDITION_TYPE_CONFIG); const accessConditionsArrayConfig = Object.assign({}, ACCESS_CONDITIONS_FORM_ARRAY_CONFIG);