Artikelstammdaten: Spracheinstellungen rein in eigenem Tab bearbeiten
authorMoritz Bunkus <m.bunkus@linet-services.de>
Tue, 14 Jan 2014 12:55:48 +0000 (13:55 +0100)
committerMoritz Bunkus <m.bunkus@linet-services.de>
Tue, 14 Jan 2014 15:22:32 +0000 (16:22 +0100)
Der alte Mechanismus öffnete ein normales Popup-Fenster, in dem eine
URL geladen wurde, die dann die Maske angezeigt hat. Das
Zurückschreiben geschah schon via JavaScript.

Mit der Methode gibt's zwei Probleme:

1. Es ist langsam, weil ein überflüssiger Roundtrip zum Server gemacht
   wird. Die Informationen sind bereits alle beim initialen Anzeigen
   der Maske vorhanden.
2. Es handelt sich um einen GET-Request, an den sämtliche
   Übersetzungen als GET-Parameter angehängt werden. Damit kann man
   problemlos in die Größenbeschränkung bei GET-Requests laufen.

SL/IC.pm
bin/mozilla/ic.pl
js/parts_language_selection.js [deleted file]
locale/de/all
templates/webpages/client_config/form.html
templates/webpages/common/select_warehouse_bin.html
templates/webpages/dbupgrade/default_bin_parts.html
templates/webpages/ic/form_footer.html
templates/webpages/ic/form_header.html
templates/webpages/ic/parts_language_selection.html [deleted file]
templates/webpages/ic/tabs/_edit_translations.html [new file with mode: 0644]

index ff8484b..d37f66f 100644 (file)
--- a/SL/IC.pm
+++ b/SL/IC.pm
@@ -146,15 +146,10 @@ SQL
   }
 
   # get translations
-  $form->{language_values} = "";
   $query = qq|SELECT language_id, translation, longdescription
               FROM translation
               WHERE parts_id = ?|;
-  my $trq = prepare_execute_query($form, $dbh, $query, conv_i($form->{id}));
-  while (my $tr = $trq->fetchrow_hashref("NAME_lc")) {
-    $form->{language_values} .= "---+++---" . join('--++--', @{$tr}{qw(language_id translation longdescription)});
-  }
-  $trq->finish;
+  $form->{translations} = selectall_hashref_query($form, $dbh, $query, conv_i($form->{id}));
 
   # is it an orphan
   my @referencing_tables = qw(invoice orderitems inventory);
