006f8acb22f0b3dcfc75ad01e8e8ea8a8d255d5d
[kivitendo-erp.git] / js / kivi.Materialize.js
1 namespace("kivi.Materialize", function(ns) {
2   "use strict";
3
4   ns.init = function() {
5     ns.reinit_widgets();
6   };
7
8   ns.build_i18n = function() {
9     return {
10       months: [
11         kivi.t8('January'),
12         kivi.t8('February'),
13         kivi.t8('March'),
14         kivi.t8('April'),
15         kivi.t8('May'),
16         kivi.t8('June'),
17         kivi.t8('July'),
18         kivi.t8('August'),
19         kivi.t8('September'),
20         kivi.t8('October'),
21         kivi.t8('November'),
22         kivi.t8('December')
23       ],
24       monthsShort: [
25         kivi.t8('Jan'),
26         kivi.t8('Feb'),
27         kivi.t8('Mar'),
28         kivi.t8('Apr'),
29         kivi.t8('May'),
30         kivi.t8('Jun'),
31         kivi.t8('Jul'),
32         kivi.t8('Aug'),
33         kivi.t8('Sep'),
34         kivi.t8('Oct'),
35         kivi.t8('Nov'),
36         kivi.t8('Dec')
37       ],
38       weekdays: [
39         kivi.t8('Sunday'),
40         kivi.t8('Monday'),
41         kivi.t8('Tuesday'),
42         kivi.t8('Wednesday'),
43         kivi.t8('Thursday'),
44         kivi.t8('Friday'),
45         kivi.t8('Saturday')
46       ],
47       weekdaysShort: [
48         kivi.t8('Sun'),
49         kivi.t8('Mon'),
50         kivi.t8('Tue'),
51         kivi.t8('Wed'),
52         kivi.t8('Thu'),
53         kivi.t8('Fri'),
54         kivi.t8('Sat')
55       ],
56
57       // Buttons
58       today: kivi.t8('Today'),
59       done: kivi.t8('Ok'),
60       clear: kivi.t8('Clear'),
61       cancel: kivi.t8('Cancel'),
62
63       // Accessibility labels
64       labelMonthNext: kivi.t8('Next month'),
65       labelMonthPrev: kivi.t8('Previous month')
66     };
67   };
68
69   ns.reinit_widgets = function() {
70     $('.sidenav').sidenav();
71     $('select').formSelect();
72     $('.datepicker').datepicker({
73       firstDay: 1,
74       format: kivi.myconfig.dateformat,
75       showClearBtn: true,
76       i18n: ns.build_i18n()
77     });
78     $('.modal').modal();
79     $('.materialboxed').materialbox();
80     M.updateTextFields();
81   };
82
83   // alternative for kivi.popup_dialog.
84   // opens materialize modal instead.
85   //
86   // differences: M.modal can not load external content, so it needs to be fetched manually and inserted into the DOM.
87   ns.popup_dialog = function(params) {
88     params            = params        || { };
89     let id            = params.id     || 'jqueryui_popup_dialog';
90     let $div;
91     let custom_close  = params.dialog ? params.dialog.close : undefined;
92     let dialog_params = $.extend(
93       { // kivitendo default parameters.
94         // unlike classic layout, there is not fixed size, and M.modal is always... modal
95         onCloseStart: custom_close
96       },
97       // User supplied options:
98       params.dialog || { },
99       { // Options that must not be changed:
100         // close options already work
101       });
102
103     if (params.url) {
104       $.ajax({
105         url: params.url,
106         data: params.data,
107         success: function(data) {
108           params.html = data;
109           params.url = undefined;
110           params.data = undefined;
111           ns.popup_dialog(params);
112         },
113         error: function(x, status, error) { console.error(error); },
114         dataType: 'text',
115       });
116       return 1;
117     }
118
119     if (params.html) {
120       $div = $('<div>');
121       $div.attr('id', id);
122       $div.addClass("modal");
123       let $modal_content = $('<div>');
124       $modal_content.addClass('modal-content');
125       $modal_content.html(params.html);
126       $div.append($modal_content);
127       $('body').append($div);
128       kivi.reinit_widgets();
129       dialog_params.onCloseEnd = function() { $div.remove(); };
130
131       $div.modal(dialog_params);
132     } else if(params.id) {
133       $div = $('#' + params.id);
134     } else {
135       console.error("insufficient parameters to open dialog");
136       return 0;
137     }
138
139     $div.modal('open');
140
141     return true;
142   };
143
144   /**
145    * upload file to local storage for later sync
146    *
147    * should be used with P.M.file_upload(..., local=>1)
148    */
149   ns.LocalFileUpload = function(options) {
150     this.storage_token = options.storage_token; // used in localstorage to retrieve the file
151     this.dom_selector  = options.dom_selector;  // file inputs to listen on
152
153     this.init();
154   };
155
156   ns.LocalFileUpload.prototype = {
157     init: function() {
158       $(this.dom_selector).change(this.handle_file_upload);
159     },
160     handle_file_upload: function() {
161
162     },
163     load_files: function() {
164       return JSON.parse(localStorage.getImte(this.storage_token));
165     },
166     save_files: function() {
167       return JSON.parse(localStorage.getImte(this.storage_token));
168     },
169
170   };
171
172 });