kivi.Validator: Leere Checks ignorieren
[kivitendo-erp.git] / js / kivi.Validator.js
1 namespace("kivi.Validator", function(ns) {
2   "use strict";
3
4   // Performs various validation steps on the descendants of
5   // 'selector'. Elements that should be validated must have an
6   // attribute named "data-validate" which is set to a space-separated
7   // list of tests to perform. Additionally, the attribute
8   // "data-title" must be set to a human-readable name of the field
9   // that can be shown as part of an error message.
10   //
11   // Supported validation tests are:
12   // - "required": the field must be set (its .val() must not be empty)
13   //
14   // The validation will abort and return "false" as soon as
15   // validation routine fails.
16   //
17   // The function returns "true" if all validations succeed for all
18   // elements.
19   ns.validate_all = function(selector) {
20     selector = selector || '#form';
21     var to_check = $(selector + ' [data-validate]').toArray();
22
23     for (var to_check_idx in to_check)
24       if (!ns.validate($(to_check[to_check_idx]))) {
25         $(to_check[to_check_idx]).focus();
26         return false;
27       }
28
29     return true;
30   };
31
32   ns.validate = function($e) {
33     var tests = $e.data('validate').split(/ +/);
34
35     for (var test_idx in tests) {
36       var test = tests[test_idx];
37       if (!ns.checks[test])
38         continue;
39
40       if (ns.checks[test]) {
41         if (!ns.checks[test]($e))
42           return false;
43       } else {
44         var error = "kivi.validate_form: unknown test '" + test + "' for element ID '" + $e.prop('id') + "'";
45         console.error(error);
46         alert(error);
47         return false;
48       }
49     }
50
51     return true;
52   }
53
54   ns.checks = {
55     required: function($e) {
56       if ($e.val() === '') {
57         ns.annotate($e, kivi.t8("This field must not be empty."));
58         return false;
59       } else {
60         ns.annotate($e);
61         return true;
62       }
63     },
64     number: function($e) {
65       var number_string = $e.val();
66
67       var parsed_number = kivi.parse_amount(number_string);
68
69       if (parsed_number === null) {
70         $e.val('');
71         ns.annotate($e);
72         return true;
73       } else
74       if (parsed_number === undefined) {
75         ns.annotate($e, kivi.t8('Wrong number format (#1)', [ kivi.myconfig.numberformat ]));
76         return false;
77       } else
78       {
79         var formatted_number = kivi.format_amount(parsed_number);
80         if (formatted_number != number_string)
81           $e.val(formatted_number);
82         ns.annotate($e);
83         return true;
84       }
85     },
86     date: function($e) {
87       var date_string = $e.val();
88
89       var parsed_date = kivi.parse_date(date_string);
90
91       if (parsed_date === null) {
92         $e.val('');
93         ns.annotate($e);
94         return true;
95       } else
96       if (parsed_date === undefined) {
97         ns.annotate($e, kivi.t8('Wrong date format (#1)', [ kivi.myconfig.dateformat ]));
98         return false;
99       } else
100       {
101         var formatted_date = kivi.format_date(parsed_date);
102         if (formatted_date != date_string)
103           $e.val(formatted_date);
104         ns.annotate($e);
105         return true;
106       }
107     }
108   };
109
110   ns.annotate = function($e, error) {
111     if (error) {
112       $e.addClass('kivi-validator-invalid');
113       if ($e.hasClass('tooltipstered'))
114         $e.tooltipster('destroy');
115
116       $e.tooltipster({
117         content: error,
118         theme: 'tooltipster-light',
119       });
120       $e.tooltipster('show');
121     } else {
122       $e.removeClass('kivi-validator-invalid');
123       if ($e.hasClass('tooltipstered'))
124         $e.tooltipster('destroy');
125     }
126   };
127
128   ns.reinit_widgets = function() {
129     kivi.run_once_for('[data-validate]', 'data-validate', function(elt) {
130       $(elt).change(function(event){ ns.validate($(elt), event) });
131     });
132   }
133
134   ns.init = ns.reinit_widgets;
135
136   $(ns.init);
137 });