From 73cf620960090bb7dccf18176c29368ead033a03 Mon Sep 17 00:00:00 2001 From: Oleksii Kriuchykhin Date: Mon, 14 Sep 2020 20:06:48 +0200 Subject: [PATCH 1/2] Add Completion and Uncompletion consequences [SCI-5004] --- app/assets/javascripts/protocols/steps.js.erb | 37 ------------------- app/controllers/steps_controller.rb | 13 +------ app/models/my_module.rb | 30 --------------- .../completion.rb | 12 ++++++ .../uncompletion.rb | 14 +++++++ config/initializers/extends.rb | 4 +- 6 files changed, 29 insertions(+), 81 deletions(-) create mode 100644 app/models/my_module_status_consequences/completion.rb create mode 100644 app/models/my_module_status_consequences/uncompletion.rb diff --git a/app/assets/javascripts/protocols/steps.js.erb b/app/assets/javascripts/protocols/steps.js.erb index d259cb8f1..ae4cbd0fb 100644 --- a/app/assets/javascripts/protocols/steps.js.erb +++ b/app/assets/javascripts/protocols/steps.js.erb @@ -24,38 +24,6 @@ }); } - // Complete mymodule - function complete_my_module_actions() { - var modal = $('#completed-task-modal'); - - modal.find('[data-action="complete"]') - .off().on().click(function(event) { - event.stopPropagation(); - event.preventDefault(); - event.stopImmediatePropagation(); - $.ajax({ - url: modal.data('url'), - type: 'GET', - success: function(data) { - var task_button = $("[data-action='complete-task']"); - task_button.attr('data-action', 'uncomplete-task'); - task_button.find('.btn') - .removeClass('btn-toggle').addClass('btn-default'); - $('.task-due-date').html(data.module_header_due_date); - $('.task-state-label').html(data.module_state_label); - task_button - .find('button') - .html(' ' + - data.task_button_title); - modal.modal('hide'); - }, - error: function() { - modal.modal('hide'); - } - }); - }); - } - // Sets callback for completing/uncompleting step function applyStepCompletedCallBack() { // First, remove old event handlers, as we use turbolinks @@ -79,11 +47,6 @@ button.attr("data-action", "uncomplete-step"); button.find(".btn").removeClass("btn-toggle").addClass("btn-default"); button.find("button").html(' ' + data.new_title); - - if (data.task_ready_to_complete) { - $('#completed-task-modal').modal('show'); - complete_my_module_actions(); - } } else { step.addClass("not-completed").removeClass("completed"); diff --git a/app/controllers/steps_controller.rb b/app/controllers/steps_controller.rb index fcd52c50e..c2075b2e5 100644 --- a/app/controllers/steps_controller.rb +++ b/app/controllers/steps_controller.rb @@ -321,10 +321,6 @@ class StepsController < ApplicationController @step.completed = completed if @step.save - if @protocol.in_module? - ready_to_complete = @protocol.my_module.check_completness_status - end - # Create activity if changed completed_steps = @protocol.steps.where(completed: true).count @@ -350,14 +346,7 @@ class StepsController < ApplicationController t('protocols.steps.options.uncomplete_title') end format.json do - if ready_to_complete && @protocol.my_module.uncompleted? - render json: { - task_ready_to_complete: true, - new_title: localized_title - }, status: :ok - else - render json: { new_title: localized_title }, status: :ok - end + render json: { new_title: localized_title }, status: :ok end else format.json { render json: {}, status: :unprocessable_entity } diff --git a/app/models/my_module.rb b/app/models/my_module.rb index 4b135931b..915695817 100644 --- a/app/models/my_module.rb +++ b/app/models/my_module.rb @@ -9,8 +9,6 @@ class MyModule < ApplicationRecord before_create :create_blank_protocol before_create :assign_default_status_flow - before_validation :set_completed, if: :my_module_status_id_changed? - before_validation :set_completed_on, if: :state_changed? before_save :exec_status_consequences, if: :my_module_status_id_changed? auto_strip_attributes :name, :description, nullify: false @@ -477,18 +475,6 @@ class MyModule < ApplicationRecord { x: 0, y: positions.last[1] + HEIGHT } end - # Check if my_module is ready to become completed - def check_completness_status - if protocol && protocol.steps.count > 0 - completed = true - protocol.steps.find_each do |step| - completed = false unless step.completed - end - return true if completed - end - false - end - def assign_user(user, assigned_by = nil) user_my_modules.create( assigned_by: assigned_by || user, @@ -506,22 +492,6 @@ class MyModule < ApplicationRecord private - def set_completed - return if my_module_status.blank? - - if my_module_status.final_status? - self.state = 'completed' - else - self.state = 'uncompleted' - end - end - - def set_completed_on - return if completed? && completed_on.present? - - self.completed_on = completed? ? DateTime.now : nil - end - def create_blank_protocol protocols << Protocol.new_blank_for_module(self) end diff --git a/app/models/my_module_status_consequences/completion.rb b/app/models/my_module_status_consequences/completion.rb new file mode 100644 index 000000000..4111f045c --- /dev/null +++ b/app/models/my_module_status_consequences/completion.rb @@ -0,0 +1,12 @@ +# frozen_string_literal: true + +# Just an example, to be replaced with an actual implementation +module MyModuleStatusConsequences + class Completion < MyModuleStatusConsequence + def call(my_module) + my_module.state = 'completed' + my_module.completed_on = DateTime.now + my_module.save! + end + end +end diff --git a/app/models/my_module_status_consequences/uncompletion.rb b/app/models/my_module_status_consequences/uncompletion.rb new file mode 100644 index 000000000..4d3a5e184 --- /dev/null +++ b/app/models/my_module_status_consequences/uncompletion.rb @@ -0,0 +1,14 @@ +# frozen_string_literal: true + +# Just an example, to be replaced with an actual implementation +module MyModuleStatusConsequences + class Uncompletion < MyModuleStatusConsequence + def call(my_module) + return unless my_module.state == 'completed' + + my_module.state = 'uncompleted' + my_module.completed_on = nil + my_module.save! + end + end +end diff --git a/config/initializers/extends.rb b/config/initializers/extends.rb index 1a72da2c7..bb87955c2 100644 --- a/config/initializers/extends.rb +++ b/config/initializers/extends.rb @@ -327,7 +327,7 @@ class Extends DEFAULT_FLOW_STATUSES = [ { name: 'Not started', color: '#406d86' }, - { name: 'In progress', color: '#0065ff' }, - { name: 'Completed', color: '#00b900' } + { name: 'In progress', color: '#0065ff', consequences: ['MyModuleStatusConsequences::Uncompletion'] }, + { name: 'Completed', color: '#00b900', consequences: ['MyModuleStatusConsequences::Completion'] } ] end From 57716fd89c85a25fe6494cffc81fb1173f40b8df Mon Sep 17 00:00:00 2001 From: Oleksii Kriuchykhin Date: Tue, 15 Sep 2020 11:19:25 +0200 Subject: [PATCH 2/2] Fix API and tests for new task completion logic [SCI-5004] --- app/controllers/api/v1/tasks_controller.rb | 4 ++-- spec/requests/api/v1/tasks_controller_spec.rb | 19 +++---------------- 2 files changed, 5 insertions(+), 18 deletions(-) diff --git a/app/controllers/api/v1/tasks_controller.rb b/app/controllers/api/v1/tasks_controller.rb index b3b28bb85..635082f88 100644 --- a/app/controllers/api/v1/tasks_controller.rb +++ b/app/controllers/api/v1/tasks_controller.rb @@ -60,13 +60,13 @@ module Api def task_params_create raise TypeError unless params.require(:data).require(:type) == 'tasks' - params.require(:data).require(:attributes).permit(%i(name x y description state)) + params.require(:data).require(:attributes).permit(%i(name x y description)) end def task_params_update raise TypeError unless params.require(:data).require(:type) == 'tasks' - params.require(:data).require(:attributes).permit(%i(name x y description state my_module_status_id)) + params.require(:data).require(:attributes).permit(%i(name x y description my_module_status_id)) end def load_task_for_managing diff --git a/spec/requests/api/v1/tasks_controller_spec.rb b/spec/requests/api/v1/tasks_controller_spec.rb index 99dabb623..24ff8d712 100644 --- a/spec/requests/api/v1/tasks_controller_spec.rb +++ b/spec/requests/api/v1/tasks_controller_spec.rb @@ -292,7 +292,7 @@ RSpec.describe 'Api::V1::TasksController', type: :request do end end - context 'task completion, when has valid params' do + context 'direct task completion disabled, when has valid params' do let(:request_body) do { data: { @@ -304,23 +304,10 @@ RSpec.describe 'Api::V1::TasksController', type: :request do } end - it 'returns status 200' do + it 'returns status 204, no changes to task' do action - expect(response).to have_http_status 200 - end - - it 'returns well formated response' do - action - - expect(json).to match( - hash_including( - data: hash_including( - type: 'tasks', - attributes: hash_including(state: 'completed') - ) - ) - ) + expect(response).to have_http_status 204 end end