Fix export button enabled in bulk access management without selecting step 2

This commit is contained in:
abhinav
2025-04-11 12:09:10 +02:00
parent 0ff8ce9c25
commit 4b3b660354
5 changed files with 50 additions and 11 deletions

View File

@@ -1,4 +1,7 @@
import { NO_ERRORS_SCHEMA } from '@angular/core'; import {
Component,
NO_ERRORS_SCHEMA,
} from '@angular/core';
import { import {
ComponentFixture, ComponentFixture,
TestBed, TestBed,
@@ -62,10 +65,17 @@ describe('BulkAccessComponent', () => {
'file': { }, 'file': { },
}; };
const mockSettings: any = jasmine.createSpyObj('AccessControlFormContainerComponent', { @Component({
getValue: jasmine.createSpy('getValue'), selector: 'ds-bulk-access-settings',
reset: jasmine.createSpy('reset'), template: '',
}); exportAs: 'dsBulkSettings',
standalone: true,
})
class MockBulkAccessSettingsComponent {
isFormValid = jasmine.createSpy('isFormValid').and.returnValue(false);
getValue = jasmine.createSpy('getValue');
reset = jasmine.createSpy('reset');
}
const selection: any[] = [{ indexableObject: { uuid: '1234' } }, { indexableObject: { uuid: '5678' } }]; const selection: any[] = [{ indexableObject: { uuid: '1234' } }, { indexableObject: { uuid: '5678' } }];
const selectableListState: SelectableListState = { id: 'test', selection }; const selectableListState: SelectableListState = { id: 'test', selection };
const expectedIdList = ['1234', '5678']; const expectedIdList = ['1234', '5678'];
@@ -93,6 +103,9 @@ describe('BulkAccessComponent', () => {
BulkAccessSettingsComponent, BulkAccessSettingsComponent,
], ],
}, },
add: {
imports: [MockBulkAccessSettingsComponent],
},
}) })
.compileComponents(); .compileComponents();
}); });
@@ -109,13 +122,12 @@ describe('BulkAccessComponent', () => {
fixture.destroy(); fixture.destroy();
}); });
describe('when there are no elements selected', () => { describe('when there are no elements selected and step two form is invalid', () => {
beforeEach(() => { beforeEach(() => {
(component as any).selectableListService.getSelectableList.and.returnValue(of(selectableListStateEmpty)); (component as any).selectableListService.getSelectableList.and.returnValue(of(selectableListStateEmpty));
fixture.detectChanges(); fixture.detectChanges();
component.settings = mockSettings;
}); });
it('should create', () => { it('should create', () => {
@@ -138,7 +150,6 @@ describe('BulkAccessComponent', () => {
(component as any).selectableListService.getSelectableList.and.returnValue(of(selectableListState)); (component as any).selectableListService.getSelectableList.and.returnValue(of(selectableListState));
fixture.detectChanges(); fixture.detectChanges();
component.settings = mockSettings;
}); });
it('should create', () => { it('should create', () => {
@@ -149,15 +160,29 @@ describe('BulkAccessComponent', () => {
expect(component.objectsSelected$.value).toEqual(expectedIdList); expect(component.objectsSelected$.value).toEqual(expectedIdList);
}); });
it('should enable the execute button when there are objects selected', () => { it('should not enable the execute button when there are objects selected and step two form is invalid', () => {
component.objectsSelected$.next(['1234']); component.objectsSelected$.next(['1234']);
expect(component.canExport()).toBe(true); expect(component.canExport()).toBe(false);
}); });
it('should call the settings reset method when reset is called', () => { it('should call the settings reset method when reset is called', () => {
component.reset(); component.reset();
expect(component.settings.reset).toHaveBeenCalled(); expect(component.settings.reset).toHaveBeenCalled();
}); });
});
describe('when there are elements selected and the step two form is valid', () => {
beforeEach(() => {
(component as any).selectableListService.getSelectableList.and.returnValue(of(selectableListState));
fixture.detectChanges();
(component as any).settings.isFormValid.and.returnValue(true);
});
it('should enable the execute button when there are objects selected and step two form is valid', () => {
component.objectsSelected$.next(['1234']);
expect(component.canExport()).toBe(true);
});
it('should call the bulkAccessControlService executeScript method when submit is called', () => { it('should call the bulkAccessControlService executeScript method when submit is called', () => {
(component.settings as any).getValue.and.returnValue(mockFormState); (component.settings as any).getValue.and.returnValue(mockFormState);

View File

@@ -1,4 +1,5 @@
import { import {
ChangeDetectionStrategy,
Component, Component,
OnInit, OnInit,
ViewChild, ViewChild,
@@ -31,6 +32,7 @@ import { BulkAccessSettingsComponent } from './settings/bulk-access-settings.com
BtnDisabledDirective, BtnDisabledDirective,
], ],
standalone: true, standalone: true,
changeDetection: ChangeDetectionStrategy.OnPush,
}) })
export class BulkAccessComponent implements OnInit { export class BulkAccessComponent implements OnInit {
@@ -70,7 +72,7 @@ export class BulkAccessComponent implements OnInit {
} }
canExport(): boolean { canExport(): boolean {
return this.objectsSelected$.value?.length > 0; return this.objectsSelected$.value?.length > 0 && this.settings?.isFormValid();
} }
/** /**

View File

@@ -42,4 +42,8 @@ export class BulkAccessSettingsComponent {
this.controlForm.reset(); this.controlForm.reset();
} }
isFormValid() {
return this.controlForm.isValid();
}
} }

View File

@@ -135,6 +135,10 @@ export class AccessControlArrayFormComponent implements OnInit {
return item.id; return item.id;
} }
isValid() {
return this.ngForm.valid;
}
} }

View File

@@ -176,5 +176,9 @@ export class AccessControlFormContainerComponent<T extends DSpaceObject> impleme
this.selectableListService.deselectAll(ITEM_ACCESS_CONTROL_SELECT_BITSTREAMS_LIST_ID); this.selectableListService.deselectAll(ITEM_ACCESS_CONTROL_SELECT_BITSTREAMS_LIST_ID);
} }
isValid() {
return this.bitstreamAccessCmp.isValid() || this.itemAccessCmp.isValid();
}
} }