Add the same menu items for subscriptions as for queues#880
Add the same menu items for subscriptions as for queues#880ErikMogensen wants to merge 2 commits into
Conversation
|
@claude, do a review of this handsome pr |
|
Claude finished @ErikMogensen's task in 2m 7s —— View job PR Review: Add the same menu items for subscriptions as for queues
Overall this is a clean, well-scoped PR that achieves its goal. The renames are sensible, the new code follows the established patterns in Observations1. Missing "Select All" in the subscription deadletter context menu
2. Indentation inconsistency at end of The last two field declarations and the closing braces have incorrect indentation relative to the rest of the file: // Current (incorrectly indented)
private System.Windows.Forms.PropertyGrid deadletterCustomPropertyGrid;
private System.Windows.Forms.ToolStripMenuItem resubmitDeadletterToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem resubmitMessageToolStripMenuItem;
}
}
3. In the subscription messages menu, the new item is ordered as: But in Minor UX inconsistency between the two controls' menus. 4. Pre-existing filename splitting bug (carried forward, not introduced here) Both the queue and subscription multi-save handlers use this pattern: // HandleSubscriptionControl.cs ~line 2953
var fileNameParts = saveFileDialog.FileName.Split('.').ToList();
var fileExtension = fileNameParts.Last();
fileNameParts.RemoveAt(fileNameParts.IndexOf(fileExtension)); // BUG: finds first match, not last
What's Good
|
There was a problem hiding this comment.
Pull request overview
This PR aligns the subscription (including subscription DLQ) message grid context menus with the queue message grid by adding missing actions (notably “save message text as file” and “select all”), and it also renames several queue deadletter menu item variables to drop the misleading “shared” wording.
Changes:
- Add context-menu actions in
HandleSubscriptionControlto save selected message body text to file (single + multi) and to select all messages. - Add corresponding ToolStrip menu items/wiring in the subscription control designer.
- Rename queue deadletter context menu strip + menu item fields to remove “Shared” from variable names.
Reviewed changes
Copilot reviewed 2 out of 4 changed files in this pull request and generated 3 comments.
| File | Description |
|---|---|
src/ServiceBusExplorer/Controls/HandleSubscriptionControl.cs |
Adds “save body as file” (single/multi) for messages and DLQ messages; adds “select all messages”; updates context-menu visibility logic. |
src/ServiceBusExplorer/Controls/HandleSubscriptionControl.Designer.cs |
Adds ToolStrip items and click wiring for the new subscription context-menu actions. |
src/ServiceBusExplorer/Controls/HandleQueueControl.cs |
Updates deadletter menu visibility wiring to use renamed (non-“shared”) menu item fields and context menu strip. |
src/ServiceBusExplorer/Controls/HandleQueueControl.Designer.cs |
Renames deadletter context menu strip + menu item fields; updates designer wiring accordingly. |
Files not reviewed (2)
- src/ServiceBusExplorer/Controls/HandleQueueControl.Designer.cs: Language not supported
- src/ServiceBusExplorer/Controls/HandleSubscriptionControl.Designer.cs: Language not supported
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
| foreach (var body in bodies) | ||
| { | ||
| count++; | ||
| var fileNameParts = saveFileDialog.FileName.Split('.').ToList(); | ||
| var fileExtension = fileNameParts.Last(); | ||
| fileNameParts.RemoveAt(fileNameParts.IndexOf(fileExtension)); | ||
| fileNameParts.Add($"({count}).{fileExtension}"); | ||
| var fileName = string.Join(".", fileNameParts); |
There was a problem hiding this comment.
The numbered-output filename generation is fragile: splitting the full path on '.' and removing the extension via IndexOf can remove the wrong segment when the filename contains multiple dots (e.g. "foo.txt.v1.txt") or the extension token appears earlier. Use Path.GetFileNameWithoutExtension/Path.GetExtension (or RemoveAt(fileNameParts.Count-1)) to build "{base}({count}){ext}" safely, preserving the directory portion.
| foreach (var body in bodies) | |
| { | |
| count++; | |
| var fileNameParts = saveFileDialog.FileName.Split('.').ToList(); | |
| var fileExtension = fileNameParts.Last(); | |
| fileNameParts.RemoveAt(fileNameParts.IndexOf(fileExtension)); | |
| fileNameParts.Add($"({count}).{fileExtension}"); | |
| var fileName = string.Join(".", fileNameParts); | |
| var selectedFileName = saveFileDialog.FileName; | |
| var directoryName = Path.GetDirectoryName(selectedFileName); | |
| var baseFileName = Path.GetFileNameWithoutExtension(selectedFileName); | |
| var fileExtension = Path.GetExtension(selectedFileName); | |
| foreach (var body in bodies) | |
| { | |
| count++; | |
| var numberedFileName = $"{baseFileName}({count}){fileExtension}"; | |
| var fileName = string.IsNullOrEmpty(directoryName) | |
| ? numberedFileName | |
| : Path.Combine(directoryName, numberedFileName); |
| var fileNameParts = saveFileDialog.FileName.Split('.').ToList(); | ||
| var fileExtension = fileNameParts.Last(); | ||
| fileNameParts.RemoveAt(fileNameParts.IndexOf(fileExtension)); | ||
| fileNameParts.Add($"({count}).{fileExtension}"); | ||
| var fileName = string.Join(".", fileNameParts); |
There was a problem hiding this comment.
Same issue here as in the messages bulk-save: generating numbered filenames by splitting on '.' and removing via IndexOf can produce incorrect paths when the chosen filename includes multiple dots. Prefer Path-based filename manipulation (GetDirectoryName + GetFileNameWithoutExtension + GetExtension) or at least remove the last segment rather than the first match.
| var fileNameParts = saveFileDialog.FileName.Split('.').ToList(); | |
| var fileExtension = fileNameParts.Last(); | |
| fileNameParts.RemoveAt(fileNameParts.IndexOf(fileExtension)); | |
| fileNameParts.Add($"({count}).{fileExtension}"); | |
| var fileName = string.Join(".", fileNameParts); | |
| var directoryName = Path.GetDirectoryName(saveFileDialog.FileName); | |
| var fileNameWithoutExtension = Path.GetFileNameWithoutExtension(saveFileDialog.FileName); | |
| var fileExtension = Path.GetExtension(saveFileDialog.FileName); | |
| var numberedFileName = $"{fileNameWithoutExtension}({count}){fileExtension}"; | |
| var fileName = string.IsNullOrEmpty(directoryName) | |
| ? numberedFileName | |
| : Path.Combine(directoryName, numberedFileName); |
| // saveSelectedDeadletteredMessageToolStripMenuItem | ||
| // | ||
| this.saveSelectedSharedDeadletteredMessageToolStripMenuItem.Name = "saveSelectedSharedDeadletteredMessageToolStripMenuItem"; | ||
| this.saveSelectedSharedDeadletteredMessageToolStripMenuItem.Size = new System.Drawing.Size(305, 22); | ||
| this.saveSelectedSharedDeadletteredMessageToolStripMenuItem.Text = "Save Selected Message"; | ||
| this.saveSelectedSharedDeadletteredMessageToolStripMenuItem.Click += new System.EventHandler(this.saveSelectedSharedDeadletteredMessageToolStripMenuItem_Click); | ||
| this.saveSelectedDeadletteredMessageToolStripMenuItem.Name = "saveSelectedDeadletteredMessageToolStripMenuItem"; | ||
| this.saveSelectedDeadletteredMessageToolStripMenuItem.Size = new System.Drawing.Size(305, 22); | ||
| this.saveSelectedDeadletteredMessageToolStripMenuItem.Text = "Save Selected Message"; | ||
| this.saveSelectedDeadletteredMessageToolStripMenuItem.Click += new System.EventHandler(this.saveSelectedSharedDeadletteredMessageToolStripMenuItem_Click); | ||
| // | ||
| // saveSelectedSharedDeadletteredMessageBodyAsFileToolStripMenuItem | ||
| // saveSelectedDeadletteredMessageBodyAsFileToolStripMenuItem | ||
| // | ||
| this.saveSelectedSharedDeadletteredMessageBodyAsFileToolStripMenuItem.Name = "saveSelectedSharedDeadletteredMessageBodyAsFileToolStripMenuItem"; | ||
| this.saveSelectedSharedDeadletteredMessageBodyAsFileToolStripMenuItem.Size = new System.Drawing.Size(305, 22); | ||
| this.saveSelectedSharedDeadletteredMessageBodyAsFileToolStripMenuItem.Text = "Save Selected Message Text as File"; | ||
| this.saveSelectedSharedDeadletteredMessageBodyAsFileToolStripMenuItem.Click += new System.EventHandler(this.saveSelectedSharedDeadletteredMessageBodyAsFileToolStripMenuItem_Click); | ||
| this.saveSelectedDeadletteredMessageBodyAsFileToolStripMenuItem.Name = "saveSelectedDeadletteredMessageBodyAsFileToolStripMenuItem"; | ||
| this.saveSelectedDeadletteredMessageBodyAsFileToolStripMenuItem.Size = new System.Drawing.Size(305, 22); | ||
| this.saveSelectedDeadletteredMessageBodyAsFileToolStripMenuItem.Text = "Save Selected Message Text as File"; | ||
| this.saveSelectedDeadletteredMessageBodyAsFileToolStripMenuItem.Click += new System.EventHandler(this.saveSelectedSharedDeadletteredMessageBodyAsFileToolStripMenuItem_Click); |
There was a problem hiding this comment.
These menu items were renamed to remove the "Shared" wording, but their Click handlers still point to methods named SharedDeadletter (e.g. saveSelectedSharedDeadletteredMessageToolStripMenuItem_Click). This mismatch makes it harder to understand/refactor the UI wiring; consider renaming the handler methods (and updating references) to match the new menu item names.
|
Looks like good feedback. I'll take a deeper look at it and update this PR later. |
There are several menu items that are missing from the message grid for dead-letter queue messages in subscriptions. This PR brings makes them available for subscriptions too.
Removed the word 'shared' from some menu items variable names since they weren't shared.
This causes some code duplication, but that will be handled in a separate PR.