Skip to content

Commit

Permalink
Add delete button for questionnaire and slides
Browse files Browse the repository at this point in the history
  • Loading branch information
f-buerckel committed Mar 3, 2025
1 parent 3f94297 commit 3b206d3
Show file tree
Hide file tree
Showing 6 changed files with 150 additions and 15 deletions.
13 changes: 12 additions & 1 deletion app/controllers/vignettes/questionnaires_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ module Vignettes
class QuestionnairesController < ApplicationController
before_action :set_questionnaire,
only: [:take, :submit_answer, :edit, :publish, :export_answers,
:update_slide_position]
:update_slide_position, :destroy]
before_action :set_lecture, only: [:index, :new, :create]
before_action :check_take_accessibility, only: [:take, :submit_answer]
before_action :check_edit_accessibility,
Expand Down Expand Up @@ -139,6 +139,17 @@ def edit
render layout: "application_no_sidebar"
end

def destroy
@lecture = @questionnaire.lecture
if @questionnaire.destroy
redirect_to edit_lecture_path(@lecture),
notice: t("vignettes.questionnaire_deleted")
else
redirect_to edit_lecture_path(@lecture),
alert: t("vignettes.questionnaire_not_deleted")
end
end

private

def set_questionnaire
Expand Down
23 changes: 22 additions & 1 deletion app/controllers/vignettes/slides_controller.rb
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
module Vignettes
class SlidesController < ApplicationController
before_action :set_questionnaire
before_action :check_edit_accessibility, only: [:new, :create, :edit, :update]
before_action :check_edit_accessibility, only: [:new, :create, :edit, :update, :destroy]

def new
return if @questionnaire.published
Expand Down Expand Up @@ -46,6 +46,27 @@ def update
end
end

def destroy
@slide = @questionnaire.slides.find(params[:id])
position = @slide.position

begin
ActiveRecord::Base.transaction do
@slide.destroy

@questionnaire.slides.where("position > ?",
position).update_all("position = position - 1")

Check failure on line 58 in app/controllers/vignettes/slides_controller.rb

View workflow job for this annotation

GitHub Actions / RuboCop (Ruby)

Rails/SkipsModelValidations: Avoid using `update_all` because it skips validations.
end

redirect_to edit_questionnaire_path(@questionnaire),
notice: t("vignettes.slide_deleted")
rescue StandardError => e
Rails.logger.error("Slide deletion failed: #{e.message}")
redirect_to edit_questionnaire_path(@questionnaire),
alert: t("vignettes.slide_not_deleted")
end
end

private

def set_questionnaire
Expand Down
73 changes: 65 additions & 8 deletions app/views/vignettes/questionnaires/edit.html.erb
Original file line number Diff line number Diff line change
Expand Up @@ -6,14 +6,16 @@
<div class="d-flex justify-content-between align-items-center mb-3">
<h1 class="fs-4 fw-bold mb-0">Slides</h1>

<!-- Publish Questionnaire -->
<%= button_to @questionnaire.published ? 'Published' : 'Publish',
publish_questionnaire_path(@questionnaire),
method: :patch,
class: "btn #{@questionnaire.published ? 'btn-success' : 'btn-danger'}",
disabled: @questionnaire.published,
form_class: 'd-inline-block',
id: "vignettes-publish-btn" %>
<% unless @questionnaire.published %>
<button type="button"
class="btn btn-primary"
data-bs-toggle="modal"
data-bs-target="#publishModal">
Publish
</button>
<% else %>
<span class="btn btn-success disabled">Published</span>
<% end %>
</div>

<p>Drag the slides to change their order.</p>
Expand Down Expand Up @@ -53,3 +55,58 @@
<!-- Export -->
<%= button_to "Export answers", export_answers_questionnaire_path(@questionnaire), method: :get, class: 'btn btn-primary' %>
</div>

<div class="mt-5 border-top pt-4">
<div class="d-flex justify-content-between align-items-center">
<button type="button" class="btn btn-outline-danger" data-bs-toggle="modal" data-bs-target="#deleteQuestionnaireModal">
Delete Questionnaire
</button>
</div>
</div>

