MaterialComponents: Materialize modals als Ersatz für kivi.popup_dialog
[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(locale) {
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     M.updateTextFields();
80   }
81
82   // alternative for kivi.popup_dialog.
83   // opens materialize modal instead.
84   //
85   // differences: M.modal can not load external content, so it needs to be fetched manually and inserted into the DOM.
86   ns.popup_dialog = function(params) {
87     console.log(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.log(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
133     } else if(params.id) {
134       $div = $('#' + params.id);
135     } else {
136       console.error("insufficient parameters to open dialog");
137       return 0;
138     }
139
140     $div.modal('open');
141
142     return true;
143
144   }
145 });