js-Validator: Workaround, um Meldung für ckeditor am richtigen Platz anzuzeigen
authorBernd Bleßmann <bernd@kivitendo-premium.de>
Thu, 6 May 2021 13:06:50 +0000 (15:06 +0200)
committerBernd Bleßmann <bernd@kivitendo-premium.de>
Thu, 6 May 2021 15:27:37 +0000 (17:27 +0200)
Da das eigentliche Element, bei dem man im HTMl-Template data-validate
setzt, beim ckeditor nicht sichtbar ist, erschien der Tooltiop irgendwo anders.

Gerne hätte ich in kivi.js (init_text_editor) die data-Attribute
"validate" und "title" auf das "editable" vom ckeditor verschoben
und kivi.Validate so gelassen.
Aber das "editable" ist ein div-Element und die Funktion val() enthält nicht
den Text im Editor, weshalb dann die Prüfung nicht funktioniert.

Deshalb wird nun in kivi.Validate bei einem ckeditor das Element, bei dem die
Annotation erfolgt, auf das "editable" gesetzt.

js/kivi.Validator.js

index 7cbd7eb..b564ffb 100644 (file)
@@ -33,6 +33,12 @@ namespace("kivi.Validator", function(ns) {
   };
 
   ns.validate = function($e) {
+    var $e_annotate;
+    if ($e.data('ckeditorInstance')) {
+      $e_annotate = $($e.data('ckeditorInstance').editable().$);
+      if ($e.data('title'))
+        $e_annotate.data('title', $e.data('title'));
+    }
     var tests = $e.data('validate').split(/ +/);
 
     for (var test_idx in tests) {
@@ -41,7 +47,7 @@ namespace("kivi.Validator", function(ns) {
         continue;
 
       if (ns.checks[test]) {
-        if (!ns.checks[test]($e))
+        if (!ns.checks[test]($e, $e_annotate))
           return false;
       } else {
         var error = "kivi.validate_form: unknown test '" + test + "' for element ID '" + $e.prop('id') + "'";
@@ -55,77 +61,85 @@ namespace("kivi.Validator", function(ns) {
   }
 
   ns.checks = {
-    required: function($e) {
+    required: function($e, $e_annotate) {
+      $e_annotate = $e_annotate || $e;
+
       if ($e.val() === '') {
-        ns.annotate($e, kivi.t8("This field must not be empty."));
+        ns.annotate($e_annotate, kivi.t8("This field must not be empty."));
         return false;
       } else {
-        ns.annotate($e);
+        ns.annotate($e_annotate);
         return true;
       }
     },
-    number: function($e) {
+    number: function($e, $e_annotate) {
+      $e_annotate = $e_annotate || $e;
+
       var number_string = $e.val();
 
       var parsed_number = kivi.parse_amount(number_string);
 
       if (parsed_number === null) {
         $e.val('');
-        ns.annotate($e);
+        ns.annotate($e_annotate);
         return true;
       } else
       if (parsed_number === undefined) {
-        ns.annotate($e, kivi.t8('Wrong number format (#1)', [ kivi.myconfig.numberformat ]));
+        ns.annotate($e_annotate, kivi.t8('Wrong number format (#1)', [ kivi.myconfig.numberformat ]));
         return false;
       } else
       {
         var formatted_number = kivi.format_amount(parsed_number);
         if (formatted_number != number_string)
           $e.val(formatted_number);
-        ns.annotate($e);
+        ns.annotate($e_annotate);
         return true;
       }
     },
-    date: function($e) {
+    date: function($e, $e_annotate) {
+      $e_annotate = $e_annotate || $e;
+
       var date_string = $e.val();
 
       var parsed_date = kivi.parse_date(date_string);
 
       if (parsed_date === null) {
         $e.val('');
-        ns.annotate($e);
+        ns.annotate($e_annotate);
         return true;
       } else
       if (parsed_date === undefined) {
-        ns.annotate($e, kivi.t8('Wrong date format (#1)', [ kivi.myconfig.dateformat ]));
+        ns.annotate($e_annotate, kivi.t8('Wrong date format (#1)', [ kivi.myconfig.dateformat ]));
         return false;
       } else
       {
         var formatted_date = kivi.format_date(parsed_date);
         if (formatted_date != date_string)
           $e.val(formatted_date);
-        ns.annotate($e);
+        ns.annotate($e_annotate);
         return true;
       }
     },
-    time: function($e) {
+    time: function($e, $e_annotate) {
+      $e_annotate = $e_annotate || $e;
+
       var time_string = $e.val();
 
       var parsed_time = kivi.parse_time(time_string);
       if (parsed_time === null) {
         $e.val('');
-        ns.annotate($e);
+        ns.annotate($e_annotate);
         return true;
       } else
       if (parsed_time === undefined) {
-        ns.annotate($e, kivi.t8('Wrong time format (#1)', [ kivi.myconfig.timeformat ]));
+        ns.annotate($e_annotate, kivi.t8('Wrong time format (#1)', [ kivi.myconfig.timeformat ]));
         return false;
       } else
       {
         var formatted_time = kivi.format_time(parsed_time);
         if (formatted_time != time_string)
           $e.val(formatted_time);
-        ns.annotate($e);
+        ns.annotate($e_annotate);
         return true;
       }
     }