Zeiterfassung: Bei Projektauswahl ggf. Kunde daraus setzen
[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     time: function($e) {
109       var time_string = $e.val();
110
111       var parsed_time = kivi.parse_time(time_string);
112       if (parsed_time === null) {
113         $e.val('');
114         ns.annotate($e);
115         return true;
116       } else
117       if (parsed_time === undefined) {
118         ns.annotate($e, kivi.t8('Wrong time format (#1)', [ kivi.myconfig.timeformat ]));
119         return false;
120       } else
121       {
122         var formatted_time = kivi.format_time(parsed_time);
123         if (formatted_time != time_string)
124           $e.val(formatted_time);
125         ns.annotate($e);
126         return true;
127       }
128     }
129   };
130
131   ns.annotate = function($e, error) {
132     if (error) {
133       $e.addClass('kivi-validator-invalid');
134       if ($e.hasClass('tooltipstered'))
135         $e.tooltipster('destroy');
136
137       $e.tooltipster({
138         content: error,
139         theme: 'tooltipster-light',
140       });
141       $e.tooltipster('show');
142     } else {
143       $e.removeClass('kivi-validator-invalid');
144       if ($e.hasClass('tooltipstered'))
145         $e.tooltipster('destroy');
146     }
147   };
148
149   ns.reinit_widgets = function() {
150     kivi.run_once_for('[data-validate]', 'data-validate', function(elt) {
151       $(elt).change(function(event){ ns.validate($(elt), event) });
152     });
153   }
154
155   ns.init = ns.reinit_widgets;
156
157   $(ns.init);
158 });