From ff9048fc054c1abe0bad30857e58e34ad7c70efd Mon Sep 17 00:00:00 2001 From: "G. Torres" Date: Thu, 17 Oct 2024 17:32:04 -0400 Subject: [PATCH 1/4] Adds Select All checkbox and functionality --- app/assets/javascripts/project.js | 52 ++++++++++++++++++++----------- app/models/user.rb | 1 - app/views/projects/show.html.erb | 4 +++ 3 files changed, 38 insertions(+), 19 deletions(-) diff --git a/app/assets/javascripts/project.js b/app/assets/javascripts/project.js index e8eae375..6b9c9135 100644 --- a/app/assets/javascripts/project.js +++ b/app/assets/javascripts/project.js @@ -1,29 +1,24 @@ document.addEventListener("turbolinks:load", function () { $("input[name='stories[]']").click(() => { - const selected = $("input[name='stories[]']:checked"); - const is_unlocked = $("#stories").data("unlocked"); - if (!is_unlocked) { - return; - } - - if (selected.length > 0) { - const ending = selected.length == 1 ? "y" : "ies"; - $("#bulk_delete") - .text(`Bulk Delete (${selected.length} Stor${ending})`) - .attr("aria-disabled", "false") - .prop("disabled", false); - } else { - $("#bulk_delete") - .text("Bulk Delete") - .attr("aria-disabled", "true") - .prop("disabled", true); - } + updateBulkDeleteStatus(); }); + $(".import-export-header").click(function () { $(this).children(".rotate").toggleClass("left"); }); + + $("#select_all").click((event) => { + let checked = event.target.checked; + + $("input[name='stories[]']").each((_, checkbox) => { + checkbox.checked = checked; + }) + + updateBulkDeleteStatus(); + }) + $("#bulk_delete").click((event) => { let stories_ids = []; $("input[name='stories[]']:checked").each((_, checkbox) => { @@ -118,3 +113,24 @@ function toggleCloneSubProjects(value) { .querySelectorAll("#sub-projects-to-clone input[type='checkbox']") .forEach((el) => (el.checked = value)); } + +function updateBulkDeleteStatus() { + const selected = $("input[name='stories[]']:checked"); + const is_unlocked = $("#stories").data("unlocked"); + if (!is_unlocked) { + return; + } + + if (selected.length > 0) { + const ending = selected.length == 1 ? "y" : "ies"; + $("#bulk_delete") + .text(`Bulk Delete (${selected.length} Stor${ending})`) + .attr("aria-disabled", "false") + .prop("disabled", false); + } else { + $("#bulk_delete") + .text("Bulk Delete") + .attr("aria-disabled", "true") + .prop("disabled", true); + } +} \ No newline at end of file diff --git a/app/models/user.rb b/app/models/user.rb index d0c96124..4289fb3e 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -3,5 +3,4 @@ class User < ApplicationRecord has_many :estimates has_many :comments - end diff --git a/app/views/projects/show.html.erb b/app/views/projects/show.html.erb index da676373..2d07773a 100644 --- a/app/views/projects/show.html.erb +++ b/app/views/projects/show.html.erb @@ -18,6 +18,10 @@ Best
Estimate Worst
Estimate +
+ + +
<%= link_unless_archived(@project, "Add a Story", new_project_story_path(@project), classes: "green") if is_unlocked?(@project) %> From d8dc43e7001f3249b2d370a0960cb29995427fc1 Mon Sep 17 00:00:00 2001 From: "G. Torres" Date: Thu, 17 Oct 2024 18:05:29 -0400 Subject: [PATCH 2/4] Adds indeterminate state if not all checkboxes are selected --- app/assets/javascripts/project.js | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/app/assets/javascripts/project.js b/app/assets/javascripts/project.js index 6b9c9135..f4b07ceb 100644 --- a/app/assets/javascripts/project.js +++ b/app/assets/javascripts/project.js @@ -1,6 +1,7 @@ document.addEventListener("turbolinks:load", function () { $("input[name='stories[]']").click(() => { updateBulkDeleteStatus(); + updateSelectAllStatus(); }); @@ -133,4 +134,20 @@ function updateBulkDeleteStatus() { .attr("aria-disabled", "true") .prop("disabled", true); } +} + +function updateSelectAllStatus() { + const selected = $("input[name='stories[]']:checked"); + const checkboxes = $("input[name='stories[]']"); + + if (selected.length == 0) { + $("#select_all")[0].checked = false; + $("#select_all")[0].indeterminate = false; + } else if (selected.length == checkboxes.length) { + $("#select_all")[0].checked = true; + $("#select_all")[0].indeterminate = false; + } else { + $("#select_all")[0].checked = false; + $("#select_all")[0].indeterminate = true; + } } \ No newline at end of file From de007bbbe3b2e52bd1572637566006b4516a0612 Mon Sep 17 00:00:00 2001 From: "G. Torres" Date: Fri, 18 Oct 2024 16:54:36 -0400 Subject: [PATCH 3/4] Adds specs to test Select All checkbox --- spec/features/stories_manage_spec.rb | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/spec/features/stories_manage_spec.rb b/spec/features/stories_manage_spec.rb index 5048201f..590d8866 100644 --- a/spec/features/stories_manage_spec.rb +++ b/spec/features/stories_manage_spec.rb @@ -68,6 +68,21 @@ expect(page).to have_content "Story updated!" end + it "allows me to select all stories" do + visit project_path(id: project.id) + check("Select All") + + expect(page).to have_checked_field(name: "stories[]") + end + + it "allows me to unselect all stories" do + visit project_path(id: project.id) + check("Select All") + uncheck("Select All") + + expect(page).to have_unchecked_field(name: "stories[]") + end + it "allows me to delete a story" do visit project_path(id: project.id) From 2d7703cc1b0656f3b2a7b19723a7cae0d64ca48a Mon Sep 17 00:00:00 2001 From: "G. Torres" Date: Mon, 21 Oct 2024 10:59:06 -0400 Subject: [PATCH 4/4] Updates upload-artifact since version 2 was deprecated in June, and 3 will be deprecated at the end of November --- .github/workflows/tests.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index aaae696c..73b6f4d8 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -44,7 +44,7 @@ jobs: - name: Run RSpec run: | bundle exec rspec - - uses: actions/upload-artifact@v2 + - uses: actions/upload-artifact@v4 if: failure() with: name: Screenshots and logs