diff --git a/src/OSFramework/DataGrid/Event/Feature/ContextMenuEventManager.ts b/src/OSFramework/DataGrid/Event/Feature/ContextMenuEventManager.ts index cba29dbd..bb7b8ac4 100644 --- a/src/OSFramework/DataGrid/Event/Feature/ContextMenuEventManager.ts +++ b/src/OSFramework/DataGrid/Event/Feature/ContextMenuEventManager.ts @@ -20,6 +20,9 @@ namespace OSFramework.DataGrid.Event.Feature { let event: Event.IEvent; switch (eventType) { + case ContextMenuEventType.Opening: + event = new OpeningContextMenu(); + break; case ContextMenuEventType.Toggle: event = new ToggleContextMenu(); break; @@ -34,7 +37,7 @@ namespace OSFramework.DataGrid.Event.Feature { if (this.events.has(event)) { this.events .get(event) - .trigger(this._contextMenu.grid.widgetId, this._contextMenu.isOpening, this._contextMenu.columnId); + .trigger(this._contextMenu.grid.widgetId, this._contextMenu.columnId, this._contextMenu.isOpening); } } } diff --git a/src/OSFramework/DataGrid/Event/Feature/ContextMenuEventType.enum.ts b/src/OSFramework/DataGrid/Event/Feature/ContextMenuEventType.enum.ts index 42083ac6..2bd38316 100644 --- a/src/OSFramework/DataGrid/Event/Feature/ContextMenuEventType.enum.ts +++ b/src/OSFramework/DataGrid/Event/Feature/ContextMenuEventType.enum.ts @@ -7,6 +7,13 @@ namespace OSFramework.DataGrid.Event.Feature { * @enum {number} */ export enum ContextMenuEventType { + /** + * When the menu is opening, but not yet visible/open. + */ + Opening = 'Opening', + /** + * When the menu was opened or closed. + */ Toggle = 'Toggle', } } diff --git a/src/OSFramework/DataGrid/Event/Feature/ContextMenuEvents.ts b/src/OSFramework/DataGrid/Event/Feature/ContextMenuEvents.ts index a1e21494..7df496a8 100644 --- a/src/OSFramework/DataGrid/Event/Feature/ContextMenuEvents.ts +++ b/src/OSFramework/DataGrid/Event/Feature/ContextMenuEvents.ts @@ -7,8 +7,23 @@ namespace OSFramework.DataGrid.Event.Feature { * @extends {OSFramework.DataGrid.Event.AbstractEvent} */ export class ToggleContextMenu extends Event.AbstractEvent { - public trigger(gridID: string, isOpening: boolean, columnId: string): void { + public trigger(gridID: string, columnId: string, isOpening: boolean): void { this.handlers.slice(0).forEach((h) => Helper.AsyncInvocation(h, gridID, isOpening, columnId)); } } + + /** + * Class that encapsulate the basic logic of triggering the event of opening the context menu. + * This event is synchronous to allow the developer to change the Context Menu items before the + * menu is visibel. The event be fired before the context menu is opened. + * + * @export + * @class OpeningContextMenu + * @extends {Event.AbstractEvent} + */ + export class OpeningContextMenu extends Event.AbstractEvent { + public trigger(gridID: string, columnId: string): void { + this.handlers.slice(0).forEach((h) => h(gridID, columnId)); + } + } } diff --git a/src/Providers/DataGrid/Wijmo/Features/ContextMenu.ts b/src/Providers/DataGrid/Wijmo/Features/ContextMenu.ts index 4d3c2956..01d24cde 100644 --- a/src/Providers/DataGrid/Wijmo/Features/ContextMenu.ts +++ b/src/Providers/DataGrid/Wijmo/Features/ContextMenu.ts @@ -60,6 +60,10 @@ namespace Providers.DataGrid.Wijmo.Feature { //Sort menu by order - Usefull when the developer inserts a IF statement hiding/showing elements this._sortMenuItems(this._rootMenuItems); + //If the menu is opening, let's refresh the itemsSource + if (this._isOpening) { + this._provider.itemsSource.refresh(); + } } /** @@ -89,6 +93,7 @@ namespace Providers.DataGrid.Wijmo.Feature { if (e.isDroppedDown) { // It is easier to understand if it will open instead of analysing if the menu is dropped down. this._isOpening = false; + //Trigger the event menu was closed. this._contextMenuEvents.trigger(OSFramework.DataGrid.Event.Feature.ContextMenuEventType.Toggle); } }, @@ -226,8 +231,9 @@ namespace Providers.DataGrid.Wijmo.Feature { } } } - - this._contextMenuEvents.trigger(OSFramework.DataGrid.Event.Feature.ContextMenuEventType.Toggle); + //Trigger the event Opening. It is synchronous to allow the developer to change the + //Context Menu items before the menu is visible. + this._contextMenuEvents.trigger(OSFramework.DataGrid.Event.Feature.ContextMenuEventType.Opening); //Filtering menuItem based on the clicked area =D this._provider.collectionView.filter = this._filterMenuItem.bind(this, e); @@ -239,6 +245,9 @@ namespace Providers.DataGrid.Wijmo.Feature { // cancel the browser's default menu e.preventDefault(); + + //Trigger the event menu was opened. + this._contextMenuEvents.trigger(OSFramework.DataGrid.Event.Feature.ContextMenuEventType.Toggle); } } @@ -381,6 +390,11 @@ namespace Providers.DataGrid.Wijmo.Feature { //Remove it from the Map this._menuItems.delete(menuItemId); + + //If the menu is opening, let's refresh the itemsSource + if (this._isOpening) { + this._provider.itemsSource.refresh(); + } } } }