From e28f3eda651418df94eadd949b32e0bd2f110f46 Mon Sep 17 00:00:00 2001 From: Julius Date: Tue, 11 Jun 2013 13:10:18 +0200 Subject: [PATCH 01/35] Fix StockArticle creation during delivery; small cleanups --- app/controllers/deliveries_controller.rb | 37 ++++++++++++------- app/views/deliveries/_form.html.haml | 20 +++------- .../deliveries/_stock_article_form.html.haml | 28 +++++++++----- app/views/deliveries/_stock_change.html.haml | 2 +- .../deliveries/add_stock_article.js.haml | 3 ++ .../deliveries/new_stock_article.js.haml | 2 + app/views/shared/_alert_success.haml | 5 +++ app/views/stockit/destroy.js.haml | 6 --- config/locales/de.yml | 6 +++ config/routes.rb | 1 + 10 files changed, 66 insertions(+), 44 deletions(-) create mode 100644 app/views/deliveries/add_stock_article.js.haml create mode 100644 app/views/deliveries/new_stock_article.js.haml create mode 100644 app/views/shared/_alert_success.haml diff --git a/app/controllers/deliveries_controller.rb b/app/controllers/deliveries_controller.rb index d8876c16..af247462 100644 --- a/app/controllers/deliveries_controller.rb +++ b/app/controllers/deliveries_controller.rb @@ -75,21 +75,32 @@ class DeliveriesController < ApplicationController end end - def add_stock_article - article = @supplier.stock_articles.build(params[:stock_article]) - render :update do |page| - if article.save - logger.debug "new StockArticle: #{article.id}" - page.insert_html :bottom, 'stock_changes', :partial => 'stock_change', - :locals => {:stock_change => article.stock_changes.build, :supplier => @supplier} + def new_stock_article + @stock_article = @supplier.stock_articles.build + render :layout => false + end - page.replace_html 'new_stock_article', :partial => 'stock_article_form', - :locals => {:stock_article => @supplier.stock_articles.build} - else - page.replace_html 'new_stock_article', :partial => 'stock_article_form', - :locals => {:stock_article => article} - end + def add_stock_article + @stock_article = StockArticle.new(params[:stock_article]) + if @stock_article.valid? and @stock_article.save + render :layout => false + else + render :action => 'new_stock_article', :layout => false end + + #render :update do |page| + # if article.save + # logger.debug "new StockArticle: #{article.id}" + # page.insert_html :bottom, 'stock_changes', :partial => 'stock_change', + # :locals => {:stock_change => article.stock_changes.build, :supplier => @supplier} +# + # page.replace_html 'new_stock_article', :partial => 'stock_article_form', + # :locals => {:stock_article => @supplier.stock_articles.build} + # else + # page.replace_html 'new_stock_article', :partial => 'stock_article_form', + # :locals => {:stock_article => article} + # end + #end end def add_stock_change diff --git a/app/views/deliveries/_form.html.haml b/app/views/deliveries/_form.html.haml index 5eff702d..bfa90114 100644 --- a/app/views/deliveries/_form.html.haml +++ b/app/views/deliveries/_form.html.haml @@ -12,6 +12,11 @@ }) }); +.well.well-small + .btn-toolbar + .btn-group + = link_to t('.new_stock_article'), new_stock_article_supplier_deliveries_path(@supplier), remote: true, class: 'btn btn-primary' + = simple_form_for [@supplier, @delivery], validate: true do |f| = f.hidden_field :supplier_id #stock_changes @@ -23,23 +28,10 @@ = stock_change_form.hidden_field :_destroy = link_to t('.remove_article'), "#", class: 'destroy_stock_change' %p - = link_to t('.add_article'), {action: 'add_stock_change', supplier_id: @supplier.id}, remote: true - %p - %small= t('.note_new_article', new_link: link_to(t('.note_new_article_link'), new_stock_article_path)).html_safe + = link_to t('.add_article'), {action: 'add_stock_change', supplier_id: @supplier.id}, remote: true, class: 'btn btn-small' %hr/ = f.input :delivered_on, as: :date_picker = f.input :note, input_html: {size: '35x4'} .form-actions = f.submit class: 'btn btn-primary' = link_to t('ui.or_cancel'), supplier_deliveries_path(@supplier) - -/ - TODO: Fix this!! - .span6 - %h2= t '.new_article.title' - %p - = t('.new_article.search', supplier: @supplier.name).html_safe + ': ' - = text_field_tag 'article_name' - %hr/ - #stock_article_form - = render 'stock_article_form', stock_article: @supplier.stock_articles.build diff --git a/app/views/deliveries/_stock_article_form.html.haml b/app/views/deliveries/_stock_article_form.html.haml index 395be839..8384eefe 100644 --- a/app/views/deliveries/_stock_article_form.html.haml +++ b/app/views/deliveries/_stock_article_form.html.haml @@ -1,11 +1,19 @@ -= simple_form_for stock_article, url: add_stock_article_supplier_deliveries_path(@supplier), remote: true, - validate: true do |f| += simple_form_for stock_article, url: add_stock_article_supplier_deliveries_path(supplier), remote: true, validate: true do |f| = f.hidden_field :supplier_id - = f.input :name - = f.input :unit - = f.input :note - = f.input :price - = f.input :tax - = f.input :deposit - = f.association :article_category - = f.submit class: 'btn' \ No newline at end of file + .modal-header + = link_to t('ui.marks.close').html_safe, '#', class: 'close', data: {dismiss: 'modal'} + %h3= t '.title' + .modal-body + = f.input :name + = f.input :unit + = f.input :note + - if stock_article.new_record? + = f.input :price + = f.input :tax + = f.input :deposit + - else + = f.input :price, :input_html => {:disabled => 'disabled'}, :hint => t('.form.price_hint') + = f.association :article_category + .modal-footer + = link_to t('ui.close'), '#', class: 'btn', data: {dismiss: 'modal'} + = f.submit class: 'btn btn-primary' diff --git a/app/views/deliveries/_stock_change.html.haml b/app/views/deliveries/_stock_change.html.haml index 3c5dfd5a..97151ecc 100644 --- a/app/views/deliveries/_stock_change.html.haml +++ b/app/views/deliveries/_stock_change.html.haml @@ -3,4 +3,4 @@ = form.select :stock_article_id, stock_articles_for_select(supplier) Menge = form.text_field :quantity, :size => 5, :autocomplete => 'off' - = link_to t('.remove_article'), "#", :class => 'remove_new_stock_change' + = link_to t('.remove_article'), "#", :class => 'remove_new_stock_change btn btn-small' diff --git a/app/views/deliveries/add_stock_article.js.haml b/app/views/deliveries/add_stock_article.js.haml new file mode 100644 index 00000000..9155f970 --- /dev/null +++ b/app/views/deliveries/add_stock_article.js.haml @@ -0,0 +1,3 @@ +$('div.container-fluid').prepend('#{j(render(:partial => 'shared/alert_success', :locals => {:alert_message => t('.notice', :name => @stock_article.name)}))}'); + +$('#modalContainer').modal('hide'); diff --git a/app/views/deliveries/new_stock_article.js.haml b/app/views/deliveries/new_stock_article.js.haml new file mode 100644 index 00000000..92cddccd --- /dev/null +++ b/app/views/deliveries/new_stock_article.js.haml @@ -0,0 +1,2 @@ +$('#modalContainer').html('#{j(render(:partial => "stock_article_form", :locals => {:stock_article => @stock_article, :supplier => @supplier}))}'); +$('#modalContainer').modal(); diff --git a/app/views/shared/_alert_success.haml b/app/views/shared/_alert_success.haml new file mode 100644 index 00000000..3a2f5fd6 --- /dev/null +++ b/app/views/shared/_alert_success.haml @@ -0,0 +1,5 @@ +.alert.fade.in.alert-success + %a.close{:href => '#', :data => {:dismiss => 'alert'}} + = t('ui.marks.close').html_safe + = t('ui.marks.success').html_safe + = alert_message diff --git a/app/views/stockit/destroy.js.haml b/app/views/stockit/destroy.js.haml index b70b44ca..8bbde9ed 100644 --- a/app/views/stockit/destroy.js.haml +++ b/app/views/stockit/destroy.js.haml @@ -4,11 +4,5 @@ var successDiv = $('
erneut einen Lagerartikel der Lieferung hinzufügen. create: notice: Lieferung wurde erstellt. Bitte nicht vergessen die Rechnung anzulegen! destroy: @@ -424,6 +426,7 @@ de: title: Lieferung bearbeiten form: add_article: Lagerartikel der Lieferung hinzufügen + new_stock_article: Neuen Lagerartikel anlegen new_article: search: Suche nach Artikeln aus dem %{supplier} Katalog title: Neuen Lagerartikel anlegen @@ -451,6 +454,8 @@ de: unit: Einheit stock_change: remove_article: Artikel aus Lieferung entfernen + stock_article_form: + title: Lagerartikel suppliers_overview: Lieferantenübersicht update: notice: Lieferung wurde aktualisiert. @@ -1825,6 +1830,7 @@ de: edit: Bearbeiten marks: close: ! '×' + success: ! '' or_cancel: oder abbrechen save: Speichern show: Anzeigen diff --git a/config/routes.rb b/config/routes.rb index cbcf2828..391f317b 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -103,6 +103,7 @@ Foodsoft::Application.routes.draw do resources :deliveries do post :drop_stock_change, :on => :member + get :new_stock_article, :on => :collection post :add_stock_article, :on => :collection end From 49cfa9aded447ad35484b35594777c73dcfd381f Mon Sep 17 00:00:00 2001 From: Julius Date: Tue, 11 Jun 2013 15:05:19 +0200 Subject: [PATCH 02/35] Cleanup StockArticle creation during delivery --- app/controllers/deliveries_controller.rb | 14 -------------- app/views/deliveries/_form.html.haml | 10 ++++++++-- app/views/deliveries/_stock_article_form.html.haml | 2 +- config/locales/de.yml | 4 +--- 4 files changed, 10 insertions(+), 20 deletions(-) diff --git a/app/controllers/deliveries_controller.rb b/app/controllers/deliveries_controller.rb index af247462..4604c0c7 100644 --- a/app/controllers/deliveries_controller.rb +++ b/app/controllers/deliveries_controller.rb @@ -87,20 +87,6 @@ class DeliveriesController < ApplicationController else render :action => 'new_stock_article', :layout => false end - - #render :update do |page| - # if article.save - # logger.debug "new StockArticle: #{article.id}" - # page.insert_html :bottom, 'stock_changes', :partial => 'stock_change', - # :locals => {:stock_change => article.stock_changes.build, :supplier => @supplier} -# - # page.replace_html 'new_stock_article', :partial => 'stock_article_form', - # :locals => {:stock_article => @supplier.stock_articles.build} - # else - # page.replace_html 'new_stock_article', :partial => 'stock_article_form', - # :locals => {:stock_article => article} - # end - #end end def add_stock_change diff --git a/app/views/deliveries/_form.html.haml b/app/views/deliveries/_form.html.haml index bfa90114..1fb6a5ce 100644 --- a/app/views/deliveries/_form.html.haml +++ b/app/views/deliveries/_form.html.haml @@ -12,10 +12,16 @@ }) }); +- content_for :javascript do + :javascript + $(function() { + $('#add-stock-change').click(); + }); + .well.well-small .btn-toolbar .btn-group - = link_to t('.new_stock_article'), new_stock_article_supplier_deliveries_path(@supplier), remote: true, class: 'btn btn-primary' + = link_to t('.new_stock_article'), new_stock_article_supplier_deliveries_path(@supplier), remote: true, class: 'btn' = simple_form_for [@supplier, @delivery], validate: true do |f| = f.hidden_field :supplier_id @@ -28,7 +34,7 @@ = stock_change_form.hidden_field :_destroy = link_to t('.remove_article'), "#", class: 'destroy_stock_change' %p - = link_to t('.add_article'), {action: 'add_stock_change', supplier_id: @supplier.id}, remote: true, class: 'btn btn-small' + = link_to t('.add_article'), {action: 'add_stock_change', supplier_id: @supplier.id}, :id => 'add-stock-change', remote: true, class: 'btn btn-small btn-primary' %hr/ = f.input :delivered_on, as: :date_picker = f.input :note, input_html: {size: '35x4'} diff --git a/app/views/deliveries/_stock_article_form.html.haml b/app/views/deliveries/_stock_article_form.html.haml index 8384eefe..2d3b0906 100644 --- a/app/views/deliveries/_stock_article_form.html.haml +++ b/app/views/deliveries/_stock_article_form.html.haml @@ -2,7 +2,7 @@ = f.hidden_field :supplier_id .modal-header = link_to t('ui.marks.close').html_safe, '#', class: 'close', data: {dismiss: 'modal'} - %h3= t '.title' + %h3= t 'activerecord.models.stock_article' .modal-body = f.input :name = f.input :unit diff --git a/config/locales/de.yml b/config/locales/de.yml index 8d48adc0..ccd58e76 100644 --- a/config/locales/de.yml +++ b/config/locales/de.yml @@ -417,7 +417,7 @@ de: year: Jahr deliveries: add_stock_article: - notice: ! Neuer Lagerartikel »%{name}« gespeichert. Zum Auswählen bitte erneut einen Lagerartikel der Lieferung hinzufügen. + notice: Neuer Lagerartikel »%{name}« gespeichert. Zum Auswählen bitte erneut einen Lagerartikel der Lieferung hinzufügen. create: notice: Lieferung wurde erstellt. Bitte nicht vergessen die Rechnung anzulegen! destroy: @@ -454,8 +454,6 @@ de: unit: Einheit stock_change: remove_article: Artikel aus Lieferung entfernen - stock_article_form: - title: Lagerartikel suppliers_overview: Lieferantenübersicht update: notice: Lieferung wurde aktualisiert. From 65f61e09d53c293599f67b00c92e322e5544da90 Mon Sep 17 00:00:00 2001 From: Julius Date: Thu, 13 Jun 2013 23:33:24 +0200 Subject: [PATCH 03/35] Improve delivery workflow; introduce sortable tables; use js.erb for deliveries --- app/assets/javascripts/application.js | 99 ++++++++++++++-- app/controllers/deliveries_controller.rb | 85 ++++++------- app/helpers/deliveries_helper.rb | 4 + app/models/delivery.rb | 9 +- app/views/deliveries/_form.html.haml | 112 +++++++++++++----- .../_stock_article_for_adding.html.haml | 16 +++ .../deliveries/_stock_article_form.html.haml | 7 +- app/views/deliveries/_stock_change.html.haml | 15 ++- app/views/deliveries/add_stock_article.js.erb | 14 +++ .../deliveries/add_stock_article.js.haml | 3 - app/views/deliveries/add_stock_change.js.erb | 20 ++++ app/views/deliveries/add_stock_change.js.haml | 1 - .../deliveries/edit_stock_article.js.erb | 5 + app/views/deliveries/new_stock_article.js.erb | 5 + .../deliveries/new_stock_article.js.haml | 2 - .../deliveries/update_stock_article.js.erb | 35 ++++++ config/locales/de.yml | 24 +++- config/routes.rb | 6 +- 18 files changed, 357 insertions(+), 105 deletions(-) create mode 100644 app/views/deliveries/_stock_article_for_adding.html.haml create mode 100644 app/views/deliveries/add_stock_article.js.erb delete mode 100644 app/views/deliveries/add_stock_article.js.haml create mode 100644 app/views/deliveries/add_stock_change.js.erb delete mode 100644 app/views/deliveries/add_stock_change.js.haml create mode 100644 app/views/deliveries/edit_stock_article.js.erb create mode 100644 app/views/deliveries/new_stock_article.js.erb delete mode 100644 app/views/deliveries/new_stock_article.js.haml create mode 100644 app/views/deliveries/update_stock_article.js.erb diff --git a/app/assets/javascripts/application.js b/app/assets/javascripts/application.js index 04098d88..820d682c 100644 --- a/app/assets/javascripts/application.js +++ b/app/assets/javascripts/application.js @@ -10,6 +10,34 @@ //= require_self //= require ordering +// function for sorting DOM elements +$.fn.sorter = (function(){ + // Thanks to James Padolsey and Avi Deitcher + // http://james.padolsey.com/javascript/sorting-elements-with-jquery/#comment-29400 + var sort = [].sort; + + return function(comparator, getSortable) { + getSortable = getSortable || function(){return this;}; + + var sorted = sort.call(this, comparator); // sort all elements in memory + var prevElmt = null; + for(i=sorted.length-1; i>=0; --i) { // loop starting from last + var criterionElmt = sorted[i]; + var curElmt = ( 'function' === typeof getSortable ) ? ( getSortable.call(criterionElmt) ) : ( criterionElmt ); + var parent = curElmt.parentNode; + if (!prevElmt) { + parent.appendChild(curElmt); // place last element to the end + } else { + parent.insertBefore(curElmt, prevElmt); // move each element before the previous one + } + prevElmt = curElmt; + } + return sorted; + + }; + +})(); + // Load following statements, when DOM is ready $(function() { @@ -100,17 +128,74 @@ $(function() { // Use bootstrap datepicker for dateinput $('.datepicker').datepicker({format: 'yyyy-mm-dd', weekStart: 1, language: 'de'}); + + // Init table sorting + var myBars = $('span.sorter-bar'); + myBars.html(''); + $('button:nth-child(1)', myBars).click(function(e) {sortTable(e, false);}).attr('title', 'Sortiere aufsteigend'); + $('button:nth-child(2)', myBars).click(function(e) {sortTable(e, true);}).attr('title', 'Sortiere absteigend (umgekehrt)'); + + $('span.sorter-bar.default-sort-asc button:nth-child(1)').trigger('click'); + $('span.sorter-bar.default-sort-desc button:nth-child(2)').trigger('click'); }); +// parse a string to a float +function myFloatParse(input) { + var number = input.trim(); + number = number.split(' ')[0]; + number = number.replace(',', '.'); + number = parseFloat(number, 10); + return number; +} + +// compare two elements interpreted as text +function compareText(a, b) { + return $.trim(a.textContent).toLowerCase() < $.trim(b.textContent).toLowerCase() ? -1 : 1; +} + +// compare two elements interpreted as float +function compareFloat(a, b) { + a = myFloatParse( $(a).text() ); + b = myFloatParse( $(b).text() ); + return ( a