diff --git a/app/views/admin/submissions/_archive.html.erb b/app/views/admin/submissions/_archive.html.erb index d32126aa4..c5e4f2f5f 100644 --- a/app/views/admin/submissions/_archive.html.erb +++ b/app/views/admin/submissions/_archive.html.erb @@ -1,8 +1,8 @@ -<%= link_to unarchive_admin_form_submission_path(submission.form, submission), +<%= link_to archive_admin_form_submission_path(submission.form, submission), id: "archive-submission-#{submission.id}", - class: "text-secondary ", - "aria-label" => "Un-archive submission #{submission.id}", - title: "Un-archive submission #{submission.id}", + class: "text-base", + "aria-label" => "Archive submission #{submission.id}", + title: "Archive submission #{submission.id}", data: { confirm: 'Are you sure?' }, method: :post, remote: true, diff --git a/app/views/admin/submissions/_archive_button.html.erb b/app/views/admin/submissions/_archive_button.html.erb new file mode 100644 index 000000000..7d5241bcf --- /dev/null +++ b/app/views/admin/submissions/_archive_button.html.erb @@ -0,0 +1,11 @@ + <%= link_to archive_admin_form_submission_path(form, submission, context: :show), + id: "archive-submission-#{submission.id}", + class: "usa-button usa-button--outline", + "aria-label" => "Archive submission #{submission.id}", + title: "Archive submission #{submission.id}", + data: { confirm: 'Are you sure?' }, + method: :post, + remote: true, + rel: "nofollow" do %> + + <% end %> diff --git a/app/views/admin/submissions/_delete.html.erb b/app/views/admin/submissions/_delete.html.erb index ebda5bc77..633b27dba 100644 --- a/app/views/admin/submissions/_delete.html.erb +++ b/app/views/admin/submissions/_delete.html.erb @@ -1,8 +1,8 @@ -<%= link_to undelete_admin_form_submission_path(submission.form, submission), +<%= link_to delete_admin_form_submission_path(submission.form, submission), id: "delete-submission-#{submission.id}", - class: "text-secondary ", - "aria-label" => "Un-delete submission #{submission.id}", - title: "Un-delete submission #{submission.id}", + class: "text-base", + "aria-label" => "Delete submission #{submission.id}", + title: "Delete submission #{submission.id}", data: { confirm: 'Are you sure?' }, method: :post, remote: true, diff --git a/app/views/admin/submissions/_delete_button.html.erb b/app/views/admin/submissions/_delete_button.html.erb new file mode 100644 index 000000000..6bf5718be --- /dev/null +++ b/app/views/admin/submissions/_delete_button.html.erb @@ -0,0 +1,12 @@ + <%= link_to admin_form_submission_path(form, submission, context: :show), + id: "delete-submission-#{submission.id}", + class: "usa-button usa-button--secondary", + "aria-label" => "Delete submission #{submission.id}", + title: "Delete submission #{submission.id}", + method: :delete, + remote: true, + data: { confirm: 'Are you sure?' }, + rel: "nofollow" do %> + + Delete + <% end %> diff --git a/app/views/admin/submissions/_flag.html.erb b/app/views/admin/submissions/_flag.html.erb index 7759967ac..aed2c2d64 100644 --- a/app/views/admin/submissions/_flag.html.erb +++ b/app/views/admin/submissions/_flag.html.erb @@ -1,8 +1,8 @@ -<%= link_to unflag_admin_form_submission_path(submission.form, submission), +<%= link_to flag_admin_form_submission_path(submission.form, submission), id: "flag-submission-#{submission.id}", - class: "text-secondary", - "aria-label" => "Un-flag submission #{submission.id}", - title: "Un-flag submission #{submission.id}", + class: "text-base", + "aria-label" => "Flag submission #{submission.id}", + title: "Flag submission #{submission.id}", data: { confirm: 'Are you sure?' }, method: :post, remote: true, diff --git a/app/views/admin/submissions/_flag_button.html.erb b/app/views/admin/submissions/_flag_button.html.erb new file mode 100644 index 000000000..3a72a156c --- /dev/null +++ b/app/views/admin/submissions/_flag_button.html.erb @@ -0,0 +1,11 @@ +<%= link_to flag_admin_form_submission_path(form, submission, context: context), + id: "flag-submission-#{submission.id}", + class: "usa-button usa-button--outline", + "aria-label" => "Flag submission #{submission.id}", + title: "Flag submission #{submission.id}", + method: :post, + remote: true, + data: { confirm: 'Are you sure?' }, + rel: "nofollow" do %> + +<% end %> diff --git a/app/views/admin/submissions/_mark.html.erb b/app/views/admin/submissions/_mark.html.erb index 84b256845..e9f4b7063 100644 --- a/app/views/admin/submissions/_mark.html.erb +++ b/app/views/admin/submissions/_mark.html.erb @@ -1,8 +1,8 @@ -<%= link_to unmark_admin_form_submission_path(submission.form, submission), +<%= link_to mark_admin_form_submission_path(submission.form, submission), id: "mark-submission-#{submission.id}", - class: "text-secondary ", - "aria-label" => "Un-mark submission #{submission.id} as spam", - title: "Un-mark submission #{submission.id} as spam", + class: "text-base", + "aria-label" => "Mark submission #{submission.id} as spam", + title: "Mark submission #{submission.id} as spam", data: { confirm: 'Are you sure?' }, method: :post, remote: true, diff --git a/app/views/admin/submissions/_mark_button.html.erb b/app/views/admin/submissions/_mark_button.html.erb new file mode 100644 index 000000000..b6e5f0dbf --- /dev/null +++ b/app/views/admin/submissions/_mark_button.html.erb @@ -0,0 +1,10 @@ +<%= link_to mark_admin_form_submission_path(form, submission, context: context), + id: "mark-submission-#{submission.id}", + class: "usa-button usa-button--outline", + "aria-label" => "Mark submission #{submission.id} as spam", + title: "Mark submission #{submission.id} as spam", + method: :post, + remote: true, data: { confirm: 'Are you sure?' }, + rel: "nofollow" do %> + +<% end %> diff --git a/app/views/admin/submissions/_submissions.html.erb b/app/views/admin/submissions/_submissions.html.erb index 58b131918..1147d6031 100644 --- a/app/views/admin/submissions/_submissions.html.erb +++ b/app/views/admin/submissions/_submissions.html.erb @@ -139,30 +139,30 @@ tr .actions a:hover {
- <%= link_to admin_form_submission_path(@form, @submission), class: "usa-button usa-button--secondary", method: :delete, remote: true, data: { confirm: 'Are you sure?' } do %> - - - Delete this response - <% end %> +
+ + <%- if @submission.flagged? %> + <%= render "admin/submissions/unflag_button", form: @form, submission: @submission, context: :show %> + <% else %> + <%= render "admin/submissions/flag_button", form: @form, submission: @submission, context: :show %> + <% end %> + + + + <%- if @submission.spam? %> + <%= render "admin/submissions/unmark_button", form: @form, submission: @submission, context: :show %> + <% else %> + <%= render "admin/submissions/mark_button", form: @form, submission: @submission, context: :show %> + <% end %> + + + <%- if @submission.archived? %> - <%= link_to unarchive_admin_form_submission_path(@form, @submission), class: "usa-button usa-button--outline", method: :post, remote: true, data: { confirm: 'Are you sure?' } do %> - - - Unarchive response - <% end %> + <%= render "admin/submissions/unarchive_button", form: @form, submission: @submission, context: :show %> <% else %> - <%= link_to archive_admin_form_submission_path(@form, @submission), class: "usa-button usa-button--outline", method: :post, remote: true, data: { confirm: 'Are you sure?' } do %> - - - Archive response - <% end %> + <%= render "admin/submissions/archive_button", form: @form, submission: @submission, context: :show %> <% end %> + -
+ + <%- if @submission.deleted? %> + <%= render "admin/submissions/undelete_button", { form: @form, submission: @submission, context: :show } %> + <% else %> + <%= render "admin/submissions/delete_button", { form: @form, submission: @submission, context: :show } %> + <% end %> + + + <% end %> diff --git a/app/views/admin/submissions/unarchive.js.erb b/app/views/admin/submissions/unarchive.js.erb index bc05d5a2b..6cc9cb46d 100644 --- a/app/views/admin/submissions/unarchive.js.erb +++ b/app/views/admin/submissions/unarchive.js.erb @@ -1 +1,6 @@ -$(".response[data-id='<%= @submission.uuid %>'] .archived").html("<%= j(render 'unarchive', submission: @submission) %>") + +<% if params[:context] == "show" %> +$(".response[data-id='<%= @submission.uuid %>'] .archived").html("<%= j(render 'archive_button', form: @form, submission: @submission, context: :show) %>") +<% else %> +$(".response[data-id='<%= @submission.uuid %>'] .archived").html("<%= j(render 'archive', submission: @submission) %>") +<% end %> diff --git a/app/views/admin/submissions/undelete.js.erb b/app/views/admin/submissions/undelete.js.erb index f10bbf6e5..c4d05004a 100644 --- a/app/views/admin/submissions/undelete.js.erb +++ b/app/views/admin/submissions/undelete.js.erb @@ -1 +1,5 @@ -$(".response[data-id='<%= @submission.uuid %>'] .deleted").html("<%= j(render 'undeleted', submission: @submission) %>") +<% if params[:context] == "show" %> +$(".response[data-id='<%= @submission.uuid %>'] .deleted").html("<%= j(render 'delete_button', form: @form, submission: @submission, context: :show) %>") +<% else %> +$(".response[data-id='<%= @submission.uuid %>'] .deleted").html("<%= j(render 'delete', submission: @submission) %>") +<% end %> diff --git a/app/views/admin/submissions/unflag.js.erb b/app/views/admin/submissions/unflag.js.erb index bb9d188cf..324af771b 100644 --- a/app/views/admin/submissions/unflag.js.erb +++ b/app/views/admin/submissions/unflag.js.erb @@ -1 +1,5 @@ -$(".response[data-id='<%= @submission.uuid %>'] .flagged").html("<%= j(render 'unflag', submission: @submission) %>") +<% if params[:context] == "show" %> +$(".response[data-id='<%= @submission.uuid %>'] .flagged").html("<%= j(render 'flag_button', form: @form, submission: @submission, context: :show) %>") +<% else %> +$(".response[data-id='<%= @submission.uuid %>'] .flagged").html("<%= j(render 'flag', submission: @submission) %>") +<% end %> diff --git a/app/views/admin/submissions/unmark.js.erb b/app/views/admin/submissions/unmark.js.erb index d7ee43b6d..427790c60 100644 --- a/app/views/admin/submissions/unmark.js.erb +++ b/app/views/admin/submissions/unmark.js.erb @@ -1 +1,5 @@ -$(".response[data-id='<%= @submission.uuid %>'] .marked").html("<%= j(render 'unmark', submission: @submission) %>") +<% if params[:context] == "show" %> + $(".response[data-id='<%= @submission.uuid %>'] .marked").html("<%= j(render 'mark_button', form: @form, submission: @submission, context: :show) %>") +<% else %> + $(".response[data-id='<%= @submission.uuid %>'] .marked").html("<%= j(render 'mark', submission: @submission) %>") +<% end %> diff --git a/db/migrate/20250226221548_versions_json.rb b/db/migrate/20250226221548_versions_json.rb index 2f94d9dd4..c3a8788e2 100644 --- a/db/migrate/20250226221548_versions_json.rb +++ b/db/migrate/20250226221548_versions_json.rb @@ -1,36 +1,8 @@ - class SafeYAML - def self.load(string) - return {} if string.nil? - - YAML.safe_load( - string, - permitted_classes: [ - Time, - Date, - ActiveSupport::TimeWithZone, - ActiveSupport::TimeZone - ], - aliases: true - ) - end -end - class VersionsJson < ActiveRecord::Migration[8.0] def change rename_column :versions, :object, :old_object rename_column :versions, :object_changes, :old_object_changes add_column :versions, :object, :jsonb add_column :versions, :object_changes, :jsonb - - PaperTrail::Version.where.not(old_object: nil).in_batches(of: 500, start: 1) do |batch| - batch.each do |version| - version.update_columns( - object: SafeYAML.load(version.old_object), - old_object: nil, - object_changes: SafeYAML.load(version.old_object_changes), - old_object_changes: nil, - ) - end - end end end diff --git a/spec/features/admin/submissions_spec.rb b/spec/features/admin/submissions_spec.rb index 0f81bb807..213e38916 100644 --- a/spec/features/admin/submissions_spec.rb +++ b/spec/features/admin/submissions_spec.rb @@ -385,14 +385,74 @@ end end - describe 'delete a Submission' do + describe 'flags and un-flags a Submission' do + context 'with one Submission' do + let!(:submission) { FactoryBot.create(:submission, form:) } + + before do + visit admin_form_submission_path(form, submission) + find(".flagged a").click + page.driver.browser.switch_to.alert.accept + end + + it 'successfully flags and un-flags a Submission' do + expect(page).to have_link("Unflag") + click_on "Unflag" + page.driver.browser.switch_to.alert.accept + expect(page).to have_css(".flagged a") + expect(page).to_not have_link("Unflag") + end + end + end + + describe 'mark and un-mark a Submission as spam' do + context 'with one Submission' do + let!(:submission) { FactoryBot.create(:submission, form:) } + + before do + visit admin_form_submission_path(form, submission) + find(".marked a").click + page.driver.browser.switch_to.alert.accept + end + + it 'successfully marks and un-marks a Submission as spam' do + expect(page).to have_link("Unmark as spam") + click_on "Unmark as spam" + page.driver.browser.switch_to.alert.accept + expect(page).to have_css(".marked a") + expect(page).to_not have_link("Unmark as spam") + end + end + end + + describe 'archive and un-archive a Submission' do + context 'with one Submission' do + let!(:submission) { FactoryBot.create(:submission, form:) } + + before do + visit admin_form_submission_path(form, submission) + find(".archived a").click + page.driver.browser.switch_to.alert.accept + end + + it 'successfully archives and un-archives a Submission' do + expect(page).to have_link("Un-archive") + click_on "Un-archive" + page.driver.browser.switch_to.alert.accept + expect(page).to have_css(".archived a") + expect(page).to_not have_link("Un-archive") + end + end + end + + describe 'delete and restore Submission' do context 'with one Submission' do let!(:submission) { FactoryBot.create(:submission, form:) } let!(:submission2) { FactoryBot.create(:submission, form:) } before do visit admin_form_submission_path(form, submission) - click_on 'Delete this response' + click_on 'Delete' page.driver.browser.switch_to.alert.accept end @@ -400,6 +460,11 @@ expect(page).to have_content('Viewing Responses for') expect(page.current_path).to eq(responses_admin_form_path(form)) expect(page.find_all('#submissions_table table tbody tr').size).to eq(1) + + visit admin_form_submission_path(form, submission) + click_on 'Restore' + page.driver.browser.switch_to.alert.accept + expect(page).to have_link("Delete") end end end