Rev 3897 | Blame | Compare with Previous | Last modification | View Log | RSS feed
import {findFieldset} from './utils.js';// Variable permettant un seul affichage du titre// de la prévisualisation pour les nouveaux champslet firstClick = true;/************************************************* Fonction d'affichage des champs classiques *************************************************/// Prévisualisationexport const displayClassicFields = () => {// Affichage du titre du widgetrenderFields($('#titre'), $('.widget-renderer h1'));// Affichage de la descriptionrenderFields($('#description'), $('.preview-description'));// Affichage referentiel$('#label-taxon span').text(` (${$('#referentiel').val()})`);$('#referentiel').change(function () {$('#label-taxon span').text(` (${$(this).val()})`);});// Affichage du logo s'il existe déjàif (0 !== $('#logo').val().length || $('#logo')[0].defaultValue) {$('#preview-logo').append(`<img src="${$('#group-settings-form .logo img').prop('src')}" width="75%">`);}// Affichage du logo chargé$('#logo.input-file').change(function(event) {// Si le 'change' n'était pas une suppressionif ($.isEmptyObject(event.target.files[0])) {$('#preview-logo img').remove();// Si on a chargé un logo ou changé le fichier} else {$('#preview-logo').append(`<img src="${URL.createObjectURL(event.target.files[0])}" width="75%">`);}});// Affichage de l'image de fond$('#image_fond.input-file').on('change', evt => {if (!$.isEmptyObject(evt.target.files[0])) {$('.widget-renderer').css('background' ,`url(${URL.createObjectURL(evt.target.files[0])}) no-repeat fixed center center`);} else {$('.widget-renderer')[0].style.removeProperty('background');}});}// Affichage des infos dès que disponibles// pour les champs classiquesconst renderFields = ($source, $taget) => {let text = new DOMParser().parseFromString($source.val(), 'text/html');text = text.body.textContent || '';if ($source.val()) {$taget.text(text);}$source.on('change', () => $taget.text(text));}/****************************************************** Fonction d'affichage des champs supplémentaires ******************************************************/// Prévisualisation des nouveaux champsexport const newFieldsPreview = function() {const count = $('fieldset').last().data('id');let $thisFieldset;// Si on a déjà prévisualisé on efface tout pour recommencerif (0 < $('.preview-fields').length) {$('.preview-fields').each(function () {$(this).remove();});}// Au premier ajout d'un champ dans la prévisualisation on ajoute un titre et un messageif (true === firstClick) {$('#zone-supp').prepend(`<h2>Informations propres au projet</h2><div class="message">L’objectif principal de cet aperçu est de vérifier les contenus et repérer d’éventuelles erreurs</div>`);}// Parcourir tous les blocs d'infos de champs supplémentairesfor(let index = $('fieldset').first().data('id'); index <= count; index++) {$thisFieldset = findFieldset(index);// Certains indices peuvent correspondre à un champ suppriméif (0 < $($thisFieldset).length) {// Prévisualisation d'un champ$('#zone-supp .preview-container').append(`<div class="preview-fields col-sm-12 row" data-id="${index}">${onClickPreviewField($thisFieldset, index)}</div>`);// Ajout/suppression d'un champ texte "Autre"if ($('.option-other-value', $thisFieldset).is(':checked')) {onOtherOption($thisFieldset, index);}}}// Le titre+message de la section prévisualisation ne sont ajoutés qu'une foisfirstClick = false;};// Construction des éléments à visualiserconst onClickPreviewField = (thisFieldset, index) => {// Récupération des donnéesconst fieldKey = $('.field-key' , thisFieldset).val() || '',//cléfieldElement = $('.field-element' , thisFieldset).val() || '',//élément// Champs à valeur numérique ou datefieldStep = $('.step' , thisFieldset).val() || '',fieldMin = $('.min' , thisFieldset).val() || '',fieldMax = $('.max' , thisFieldset).val() || '',// Champs "listes"fieldDefaultNum = $('.default' , thisFieldset).val() || '',// value range/number par defaultfieldOtherValue = $('.option-other-value', thisFieldset).is(':checked'),//option autrefieldOptions = collectListOptions(thisFieldset);//Array: toutes les optionslet fieldLabel = $('.field-name' , thisFieldset).val() || '',//nomfieldTooltip = $('.field-description' , thisFieldset).val() || '',//info-bullefieldPlaceholder = $('.aide-saisie' , thisFieldset).val() || '';//placeholder// Variables d'affichageconst count = fieldOptions.length,//nombre d'options, pour les boucles forreplaceQuotes = text => text.replace(/(')/gm, ''').replace(/(")/gm, '"');let fieldHtml = '',//variable contenant tout le html à afficherfieldOption;// réafficher les apostrophes$.each([fieldLabel,fieldTooltip,fieldPlaceholder], (i,fieldValue) => replaceQuotes(fieldValue));//valeurs initiales des chaînes de caractères//Éléments simples ou chaînes communes aux "listes"let commonFieldsHtml = {//Éléments simples ou chaînes communes aux "listes"dataIdAttr : ' data-id="'+index+'"',helpButton : '',//bouton aidehelpClass : '',//classe de l'élément associé au bouton aidetitleAttr : '',//info-bullefieldInput : {//attributs de l'élémenttypeAttr : ' type="'+fieldElement+'"',nameAttr : ' name="'+fieldKey+'"',classAttr : ' class="'+fieldKey+'"',placeholderAttr : '',mandatoryAttr : '',//requiredotherAttr : ''},fieldLabel : {//attributs et contenu du labellabelContent : fieldLabel,//labelforAttr : ' for="'+fieldKey+'"',//attribut forclassAttr : '',//classe du labelotherAttr : ''//tous autres attributs}};// Pour les éléments de listes (select, checkbox, etc.)let listFieldsHtml = {//chaînes & html spécifiques aux listescontainerContent : fieldLabel,//les options peuvent avoir chacune un labelcontainerClass : '',//une classe pour le conteneurforAttr : '',//correspond à l'id d'une checkbox/radio/list-checkboxoptionIdAttr : '',//value-iddefaultAttr : ''//default};// Changement d'un élément existant:// supprimer le précédent pour ajouter le nouveauif (0 < $('.preview-fields', thisFieldset).length) {$('.preview-fields', thisFieldset).remove();}// Élément requisif ($('.field-is_mandatory', thisFieldset).is(':checked')) {// Attribut required pour le listescommonFieldsHtml.fieldInput.mandatoryAttr = ' required="required"';// Nom du champ (éléments listes)listFieldsHtml.containerContent = '* '+listFieldsHtml.containerContent;// Nom du champ (éléments simples)commonFieldsHtml.fieldLabel.labelContent = '* '+commonFieldsHtml.fieldLabel.labelContent;}// Infobulleif ('' !== fieldTooltip) {commonFieldsHtml.titleAttr = ' title="'+fieldTooltip+'"';}// Placeholderif ('' !== fieldPlaceholder) {commonFieldsHtml.fieldInput.placeholderAttr = ' placeholder="'+fieldPlaceholder+'"';}// Fichier d'aideif ('' !== $('.file-return.help-doc-'+index).text()) {// Bouton 'aide'commonFieldsHtml.helpButton = '<div class="help-button btn btn-outline-info btn-sm border-0"><i class="fas fa-info-circle"></i></div>';// classe 'aide'commonFieldsHtml.helpClass = ' and-help';}// html à ajouter en fonction de l'élément choisiswitch(fieldElement) {case 'checkbox' :case 'radio' :listFieldsHtml.containerClass = ' class="'+fieldElement+'"';commonFieldsHtml.fieldLabel.classAttr = ' class="radio-label"';fieldHtml =// Conteneur'<div style="width:100%"'+// Class="L'élément choisi"listFieldsHtml.containerClass+// DataIdcommonFieldsHtml.dataIdAttr+// RequiredcommonFieldsHtml.fieldInput.mandatoryAttr+// Info bullecommonFieldsHtml.titleAttr+' >'+// Nom du champ// Classe 'and-help''<div class="mt-3 list-label'+commonFieldsHtml.helpClass+'">'+// LabellistFieldsHtml.containerContent+// Bouton 'help'commonFieldsHtml.helpButton+'</div>';// On déroule les différentes valeursfor( let i = 0; i < count; i++) {fieldOption = fieldOptions[i];// L'id de inputlistFieldsHtml.inputIdAttr = ' id="'+fieldOption.optionValue+'"';listFieldsHtml.forAttr = ' for="'+fieldOption.optionValue+'"';// DefaultlistFieldsHtml.defaultAttr = '';//réinitialisationif (fieldOption.isDefault) {//affectationlistFieldsHtml.defaultAttr = ' checked';}// L'indice de chaque option// L'option "autre" n'en a pasif ('' !== fieldOption.optionIndex) {listFieldsHtml.optionIdAttr = ' value-id="'+fieldOption.optionIndex+'"';}fieldHtml +='<label'+// ForlistFieldsHtml.forAttr+// value-idlistFieldsHtml.optionIdAttr+// Class du labelcommonFieldsHtml.fieldLabel.classAttr+'>'+'<input'+// TypecommonFieldsHtml.fieldInput.typeAttr+// IdlistFieldsHtml.inputIdAttr+// DataIdcommonFieldsHtml.dataIdAttr+// value-idlistFieldsHtml.optionIdAttr+// NamecommonFieldsHtml.fieldInput.nameAttr+// Value' value="'+replaceQuotes(fieldOption.optionValue)+// CheckedlistFieldsHtml.defaultAttr+// Class="nom du champ"commonFieldsHtml.fieldInput.classAttr+'>'+// Label de l'optionreplaceQuotes(fieldOption.optionText)+'</label>';}// Si valeur "autre" est cochéeif (fieldOtherValue) {fieldHtml +='<label for="other"'+commonFieldsHtml.dataIdAttr+commonFieldsHtml.fieldLabel.classAttr+'>'+'<input'+commonFieldsHtml.fieldInput.typeAttr+' id="other-'+fieldElement+'-'+index+'"'+commonFieldsHtml.fieldInput.nameAttr+' value="other"'+commonFieldsHtml.fieldInput.classAttr+commonFieldsHtml.dataIdAttr+'>'+'Autre</label>';}// Fin du conteneurfieldHtml += '</div>';break;case 'list-checkbox':commonFieldsHtml.fieldLabel.classAttr = ' class="radio-label"';fieldHtml =// Classe 'and-help''<div class="multiselect add-field-select'+commonFieldsHtml.helpClass+'"'+// DataIdcommonFieldsHtml.dataIdAttr+'>'+'<label style="width:100%">'+// Nom du champlistFieldsHtml.containerContent+// Bouton 'help'commonFieldsHtml.helpButton+'</label>'+'<div class="mt-3">'+'<div class="selectBox"'+// DataIdcommonFieldsHtml.dataIdAttr+'>'+'<select'+// DataIdcommonFieldsHtml.dataIdAttr+// RequiredcommonFieldsHtml.fieldInput.mandatoryAttr+// Info bullecommonFieldsHtml.titleAttr+// Class' class="form-control custom-select '+fieldElement+'"'+'>'+// Apparait dans la barre de sélection'<option>Plusieurs choix possibles</option>'+'</select>'+'<div class="overSelect"></div>'+'</div>'+'<div class="checkboxes hidden"'+// DataIdcommonFieldsHtml.dataIdAttr+'>';// On déroule les différentes valeursfor( let i = 0; i < count; i++) {fieldOption = fieldOptions[i];// Type="checkbox"commonFieldsHtml.fieldInput.typeAttr = ' type="checkbox"';// IdlistFieldsHtml.inputIdAttr = ' id="'+replaceQuotes(fieldOption.optionValue).toLowerCase()+'"';// ForlistFieldsHtml.forAttr = ' for="'+replaceQuotes(fieldOption.optionValue).toLowerCase()+'"';// DefaultlistFieldsHtml.defaultAttr = '';//réinitialisationif (fieldOption.isDefault) {listFieldsHtml.defaultAttr = ' checked';//affectation}// value-idif ('' !== fieldOption.optionIndex) {listFieldsHtml.optionIdAttr = ' value-id="'+fieldOption.optionIndex+'"';}fieldHtml +='<label'+// ForlistFieldsHtml.forAttr+// value-idlistFieldsHtml.optionIdAttr+// Class du labelcommonFieldsHtml.fieldLabel.classAttr+'>'+'<input type="checkbox"'+// IdlistFieldsHtml.inputIdAttr+// value-idlistFieldsHtml.optionIdAttr+// NamecommonFieldsHtml.fieldInput.nameAttr+// Value' value="'+replaceQuotes(fieldOption.optionValue)+'"'+// CheckedlistFieldsHtml.defaultAttr+// Class="nom du champ"commonFieldsHtml.fieldInput.classAttr+// DataIdcommonFieldsHtml.dataIdAttr+'>'+// Label de l'optionreplaceQuotes(fieldOption.optionText)+'</label>';}// Si valeur "autre" est cochéeif (fieldOtherValue) {fieldHtml +='<label for="other"'+// DataIdcommonFieldsHtml.dataIdAttr+'>'+'<input type="checkbox"'+' id="other-'+fieldElement+'-'+index+'"'+commonFieldsHtml.fieldInput.nameAttr+' value="other"'+commonFieldsHtml.fieldInput.classAttr+// DataIdcommonFieldsHtml.dataIdAttr+'>'+'Autre</label>';}// Fermeture des conteneurs .multiselect .checkboxesfieldHtml +='</div>'+'</div>'+'</div>';break;case 'select':commonFieldsHtml.fieldInput.classAttr = commonFieldsHtml.fieldInput.classAttr.slice(0, -1);commonFieldsHtml.fieldInput.classAttr += ' form-control custom-select"';fieldHtml =// Conteneur/Wrapper// +Classe 'and-help''<div class="add-field-select '+fieldElement+commonFieldsHtml.helpClass+'"'+// DataIDcommonFieldsHtml.dataIdAttr+'>'+'<label class="mt-3" style="width:100%"'+commonFieldsHtml.fieldLabel.forAttr+// Info bullecommonFieldsHtml.titleAttr+'>'+// Nom du champlistFieldsHtml.containerContent+// Bouton 'help'commonFieldsHtml.helpButton+'</label>'+'<select'+commonFieldsHtml.fieldInput.nameAttr+' id="'+fieldKey+'"'+// ClasscommonFieldsHtml.fieldInput.classAttr+// RequiredcommonFieldsHtml.fieldInput.mandatoryAttr+// DataIdcommonFieldsHtml.dataIdAttr+'>';// On déroule les différentes valeursfor( let i = 0; i < count; i++) {fieldOption = fieldOptions[i];// DefaultlistFieldsHtml.defaultAttr = '';//réinitialisationif (fieldOption.isDefault) {//affectationlistFieldsHtml.defaultAttr = ' selected="selected"';}// value-idif ('' !== fieldOption.optionIndex) {listFieldsHtml.optionIdAttr = ' value-id="'+fieldOption.optionIndex+'"';}fieldHtml +='<option'+// Value' value="'+replaceQuotes(fieldOption.optionValue)+'"'+// Value-idlistFieldsHtml.optionIdAttr+// SelectedlistFieldsHtml.defaultAttr+'>'+// OptionreplaceQuotes(fieldOption.optionText)+'</option>';}// Si valeur "autre" est cochéeif (fieldOtherValue) {fieldHtml +='<option class="other" value="other"'+commonFieldsHtml.dataIdAttr+'>'+'Autre'+'</option>';}// Fermeture des conteneursfieldHtml +='</select>'+// Fin du conteneur/wrapper'</div>';break;case 'textarea':// Ouvrir l'attribut class (suppression de '"')commonFieldsHtml.fieldInput.classAttr = commonFieldsHtml.fieldInput.classAttr.slice(0, -1);// Classe 'custom-range'commonFieldsHtml.fieldInput.classAttr += ' form-control"';// Classe 'and-help'commonFieldsHtml.fieldLabel.classAttr = ' class="mt-3 '+commonFieldsHtml.helpClass+'"';// Autres attributscommonFieldsHtml.fieldInput.otherAttr += ' id="'+fieldKey+'"';fieldHtml ='<label style="width:100%"'+// ForcommonFieldsHtml.fieldLabel.forAttr+// ClasscommonFieldsHtml.fieldLabel.classAttr+// Info-bullecommonFieldsHtml.titleAttr+// Autres attributscommonFieldsHtml.fieldLabel.otherAttr+'>'+// Nom du champcommonFieldsHtml.fieldLabel.labelContent+// Bouton 'help'commonFieldsHtml.helpButton+'</label>'+'<textarea'+// NamecommonFieldsHtml.fieldInput.nameAttr+// DataIdcommonFieldsHtml.dataIdAttr+// ClasscommonFieldsHtml.fieldInput.classAttr+// Info-bullecommonFieldsHtml.titleAttr+// Info-bullecommonFieldsHtml.fieldInput.placeholderAttr+// RequiredcommonFieldsHtml.fieldInput.mandatoryAttr+// Autres attributscommonFieldsHtml.fieldInput.otherAttr+'></textarea>';break;case 'range':// Ouvrir l'attribut class (suppression de '"')commonFieldsHtml.fieldInput.classAttr = commonFieldsHtml.fieldInput.classAttr.slice(0, -1);// Classe 'custom-range'commonFieldsHtml.fieldInput.classAttr += ' custom-range form-control pl-3"';// Classe 'and-help'commonFieldsHtml.fieldLabel.classAttr = ' class="mt-3 '+commonFieldsHtml.helpClass+'"';// Stepif ('' !== fieldStep) {commonFieldsHtml.fieldInput.otherAttr += ' step="'+fieldStep+'"';}// Minif ('' !== fieldMin) {commonFieldsHtml.fieldInput.otherAttr += ' min="'+fieldMin+'"';}//Maxif ('' !== fieldMax) {commonFieldsHtml.fieldInput.otherAttr += ' max="'+fieldMax+'"';}fieldHtml ='<div'+' class="range"'+' id="'+fieldKey+'"'+'>'+'<label style="width:100%"'+// ForcommonFieldsHtml.fieldLabel.forAttr+// ClasscommonFieldsHtml.fieldLabel.classAttr+// Info-bullecommonFieldsHtml.titleAttr+// Autres attributscommonFieldsHtml.fieldLabel.otherAttr+'>'+// Nom du champcommonFieldsHtml.fieldLabel.labelContent+// Bouton 'help'commonFieldsHtml.helpButton+'</label>'+'<div class="col-sm-12 row" style="max-width=100%">'+// Visualiser min max et la valeur de range'<p class="col-sm-2 range-values text-center font-weight-bold">'+'Min '+fieldMin+'</p>'+'<div class="range-live-value range-values text-center font-weight-bold col-sm-7">'+fieldDefaultNum+'</div>'+'<p class="col-sm-2 range-values text-center font-weight-bold">'+'Max '+fieldMax+'</p>'+'<input'+// TypecommonFieldsHtml.fieldInput.typeAttr+// NamecommonFieldsHtml.fieldInput.nameAttr+// DataIdcommonFieldsHtml.dataIdAttr+// ClasscommonFieldsHtml.fieldInput.classAttr+// Info-bullecommonFieldsHtml.titleAttr+// RequiredcommonFieldsHtml.fieldInput.mandatoryAttr+// Default' value="'+fieldDefaultNum+'"'+// Autres attributscommonFieldsHtml.fieldInput.otherAttr+'>'+'</div>''</div>';break;case 'number':// Stepif ('' !== fieldStep) {commonFieldsHtml.fieldInput.otherAttr += ' step="'+fieldStep+'"';}case 'date':// Ouvrir l'attribut class (suppression de '"')commonFieldsHtml.fieldInput.classAttr = commonFieldsHtml.fieldInput.classAttr.slice(0, -1);// Classe 'and-help'commonFieldsHtml.fieldInput.classAttr += commonFieldsHtml.helpClass+' form-control"';// Minif ('' !== fieldMin) {commonFieldsHtml.fieldInput.otherAttr += ' min="'+fieldMin+'"';}// Maxif ('' !== fieldMax) {commonFieldsHtml.fieldInput.otherAttr += ' max="'+fieldMax+'"';}// Class du labelcommonFieldsHtml.fieldLabel.classAttr = 'class="mt-3"';fieldHtml ='<div class="number">'+'<label style="width:100%"'+// ForcommonFieldsHtml.fieldLabel.forAttr+// ClasscommonFieldsHtml.fieldLabel.classAttr+// Info-bullecommonFieldsHtml.titleAttr+// Autres attributscommonFieldsHtml.fieldLabel.otherAttr+'>'+// Nom du champcommonFieldsHtml.fieldLabel.labelContent+// Bouton 'help'commonFieldsHtml.helpButton+'</label>'+'<input'+// TypecommonFieldsHtml.fieldInput.typeAttr+// NamecommonFieldsHtml.fieldInput.nameAttr+// DataIdcommonFieldsHtml.dataIdAttr+// ClasscommonFieldsHtml.fieldInput.classAttr+// Info-bullecommonFieldsHtml.titleAttr+// PlaceholdercommonFieldsHtml.fieldInput.placeholderAttr+// RequiredcommonFieldsHtml.fieldInput.mandatoryAttr+// Default' value="'+fieldDefaultNum+'"'+// Autres attributscommonFieldsHtml.fieldInput.otherAttr+'>'+'</div>';break;case 'text' :case 'email':default:// Ouvrir l'attribut class (suppression de '"')commonFieldsHtml.fieldInput.classAttr = commonFieldsHtml.fieldInput.classAttr.slice(0, -1);// Classe 'and-help'commonFieldsHtml.fieldInput.classAttr += commonFieldsHtml.helpClass+' form-control"';// Class du labelcommonFieldsHtml.fieldLabel.classAttr = 'class="mt-3"';fieldHtml ='<label style="width:100%"'+// ForcommonFieldsHtml.fieldLabel.forAttr+// ClasscommonFieldsHtml.fieldLabel.classAttr+// Info-bullecommonFieldsHtml.titleAttr+// Autres attributscommonFieldsHtml.fieldLabel.otherAttr+'>'+// Nom du champcommonFieldsHtml.fieldLabel.labelContent+// Bouton 'help'commonFieldsHtml.helpButton+'</label>'+'<input'+// TypecommonFieldsHtml.fieldInput.typeAttr+// NamecommonFieldsHtml.fieldInput.nameAttr+// DataIdcommonFieldsHtml.dataIdAttr+// ClasscommonFieldsHtml.fieldInput.classAttr+// Info-bullecommonFieldsHtml.titleAttr+// PlaceholdercommonFieldsHtml.fieldInput.placeholderAttr+// RequiredcommonFieldsHtml.fieldInput.mandatoryAttr+// Autres attributscommonFieldsHtml.fieldInput.otherAttr+'>';break;}return fieldHtml;}// Construire un tableau des options pour chaque élément de listesconst collectListOptions = thisFieldset => {const $details = $('.field-details', thisFieldset),options = [];$details.find('.new-value').each(function () {options.push({// Valeur transmise (value)optionValue : $(this).find('.list-value').val().toLowerCase(),// Valeur VisibleoptionText : $(this).find('.displayed-label').val(),// Booléen "default"isDefault : $(this).find('.is-defaut-value').is(':checked'),// Indice de l'optionoptionIndex : $(this).data('list-value-id')});});return options;}// Faire apparaitre un champ text "Autre"const onOtherOption = ($thisFieldset , index) => {// L'élément choisiconst element = $('.field-element', $thisFieldset).val(),thisPreviewFieldset = $(`.preview-fields[data-id=${index}]`),// html du champ "Autre"collectOther =`<div class="col-sm-12 mt-1 collect-other-block"><label data-id="${index}" for="collect-other" style="font-weight:300">Autre option :</label><input type="text" name="collect-other" data-id="${index}" class="collect-other form-control"></div>`,hasCheckboxes = ['list-checkbox','checkbox'].includes(element),eventType = hasCheckboxes ? 'click' : 'change';let fieldSelector = 'input';if('select' === element) {fieldSelector = 'select';} else if (hasCheckboxes) {fieldSelector += `#other-${element}-${index}`;}const $field = $(fieldSelector, thisPreviewFieldset);$field.on(eventType, function() {const hasOtherOption = hasCheckboxes ? ($field.is(':checked')) : ('other' === $field.val());if (hasOtherOption) {// Insertion du champ "Autre" après les boutonsif ('list-checkbox' === element) {$('.checkboxes', thisPreviewFieldset).append(collectOther);} else {$('.'+element, thisPreviewFieldset).after(collectOther);}} else {// Suppression du champ autre$('.collect-other-block', thisPreviewFieldset).remove();}});};