feat: Rework how selected actions to perform pause,resume work and add a bulk-delete option#6676
Conversation
|
Hello! Thank you for your contribution 👋 As this is your first contribution, please be sure to check out our In particular:
If you have any design or process questions, feel free to ask them right here in this pull request - unclear documentation is a bug too. Thanks for lending a paw to Uptime Kuma 🐻 |
There was a problem hiding this comment.
Pull request overview
This pull request adds a Delete action to the multi-select actions menu for monitors, enabling users to delete multiple monitors at once. The PR restructures the monitor list header layout to accommodate the new action dropdown.
Changes:
- Added a Delete option to the Actions dropdown menu alongside existing Pause and Resume actions
- Reorganized the header layout with a checkbox for selection mode, filter controls, and an Actions dropdown button
- Added confirmation dialog and success/error handling for bulk deletion operations
- Added toast notifications for pause, resume, and delete operations showing the count of affected monitors
Reviewed changes
Copilot reviewed 3 out of 3 changed files in this pull request and generated 3 comments.
| File | Description |
|---|---|
| src/lang/en.json | Added new translation keys for Actions menu, confirmation messages, and operation success messages |
| src/components/MonitorListFilter.vue | Removed clear filters button from filter component (likely moved elsewhere in the layout) |
| src/components/MonitorList.vue | Added Delete action to dropdown menu, reorganized header layout, implemented bulk deletion logic with confirmation and toast notifications |
CommanderStorm
left a comment
There was a problem hiding this comment.
Nice progress.
I think there is some light refactiring which is still nessesary before this is mergable.
On mobile, this breaks particularly nastily with the search bar being moved far of the screen.
Apparently, my screenshottting tool does not currently work, otherwise I would attach a screenshot here
On mobile, we should scale like this (open to oppinons):
- search bar
- select + filter
- if selected: actions
I know this is a bit of a refactoring, but the following would also work and is less of a refactoring:
- select + filter
- search bar
- if selected: actions
src/lang/en.json
Outdated
| "auto-select": "Auto Select", | ||
| "Select": "Select", | ||
| "Actions": "Actions", | ||
| "selectedMonitorCount": "Selected: {0}", |
There was a problem hiding this comment.
I think this looks nicer, what do you think?
Maybe we could also reclaim the space this uses and move this into the "Actions button" -> renmae it to "modify {count} monitors"
| "selectedMonitorCount": "Selected: {0}", | |
| "selectedMonitorCount": "{0} selected", |
CommanderStorm
left a comment
There was a problem hiding this comment.
I have 2-3 remaining comments.
Most are just code suggestions, so should be fairly simple to apply.
I think the @media adjustments need slight tuning up, but otherwise LGTM.
src/components/MonitorList.vue
Outdated
| this.$root.toastSuccess(this.$tc("deletedMonitorsMsg", successCount)); | ||
| } | ||
| if (errorCount > 0) { | ||
| this.$root.toastError(this.$t("bulkDeleteErrorMsg", [errorCount])); |
There was a problem hiding this comment.
| this.$root.toastError(this.$t("bulkDeleteErrorMsg", [errorCount])); | |
| this.$root.toastError(this.$tc("bulkDeleteErrorMsg", errorCount)); |
src/lang/en.json
Outdated
| "deletedMonitorsMsg": "Deleted {n} monitor | Deleted {n} monitors", | ||
| "noMonitorsPausedMsg": "No monitors paused (none were active)", | ||
| "noMonitorsResumedMsg": "No monitors resumed (none were inactive)", | ||
| "bulkDeleteErrorMsg": "Failed to delete {0} monitor(s)", |
There was a problem hiding this comment.
I think you missed this one
| "bulkDeleteErrorMsg": "Failed to delete {0} monitor(s)", | |
| "bulkDeleteErrorMsg": "Failed to delete {n} monitor | Failed to delete {n} monitors", |
src/lang/en.json
Outdated
| "Select": "Select", | ||
| "selectedMonitorCount": "Selected: {0}", | ||
| "Actions": "Actions", | ||
| "selectedMonitorCount": "selected: {n} | selected: {n}", |
There was a problem hiding this comment.
🤔 You did not comment on the previos suggestion, is this here better?
I am very open to a "No, I don't think so".
I just would like to know your oppinon.
Not sure if a language translates this differntly, but fair to change it like this
| "selectedMonitorCount": "selected: {n} | selected: {n}", | |
| "selectedMonitorCount": "{n} selected | {n} selected", |
There was a problem hiding this comment.
yeah sorry i missed that i think it was suggestion from your side yeah this message LGTM so, i modified this
src/components/MonitorList.vue
Outdated
| gap: 8px; | ||
| padding: 10px; | ||
|
|
||
| @media (max-width: 550px) { |
There was a problem hiding this comment.
due to how our UI does responsivitiy, I think the flat 550 you used here is a bit too flat after checking it out
I think this works in these fairly specific ranges only, so adusting the added media queries as such should do the trick
- 550..769
- 1150..1199
- 1500...
| max-width: 100%; | ||
| width: 100%; |
There was a problem hiding this comment.
This seems to not be working to 100%, since the outer form is limiting this elements size.
Could you also add the max-width to the outer form?
This is a really nice touch.
src/components/MonitorList.vue
Outdated
| v-model="selectAll" | ||
| class="form-check-input" | ||
| type="checkbox" | ||
| :aria-label="$t('selectAllMonitors')" |
There was a problem hiding this comment.
| :aria-label="$t('selectAllMonitors')" | |
| :aria-label="selectAll ? $t('selectAllMonitorsAria') : $t('deselectAllMonitorsAria')" |
src/lang/en.json
Outdated
| "Actions": "Actions", | ||
| "selectedMonitorCount": "selected: {n} | selected: {n}", | ||
| "selectMonitorMsg": "Select monitors to perform actions", | ||
| "selectAllMonitors": "Select/Deselect all monitors", |
There was a problem hiding this comment.
Lets be just slightly more helpfull to our visually impaired users 😉
(I am sure this would be fairly badly translated as well)
| "selectAllMonitors": "Select/Deselect all monitors", | |
| "selectAllMonitorsAria": "Select all monitors", | |
| "deselectAllMonitorsAria": "Deselect all monitors", |
src/components/MonitorList.vue
Outdated
| :aria-label="$t('Select')" | ||
| /> | ||
| <input | ||
| v-if="selectMode" |
There was a problem hiding this comment.
| v-if="selectMode" | |
| v-else |
|
once check this changes i cahnged the |
CommanderStorm
left a comment
There was a problem hiding this comment.
Those @media ranges don't seem to work entirely well.
I think inverting them fixes the issue, lets see


Summary
This pull request adds a Delete action to the existing multi-select actions menu.
Currently, when multiple items are selected, only Pause and Resume actions are available. Adding Delete will make it easier to perform bulk deletions when needed.
📑 Related Issues / Pull Requests
The related feature-request issue where this idea was proposed:
🔖 Feature Description
Currently, Uptime Kuma supports only Pause and Resume actions when multiple monitors are selected.
Adding a Delete action will allow users to remove multiple monitors at once, improving usability and workflow.
✔️ Solution
The Delete option has been implemented alongside the existing pause/resume actions in the side menu bar when multiple items are selected.
❓ Alternatives
No alternative solutions have been proposed so far.
📝 Additional Context
No additional context.
Please follow this checklist to avoid unnecessary back and forth (click to expand)