@@ -401,16 +396,17 @@ sub save {
   # delete translation records
   do_query($form, $dbh, qq|DELETE FROM translation WHERE parts_id = ?|, conv_i($form->{id}));
 
-  if ($form->{language_values} ne "") {
-    foreach my $item (split(/---\+\+\+---/, $form->{language_values})) {
-      my ($language_id, $translation, $longdescription) = split(/--\+\+--/, $item);
-      if ($translation ne "") {
-        $query = qq|INSERT into translation (parts_id, language_id, translation, longdescription)
-                    VALUES ( ?, ?, ?, ? )|;
-        @values = (conv_i($form->{id}), conv_i($language_id), $translation, $longdescription);
-        do_query($form, $dbh, $query, @values);
-      }
+  my @translations = grep { $_->{language_id} && $_->{translation} } @{ $form->{translations} || [] };
+  if (@translations) {
+    $query = qq|INSERT into translation (parts_id, language_id, translation, longdescription)
+                VALUES ( ?, ?, ?, ? )|;
+    $sth   = $dbh->prepare($query);
+
+    foreach my $translation (@translations) {
+      do_statement($form, $sth, $query, conv_i($form->{id}), conv_i($translation->{language_id}), $translation->{translation}, $translation->{longdescription});
     }
+
+    $sth->finish();
   }
 
   # delete price records
index f986715..473467b 100644 (file)
@@ -1608,6 +1608,8 @@ sub form_header {
     $form->{bin_id}       ||= $default_bin_id       ||  $form->{WAREHOUSES}->[$max -1]->{BINS}->[0]->{id};
   }
 
+  $form->{LANGUAGES}        = SL::DB::Manager::Language->get_all_sorted;
+  $form->{translations_map} = { map { ($_->{language_id} => $_) } @{ $form->{translations} || [] } };
 
   IC->retrieve_buchungsgruppen(\%myconfig, $form);
   @{ $form->{BUCHUNGSGRUPPEN} } = grep { $_->{id} eq $form->{buchungsgruppen_id} || ($form->{id} && $form->{orphaned}) || !$form->{id} } @{ $form->{BUCHUNGSGRUPPEN} };
@@ -2063,50 +2065,6 @@ sub price_row {
   $lxdebug->leave_sub();
 }
 
-sub parts_language_selection {
-  $lxdebug->enter_sub();
-
-  $auth->assert('part_service_assembly_edit');
-
-  my $languages = IC->retrieve_languages(\%myconfig, $form);
-
-  if ($form->{language_values} ne "") {
-    foreach my $item (split(/---\+\+\+---/, $form->{language_values})) {
-      my ($language_id, $translation, $longdescription) = split(/--\+\+--/, $item);
-
-      foreach my $language (@{ $languages }) {
-        next unless ($language->{id} == $language_id);
-
-        $language->{translation}     = $translation;
-        $language->{longdescription} = $longdescription;
-
-        $language->{translation_area}     = ($language->{translation_rows} = $form->numtextrows($language->{translation}, 40)) > 1;
-        $language->{longdescription_rows} = max 4, $form->numtextrows($language->{longdescription}, 40);
-
-        last;
-      }
-    }
-  }
-
-  my @header_sort = qw(name longdescription);
-  my %header_title = ( "name" => $locale->text("Name"),
-                       "longdescription" => $locale->text("Long Description"),
-                       );
-
-  my @header =
-    map(+{ "column_title" => $header_title{$_},
-           "column" => $_,
-         },
-        @header_sort);
-
-  $form->{"title"} = $locale->text("Language Values");
-  $form->header();
-  print $form->parse_html_template("ic/parts_language_selection", { "HEADER"    => \@header,
-                                                                    "LANGUAGES" => $languages, });
-
-  $lxdebug->leave_sub();
-}
-
 sub ajax_autocomplete {
   $main::lxdebug->enter_sub();
 
diff --git a/js/parts_language_selection.js b/js/parts_language_selection.js
deleted file mode 100644 (file)
index a060716..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-function parts_language_selection_window(input_name) {
-  var parm = centerParms(600,500) + ",width=600,height=500,status=yes,scrollbars=yes";
-  var name = document.getElementsByName(input_name)[0].value;
-  url = "ic.pl?" +
-    "INPUT_ENCODING=UTF-8&" +
-    "action=parts_language_selection&" +
-    "id="              + encodeURIComponent(document.ic.id.value)              + "&" +
-    "language_values=" + encodeURIComponent(document.ic.language_values.value) + "&" +
-    "name="            + encodeURIComponent(name)                              + "&" +
-    "input_name="      + encodeURIComponent(input_name)                        + "&"
-  window.open(url, "_new_generic", parm);
-}
index 98d6920..3d1d600 100755 (executable)
@@ -1210,7 +1210,6 @@ $self->{texts} = {
   'Language'                    => 'Sprache',
   'Language (database ID)'      => 'Sprache (Datenbank-ID)',
   'Language (name)'             => 'Sprache (Name)',
-  'Language Values'             => 'Sprachübersetzungen',
   'Language deleted!'           => 'Sprache gelöscht!',
   'Language missing!'           => 'Sprache fehlt!',
   'Language saved!'             => 'Sprache gespeichert!',
@@ -1589,7 +1588,6 @@ $self->{texts} = {
   'Please enter the taxnumber in the client configuration.' => 'Bitte geben Sie in der Mandantenkonfiguration die Steuernummer an.',
   'Please enter values'         => 'Bitte Werte eingeben',
   'Please insert object dimensions below.' => 'Bitte geben Sie die Abmessungen unten ein',
-  'Please insert your language values below' => 'Bitte die Übersetzungen unten eintragen',
   'Please insert your longdescription below' => 'Bitte den Langtext eingeben',
   'Please install the below listed modules or ask your system administrator to.' => 'Bitte installieren Sie die unten aufgef&uuml;hrten Module, oder bitten Sie Ihren Administrator darum.',
   'Please log in to the administration panel.' => 'Bitte melden Sie sich im Administrationsbereich an.',
@@ -1887,7 +1885,6 @@ $self->{texts} = {
   'Service Number missing!'     => 'Dienstleistungsnummer fehlt!',
   'Service, assembly or part'   => 'Dienstleistung, Erzeugnis oder Ware',
   'Services'                    => 'Dienstleistungen',
-  'Set Language Values'         => 'Spracheinstellungen',
   'Set eMail text'              => 'E-Mail Text eingeben',
   'Settings'                    => 'Einstellungen',
   'Setup Menu'                  => 'Menü-Variante',
@@ -2386,6 +2383,7 @@ $self->{texts} = {
   'Transfer qty'                => 'Umlagermenge',
   'Transfer successful'         => 'Lagervorgang erfolgreich',
   'Translation'                 => 'Übersetzung',
+  'Translations'                => 'Übersetzungen',
   'Trial Balance'               => 'Summen- und Saldenliste',
   'Trial balance between %s and %s' => 'Summen- und Saldenlisten vom %s bis zum %s',
   'Trying to call a sub without a name' => 'Es wurde versucht, eine Unterfunktion ohne Namen aufzurufen.',
index 58d2789..0f85512 100644 (file)
@@ -1,6 +1,5 @@
 [%- USE L %][% USE LxERP %][% USE HTML %][%- USE JavaScript -%]
  <script type="text/javascript" src="js/common.js"></script>
- <script type="text/javascript" src="js/parts_language_selection.js"></script>
  <script type="text/javascript">
   <!--
 var warehouses = [
index f7d854a..3b916ca 100644 (file)
@@ -3,7 +3,6 @@
 [%- USE LxERP %]
 [%- USE JavaScript -%]
  <script type="text/javascript" src="js/common.js"></script>
- <script type="text/javascript" src="js/parts_language_selection.js"></script>
  <script type="text/javascript">
   <!--
       warehouses = new Array();
index 2c7413d..0c82945 100644 (file)
@@ -3,7 +3,6 @@
 [%- USE LxERP %]
 [%- USE JavaScript %]
  <script type="text/javascript" src="js/common.js"></script>
- <script type="text/javascript" src="js/parts_language_selection.js"></script>
  <script type="text/javascript">
   <!--
      warehouses = new Array();
index 7039131..51a6d66 100644 (file)
  </table>
 </div>
 
+[%- IF LANGUAGES.size %]
+ [% PROCESS 'ic/tabs/_edit_translations.html' %]
+[%- END %]
+
 [%- IF id %]
 <div id="sales_price_information">
   [% PROCESS ic/sales_price_information.html id=id %]
index 0088919..296cd16 100644 (file)
@@ -1,6 +1,6 @@
 [%- USE T8 %]
 [%- USE HTML %]
-[%- USE LxERP %]
+[%- USE LxERP %][%- USE L -%]
 [% PROCESS 'common/select_warehouse_bin.html' %]
  <p><div class="listtop">[% title %]  [% HTML.escape(partnumber) %]  [% HTML.escape(description) %]</div></p>
 
   <input name="taxaccounts" type="hidden" value="[% HTML.escape(taxaccounts) %]">
   <input name="rowcount" type="hidden" value="[% HTML.escape(rowcount) %]">
   <input name="eur" type="hidden" value="[% HTML.escape(eur) %]">
-  <input name="language_values" type="hidden" value="[% HTML.escape(language_values) %]">
   <input name="original_partnumber" type="hidden" value="[% HTML.escape(original_partnumber) %]">
   <input name="currow" type="hidden" value="[% HTML.escape(currow) %]">
 
   <div class="tabwidget">
    <ul>
     <li><a href="#master_data">[% 'Basic Data' | $T8 %]</a></li>
+[% IF LANGUAGES.size %]
+    <li><a href="#translations_tab">[% 'Translations' | $T8 %]</a></li>
+[% END %]
     [%- IF id %]
     <li><a href="#sales_price_information">[% 'Price information' | $T8 %]</a></li>
     [%- END %]
            </td>
           </tr>
 
-          <tr>
-           <td>
-            <button type="button" onclick="parts_language_selection_window('language_values')">[% 'Set Language Values' | $T8 %]</button>
-           </td>
-          </tr>
-
           <tr height="5"></tr>
 
           <tr>
diff --git a/templates/webpages/ic/parts_language_selection.html b/templates/webpages/ic/parts_language_selection.html
deleted file mode 100644 (file)
index 59fd2f6..0000000
+++ /dev/null
@@ -1,67 +0,0 @@
-[%- USE T8 %]
-[%- USE HTML %]
- <form name="Form">
-
-  <input type="hidden" name="input_name" value="[% HTML.escape(input_name) %]">
-
-  <div class="listtop">[% title %]</div>
-
-  <p>[% 'Please insert your language values below' | $T8 %]</p>
-
-  <p>
-   <table>
-    <tr class="listheading">
-     <th class="listheading">&nbsp;</th>
-     [%- FOREACH col = HEADER %]
-     <th nowrap class="listheading">[% col.column_title %]</th>
-     [%- END %]
-    </tr>
-
-    [%- FOREACH row = LANGUAGES %]
-    <tr class="listrow[% loop.count % 2 %]">
-     <td><input type="hidden" id="id_[% loop.count %]" name="id_[% loop.count %]" value="[% HTML.escape(row.id) %]">[% HTML.escape(row.description) %]</td>
-     <td>
-       [%- IF row.translation_area %]
-         <textarea id="translation_[% loop.count %]" name="translation_[% loop.count %]" rows="[% HTML.escape(row.translation_rows) %]" cols=40 wrap="soft">[% HTML.escape(row.translation) %]</textarea>
-       [%- ELSE %]
-         <input  id="translation_[% loop.count %]" name="translation_[% loop.count %]" value="[% HTML.escape(row.translation) %]">
-       [%- END %]
-     </td>
-     <td><textarea id="longdescription_[% loop.count %]" name="longdescription_[% loop.count %]" rows="[% HTML.escape(row.longdescription_rows) %]" cols=40 wrap="soft">[% HTML.escape(row.longdescription) %]</textarea></td>
-    </tr>
-
-    [%- IF loop.last %]
-    <input type="hidden" id="rowcount" name="rowcount" value="[% loop.count %]">
-    [%- END %]
-    [%- END %]
-   </table>
-  </p>
-
-  <p>
-   <button type="button" onclick="languages_updated()">[% 'Close' | $T8 %]</button>
-  </p>
-
- </form>
-
- <script type="text/javascript">
-  <!--
-      function languages_updated() {
-        var languages = "";
-        for (var i = 1; i <= (document.getElementsByName("rowcount")[0].value); i++) {
-          var id              = "id_" + i ;
-          var translation     = "translation_" + i ;
-          var longdescription = "longdescription_" + i;
-
-          languages = languages +
-            "---+++---" + document.getElementsByName( id )[0].value +
-            "--++--" + document.getElementsByName( translation )[0].value +
-            "--++--"  + document.getElementsByName( longdescription )[0].value;
-        }
-
-        window.opener.document.getElementsByName(document.Form.input_name.value)[0].value = languages;
-
-        self.close();
-      }
-      //-->
- </script>
-
diff --git a/templates/webpages/ic/tabs/_edit_translations.html b/templates/webpages/ic/tabs/_edit_translations.html
new file mode 100644 (file)
index 0000000..61884bf
--- /dev/null
@@ -0,0 +1,22 @@
+[%- USE HTML %][%- USE L -%][%- USE P -%][%- USE LxERP -%]
+
+<div id="translations_tab">
+ <table>
+  <tr class="listheading">
+   <th>[% LxERP.t8("Language") %]</th>
+   <th>[% LxERP.t8("Description") %]</th>
+   <th>[% LxERP.t8("Long Description") %]</th>
+  </tr>
+
+  [%- FOREACH language = LANGUAGES %]
+   [% SET language_id = language.id
+          translation = translations_map.$language_id %]
+   [% L.hidden_tag('translations[+].language_id', language.id) %]
+   <tr class="listrow" valign="top">
+    <td>[% HTML.escape(language.description) %]</td>
+    <td>[% L.input_tag("translations[].translation", translation.translation) %]</td>
+    <td>[% L.textarea_tag("translations[].longdescription", translation.longdescription, id="translations_longdescription_" _ language_id, style="width: 500px; height: 100px") %]</td>
+   </tr>
+  [%- END %]
+ </table>
+</div>