Fokus Patch.
authorSven Schöling <s.schoeling@linet-services.de>
Fri, 29 Feb 2008 19:04:48 +0000 (19:04 +0000)
committerSven Schöling <s.schoeling@linet-services.de>
Fri, 29 Feb 2008 19:04:48 +0000 (19:04 +0000)
Angeregt durch Bug798, allerdings erweitert und verallgemeinert.

Essentiell merkt sich Lx-Office jetzt in den Bereichen Auftrag, Rechnung, Einkaufsrechnung und Lizenzen die Fokusposition bei Update.

Das Javascript ist in common.js enthalten. Um es in andere Bereiche einzubinden muessen die folgenden Schritte gemacht werden:
1. Jedes Formular muss ein input Feld mit dem Namen "cursor_fokus" durchschleifen.
2. Das Script "js/common.js" muss nach dem body tag eingebunden werden.

Alles andere macht das Script von alleine, die Handler sind erweiterbar auf andere onsubmit und onload Scripte.

SL/Form.pm
bin/mozilla/ir.pl
bin/mozilla/is.pl
bin/mozilla/licenses.pl
bin/mozilla/oe.pl
js/common.js

index 067a002..53324c6 100644 (file)
@@ -577,6 +577,7 @@ sub header {
     if ($self->{jsscript} == 1) {
 
       $jsscript = qq|
+        <script type="text/javascript" src="js/common.js"></script>
         <style type="text/css">\@import url(js/jscalendar/calendar-win2k-1.css);</style>
         <script type="text/javascript" src="js/jscalendar/calendar.js"></script>
         <script type="text/javascript" src="js/jscalendar/lang/calendar-de.js"></script>
index 2858e22..82239ae 100644 (file)
@@ -418,13 +418,13 @@ sub form_header {
   $onload .= qq|;setupPoints('|. $myconfig{numberformat} .qq|', '|. $locale->text("wrongformat") .qq|')|;
   print qq|
 <body onLoad="$onload">
-
+<script type="text/javascript" src="js/common.js"></script>
 <form method=post action=$form->{script}>
 |;
 
   $form->hide_form(qw(id title vc type level creditlimit creditremaining closedto locked shippted storno storno_id
                       max_dunning_level dunning_amount vendor_id oldvendor selectvendor taxaccounts
-                      fxgain_accno fxloss_accno taxpart taxservice),
+                      fxgain_accno fxloss_accno taxpart taxservice cursor_fokus),
                       map { $_.'_rate', $_.'_description' } split / /, $form->{taxaccounts} );
 
   print qq|<p>$form->{saved_message}</p>| if $form->{saved_message};
index 5b70c48..41788c8 100644 (file)
@@ -614,7 +614,7 @@ sub form_header {
                       creditlimit creditremaining tradediscount business closedto locked shipped storno storno_id
                       max_dunning_level dunning_amount
                       shiptoname shiptostreet shiptozipcode shiptocity shiptocountry  shiptocontact shiptophone shiptofax 
-                      shiptoemail shiptodepartment_1 shiptodepartment_2 message email subject cc bcc taxaccounts),
+                      shiptoemail shiptodepartment_1 shiptodepartment_2 message email subject cc bcc taxaccounts cursor_fokus),
                       map { $_.'_rate', $_.'_description', $_.'_taxnumber' } split / /, $form->{taxaccounts} );
    
   print qq|<p>$form->{saved_message}</p>| if $form->{saved_message};
index 93efc24..5876e85 100644 (file)
@@ -72,7 +72,7 @@ sub form_footer {
   } @items);
 
   print(
-    qq|</form>
+    qq|<input type="hidden" name="cursor_field" value='$form->{cursor_field}'></form>
 </body>
 </html>
 |);
index a70ab23..f6648f1 100644 (file)
@@ -388,7 +388,7 @@ sub form_header {
         max_dunning_level dunning_amount shiptoname shiptostreet shiptozipcode
         shiptocity shiptocountry shiptocontact shiptophone shiptofax
         shiptodepartment_1 shiptodepartment_2 shiptoemail
-        message email subject cc bcc taxpart taxservice taxaccounts),
+        message email subject cc bcc taxpart taxservice taxaccounts cursor_fokus),
         @custom_hiddens,
         map { $_.'_rate', $_.'_description' } split / /, $form->{taxaccounts} ];  # deleted: discount
 
