From e3d3a92faa1bd8e55f27a85a4084c53d2777dbd5 Mon Sep 17 00:00:00 2001 From: Eugene Burmakin Date: Sat, 26 Jul 2025 14:41:03 +0200 Subject: [PATCH] Hide "Delete Selected" button when no points are selected. --- CHANGELOG.md | 1 + app/controllers/points_controller.rb | 4 ++++ .../controllers/checkbox_select_all_controller.js | 13 ++++++++++++- app/views/points/index.html.erb | 7 ++++--- 4 files changed, 21 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 549c693d..eaeeb9a6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,6 +16,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/). - The Warden error in jobs is now fixed. #1556 - The Live Map setting is now respected. - The Live Map info modal is now displayed. #665 +- The "Delete Selected" button is now hidden when no points are selected. #1025 diff --git a/app/controllers/points_controller.rb b/app/controllers/points_controller.rb index 55d56315..3c21bcdc 100644 --- a/app/controllers/points_controller.rb +++ b/app/controllers/points_controller.rb @@ -18,6 +18,10 @@ class PointsController < ApplicationController end def bulk_destroy + redirect_to points_url(preserved_params), + alert: 'No points selected.', + status: :see_other and return if params[:point_ids].blank? + current_user.tracked_points.where(id: params[:point_ids].compact).destroy_all redirect_to points_url(preserved_params), notice: 'Points were successfully destroyed.', diff --git a/app/javascript/controllers/checkbox_select_all_controller.js b/app/javascript/controllers/checkbox_select_all_controller.js index 1b542f84..1aaf26bc 100644 --- a/app/javascript/controllers/checkbox_select_all_controller.js +++ b/app/javascript/controllers/checkbox_select_all_controller.js @@ -2,11 +2,12 @@ import BaseController from "./base_controller" // Connects to data-controller="checkbox-select-all" export default class extends BaseController { - static targets = ["parent", "child"] + static targets = ["parent", "child", "deleteButton"] connect() { this.parentTarget.checked = false this.childTargets.map(x => x.checked = false) + this.updateDeleteButtonVisibility() } toggleChildren() { @@ -15,6 +16,7 @@ export default class extends BaseController { } else { this.childTargets.map(x => x.checked = false) } + this.updateDeleteButtonVisibility() } toggleParent() { @@ -23,5 +25,14 @@ export default class extends BaseController { } else { this.parentTarget.checked = true } + this.updateDeleteButtonVisibility() + } + + updateDeleteButtonVisibility() { + const hasCheckedItems = this.childTargets.some(target => target.checked) + + if (this.hasDeleteButtonTarget) { + this.deleteButtonTarget.style.display = hasCheckedItems ? 'inline-block' : 'none' + } } } diff --git a/app/views/points/index.html.erb b/app/views/points/index.html.erb index fa5fa3b2..3896d6a2 100644 --- a/app/views/points/index.html.erb +++ b/app/views/points/index.html.erb @@ -48,7 +48,7 @@ <%= form_with url: bulk_destroy_points_path(params.permit!), method: :delete, id: :bulk_destroy_form do |f| %>
- <%= f.submit "Delete Selected", class: "px-4 py-2 bg-red-500 text-white rounded-md", data: { confirm: "Are you sure?", turbo_confirm: "Are you sure?" } %> + <%= f.submit "Delete Selected", class: "px-4 py-2 bg-red-500 text-white rounded-md", data: { confirm: "Are you sure?", turbo_confirm: "Are you sure?", checkbox_select_all_target: "deleteButton" }, style: "display: none;" %>
<%= page_entries_info @points, entry_name: 'point' %>
@@ -64,14 +64,15 @@ <%= label_tag do %> - Select all <%= check_box_tag 'Select all', id: :select_all_points, data: { checkbox_select_all_target: 'parent', action: 'change->checkbox-select-all#toggleChildren' - } + }, + class: 'mr-2' %> + Select all <% end %>