mirror of
https://github.com/scinote-eln/scinote-web.git
synced 2024-11-18 23:21:30 +08:00
174 lines
6 KiB
Ruby
174 lines
6 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
module StepElements
|
|
class ChecklistItemsController < ApplicationController
|
|
include ApplicationHelper
|
|
include StepsActions
|
|
|
|
before_action :load_vars
|
|
before_action :load_checklist_item, only: %i(update toggle destroy)
|
|
before_action :check_toggle_permissions, only: %i(toggle)
|
|
before_action :check_manage_permissions, only: %i(create update destroy)
|
|
|
|
def index
|
|
render json: @checklist.checklist_items, each_serializer: ChecklistItemSerializer, user: current_user
|
|
end
|
|
|
|
def create
|
|
checklist_item = @checklist.checklist_items.new(checklist_item_params.merge!(created_by: current_user))
|
|
new_items = []
|
|
ActiveRecord::Base.transaction do
|
|
new_items = checklist_item.save_multiline!(after_id: params[:after_id])
|
|
new_items.each do |item|
|
|
log_activity(
|
|
"#{@step.protocol.in_module? ? :task : :protocol}_step_checklist_item_added",
|
|
{
|
|
checklist_item: item.text,
|
|
checklist_name: @checklist.name
|
|
}
|
|
)
|
|
checklist_item_annotation(@step, item)
|
|
end
|
|
end
|
|
|
|
render json: new_items, each_serializer: ChecklistItemSerializer, user: current_user
|
|
rescue ActiveRecord::RecordInvalid
|
|
render json: { errors: checklist_item.errors }, status: :unprocessable_entity
|
|
end
|
|
|
|
def update
|
|
old_text = @checklist_item.text
|
|
@checklist_item.assign_attributes(
|
|
checklist_item_params.except(:position, :id).merge(last_modified_by: current_user)
|
|
)
|
|
new_items = []
|
|
ActiveRecord::Base.transaction do
|
|
new_items = @checklist_item.save_multiline!
|
|
new_items.each_with_index do |item, i|
|
|
log_activity(
|
|
"#{@step.protocol.in_module? ? :task : :protocol}_step_checklist_item_#{i.zero? ? 'edited' : 'added'}",
|
|
checklist_item: item.text,
|
|
checklist_name: @checklist.name
|
|
)
|
|
checklist_item_annotation(@step, item, old_text)
|
|
end
|
|
end
|
|
|
|
render json: new_items, each_serializer: ChecklistItemSerializer, user: current_user
|
|
rescue ActiveRecord::RecordInvalid
|
|
render json: { errors: @checklist_item.errors }, status: :unprocessable_entity
|
|
end
|
|
|
|
def toggle
|
|
@checklist_item.assign_attributes(
|
|
checklist_toggle_item_params.merge(last_modified_by: current_user)
|
|
)
|
|
|
|
if @checklist_item.save!
|
|
completed_items = @checklist_item.checklist.checklist_items.where(checked: true).count
|
|
all_items = @checklist_item.checklist.checklist_items.count
|
|
text_activity = smart_annotation_parser(@checklist_item.text).gsub(/\s+/, ' ')
|
|
type_of = if @checklist_item.saved_change_to_attribute(:checked).last
|
|
:check_step_checklist_item
|
|
else
|
|
:uncheck_step_checklist_item
|
|
end
|
|
log_activity(type_of,
|
|
checkbox: text_activity,
|
|
num_completed: completed_items.to_s,
|
|
num_all: all_items.to_s)
|
|
end
|
|
|
|
render json: @checklist_item, serializer: ChecklistItemSerializer, user: current_user
|
|
rescue ActiveRecord::RecordInvalid
|
|
render json: @checklist_item, serializer: ChecklistItemSerializer,
|
|
user: current_user,
|
|
status: :unprocessable_entity
|
|
end
|
|
|
|
def destroy
|
|
if @checklist_item.destroy
|
|
log_activity(
|
|
"#{@step.protocol.in_module? ? :task : :protocol}_step_checklist_item_deleted",
|
|
checklist_item: @checklist_item.text,
|
|
checklist_name: @checklist.name
|
|
)
|
|
render json: @checklist_item, serializer: ChecklistItemSerializer, user: current_user
|
|
else
|
|
render json: @checklist_item, serializer: ChecklistItemSerializer,
|
|
user: current_user,
|
|
status: :unprocessable_entity
|
|
end
|
|
end
|
|
|
|
def reorder
|
|
checklist_item = @checklist.checklist_items.find(params[:id])
|
|
ActiveRecord::Base.transaction do
|
|
insert_at = (@checklist.checklist_items.find_by(id: params[:after_id])&.position || 0)
|
|
checklist_item.insert_at(insert_at)
|
|
end
|
|
render json: params[:checklist_item_positions], status: :ok
|
|
rescue ActiveRecord::RecordInvalid
|
|
render json: { errors: checklist_item.errors }, status: :conflict
|
|
end
|
|
|
|
private
|
|
|
|
def check_toggle_permissions
|
|
if ActiveModel::Type::Boolean.new.cast(checklist_toggle_item_params[:checked])
|
|
render_403 unless can_check_my_module_steps?(@step.protocol.my_module)
|
|
else
|
|
render_403 unless can_uncheck_my_module_steps?(@step.protocol.my_module)
|
|
end
|
|
end
|
|
|
|
def check_manage_permissions
|
|
render_403 unless can_manage_step?(@step)
|
|
end
|
|
|
|
def checklist_item_params
|
|
params.require(:attributes).permit(:text, :position, :id, :with_paragraphs)
|
|
end
|
|
|
|
def checklist_toggle_item_params
|
|
params.require(:attributes).permit(:checked)
|
|
end
|
|
|
|
def load_vars
|
|
@step = Step.find_by(id: params[:step_id])
|
|
return render_404 unless @step
|
|
|
|
@protocol = @step.protocol
|
|
|
|
@checklist = @step.checklists.find_by(id: params[:checklist_id])
|
|
return render_404 unless @checklist
|
|
end
|
|
|
|
def load_checklist_item
|
|
@checklist_item = @checklist.checklist_items.find_by(id: params[:id])
|
|
return render_404 unless @checklist_item
|
|
end
|
|
|
|
def log_activity(type_of, message_items = {})
|
|
Activities::CreateActivityService.call(
|
|
activity_type: type_of,
|
|
owner: current_user,
|
|
subject: @step.protocol,
|
|
team: @step.protocol.team,
|
|
project: @step.protocol.in_module? ? @step.protocol.my_module.project : nil,
|
|
message_items: message_items.merge(step_message_items)
|
|
)
|
|
end
|
|
|
|
def step_message_items
|
|
items = {
|
|
step: @step.id,
|
|
step_position: { id: @step.id, value_for: 'position_plus_one' }
|
|
}
|
|
|
|
items[:my_module] = @step.protocol.my_module.id if @step.protocol.in_module?
|
|
|
|
items
|
|
end
|
|
end
|
|
end
|