Feature Overview¶
Motivation¶
Two tab levels exist in the Pulse Dashboard:
1. Core module tabs live in tcMain (the main form's outer tab control). Each one is an Executive / Financial / Customer Service / Sales & Marketing / Inventory / Purchasing / Production / MRP / Analytical Dashboard module.
2. Pulse reporting tabs live inside each core module's inner MyTabControl. Each one is a single dashboard.
Pulse reporting tabs already had a fully-featured right-click context menu on their headers, served by FPulseTab_Popup and wired through MyTabPage.DefinePopContextMenu. The actions exposed there (move tab left/right, clone tab, delete tab, save & share tab, etc.) make sense at the tab level.
Before this change, right-clicking a core module tab header in tcMain would either show nothing or — depending on layout state — show the Pulse reporting tab popup. Either way it was wrong: the actions on offer applied to a single tab, not to a whole module.
Before / after¶
BeforeAfter
Right-click on a core module tab header → either nothing happens, or the Pulse-tab popup appears with mostly-irrelevant options (Move Tab Left, Delete Tab, etc.) that operate on a non-existent active tab.
Right-click on a core module tab header → a dedicated module-level popup appears with five items: - Refresh Module - Reset Module to Default Settings… - Save and Share Module… - Publish Module… - Load Module from File…
The popup caption shows Module: <module name> so the user can confirm which module they're acting on.
Design constraints¶
The implementation follows three constraints set by the existing codebase:
1. Mirror the existing Pulse tab popup pattern. The Pulse popup uses a Shared (singleton) form whose PopupMenu1 is reused for every tab. The core module popup follows the same singleton pattern.
2. Don't break the Pulse tab popup. All dispatch happens inside MyTabPage.ShowContextMenu. The existing Pulse path is left intact — the new branch only fires when PageType = ePageType.CORE_MODULE.
3. Reuse existing infrastructure. No new save/share or publish plumbing was added. Save and Share Module produces a CSaveAndShareFile with SettingsType.CORE_MODULE, which CPulseConnection.ProcessPublishQueue already knows how to handle on the receiving side.
Surface of change¶
| Layer | Change |
|---|---|
| UI | New context menu on core module tab headers |
| Form | FCoreModule_Popup — empty stub replaced with full code-behind |
| Designer | FCoreModule_Popup.Designer.vb — two new bar buttons, repaired LinksPersistInfo |
| Tab routing | MyTabPage.ShowContextMenu — branches on PageType |
| Tab routing (bug) | MyTabControl.HandletabMouseClick — early-exit guard removed |