diff --git a/src/lib/viewers/BaseViewer.js b/src/lib/viewers/BaseViewer.js index 9377aa93f..09cb3cda5 100644 --- a/src/lib/viewers/BaseViewer.js +++ b/src/lib/viewers/BaseViewer.js @@ -763,6 +763,21 @@ class BaseViewer extends EventEmitter { this.annotator.addListener('annotatorevent', this.handleAnnotatorEvents); } + /** + * Returns whether or not user has permissions to load annotations on the current file + * + * @param {Object} permissions Permissions on the current file + * @return {boolean} Whether or not user has the correct permissions + */ + hasAnnotationPermissions(permissions) { + if (!permissions) { + return false; + } + + const canViewAnnotations = !!(permissions.can_view_annotations_all || permissions.can_view_annotations_self); + return !permissions.can_annotate && !canViewAnnotations; + } + /** * Returns whether or not annotations are enabled for this viewer. * @@ -770,12 +785,7 @@ class BaseViewer extends EventEmitter { */ areAnnotationsEnabled() { // Do not attempt to fetch annotations if the user cannot create or view annotations - const { permissions } = this.options.file; - if ( - permissions && - !permissions.can_annotate && - !(permissions.can_view_annotations_all || permissions.can_view_annotations_self) - ) { + if (!this.hasAnnotationPermissions(this.options.file)) { return false; } diff --git a/src/lib/viewers/__tests__/BaseViewer-test.js b/src/lib/viewers/__tests__/BaseViewer-test.js index 566c1c82e..59d3c5744 100644 --- a/src/lib/viewers/__tests__/BaseViewer-test.js +++ b/src/lib/viewers/__tests__/BaseViewer-test.js @@ -910,6 +910,33 @@ describe('lib/viewers/BaseViewer', () => { }) }); + describe('hasAnnotationPermissions()', () => { + const permissions = { + can_annotate: false, + can_view_annotations_all: false, + can_view_annotations_self: false + }; + + it('does nothing if file permissions are undefined', () => { + expect(base.hasAnnotationPermissions()).to.be.falsy; + }); + + it('should return false if the user can neither annotate nor view all or their own annotations', () => { + expect(base.hasAnnotationPermissions(permissions)).to.be.falsy; + }); + + it('should return true if the user can at least view all annotations', () => { + permissions.can_view_annotations_all = true; + expect(base.hasAnnotationPermissions(permissions)).to.be.truthy; + }); + + it('should return true if the user can at least view their own annotations', () => { + permissions.can_view_annotations_all = false; + permissions.can_view_annotations_self = true; + expect(base.hasAnnotationPermissions(permissions)).to.be.truthy; + }); + }); + describe('areAnnotationsEnabled()', () => { beforeEach(() => { stubs.getViewerOption = sandbox.stub(base, 'getViewerOption').withArgs('annotations').returns(false); @@ -920,24 +947,6 @@ describe('lib/viewers/BaseViewer', () => { }; }); - it('should return false if the user can neither annotate nor view all or their own annotations', () => { - stubs.getViewerOption.returns(true); - - base.options.file.permissions = { - can_annotate: false, - can_view_annotations_all: false, - can_view_annotations_self: false - }; - expect(base.areAnnotationsEnabled()).to.equal(false); - - base.options.file.permissions.can_view_annotations_all = true; - expect(base.areAnnotationsEnabled()).to.equal(true); - - base.options.file.permissions.can_view_annotations_all = false; - base.options.file.permissions.can_view_annotations_self = true; - expect(base.areAnnotationsEnabled()).to.equal(true); - }); - it('should return true if viewer option is set to true', () => { expect(base.areAnnotationsEnabled()).to.equal(false); stubs.getViewerOption.returns(true);