Auftrags-Controller: zweite Zeile laden mit Icons und alle zweiten Zeilen laden.
authorBernd Bleßmann <bernd@kivitendo-premium.de>
Wed, 2 Nov 2016 15:45:44 +0000 (16:45 +0100)
committerBernd Bleßmann <bernd@kivitendo-premium.de>
Thu, 8 Dec 2016 14:57:18 +0000 (15:57 +0100)
SL/Controller/Order.pm
image/collapse3.gif [new file with mode: 0644]
js/kivi.Order.js
js/locale/de.js
locale/de/all
locale/en/all
templates/webpages/order/tabs/_row.html
templates/webpages/order/tabs/basic_data.html

index 144a195..b11e364 100644 (file)
@@ -594,30 +594,41 @@ sub action_get_item_longdescription {
   $_[0]->render(\ $longdescription, { type => 'text' });
 }
 
-# load the second row for an item (cvars only for now)
+# load the second row for one or more items (cvars only for now)
 #
-# This action gets the html code for the items second row by rendering a template for
-# the second row and calls a javascript function with this html code via client js.
-sub action_load_second_row {
+# This action gets the html code for all items second rows by rendering a template for
+# the second row and sets the html code via client js.
+sub action_load_second_rows {
   my ($self) = @_;
 
-  my $idx  = first_index { $_ eq $::form->{item_id} } @{ $::form->{orderitem_ids} };
-  my $item = $self->order->items_sorted->[$idx];
+  foreach my $item_id (@{ $::form->{item_ids} }) {
+    my $idx  = first_index { $_ eq $item_id } @{ $::form->{orderitem_ids} };
+    my $item = $self->order->items_sorted->[$idx];
+
+    $self->_js_load_second_row($item, $item_id, 0);
+  }
+
+  $self->js->render();
+}
 
-  # Parse values from form (they are formated while rendering (template)).
-  # Workaround to pre-parse number-cvars (parse_custom_variable_values does not parse number values).
-  # This parsing is not necessary at all, if we assure that the second row/cvars are only loaded once.
-  #foreach my $var (@{ $item->cvars_by_config }) {
-  #  $var->unparsed_value($::form->parse_amount(\%::myconfig, $var->{__unparsed_value})) if ($var->config->type eq 'number' && exists($var->{__unparsed_value}));
-  #}
-  #$item->parse_custom_variable_values;
+sub _js_load_second_row {
+  my ($self, $item, $item_id, $do_parse) = @_;
+
+  if ($do_parse) {
+    # Parse values from form (they are formated while rendering (template)).
+    # Workaround to pre-parse number-cvars (parse_custom_variable_values does not parse number values).
+    # This parsing is not necessary at all, if we assure that the second row/cvars are only loaded once.
+    foreach my $var (@{ $item->cvars_by_config }) {
+      $var->unparsed_value($::form->parse_amount(\%::myconfig, $var->{__unparsed_value})) if ($var->config->type eq 'number' && exists($var->{__unparsed_value}));
+    }
+    $item->parse_custom_variable_values;
+  }
 
   my $row_as_html = $self->p->render('order/tabs/_second_row', ITEM => $item);
 
   $self->js
-    ->html('.row_entry:has(#item_' . $::form->{item_id} . ') [name = "second_row"]', $row_as_html)
-    ->data('.row_entry:has(#item_' . $::form->{item_id} . ') [name = "second_row"]', 'loaded', 1)
-    ->render();
+    ->html('.row_entry:has(#item_' . $item_id . ') [name = "second_row"]', $row_as_html)
+    ->data('.row_entry:has(#item_' . $item_id . ') [name = "second_row"]', 'loaded', 1);
 }
 
 sub _js_redisplay_linetotals {
diff --git a/image/collapse3.gif b/image/collapse3.gif
new file mode 100644 (file)
index 0000000..9a89b24
Binary files /dev/null and b/image/collapse3.gif differ
index 741526f..538e26e 100644 (file)
@@ -190,12 +190,58 @@ namespace('kivi.Order', function(ns) {
       return;
     }
     var data = $('#order_form').serializeArray();
-    data.push({ name: 'action', value: 'Order/load_second_row' });
-    data.push({ name: 'item_id', value: item_id_dom.val() });
+    data.push({ name: 'action', value: 'Order/load_second_rows' });
+    data.push({ name: 'item_ids[]', value: item_id_dom.val() });
 
     $.post("controller.pl", data, kivi.eval_json_result);
   };
 
+  ns.load_all_second_rows = function() {
+    var rows = $('.row_entry').filter(function(idx, elt) {
+      return $(elt).find('[name="second_row"]').data('loaded') != 1;
+    });
+
+    var item_ids = $.map(rows, function(elt) {
+      var item_id = $(elt).find('[name="orderitem_ids[+]"]').val();
+      return { name: 'item_ids[]', value: item_id };
+    });
+
+    if (item_ids.length == 0) {
+      return;
+    }
+
+    var data = $('#order_form').serializeArray();
+    data.push({ name: 'action', value: 'Order/load_second_rows' });
+    data = data.concat(item_ids);
+
+    $.post("controller.pl", data, kivi.eval_json_result);
+  };
+
+  ns.hide_second_row = function(row) {
+    $(row).children().not(':first').hide();
+    $(row).data('expanded', false);
+    var elt = $(row).find('.expand');
+    elt.attr('src', "image/expand3.gif");
+    elt.attr('alt', kivi.t8('Show details'));
+    elt.attr('title', kivi.t8('Show details'));
+  };
+
+  ns.show_second_row = function(row) {
+    $(row).children().not(':first').show();
+    $(row).data('expanded', true);
+    var elt = $(row).find('.expand');
+    elt.attr('src', "image/collapse3.gif");
+    elt.attr('alt', kivi.t8('Hide details'));
+    elt.attr('title', kivi.t8('Hide details'));
+  };
+
+  ns.toggle_second_row = function(row) {
+    if ($(row).data('expanded') === true) {
+      ns.hide_second_row(row);
+    } else {
+      ns.show_second_row(row);
+    }
+  };
 
   ns.init_row_handlers = function() {
     kivi.run_once_for('.recalc', 'on_change_recalc', function(elt) {
@@ -218,14 +264,14 @@ namespace('kivi.Order', function(ns) {
           event.preventDefault();
           var row = $(event.target).parents(".row_entry").first();
           ns.load_second_row(row);
-          $(row).children().not(':first').show();
+          ns.show_second_row(row);
           return false;
         }
         if(event.keyCode == 38 && event.shiftKey === true) {
           // shift arrow up
           event.preventDefault();
           var row = $(event.target).parents(".row_entry").first();
-          $(row).children().not(':first').hide();
+          ns.hide_second_row(row);
           return false;
         }
       });
@@ -233,10 +279,21 @@ namespace('kivi.Order', function(ns) {
         event.preventDefault();
         var row = $(event.target).parents(".row_entry").first();
         ns.load_second_row(row);
-        $(row).children().not(':first').toggle();
+        ns.toggle_second_row(row);
         return false;
       });
     });
+
+    kivi.run_once_for('.expand', 'expand_second_row', function(elt) {
+      $(elt).click(function(event) {
+        event.preventDefault();
+        var row = $(event.target).parents(".row_entry").first();
+        ns.load_second_row(row);
+        ns.toggle_second_row(row);
+        return false;
+      })
+    });
+
   };
 
   ns.redisplay_linetotals = function(data) {
@@ -486,4 +543,27 @@ $(function(){
     $('#row_table_id thead a img').remove();
     kivi.Order.renumber_positions();
   });
+
+  $('#expand_all').on('click', function(event) {
+    event.preventDefault();
+    if ($('#expand_all').data('expanded') === true) {
+      $('#expand_all').data('expanded', false);
+      $('#expand_all').attr('src', 'image/expand3.gif');
+      $('#expand_all').attr('alt', kivi.t8('Show all details'));
+      $('#expand_all').attr('title', kivi.t8('Show all details'));
+      $('.row_entry').each(function(idx, elt) {
+        kivi.Order.hide_second_row(elt);
+      });
+    } else {
+      $('#expand_all').data('expanded', true);
+      $('#expand_all').attr('src', "image/collapse3.gif");
+      $('#expand_all').attr('alt', kivi.t8('Hide all details'));
+      $('#expand_all').attr('title', kivi.t8('Hide all details'));
+      kivi.Order.load_all_second_rows();
+      $('.row_entry').each(function(idx, elt) {
+        kivi.Order.show_second_row(elt);
+      });
+    }
+    return false;
+  });
 });
