From 8c073494e527b2952f164ed73485bfcfdd45fbbe Mon Sep 17 00:00:00 2001 From: cryptogopher Date: Fri, 22 Nov 2019 22:43:11 +0100 Subject: [PATCH] Disallowed moving quantity into parent/child relationship if domains differ Generalized quantity up/down/left/right actions into 'move' --- app/controllers/quantities_controller.rb | 33 ++++++++----------- app/models/quantity.rb | 16 +++++++++ app/views/quantities/_list.html.erb | 41 +++--------------------- config/routes.rb | 2 +- init.rb | 2 +- 5 files changed, 36 insertions(+), 58 deletions(-) diff --git a/app/controllers/quantities_controller.rb b/app/controllers/quantities_controller.rb index 043d3fa..443df62 100644 --- a/app/controllers/quantities_controller.rb +++ b/app/controllers/quantities_controller.rb @@ -1,7 +1,7 @@ class QuantitiesController < ApplicationController before_action :init_session_filters before_action :find_project_by_project_id, only: [:index, :create, :filter] - before_action :find_quantity, only: [:destroy, :toggle, :up, :down, :left, :right] + before_action :find_quantity, only: [:destroy, :toggle, :move] before_action :authorize def index @@ -40,26 +40,19 @@ class QuantitiesController < ApplicationController render :toggle end - def up - @quantity.move_left if @quantity.left_sibling.present? - prepare_quantities - render :toggle - end + def move + direction = params[:direction].to_sym + case direction + when :up + @quantity.move_left + when :down + @quantity.move_right + when :left + @quantity.move_to_right_of(@quantity.parent) + when :right + @quantity.move_to_child_of(@quantity.left_sibling) + end if @quantity.movable?(direction) - def down - @quantity.move_right if @quantity.right_sibling.present? - prepare_quantities - render :toggle - end - - def left - @quantity.move_to_right_of(@quantity.parent) if @quantity.parent.present? - prepare_quantities - render :toggle - end - - def right - @quantity.move_to_child_of(@quantity.left_sibling) if @quantity.left_sibling.present? prepare_quantities render :toggle end diff --git a/app/models/quantity.rb b/app/models/quantity.rb index 7e6afe1..2124ae4 100644 --- a/app/models/quantity.rb +++ b/app/models/quantity.rb @@ -23,6 +23,22 @@ class Quantity < ActiveRecord::Base end end + def movable?(direction) + case direction + when :up + self.left_sibling.present? + when :down + self.right_sibling.present? + when :left + self.parent.present? + when :right + left = self.left_sibling + left.present? && (left.domain == self.domain) + else + false + end + end + def toggle_primary! self.toggle!(:primary) end diff --git a/app/views/quantities/_list.html.erb b/app/views/quantities/_list.html.erb index a546dba..160d583 100644 --- a/app/views/quantities/_list.html.erb +++ b/app/views/quantities/_list.html.erb @@ -32,50 +32,19 @@ <%= q.name %> + <% [:up, :down, :left, :right].each do |direction| %> <%= - if q.left_sibling.present? - link_to '', up_quantity_path(q), { + if q.movable?(direction) + link_to '', move_quantity_path(q, direction), { remote: true, method: :post, - class: "icon icon-move-up" - } - else - link_to '', '', {class: "icon"} - end - %> - <%= - if q.right_sibling.present? - link_to '', down_quantity_path(q), { - remote: true, - method: :post, - class: "icon icon-move-down" - } - else - link_to '', '', {class: "icon"} - end - %> - <%= - if q.parent.present? - link_to '', left_quantity_path(q), { - remote: true, - method: :post, - class: "icon icon-move-left" - } - else - link_to '', '', {class: "icon"} - end - %> - <%= - if q.left_sibling.present? - link_to '', right_quantity_path(q), { - remote: true, - method: :post, - class: "icon icon-move-right" + class: "icon icon-move-#{direction}" } else link_to '', '', {class: "icon"} end %> + <% end %> <%= q.domain %> <%= q.description %> diff --git a/config/routes.rb b/config/routes.rb index 990fd12..23707e3 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -20,7 +20,7 @@ resources :projects do resources :sources, :only => [:index, :create, :destroy] resources :quantities, :only => [:index, :create, :destroy] do post 'toggle', on: :member - post 'up', 'down', 'left', 'right', on: :member + post 'move/:direction', to: 'quantities#move', as: :move, on: :member get 'filter', on: :collection end resources :units, :only => [:index, :create, :destroy] diff --git a/init.rb b/init.rb index d16047f..6f81e53 100644 --- a/init.rb +++ b/init.rb @@ -27,7 +27,7 @@ Redmine::Plugin.register :body_tracking do :measurements => [:create, :destroy, :toggle], :ingredients => [:create, :destroy, :toggle, :import, :toggle_nutrient_column], :sources => [:create, :destroy], - :quantities => [:create, :destroy, :toggle, :up, :down, :left, :right], + :quantities => [:create, :destroy, :toggle, :move], :units => [:create, :destroy], }, require: :loggedin end