@osimatic/helpers-js 1.1.77 → 1.1.78
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG +76 -76
- package/array.js +93 -90
- package/bank.js +20 -20
- package/contact_details.js +194 -194
- package/count_down.js +102 -102
- package/data_table.js +416 -416
- package/date_time.js +592 -592
- package/details_sub_array.js +123 -123
- package/draw.js +52 -52
- package/duration.js +198 -198
- package/event_bus.js +38 -38
- package/file.js +146 -146
- package/flash_message.js +35 -35
- package/form_date.js +610 -610
- package/form_helper.js +410 -410
- package/google_charts.js +347 -347
- package/google_maps.js +169 -169
- package/google_recaptcha.js +87 -87
- package/http_client.js +469 -469
- package/import_from_csv.js +273 -273
- package/index.js +55 -55
- package/jwt.js +288 -288
- package/list_box.js +112 -112
- package/location.js +431 -431
- package/media.js +218 -218
- package/multiple_action_in_table.js +336 -336
- package/network.js +756 -756
- package/number.js +99 -99
- package/open_street_map.js +142 -142
- package/package.json +15 -15
- package/paging.js +278 -278
- package/php.min.js +5 -5
- package/revolut.js +22 -22
- package/select_all.js +121 -121
- package/shopping_cart.js +31 -31
- package/social_network.js +109 -109
- package/sortable_list.js +37 -37
- package/string.js +162 -162
- package/util.js +16 -16
- package/visitor.js +77 -77
- package/web_rtc.js +114 -114
- package/web_socket.js +97 -97
package/data_table.js
CHANGED
|
@@ -1,417 +1,417 @@
|
|
|
1
|
-
|
|
2
|
-
class DataTable {
|
|
3
|
-
|
|
4
|
-
static setOptions(options) {
|
|
5
|
-
DataTable.dateTableOptions = Object.assign(...DataTable.getOptions(), options);
|
|
6
|
-
}
|
|
7
|
-
static getOptions() {
|
|
8
|
-
return DataTable.dateTableOptions || {};
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
static setCallbackOnLoadData(callback) {
|
|
12
|
-
this.callbackOnLoadData = callback;
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
// ------------------------------------------------------------
|
|
16
|
-
// Critères
|
|
17
|
-
// ------------------------------------------------------------
|
|
18
|
-
|
|
19
|
-
static populateFormFromFilters(form) {
|
|
20
|
-
FormHelper.populateForm(form, this.criteres);
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
static setDefaultFilters(filters) {
|
|
24
|
-
this.criteres = filters;
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
static setFiltersFromForm(form) {
|
|
28
|
-
this.criteres = UrlAndQueryString.parseQuery(form.serialize());
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
static getFilterParam(key) {
|
|
32
|
-
return this.criteres[key] || 'NONE';
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
static getFilters() {
|
|
36
|
-
return this.criteres;
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
// ------------------------------------------------------------
|
|
40
|
-
// Chargement tableau
|
|
41
|
-
// ------------------------------------------------------------
|
|
42
|
-
|
|
43
|
-
static init(options) {
|
|
44
|
-
let div = options.div;
|
|
45
|
-
let defaultFilters = options.default_filters || {};
|
|
46
|
-
|
|
47
|
-
//let form = div.find('.filter_popover_content form');
|
|
48
|
-
//if (typeof form != 'undefined') {
|
|
49
|
-
let queryStringFilters = UrlAndQueryString.parseQuery(window.location.search);
|
|
50
|
-
defaultFilters = Object.assign(defaultFilters, queryStringFilters);
|
|
51
|
-
//}
|
|
52
|
-
|
|
53
|
-
// Bouton filtrer
|
|
54
|
-
let filterLink = div.find('a.filter_link');
|
|
55
|
-
if (filterLink.length) {
|
|
56
|
-
filterLink.popover({
|
|
57
|
-
content: div.find('.filter_popover_content').html(),
|
|
58
|
-
template: '<div class="popover filter_popover" role="tooltip"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>',
|
|
59
|
-
container: 'body',
|
|
60
|
-
// trigger: 'manual',
|
|
61
|
-
trigger: 'click',
|
|
62
|
-
html: true,
|
|
63
|
-
animation: false,
|
|
64
|
-
// placement: 'topRight'
|
|
65
|
-
placement: 'leftTop'
|
|
66
|
-
})
|
|
67
|
-
.click(function(e) {
|
|
68
|
-
// $('.popover').not(this).hide(); // optional, hide other popovers
|
|
69
|
-
e.preventDefault();
|
|
70
|
-
});
|
|
71
|
-
|
|
72
|
-
filterLink.on('shown.bs.popover', function () {
|
|
73
|
-
let form = $('.filter_popover form');
|
|
74
|
-
|
|
75
|
-
DataTable.populateFormFromFilters(form);
|
|
76
|
-
|
|
77
|
-
// Lien input period
|
|
78
|
-
InputPeriod.addLinks(form);
|
|
79
|
-
|
|
80
|
-
// Callback custom
|
|
81
|
-
if (typeof options.on_show_filter_form != 'undefined' && options.on_show_filter_form != null) {
|
|
82
|
-
options.on_show_filter_form(form);
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
form.find('button[type="submit"]').off('click').click(function(e) {
|
|
86
|
-
// e.preventDefault();
|
|
87
|
-
DataTable.updateFiltersAndLoadData(div, form);
|
|
88
|
-
return false;
|
|
89
|
-
});
|
|
90
|
-
});
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
// Bouton exporter
|
|
94
|
-
let exportLink = div.find('a.export_link');
|
|
95
|
-
if (exportLink.length) {
|
|
96
|
-
if (typeof options.export_modal_enabled == 'undefined' || !options.export_modal_enabled) {
|
|
97
|
-
// sans modal
|
|
98
|
-
exportLink.click(function(e) {
|
|
99
|
-
e.preventDefault();
|
|
100
|
-
var button = $(this).attr('disabled', true).button('loading');
|
|
101
|
-
if (typeof options.on_export != 'undefined' && options.on_export != null) {
|
|
102
|
-
options.on_export(button.data('format'), {...DataTable.getFilters()}, () => {
|
|
103
|
-
button.attr('disabled', false).button('reset');
|
|
104
|
-
});
|
|
105
|
-
}
|
|
106
|
-
return false;
|
|
107
|
-
});
|
|
108
|
-
}
|
|
109
|
-
else {
|
|
110
|
-
// avec modal
|
|
111
|
-
exportLink.click(function(e) {
|
|
112
|
-
// todo : ouvrir modal #modal_export lors du click sur le lien
|
|
113
|
-
});
|
|
114
|
-
|
|
115
|
-
$('div#modal_export').on('show.bs.modal', function (event) {
|
|
116
|
-
let button = $(event.relatedTarget);
|
|
117
|
-
let modal = $(this);
|
|
118
|
-
let form = modal.find('form');
|
|
119
|
-
|
|
120
|
-
// Fonction de callback permettant d'initialiser contenu du modal export, cette fonction doit renvoyer le contenu du modal
|
|
121
|
-
if (typeof options.set_export_form != 'undefined' && options.set_export_form != null) {
|
|
122
|
-
modal.find('modal-body').html(options.set_export_form(modal, button));
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
// Fonction de callback permettant d'initialiser le modal export
|
|
126
|
-
if (typeof options.on_show_export_form != 'undefined' && options.on_show_export_form != null) {
|
|
127
|
-
modal.find('modal-body').html(options.on_show_export_form(modal, button));
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
let btnSubmit = form.find('button[type="submit"]').attr('disabled', false).button('reset');
|
|
131
|
-
btnSubmit.off('click').click(function(e) {
|
|
132
|
-
e.preventDefault();
|
|
133
|
-
$(this).attr('disabled', true).button('loading');
|
|
134
|
-
|
|
135
|
-
// Une fois le formulaire d'export validé, si fonction callback spécifié, on l'appelle, cette fonction doit renvoyer true ou false pour savoir si le form contient des erreurs ou non.
|
|
136
|
-
let hasErrors = false;
|
|
137
|
-
if (typeof options.on_submit_export_modal != 'undefined' && options.on_submit_export_modal != null) {
|
|
138
|
-
hasErrors = options.on_submit_export_modal(modal, button);
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
if (hasErrors) {
|
|
142
|
-
$(this).attr('disabled', false).button('reset');
|
|
143
|
-
return false;
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
// S'il n'y a pas d'erreur on enclenche l'export
|
|
147
|
-
if (typeof options.on_export != 'undefined' && options.on_export != null) {
|
|
148
|
-
options.on_export(button.data('format'), {...DataTable.getFilters()}, form, () => {
|
|
149
|
-
// Retrait du modal
|
|
150
|
-
modal.modal('hide');
|
|
151
|
-
});
|
|
152
|
-
}
|
|
153
|
-
|
|
154
|
-
return false;
|
|
155
|
-
});
|
|
156
|
-
});
|
|
157
|
-
}
|
|
158
|
-
|
|
159
|
-
}
|
|
160
|
-
|
|
161
|
-
//console.log('defaultFilters', defaultFilters);
|
|
162
|
-
|
|
163
|
-
DataTable.setDefaultFilters(defaultFilters);
|
|
164
|
-
DataTable.setCallbackOnLoadData(options.on_load_data);
|
|
165
|
-
|
|
166
|
-
DataTable.loadData(div);
|
|
167
|
-
}
|
|
168
|
-
|
|
169
|
-
static updateFiltersAndLoadData(div, form) {
|
|
170
|
-
DataTable.setFiltersFromForm(form);
|
|
171
|
-
DataTable.addBrowserHistory();
|
|
172
|
-
// DataTable.populateFormFromFilters($('.filter_popover form'));
|
|
173
|
-
|
|
174
|
-
$('a.filter_link').popover('hide');
|
|
175
|
-
$('.filter_popover').remove();
|
|
176
|
-
|
|
177
|
-
DataTable.loadData(div);
|
|
178
|
-
}
|
|
179
|
-
|
|
180
|
-
static loadData(div) {
|
|
181
|
-
console.log('DataTable.loadData');
|
|
182
|
-
DataTable.addLoader(div);
|
|
183
|
-
|
|
184
|
-
if (typeof this.callbackOnLoadData != 'undefined' && this.callbackOnLoadData != null) {
|
|
185
|
-
this.callbackOnLoadData(div, DataTable.getFilters());
|
|
186
|
-
}
|
|
187
|
-
}
|
|
188
|
-
|
|
189
|
-
static addBrowserHistory() {
|
|
190
|
-
//console.log('addBrowserHistory');
|
|
191
|
-
// on ne garde que les critères contenant des valeurs de type string ou tableau avec max 3 éléments
|
|
192
|
-
let savedCriterias = Object.filter(this.criteres, value => (!Array.isArray(value) || (Array.isArray(value) && value.length <= 3)));
|
|
193
|
-
//console.log('savedCriterias', savedCriterias);
|
|
194
|
-
|
|
195
|
-
//var url = urldecode(urlRetour);
|
|
196
|
-
var url = window.location.href;
|
|
197
|
-
//console.log('current url', url);
|
|
198
|
-
|
|
199
|
-
let queryString = UrlAndQueryString.getQueryString(url);
|
|
200
|
-
//console.log('current QueryString', queryString);
|
|
201
|
-
|
|
202
|
-
// todo : delete params qui ne sont pas dans savedCriterias
|
|
203
|
-
Object.entries(savedCriterias).forEach(([key, value]) => queryString = UrlAndQueryString.setParam(queryString, key, value));
|
|
204
|
-
queryString = queryString.includes('?') ? queryString.substring(1) : queryString;
|
|
205
|
-
//console.log('new queryString', queryString);
|
|
206
|
-
|
|
207
|
-
let newUrl = UrlAndQueryString.getHostAndPath(url) + '?' + queryString;
|
|
208
|
-
window.history.pushState("", "", newUrl);
|
|
209
|
-
}
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
// ------------------------------------------------------------
|
|
213
|
-
// Affichage tableau
|
|
214
|
-
// ------------------------------------------------------------
|
|
215
|
-
|
|
216
|
-
static resetContent(div) {
|
|
217
|
-
//console.log('resetContent');
|
|
218
|
-
div.find('span.nb_items_many, span.nb_items_one').addClass('hide');
|
|
219
|
-
div.find('span.nb_items_no').removeClass('hide');
|
|
220
|
-
var table = div.find('table.table');
|
|
221
|
-
table.find('thead,tfoot').removeClass('hide');
|
|
222
|
-
table.find('tbody').children().remove();
|
|
223
|
-
|
|
224
|
-
if ($.fn.dataTable.isDataTable(table)) {
|
|
225
|
-
table.DataTable().clear();
|
|
226
|
-
table.DataTable().destroy();
|
|
227
|
-
}
|
|
228
|
-
}
|
|
229
|
-
|
|
230
|
-
static addModalLoader(modal, btnSubmit) {
|
|
231
|
-
modal.find('.modal-body').addClass('hide').before('<div class="modal-body loader center"><i class="fa fa-circle-notch fa-spin"></i></div>');
|
|
232
|
-
if (typeof btnSubmit != 'undefined') {
|
|
233
|
-
btnSubmit.attr('disabled', true).button('loading');
|
|
234
|
-
}
|
|
235
|
-
}
|
|
236
|
-
static removeModalLoader(modal, btnSubmit) {
|
|
237
|
-
modal.find('.modal-body').removeClass('hide').parent().find('.loader').remove();
|
|
238
|
-
if (typeof btnSubmit != 'undefined') {
|
|
239
|
-
btnSubmit.attr('disabled', false).button('reset');
|
|
240
|
-
}
|
|
241
|
-
}
|
|
242
|
-
|
|
243
|
-
static addLoader(div, isSmall) {
|
|
244
|
-
if (typeof isSmall != 'undefined' && isSmall) {
|
|
245
|
-
div.addClass('hide').before('<p class="loader center"><i class="fa fa-circle-notch fa-spin"></i></p>');
|
|
246
|
-
return;
|
|
247
|
-
}
|
|
248
|
-
//div.addClass('hide').parent().prepend('<div class="alert alert-info loader center">Veuillez patienter… <br><p><i class="fa fa-circle-notch fa-spin"></i></p></div>');
|
|
249
|
-
div.addClass('hide').before('<div class="alert alert-info loader center">Veuillez patienter… <br><p><i class="fa fa-circle-notch fa-spin"></i></p></div>');
|
|
250
|
-
}
|
|
251
|
-
static removeLoader(div) {
|
|
252
|
-
div.removeClass('hide').parent().find('.loader').remove();
|
|
253
|
-
}
|
|
254
|
-
|
|
255
|
-
static displayErrorMessage(div, msg) {
|
|
256
|
-
this.displayMessage(div, msg, 'danger');
|
|
257
|
-
}
|
|
258
|
-
static displayMessage(div, msg, cssClass /*, removeLoader=false*/) {
|
|
259
|
-
this.resetContent(div);
|
|
260
|
-
let table = div.find('table');
|
|
261
|
-
table.find('thead,tfoot').addClass('hide');
|
|
262
|
-
let msgHtml = '<div class="text-'+cssClass+' center">'+msg+'</div>';
|
|
263
|
-
if (table.find('tbody').length == 0) {
|
|
264
|
-
table.append('<tbody></tbody>');
|
|
265
|
-
}
|
|
266
|
-
table.find('tbody').append('<tr class="no_items '+cssClass+'"><td>'+msgHtml+'</td></tr>');
|
|
267
|
-
// table.after(msgHtml);
|
|
268
|
-
// if (removeLoader) {
|
|
269
|
-
DataTable.removeLoader(div);
|
|
270
|
-
// }
|
|
271
|
-
}
|
|
272
|
-
|
|
273
|
-
static displayError(div, data, defaultMessage) {
|
|
274
|
-
let error = null;
|
|
275
|
-
if (data != null) {
|
|
276
|
-
if (typeof data.error != 'undefined') {
|
|
277
|
-
error = data.error;
|
|
278
|
-
}
|
|
279
|
-
else if (typeof data[0] != 'undefined' && typeof data[0].error != 'undefined') {
|
|
280
|
-
error = data[0].error;
|
|
281
|
-
}
|
|
282
|
-
}
|
|
283
|
-
|
|
284
|
-
if (error == null) {
|
|
285
|
-
return this.displayErrorMessage(div, (typeof defaultMessage != 'undefined' ? defaultMessage : (typeof labelErrorOccured != 'undefined' ? labelErrorOccured : 'Une erreur s’est produite.')));
|
|
286
|
-
}
|
|
287
|
-
return this.displayErrorMessage(div, 'Critères sélectionnés incorrect.');
|
|
288
|
-
}
|
|
289
|
-
|
|
290
|
-
static getDefaultColumnsForDisplayedTable(div) {
|
|
291
|
-
let table = div.find('table');
|
|
292
|
-
let columns = [];
|
|
293
|
-
let defaultHiddenColumns = table.data('hidden_fields') != null ? table.data('hidden_fields').split(',') : [];
|
|
294
|
-
table.find('thead tr th').each(function(idx, th) {
|
|
295
|
-
if (defaultHiddenColumns.indexOf($(th).data('key')) == -1) {
|
|
296
|
-
columns.push($(th).data('key'));
|
|
297
|
-
}
|
|
298
|
-
});
|
|
299
|
-
//console.log(columns);
|
|
300
|
-
return columns;
|
|
301
|
-
}
|
|
302
|
-
|
|
303
|
-
static setDataContent(div, data, displayLineCallback, completeCallback) {
|
|
304
|
-
//console.log('setDataContent');
|
|
305
|
-
let table = div.find('table').removeClass('hide');
|
|
306
|
-
|
|
307
|
-
try {
|
|
308
|
-
DataTable.resetContent(div);
|
|
309
|
-
let tableBody = table.find('tbody');
|
|
310
|
-
for (let i = 0; i < data.length; i++) {
|
|
311
|
-
tableBody.append(displayLineCallback(data[i]));
|
|
312
|
-
}
|
|
313
|
-
|
|
314
|
-
if (data.length) {
|
|
315
|
-
div.find('span.nb_items_no').addClass('hide');
|
|
316
|
-
if (data.length === 1 && div.find('span.nb_items_one').length) {
|
|
317
|
-
div.find('span.nb_items_one').removeClass('hide');
|
|
318
|
-
}
|
|
319
|
-
else {
|
|
320
|
-
div.find('span.nb_items_many').removeClass('hide');
|
|
321
|
-
div.find('span.nb_items').text(data.length);
|
|
322
|
-
}
|
|
323
|
-
}
|
|
324
|
-
else {
|
|
325
|
-
// si pas de plugin DataTable sur le tableau, on cache le tableau s'il n'y a pas de résultat
|
|
326
|
-
if (table.is('[data-no_datatables="1"]')) {
|
|
327
|
-
table.addClass('hide');
|
|
328
|
-
}
|
|
329
|
-
}
|
|
330
|
-
|
|
331
|
-
DataTable.initDataContent(div);
|
|
332
|
-
if (typeof completeCallback == 'function') {
|
|
333
|
-
completeCallback();
|
|
334
|
-
}
|
|
335
|
-
DataTable.removeLoader(div);
|
|
336
|
-
}
|
|
337
|
-
catch (e) {
|
|
338
|
-
console.error(e);
|
|
339
|
-
}
|
|
340
|
-
}
|
|
341
|
-
|
|
342
|
-
static initDataContent(div) {
|
|
343
|
-
//console.log('initDataContent');
|
|
344
|
-
let table = div.find('table');
|
|
345
|
-
|
|
346
|
-
// Popover/Tooltip
|
|
347
|
-
div.find('[data-toggle="popover"]').popover({'trigger':'hover', 'html':true});
|
|
348
|
-
div.find('[data-toggle="tooltip"]').tooltip();
|
|
349
|
-
|
|
350
|
-
// Action multiple / checkbox select all
|
|
351
|
-
if (table.length > 0) {
|
|
352
|
-
//SelectAll.initInTable(table);
|
|
353
|
-
//MultipleActionInTable.init(table);
|
|
354
|
-
|
|
355
|
-
//paging(div.find('select.pagination_max_rows'));
|
|
356
|
-
}
|
|
357
|
-
|
|
358
|
-
if (table.length > 0 && !table.is('[data-no_datatables="1"]') && !$.fn.dataTable.isDataTable(table)) {
|
|
359
|
-
if (table.data('page_length') != null) {
|
|
360
|
-
DataTable.getOptions()['pageLength'] = table.data('page_length');
|
|
361
|
-
}
|
|
362
|
-
table.DataTable(DataTable.getOptions());
|
|
363
|
-
}
|
|
364
|
-
|
|
365
|
-
DataTable.updateDataContent(div);
|
|
366
|
-
}
|
|
367
|
-
|
|
368
|
-
static updateDataContent(div) {
|
|
369
|
-
let table = div.find('table');
|
|
370
|
-
|
|
371
|
-
// Maj colonnes
|
|
372
|
-
if (table.length > 0 && typeof div.data('table_name') != 'undefined' && div.data('table_name') != null && div.data('display_items').split(',').indexOf('table_columns') != -1) {
|
|
373
|
-
table.find('thead tr th').each(function(idx, th) {
|
|
374
|
-
// table.find('.'+$(th).data('key')+':not(.select):not(.action)').hide();
|
|
375
|
-
table.find('.'+$(th).data('key')+':not(.select):not(.action)').addClass('hide');
|
|
376
|
-
});
|
|
377
|
-
let columns = this.getDisplayParam(div, 'html', null, 'columns').split(',').removeEmptyValues();
|
|
378
|
-
$.each(columns, function(idx, key) {
|
|
379
|
-
table.find('.'+key).removeClass('hide');
|
|
380
|
-
// table.find('.'+key).show();
|
|
381
|
-
});
|
|
382
|
-
}
|
|
383
|
-
|
|
384
|
-
if (typeof this.callbackOnUpdateDataContent != 'undefined' && this.callbackOnUpdateDataContent != null) {
|
|
385
|
-
this.callbackOnUpdateDataContent(div);
|
|
386
|
-
}
|
|
387
|
-
}
|
|
388
|
-
|
|
389
|
-
static filterRows(table, callback) {
|
|
390
|
-
if (!$.fn.dataTable.isDataTable(table)) {
|
|
391
|
-
return;
|
|
392
|
-
}
|
|
393
|
-
|
|
394
|
-
$.fn.dataTable.ext.search = [];
|
|
395
|
-
//$.fn.dataTable.ext.search.pop();
|
|
396
|
-
let dataTableObject = table.DataTable();
|
|
397
|
-
$.fn.dataTable.ext.search.push(
|
|
398
|
-
function(settings, searchData, index, rowData, counter) {
|
|
399
|
-
return callback($(dataTableObject.row(index).node()));
|
|
400
|
-
}
|
|
401
|
-
);
|
|
402
|
-
dataTableObject.draw();
|
|
403
|
-
}
|
|
404
|
-
|
|
405
|
-
static sort(table, tdSelector) {
|
|
406
|
-
//if (table.find('tbody tr').length > 0 && $.fn.dataTable.isDataTable(table)) {
|
|
407
|
-
if ($.fn.dataTable.isDataTable(table)) {
|
|
408
|
-
let idx = table.find('thead tr '+tdSelector).index();
|
|
409
|
-
if (idx >= 0) {
|
|
410
|
-
table.DataTable().order([idx, 'asc']);
|
|
411
|
-
}
|
|
412
|
-
}
|
|
413
|
-
}
|
|
414
|
-
|
|
415
|
-
}
|
|
416
|
-
|
|
1
|
+
|
|
2
|
+
class DataTable {
|
|
3
|
+
|
|
4
|
+
static setOptions(options) {
|
|
5
|
+
DataTable.dateTableOptions = Object.assign(...DataTable.getOptions(), options);
|
|
6
|
+
}
|
|
7
|
+
static getOptions() {
|
|
8
|
+
return DataTable.dateTableOptions || {};
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
static setCallbackOnLoadData(callback) {
|
|
12
|
+
this.callbackOnLoadData = callback;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
// ------------------------------------------------------------
|
|
16
|
+
// Critères
|
|
17
|
+
// ------------------------------------------------------------
|
|
18
|
+
|
|
19
|
+
static populateFormFromFilters(form) {
|
|
20
|
+
FormHelper.populateForm(form, this.criteres);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
static setDefaultFilters(filters) {
|
|
24
|
+
this.criteres = filters;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
static setFiltersFromForm(form) {
|
|
28
|
+
this.criteres = UrlAndQueryString.parseQuery(form.serialize());
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
static getFilterParam(key) {
|
|
32
|
+
return this.criteres[key] || 'NONE';
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
static getFilters() {
|
|
36
|
+
return this.criteres;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
// ------------------------------------------------------------
|
|
40
|
+
// Chargement tableau
|
|
41
|
+
// ------------------------------------------------------------
|
|
42
|
+
|
|
43
|
+
static init(options) {
|
|
44
|
+
let div = options.div;
|
|
45
|
+
let defaultFilters = options.default_filters || {};
|
|
46
|
+
|
|
47
|
+
//let form = div.find('.filter_popover_content form');
|
|
48
|
+
//if (typeof form != 'undefined') {
|
|
49
|
+
let queryStringFilters = UrlAndQueryString.parseQuery(window.location.search);
|
|
50
|
+
defaultFilters = Object.assign(defaultFilters, queryStringFilters);
|
|
51
|
+
//}
|
|
52
|
+
|
|
53
|
+
// Bouton filtrer
|
|
54
|
+
let filterLink = div.find('a.filter_link');
|
|
55
|
+
if (filterLink.length) {
|
|
56
|
+
filterLink.popover({
|
|
57
|
+
content: div.find('.filter_popover_content').html(),
|
|
58
|
+
template: '<div class="popover filter_popover" role="tooltip"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>',
|
|
59
|
+
container: 'body',
|
|
60
|
+
// trigger: 'manual',
|
|
61
|
+
trigger: 'click',
|
|
62
|
+
html: true,
|
|
63
|
+
animation: false,
|
|
64
|
+
// placement: 'topRight'
|
|
65
|
+
placement: 'leftTop'
|
|
66
|
+
})
|
|
67
|
+
.click(function(e) {
|
|
68
|
+
// $('.popover').not(this).hide(); // optional, hide other popovers
|
|
69
|
+
e.preventDefault();
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
filterLink.on('shown.bs.popover', function () {
|
|
73
|
+
let form = $('.filter_popover form');
|
|
74
|
+
|
|
75
|
+
DataTable.populateFormFromFilters(form);
|
|
76
|
+
|
|
77
|
+
// Lien input period
|
|
78
|
+
InputPeriod.addLinks(form);
|
|
79
|
+
|
|
80
|
+
// Callback custom
|
|
81
|
+
if (typeof options.on_show_filter_form != 'undefined' && options.on_show_filter_form != null) {
|
|
82
|
+
options.on_show_filter_form(form);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
form.find('button[type="submit"]').off('click').click(function(e) {
|
|
86
|
+
// e.preventDefault();
|
|
87
|
+
DataTable.updateFiltersAndLoadData(div, form);
|
|
88
|
+
return false;
|
|
89
|
+
});
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
// Bouton exporter
|
|
94
|
+
let exportLink = div.find('a.export_link');
|
|
95
|
+
if (exportLink.length) {
|
|
96
|
+
if (typeof options.export_modal_enabled == 'undefined' || !options.export_modal_enabled) {
|
|
97
|
+
// sans modal
|
|
98
|
+
exportLink.click(function(e) {
|
|
99
|
+
e.preventDefault();
|
|
100
|
+
var button = $(this).attr('disabled', true).button('loading');
|
|
101
|
+
if (typeof options.on_export != 'undefined' && options.on_export != null) {
|
|
102
|
+
options.on_export(button.data('format'), {...DataTable.getFilters()}, () => {
|
|
103
|
+
button.attr('disabled', false).button('reset');
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
return false;
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
else {
|
|
110
|
+
// avec modal
|
|
111
|
+
exportLink.click(function(e) {
|
|
112
|
+
// todo : ouvrir modal #modal_export lors du click sur le lien
|
|
113
|
+
});
|
|
114
|
+
|
|
115
|
+
$('div#modal_export').on('show.bs.modal', function (event) {
|
|
116
|
+
let button = $(event.relatedTarget);
|
|
117
|
+
let modal = $(this);
|
|
118
|
+
let form = modal.find('form');
|
|
119
|
+
|
|
120
|
+
// Fonction de callback permettant d'initialiser contenu du modal export, cette fonction doit renvoyer le contenu du modal
|
|
121
|
+
if (typeof options.set_export_form != 'undefined' && options.set_export_form != null) {
|
|
122
|
+
modal.find('modal-body').html(options.set_export_form(modal, button));
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
// Fonction de callback permettant d'initialiser le modal export
|
|
126
|
+
if (typeof options.on_show_export_form != 'undefined' && options.on_show_export_form != null) {
|
|
127
|
+
modal.find('modal-body').html(options.on_show_export_form(modal, button));
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
let btnSubmit = form.find('button[type="submit"]').attr('disabled', false).button('reset');
|
|
131
|
+
btnSubmit.off('click').click(function(e) {
|
|
132
|
+
e.preventDefault();
|
|
133
|
+
$(this).attr('disabled', true).button('loading');
|
|
134
|
+
|
|
135
|
+
// Une fois le formulaire d'export validé, si fonction callback spécifié, on l'appelle, cette fonction doit renvoyer true ou false pour savoir si le form contient des erreurs ou non.
|
|
136
|
+
let hasErrors = false;
|
|
137
|
+
if (typeof options.on_submit_export_modal != 'undefined' && options.on_submit_export_modal != null) {
|
|
138
|
+
hasErrors = options.on_submit_export_modal(modal, button);
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
if (hasErrors) {
|
|
142
|
+
$(this).attr('disabled', false).button('reset');
|
|
143
|
+
return false;
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
// S'il n'y a pas d'erreur on enclenche l'export
|
|
147
|
+
if (typeof options.on_export != 'undefined' && options.on_export != null) {
|
|
148
|
+
options.on_export(button.data('format'), {...DataTable.getFilters()}, form, () => {
|
|
149
|
+
// Retrait du modal
|
|
150
|
+
modal.modal('hide');
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
return false;
|
|
155
|
+
});
|
|
156
|
+
});
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
//console.log('defaultFilters', defaultFilters);
|
|
162
|
+
|
|
163
|
+
DataTable.setDefaultFilters(defaultFilters);
|
|
164
|
+
DataTable.setCallbackOnLoadData(options.on_load_data);
|
|
165
|
+
|
|
166
|
+
DataTable.loadData(div);
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
static updateFiltersAndLoadData(div, form) {
|
|
170
|
+
DataTable.setFiltersFromForm(form);
|
|
171
|
+
DataTable.addBrowserHistory();
|
|
172
|
+
// DataTable.populateFormFromFilters($('.filter_popover form'));
|
|
173
|
+
|
|
174
|
+
$('a.filter_link').popover('hide');
|
|
175
|
+
$('.filter_popover').remove();
|
|
176
|
+
|
|
177
|
+
DataTable.loadData(div);
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
static loadData(div) {
|
|
181
|
+
console.log('DataTable.loadData');
|
|
182
|
+
DataTable.addLoader(div);
|
|
183
|
+
|
|
184
|
+
if (typeof this.callbackOnLoadData != 'undefined' && this.callbackOnLoadData != null) {
|
|
185
|
+
this.callbackOnLoadData(div, DataTable.getFilters());
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
static addBrowserHistory() {
|
|
190
|
+
//console.log('addBrowserHistory');
|
|
191
|
+
// on ne garde que les critères contenant des valeurs de type string ou tableau avec max 3 éléments
|
|
192
|
+
let savedCriterias = Object.filter(this.criteres, value => (!Array.isArray(value) || (Array.isArray(value) && value.length <= 3)));
|
|
193
|
+
//console.log('savedCriterias', savedCriterias);
|
|
194
|
+
|
|
195
|
+
//var url = urldecode(urlRetour);
|
|
196
|
+
var url = window.location.href;
|
|
197
|
+
//console.log('current url', url);
|
|
198
|
+
|
|
199
|
+
let queryString = UrlAndQueryString.getQueryString(url);
|
|
200
|
+
//console.log('current QueryString', queryString);
|
|
201
|
+
|
|
202
|
+
// todo : delete params qui ne sont pas dans savedCriterias
|
|
203
|
+
Object.entries(savedCriterias).forEach(([key, value]) => queryString = UrlAndQueryString.setParam(queryString, key, value));
|
|
204
|
+
queryString = queryString.includes('?') ? queryString.substring(1) : queryString;
|
|
205
|
+
//console.log('new queryString', queryString);
|
|
206
|
+
|
|
207
|
+
let newUrl = UrlAndQueryString.getHostAndPath(url) + '?' + queryString;
|
|
208
|
+
window.history.pushState("", "", newUrl);
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
|
|
212
|
+
// ------------------------------------------------------------
|
|
213
|
+
// Affichage tableau
|
|
214
|
+
// ------------------------------------------------------------
|
|
215
|
+
|
|
216
|
+
static resetContent(div) {
|
|
217
|
+
//console.log('resetContent');
|
|
218
|
+
div.find('span.nb_items_many, span.nb_items_one').addClass('hide');
|
|
219
|
+
div.find('span.nb_items_no').removeClass('hide');
|
|
220
|
+
var table = div.find('table.table');
|
|
221
|
+
table.find('thead,tfoot').removeClass('hide');
|
|
222
|
+
table.find('tbody').children().remove();
|
|
223
|
+
|
|
224
|
+
if ($.fn.dataTable.isDataTable(table)) {
|
|
225
|
+
table.DataTable().clear();
|
|
226
|
+
table.DataTable().destroy();
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
static addModalLoader(modal, btnSubmit) {
|
|
231
|
+
modal.find('.modal-body').addClass('hide').before('<div class="modal-body loader center"><i class="fa fa-circle-notch fa-spin"></i></div>');
|
|
232
|
+
if (typeof btnSubmit != 'undefined') {
|
|
233
|
+
btnSubmit.attr('disabled', true).button('loading');
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
static removeModalLoader(modal, btnSubmit) {
|
|
237
|
+
modal.find('.modal-body').removeClass('hide').parent().find('.loader').remove();
|
|
238
|
+
if (typeof btnSubmit != 'undefined') {
|
|
239
|
+
btnSubmit.attr('disabled', false).button('reset');
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
static addLoader(div, isSmall) {
|
|
244
|
+
if (typeof isSmall != 'undefined' && isSmall) {
|
|
245
|
+
div.addClass('hide').before('<p class="loader center"><i class="fa fa-circle-notch fa-spin"></i></p>');
|
|
246
|
+
return;
|
|
247
|
+
}
|
|
248
|
+
//div.addClass('hide').parent().prepend('<div class="alert alert-info loader center">Veuillez patienter… <br><p><i class="fa fa-circle-notch fa-spin"></i></p></div>');
|
|
249
|
+
div.addClass('hide').before('<div class="alert alert-info loader center">Veuillez patienter… <br><p><i class="fa fa-circle-notch fa-spin"></i></p></div>');
|
|
250
|
+
}
|
|
251
|
+
static removeLoader(div) {
|
|
252
|
+
div.removeClass('hide').parent().find('.loader').remove();
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
static displayErrorMessage(div, msg) {
|
|
256
|
+
this.displayMessage(div, msg, 'danger');
|
|
257
|
+
}
|
|
258
|
+
static displayMessage(div, msg, cssClass /*, removeLoader=false*/) {
|
|
259
|
+
this.resetContent(div);
|
|
260
|
+
let table = div.find('table');
|
|
261
|
+
table.find('thead,tfoot').addClass('hide');
|
|
262
|
+
let msgHtml = '<div class="text-'+cssClass+' center">'+msg+'</div>';
|
|
263
|
+
if (table.find('tbody').length == 0) {
|
|
264
|
+
table.append('<tbody></tbody>');
|
|
265
|
+
}
|
|
266
|
+
table.find('tbody').append('<tr class="no_items '+cssClass+'"><td>'+msgHtml+'</td></tr>');
|
|
267
|
+
// table.after(msgHtml);
|
|
268
|
+
// if (removeLoader) {
|
|
269
|
+
DataTable.removeLoader(div);
|
|
270
|
+
// }
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
static displayError(div, data, defaultMessage) {
|
|
274
|
+
let error = null;
|
|
275
|
+
if (data != null) {
|
|
276
|
+
if (typeof data.error != 'undefined') {
|
|
277
|
+
error = data.error;
|
|
278
|
+
}
|
|
279
|
+
else if (typeof data[0] != 'undefined' && typeof data[0].error != 'undefined') {
|
|
280
|
+
error = data[0].error;
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
if (error == null) {
|
|
285
|
+
return this.displayErrorMessage(div, (typeof defaultMessage != 'undefined' ? defaultMessage : (typeof labelErrorOccured != 'undefined' ? labelErrorOccured : 'Une erreur s’est produite.')));
|
|
286
|
+
}
|
|
287
|
+
return this.displayErrorMessage(div, 'Critères sélectionnés incorrect.');
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
static getDefaultColumnsForDisplayedTable(div) {
|
|
291
|
+
let table = div.find('table');
|
|
292
|
+
let columns = [];
|
|
293
|
+
let defaultHiddenColumns = table.data('hidden_fields') != null ? table.data('hidden_fields').split(',') : [];
|
|
294
|
+
table.find('thead tr th').each(function(idx, th) {
|
|
295
|
+
if (defaultHiddenColumns.indexOf($(th).data('key')) == -1) {
|
|
296
|
+
columns.push($(th).data('key'));
|
|
297
|
+
}
|
|
298
|
+
});
|
|
299
|
+
//console.log(columns);
|
|
300
|
+
return columns;
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
static setDataContent(div, data, displayLineCallback, completeCallback) {
|
|
304
|
+
//console.log('setDataContent');
|
|
305
|
+
let table = div.find('table').removeClass('hide');
|
|
306
|
+
|
|
307
|
+
try {
|
|
308
|
+
DataTable.resetContent(div);
|
|
309
|
+
let tableBody = table.find('tbody');
|
|
310
|
+
for (let i = 0; i < data.length; i++) {
|
|
311
|
+
tableBody.append(displayLineCallback(data[i]));
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
if (data.length) {
|
|
315
|
+
div.find('span.nb_items_no').addClass('hide');
|
|
316
|
+
if (data.length === 1 && div.find('span.nb_items_one').length) {
|
|
317
|
+
div.find('span.nb_items_one').removeClass('hide');
|
|
318
|
+
}
|
|
319
|
+
else {
|
|
320
|
+
div.find('span.nb_items_many').removeClass('hide');
|
|
321
|
+
div.find('span.nb_items').text(data.length);
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
else {
|
|
325
|
+
// si pas de plugin DataTable sur le tableau, on cache le tableau s'il n'y a pas de résultat
|
|
326
|
+
if (table.is('[data-no_datatables="1"]')) {
|
|
327
|
+
table.addClass('hide');
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
DataTable.initDataContent(div);
|
|
332
|
+
if (typeof completeCallback == 'function') {
|
|
333
|
+
completeCallback();
|
|
334
|
+
}
|
|
335
|
+
DataTable.removeLoader(div);
|
|
336
|
+
}
|
|
337
|
+
catch (e) {
|
|
338
|
+
console.error(e);
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
static initDataContent(div) {
|
|
343
|
+
//console.log('initDataContent');
|
|
344
|
+
let table = div.find('table');
|
|
345
|
+
|
|
346
|
+
// Popover/Tooltip
|
|
347
|
+
div.find('[data-toggle="popover"]').popover({'trigger':'hover', 'html':true});
|
|
348
|
+
div.find('[data-toggle="tooltip"]').tooltip();
|
|
349
|
+
|
|
350
|
+
// Action multiple / checkbox select all
|
|
351
|
+
if (table.length > 0) {
|
|
352
|
+
//SelectAll.initInTable(table);
|
|
353
|
+
//MultipleActionInTable.init(table);
|
|
354
|
+
|
|
355
|
+
//paging(div.find('select.pagination_max_rows'));
|
|
356
|
+
}
|
|
357
|
+
|
|
358
|
+
if (table.length > 0 && !table.is('[data-no_datatables="1"]') && !$.fn.dataTable.isDataTable(table)) {
|
|
359
|
+
if (table.data('page_length') != null) {
|
|
360
|
+
DataTable.getOptions()['pageLength'] = table.data('page_length');
|
|
361
|
+
}
|
|
362
|
+
table.DataTable(DataTable.getOptions());
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
DataTable.updateDataContent(div);
|
|
366
|
+
}
|
|
367
|
+
|
|
368
|
+
static updateDataContent(div) {
|
|
369
|
+
let table = div.find('table');
|
|
370
|
+
|
|
371
|
+
// Maj colonnes
|
|
372
|
+
if (table.length > 0 && typeof div.data('table_name') != 'undefined' && div.data('table_name') != null && div.data('display_items').split(',').indexOf('table_columns') != -1) {
|
|
373
|
+
table.find('thead tr th').each(function(idx, th) {
|
|
374
|
+
// table.find('.'+$(th).data('key')+':not(.select):not(.action)').hide();
|
|
375
|
+
table.find('.'+$(th).data('key')+':not(.select):not(.action)').addClass('hide');
|
|
376
|
+
});
|
|
377
|
+
let columns = this.getDisplayParam(div, 'html', null, 'columns').split(',').removeEmptyValues();
|
|
378
|
+
$.each(columns, function(idx, key) {
|
|
379
|
+
table.find('.'+key).removeClass('hide');
|
|
380
|
+
// table.find('.'+key).show();
|
|
381
|
+
});
|
|
382
|
+
}
|
|
383
|
+
|
|
384
|
+
if (typeof this.callbackOnUpdateDataContent != 'undefined' && this.callbackOnUpdateDataContent != null) {
|
|
385
|
+
this.callbackOnUpdateDataContent(div);
|
|
386
|
+
}
|
|
387
|
+
}
|
|
388
|
+
|
|
389
|
+
static filterRows(table, callback) {
|
|
390
|
+
if (!$.fn.dataTable.isDataTable(table)) {
|
|
391
|
+
return;
|
|
392
|
+
}
|
|
393
|
+
|
|
394
|
+
$.fn.dataTable.ext.search = [];
|
|
395
|
+
//$.fn.dataTable.ext.search.pop();
|
|
396
|
+
let dataTableObject = table.DataTable();
|
|
397
|
+
$.fn.dataTable.ext.search.push(
|
|
398
|
+
function(settings, searchData, index, rowData, counter) {
|
|
399
|
+
return callback($(dataTableObject.row(index).node()));
|
|
400
|
+
}
|
|
401
|
+
);
|
|
402
|
+
dataTableObject.draw();
|
|
403
|
+
}
|
|
404
|
+
|
|
405
|
+
static sort(table, tdSelector) {
|
|
406
|
+
//if (table.find('tbody tr').length > 0 && $.fn.dataTable.isDataTable(table)) {
|
|
407
|
+
if ($.fn.dataTable.isDataTable(table)) {
|
|
408
|
+
let idx = table.find('thead tr '+tdSelector).index();
|
|
409
|
+
if (idx >= 0) {
|
|
410
|
+
table.DataTable().order([idx, 'asc']);
|
|
411
|
+
}
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
|
|
415
|
+
}
|
|
416
|
+
|
|
417
417
|
module.exports = { DataTable };
|