index 499b12f..e69ca31 100644 (file)
@@ -47,6 +47,8 @@ namespace("kivi").setupLocale({
 "Edit text block":"Textblock bearbeiten",
 "Enter longdescription":"Langtext eingeben",
 "Function block actions":"Funktionsblockaktionen",
+"Hide all details":"",
+"Hide details":"Details verbergen",
 "History":"Historie",
 "If you switch to a different tab without saving you will lose the data you've entered in the current tab.":"Wenn Sie auf einen anderen Tab wechseln, ohne vorher zu speichern, so gehen die im aktuellen Tab eingegebenen Daten verloren.",
 "Map":"Karte",
@@ -72,6 +74,8 @@ namespace("kivi").setupLocale({
 "Save and keep open":"Speichern und geöffnet lassen",
 "Section/Function block actions":"Abschnitts-/Funktionsblockaktionen",
 "Select template to paste":"Einzufügende Vorlage auswählen",
+"Show all details":"",
+"Show details":"Details anzeigen",
 "Subject":"Betreff",
 "Text block actions":"Textblockaktionen",
 "Text block picture actions":"Aktionen für Textblockbilder",
index f8c5dcd..f842d63 100755 (executable)
@@ -1416,6 +1416,7 @@ $self->{texts} = {
   'Here you only provide the credentials for logging into the database.' => 'Hier geben Sie nur die Logindaten für die Anmeldung an der Datenbank ein.',
   'Here\'s an example command line:' => 'Hier ist eine Kommandozeile, die als Beispiel dient:',
   'Hide Filter'                 => 'Filter verbergen',
+  'Hide all details'            => 'Alle Details verbergen',
   'Hide by default'             => 'Standardm&auml;&szlig;ig verstecken',
   'Hide chart details'          => 'Konteninformation verstecken',
   'Hide details'                => 'Details verbergen',
@@ -2593,6 +2594,7 @@ $self->{texts} = {
   'Show TODO list'              => 'Aufgabenliste anzeigen',
   'Show Transfer via default'   => 'Ein- / Auslagern über Standardlagerplatz anzeigen (zusätzlicher Knopf in Beleg Lieferschein)',
   'Show administration link'    => 'Link zur Administration anzeigen',
+  'Show all details'            => 'Alle Details anzeigen',
   'Show all parts'              => 'Alle Artikel anzeigen',
   'Show by default'             => 'Standardm&auml;&szlig;ig anzeigen',
   'Show custom variable search inputs' => 'Suchoptionen für Benutzerdefinierte Variablen verstecken',
index e3269a1..bc30d21 100644 (file)
@@ -1415,6 +1415,7 @@ $self->{texts} = {
   'Here you only provide the credentials for logging into the database.' => '',
   'Here\'s an example command line:' => '',
   'Hide Filter'                 => '',
+  'Hide all details'            => '',
   'Hide by default'             => '',
   'Hide chart details'          => '',
   'Hide details'                => '',
@@ -2584,6 +2585,7 @@ $self->{texts} = {
   'Show TODO list'              => '',
   'Show Transfer via default'   => '',
   'Show administration link'    => '',
+  'Show all details'            => '',
   'Show all parts'              => '',
   'Show by default'             => '',
   'Show custom variable search inputs' => '',
index 88888e9..ce6e94f 100644 (file)
@@ -6,7 +6,14 @@
 <tbody class="row_entry">
 
   <tr class="listrow0">
-    <td style='display:none'>
+    <td align="center">
+      [%- IF MYCONFIG.show_form_details %]
+        [% L.img_tag(src="image/collapse3.gif",
+                     alt=LxERP.t8('Hide details'), title=LxERP.t8('Hide details'), class="expand") %]
+      [%- ELSE %]
+        [% L.img_tag(src="image/expand3.gif",
+                     alt=LxERP.t8('Show details'), title=LxERP.t8('Show details'), class="expand") %]
+      [%- END %]
       [% L.hidden_tag("orderitem_ids[+]", ID) %]
       [% L.hidden_tag("order.orderitems[+].id", ITEM.id, id='item_' _ ID) %]
       [% L.hidden_tag("order.orderitems[].parts_id", ITEM.parts_id) %]
 
   </tr>
 
-  <tr class="listrow1" style="display:none">
+  <tr class="listrow1" [%- IF !MYCONFIG.show_form_details -%]style="display:none"[%- END -%]>
     <td colspan="100%">
-      <div name="second_row">
-        [%- LxERP.t8("Loading...") %]
-      </div>
+      [%- IF MYCONFIG.show_form_details %]
+        <div name="second_row" data-loaded="1">
+          [%- PROCESS order/tabs/_second_row.html ITEM=ITEM %]
+        </div>
+      [%- ELSE %]
+        <div name="second_row">
+          [%- LxERP.t8("Loading...") %]
+        </div>
+      [%- END %]
     </td>
   </tr>
 
index 61348b7..fe0a27f 100644 (file)
           <table id="row_table_id" width="100%">
             <thead>
               <tr class="listheading">
-                <th class="listheading" style='display:none'></th>
+                <th class="listheading" style='text-align:center' nowrap width="1">
+                  [%- IF MYCONFIG.show_form_details %]
+                    [%- L.img_tag(src="image/collapse3.gif", alt=LxERP.t8('Hide all details'), title=LxERP.t8('Hide all details'), id='expand_all') %]
+                  [%- ELSE %]
+                    [%- L.img_tag(src="image/expand3.gif", alt=LxERP.t8('Show all details'), title=LxERP.t8('Show all details'), id='expand_all') %]
+                  [%- END %]
+                </th>
                 <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>