index 953dac7..69915ee 100644 (file)
@@ -1,4 +1,8 @@
 
+if (!window.a_onload_functions)   var a_onload_functions   = new Object();
+if (!window.a_onsubmit_functions) var a_onsubmit_functions = new Object();
+
+
 function setupPoints(numberformat, wrongFormat) {
   decpoint = numberformat.substring((numberformat.substring(1, 2).match(/\.|\,/) ? 5 : 4), (numberformat.substring(1, 2).match(/\.|\,/) ? 6 : 5));
   if (numberformat.substring(1, 2).match(/\.|\,/)) {
@@ -50,25 +54,6 @@ function set_longdescription_window(input_name) {
   }
 
 function check_right_number_format(input_name) {
-//   if(thpoint) {
-//     if(thpoint == ','){
-//       var thnumbers = input_name.value.split(',');  
-//       thnumbers[thnumbers.length-1] = thnumbers[thnumbers.length-1].substring((thnumbers[thnumbers.length-1].lastIndexOf(".") !== -1 ? thnumbers[thnumbers.length-1].lastIndexOf(".") : thnumbers[thnumbers.length-1].length), 0);
-//     }
-//     else{
-//       var thnumbers = input_name.value.split('.');  
-//       thnumbers[thnumbers.length-1] = thnumbers[thnumbers.length-1].substring((thnumbers[thnumbers.length-1].lastIndexOf(",") !== -1 ? thnumbers[thnumbers.length-1].lastIndexOf(",") : thnumbers[thnumbers.length-1].length), 0);
-//     }
-//         
-//     for(var i = 0; i < thnumbers.length; i++) {
-//      if(i == 0 && thnumbers[i].length > 3) {
-//       return show_alert_and_focus(input_name, wrongNumberFormat);
-//      }
-//      if(i > 0 && thnumbers[i].length != 3) {
-//        return show_alert_and_focus(input_name, wrongNumberFormat);
-//      }
-//    }
-//   }
   if(decpoint == thpoint) {
     return show_alert_and_focus(input_name, wrongNumberFormat);
   }
@@ -153,3 +138,55 @@ function get_input_value(input_name) {
     return the_input[0].value;
   return '';
 }
+
+window.focused_element = null;
+document.addEventListener("focus", function(event){ 
+  var e = event.target;
+  if (is_element_focussable(e)) window.focused_element = e;
+}, true);
+
+function get_cursor_position() {
+  if (window.focused_element)
+  document.forms[0].cursor_fokus.value = window.focused_element.name;
+}
+
+function set_cursor_position(n) {
+  document.getElementsByName(n)[0].focus();
+}
+
+function restore_cursor_position() {
+  var e = document.getElementsByName('cursor_fokus')[0];
+  var f = document.getElementsByName(e.value)[0];
+  if (is_element_focussable(f)) set_cursor_position(f.name)
+   else set_cursor_to_first_element();
+}
+
+function is_element_focussable(e) {
+  return e && e.type != 'hidden' && e.type != 'submit' && e.disabled != true;
+}
+
+function set_cursor_to_first_element(){
+  var df = document.forms;
+  for (var f = 0; f < df.length; f++)
+    for (var i = 0; i < df[f].length; i++)
+      if (is_element_focussable(df[f][i]))
+        try { df[f][i].focus(); return } catch (er) { }
+}
+a_onload_functions["restore_cursor_position"] = restore_cursor_position;
+a_onsubmit_functions["get_cursor_position"]   = get_cursor_position;
+
+function do_load_events() {
+  var oldl = window.onload;
+  window.onload = function() {
+    if (oldl) oldl();
+    if (window.a_onload_functions) 
+      for (var name in window.a_onload_functions) 
+        a_onload_functions[name]();
+  }
+  window.onsubmit = function() {
+    if (window.a_onsubmit_functions) 
+      for (var name in window.a_onsubmit_functions) 
+        a_onsubmit_functions[name]();
+  }
+}
+do_load_events();