diff --git a/ng2-components/ng2-alfresco-core/src/components/context-menu-holder.component.spec.ts b/ng2-components/ng2-alfresco-core/src/components/context-menu-holder.component.spec.ts new file mode 100644 index 0000000000..496fac21e7 --- /dev/null +++ b/ng2-components/ng2-alfresco-core/src/components/context-menu-holder.component.spec.ts @@ -0,0 +1,114 @@ +/*! + * @license + * Copyright 2016 Alfresco Software, Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { describe, it, beforeEach } from '@angular/core/testing'; +import { ContextMenuService } from './../services/context-menu.service'; +import { ContextMenuHolderComponent } from './context-menu-holder.component'; + +describe('ContextMenuHolderComponent', () => { + + let contextMenuService; + let menuHolder; + + beforeEach(() => { + contextMenuService = new ContextMenuService(); + menuHolder = new ContextMenuHolderComponent(contextMenuService); + }); + + it('should show menu on service event', () => { + spyOn(menuHolder, 'showMenu').and.callThrough(); + contextMenuService.show.next({}); + + expect(menuHolder.showMenu).toHaveBeenCalled(); + }); + + it('should have fixed position', () => { + expect(menuHolder.locationCss).toEqual( + jasmine.objectContaining({ + position: 'fixed' + }) + ); + }); + + it('should setup empty location by default', () => { + expect(menuHolder.locationCss).toEqual( + jasmine.objectContaining({ + left: '0px', + top: '0px' + }) + ); + }); + + it('should be hidden by default', () => { + expect(menuHolder.isShown).toBeFalsy(); + expect(menuHolder.locationCss).toEqual( + jasmine.objectContaining({ + display: 'none' + }) + ); + }); + + it('should show on service event', () => { + expect(menuHolder.isShown).toBeFalsy(); + contextMenuService.show.next({}); + expect(menuHolder.isShown).toBeTruthy(); + }); + + it('should update position from service event', () => { + + expect(menuHolder.locationCss).toEqual( + jasmine.objectContaining({ + left: '0px', + top: '0px' + }) + ); + + let event = new MouseEvent('click', { + clientX: 10, + clientY: 20 + }); + + contextMenuService.show.next({ event: event }); + + expect(menuHolder.locationCss).toEqual( + jasmine.objectContaining({ + left: '10px', + top: '20px' + }) + ); + }); + + it('should take links from service event', () => { + let links = [{}, {}]; + contextMenuService.show.next({ obj: links }); + expect(menuHolder.links).toBe(links); + }); + + it('should hide on outside click', () => { + contextMenuService.show.next({}); + expect(menuHolder.isShown).toBeTruthy(); + + menuHolder.clickedOutside(); + expect(menuHolder.isShown).toBeFalsy(); + expect(menuHolder.locationCss).toEqual( + jasmine.objectContaining({ + display: 'none' + }) + ); + }); + +}); diff --git a/ng2-components/ng2-alfresco-core/src/components/context-menu-holder.component.ts b/ng2-components/ng2-alfresco-core/src/components/context-menu-holder.component.ts index 91f77a7638..77e38d3fe3 100644 --- a/ng2-components/ng2-alfresco-core/src/components/context-menu-holder.component.ts +++ b/ng2-components/ng2-alfresco-core/src/components/context-menu-holder.component.ts @@ -69,7 +69,7 @@ import { ContextMenuService } from './../services/context-menu.service'; export class ContextMenuHolderComponent { links = []; isShown = false; - private mouseLocation :{ left: number, top: number} = { left:0, top:0 }; + private mouseLocation: { left: number, top: number } = { left: 0, top: 0 }; constructor( private _contextMenuService: ContextMenuService) { @@ -93,9 +93,11 @@ export class ContextMenuHolderComponent { this.isShown = true; this.links = links; - this.mouseLocation = { - left: e.clientX, - top: e.clientY - }; + if (e) { + this.mouseLocation = { + left: e.clientX, + top: e.clientY + }; + } } } diff --git a/ng2-components/ng2-alfresco-core/src/components/context-menu.directive.spec.ts b/ng2-components/ng2-alfresco-core/src/components/context-menu.directive.spec.ts new file mode 100644 index 0000000000..dc96f1f3d0 --- /dev/null +++ b/ng2-components/ng2-alfresco-core/src/components/context-menu.directive.spec.ts @@ -0,0 +1,71 @@ +/*! + * @license + * Copyright 2016 Alfresco Software, Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { describe, it, beforeEach } from '@angular/core/testing'; +import { ContextMenuDirective } from './context-menu.directive'; +import { ContextMenuService } from './../services/context-menu.service'; + +describe('ContextMenuDirective', () => { + + let contextMenuService; + let directive; + + beforeEach(() => { + contextMenuService = new ContextMenuService(); + directive = new ContextMenuDirective(contextMenuService); + }); + + it('should show menu via service', (done) => { + contextMenuService.show.subscribe(() => { + done(); + }); + + directive.onShowContextMenu(null); + }); + + it('should prevent default behavior', () => { + let event = new MouseEvent('click'); + spyOn(event, 'preventDefault').and.callThrough(); + + directive.onShowContextMenu(event); + expect(event.preventDefault).toHaveBeenCalled(); + }); + + it('should forward event to service', () => { + let event = new MouseEvent('click'); + + contextMenuService.show.subscribe(e => { + expect(e.event).toBeDefined(); + expect(e.event).toBe(event); + }); + + directive.onShowContextMenu(event); + }); + + it('should forward menu items to service', () => { + let links = [{}, {}]; + directive.links = links; + + contextMenuService.show.subscribe(e => { + expect(e.obj).toBeDefined(); + expect(e.obj).toBe(links); + }); + + directive.onShowContextMenu(null); + }); + +}); diff --git a/ng2-components/ng2-alfresco-core/src/components/context-menu.directive.ts b/ng2-components/ng2-alfresco-core/src/components/context-menu.directive.ts index 440b324388..ae816ce374 100644 --- a/ng2-components/ng2-alfresco-core/src/components/context-menu.directive.ts +++ b/ng2-components/ng2-alfresco-core/src/components/context-menu.directive.ts @@ -31,8 +31,12 @@ export class ContextMenuDirective { constructor( private _contextMenuService: ContextMenuService) {} - onShowContextMenu(event: MouseEvent) { - this._contextMenuService.show.next({ event: event, obj: this.links }); - event.preventDefault(); + onShowContextMenu(event?: MouseEvent) { + if (this._contextMenuService) { + this._contextMenuService.show.next({event: event, obj: this.links}); + } + if (event) { + event.preventDefault(); + } } } diff --git a/ng2-components/ng2-alfresco-core/src/services/context-menu.service.spec.ts b/ng2-components/ng2-alfresco-core/src/services/context-menu.service.spec.ts new file mode 100644 index 0000000000..1ebdcede74 --- /dev/null +++ b/ng2-components/ng2-alfresco-core/src/services/context-menu.service.spec.ts @@ -0,0 +1,33 @@ +/*! + * @license + * Copyright 2016 Alfresco Software, Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { describe, it, beforeEach } from '@angular/core/testing'; +import { ContextMenuService } from './context-menu.service'; + +describe('ContextMenuService', () => { + + let service; + + beforeEach(() => { + service = new ContextMenuService(); + }); + + it('should setup default show subject', () => { + expect(service.show).toBeDefined(); + }); + +});