[ADF-5377] Viewer: Image Crop (#6977)

* changed dependency

* Update lib/core/viewer/components/img-viewer.component.ts

Co-authored-by: Denys Vuika <denys.vuika@alfresco.com>

Co-authored-by: Denys Vuika <denys.vuika@alfresco.com>
This commit is contained in:
Urse Daniel 2021-05-06 17:21:15 +03:00 committed by GitHub
parent aa5cbea7f5
commit f5c29a5ec8
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 48 additions and 1 deletions

View File

@ -385,6 +385,7 @@
"ZOOM_OUT": "Zoom out", "ZOOM_OUT": "Zoom out",
"FIT_PAGE": "Fit page", "FIT_PAGE": "Fit page",
"ROTATE": "Rotate", "ROTATE": "Rotate",
"CROP": "Crop",
"SAVE": "Save", "SAVE": "Save",
"CANCEL": "Cancel", "CANCEL": "Cancel",
"RESET": "Reset", "RESET": "Reset",

View File

@ -34,6 +34,14 @@
(click)="rotateImage()"> (click)="rotateImage()">
<mat-icon>rotate_left</mat-icon> <mat-icon>rotate_left</mat-icon>
</button> </button>
<button
*ngIf="!readOnly" id="viewer-crop-button"
title="{{ 'ADF_VIEWER.ARIA.CROP' | translate }}"
attr.aria-label="{{ 'ADF_VIEWER.ARIA.CROP' | translate }}"
mat-icon-button
(click)="cropImage()">
<mat-icon>crop</mat-icon>
</button>
<button <button
id="viewer-reset-button" id="viewer-reset-button"

View File

@ -221,6 +221,26 @@ describe('Test Img viewer component ', () => {
expect(rotateButtonElement).toEqual(null); expect(rotateButtonElement).toEqual(null);
}); });
it('should not show crop button by default', () => {
const rotateButtonElement = element.querySelector('#viewer-crop-button');
expect(rotateButtonElement).toEqual(null);
});
it('should start cropping when clicking the crop button', fakeAsync(() => {
component.readOnly = false;
spyOn(component, 'cropImage').and.callThrough();
spyOn(component.cropper, 'crop');
spyOn(component.cropper, 'setDragMode');
fixture.detectChanges();
const cropButtonElement = fixture.debugElement.query(By.css('#viewer-crop-button'));
cropButtonElement.triggerEventHandler('click', null);
tick();
expect(component.cropImage).toHaveBeenCalled();
expect(component.cropper.crop).toHaveBeenCalled();
expect(component.cropper.setDragMode).toHaveBeenCalledWith('crop');
}));
it('should rotate image by -90 degrees on button click', fakeAsync(() => { it('should rotate image by -90 degrees on button click', fakeAsync(() => {
component.readOnly = false; component.readOnly = false;
spyOn(component, 'rotateImage').and.callThrough(); spyOn(component, 'rotateImage').and.callThrough();
@ -260,7 +280,7 @@ describe('Test Img viewer component ', () => {
expect(secondaryToolbar).toEqual(null); expect(secondaryToolbar).toEqual(null);
}); });
it('should display second toolbar in rotate mode', fakeAsync(() => { it('should display second toolbar in edit mode', fakeAsync(() => {
component.readOnly = false; component.readOnly = false;
component.isEditing = true; component.isEditing = true;
@ -287,6 +307,13 @@ describe('Test Img viewer component ', () => {
expect(component.isEditing).toEqual(true); expect(component.isEditing).toEqual(true);
}); });
it('should get in editing mode when the image gets cropped', () => {
component.readOnly = false;
component.cropImage();
expect(component.isEditing).toEqual(true);
});
it('should reset the scale and hide second toolbar', fakeAsync(() => { it('should reset the scale and hide second toolbar', fakeAsync(() => {
component.readOnly = false; component.readOnly = false;
component.isEditing = true; component.isEditing = true;

View File

@ -89,6 +89,7 @@ export class ImgViewerComponent implements AfterViewInit, OnChanges {
dragMode: 'move', dragMode: 'move',
background: false, background: false,
scalable: true, scalable: true,
modal: false,
zoomOnWheel: false, zoomOnWheel: false,
toggleDragModeOnDblclick: false, toggleDragModeOnDblclick: false,
viewMode: 1, viewMode: 1,
@ -175,16 +176,26 @@ export class ImgViewerComponent implements AfterViewInit, OnChanges {
this.cropper.rotate( -90); this.cropper.rotate( -90);
} }
cropImage() {
this.isEditing = true;
this.cropper.setDragMode('crop');
this.cropper.crop();
}
save() { save() {
this.isEditing = false; this.isEditing = false;
this.cropper.setDragMode('move');
this.cropper.getCroppedCanvas().toBlob((blob) => { this.cropper.getCroppedCanvas().toBlob((blob) => {
this.submit.emit(blob); this.submit.emit(blob);
this.cropper.clear();
}); });
} }
reset() { reset() {
this.isEditing = false; this.isEditing = false;
this.cropper.clear();
this.cropper.reset(); this.cropper.reset();
this.cropper.setDragMode('move');
this.scale = 1.0; this.scale = 1.0;
this.cropper.zoomTo(this.scale); this.cropper.zoomTo(this.scale);
} }