<!-- Delete Confirmation Modal -->
<div class="modal fade" id="deleteQuestionnaireModal" tabindex="-1" aria-labelledby="deleteQuestionnaireModalLabel" aria-hidden="true">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="deleteQuestionnaireModalLabel">Confirm Deletion</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body">
<p><%= t("vignettes.questionnaire_confirm_delete") %></p>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Cancel</button>
<%= button_to "Delete Questionnaire",
questionnaire_path(@questionnaire),
method: :delete,
class: "btn btn-danger"
%>
</div>
</div>
</div>
</div>

<!-- Publish Confirmation Modal -->
<div class="modal fade" id="publishModal" tabindex="-1" aria-labelledby="publishModalLabel" aria-hidden="true">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="publishModalLabel">Confirm Publication</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body">
<!-- TO DO: Write better message -->
<p>After publishing, you can only change typos and nothing else</p>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Cancel</button>
<%= button_to "Publish",
publish_questionnaire_path(@questionnaire),
method: :patch,
class: "btn btn-primary"
%>
</div>
</div>
</div>
</div>
44 changes: 41 additions & 3 deletions app/views/vignettes/slides/_form.html.erb
Original file line number Diff line number Diff line change
Expand Up @@ -20,9 +20,47 @@
<br>
<%= render partial: 'form_question', locals: { form: form } %>

<%= form.submit @slide.new_record? ? 'Create Slide' : 'Update Slide',
class: "btn btn-primary mt-3"
%>
<div class="d-flex justify-content-between align-items-center mt-3">
<%= form.submit @slide.new_record? ? 'Create Slide' : 'Update Slide',
class: "btn btn-primary"
%>

<% unless @slide.new_record? %>
<button type="button"
class="btn btn-danger"
data-bs-toggle="<%= @slide.questionnaire.published ? '' : 'modal' %>"
data-bs-target="#deleteModal<%= @slide.id %>"
<%= 'disabled' if @slide.questionnaire.published %>>
Delete Slide
</button>

<% end %>
</div>
<% end %>

<!-- Delete Confirmation Modal -->
<% unless @slide.new_record? %>
<div class="modal fade" id="deleteModal<%= @slide.id %>" tabindex="-1" aria-labelledby="deleteModalLabel" aria-hidden="true">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="deleteModalLabel">Confirm Deletion</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body">
<p><%= t("vignettes.slide_confirm_delete") %></p>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Cancel</button>
<%= button_to "Delete Slide",
questionnaire_slide_path(@questionnaire, @slide),
method: :delete,
class: "btn btn-danger"
%>
</div>
</div>
</div>
</div>
<% end %>

<%= javascript_include_tag 'vignettes/edit_slide' %>
8 changes: 8 additions & 0 deletions config/locales/en.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2521,6 +2521,14 @@ en:
not_published: 'Vignette could not be published.'
not_accessible: 'Vignette is not accessible.'
no_slides: "Vignette is empty"
questionnaire_deleted: 'Questionnaire was successfully deleted'
questionnaire_not_deleted: 'Questionnaire could not be deleted'
slide_deleted: 'Slide was successfully deleted.'
slide_not_deleted: 'Slide could not be deleted.'
slide_confirm_delete: 'Are you sure you want to delete this slide?
This action cannot be undone.'
questionnaire_confirm_delete: 'Are you sure you want to delete this questionnaire?
This will also delete all associated slides, answers and statistics'


external_link_lc: 'external link'
Expand Down
4 changes: 2 additions & 2 deletions config/routes.rb
Original file line number Diff line number Diff line change
Expand Up @@ -571,15 +571,15 @@
as: "take_questionnaire"

scope module: "vignettes", path: "" do
resources :questionnaires, only: [:create, :edit, :update] do
resources :questionnaires, only: [:create, :edit, :update, :destroy] do
member do
get :export_answers
post :submit_answer
patch :publish
patch :update_slide_position
end
resources :info_slides, only: [:new, :create, :edit, :update]
resources :slides, only: [:new, :create, :edit, :update] do
resources :slides, only: [:new, :create, :edit, :update, :destroy] do
resources :answers, only: [:new, :create]
end
end
Expand Down

0 comments on commit 3b206d3

Please sign in to comment.