@osimatic/helpers-js 1.0.710 → 1.1.0
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 +12 -1
- package/contact_details.js +27 -31
- package/data_table.js +30 -28
- package/date_time.js +77 -8
- package/details_sub_array.js +2 -2
- package/draw.js +53 -0
- package/duration.js +5 -9
- package/file.js +2 -2
- package/flash_message.js +4 -8
- package/form_helper.js +188 -92
- package/google_charts.js +16 -15
- package/http_client.js +409 -0
- package/import_from_csv.js +5 -5
- package/index.js +7 -5
- package/jwt.js +169 -46
- package/location.js +36 -13
- package/main.js +0 -0
- package/media.js +8 -9
- package/multiple_action_in_table.js +116 -18
- package/network.js +607 -597
- package/number.js +1 -1
- package/package.json +2 -2
- package/string.js +10 -10
- package/visitor.js +57 -1
package/http_client.js
ADDED
|
@@ -0,0 +1,409 @@
|
|
|
1
|
+
|
|
2
|
+
class HTTPClient {
|
|
3
|
+
// URL appelée pour rafraichir le token. Le token est mis à jour dans JwtSession. En cas de succès, on appelle HTTPClient.onSuccessRefreshTokenCallback et on réexécute toutes les requêtes HTTP en attente de nouveau token. En cas d'échec, on redirige vers HTTPClient.onInvalidRefreshTokenRedirectUrl et/ou on appelle HTTPClient.onInvalidRefreshTokenCallback.
|
|
4
|
+
static setRefreshTokenUrl(url) {
|
|
5
|
+
HTTPClient.refreshTokenUrl = url;
|
|
6
|
+
}
|
|
7
|
+
// Callback appelé pour remplacer l'appel à HTTPClient.refreshTokenUrl (et donc pas de gestion de la session avec JwtSession)
|
|
8
|
+
static setRefreshTokenCallback(callback) {
|
|
9
|
+
HTTPClient.refreshTokenCallback = callback;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
static setOnSuccessRefreshTokenCallback(callback) {
|
|
13
|
+
HTTPClient.onSuccessRefreshTokenCallback = callback;
|
|
14
|
+
}
|
|
15
|
+
static setOnInvalidRefreshTokenCallback(callback) {
|
|
16
|
+
HTTPClient.onInvalidRefreshTokenCallback = callback;
|
|
17
|
+
}
|
|
18
|
+
static setOnInvalidRefreshTokenRedirectUrl(url) {
|
|
19
|
+
HTTPClient.onInvalidRefreshTokenRedirectUrl = url;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
// URL de la page vers laquelle on redirige si le token est invalide apres destruction de la JwtSession.
|
|
23
|
+
static setOnInvalidTokenRedirectUrl(url) {
|
|
24
|
+
HTTPClient.onInvalidTokenRedirectUrl = url;
|
|
25
|
+
}
|
|
26
|
+
// Callback appelé lorsqu'un token est invalide (destruction de la JwtSession dans tous les cas).
|
|
27
|
+
static setOnInvalidTokenCallback(callback) {
|
|
28
|
+
HTTPClient.onInvalidTokenCallback = callback;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
static getHeaders(asObject) {
|
|
32
|
+
HTTPClient.setAuthorizationToken(JwtSession.getToken());
|
|
33
|
+
|
|
34
|
+
if (typeof HTTPClient.headers == 'undefined') {
|
|
35
|
+
HTTPClient.headers = {};
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
if (typeof asObject != 'undefined' && asObject) {
|
|
39
|
+
return HTTPClient.headers;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
let httpHeaders = new Headers();
|
|
43
|
+
Object.entries(HTTPClient.headers).forEach(([key, value]) => {
|
|
44
|
+
httpHeaders.append(key, value);
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
return httpHeaders;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
static getHeader(key) {
|
|
51
|
+
if (typeof HTTPClient.headers == 'undefined') {
|
|
52
|
+
HTTPClient.headers = {};
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
return HTTPClient.headers[key];
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
static setHeader(key, value) {
|
|
59
|
+
if (typeof HTTPClient.headers == 'undefined') {
|
|
60
|
+
HTTPClient.headers = {};
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
HTTPClient.headers[key] = value;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
static setAuthorizationToken(authorizationToken) {
|
|
67
|
+
if (typeof HTTPClient.headers == 'undefined') {
|
|
68
|
+
HTTPClient.headers = {};
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
if (typeof authorizationToken == 'undefined' || null == authorizationToken) {
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
HTTPClient.headers['Authorization'] = 'Bearer ' + authorizationToken;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
static convertObjectToFormData(obj) {
|
|
79
|
+
// 30/05/2022 : ancienne version, qui ne fonctionne pas avec des tableaux
|
|
80
|
+
// let formData = new FormData();
|
|
81
|
+
// Object.entries(data).forEach(([key, value]) => formData.append(key, value));
|
|
82
|
+
// return formData;
|
|
83
|
+
|
|
84
|
+
let formData = new FormData();
|
|
85
|
+
|
|
86
|
+
function appendFormData(data, root) {
|
|
87
|
+
//console.log('appendFormData', data, root);
|
|
88
|
+
root = root || '';
|
|
89
|
+
if (data instanceof File) {
|
|
90
|
+
formData.append(root, data);
|
|
91
|
+
}
|
|
92
|
+
else if (Array.isArray(data)) {
|
|
93
|
+
for (let i = 0; i < data.length; i++) {
|
|
94
|
+
appendFormData(data[i], root + '[' + i + ']');
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
else if (typeof data === 'object' && data) {
|
|
98
|
+
for (let key in data) {
|
|
99
|
+
if (data.hasOwnProperty(key)) {
|
|
100
|
+
if (root === '') {
|
|
101
|
+
appendFormData(data[key], key);
|
|
102
|
+
} else {
|
|
103
|
+
appendFormData(data[key], root + '.' + key);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
else {
|
|
109
|
+
if (data !== null && typeof data !== 'undefined') {
|
|
110
|
+
formData.append(root, data);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
appendFormData(obj);
|
|
116
|
+
|
|
117
|
+
return formData;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
static formatQueryString(data) {
|
|
121
|
+
if (data == null) {
|
|
122
|
+
return '';
|
|
123
|
+
}
|
|
124
|
+
if (typeof data == 'object') {
|
|
125
|
+
data = UrlAndQueryString.buildQuery(data);
|
|
126
|
+
}
|
|
127
|
+
if (data !== '' && data.substring(0, 1) !== '&') {
|
|
128
|
+
data = '&' + data;
|
|
129
|
+
}
|
|
130
|
+
return data;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
static formatFormData(data) {
|
|
134
|
+
if (!(data instanceof FormData)) {
|
|
135
|
+
return HTTPClient.convertObjectToFormData(data);
|
|
136
|
+
}
|
|
137
|
+
return data;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
static logRequestFailure(response, json) {
|
|
141
|
+
console.error('Request failure. Status: '+response.statusText+' ; HTTP Code : '+response.status, json);
|
|
142
|
+
}
|
|
143
|
+
static logJqueryRequestFailure(jqxhr, status, errorThrown) {
|
|
144
|
+
console.error('Request failure. Status: ' + status + ' ; HTTP Code: ' + jqxhr.status + (null != errorThrown && '' !== errorThrown ? ' ; Error message: ' + errorThrown : ''), jqxhr.responseJSON);
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
static isExpiredToken(response, json) {
|
|
148
|
+
if (response.status !== 401) {
|
|
149
|
+
return false;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
return (
|
|
153
|
+
response.statusText === 'Expired JWT Token'
|
|
154
|
+
|| (typeof json['message'] != 'undefined' && json['message'] === 'Expired JWT Token')
|
|
155
|
+
|| (typeof json['error'] != 'undefined' && json['error'] === 'expired_token')
|
|
156
|
+
|| (json === 'expired_token')
|
|
157
|
+
);
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
static isInvalidToken(response, json) {
|
|
161
|
+
if (response.status !== 401) {
|
|
162
|
+
return false;
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
return (
|
|
166
|
+
response.statusText === 'Invalid JWT Token'
|
|
167
|
+
|| (typeof json['message'] != 'undefined' && json['message'] === 'Invalid JWT Token')
|
|
168
|
+
|| (typeof json['error'] != 'undefined' && json['error'] === 'invalid_token')
|
|
169
|
+
|| (typeof json['error'] != 'undefined' && json['error'] === 'authentification_failure')
|
|
170
|
+
|| (json === 'invalid_token')
|
|
171
|
+
|| (json === 'authentification_failure')
|
|
172
|
+
);
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
static onInvalidToken() {
|
|
176
|
+
JwtSession.logout(HTTPClient.onInvalidTokenRedirectUrl, HTTPClient.onInvalidTokenCallback);
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
static async request(method, url, data, successCallback, errorCallback, formErrorCallback) {
|
|
180
|
+
method = method.toUpperCase();
|
|
181
|
+
|
|
182
|
+
if (!window.fetch) {
|
|
183
|
+
return;
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
let body = null;
|
|
187
|
+
method = method.toUpperCase();
|
|
188
|
+
|
|
189
|
+
if ('POST' !== method && 'PATCH' !== method) {
|
|
190
|
+
url += (!url.includes('?') ? '?' : '') + HTTPClient.formatQueryString(data);
|
|
191
|
+
data = null;
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
if (method === 'PATCH') {
|
|
195
|
+
HTTPClient.setHeader('Content-Type', 'application/x-www-form-urlencoded');
|
|
196
|
+
body = new URLSearchParams(HTTPClient.formatFormData(data)).toString();
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
if ('POST' === method) {
|
|
200
|
+
body = HTTPClient.formatFormData(data);
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
const requestOptions = {
|
|
204
|
+
headers: HTTPClient.getHeaders(),
|
|
205
|
+
mode: 'cors',
|
|
206
|
+
cache: 'no-cache',
|
|
207
|
+
method,
|
|
208
|
+
body
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
const response = await fetch(url, requestOptions);
|
|
212
|
+
|
|
213
|
+
let jsonData = {};
|
|
214
|
+
try {
|
|
215
|
+
if (response.status !== 204 && response.statusText !== 'No Content') {
|
|
216
|
+
jsonData = await response.json();
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
if (HTTPClient.isExpiredToken(response, jsonData)) {
|
|
220
|
+
HTTPClient.refreshToken(() => HTTPClient.request(method, url, data, successCallback, errorCallback, formErrorCallback), errorCallback);
|
|
221
|
+
return;
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
if (HTTPClient.isInvalidToken(response, jsonData)) {
|
|
225
|
+
HTTPClient.onInvalidToken();
|
|
226
|
+
return;
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
if (response.ok) {
|
|
230
|
+
if (typeof successCallback != 'undefined' && successCallback != null) {
|
|
231
|
+
successCallback(jsonData, response);
|
|
232
|
+
}
|
|
233
|
+
return;
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
if (response.status === 400 && typeof formErrorCallback != 'undefined' && formErrorCallback != null) {
|
|
237
|
+
formErrorCallback(jsonData, response);
|
|
238
|
+
return;
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
catch (e) {
|
|
242
|
+
console.error(e);
|
|
243
|
+
if (typeof errorCallback != 'undefined' && errorCallback != null) {
|
|
244
|
+
errorCallback(response);
|
|
245
|
+
}
|
|
246
|
+
return;
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
HTTPClient.logRequestFailure(response, jsonData);
|
|
250
|
+
if (typeof errorCallback != 'undefined' && errorCallback != null) {
|
|
251
|
+
errorCallback(response, jsonData);
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
static async download(method, url, data, errorCallback, completeCallback) {
|
|
256
|
+
method = typeof method == 'undefined' || null == method ? 'GET' : method;
|
|
257
|
+
|
|
258
|
+
if ('GET' === method) {
|
|
259
|
+
url += (!url.includes('?') ? '?' : '') + HTTPClient.formatQueryString(data);
|
|
260
|
+
data = null;
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
if (!window.fetch) {
|
|
264
|
+
return;
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
let requestOptions = {
|
|
268
|
+
method: method,
|
|
269
|
+
headers: HTTPClient.getHeaders(),
|
|
270
|
+
mode: 'cors',
|
|
271
|
+
cache: 'no-cache'
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
if ('GET' !== method) {
|
|
275
|
+
requestOptions['body'] = HTTPClient.formatFormData(data);
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
const response = await fetch(url, requestOptions);
|
|
279
|
+
try {
|
|
280
|
+
if (response.status === 401 && response.statusText === 'Expired JWT Token') {
|
|
281
|
+
HTTPClient.refreshToken(() => HTTPClient.download(method, url, data, errorCallback, completeCallback), errorCallback);
|
|
282
|
+
return;
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
if (response.status === 401 && response.statusText === 'Invalid JWT Token') {
|
|
286
|
+
HTTPClient.onInvalidToken();
|
|
287
|
+
return;
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
if (response.ok) {
|
|
291
|
+
const blobData = await response.blob();
|
|
292
|
+
File.download(blobData, response.headers.get('content-type'), response.headers.get('content-disposition'));
|
|
293
|
+
}
|
|
294
|
+
else {
|
|
295
|
+
HTTPClient.logRequestFailure(response, null);
|
|
296
|
+
if (typeof errorCallback != 'undefined' && errorCallback != null) {
|
|
297
|
+
errorCallback(response);
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
catch (e) {
|
|
302
|
+
console.error(e);
|
|
303
|
+
if (typeof errorCallback != 'undefined' && errorCallback != null) {
|
|
304
|
+
errorCallback(response);
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
if (typeof completeCallback != 'undefined' && completeCallback != null) {
|
|
308
|
+
completeCallback(response);
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
static refreshToken(completeCallback, errorCallback) {
|
|
313
|
+
if (typeof HTTPClient.listCompleteCallbackAfterRefreshTokenFinished == 'undefined') {
|
|
314
|
+
HTTPClient.listCompleteCallbackAfterRefreshTokenFinished = [];
|
|
315
|
+
}
|
|
316
|
+
HTTPClient.listCompleteCallbackAfterRefreshTokenFinished.push(completeCallback);
|
|
317
|
+
//HTTPClient.addCompleteCallbackAfterRefreshTokenFinished(completeCallback);
|
|
318
|
+
|
|
319
|
+
// S'il y a déjà un appel à refresh token effectué, on le refait pas (le completeCallback est dans une liste de callback à exécuter apres la fin du refresh token)
|
|
320
|
+
if (typeof HTTPClient.refreshTokenStarted != 'undefined' && HTTPClient.refreshTokenStarted) {
|
|
321
|
+
return;
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
function onRefreshTokenComplete() {
|
|
325
|
+
HTTPClient.refreshTokenStarted = false;
|
|
326
|
+
|
|
327
|
+
// On exécute les completeCallback qui était en attente de la requete refresh token
|
|
328
|
+
if (typeof HTTPClient.listCompleteCallbackAfterRefreshTokenFinished != 'undefined') {
|
|
329
|
+
HTTPClient.listCompleteCallbackAfterRefreshTokenFinished.forEach(callback => typeof callback == 'function' ? callback() : null);
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
HTTPClient.refreshTokenStarted = true;
|
|
334
|
+
|
|
335
|
+
if (typeof HTTPClient.refreshTokenCallback == 'function') {
|
|
336
|
+
console.log('HTTPClient.refreshToken : Appel callback HTTPClient.refreshTokenCallback');
|
|
337
|
+
HTTPClient.refreshTokenCallback(onRefreshTokenComplete);
|
|
338
|
+
return;
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
if (typeof HTTPClient.refreshTokenUrl == 'undefined') {
|
|
342
|
+
console.error('URL refresh token non définie. Appeler HTTPClient.setRefreshTokenUrl(url)');
|
|
343
|
+
return;
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
console.log('HTTPClient.refreshToken : Appel HTTP vers HTTPClient.refreshTokenUrl');
|
|
347
|
+
let payload = new FormData();
|
|
348
|
+
payload.append('refresh_token', JwtSession.getRefreshToken());
|
|
349
|
+
|
|
350
|
+
HTTPClient.request('POST', HTTPClient.refreshTokenUrl, payload,
|
|
351
|
+
(data) => {
|
|
352
|
+
JwtSession.updateToken(data['token'], data['refresh_token'], HTTPClient.onSuccessRefreshTokenCallback);
|
|
353
|
+
HTTPClient.setAuthorizationToken(JwtSession.getToken());
|
|
354
|
+
onRefreshTokenComplete();
|
|
355
|
+
},
|
|
356
|
+
() => {
|
|
357
|
+
JwtSession.expireSession(HTTPClient.onInvalidRefreshTokenRedirectUrl, HTTPClient.onInvalidRefreshTokenCallback);
|
|
358
|
+
errorCallback();
|
|
359
|
+
}
|
|
360
|
+
);
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
static sendRequest(url, strParam, methode, formatRetour, callback) {
|
|
364
|
+
let xhr = null;
|
|
365
|
+
|
|
366
|
+
if (window.XMLHttpRequest || window.ActiveXObject) {
|
|
367
|
+
if (window.ActiveXObject) {
|
|
368
|
+
try {
|
|
369
|
+
xhr = new ActiveXObject('Msxml2.XMLHTTP');
|
|
370
|
+
} catch (e) {
|
|
371
|
+
xhr = new ActiveXObject('Microsoft.XMLHTTP');
|
|
372
|
+
}
|
|
373
|
+
} else {
|
|
374
|
+
xhr = new XMLHttpRequest();
|
|
375
|
+
}
|
|
376
|
+
} else {
|
|
377
|
+
// Votre navigateur ne supporte pas l'objet XMLHTTPRequest!
|
|
378
|
+
return null;
|
|
379
|
+
}
|
|
380
|
+
|
|
381
|
+
xhr.onreadystatechange = function () {
|
|
382
|
+
if (xhr.readyState == 4 && (xhr.status == 200 || xhr.status == 0)) {
|
|
383
|
+
let data;
|
|
384
|
+
if (formatRetour == 'xml') {
|
|
385
|
+
data = xhr.responseXML;
|
|
386
|
+
}
|
|
387
|
+
else {
|
|
388
|
+
data = eval('(' + xhr.responseText + ')');
|
|
389
|
+
}
|
|
390
|
+
callback(data);
|
|
391
|
+
}
|
|
392
|
+
};
|
|
393
|
+
|
|
394
|
+
if (methode === 'POST') {
|
|
395
|
+
xhr.open('POST', url, true);
|
|
396
|
+
xhr.send();
|
|
397
|
+
}
|
|
398
|
+
else {
|
|
399
|
+
xhr.open('GET', url + '?' + strParam, true);
|
|
400
|
+
xhr.send(null);
|
|
401
|
+
}
|
|
402
|
+
return false;
|
|
403
|
+
}
|
|
404
|
+
|
|
405
|
+
}
|
|
406
|
+
|
|
407
|
+
require('whatwg-fetch'); //fetch polyfill loaded in window.fetch
|
|
408
|
+
|
|
409
|
+
module.exports = { HTTPClient };
|
package/import_from_csv.js
CHANGED
|
@@ -24,7 +24,7 @@ class ImportFromCsv {
|
|
|
24
24
|
|
|
25
25
|
formUpload.find('button[type="submit"]').click(function(event) {
|
|
26
26
|
event.preventDefault();
|
|
27
|
-
$(this)
|
|
27
|
+
FormHelper.buttonLoader($(this), 'loading');
|
|
28
28
|
formUpload.find('div.errors').addClass('hide');
|
|
29
29
|
|
|
30
30
|
let isFileParsed = false;
|
|
@@ -69,7 +69,7 @@ class ImportFromCsv {
|
|
|
69
69
|
if (!isFileParsed) {
|
|
70
70
|
formUpload.find('div.errors').html(errorMessageFileEmpty).removeClass('hide');
|
|
71
71
|
}
|
|
72
|
-
formUpload.find('button[type="submit"]')
|
|
72
|
+
FormHelper.buttonLoader(formUpload.find('button[type="submit"]'), 'reset');
|
|
73
73
|
}
|
|
74
74
|
});
|
|
75
75
|
event.preventDefault();
|
|
@@ -77,7 +77,7 @@ class ImportFromCsv {
|
|
|
77
77
|
|
|
78
78
|
formMatching.find('button[type="submit"]').click(function (event) {
|
|
79
79
|
event.preventDefault();
|
|
80
|
-
$(this)
|
|
80
|
+
FormHelper.buttonLoader($(this), 'loading');
|
|
81
81
|
formMatching.find('div.errors').addClass('hide').empty();
|
|
82
82
|
divResult.find('table tr').removeClass('danger');
|
|
83
83
|
|
|
@@ -86,7 +86,7 @@ class ImportFromCsv {
|
|
|
86
86
|
|
|
87
87
|
if ($.isEmptyObject(tabLink)) {
|
|
88
88
|
formMatching.find('div.errors').html(errorMessageImportSelectColumns).removeClass('hide');
|
|
89
|
-
$(this)
|
|
89
|
+
FormHelper.buttonLoader($(this), 'reset');
|
|
90
90
|
return false;
|
|
91
91
|
}
|
|
92
92
|
|
|
@@ -103,7 +103,7 @@ class ImportFromCsv {
|
|
|
103
103
|
else {
|
|
104
104
|
formMatching.find('div.errors').html(ImportFromCsv.getErrorsHtmlOfImportData(json, divResult)).removeClass('hide');
|
|
105
105
|
}
|
|
106
|
-
formMatching.find('button[type="submit"]')
|
|
106
|
+
FormHelper.buttonLoader(formMatching.find('button[type="submit"]'), 'reset');
|
|
107
107
|
}
|
|
108
108
|
);
|
|
109
109
|
});
|
package/index.js
CHANGED
|
@@ -7,6 +7,7 @@ require('./array');
|
|
|
7
7
|
require('./number');
|
|
8
8
|
|
|
9
9
|
// exports d'ojets non natif
|
|
10
|
+
const { HTTPClient } = require('./http_client');
|
|
10
11
|
const { HTTPRequest, Cookie, UrlAndQueryString } = require('./network');
|
|
11
12
|
const { IBAN, BankCard } = require('./bank');
|
|
12
13
|
const { AudioMedia, UserMedia } = require('./media');
|
|
@@ -14,19 +15,20 @@ const { PersonName, Email, TelephoneNumber } = require('./contact_details');
|
|
|
14
15
|
const { DateTime, TimestampUnix, SqlDate, SqlTime, SqlDateTime } = require('./date_time');
|
|
15
16
|
const { Duration } = require('./duration');
|
|
16
17
|
const { File, CSV, Img } = require('./file');
|
|
17
|
-
const { FormHelper } = require('./form_helper');
|
|
18
|
+
const { FormHelper, EditValue } = require('./form_helper');
|
|
18
19
|
const { Country, PostalAddress, GeographicCoordinates } = require('./location');
|
|
20
|
+
const { HexColor, RgbColor } = require('./draw');
|
|
19
21
|
const { SocialNetwork } = require('./social_network');
|
|
20
22
|
const { sleep, refresh } = require('./util');
|
|
21
23
|
const { chr, ord, trim, empty } = require('./php.min');
|
|
22
24
|
|
|
23
25
|
// exports plugins "maison"
|
|
24
|
-
const { Browser } = require('./visitor');
|
|
26
|
+
const { Browser, UserAgent } = require('./visitor');
|
|
25
27
|
const { DataTable } = require('./data_table');
|
|
26
28
|
const { Pagination, Navigation } = require('./paging');
|
|
27
29
|
const { DetailsSubArray } = require('./details_sub_array');
|
|
28
30
|
const { SelectAll } = require('./select_all');
|
|
29
|
-
const { MultipleActionInTable } = require('./multiple_action_in_table');
|
|
31
|
+
const { MultipleActionInTable, MultipleActionInDivList } = require('./multiple_action_in_table');
|
|
30
32
|
const { FormDate, InputPeriod } = require('./form_date');
|
|
31
33
|
const { ShoppingCart } = require('./shopping_cart');
|
|
32
34
|
const { FlashMessage } = require('./flash_message');
|
|
@@ -46,8 +48,8 @@ const { WebSocket } = require('./web_socket');
|
|
|
46
48
|
|
|
47
49
|
module.exports = {
|
|
48
50
|
Array, Object, Number, String,
|
|
49
|
-
HTTPRequest, Cookie, UrlAndQueryString, IBAN, BankCard, AudioMedia, UserMedia, PersonName, Email, TelephoneNumber, DateTime, TimestampUnix, SqlDate, SqlTime, SqlDateTime, Duration, File, CSV, Img, FormHelper, Country, PostalAddress, GeographicCoordinates, SocialNetwork,
|
|
50
|
-
Browser, DataTable, Pagination, Navigation, DetailsSubArray, SelectAll, MultipleActionInTable, FormDate, InputPeriod, ShoppingCart, FlashMessage, CountDown, ImportFromCsv, JwtToken, JwtSession, ApiTokenSession, ListBox, WebRTC, WebSocket, EventBus,
|
|
51
|
+
HTTPClient, HTTPRequest, Cookie, UrlAndQueryString, IBAN, BankCard, AudioMedia, UserMedia, PersonName, Email, TelephoneNumber, DateTime, TimestampUnix, SqlDate, SqlTime, SqlDateTime, Duration, File, CSV, Img, FormHelper, Country, PostalAddress, GeographicCoordinates, HexColor, RgbColor, SocialNetwork,
|
|
52
|
+
Browser, DataTable, Pagination, Navigation, DetailsSubArray, SelectAll, MultipleActionInTable, MultipleActionInDivList, EditValue, FormDate, InputPeriod, ShoppingCart, FlashMessage, CountDown, ImportFromCsv, JwtToken, JwtSession, ApiTokenSession, ListBox, WebRTC, WebSocket, EventBus,
|
|
51
53
|
sleep, refresh, chr, ord, trim, empty,
|
|
52
54
|
GoogleCharts, GoogleRecaptcha, GoogleMap, OpenStreetMap
|
|
53
55
|
};
|