From 65f61e09d53c293599f67b00c92e322e5544da90 Mon Sep 17 00:00:00 2001 From: Julius Date: Thu, 13 Jun 2013 23:33:24 +0200 Subject: [PATCH] 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