@osimatic/helpers-js 1.1.78 → 1.2.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/contact_details.js +4 -0
- package/form_helper.js +282 -1
- package/package.json +1 -1
package/contact_details.js
CHANGED
|
@@ -179,6 +179,10 @@ class TelephoneNumber {
|
|
|
179
179
|
});
|
|
180
180
|
}
|
|
181
181
|
|
|
182
|
+
static getIntlTelInputInstance(input) {
|
|
183
|
+
return window.intlTelInput.getInstance(input[0]);
|
|
184
|
+
}
|
|
185
|
+
|
|
182
186
|
static getEnteredNumberInInternationalFormat(intlTelInput) {
|
|
183
187
|
return intlTelInput.getNumber(window.intlTelInput.utils.numberFormat.E164);
|
|
184
188
|
}
|
package/form_helper.js
CHANGED
|
@@ -363,6 +363,287 @@ class FormHelper {
|
|
|
363
363
|
|
|
364
364
|
}
|
|
365
365
|
|
|
366
|
+
class ArrayField {
|
|
367
|
+
static init(formGroupDiv, defaultValues=[], options = {
|
|
368
|
+
entering_field_in_table: true,
|
|
369
|
+
item_name: null,
|
|
370
|
+
nb_min_lines: 5,
|
|
371
|
+
nb_max_lines: null,
|
|
372
|
+
list_empty_text: null,
|
|
373
|
+
add_one_button_enabled: true,
|
|
374
|
+
add_one_button_label: null,
|
|
375
|
+
add_multi_button_enabled: false,
|
|
376
|
+
add_multi_button_label: null,
|
|
377
|
+
input_name: null,
|
|
378
|
+
init_callback: null,
|
|
379
|
+
update_list_callback: null,
|
|
380
|
+
get_errors_callback: null,
|
|
381
|
+
|
|
382
|
+
}) {
|
|
383
|
+
function isOptionDefined(optionName) {
|
|
384
|
+
return typeof options[optionName] != 'undefined' && null !== options[optionName];
|
|
385
|
+
}
|
|
386
|
+
|
|
387
|
+
let itemsList = defaultValues;
|
|
388
|
+
|
|
389
|
+
if (!formGroupDiv.find('table').length) {
|
|
390
|
+
formGroupDiv.append($('<table class="table table-sm"><tbody></tbody></table>'));
|
|
391
|
+
}
|
|
392
|
+
if (!formGroupDiv.find('.list_empty').length) {
|
|
393
|
+
formGroupDiv.append($('<div class="list_empty">'+(isOptionDefined('list_empty_text') ? options['list_empty_text'] : '<em>aucun</em>')+'</div>'));
|
|
394
|
+
}
|
|
395
|
+
if (!options['entering_field_in_table'] && !formGroupDiv.find('.add_one, .add_multi').length) {
|
|
396
|
+
let divLinks = formGroupDiv.find('.links');
|
|
397
|
+
if (!divLinks.length) {
|
|
398
|
+
divLinks = $('<div class="links text-center"></div>');
|
|
399
|
+
formGroupDiv.append(divLinks);
|
|
400
|
+
}
|
|
401
|
+
|
|
402
|
+
if (options['add_one_button_enabled']) {
|
|
403
|
+
divLinks.append($('<a href="#" class="add_one btn btn-sm btn-success">'+(isOptionDefined('add_one_button_label') ? options['add_one_button_label'] : 'Ajouter')+'</a>'));
|
|
404
|
+
}
|
|
405
|
+
if (options['add_multi_button_enabled']) {
|
|
406
|
+
divLinks.append($('<a href="#" class="add_multi btn btn-sm btn-success">'+(isOptionDefined('add_multi_button_label') ? options['add_multi_button_label'] : 'Ajout multiple')+'</a>'));
|
|
407
|
+
}
|
|
408
|
+
formGroupDiv.append(divLinks);
|
|
409
|
+
}
|
|
410
|
+
|
|
411
|
+
function addLine(item) {
|
|
412
|
+
const table = formGroupDiv.find('table').removeClass('hide');
|
|
413
|
+
let tr;
|
|
414
|
+
if (table.find('tbody tr.base').length) {
|
|
415
|
+
tr = table.find('tbody tr.base').clone().removeClass('hide').removeClass('base');
|
|
416
|
+
}
|
|
417
|
+
else {
|
|
418
|
+
let links = '';
|
|
419
|
+
if (options['entering_field_in_table']) {
|
|
420
|
+
links += '<a href="#" title="Ajouter" class="add btn btn-sm btn-success ms-1"><i class="fas fa-plus"></i></a>';
|
|
421
|
+
}
|
|
422
|
+
links += '<a href="#" title="Supprimer" class="remove btn btn-sm btn-danger ms-1"><i class="fas fa-times"></i></a>';
|
|
423
|
+
|
|
424
|
+
tr = $(
|
|
425
|
+
'<tr>' +
|
|
426
|
+
'<td class="table-input" style="vertical-align: middle">' +
|
|
427
|
+
(options['entering_field_in_table'] ? '<input type="text" name="'+options['input_name']+'" class="form-control pt-1 pb-1">' : '<input type="hidden" name="'+options['input_name']+'"> <span class="value"></span>') +
|
|
428
|
+
'</td>' +
|
|
429
|
+
'<td class="table-links text-end" style="vertical-align: middle">'+links+'</td>' +
|
|
430
|
+
'</tr>'
|
|
431
|
+
);
|
|
432
|
+
}
|
|
433
|
+
|
|
434
|
+
tr.find('a.add').click(function () {
|
|
435
|
+
const tr = $(this).closest('tr');
|
|
436
|
+
const tableBody = tr.closest('tbody');
|
|
437
|
+
|
|
438
|
+
if (isOptionDefined('nb_max_lines') && tableBody.find('tr').length >= options['nb_max_lines']) {
|
|
439
|
+
return false;
|
|
440
|
+
}
|
|
441
|
+
addLine();
|
|
442
|
+
onUpdateList();
|
|
443
|
+
return false;
|
|
444
|
+
});
|
|
445
|
+
tr.find('a.remove').click(function () {
|
|
446
|
+
const tr = $(this).closest('tr');
|
|
447
|
+
const tableBody = tr.closest('tbody');
|
|
448
|
+
if (options['entering_field_in_table'] && tableBody.find('tr').length <= 1) {
|
|
449
|
+
return false;
|
|
450
|
+
}
|
|
451
|
+
|
|
452
|
+
if (!options['entering_field_in_table'] || '' !== tr.data('item')) {
|
|
453
|
+
itemsList.unsetVal(tr.data('item'));
|
|
454
|
+
}
|
|
455
|
+
|
|
456
|
+
tr.remove();
|
|
457
|
+
onUpdateList();
|
|
458
|
+
return false;
|
|
459
|
+
});
|
|
460
|
+
|
|
461
|
+
if (typeof item != 'undefined' && null !== item) {
|
|
462
|
+
tr.data('item', item);
|
|
463
|
+
tr.find('input').val(item);
|
|
464
|
+
tr.find('span.value').text(item);
|
|
465
|
+
}
|
|
466
|
+
|
|
467
|
+
table.find('tbody').append(tr);
|
|
468
|
+
return tr;
|
|
469
|
+
}
|
|
470
|
+
|
|
471
|
+
function onUpdateList() {
|
|
472
|
+
formGroupDiv.find('.list_empty, table').addClass('hide');
|
|
473
|
+
|
|
474
|
+
// Maj tableau
|
|
475
|
+
let table = formGroupDiv.find('table');
|
|
476
|
+
const tableLines = table.find('tbody tr:not(.base)');
|
|
477
|
+
if ((options['entering_field_in_table'] && tableLines.length ) || (!options['entering_field_in_table'] && itemsList.length)) {
|
|
478
|
+
table.removeClass('hide');
|
|
479
|
+
}
|
|
480
|
+
else {
|
|
481
|
+
formGroupDiv.find('.list_empty').removeClass('hide');
|
|
482
|
+
}
|
|
483
|
+
|
|
484
|
+
tableLines.find('a').prop('disabled', false).removeClass('disabled');
|
|
485
|
+
if (isOptionDefined('nb_max_lines') && tableLines.length >= options['nb_max_lines']) {
|
|
486
|
+
tableLines.find('a.add').prop('disabled', true).addClass('disabled');
|
|
487
|
+
}
|
|
488
|
+
if (options['entering_field_in_table'] && tableLines.length <= 1) {
|
|
489
|
+
tableLines.find('a.remove').prop('disabled', true).addClass('disabled');
|
|
490
|
+
}
|
|
491
|
+
|
|
492
|
+
if (typeof options['update_list_callback'] == 'function') {
|
|
493
|
+
options['update_list_callback'](itemsList);
|
|
494
|
+
}
|
|
495
|
+
|
|
496
|
+
cancelAdd();
|
|
497
|
+
}
|
|
498
|
+
|
|
499
|
+
function startAdd() {
|
|
500
|
+
formGroupDiv.find('a.add_one, a.add_multi').addClass('hide').closest('.links').addClass('hide');
|
|
501
|
+
formGroupDiv.find('.item_add_one, .item_add_multi').addClass('hide');
|
|
502
|
+
formGroupDiv.find('.item_add_one, .item_add_multi').find('input[type="text"], textarea').val('');
|
|
503
|
+
}
|
|
504
|
+
function cancelAdd() {
|
|
505
|
+
formGroupDiv.find('a.add_one, a.add_multi').removeClass('hide').closest('.links').removeClass('hide');
|
|
506
|
+
formGroupDiv.find('.item_add_one, .item_add_multi').addClass('hide');
|
|
507
|
+
}
|
|
508
|
+
|
|
509
|
+
function addItemsInList(items) {
|
|
510
|
+
if (!Array.isArray(items)) {
|
|
511
|
+
items = [items];
|
|
512
|
+
}
|
|
513
|
+
|
|
514
|
+
for (let i = 0; i < items.length; i++) {
|
|
515
|
+
if (itemsList.indexOf(items[i]) === -1) {
|
|
516
|
+
itemsList.push(items[i]);
|
|
517
|
+
addLine(items[i]);
|
|
518
|
+
}
|
|
519
|
+
}
|
|
520
|
+
|
|
521
|
+
onUpdateList();
|
|
522
|
+
}
|
|
523
|
+
|
|
524
|
+
function submitAddNewItem(item, divAdd) {
|
|
525
|
+
const items = Array.isArray(item) ? item : [item];
|
|
526
|
+
|
|
527
|
+
divAdd.find('.errors').addClass('hide');
|
|
528
|
+
|
|
529
|
+
if (typeof options['format_entered_value_callback'] == 'function') {
|
|
530
|
+
items.map(item => options['format_entered_value_callback'](item, divAdd));
|
|
531
|
+
}
|
|
532
|
+
|
|
533
|
+
if (typeof options['get_errors_callback'] == 'function') {
|
|
534
|
+
const errors = options['get_errors_callback'](items, itemsList, divAdd);
|
|
535
|
+
if (null !== errors && errors.length) {
|
|
536
|
+
displayErrors(divAdd, errors);
|
|
537
|
+
return;
|
|
538
|
+
}
|
|
539
|
+
}
|
|
540
|
+
|
|
541
|
+
addItemsInList(items);
|
|
542
|
+
}
|
|
543
|
+
|
|
544
|
+
function displayErrors(divAdd, errors) {
|
|
545
|
+
if (!Array.isArray(errors)) {
|
|
546
|
+
errors = [errors];
|
|
547
|
+
}
|
|
548
|
+
divAdd.find('.errors').text(errors.join('<br/>')).removeClass('hide');
|
|
549
|
+
}
|
|
550
|
+
|
|
551
|
+
function initLinkAddOne() {
|
|
552
|
+
if (!formGroupDiv.find('a.add_one').length || !formGroupDiv.find('a.add_one:not([disabled])').length) {
|
|
553
|
+
return;
|
|
554
|
+
}
|
|
555
|
+
|
|
556
|
+
let divAdd = formGroupDiv.find('.item_add_one');
|
|
557
|
+
if (!divAdd.length) {
|
|
558
|
+
divAdd = $(
|
|
559
|
+
'<div class="item_add_one">' +
|
|
560
|
+
'<div class="alert alert-danger pt-1 pb-1 errors hide"></div>' +
|
|
561
|
+
'<div class="form-inline">' +
|
|
562
|
+
'<input type="text" class="form-control" placeholder="'+options['item_name']+'" value="" /> ' +
|
|
563
|
+
'<a href="#" title="Ajouter" class="add btn btn-success"><i class="fas fa-plus"></i></a> ' +
|
|
564
|
+
'<a href="#" class="cancel">Annuler</a>' +
|
|
565
|
+
'</div>' +
|
|
566
|
+
(isOptionDefined('form_desc')?'<br><span class="form-text">'+options['form_desc']+'</span>':'') +
|
|
567
|
+
'</div>'
|
|
568
|
+
);
|
|
569
|
+
formGroupDiv.append(divAdd);
|
|
570
|
+
}
|
|
571
|
+
|
|
572
|
+
divAdd.find('a.cancel').off('click').click(function () {
|
|
573
|
+
cancelAdd();
|
|
574
|
+
return false;
|
|
575
|
+
});
|
|
576
|
+
divAdd.find('a.add').off('click').click(function () {
|
|
577
|
+
submitAddNewItem(divAdd.find('input[type="text"]').val(), divAdd);
|
|
578
|
+
return false;
|
|
579
|
+
});
|
|
580
|
+
|
|
581
|
+
formGroupDiv.find('a.add_one').off('click').click(function () {
|
|
582
|
+
startAdd();
|
|
583
|
+
formGroupDiv.find('.item_add_one').removeClass('hide');
|
|
584
|
+
return false;
|
|
585
|
+
});
|
|
586
|
+
}
|
|
587
|
+
|
|
588
|
+
function initLinkAddMulti() {
|
|
589
|
+
if (!formGroupDiv.find('a.add_multi').length || !formGroupDiv.find('a.add_multi:not([disabled])').length) {
|
|
590
|
+
return;
|
|
591
|
+
}
|
|
592
|
+
|
|
593
|
+
let divAdd = formGroupDiv.find('.item_add_multi');
|
|
594
|
+
if (!divAdd.length) {
|
|
595
|
+
divAdd = $(
|
|
596
|
+
'<div class="item_add_multi">' +
|
|
597
|
+
'<div class="alert alert-danger pt-1 pb-1 errors hide"></div>' +
|
|
598
|
+
'<div class="form-group">' +
|
|
599
|
+
'<label>Liste à ajouter :</label>' +
|
|
600
|
+
'<textarea name="emails" class="form-control" rows="10"></textarea>' +
|
|
601
|
+
'<span class="form-text">Un élément par ligne.</span>' +
|
|
602
|
+
'</div>' +
|
|
603
|
+
'<div class="form-inline">' +
|
|
604
|
+
'<a href="#" title="Ajouter" class="add btn btn-success"><i class="fas fa-plus"></i></a> ' +
|
|
605
|
+
'<a href="#" class="cancel">Annuler</a>' +
|
|
606
|
+
'</div>' +
|
|
607
|
+
'</div>'
|
|
608
|
+
);
|
|
609
|
+
formGroupDiv.append(divAdd);
|
|
610
|
+
}
|
|
611
|
+
|
|
612
|
+
divAdd.find('a.cancel').off('click').click(function () {
|
|
613
|
+
cancelAdd();
|
|
614
|
+
return false;
|
|
615
|
+
});
|
|
616
|
+
divAdd.find('a.add').off('click').click(function () {
|
|
617
|
+
const items = divAdd.find('textarea').val().normalizeBreaks("\n").split(/\n/ms).filter(value => value.length > 0);
|
|
618
|
+
submitAddNewItem(items, divAdd);
|
|
619
|
+
return false;
|
|
620
|
+
});
|
|
621
|
+
|
|
622
|
+
formGroupDiv.find('a.add_multi').off('click').click(function () {
|
|
623
|
+
startAdd();
|
|
624
|
+
formGroupDiv.find('.item_add_multi').removeClass('hide');
|
|
625
|
+
return false;
|
|
626
|
+
});
|
|
627
|
+
}
|
|
628
|
+
|
|
629
|
+
initLinkAddOne();
|
|
630
|
+
initLinkAddMulti();
|
|
631
|
+
|
|
632
|
+
itemsList.forEach(item => addLine(item));
|
|
633
|
+
if (options['entering_field_in_table']) {
|
|
634
|
+
for (let i=itemsList.length; i <= options['nb_min_lines']; i++) {
|
|
635
|
+
addLine();
|
|
636
|
+
}
|
|
637
|
+
}
|
|
638
|
+
|
|
639
|
+
onUpdateList();
|
|
640
|
+
|
|
641
|
+
if (typeof options['init_callback'] == 'function') {
|
|
642
|
+
options['init_callback'](formGroupDiv, onUpdateList, addItemsInList);
|
|
643
|
+
}
|
|
644
|
+
}
|
|
645
|
+
}
|
|
646
|
+
|
|
366
647
|
class EditValue {
|
|
367
648
|
static init(valueDiv, onSubmitCallback, getInputCallback) {
|
|
368
649
|
let link = $('<a href="#" class="text-warning"><i class="fas fa-pencil-alt"></i></a>');
|
|
@@ -408,4 +689,4 @@ class EditValue {
|
|
|
408
689
|
}
|
|
409
690
|
}
|
|
410
691
|
|
|
411
|
-
module.exports = { FormHelper, EditValue };
|
|
692
|
+
module.exports = { FormHelper, ArrayField, EditValue };
|