diff --git a/app/controllers/order_articles_controller.rb b/app/controllers/order_articles_controller.rb index e9b3321b..9fc340a8 100644 --- a/app/controllers/order_articles_controller.rb +++ b/app/controllers/order_articles_controller.rb @@ -6,7 +6,7 @@ class OrderArticlesController < ApplicationController def new @order = Order.find(params[:order_id]) - @order_article = @order.order_articles.build + @order_article = @order.order_articles.build(params[:order_article]) end def create @@ -15,9 +15,7 @@ class OrderArticlesController < ApplicationController # If order_article is ordered and a new order_article is created, an error message will be # given mentioning that the article already exists, which is desired. @order_article = @order.order_articles.where(:article_id => params[:order_article][:article_id]).first - if @order_article and @order_article.units_to_order == 0 - @order_article.units_to_order = 1 # FIXME: this is ugly if used in the receive form - else + unless (@order_article and @order_article.units_to_order == 0) @order_article = @order.order_articles.build(params[:order_article]) end @order_article.save! diff --git a/app/helpers/deliveries_helper.rb b/app/helpers/deliveries_helper.rb index 03a8f3ec..b2b5e976 100644 --- a/app/helpers/deliveries_helper.rb +++ b/app/helpers/deliveries_helper.rb @@ -16,7 +16,7 @@ module DeliveriesHelper block_given? or block = Proc.new {|a| "#{a.name} (#{number_to_currency a.price}/#{a.unit})" } articles.map do |a| {:id => a.id, :text => block.call(a)} - end + end.unshift({:id => '', :text => ''}) end def articles_for_table(articles) diff --git a/app/models/order_article.rb b/app/models/order_article.rb index c11b49d5..79b18d99 100644 --- a/app/models/order_article.rb +++ b/app/models/order_article.rb @@ -208,7 +208,6 @@ class OrderArticle < ActiveRecord::Base def init_from_balancing if order.present? and order.finished? self.article_price = article.article_prices.first - self.units_to_order = 1 end end diff --git a/app/views/finance/balancing/new_on_order_article_create.js.erb b/app/views/finance/balancing/new_on_order_article_create.js.erb index 98dc223e..5e55a80a 100644 --- a/app/views/finance/balancing/new_on_order_article_create.js.erb +++ b/app/views/finance/balancing/new_on_order_article_create.js.erb @@ -1,9 +1,15 @@ // Handle more advanced DOM update after AJAX database manipulation. // See publish/subscribe design pattern in /doc. (function(w) { - $('#result_table').prepend( + $('#order_article_<%= @order_article.id %>').remove(); // just to be sure: remove table row which is added below + + $('#ordered-articles tr').removeClass('success'); + + var order_article_entry = $( '<%= j render('finance/balancing/order_article_result', order_article: @order_article) %>' - ); + ).addClass('success'); + + $('#result_table').prepend(order_article_entry); $('#summaryChangedWarning').show(); })(window); diff --git a/app/views/orders/_edit_amounts.html.haml b/app/views/orders/_edit_amounts.html.haml index c7a6496d..80933172 100644 --- a/app/views/orders/_edit_amounts.html.haml +++ b/app/views/orders/_edit_amounts.html.haml @@ -1,3 +1,5 @@ +- new_articles = (@order.supplier.articles rescue @order.articles) +- new_article_data = articles_for_select2(new_articles, @order_articles.map(&:article_id)) {|a| "#{a.name} (#{a.unit_quantity}тип#{a.unit})"} - content_for :javascript do :javascript @@ -31,7 +33,31 @@ $('input[data-units-expected]').each(function() { update_delta(this); }); + + init_add_article('#add_article'); }); + + function init_add_article(sel) { + $(sel).removeAttr('disabled').select2({ + placeholder: '#{j t('orders.add_article.title')}', + formatNoMatches: function(term) { return '#{j t('.no_articles_available')}';} + // TODO implement adding a new article, like in deliveries + }).on('change', function(e) { + var selectedArticle = $(e.currentTarget).select2('data'); + if(!selectedArticle) { + return false; + } + + $.ajax({ + url: '#{order_order_articles_path(@order)}', + type: 'post', + data: JSON.stringify({order_article: {article_id: selectedArticle.id}}), + contentType: 'application/json; charset=UTF-8' + }); + + $('#add_article').select2('data', null); + }).select2('data', null); + } %table#order_articles.ordered-articles.table.table-striped.stupidtable %thead @@ -50,7 +76,9 @@ %tfoot %tr %th{:colspan => 10} - = link_to t('.add_article'), new_order_order_article_path(@order), remote: true, class: 'btn btn-small' + %select#add_article{:style => 'width: 500px;'} + - new_article_data.each do |option| + %option{id: "add_article_#{option[:id]}", value: option[:id]}= option[:text] %tbody#result_table - @order_articles.each do |order_article| = render :partial => 'edit_amount', :locals => {:order_article => order_article} diff --git a/app/views/orders/receive_on_order_article_create.js.erb b/app/views/orders/receive_on_order_article_create.js.erb index 1f76238b..ed37975f 100644 --- a/app/views/orders/receive_on_order_article_create.js.erb +++ b/app/views/orders/receive_on_order_article_create.js.erb @@ -1,6 +1,8 @@ // Handle more advanced DOM update after AJAX database manipulation. // See publish/subscribe design pattern in /doc. (function(w) { + $('#order_article_<%= @order_article.id %>').remove(); // just to be sure: remove table row which is added below + $('#order_articles tr').removeClass('success'); var order_article_entry = $( @@ -9,5 +11,7 @@ $('#order_articles tbody').append(order_article_entry); updateSort('#order_articles'); + + $('#add_article_<%= @order_article.article.id %>').remove(); // remove option to add this article })(window);