Auftrags-Controller: Sortieren der Positionen
authorBernd Bleßmann <bernd@kivitendo-premium.de>
Tue, 22 Dec 2015 10:43:08 +0000 (11:43 +0100)
committerBernd Bleßmann <bernd@kivitendo-premium.de>
Fri, 11 Mar 2016 11:53:26 +0000 (12:53 +0100)
SL/Controller/Order.pm
js/locale/de.js
locale/de/all
templates/webpages/order/tabs/basic_data.html

index 0f71518..5c8685f 100644 (file)
@@ -449,6 +449,29 @@ sub action_recalc_amounts_and_taxes {
   $self->js->render();
 }
 
+sub action_reorder_items {
+  my ($self) = @_;
+
+  my %sort_keys = (
+    partnumber  => sub { $_[0]->part->partnumber },
+    description => sub { $_[0]->description },
+    qty         => sub { $_[0]->qty },
+    sellprice   => sub { $_[0]->sellprice },
+    discount    => sub { $_[0]->discount },
+  );
+
+  my $method = $sort_keys{$::form->{order_by}};
+  my @to_sort = map { { old_pos => $_->position, order_by => $method->($_) } } @{ $self->order->items_sorted };
+  if ($::form->{sort_dir}) {
+    @to_sort = sort { $a->{order_by} cmp $b->{order_by} } @to_sort;
+  } else {
+    @to_sort = sort { $b->{order_by} cmp $a->{order_by} } @to_sort;
+  }
+  $self->js
+    ->run('redisplay_items', \@to_sort)
+    ->render;
+}
+
 sub action_price_popup {
   my ($self) = @_;
 
index c97b7c6..cbc57d9 100644 (file)
@@ -91,5 +91,6 @@ namespace("kivi").setupLocale({
 "Version actions":"Aktionen für Versionen",
 "Yes":"Ja",
 "flat-rate position":"Pauschalposition",
+"sort items":"Positionen sortieren",
 "time and effort based position":"Aufwandsposition"
 });
index 445b9be..3fa000b 100755 (executable)
@@ -3548,6 +3548,7 @@ $self->{texts} = {
   'shipped'                     => 'verschickt',
   'singular first char'         => 'S',
   'soldtotal'                   => 'Verkaufte Anzahl',
+  'sort items'                  => 'Positionen sortieren',
   'stock'                       => 'Einlagerung',
   'submit'                      => 'abschicken',
   'succeeded'                   => 'erfolgreich',
index 0ee6bc8..102d5ed 100644 (file)
                 <th class="listheading" nowrap width="3" >[%- 'position'     | $T8 %] </th>
                 <th class="listheading" style='text-align:center' nowrap width="1"><img src="image/updown.png" alt="[%- LxERP.t8('reorder item') %]"></th>
                 <th class="listheading" style='text-align:center' nowrap width="1"><img src="image/close.png" alt="[%- LxERP.t8('delete item') %]"></th>
-                <th class="listheading" nowrap width="15">[%- 'Partnumber'   | $T8 %] </th>
-                <th class="listheading" nowrap           >[%- 'Description'  | $T8 %] </th>
-                <th class="listheading" nowrap width="5" >[%- 'Qty'          | $T8 %] </th>
+                <th id="partnumber_header_id"  class="listheading" nowrap width="15"><a href='#' onClick='javascript:reorder_items("partnumber")'> [%- 'Partnumber'  | $T8 %]</a></th>
+                <th id="description_header_id" class="listheading" nowrap           ><a href='#' onClick='javascript:reorder_items("description")'>[%- 'Description' | $T8 %]</a></th>
+                <th id="qty_header_id"         class="listheading" nowrap width="5" ><a href='#' onClick='javascript:reorder_items("qty")'>        [%- 'Qty'         | $T8 %]</a></th>
                 <th class="listheading" nowrap width="5" >[%- 'Price Factor' | $T8 %] </th>
                 <th class="listheading" nowrap width="5" >[%- 'Unit'         | $T8 %] </th>
                 <th class="listheading" nowrap width="5" >[%- 'Price Source' | $T8 %] </th>
-                <th class="listheading" nowrap width="15">[%- 'Price'        | $T8 %] </th>
-                <th class="listheading" nowrap width="5" >[%- 'Discount'     | $T8 %] </th>
+                <th id="sellprice_header_id"   class="listheading" nowrap width="15" ><a href='#' onClick='javascript:reorder_items("sellprice")'> [%- 'Price'       | $T8 %]</a></th>
+                <th id="discount_header_id"    class="listheading" nowrap width="15" ><a href='#' onClick='javascript:reorder_items("discount")'>  [%- 'Discount'    | $T8 %]</a></th>
                 <th class="listheading" nowrap width="10">[%- 'Extended'     | $T8 %] </th>
               </tr>
             </thead>
@@ -303,6 +303,8 @@ function add_item() {
   if ($('#add_item_parts_id').val() == '') return;
   if (!check_cv()) return;
 
+  $('#row_table_id thead a img').remove();
+
   var data = $('#order_form').serialize();
   data += '&action=Order/add_item';
 
@@ -312,6 +314,8 @@ function add_item() {
 function show_multi_items_dialog() {
   if (!check_cv()) return;
 
+  $('#row_table_id thead a img').remove();
+
   kivi.popup_dialog({
     url: 'controller.pl?action=Order/show_multi_items_dialog',
     data: { type: $('#type').val(),
@@ -523,6 +527,38 @@ function renumber_positions() {
   });
 }
 
+function reorder_items(order_by) {
+  var dir = $('#' + order_by + '_header_id a img').attr("data-sort-dir");
+  $('#row_table_id thead a img').remove();
+
+  var src;
+  if (dir == "1") {
+    dir = "0";
+    src = "image/up.png";
+  } else {
+    dir = "1";
+    src = "image/down.png";
+  };
+
+  $('#' + order_by + '_header_id a').append('<img border=0 data-sort-dir=' + dir + ' src=' + src + ' alt="[%- LxERP.t8('sort items') %]">');
+
+  var data = $('#order_form').serialize();
+  data += '&action=Order/reorder_items';
+  data += '&order_by=' + order_by;
+  data += '&sort_dir=' + dir;
+
+  $.post("controller.pl", data, kivi.eval_json_result);
+}
+
+function redisplay_items(data) {
+  var old_rows = $('.row_entry').detach();
+  var new_rows = [];
+  $(data).each(function(idx, elt) {
+    new_rows.push(old_rows[elt.old_pos - 1]);
+  });
+  $(new_rows).appendTo($('#row_table_id'));
+  renumber_positions();
+}
 
 $(function(){
   $('#order_[%- cv_id %]').change(reload_cv_dependend_selections);
@@ -548,6 +584,7 @@ $(function(){
 });
 
 $('#row_table_id').on('sortstop', function(event, ui) {
+  $('#row_table_id thead a img').remove();
   renumber_positions();
 });
 </script>