kivi.Validator: Syntaxfehler
[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
38       if (ns.checks[test]) {
39         if (!ns.checks[test]($e))
40           return false;
41       } else {
42         var error = "kivi.validate_form: unknown test '" + test + "' for element ID '" + $e.prop('id') + "'";
43         console.error(error);
44         alert(error);
45         return false;
46       }
47     }
48
49     return true;
50   }
51
52   ns.checks = {
53     required: function($e) {
54       if ($e.val() === '') {
55         ns.annotate($e, kivi.t8("This field must not be empty."));
56         return false;
57       } else {
58         ns.annotate($e);
59         return true;
60       }
61     },
62     number: function($e) {
63       var number_string = $e.val();
64
65       var parsed_number = kivi.parse_amount(number_string);
66
67       if (parsed_number === null) {
68         $e.val('');
69         ns.annotate($e);
70         return true;
71       } else
72       if (parsed_number === undefined) {
73         ns.annotate($e, kivi.t8('Wrong number format (#1)', [ kivi.myconfig.numberformat ]));
74         return false;
75       } else
76       {
77         var formatted_number = kivi.format_amount(parsed_number);
78         if (formatted_number != number_string)
79           $e.val(formatted_number);
80         ns.annotate($e);
81         return true;
82       }
83     },
84     date: function($e) {
85       var date_string = $e.val();
86
87       var parsed_date = kivi.parse_date(date_string);
88
89       if (parsed_date === null) {
90         $e.val('');
91         ns.annotate($e);
92         return true;
93       } else
94       if (parsed_date === undefined) {
95         ns.annotate($e, kivi.t8('Wrong date format (#1)', [ kivi.myconfig.dateformat ]));
96         return false;
97       } else
98       {
99         var formatted_date = kivi.format_date(parsed_date);
100         if (formatted_date != date_string)
101           $e.val(formatted_date);
102         ns.annotate($e);
103         return true;
104       }
105     }
106   };
107
108   ns.annotate = function($e, error) {
109     if (error) {
110       $e.addClass('kivi-validator-invalid');
111       if ($e.hasClass('tooltipstered'))
112         $e.tooltipster('destroy');
113
114       $e.tooltipster({
115         content: error,
116         theme: 'tooltipster-light',
117       });
118       $e.tooltipster('show');
119     } else {
120       $e.removeClass('kivi-validator-invalid');
121       if ($e.hasClass('tooltipstered'))
122         $e.tooltipster('destroy');
123     }
124   };
125
126   ns.reinit_widgets = function() {
127     kivi.run_once_for('[data-validate]', 'data-validate', function(elt) {
128       $(elt).change(function(event){ ns.validate($(elt), event) });
129     });
130   }
131
132   ns.init = ns.reinit_widgets;
133
134   $(ns.init);
135 });